I used Notion for a couple of years and genuinely liked it. Then I started putting more important information in there — project notes, client details, personal planning — and started thinking about what it would mean if Notion changed its pricing, got acquired, or simply shut down.
AppFlowy is the open-source alternative: documents, databases, kanban boards, calendars, and AI features, running on your own server. The desktop clients are polished, the mobile apps work, and your data never leaves your infrastructure.
The version I'm running uses Docker Compose, which keeps everything contained and makes updates clean. Takes about 30 minutes to get from zero to a working collaborative workspace.
I run AppFlowy on Tencent Cloud Lighthouse. The 2 vCPU / 4 GB RAM plan handles AppFlowy for small teams comfortably. The primary reason to self-host a workspace tool like AppFlowy on your own server is data control — documents, databases, and knowledge bases stay on your infrastructure. Lighthouse's snapshot feature lets you back up the entire workspace state, including all content and attachments, with one click. If your team grows, spec upgrades are available from the control panel without re-deploying.
- Key Takeaways
| Feature | What it does |
|---|---|
| Documents | Rich-text pages with blocks |
| Databases | Spreadsheet/grid view with filtering and sorting |
| Kanban boards | Visual task management |
| Calendar | Date-based task/event views |
| AI assistant | Built-in AI for writing and summarization |
| Spaces | Organize workspaces by project or team |
| Offline mode | Desktop app works without internet |
| Self-hosted sync | Sync across devices through your own server |
| Requirement | Notes |
|---|---|
| Cloud server | Tencent Cloud Lighthouse Ubuntu 22.04 |
| 4 GB+ RAM | AppFlowy Cloud runs multiple services |
| A domain name | Required for client connections |
| Docker and Compose | We'll install these |
ssh ubuntu@YOUR_SERVER_IP
sudo apt update && sudo apt upgrade -y
# Install Docker
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
newgrp docker
sudo apt install -y nginx git
sudo ufw allow ssh
sudo ufw allow 'Nginx Full'
sudo ufw enable
AppFlowy Cloud is the server-side component that enables collaboration and sync.
mkdir -p ~/apps/appflowy && cd ~/apps/appflowy
# Clone the official AppFlowy Cloud repository
git clone --depth 1 https://github.com/AppFlowy-IO/AppFlowy-Cloud.git .
Copy and configure the environment file:
cp deploy.env .env
nano .env
Key settings to update:
# Your server's domain
APPFLOWY_BASE_URL=https://cloud.yourdomain.com
APPFLOWY_WS_URL=wss://cloud.yourdomain.com/ws/v1
# Admin credentials (change before first launch)
GOTRUE_ADMIN_EMAIL=admin@yourdomain.com
GOTRUE_ADMIN_PASSWORD=choose_a_strong_password
# SMTP for email verification (optional but recommended)
GOTRUE_SMTP_HOST=smtp.mailgun.org
GOTRUE_SMTP_PORT=587
GOTRUE_SMTP_USER=postmaster@mg.yourdomain.com
GOTRUE_SMTP_PASS=your_smtp_password
GOTRUE_SMTP_ADMIN_EMAIL=noreply@yourdomain.com
GOTRUE_MAILER_AUTOCONFIRM=false # Set to "true" to skip email verification
# Database passwords (generate strong random strings)
POSTGRES_PASSWORD=generate_strong_password
REDIS_PASSWORD=generate_strong_password
APPFLOWY_DATABASE_URL=postgres://appflowy:${POSTGRES_PASSWORD}@postgres:5432/appflowy_cloud
# Allow all signups or restrict
GOTRUE_DISABLE_SIGNUP=false # Set to "true" to prevent new registrations
Start all services:
docker compose up -d
# Monitor startup (takes 2-3 minutes)
docker compose logs -f
# Verify all services are healthy
docker compose ps
AppFlowy Cloud runs several services: the AppFlowy API server, Gotrue (authentication), PostgreSQL, Redis, and MinIO (object storage for file uploads).
sudo nano /etc/nginx/sites-available/appflowy
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
server_name cloud.yourdomain.com;
client_max_body_size 100m;
# AppFlowy Cloud API
location / {
proxy_pass http://127.0.0.1:8000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
}
# WebSocket support for real-time collaboration
location /ws {
proxy_pass http://127.0.0.1:8000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $host;
proxy_read_timeout 3600s;
}
# GoTrue authentication service
location /gotrue/ {
proxy_pass http://127.0.0.1:9999/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
sudo ln -s /etc/nginx/sites-available/appflowy /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d cloud.yourdomain.com
After HTTPS is configured, ensure the .env file uses https:// and wss://:
APPFLOWY_BASE_URL=https://cloud.yourdomain.com
APPFLOWY_WS_URL=wss://cloud.yourdomain.com/ws/v1
If you changed these after initial startup:
docker compose down
docker compose up -d
Download from appflowy.io/download.
https://cloud.yourdomain.comDownload the AppFlowy mobile app and follow the same steps to point it to your self-hosted server.
Visit https://cloud.yourdomain.com/web/sign-up and register with the email you set as GOTRUE_ADMIN_EMAIL.
AppFlowy Cloud exposes an admin API. To list users:
# Get admin token
TOKEN=$(curl -s -X POST https://cloud.yourdomain.com/gotrue/token?grant_type=password \
-H "Content-Type: application/json" \
-d '{"email":"admin@yourdomain.com","password":"your_password"}' | \
python3 -c "import sys,json; print(json.load(sys.stdin)['access_token'])")
# List users
curl -s https://cloud.yourdomain.com/api/v1/admin/user \
-H "Authorization: Bearer $TOKEN"
AppFlowy supports OpenAI and other AI providers. In .env:
APPFLOWY_AI_ENABLED=true
APPFLOWY_AI_OPENAI_API_KEY=your_openai_key
nano ~/backup_appflowy.sh
#!/bin/bash
BACKUP_DIR=~/backups/appflowy
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR
source ~/apps/appflowy/.env
# Backup PostgreSQL database
docker exec appflowy-postgres-1 pg_dump \
-U appflowy appflowy_cloud | \
gzip > $BACKUP_DIR/appflowy_db_$DATE.sql.gz
# Backup MinIO data (file uploads)
docker run --rm \
-v appflowy_minio_data:/data \
-v $BACKUP_DIR:/backup \
alpine tar czf /backup/appflowy_minio_$DATE.tar.gz -C /data .
# Keep 7 days
find $BACKUP_DIR -mtime +7 -delete
echo "AppFlowy backup complete: $DATE"
chmod +x ~/backup_appflowy.sh
(crontab -l; echo "0 3 * * * ~/backup_appflowy.sh") | crontab -
AppFlowy is under active development. The desktop/mobile client version and the server version must be compatible — mismatches cause sync failures or connection errors.
When you update AppFlowy Cloud:
cd ~/apps/appflowy
git pull origin main
docker compose pull
docker compose up -d
Also update your desktop client to the matching version. The AppFlowy GitHub releases page shows which client versions are compatible with each server version.
If users report "unable to connect to server" after an update, check that:
https://)/var/log/nginx/appflowy_error.log| Issue | Likely Cause | Fix |
|---|---|---|
| Connection refused | Service not running or wrong port | Check systemctl status SERVICE and verify firewall rules |
| Permission denied | Wrong file ownership or permissions | Check file ownership with ls -la and use chown/chmod to fix |
| 502 Bad Gateway | Backend service not running | Restart the backend service; check logs with journalctl -u SERVICE |
| SSL certificate error | Certificate expired or domain mismatch | Run sudo certbot renew and verify domain DNS points to server IP |
| Service not starting | Config error or missing dependency | Check logs with journalctl -u SERVICE -n 50 for specific error |
| Out of disk space | Logs or data accumulation | Run df -h to identify usage; clean logs or attach CBS storage |
| High memory usage | Too many processes or memory leak | Check with htop; consider upgrading instance plan if consistently high |
| Firewall blocking traffic | Port not open in UFW or Lighthouse console | Open port in Lighthouse console firewall AND sudo ufw allow PORT |
What data does self-hosted AppFlowy protect compared to cloud services?
Your content — notes, documents, calendar events, tasks — is stored on your server and never sent to a third party's infrastructure. This matters for sensitive personal or professional information.
Can I collaborate with others on a self-hosted AppFlowy instance?
Most productivity tools support multiple users. The number of users depends on the tool and your server resources. Check the guide's prerequisites for per-user resource estimates.
How do I access self-hosted AppFlowy from mobile devices?
Install the official mobile app and configure it to connect to your server URL instead of the default cloud service. The setup is typically done in the app's server settings.
What happens to my data if the server goes down?
Data on the server is preserved. You won't have access until the server is restored, but data isn't lost. Lighthouse snapshots provide backup and quick recovery.
docker compose pull) are typically straightforward. The guide includes update instructions specific to the application.Build your team workspace today:
👉 Tencent Cloud Lighthouse — VPS for self-hosted collaboration tools
👉 View current pricing and promotions
👉 Explore all active deals and offers