# Self-Hosted AppFlowy Cloud Setup Guide This guide will help you set up your own instance of AppFlowy Cloud. ## Prerequisites - Docker and Docker Compose - PostgreSQL 14 or higher - Redis - Minimum 2GB RAM - Git ## Quick Start 1. Clone the Appflowy-Cloud repository: ```bash git clone https://github.com/AppFlowy-IO/AppFlowy-Cloud.git cd AppFlowy-Cloud ``` 2. Configure environment variables: ```bash cp deploy.env .env ``` Edit the following variables in the `.env` file to reflect your setup: ```env # Fully qualified domain name for the deployment. FQDN= # Change this to https if you wish to enable TLS. SCHEME= # PostgreSQL Settings POSTGRES_PASSWORD= # Postgres credential for supabase_auth_admin SUPABASE_PASSWORD= # Minio Host AWS_SECRET= ## Base Url for the admin frontend. If you use the default Nginx conf provided here, this value should be /console. ## If you want to keep the previous behaviour where admin frontend is served at the root, don't set this env variable, ## or set it to empty string. ADMIN_FRONTEND_PATH_PREFIX= # authentication key, change this and keep the key safe and secret # self defined key, you can use any string GOTRUE_JWT_SECRET= # If you want to use AWS SES or your own mail server, set the following variables: GOTRUE_MAILER_AUTOCONFIRM=false GOTRUE_SMTP_HOST=email-smtp.us-east-1.amazonaws.com GOTRUE_SMTP_PORT=465 GOTRUE_SMTP_USER= GOTRUE_SMTP_PASS= GOTRUE_SMTP_ADMIN_EMAIL= # This user will be created when GoTrue starts successfully # You can use this user to login to the admin panel GOTRUE_ADMIN_EMAIL= GOTRUE_ADMIN_PASSWORD= # AppFlowy Cloud Mailer Configuration (same credentials as GOTRUE_SMTP_*) APPFLOWY_MAILER_SMTP_HOST=email-smtp.us-east-1.amazonaws.com APPFLOWY_MAILER_SMTP_PORT=465 APPFLOWY_MAILER_SMTP_USERNAME= APPFLOWY_MAILER_SMTP_EMAIL= APPFLOWY_MAILER_SMTP_PASSWORD= # PgAdmin # Optional module to manage the postgres database # You can access the pgadmin at http://your-host/pgadmin # Refer to the APPFLOWY_DATABASE_URL for password when connecting to the database PGADMIN_DEFAULT_EMAIL= PGADMIN_DEFAULT_PASSWORD= # Portainer (username: admin) PORTAINER_PASSWORD= # AppFlowy AI AI_OPENAI_API_KEY= ``` 3. Edit GoTrue Dockerfile (Not needed on latest version) Modify the base Dockerfile from the Appflowy-Cloud repo to the one in this repo that installs bash, so the healthcheck can run. 4. Edit nginx.conf (Not needed on latest version) Modify the base nginx.conf to the version in this repo to resolve a potential websocket DNS resolution issue. 5. Start the services: ```bash docker-compose up -d ``` 6. Confirm that your services are running: ```bash docker ps -a ``` 7. To enable SSL, you can use certbot: ```bash sudo apt update sudo apt install certbot sudo certbot certonly --standalone -d yourdomain.com ``` This will create SSL certificates in /etc/letsencrypt/live/yourdomain.com 8. Update your docker-compose.yml file to use these certificates by mounting the certificate and private key locations: ```yaml services: nginx: restart: always image: nginx ports: - ${NGINX_PORT:-80}:80 - ${NGINX_TLS_PORT:-443}:443 volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf - /etc/letsencrypt/live/yourdomain.com/fullchain.pem:/etc/nginx/ssl/certificate.crt:ro - /etc/letsencrypt/live/yourdomain.com/privkey.pem:/etc/nginx/ssl/private_key.key:ro ``` 9. Restart your services: ```bash docker-compose down docker-compose up -d ``` 10. Set up auto renewal for the certificates with cron job: ```bash crontab -e ``` Add this line to run the renewal every month on the 1st day at 2:00 AM: ```bash 0 2 1 * * /home/moeny/AppFlowy-Cloud/check-and-renew-certs.sh >> /var/log/cert-renewal.log 2>&1 ``` You will need to add [check-and-renew-certs.sh](check-and-renew-certs.sh) and [renew-certs.sh](renew-certs.sh) in the `AppFlowy-Cloud` directory. ## Additional considerations 1. If you are getting `redis-1 | WARNING Memory overcommit must be enabled!`, run: ```bash echo "vm.overcommit_memory = 1" | sudo tee -a /etc/sysctl.conf sudo sysctl -p ``` You can verify the current value of the setting by running: ```bash cat /proc/sys/vm/overcommit_memory ``` It should return 1 if the setting was applied successfully. 2. Also, note that the MinIO version in the docker-compose.yml may need to be updated to reflect the latest version. This is more relevant if you've been running Appflowy for a while and want to update your installation. Make sure to backup any MinIO data you may have before upgrading, although the upgrade should preserve existing data since it's using a named volume (minio_data). To backup MinIO, use Docker volumes: ```bash docker compose stop minio docker run --rm -v appflowy-cloud_minio_data:/data -v $(pwd):/backup alpine tar czf /backup/minio-backup.tar.gz /data ``` If you need to restore: ```bash docker compose stop minio docker run --rm -v appflowy-cloud_minio_data:/data -v $(pwd):/backup alpine sh -c "cd /data && tar xzf /backup/minio-backup.tar.gz --strip 1" docker compose start minio ```