update Dockerfile example (#1520)
This commit is contained in:
parent
6d15326abf
commit
95b28fd02a
2
docker-example/.dockerignore
Normal file
2
docker-example/.dockerignore
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
.web
|
||||||
|
__pycache__/*
|
4
docker-example/Caddy.Dockerfile
Normal file
4
docker-example/Caddy.Dockerfile
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
FROM library/caddy
|
||||||
|
|
||||||
|
COPY --from=local/reflex-app /app/.web/_static /srv
|
||||||
|
ADD Caddyfile /etc/caddy/Caddyfile
|
18
docker-example/Caddyfile
Normal file
18
docker-example/Caddyfile
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
{$DOMAIN}
|
||||||
|
|
||||||
|
encode gzip
|
||||||
|
|
||||||
|
@backend_routes path /event/* /upload /ping
|
||||||
|
handle @backend_routes {
|
||||||
|
reverse_proxy app:8000
|
||||||
|
}
|
||||||
|
|
||||||
|
route {
|
||||||
|
try_files {path} {path}.html
|
||||||
|
file_server {
|
||||||
|
root /srv
|
||||||
|
pass_thru
|
||||||
|
}
|
||||||
|
# proxy dynamic routes to nextjs server
|
||||||
|
reverse_proxy app:3000
|
||||||
|
}
|
@ -1,49 +1,38 @@
|
|||||||
FROM python:3.11-slim as base
|
# Stage 1: init
|
||||||
|
FROM python:3.11 as init
|
||||||
|
|
||||||
RUN adduser --disabled-password reflex
|
# Pass `--build-arg API_URL=http://app.example.com:8000` during build
|
||||||
|
ARG API_URL
|
||||||
|
|
||||||
FROM base as build
|
|
||||||
|
|
||||||
|
# Copy local context to `/app` inside container (see .dockerignore)
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
ENV VIRTUAL_ENV=/app/venv
|
|
||||||
RUN python3 -m venv $VIRTUAL_ENV
|
|
||||||
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
|
|
||||||
|
|
||||||
COPY . .
|
COPY . .
|
||||||
|
|
||||||
RUN pip install wheel \
|
# Reflex will install bun, nvm, and node to `$HOME/.reflex` (/app/.reflex)
|
||||||
&& pip install -r requirements.txt
|
ENV HOME=/app
|
||||||
|
|
||||||
|
# Create virtualenv which will be copied into final container
|
||||||
|
ENV VIRTUAL_ENV=/app/.venv
|
||||||
|
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
|
||||||
|
RUN python3 -m venv $VIRTUAL_ENV
|
||||||
|
|
||||||
FROM base as runtime
|
# Install app requirements and reflex inside virtualenv
|
||||||
|
RUN pip install -r requirements.txt
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y \
|
# Deploy templates and prepare app
|
||||||
curl \
|
|
||||||
&& curl -fsSL https://deb.nodesource.com/setup_19.x | bash - \
|
|
||||||
&& apt-get update && apt-get install -y \
|
|
||||||
nodejs \
|
|
||||||
unzip \
|
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
ENV PATH="/app/venv/bin:$PATH"
|
|
||||||
|
|
||||||
|
|
||||||
FROM runtime as init
|
|
||||||
|
|
||||||
WORKDIR /app
|
|
||||||
ENV BUN_INSTALL="/app/.bun"
|
|
||||||
COPY --from=build /app/ /app/
|
|
||||||
RUN reflex init
|
RUN reflex init
|
||||||
|
|
||||||
|
# Export static copy of frontend to /app/.web/_static (and pre-install frontend packages)
|
||||||
|
RUN reflex export --frontend-only --no-zip
|
||||||
|
|
||||||
FROM runtime
|
|
||||||
|
|
||||||
COPY --chown=reflex --from=init /app/ /app/
|
# Stage 2: copy artifacts into slim image
|
||||||
USER reflex
|
FROM python:3.11-slim
|
||||||
|
ARG API_URL
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
RUN adduser --disabled-password --home /app reflex
|
||||||
|
COPY --chown=reflex --from=init /app /app
|
||||||
|
USER reflex
|
||||||
|
ENV PATH="/app/.venv/bin:$PATH" API_URL=$API_URL
|
||||||
|
|
||||||
CMD ["reflex", "run" , "--env", "prod"]
|
CMD reflex db migrate && reflex run --env prod
|
||||||
|
|
||||||
EXPOSE 3000
|
|
||||||
EXPOSE 8000
|
|
||||||
|
@ -1,37 +1,66 @@
|
|||||||
# Reflex Container Image Build
|
# Reflex Docker Container
|
||||||
|
|
||||||
This example describes how to create and use a container image for Reflex with your own code.
|
This example describes how to create and use a container image for Reflex with your own code.
|
||||||
|
|
||||||
## Update Requirements
|
## Update Requirements
|
||||||
|
|
||||||
The `requirements.txt` includes the reflex package which is need to install Reflex framework. If you use additional packages in your project you have add this in the `requirements.txt` first. Copy the `Dockerfile` and the `requirements.txt` file in your project folder.
|
The `requirements.txt` includes the reflex package which is needed to install
|
||||||
|
Reflex framework. If you use additional packages in your project you have to add
|
||||||
## Customize Reflex Config
|
this in the `requirements.txt` first. Copy the `Dockerfile`, `.dockerignore` and
|
||||||
|
the `requirements.txt` file in your project folder.
|
||||||
The `rxconfig.py` includes the configuration of your Reflex service. Edit the file like the following configuration. If you want to use a custom database you can set the endpoint in this file. Ensure that `api_url` points to the publicly accessible hostname where the container will be running.
|
|
||||||
|
|
||||||
```python
|
|
||||||
import reflex as rx
|
|
||||||
|
|
||||||
config = rx.Config(
|
|
||||||
app_name="app",
|
|
||||||
api_url="http://app.example.com:8000",
|
|
||||||
db_url="sqlite:///reflex.db",
|
|
||||||
)
|
|
||||||
```
|
|
||||||
|
|
||||||
## Build Reflex Container Image
|
## Build Reflex Container Image
|
||||||
|
|
||||||
To build your container image run the following command:
|
To build your container image run the following command:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker build -t reflex-project:latest .
|
docker build -t reflex-app:latest . --build-arg API_URL=http://app.example.com:8000
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Ensure that `API_URL` is set to the publicly accessible hostname or IP where the app
|
||||||
|
will be hosted.
|
||||||
|
|
||||||
## Start Container Service
|
## Start Container Service
|
||||||
|
|
||||||
Finally, you can start your Reflex container service as follows:
|
Finally, you can start your Reflex container service as follows:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker run -d -p 3000:3000 -p 8000:8000 --name app reflex-project:latest
|
docker run -p 3000:3000 -p 8000:8000 --name app reflex-app:latest
|
||||||
```
|
```
|
||||||
|
|
||||||
|
It may take a few seconds for the service to become available.
|
||||||
|
|
||||||
|
# Production Service with Docker Compose and Caddy
|
||||||
|
|
||||||
|
An example production deployment uses automatic TLS with Caddy serving static files
|
||||||
|
for the frontend and proxying requests to both the frontend and backend.
|
||||||
|
|
||||||
|
Copy `compose.yaml`, `Caddy.Dockerfile` and `Caddyfile` to your project directory. The production
|
||||||
|
build leverages the same `Dockerfile` described above.
|
||||||
|
|
||||||
|
## Customize `Caddyfile`
|
||||||
|
|
||||||
|
If the app uses additional backend API routes, those should be added to the
|
||||||
|
`@backend_routes` path matcher to ensure they are forwarded to the backend.
|
||||||
|
|
||||||
|
## Build Reflex Production Service
|
||||||
|
|
||||||
|
During build, set `DOMAIN` environment variable to the domain where the app will
|
||||||
|
be hosted! (Do not include http or https, it will always use https)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
DOMAIN=example.com docker compose build
|
||||||
|
```
|
||||||
|
|
||||||
|
This will build both the `app` service from the existing `Dockerfile` and the `webserver`
|
||||||
|
service via `Caddy.Dockerfile` that copies the `Caddyfile` and static frontend export
|
||||||
|
from the `app` service into the container.
|
||||||
|
|
||||||
|
## Run Reflex Production Service
|
||||||
|
|
||||||
|
```bash
|
||||||
|
DOMAIN=example.com docker compose up
|
||||||
|
```
|
||||||
|
|
||||||
|
The app should be available at the specified domain via HTTPS. Certificate
|
||||||
|
provisioning will occur automatically and may take a few minutes.
|
||||||
|
21
docker-example/compose.yaml
Normal file
21
docker-example/compose.yaml
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
# During build and run, set environment DOMAIN pointing
|
||||||
|
# to publicly accessible domain where app will be hosted
|
||||||
|
services:
|
||||||
|
app:
|
||||||
|
image: local/reflex-app
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
args:
|
||||||
|
API_URL: https://${DOMAIN:-localhost}
|
||||||
|
|
||||||
|
webserver:
|
||||||
|
environment:
|
||||||
|
DOMAIN: ${DOMAIN:-localhost}
|
||||||
|
ports:
|
||||||
|
- 443:443
|
||||||
|
- 80:80 # for acme-challenge via HTTP
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Caddy.Dockerfile
|
||||||
|
depends_on:
|
||||||
|
- app
|
Loading…
Reference in New Issue
Block a user