Skip to content

Deployment

The supplied backend/docker-compose.yml runs three containers. The scheduler and UI share an image; the backup sidecar has its own image:

  • scheduler: generates the crontab and runs it through supercronic.
  • ui: serves the FastAPI/Jinja status page and locally bundled HTMX on container port 8080.
  • backup: creates SQLite snapshots and uploads them to Cloudflare R2 when backup credentials are configured. Without credentials, it logs a skipped backup; the scheduler and UI continue running.

All three mount talaia-data at /app/data. The runner writes results and alert state; the UI reads only. Dependencies are installed from uv.lock on Python 3.12.

From the project files you received when arranging access:

Terminal window
cd backend
cp .env.example .env
# edit .env with the intended settings and dedicated test-account credentials
# review enabled suites before starting the scheduler
docker compose up -d --build

Compose loads .env into all three services. No ports need uncommenting:

ServiceHost portContainer portDefault bind
Status UI and its /metrics86118080Loopback
Scheduler metrics97569746Loopback

Set TAILNET_IP to the host’s private tailnet address to allow tailnet access. Otherwise use the loopback interface or an SSH tunnel to host port 8611. The standalone talaia ui CLI uses local port 8080; it is separate from Docker’s host-port mapping.

Use a Docker Compose resource with base directory /backend and the supplied docker-compose.yml. Configure runtime settings using the environment-variable catalogue in backend/.env.example. Set TAILNET_IP as a runtime value: Coolify writes runtime rows to the stack’s .env, which Compose uses for port interpolation. For manual Compose deployments, set it in backend/.env.

The shipped topology has no public UI domain. If you separately configure a public reverse proxy, terminate HTTPS, set both UI basic-auth values and restrict /metrics to your monitoring network. Basic auth does not protect that endpoint. The scheduler requires no public domain. Enable the containers’ health checks.

Backend code and public documentation are separate deployments. A backend push only updates the backend when your deployment integration is configured to do so.

Both TALAIA_UI_USERNAME and TALAIA_UI_PASSWORD set enables basic auth. One set without the other returns 503 on protected routes. Both empty leaves the UI open, which is intended only behind an appropriate private-network boundary.

EndpointAuthenticationMeaning
/healthzExemptProcess liveness, independent of SQLite or suite results
/api/statusUI authActual suite status; inspect JSON ok, because an unhealthy fleet can still return HTTP 200
/partials/overviewUI authHTML results polled by HTMX every 60 seconds
/partials/suite/<suite-id>UI authHTML suite details polled by HTMX every five minutes
/metricsExemptPrometheus metrics; protect at the network/proxy boundary

A missing database returns 503 on the UI/status API and talaia_db_ready 0 in metrics. Before running any suite, this is expected. A suite with no history shows never run in the UI and unknown in the API, and does not count as healthy. For normal daily schedules, results become stale after three configured intervals, with a minimum of 30 minutes; unusual calendar restrictions use observed history once at least three runs exist.

The runner purges results older than TALAIA_RETENTION_DAYS after each run, default 90. Cumulative run counters are stored separately and survive purges. Keep the volume across redeploys: it also holds pending emergency cancellations and warning deliveries, not just history. Preserve the original Pushover application credentials while emergency repeats may need cancellation.

Configure the sidecar’s BACKUP_S3_* settings and optional HEALTHCHECKS_PING_URL_DB_BACKUP from backend/.env.example. It uses rclone to upload compressed SQLite snapshots, with retention controlled by BACKUP_KEEP_DAYS. Verify a completed upload and a staged restore; a healthy backup container only proves its scheduler is running. Restoring a snapshot can restore old pending notifications, so check alert state after a restore. Heartbeats provide an external signal when the scheduler or host stops.