services: postgres: image: docker.io/library/postgres:16-alpine environment: POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} ports: - "${POSTGRES_PORT:-5432}:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"] interval: 2s timeout: 5s retries: 15 volumes: - gardomatic-postgres-data:/var/lib/postgresql/data migrate: image: docker.io/migrate/migrate:v4.19.1 command: - -path=/migrations - -database=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}?sslmode=disable - up depends_on: postgres: condition: service_healthy volumes: - ./internal/storage/postgres/migrations:/migrations:ro restart: "no" api: build: context: . target: api environment: GARDOMATIC_API_PORT: 4000 GARDOMATIC_DB_DSN: postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}?sslmode=disable GARDOMATIC_DB_MAX_OPEN_CONNS: ${GARDOMATIC_DB_MAX_OPEN_CONNS:-25} GARDOMATIC_DB_MAX_IDLE_CONNS: ${GARDOMATIC_DB_MAX_IDLE_CONNS:-25} GARDOMATIC_DB_MAX_IDLE_TIME: ${GARDOMATIC_DB_MAX_IDLE_TIME:-15m} GARDOMATIC_ENV: ${GARDOMATIC_ENV:-development} GARDOMATIC_WEB_BASE_URL: ${GARDOMATIC_WEB_BASE_URL:-http://localhost:4040} GARDOMATIC_SESSION_COOKIE_NAME: ${GARDOMATIC_SESSION_COOKIE_NAME:-gardomatic_session} GARDOMATIC_SESSION_LIFETIME: ${GARDOMATIC_SESSION_LIFETIME:-12h} GARDOMATIC_SESSION_IDLE_TIMEOUT: ${GARDOMATIC_SESSION_IDLE_TIMEOUT:-30m} GARDOMATIC_COOKIE_SECURE: ${GARDOMATIC_COOKIE_SECURE:-false} GARDOMATIC_RATE_LIMIT_ENABLED: ${GARDOMATIC_RATE_LIMIT_ENABLED:-true} GARDOMATIC_RATE_LIMIT_RPS: ${GARDOMATIC_RATE_LIMIT_RPS:-10} GARDOMATIC_RATE_LIMIT_BURST: ${GARDOMATIC_RATE_LIMIT_BURST:-40} GARDOMATIC_CORS_TRUSTED_ORIGINS: ${GARDOMATIC_CORS_TRUSTED_ORIGINS:-http://localhost:4040} GARDOMATIC_SMTP_MODE: ${GARDOMATIC_SMTP_MODE:-file} GARDOMATIC_SMTP_HOST: ${GARDOMATIC_SMTP_HOST:-} GARDOMATIC_SMTP_PORT: ${GARDOMATIC_SMTP_PORT:-25} GARDOMATIC_SMTP_USERNAME: ${GARDOMATIC_SMTP_USERNAME:-} GARDOMATIC_SMTP_PASSWORD: ${GARDOMATIC_SMTP_PASSWORD:-} GARDOMATIC_SMTP_SENDER: ${GARDOMATIC_SMTP_SENDER:-gardomatic@localhost} GARDOMATIC_SMTP_FILE_PATH: ${GARDOMATIC_SMTP_FILE_PATH:-/tmp/gardomatic-mails.log} ports: - "${API_PORT:-4000}:4000" depends_on: migrate: condition: service_completed_successfully healthcheck: test: ["CMD", "wget", "-q", "-O", "/dev/null", "http://localhost:4000/v1/healthcheck"] interval: 5s timeout: 5s retries: 10 start_period: 5s web: build: context: . target: web environment: GARDOMATIC_API_BASE_URL: http://api:4000 GARDOMATIC_ENV: ${GARDOMATIC_ENV:-development} GARDOMATIC_WEB_PORT: 4040 GARDOMATIC_SESSION_COOKIE_NAME: ${GARDOMATIC_SESSION_COOKIE_NAME:-gardomatic_session} GARDOMATIC_COOKIE_SECURE: ${GARDOMATIC_COOKIE_SECURE:-false} ports: - "${WEB_PORT:-4040}:4040" depends_on: api: condition: service_healthy healthcheck: test: ["CMD", "wget", "-q", "-O", "/dev/null", "http://localhost:4040/ping"] interval: 5s timeout: 5s retries: 10 start_period: 5s volumes: gardomatic-postgres-data: driver: local