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.
Manual deployment
Section titled “Manual deployment”From the project files you received when arranging access:
cd backendcp .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 --buildCompose loads .env into all three services. No ports need uncommenting:
| Service | Host port | Container port | Default bind |
|---|---|---|---|
Status UI and its /metrics | 8611 | 8080 | Loopback |
| Scheduler metrics | 9756 | 9746 | Loopback |
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.
Coolify
Section titled “Coolify”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.
Authentication and health
Section titled “Authentication and health”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.
| Endpoint | Authentication | Meaning |
|---|---|---|
/healthz | Exempt | Process liveness, independent of SQLite or suite results |
/api/status | UI auth | Actual suite status; inspect JSON ok, because an unhealthy fleet can still return HTTP 200 |
/partials/overview | UI auth | HTML results polled by HTMX every 60 seconds |
/partials/suite/<suite-id> | UI auth | HTML suite details polled by HTMX every five minutes |
/metrics | Exempt | Prometheus 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.
Retention and restart
Section titled “Retention and restart”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.