#!/bin/bash if [ -f "appflowy.env" ]; then set -a source appflowy.env set +a else echo "cannot find appflowy.env" exit 1 fi images=( "appflowyinc/appflowy_web:latest" "appflowyinc/appflowy_worker:latest" "appflowyinc/appflowy_ai:latest" "appflowyinc/admin_frontend:latest" "appflowyinc/appflowy_cloud:latest" "appflowyinc/gotrue:latest" "redis" # 等价于 redis:latest "pgvector/pgvector:pg16" "minio/minio:latest" ) CONTAINERS=( frpc minio postgres redis appflowy_gotrue appflowy_cloud appflowy_admin_frontend appflowy_ai appflowy_worker appflowy_web ) # for image in "${images[@]}"; do # echo -e "\n\033[34m pulling image: ${image}\033[0m" # if docker pull "${image}"; then # echo -e "\033[32m pull successed: ${image}\033[0m" # else # echo -e "\033[31m pull failed: ${image}\033[0m" >&2 # fi # done # echo -e "\n\033[36m all images pull finished \033[0m" function stop_containers() { for container in "${CONTAINERS[@]}"; do if docker ps -a --format '{{.Names}}' | grep -q "^${container}\$"; then echo "delete $container" docker rm --force "$container" 2>/dev/null && echo "$container delete successed" || echo "$container delete failed" else echo "$container not existed" fi done } function start_containers() { stop_containers docker run --restart=always --network host -d --name frpc \ -e TZ="Asia/Shanghai" \ -v /mnt/user/appdata/frpc/frpc.toml:/etc/frp/frpc.toml \ -v /mnt/user/appdata/frpc:/app \ registry.cn-shenzhen.aliyuncs.com/amass_toolset/frpc:0.61.2 docker run -d --name minio --restart=on-failure \ -p 9000:9000 \ -p 9001:9001 \ -e MINIO_BROWSER_REDIRECT_URL="${APPFLOWY_BASE_URL}/minio" \ -e MINIO_ROOT_USER="${APPFLOWY_S3_ACCESS_KEY}" \ -e MINIO_ROOT_PASSWORD="${APPFLOWY_S3_SECRET_KEY}" \ -v /mnt/user/appdata/minio:/data \ minio/minio:latest server /data --console-address ":9001" docker run -d --name postgres --restart=on-failure \ -p 5432:5432 \ -e POSTGRES_USER=${POSTGRES_USER} \ -e POSTGRES_DB=${POSTGRES_DB} \ -e POSTGRES_PASSWORD=${POSTGRES_PASSWORD} \ -e POSTGRES_HOST=${POSTGRES_HOST} \ -e SUPABASE_PASSWORD=${SUPABASE_PASSWORD} \ -v /mnt/user/appdata/postgres/migrations/before:/docker-entrypoint-initdb.d \ -v /mnt/user/appdata/postgres/data:/var/lib/postgresql/data \ pgvector/pgvector:pg16 docker run -d --name redis --restart=on-failure -p 6379:6379 redis docker run -d --name appflowy_gotrue --restart=on-failure \ -p 9999:9999 \ -e GOTRUE_ADMIN_EMAIL=${GOTRUE_ADMIN_EMAIL} \ -e GOTRUE_ADMIN_PASSWORD=${GOTRUE_ADMIN_PASSWORD} \ -e GOTRUE_DISABLE_SIGNUP=${GOTRUE_DISABLE_SIGNUP} \ -e GOTRUE_SITE_URL='appflowy-flutter://' \ -e GOTRUE_URI_ALLOW_LIST='**' \ -e GOTRUE_JWT_SECRET=${GOTRUE_JWT_SECRET} \ -e GOTRUE_JWT_EXP=${GOTRUE_JWT_EXP} \ -e GOTRUE_JWT_ADMIN_GROUP_NAME=supabase_admin \ -e GOTRUE_DB_DRIVER=postgres \ -e API_EXTERNAL_URL=${API_EXTERNAL_URL} \ -e DATABASE_URL=${GOTRUE_DATABASE_URL} \ -e PORT=9999 \ -e GOTRUE_SMTP_HOST=${GOTRUE_SMTP_HOST} \ -e GOTRUE_SMTP_PORT=${GOTRUE_SMTP_PORT} \ -e GOTRUE_SMTP_USER=${GOTRUE_SMTP_USER} \ -e GOTRUE_SMTP_PASS=${GOTRUE_SMTP_PASS} \ -e GOTRUE_MAILER_URLPATHS_CONFIRMATION='/gotrue/verify' \ -e GOTRUE_MAILER_URLPATHS_INVITE='/gotrue/verify' \ -e GOTRUE_MAILER_URLPATHS_RECOVERY='/gotrue/verify' \ -e GOTRUE_MAILER_URLPATHS_EMAIL_CHANGE='/gotrue/verify' \ -e GOTRUE_SMTP_ADMIN_EMAIL=${GOTRUE_SMTP_ADMIN_EMAIL} \ -e GOTRUE_SMTP_MAX_FREQUENCY=${GOTRUE_SMTP_MAX_FREQUENCY:-1ns} \ -e GOTRUE_RATE_LIMIT_EMAIL_SENT=${GOTRUE_RATE_LIMIT_EMAIL_SENT:-100} \ -e GOTRUE_MAILER_AUTOCONFIRM=${GOTRUE_MAILER_AUTOCONFIRM:-false} \ -e GOTRUE_EXTERNAL_GOOGLE_ENABLED=${GOTRUE_EXTERNAL_GOOGLE_ENABLED} \ -e GOTRUE_EXTERNAL_GOOGLE_CLIENT_ID=${GOTRUE_EXTERNAL_GOOGLE_CLIENT_ID} \ -e GOTRUE_EXTERNAL_GOOGLE_SECRET=${GOTRUE_EXTERNAL_GOOGLE_SECRET} \ -e GOTRUE_EXTERNAL_GOOGLE_REDIRECT_URI=${GOTRUE_EXTERNAL_GOOGLE_REDIRECT_URI} \ -e GOTRUE_EXTERNAL_GITHUB_ENABLED=${GOTRUE_EXTERNAL_GITHUB_ENABLED} \ -e GOTRUE_EXTERNAL_GITHUB_CLIENT_ID=${GOTRUE_EXTERNAL_GITHUB_CLIENT_ID} \ -e GOTRUE_EXTERNAL_GITHUB_SECRET=${GOTRUE_EXTERNAL_GITHUB_SECRET} \ -e GOTRUE_EXTERNAL_GITHUB_REDIRECT_URI=${GOTRUE_EXTERNAL_GITHUB_REDIRECT_URI} \ -e GOTRUE_EXTERNAL_DISCORD_ENABLED=${GOTRUE_EXTERNAL_DISCORD_ENABLED} \ -e GOTRUE_EXTERNAL_DISCORD_CLIENT_ID=${GOTRUE_EXTERNAL_DISCORD_CLIENT_ID} \ -e GOTRUE_EXTERNAL_DISCORD_SECRET=${GOTRUE_EXTERNAL_DISCORD_SECRET} \ -e GOTRUE_EXTERNAL_DISCORD_REDIRECT_URI=${GOTRUE_EXTERNAL_DISCORD_REDIRECT_URI} \ appflowyinc/gotrue:latest docker run -d --name appflowy_cloud --restart=on-failure \ -p 8000:8000 \ -e RUST_LOG=${RUST_LOG:-info} \ -e APPFLOWY_ENVIRONMENT=production \ -e APPFLOWY_DATABASE_URL=${APPFLOWY_DATABASE_URL} \ -e APPFLOWY_REDIS_URI=${APPFLOWY_REDIS_URI} \ -e APPFLOWY_GOTRUE_JWT_SECRET=${GOTRUE_JWT_SECRET} \ -e APPFLOWY_GOTRUE_JWT_EXP=${GOTRUE_JWT_EXP} \ -e APPFLOWY_GOTRUE_BASE_URL=${APPFLOWY_GOTRUE_BASE_URL} \ -e APPFLOWY_GOTRUE_EXT_URL=${API_EXTERNAL_URL} \ -e APPFLOWY_GOTRUE_ADMIN_EMAIL=${GOTRUE_ADMIN_EMAIL} \ -e APPFLOWY_GOTRUE_ADMIN_PASSWORD=${GOTRUE_ADMIN_PASSWORD} \ -e APPFLOWY_S3_CREATE_BUCKET=${APPFLOWY_S3_CREATE_BUCKET} \ -e APPFLOWY_S3_USE_MINIO=${APPFLOWY_S3_USE_MINIO} \ -e APPFLOWY_S3_MINIO_URL=${APPFLOWY_S3_MINIO_URL} \ -e APPFLOWY_S3_ACCESS_KEY=${APPFLOWY_S3_ACCESS_KEY} \ -e APPFLOWY_S3_SECRET_KEY=${APPFLOWY_S3_SECRET_KEY} \ -e APPFLOWY_S3_BUCKET=${APPFLOWY_S3_BUCKET} \ -e APPFLOWY_S3_REGION=${APPFLOWY_S3_REGION} \ -e APPFLOWY_S3_PRESIGNED_URL_ENDPOINT=${APPFLOWY_S3_PRESIGNED_URL_ENDPOINT} \ -e APPFLOWY_MAILER_SMTP_HOST=${APPFLOWY_MAILER_SMTP_HOST} \ -e APPFLOWY_MAILER_SMTP_PORT=${APPFLOWY_MAILER_SMTP_PORT} \ -e APPFLOWY_MAILER_SMTP_USERNAME=${APPFLOWY_MAILER_SMTP_USERNAME} \ -e APPFLOWY_MAILER_SMTP_EMAIL=${APPFLOWY_MAILER_SMTP_EMAIL} \ -e APPFLOWY_MAILER_SMTP_PASSWORD=${APPFLOWY_MAILER_SMTP_PASSWORD} \ -e APPFLOWY_MAILER_SMTP_TLS_KIND=${APPFLOWY_MAILER_SMTP_TLS_KIND} \ -e APPFLOWY_ACCESS_CONTROL=${APPFLOWY_ACCESS_CONTROL} \ -e APPFLOWY_DATABASE_MAX_CONNECTIONS=${APPFLOWY_DATABASE_MAX_CONNECTIONS} \ -e AI_SERVER_HOST=${AI_SERVER_HOST} \ -e AI_SERVER_PORT=${AI_SERVER_PORT} \ -e AI_OPENAI_API_KEY=${AI_OPENAI_API_KEY} \ -e APPFLOWY_ADMIN_FRONTEND_PATH_PREFIX=${ADMIN_FRONTEND_PATH_PREFIX} \ -e APPFLOWY_WEB_URL=${APPFLOWY_WEB_URL} \ appflowyinc/appflowy_cloud:latest docker run -d --name appflowy_admin_frontend \ --restart on-failure \ -p 3001:3000 \ -e RUST_LOG=${RUST_LOG:-info} \ -e ADMIN_FRONTEND_REDIS_URL=${ADMIN_FRONTEND_REDIS_URL} \ -e ADMIN_FRONTEND_GOTRUE_URL=${ADMIN_FRONTEND_GOTRUE_URL} \ -e ADMIN_FRONTEND_APPFLOWY_CLOUD_URL=${ADMIN_FRONTEND_APPFLOWY_CLOUD_URL} \ -e ADMIN_FRONTEND_PATH_PREFIX=${ADMIN_FRONTEND_PATH_PREFIX:-} \ appflowyinc/admin_frontend:latest docker run -d --name appflowy_ai \ --restart on-failure \ -p 5001:5001 \ -e OPENAI_API_KEY=${AI_OPENAI_API_KEY} \ -e APPFLOWY_AI_SERVER_PORT=${AI_SERVER_PORT} \ -e APPFLOWY_AI_DATABASE_URL=${AI_DATABASE_URL} \ -e APPFLOWY_AI_REDIS_URL=${AI_REDIS_URL} \ appflowyinc/appflowy_ai:latest docker run -d --name appflowy_worker \ --restart on-failure \ -e RUST_LOG=${RUST_LOG:-info} \ -e APPFLOWY_ENVIRONMENT=production \ -e APPFLOWY_WORKER_REDIS_URL=${APPFLOWY_WORKER_REDIS_URL} \ -e APPFLOWY_WORKER_ENVIRONMENT=production \ -e APPFLOWY_WORKER_DATABASE_URL=${APPFLOWY_WORKER_DATABASE_URL} \ -e APPFLOWY_WORKER_DATABASE_NAME=${APPFLOWY_WORKER_DATABASE_NAME} \ -e APPFLOWY_WORKER_IMPORT_TICK_INTERVAL=30 \ -e APPFLOWY_S3_USE_MINIO=${APPFLOWY_S3_USE_MINIO} \ -e APPFLOWY_S3_MINIO_URL=${APPFLOWY_S3_MINIO_URL} \ -e APPFLOWY_S3_ACCESS_KEY=${APPFLOWY_S3_ACCESS_KEY} \ -e APPFLOWY_S3_SECRET_KEY=${APPFLOWY_S3_SECRET_KEY} \ -e APPFLOWY_S3_BUCKET=${APPFLOWY_S3_BUCKET} \ -e APPFLOWY_S3_REGION=${APPFLOWY_S3_REGION} \ -e APPFLOWY_MAILER_SMTP_HOST=${APPFLOWY_MAILER_SMTP_HOST} \ -e APPFLOWY_MAILER_SMTP_PORT=${APPFLOWY_MAILER_SMTP_PORT} \ -e APPFLOWY_MAILER_SMTP_USERNAME=${APPFLOWY_MAILER_SMTP_USERNAME} \ -e APPFLOWY_MAILER_SMTP_EMAIL=${APPFLOWY_MAILER_SMTP_EMAIL} \ -e APPFLOWY_MAILER_SMTP_PASSWORD=${APPFLOWY_MAILER_SMTP_PASSWORD} \ -e APPFLOWY_MAILER_SMTP_TLS_KIND=${APPFLOWY_MAILER_SMTP_TLS_KIND} \ appflowyinc/appflowy_worker:latest docker run -d --name appflowy_web \ --restart on-failure \ -p 8090:80 \ -e AF_BASE_URL="${APPFLOWY_BASE_URL}" \ -e AF_GOTRUE_URL="${API_EXTERNAL_URL}" \ appflowyinc/appflowy_web:latest } function main() { local cmd=$1 shift 1 case $cmd in stop) stop_containers ;; *) start_containers ;; esac } main $@