- Every successful change in the dashboard is logged (who, what, when) with passwords, secrets and tokens masked; shown with the publish log in plain English, filter by period, client, person, search - System health: publishing/scheduler switches, overdue or failed posts, stale numbers refreshes, connections needing reconnect or expiring, email, AI runs and API key, last backup, data size - docker-compose mounts ./backups read-only so health can see the last backup Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
45 lines
1.2 KiB
YAML
45 lines
1.2 KiB
YAML
# Quorla on one server: docker compose up -d --build
|
|
# - app: the dashboard + publishing queue (port 4310 inside the Docker network only)
|
|
# - caddy: HTTPS for APP_DOMAIN with automatic Let's Encrypt certificates
|
|
# Live data stays in the folders next to this file, so rebuilding the image never touches it.
|
|
services:
|
|
app:
|
|
build: .
|
|
image: quorla:latest
|
|
restart: unless-stopped
|
|
env_file: .env
|
|
environment:
|
|
DASHBOARD_HOST: 0.0.0.0
|
|
DASHBOARD_COOKIE_SECURE: "true"
|
|
TRUST_PROXY: uniquelocal
|
|
SCHEDULER_ENABLED: "true"
|
|
volumes:
|
|
- ./data:/app/data
|
|
- ./clients:/app/clients
|
|
- ./team:/app/team
|
|
- ./reports:/app/reports
|
|
- ./branding:/app/branding
|
|
- ./backups:/app/backups:ro
|
|
expose:
|
|
- "4310"
|
|
|
|
caddy:
|
|
image: caddy:2.8
|
|
restart: unless-stopped
|
|
depends_on: [app]
|
|
environment:
|
|
APP_DOMAIN: ${APP_DOMAIN:?Set APP_DOMAIN in .env, e.g. app.quorlasocial.com}
|
|
ACME_EMAIL: ${ACME_EMAIL:?Set ACME_EMAIL in .env (certificate expiry notices go here)}
|
|
ports:
|
|
- "80:80"
|
|
- "443:443"
|
|
- "443:443/udp"
|
|
volumes:
|
|
- ./deploy/Caddyfile:/etc/caddy/Caddyfile:ro
|
|
- caddy_data:/data
|
|
- caddy_config:/config
|
|
|
|
volumes:
|
|
caddy_data:
|
|
caddy_config:
|