# Product team self-host stack — Formbricks + Outline (lightweight slice)
# Curl + run:
#   curl -O https://osalt.dev/stack/product-team/compose.yml
#   curl -O https://osalt.dev/stack/product-team/.env.example && mv .env.example .env
#   docker compose up -d
#
# Not in this file (per stack editorial):
#   - PostHog: very heavy (postgres + clickhouse + redis + kafka + zookeeper).
#     See https://github.com/PostHog/posthog/blob/master/docker-compose.yml.
#   - Plane: their installer ships a multi-container compose. See
#     https://developers.plane.so/self-hosting/methods/docker-compose.
#   - Cal.com: long env list + NextAuth setup. See https://github.com/calcom/docker.
#
# Outline depends on S3-compatible storage; this compose ships MinIO inline so
# the file is self-contained. Swap MINIO_* / AWS_* env vars to point at your
# existing S3 if you prefer.

services:
  outline-pg:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_USER: ${OUTLINE_DB_USER:-outline}
      POSTGRES_PASSWORD: ${OUTLINE_DB_PASSWORD:?set OUTLINE_DB_PASSWORD in .env}
      POSTGRES_DB: ${OUTLINE_DB_NAME:-outline}
    volumes:
      - outline_pg:/var/lib/postgresql/data

  outline-redis:
    image: redis:7-alpine
    restart: unless-stopped

  outline-minio:
    image: minio/minio:RELEASE.2024-10-13T13-34-11Z
    restart: unless-stopped
    command: server /data --console-address ":9001"
    ports:
      - "${MINIO_API_PORT:-9100}:9000"
      - "${MINIO_CONSOLE_PORT:-9101}:9001"
    environment:
      MINIO_ROOT_USER: ${MINIO_ROOT_USER:-outlineadmin}
      MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:?set MINIO_ROOT_PASSWORD in .env}
    volumes:
      - outline_minio:/data

  outline:
    image: outlinewiki/outline:0.79.2
    restart: unless-stopped
    depends_on:
      - outline-pg
      - outline-redis
      - outline-minio
    ports:
      - "${OUTLINE_PORT:-3003}:3000"
    environment:
      NODE_ENV: production
      SECRET_KEY: ${OUTLINE_SECRET_KEY:?set OUTLINE_SECRET_KEY in .env}
      UTILS_SECRET: ${OUTLINE_UTILS_SECRET:?set OUTLINE_UTILS_SECRET in .env}
      DATABASE_URL: postgres://${OUTLINE_DB_USER:-outline}:${OUTLINE_DB_PASSWORD}@outline-pg:5432/${OUTLINE_DB_NAME:-outline}
      REDIS_URL: redis://outline-redis:6379
      URL: ${OUTLINE_URL:-http://localhost:3003}
      PORT: "3000"
      FORCE_HTTPS: "false"
      AWS_ACCESS_KEY_ID: ${MINIO_ROOT_USER:-outlineadmin}
      AWS_SECRET_ACCESS_KEY: ${MINIO_ROOT_PASSWORD}
      AWS_REGION: us-east-1
      AWS_S3_UPLOAD_BUCKET_URL: http://outline-minio:9000
      AWS_S3_UPLOAD_BUCKET_NAME: ${OUTLINE_S3_BUCKET:-outline}
      AWS_S3_FORCE_PATH_STYLE: "true"
      AWS_S3_ACL: private
      EMAIL_FROM_ADDRESS: ${OUTLINE_FROM_EMAIL:-outline@example.com}

  formbricks-db:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_USER: ${FORMBRICKS_DB_USER:-formbricks}
      POSTGRES_PASSWORD: ${FORMBRICKS_DB_PASSWORD:?set FORMBRICKS_DB_PASSWORD in .env}
      POSTGRES_DB: ${FORMBRICKS_DB_NAME:-formbricks}
    volumes:
      - formbricks_db:/var/lib/postgresql/data

  formbricks:
    image: ghcr.io/formbricks/formbricks:v3.4.0
    restart: unless-stopped
    depends_on:
      - formbricks-db
    ports:
      - "${FORMBRICKS_PORT:-3002}:3000"
    environment:
      WEBAPP_URL: ${FORMBRICKS_URL:-http://localhost:3002}
      DATABASE_URL: postgres://${FORMBRICKS_DB_USER:-formbricks}:${FORMBRICKS_DB_PASSWORD}@formbricks-db:5432/${FORMBRICKS_DB_NAME:-formbricks}
      NEXTAUTH_URL: ${FORMBRICKS_URL:-http://localhost:3002}
      NEXTAUTH_SECRET: ${FORMBRICKS_NEXTAUTH_SECRET:?set FORMBRICKS_NEXTAUTH_SECRET in .env}
      ENCRYPTION_KEY: ${FORMBRICKS_ENCRYPTION_KEY:?set FORMBRICKS_ENCRYPTION_KEY in .env}
      CRON_SECRET: ${FORMBRICKS_CRON_SECRET:?set FORMBRICKS_CRON_SECRET in .env}
      MAIL_FROM: ${FORMBRICKS_MAIL_FROM:-formbricks@example.com}

volumes:
  outline_pg:
  outline_minio:
  formbricks_db:
