Files
app/docker/compose.ci.yml
T
stroblme dea25ec08d One image for the whole app: engine, API and dashboard on one port
The backend image now builds the SPA and serves it on the API's own origin
(fluksio/spa.py), so an instance is a single container with no proxy, DNS,
port 80 or .env: `docker compose up -d` with the new compose.yml runs it on
localhost:8080. It starts on fluksio serve (persisted secret key, first
admin printed once) and brings its own Redis when REDIS_HOST is unset.

Slimmer: python:3.13-slim, no dev group, uv once, fastapi without the cloud
CLI. Optional features are per-feature extras (mqtt, influx, email, sentry,
ml, server for all) picked with the EXTRAS build argument; numpy moved to
`ml`. ffmpeg left the image for imageio-ffmpeg via the Modules screen.

The operator stack runs the same image with app. and api. routed to it; the
nginx frontend service, the LAN nginx proxy and DOMAIN in the backend are
gone, and the MCP issuer is FRONTEND_HOST.
2026-10-16 11:40:02 +02:00

58 lines
2.2 KiB
YAML

# CI isolation overrides — layered on top of compose.yml + compose.dev.yml by
# the Playwright shards and the compose smoke job in .gitea/workflows/.
#
# A self-hosted runner can put several jobs on the same host. A per-job
# COMPOSE_PROJECT_NAME keeps their containers, networks and volumes apart, but
# it does not cover the two things that are global to the Docker daemon:
#
# 1. `container_name` ignores the project name, so a second job fails with
# "the container name /fluksio-db is already in use".
# 2. Published host ports are first come, first served.
#
# Neither is needed in CI: everything reaches everything else by compose
# service name on the project network.
services:
proxy:
ports: !reset []
db:
container_name: !reset null
redis:
container_name: !reset null
adminer:
container_name: !reset null
ports: !reset []
mailcatcher:
ports: !reset []
backend:
container_name: !reset null
ports: !reset []
# compose.dev.yml mounts the source over the image's own copy, so `--reload`
# means something in a detached local stack. Here the daemon is a sibling of
# the job rather than its host: it resolves that path against its own
# filesystem, finds nothing, and mounts an empty directory over the package.
# That is how the container came to report "Path does not exist
# fluksio/main.py" for a file the image plainly ships. Back to what
# compose.yml declares — CI wants the built image anyway.
volumes: !override
- app-flow-data:/data
playwright:
ports: !reset []
# Same reason as backend above. These two exist so a local run leaves its
# report on the host; under a sibling daemon they are empty directories the
# report is written into and never seen again, which is what "No files were
# found with the provided path: frontend/blob-report" was. The job copies
# the report out of the container instead.
volumes: !reset []
# frontend/playwright.config.ts defaults baseURL to the test stack's
# hostname, which resolves to nothing in here. The backend serves the SPA
# and its API on one origin.
environment:
- PLAYWRIGHT_BASE_URL=http://backend:8000