diff --git a/deploy.env b/deploy.env index f40b8ba..45a3936 100644 --- a/deploy.env +++ b/deploy.env @@ -113,6 +113,7 @@ APPFLOWY_S3_BUCKET=appflowy APPFLOWY_MAILER_SMTP_HOST=smtp.gmail.com APPFLOWY_MAILER_SMTP_PORT=465 APPFLOWY_MAILER_SMTP_USERNAME=email_sender@some_company.com +APPFLOWY_MAILER_SMTP_EMAIL=email_sender@some_company.com APPFLOWY_MAILER_SMTP_PASSWORD=email_sender_password # Log level for the appflowy-cloud service @@ -145,13 +146,9 @@ APPFLOWY_AI_OPENAI_API_KEY= APPFLOWY_AI_SERVER_PORT=5001 APPFLOWY_AI_SERVER_HOST=ai APPFLOWY_AI_DATABASE_URL=postgresql+psycopg://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB} +APPFLOWY_AI_REDIS_URL=redis://${REDIS_HOST}:${REDIS_PORT} APPFLOWY_LOCAL_AI_TEST_ENABLED=false -# AppFlowy History -APPFLOWY_GRPC_HISTORY_ADDRS=http://localhost:50051 -APPFLOWY_HISTORY_REDIS_URL=redis://${REDIS_HOST}:${REDIS_PORT} -APPFLOWY_HISTORY_DATABASE_URL=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB} - # AppFlowy Indexer APPFLOWY_INDEXER_ENABLED=true APPFLOWY_INDEXER_DATABASE_URL=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB} diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..96bd7db --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,169 @@ +# Essential services for AppFlowy Cloud + +services: + nginx: + restart: always + image: nginx + ports: + - ${NGINX_PORT:-80}:80 # Disable this if you are using TLS + - ${NGINX_TLS_PORT:-443}:443 + volumes: + - ./nginx/nginx.conf:/etc/nginx/nginx.conf + - /etc/letsencrypt/live/appflowy.moeny.ai/fullchain.pem:/etc/nginx/ssl/certificate.crt:ro + - /etc/letsencrypt/live/appflowy.moeny.ai/privkey.pem:/etc/nginx/ssl/private_key.key:ro + + # You do not need this if you have configured to use your own s3 file storage + minio: + restart: always + image: minio/minio + environment: + - MINIO_BROWSER_REDIRECT_URL=${API_EXTERNAL_URL}/minio + - MINIO_ROOT_USER=${APPFLOWY_S3_ACCESS_KEY:-minioadmin} + - MINIO_ROOT_PASSWORD=${APPFLOWY_S3_SECRET_KEY:-minioadmin} + command: server /data --console-address ":9001" + volumes: + - minio_data:/data + + postgres: + restart: always + image: pgvector/pgvector:pg16 + environment: + - POSTGRES_USER=${POSTGRES_USER:-postgres} + - POSTGRES_DB=${POSTGRES_DB:-postgres} + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-password} + - POSTGRES_HOST=${POSTGRES_HOST:-postgres} + - SUPABASE_PASSWORD=${SUPABASE_PASSWORD:-root} + volumes: + - ./migrations/before:/docker-entrypoint-initdb.d + - postgres_data:/var/lib/postgresql/data + + redis: + restart: always + image: redis + + gotrue: + restart: always + build: + context: docker/gotrue + dockerfile: Dockerfile + image: appflowyinc/gotrue:${GOTRUE_VERSION:-latest} + environment: + # There are a lot of options to configure GoTrue. You can reference the example config: + # https://github.com/supabase/gotrue/blob/master/example.env + - GOTRUE_SITE_URL=appflowy-flutter:// # redirected to AppFlowy application + - URI_ALLOW_LIST=* # adjust restrict if necessary + - GOTRUE_JWT_SECRET=${GOTRUE_JWT_SECRET} # authentication secret + - GOTRUE_JWT_EXP=${GOTRUE_JWT_EXP} + - 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} + + appflowy_cloud: + restart: always + 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_JWT_EXP=${GOTRUE_JWT_EXP} + - APPFLOWY_GOTRUE_BASE_URL=${APPFLOWY_GOTRUE_BASE_URL} + - APPFLOWY_GOTRUE_EXT_URL=${API_EXTERNAL_URL} + - APPFLOWY_GOTRUE_ADMIN_EMAIL=${GOTRUE_ADMIN_EMAIL} + - APPFLOWY_GOTRUE_ADMIN_PASSWORD=${GOTRUE_ADMIN_PASSWORD} + - APPFLOWY_S3_CREATE_BUCKET=${APPFLOWY_S3_CREATE_BUCKET} + - 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_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_PASSWORD=${APPFLOWY_MAILER_SMTP_PASSWORD} + - APPFLOWY_ACCESS_CONTROL=${APPFLOWY_ACCESS_CONTROL} + - APPFLOWY_DATABASE_MAX_CONNECTIONS=${APPFLOWY_DATABASE_MAX_CONNECTIONS} + - APPFLOWY_AI_SERVER_HOST=${APPFLOWY_AI_SERVER_HOST} + - APPFLOWY_AI_SERVER_PORT=${APPFLOWY_AI_SERVER_PORT} + build: + context: . + dockerfile: Dockerfile + args: + FEATURES: "" + image: appflowyinc/appflowy_cloud:${APPFLOWY_CLOUD_VERSION:-latest} + + admin_frontend: + restart: always + build: + context: . + dockerfile: ./admin_frontend/Dockerfile + image: appflowyinc/admin_frontend:${APPFLOWY_ADMIN_FRONTEND_VERSION:-latest} + environment: + - RUST_LOG=${RUST_LOG:-info} + - ADMIN_FRONTEND_REDIS_URL=${ADMIN_FRONTEND_REDIS_URL:-redis://redis:6379} + - ADMIN_FRONTEND_GOTRUE_URL=${ADMIN_FRONTEND_GOTRUE_URL:-http://gotrue:9999} + - ADMIN_FRONTEND_APPFLOWY_CLOUD_URL=${ADMIN_FRONTEND_APPFLOWY_CLOUD_URL:-http://appflowy_cloud:8000} + + ai: + restart: always + image: appflowyinc/appflowy_ai:${APPFLOWY_AI_VERSION:-latest} + environment: + - OPENAI_API_KEY=${APPFLOWY_AI_OPENAI_API_KEY} + - APPFLOWY_AI_SERVER_PORT=${APPFLOWY_AI_SERVER_PORT} + - APPFLOWY_AI_DATABASE_URL=${APPFLOWY_AI_DATABASE_URL} + - APPFLOWY_AI_REDIS_URL=${APPFLOWY_AI_REDIS_URL} + + appflowy_worker: + restart: always + image: appflowyinc/appflowy_worker:${APPFLOWY_WORKER_VERSION:-latest} + build: + context: . + dockerfile: ./services/appflowy-worker/Dockerfile + environment: + - RUST_LOG=${RUST_LOG:-info} + - APPFLOWY_ENVIRONMENT=production + - APPFLOWY_WORKER_REDIS_URL=redis://redis:6379 + - APPFLOWY_WORKER_ENVIRONMENT=production + - APPFLOWY_WORKER_DATABASE_URL=${APPFLOWY_WORKER_DATABASE_URL} + - APPFLOWY_WORKER_IMPORT_TICK_INTERVAL=30 + - 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_MAILER_SMTP_PORT=${APPFLOWY_MAILER_SMTP_PORT} + - APPFLOWY_MAILER_SMTP_USERNAME=${APPFLOWY_MAILER_SMTP_USERNAME} + - APPFLOWY_MAILER_SMTP_PASSWORD=${APPFLOWY_MAILER_SMTP_PASSWORD} +volumes: + postgres_data: + minio_data: \ No newline at end of file