| # Etiya doc-to-lora UI — local container deployment | |
| # | |
| # Usage: | |
| # 1. cp .env.example .env.local (or set HF_TOKEN in your shell) | |
| # 2. docker compose up --build (builds image, starts container) | |
| # 3. open http://localhost:3000 | |
| # | |
| # To rebuild after code changes: | |
| # docker compose up --build --force-recreate | |
| # | |
| # To inspect inside the container: | |
| # docker compose exec d2l-ui sh | |
| services: | |
| d2l-ui: | |
| build: | |
| context: . | |
| dockerfile: Dockerfile | |
| image: etiya/d2l-ui:latest | |
| container_name: d2l-ui | |
| restart: unless-stopped | |
| ports: | |
| # Local dev exposes 3000; container internally listens on PORT env (default 7860 in image). | |
| # Override PORT inside container to 3000 to match the local convention. | |
| - "3000:3000" | |
| environment: | |
| PORT: 3000 | |
| # HF_TOKEN read from .env.local (host) at container startup — | |
| # never baked into the image. Rotate by editing .env.local + restarting. | |
| HF_TOKEN: ${HF_TOKEN:?HF_TOKEN must be set in .env.local or shell} | |
| D2L_API_URL: ${D2L_API_URL:-https://etiya-d2l-api.hf.space} | |
| NODE_ENV: production | |
| env_file: | |
| - .env.local | |
| healthcheck: | |
| test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:3000"] | |
| interval: 30s | |
| timeout: 5s | |
| retries: 3 | |
| start_period: 15s | |
| # Resource limits — tune to host. Frontend is light (~150MB image, ~80MB RAM). | |
| deploy: | |
| resources: | |
| limits: | |
| cpus: "1.0" | |
| memory: 512M | |
| reservations: | |
| cpus: "0.25" | |
| memory: 128M | |