# Kadence: API + web UI in one container, Postgres beside it. # # cp .env.example .env # fill in Jira / Todoist / Telegram # docker compose up -d # http://localhost:8000 # # The native desktop app runs on your machine and points at this backend. services: db: image: postgres:17-alpine restart: unless-stopped environment: POSTGRES_USER: ${POSTGRES_USER:-kadence} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-kadence} POSTGRES_DB: ${POSTGRES_DB:-kadence} volumes: - db-data:/var/lib/postgresql/data healthcheck: # The app's first query happens seconds after boot, so the API must not # start until Postgres can actually answer. test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-kadence} -d ${POSTGRES_DB:-kadence}"] interval: 5s timeout: 5s retries: 10 app: # Named as well as built, so the same compose file can run a published image # instead: `KADENCE_IMAGE=git.timka.su/timka123/kadence:latest docker compose pull`. # `up --build` still builds locally and tags it with this name. image: ${KADENCE_IMAGE:-git.timka.su/timka123/kadence:latest} build: context: . dockerfile: Dockerfile restart: unless-stopped depends_on: db: condition: service_healthy environment: DATABASE_URL: >- postgresql+psycopg://${POSTGRES_USER:-kadence}:${POSTGRES_PASSWORD:-kadence}@db:5432/${POSTGRES_DB:-kadence} TZ: ${TIMEZONE:-Europe/Moscow} TIMEZONE: ${TIMEZONE:-Europe/Moscow} CORS_ORIGINS: ${CORS_ORIGINS:-*} API_TOKEN: ${API_TOKEN:-} SCHEDULER_ENABLED: ${SCHEDULER_ENABLED:-true} TELEGRAM_BOT_ENABLED: ${TELEGRAM_BOT_ENABLED:-true} LOG_LEVEL: ${LOG_LEVEL:-INFO} # Android OTA: the token never reaches the phone. Empty disables the # update endpoints (they answer 503) without affecting anything else. GITEA_URL: ${GITEA_URL:-https://git.timka.su} GITEA_REPO: ${GITEA_REPO:-timka123/kadence} GITEA_TOKEN: ${GITEA_TOKEN:-} GITEA_UPDATE_BRANCH: ${GITEA_UPDATE_BRANCH:-master} # Web login — see .env.example for what each does. AUTH_USERNAME: ${AUTH_USERNAME:-timka} AUTH_PASSWORD: ${AUTH_PASSWORD:-} TELEGRAM_OWNER_ID: ${TELEGRAM_OWNER_ID:-} TELEGRAM_BOT_USERNAME: ${TELEGRAM_BOT_USERNAME:-} # Seeds for the editable settings — the same variable names jira-helper # uses, so an existing .env can be copied across unchanged. JIRA_BASE_URL: ${JIRA_BASE_URL:-} JIRA_EMAIL: ${JIRA_EMAIL:-} JIRA_API_TOKEN: ${JIRA_API_TOKEN:-} JIRA_EXTRA_JQL: ${JIRA_EXTRA_JQL:-} JIRA_START_DATE_FIELD: ${JIRA_START_DATE_FIELD:-customfield_10015} GOOGLE_CLIENT_ID: ${GOOGLE_CLIENT_ID:-} GOOGLE_CLIENT_SECRET: ${GOOGLE_CLIENT_SECRET:-} GOOGLE_REFRESH_TOKEN: ${GOOGLE_REFRESH_TOKEN:-} GOOGLE_TASKS_LISTS: ${GOOGLE_TASKS_LISTS:-} TODOIST_API_TOKEN: ${TODOIST_API_TOKEN:-} TODOIST_PROJECTS: ${TODOIST_PROJECTS:-} LAUNDRY_SESSION: ${LAUNDRY_SESSION:-} LAUNDRY_BASE_URL: ${LAUNDRY_BASE_URL:-https://4ka.inbicst.ru} TELEGRAM_BOT_TOKEN: ${TELEGRAM_BOT_TOKEN:-} TELEGRAM_CHAT_ID: ${TELEGRAM_CHAT_ID:-} SLACK_WEBHOOK_URL: ${SLACK_WEBHOOK_URL:-} ports: - "${APP_PORT:-8000}:8000" volumes: db-data: