137 lines
5.1 KiB
YAML
137 lines
5.1 KiB
YAML
services:
|
|||
|
|
postgres:
|
||
|
|
image: postgres:16-alpine
|
||
|
|
container_name: cio-postgres
|
||
|
|
environment:
|
||
|
|
POSTGRES_DB: ${POSTGRES_DB:-classroomio}
|
||
|
|
POSTGRES_USER: ${POSTGRES_USER:-postgres}
|
||
|
|
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres}
|
||
|
|
volumes:
|
||
|
|
- postgres-data:/var/lib/postgresql/data
|
||
|
|
healthcheck:
|
||
|
|
test:
|
||
|
|
[
|
||
|
|
"CMD-SHELL",
|
||
|
|
"pg_isready -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-classroomio}",
|
||
|
|
]
|
||
|
|
interval: 5s
|
||
|
|
timeout: 5s
|
||
|
|
retries: 10
|
||
|
|
start_period: 5s
|
||
|
|
|
||
|
|
redis:
|
||
|
|
image: redis:7-alpine
|
||
|
|
container_name: cio-redis
|
||
|
|
command: ["redis-server", "--appendonly", "yes"]
|
||
|
|
volumes:
|
||
|
|
- redis-data:/data
|
||
|
|
healthcheck:
|
||
|
|
test: ["CMD", "redis-cli", "ping"]
|
||
|
|
interval: 5s
|
||
|
|
timeout: 3s
|
||
|
|
retries: 10
|
||
|
|
start_period: 5s
|
||
|
|
|
||
|
|
db-init:
|
||
|
|
image: ${CIO_API_IMAGE:-classroomio/api:latest}
|
||
|
|
pull_policy: always
|
||
|
|
container_name: cio-db-init
|
||
|
|
depends_on:
|
||
|
|
postgres:
|
||
|
|
condition: service_healthy
|
||
|
|
environment:
|
||
|
|
DATABASE_URL: postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@postgres:5432/${POSTGRES_DB:-classroomio}
|
||
|
|
PRIVATE_DATABASE_URL: postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@postgres:5432/${POSTGRES_DB:-classroomio}
|
||
|
|
command:
|
||
|
|
- sh
|
||
|
|
- -c
|
||
|
|
- pnpm --filter @cio/db db:setup
|
||
|
|
restart: "no"
|
||
|
|
|
||
|
|
api:
|
||
|
|
image: ${CIO_API_IMAGE:-classroomio/api:latest}
|
||
|
|
pull_policy: always
|
||
|
|
container_name: cio-api
|
||
|
|
ports:
|
||
|
|
- "3081:3081"
|
||
|
|
depends_on:
|
||
|
|
postgres:
|
||
|
|
condition: service_healthy
|
||
|
|
redis:
|
||
|
|
condition: service_healthy
|
||
|
|
db-init:
|
||
|
|
condition: service_completed_successfully
|
||
|
|
environment:
|
||
|
|
NODE_ENV: production
|
||
|
|
PORT: 3081
|
||
|
|
PUBLIC_SERVER_URL: ${PUBLIC_SERVER_URL:?PUBLIC_SERVER_URL is required}
|
||
|
|
TRUSTED_ORIGINS: ${TRUSTED_ORIGINS:?TRUSTED_ORIGINS is required}
|
||
|
|
AUTH_COOKIE_DOMAIN: ${AUTH_COOKIE_DOMAIN:-}
|
||
|
|
DATABASE_URL: postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@postgres:5432/${POSTGRES_DB:-classroomio}
|
||
|
|
PRIVATE_DATABASE_URL: postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@postgres:5432/${POSTGRES_DB:-classroomio}
|
||
|
|
REDIS_URL: redis://redis:6379
|
||
|
|
GOOGLE_CLIENT_ID: ${GOOGLE_CLIENT_ID:-}
|
||
|
|
GOOGLE_CLIENT_SECRET: ${GOOGLE_CLIENT_SECRET:-}
|
||
|
|
ZOHO_TOKEN: ${ZOHO_TOKEN:-}
|
||
|
|
SMTP_HOST: ${SMTP_HOST:-}
|
||
|
|
SMTP_USER: ${SMTP_USER:-}
|
||
|
|
SMTP_PASSWORD: ${SMTP_PASSWORD:-}
|
||
|
|
SMTP_PORT: ${SMTP_PORT:-}
|
||
|
|
SMTP_SENDER: ${SMTP_SENDER:-}
|
||
|
|
CLOUDFLARE_BUCKET_DOMAIN: ${CLOUDFLARE_BUCKET_DOMAIN:-}
|
||
|
|
CLOUDFLARE_ACCESS_KEY: ${CLOUDFLARE_ACCESS_KEY:-}
|
||
|
|
CLOUDFLARE_SECRET_ACCESS_KEY: ${CLOUDFLARE_SECRET_ACCESS_KEY:-}
|
||
|
|
CLOUDFLARE_ACCOUNT_ID: ${CLOUDFLARE_ACCOUNT_ID:-}
|
||
|
|
CLOUDFLARE_IMAGE_BUCKET_DOMAIN: ${CLOUDFLARE_IMAGE_BUCKET_DOMAIN:-}
|
||
|
|
CLOUDFLARE_RENDERING_API_KEY: ${CLOUDFLARE_RENDERING_API_KEY:-}
|
||
|
|
OBJECT_STORAGE_ENDPOINT: ${OBJECT_STORAGE_ENDPOINT:-}
|
||
|
|
OBJECT_STORAGE_PUBLIC_ENDPOINT: ${OBJECT_STORAGE_PUBLIC_ENDPOINT:-}
|
||
|
|
OBJECT_STORAGE_ACCESS_KEY_ID: ${OBJECT_STORAGE_ACCESS_KEY_ID:-}
|
||
|
|
OBJECT_STORAGE_SECRET_ACCESS_KEY: ${OBJECT_STORAGE_SECRET_ACCESS_KEY:-}
|
||
|
|
OBJECT_STORAGE_FORCE_PATH_STYLE: ${OBJECT_STORAGE_FORCE_PATH_STYLE:-}
|
||
|
|
OBJECT_STORAGE_MEDIA_PUBLIC_BASE_URL: ${OBJECT_STORAGE_MEDIA_PUBLIC_BASE_URL:-}
|
||
|
|
AUTH_BEARER_TOKEN: ${AUTH_BEARER_TOKEN:?AUTH_BEARER_TOKEN is required}
|
||
|
|
PRIVATE_SERVER_KEY: ${PRIVATE_SERVER_KEY:?PRIVATE_SERVER_KEY is required}
|
||
|
|
LICENSE_KEY: ${LICENSE_KEY:-}
|
||
|
|
UNSPLASH_API_KEY: ${UNSPLASH_API_KEY:-}
|
||
|
|
BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET:?BETTER_AUTH_SECRET is required}
|
||
|
|
restart: unless-stopped
|
||
|
|
|
||
|
|
dashboard:
|
||
|
|
image: ${CIO_DASHBOARD_IMAGE:-classroomio/dashboard:latest}
|
||
|
|
build:
|
||
|
|
context: ..
|
||
|
|
dockerfile: docker/Dockerfile.dashboard
|
||
|
|
args:
|
||
|
|
PUBLIC_IS_SELFHOSTED: ${PUBLIC_IS_SELFHOSTED:-true}
|
||
|
|
PUBLIC_SERVER_URL: ${PUBLIC_SERVER_URL:-}
|
||
|
|
ALLOWED_EXTERNAL_DOMAINS: ${ALLOWED_EXTERNAL_DOMAINS:-}
|
||
|
|
CSP_SCRIPT_SRC_DOMAINS: ${CSP_SCRIPT_SRC_DOMAINS:-}
|
||
|
|
CSP_STYLE_SRC_DOMAINS: ${CSP_STYLE_SRC_DOMAINS:-}
|
||
|
|
CSP_CONNECT_SRC_DOMAINS: ${CSP_CONNECT_SRC_DOMAINS:-}
|
||
|
|
CSP_FRAME_SRC_DOMAINS: ${CSP_FRAME_SRC_DOMAINS:-}
|
||
|
|
CSP_FONT_SRC_DOMAINS: ${CSP_FONT_SRC_DOMAINS:-}
|
||
|
|
pull_policy: always
|
||
|
|
container_name: cio-dashboard
|
||
|
|
ports:
|
||
|
|
- "3082:3082"
|
||
|
|
depends_on:
|
||
|
|
api:
|
||
|
|
condition: service_started
|
||
|
|
environment:
|
||
|
|
NODE_ENV: production
|
||
|
|
PORT: 3082
|
||
|
|
ORIGIN: ${DASHBOARD_ORIGIN:?DASHBOARD_ORIGIN is required}
|
||
|
|
PUBLIC_IS_SELFHOSTED: ${PUBLIC_IS_SELFHOSTED:-true}
|
||
|
|
PUBLIC_SERVER_URL: ${PUBLIC_SERVER_URL:?PUBLIC_SERVER_URL is required}
|
||
|
|
PRIVATE_SERVER_URL: ${PRIVATE_SERVER_URL:-http://api:3081}
|
||
|
|
PRIVATE_SERVER_KEY: ${PRIVATE_SERVER_KEY:?PRIVATE_SERVER_KEY is required}
|
||
|
|
PRIVATE_APP_HOST: ${PRIVATE_APP_HOST:-localhost}
|
||
|
|
PRIVATE_APP_SUBDOMAINS: ${PRIVATE_APP_SUBDOMAINS:-app}
|
||
|
|
AUTH_BEARER_TOKEN: ${AUTH_BEARER_TOKEN:-}
|
||
|
|
restart: unless-stopped
|
||
|
|
|
||
|
|
volumes:
|
||
|
|
postgres-data:
|
||
|
|
redis-data:
|