name: tickward services: app: image: ${TICKWARD_IMAGE:-docker.io/corgicorner/tickward:0.14.4} pull_policy: ${TICKWARD_PULL_POLICY:-missing} build: context: . args: SITE_URL: ${SITE_URL:-http://localhost:3000} NEXT_PUBLIC_TICKWARD_MAX_TIMERS: ${NEXT_PUBLIC_TICKWARD_MAX_TIMERS:-20} NEXT_PUBLIC_TICKWARD_MAX_TIMERS_PER_SPACE: ${NEXT_PUBLIC_TICKWARD_MAX_TIMERS_PER_SPACE:-20} NEXT_PUBLIC_TICKWARD_MAX_PROJECTS: ${NEXT_PUBLIC_TICKWARD_MAX_PROJECTS:-10} NEXT_PUBLIC_TICKWARD_MAX_SPACES: ${NEXT_PUBLIC_TICKWARD_MAX_SPACES:-2} NEXT_PUBLIC_PLAUSIBLE_URL: ${NEXT_PUBLIC_PLAUSIBLE_URL:-} NEXT_PUBLIC_PLAUSIBLE_DOMAIN: ${NEXT_PUBLIC_PLAUSIBLE_DOMAIN:-} environment: HOSTNAME: 0.0.0.0 PORT: 3000 SITE_URL: ${SITE_URL:-http://localhost:3000} DATABASE_URL: ${DATABASE_URL:?Set DATABASE_URL in .env before starting Docker Compose} DIRECT_URL: ${DIRECT_URL:?Set DIRECT_URL in .env before starting Docker Compose} UPSTASH_REDIS_REST_URL: ${UPSTASH_REDIS_REST_URL:-http://redis-http:80} UPSTASH_REDIS_REST_TOKEN: ${UPSTASH_REDIS_REST_TOKEN:-local-dev-token-change-me} TICKWARD_DOCS_ORIGIN: ${TICKWARD_DOCS_ORIGIN:-https://tickward.com/docs} NEXT_PUBLIC_TICKWARD_MAX_TIMERS: ${NEXT_PUBLIC_TICKWARD_MAX_TIMERS:-20} NEXT_PUBLIC_TICKWARD_MAX_TIMERS_PER_SPACE: ${NEXT_PUBLIC_TICKWARD_MAX_TIMERS_PER_SPACE:-20} NEXT_PUBLIC_TICKWARD_MAX_PROJECTS: ${NEXT_PUBLIC_TICKWARD_MAX_PROJECTS:-10} NEXT_PUBLIC_TICKWARD_MAX_SPACES: ${NEXT_PUBLIC_TICKWARD_MAX_SPACES:-2} NEXT_PUBLIC_PLAUSIBLE_URL: ${NEXT_PUBLIC_PLAUSIBLE_URL:-} NEXT_PUBLIC_PLAUSIBLE_DOMAIN: ${NEXT_PUBLIC_PLAUSIBLE_DOMAIN:-} UNSPLASH_ACCESS_KEY: ${UNSPLASH_ACCESS_KEY:-} BETTER_AUTH_URL: ${BETTER_AUTH_URL:-} BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET:-} RESEND_API_KEY: ${RESEND_API_KEY:-} RESEND_FROM: ${RESEND_FROM:-} RESEND_REPLY_TO: ${RESEND_REPLY_TO:-} WEB_PUSH_VAPID_PUBLIC_KEY: ${WEB_PUSH_VAPID_PUBLIC_KEY:-} WEB_PUSH_VAPID_PRIVATE_KEY: ${WEB_PUSH_VAPID_PRIVATE_KEY:-} WEB_PUSH_VAPID_SUBJECT: ${WEB_PUSH_VAPID_SUBJECT:-} TICKWARD_SCHEDULER_SECRET: ${TICKWARD_SCHEDULER_SECRET:-} depends_on: postgres: condition: service_healthy redis: condition: service_healthy redis-http: condition: service_started ports: - "${APP_PORT:-3000}:3000" restart: unless-stopped postgres: image: postgres:17-alpine environment: POSTGRES_DB: ${POSTGRES_DB:-tickward} POSTGRES_USER: ${POSTGRES_USER:-tickward} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD in .env before starting Docker Compose} volumes: - postgres-data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-tickward} -d ${POSTGRES_DB:-tickward}"] interval: 5s timeout: 3s retries: 10 restart: unless-stopped redis: image: redis:7-alpine command: ["redis-server", "--appendonly", "yes"] volumes: - redis-data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 3s retries: 10 restart: unless-stopped redis-http: image: hiett/serverless-redis-http:0.0.10 environment: SRH_MODE: env SRH_TOKEN: ${UPSTASH_REDIS_REST_TOKEN:-local-dev-token-change-me} SRH_CONNECTION_STRING: redis://redis:6379 depends_on: redis: condition: service_healthy restart: unless-stopped volumes: postgres-data: redis-data: