# documentation: https://docs.affine.pro/docs/self-host-affine
# slogan: Affine is an open-source, all-in-one workspace and OS for knowledge management, a Notion/Miro alternative.
# tags: knowledge-management,notion,miro,workspace
# logo: svgs/affine.svg
# port: 3010

services:
  affine:
    image: ghcr.io/toeverything/affine-graphql:stable
    command:
      - sh
      - '-c'
      - 'node ./scripts/self-host-predeploy && node ./dist/index.js'
    depends_on:
      redis:
        condition: service_healthy  
      postgres:
        condition: service_healthy
    volumes:
      - affine-config:/root/.affine/config
      - affine-storage:/root/.affine/storage
    logging:
      driver: json-file
      options:
        max-size: 1000m
    environment:
      - SERVICE_FQDN_AFFINE_3010
      - NODE_OPTIONS=--import=./scripts/register.js
      - AFFINE_CONFIG_PATH=/root/.affine/config
      - REDIS_SERVER_HOST=redis
      - DATABASE_URL=postgres://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@postgres:5432/${POSTGRES_DB:-affine}
      - NODE_ENV=production
      - AFFINE_SERVER_HOST=$SERVICE_FQDN_AFFINE
      - AFFINE_SERVER_EXTERNAL_URL=$SERVICE_FQDN_AFFINE
      - MAILER_HOST=${MAILER_HOST}
      - MAILER_PORT=${MAILER_PORT}
      - MAILER_USER=${MAILER_USER}
      - MAILER_PASSWORD=${MAILER_PASSWORD}
      - MAILER_SENDER=${MAILER_SENDER}
      - COPILOT_FAL_API_KEY=${COPILOT_FAL_API_KEY}
      - COPILOT_PERPLEXITY_API_KEY=${COPILOT_PERPLEXITY_API_KEY}
      - COPILOT_OPENAI_API_KEY=${COPILOT_OPENAI_API_KEY}
    healthcheck:
      test: ["CMD-SHELL", "bash -c ':> /dev/tcp/127.0.0.1/3010' || exit 1"]
      interval: 5s
      timeout: 20s
      retries: 3

  redis:
    image: redis
    volumes:
      - affine-redis-data:/data
    healthcheck:
      test:
        - CMD
        - redis-cli
        - '--raw'
        - incr
        - ping
      interval: 10s
      timeout: 5s
      retries: 5
  postgres:
    image: postgres:16
    volumes:
      - affine-postgres-data:/var/lib/postgresql/data
    healthcheck:
      test:
        - CMD-SHELL
        - 'pg_isready -U affine'
      interval: 10s
      timeout: 5s
      retries: 5
    environment:
      - POSTGRES_USER=${SERVICE_USER_POSTGRES}
      - POSTGRES_PASSWORD=${SERVICE_PASSWORD_POSTGRES}
      - POSTGRES_DB=${POSTGRES_DB:-affine}
      - PGDATA=/var/lib/postgresql/data/pgdata
