# Status: Far too complicated to set up right now. There's a lot of built-in # assumptions about the database and a lot of services to connect to. I think # they tried to open-source their production code, but it's not particularly # generic right now. # # See https://github.com/AppFlowy-IO/AppFlowy-Cloud/blob/main/doc/DEPLOYMENT.md { config, pkgs, ... }: let inherit (import ./lib.nix config) mkContainer; inherit (import ./secrets.nix) appflowy; in { virtualisation.oci-containers.containers = { appflowy = mkContainer { image = "appflowyinc/appflowy_cloud:latest"; hostName = "appflowy"; dependsOn = [ "appflowy-gotrue" "appflowy-db" ]; port = 80; volumes = []; environment = { RUST_LOG = "info"; APPFLOWY_ENVIRONMENT = "production"; APPFLOWY_DATABASE_URL = "postgres://${appflowy.db.username}:${appflowy.db.password}@appflowy-db:5432/${appflowy.db.database}"; APPFLOWY_REDIS_URI = redis://valkey:6379; APPFLOWY_GOTRUE_JWT_SECRET=appflowy.gotrue.jwt.secret; APPFLOWY_GOTRUE_JWT_EXP = toString appflowy.gotrue.jwt.expiration; APPFLOWY_GOTRUE_BASE_URL= "http://appflowy-gotrue:9999"; APPFLOWY_GOTRUE_EXT_URL = "http://appflowy-gotrue.havenisms.com"; APPFLOWY_GOTRUE_ADMIN_EMAIL = appflowy.gotrue.admin.email; APPFLOWY_GOTRUE_ADMIN_PASSWORD = appflowy.gotrue.admin.password; APPFLOWY_S3_USE_MINIO = "true"; APPFLOWY_S3_MINIO_URL= "https://minio.${config.domainName}"; APPFLOWY_S3_ACCESS_KEY = appflowy.s3.accessKey; APPFLOWY_S3_SECRET_KEY = appflowy.s3.secretKey; APPFLOWY_S3_BUCKET = appflowy.s3.bucket; APPFLOWY_S3_REGION="us-east-1"; # 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} # APPFLOWY_OPENAI_API_KEY=${APPFLOWY_OPENAI_API_KEY} }; homepageOpts = { group = "Apps "; name = "Appflowy"; icon = "appflowy.svg"; description = "Knowledge Base"; }; }; appflowy-db = { image = "docker.io/postgres:16-alpine"; autoStart = true; volumes = [ # TODO: move to faster storage? "/tank/appflowy/db:/var/lib/postgresql/data" "/tank/appflowy/migrations/before:/docker-entrypoint-initdb.d" ]; environment = { POSTGRES_USER = appflowy.db.username; POSTGRES_PASSWORD = appflowy.db.password; POSTGRES_DB = appflowy.db.database; }; extraOptions = []; }; appflowy-gotrue = { image = "appflowyinc/gotrue:latest"; autoStart = true; dependsOn = []; extraOptions = []; volumes = []; environment = { GOTRUE_SITE_URL = "https://appflowy.havenisms.com"; GOTRUE_JWT_SECRET = appflowy.gotrue.jwt.secret; GOTRUE_JWT_EXP = toString appflowy.gotrue.jwt.expiration; GOTRUE_DB_DRIVER = "postgres"; API_EXTERNAL_URL = "http://appflowy-gotrue.havenisms.com"; DATABASE_URL = "postgres://supabase_auth_admin:root@appflowy-db:5432/${appflowy.db.database}"; PORT = "9999"; }; }; }; }