services: nginx: restart:on-failure image:nginx:1.27 ports: -9999:80# Disable this if you are using TLS #- ${NGINX_TLS_PORT:-443}:443 volumes: -./nginx/nginx.conf:/etc/nginx/nginx.conf #- ./nginx/ssl/certificate.crt:/etc/nginx/ssl/certificate.crt #- ./nginx/ssl/private_key.key:/etc/nginx/ssl/private_key.key networks: -shared_network #- ./nginx_logs:/var/log/nginx
gotrue: restart:on-failure image:appflowyinc/gotrue:${GOTRUE_VERSION:-latest} healthcheck: test:"curl --fail http://127.0.0.1:9999/health || exit 1" interval:5s timeout:5s retries:12 environment: # There are a lot of options to configure GoTrue. You can reference the example config: # https://github.com/supabase/auth/blob/master/example.env -GOTRUE_ADMIN_EMAIL=${GOTRUE_ADMIN_EMAIL} -GOTRUE_ADMIN_PASSWORD=${GOTRUE_ADMIN_PASSWORD} -GOTRUE_DISABLE_SIGNUP=${GOTRUE_DISABLE_SIGNUP:-false} -GOTRUE_SITE_URL=appflowy-flutter://# redirected to AppFlowy application -GOTRUE_URI_ALLOW_LIST=**# adjust restrict if necessary -GOTRUE_JWT_SECRET=${GOTRUE_JWT_SECRET}# authentication secret -GOTRUE_JWT_EXP=${GOTRUE_JWT_EXP} # Without this environment variable, the createuser command will create an admin # with the `admin` role as opposed to `supabase_admin` -GOTRUE_JWT_ADMIN_GROUP_NAME=supabase_admin -GOTRUE_DB_DRIVER=postgres -API_EXTERNAL_URL=${API_EXTERNAL_URL} -DATABASE_URL=${GOTRUE_DATABASE_URL} -PORT=9999 -GOTRUE_SMTP_HOST=${GOTRUE_SMTP_HOST}# e.g. smtp.gmail.com -GOTRUE_SMTP_PORT=${GOTRUE_SMTP_PORT}# e.g. 465 -GOTRUE_SMTP_USER=${GOTRUE_SMTP_USER}# email sender, e.g. noreply@appflowy.io -GOTRUE_SMTP_PASS=${GOTRUE_SMTP_PASS}# email password -GOTRUE_MAILER_URLPATHS_CONFIRMATION=/gotrue/verify -GOTRUE_MAILER_URLPATHS_INVITE=/gotrue/verify -GOTRUE_MAILER_URLPATHS_RECOVERY=/gotrue/verify -GOTRUE_MAILER_URLPATHS_EMAIL_CHANGE=/gotrue/verify -GOTRUE_SMTP_ADMIN_EMAIL=${GOTRUE_SMTP_ADMIN_EMAIL}# email with admin privileges e.g. internal@appflowy.io -GOTRUE_SMTP_MAX_FREQUENCY=${GOTRUE_SMTP_MAX_FREQUENCY:-1ns}# set to 1ns for running tests -GOTRUE_RATE_LIMIT_EMAIL_SENT=${GOTRUE_RATE_LIMIT_EMAIL_SENT:-100}# number of email sendable per minute -GOTRUE_MAILER_AUTOCONFIRM=${GOTRUE_MAILER_AUTOCONFIRM:-false}# change this to true to skip email confirmation # Google OAuth config -GOTRUE_EXTERNAL_GOOGLE_ENABLED=${GOTRUE_EXTERNAL_GOOGLE_ENABLED} -GOTRUE_EXTERNAL_GOOGLE_CLIENT_ID=${GOTRUE_EXTERNAL_GOOGLE_CLIENT_ID} -GOTRUE_EXTERNAL_GOOGLE_SECRET=${GOTRUE_EXTERNAL_GOOGLE_SECRET} -GOTRUE_EXTERNAL_GOOGLE_REDIRECT_URI=${GOTRUE_EXTERNAL_GOOGLE_REDIRECT_URI} # GITHUB OAuth config -GOTRUE_EXTERNAL_GITHUB_ENABLED=${GOTRUE_EXTERNAL_GITHUB_ENABLED} -GOTRUE_EXTERNAL_GITHUB_CLIENT_ID=${GOTRUE_EXTERNAL_GITHUB_CLIENT_ID} -GOTRUE_EXTERNAL_GITHUB_SECRET=${GOTRUE_EXTERNAL_GITHUB_SECRET} -GOTRUE_EXTERNAL_GITHUB_REDIRECT_URI=${GOTRUE_EXTERNAL_GITHUB_REDIRECT_URI} # Discord OAuth config -GOTRUE_EXTERNAL_DISCORD_ENABLED=${GOTRUE_EXTERNAL_DISCORD_ENABLED} -GOTRUE_EXTERNAL_DISCORD_CLIENT_ID=${GOTRUE_EXTERNAL_DISCORD_CLIENT_ID} -GOTRUE_EXTERNAL_DISCORD_SECRET=${GOTRUE_EXTERNAL_DISCORD_SECRET} -GOTRUE_EXTERNAL_DISCORD_REDIRECT_URI=${GOTRUE_EXTERNAL_DISCORD_REDIRECT_URI} networks: -shared_network
appflowy_cloud: restart:on-failure ports: -18000:8000 environment: -RUST_LOG=${RUST_LOG:-info} -APPFLOWY_ENVIRONMENT=production -APPFLOWY_DATABASE_URL=${APPFLOWY_DATABASE_URL} -APPFLOWY_REDIS_URI=${APPFLOWY_REDIS_URI} -APPFLOWY_GOTRUE_JWT_SECRET=${GOTRUE_JWT_SECRET} -APPFLOWY_GOTRUE_BASE_URL=${APPFLOWY_GOTRUE_BASE_URL} -APPFLOWY_S3_USE_MINIO=${APPFLOWY_S3_USE_MINIO} -APPFLOWY_S3_MINIO_URL=${APPFLOWY_S3_MINIO_URL} -APPFLOWY_S3_ACCESS_KEY=${APPFLOWY_S3_ACCESS_KEY} -APPFLOWY_S3_SECRET_KEY=${APPFLOWY_S3_SECRET_KEY} -APPFLOWY_S3_BUCKET=${APPFLOWY_S3_BUCKET} -APPFLOWY_S3_REGION=${APPFLOWY_S3_REGION} -APPFLOWY_ACCESS_CONTROL=${APPFLOWY_ACCESS_CONTROL} # For the CI testing, we set the database connection to 20. The default value is 40. -APPFLOWY_DATABASE_MAX_CONNECTIONS=20 -AI_SERVER_HOST=${AI_SERVER_HOST} -AI_SERVER_PORT=${AI_SERVER_PORT} -APPFLOWY_WEB_URL=${APPFLOWY_WEB_URL} -APPFLOWY_MAILER_SMTP_HOST=${APPFLOWY_MAILER_SMTP_HOST} -APPFLOWY_MAILER_SMTP_PORT=${APPFLOWY_MAILER_SMTP_PORT} -APPFLOWY_MAILER_SMTP_USERNAME=${APPFLOWY_MAILER_SMTP_USERNAME} -APPFLOWY_MAILER_SMTP_EMAIL=${APPFLOWY_MAILER_SMTP_EMAIL} -APPFLOWY_MAILER_SMTP_PASSWORD=${APPFLOWY_MAILER_SMTP_PASSWORD} -AI_OPENAI_API_KEY=${AI_OPENAI_API_KEY} build: context:. dockerfile:Dockerfile args: FEATURES:"" PROFILE:ci networks: -shared_network image:appflowyinc/appflowy_cloud:${APPFLOWY_CLOUD_VERSION:-latest} depends_on: gotrue: condition:service_healthy
ai: restart:on-failure image:appflowyinc/appflowy_ai:${APPFLOWY_AI_VERSION:-latest} environment: -AI_SERVER_PORT=${AI_SERVER_PORT} -OPENAI_API_KEY=${AI_OPENAI_API_KEY} -DEFAULT_AI_MODEL=openai/gpt-oss-20b:free# Make sure the model is available in your OpenAI account -DEFAULT_AI_COMPLETION_MODEL=openai/gpt-oss-20b:free# Make sure the model is available in your OpenAI account -AZURE_OPENAI_API_KEY=${AI_AZURE_OPENAI_API_KEY} -AZURE_OPENAI_ENDPOINT=${AI_AZURE_OPENAI_API_BASE} -AZURE_OPENAI_API_VERSION=${AI_AZURE_OPENAI_API_VERSION} -APPFLOWY_S3_ACCESS_KEY=${APPFLOWY_S3_ACCESS_KEY} -APPFLOWY_S3_SECRET_KEY=${APPFLOWY_S3_SECRET_KEY} -APPFLOWY_S3_BUCKET=${APPFLOWY_S3_BUCKET} -APPFLOWY_S3_REGION=${APPFLOWY_S3_REGION} -AI_DATABASE_URL=${APPFLOWY_DATABASE_URL} -AI_REDIS_URL=${APPFLOWY_REDIS_URI} -AI_USE_MINIO=${APPFLOWY_S3_USE_MINIO} -AI_MINIO_URL=${APPFLOWY_S3_MINIO_URL} -AI_APPFLOWY_HOST=${APPFLOWY_BASE_URL} -APPFLOWY_GOTRUE_JWT_SECRET=${GOTRUE_JWT_SECRET}
underscores_in_headers on; set $appflowy_cloud_backend "http://appflowy_cloud:8000"; set $gotrue_backend "http://gotrue:9999"; set $appflowy_web_backend "http://appflowy_web:80";
# Allow headers like redirect_to to be handed over to the gotrue # for correct redirecting proxy_set_header Host $http_host; proxy_pass_request_headers on; }
# Apple OAuth2 GOTRUE_EXTERNAL_APPLE_ENABLED=false GOTRUE_EXTERNAL_APPLE_CLIENT_ID= GOTRUE_EXTERNAL_APPLE_SECRET= GOTRUE_EXTERNAL_APPLE_REDIRECT_URI=${API_EXTERNAL_URL}/callback
# SAML 2.0. Refer to https://github.com/AppFlowy-IO/AppFlowy-Cloud/blob/main/doc/OKTA_SAML.md for example using Okta. GOTRUE_SAML_ENABLED=false GOTRUE_SAML_PRIVATE_KEY=
# AppFlowy Worker Service APPFLOWY_WORKER_REDIS_URL=redis://:${REDIS_PASSWORD}@${REDIS_HOST}:${REDIS_PORT} APPFLOWY_WORKER_DATABASE_URL=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB} APPFLOWY_WORKER_DATABASE_NAME=${POSTGRES_DB}
# ============================================================================= # 🌐 WEB FRONTEND: AppFlowy Web interface # =============================================================================
# AppFlowy Web # If your AppFlowy Web is hosted on a different domain, update this variable to the correct domain APPFLOWY_WEB_URL=${APPFLOWY_BASE_URL}
# If you are running AppFlowy Web locally for development purpose, use the following value instead APPFLOWY_WEB_URL=https://1️⃣:9999