Technology Encyclopedia Home >How to Self-Host AppFlowy — Your Own Notion Alternative on a VPS

How to Self-Host AppFlowy — Your Own Notion Alternative on a VPS

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.


Table of Contents

  1. What AppFlowy Provides
  2. Prerequisites
  3. Part 1 — Server Setup
  4. Part 2 — Deploy AppFlowy Cloud with Docker Compose
  5. Part 3 — Configure Nginx
  6. Part 4 — Enable HTTPS
  7. Part 5 — Configure Desktop and Mobile Clients
  8. Part 6 — Admin Configuration
  9. Part 7 — Backups
  10. The Gotcha: AppFlowy Client Version Compatibility

  • Key Takeaways
  • Use the appropriate Lighthouse application image to skip manual installation steps where available
  • Lighthouse snapshots provide one-click full-server backup before major changes
  • OrcaTerm browser terminal lets you manage the server from any device
  • CBS cloud disk expansion handles growing storage needs without server migration
  • Console-level firewall + UFW = two independent protection layers

What AppFlowy Provides {#what}

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

Prerequisites {#prerequisites}

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

Part 1 — Server Setup {#part-1}

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

Part 2 — Deploy AppFlowy Cloud with Docker Compose {#part-2}

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).


Part 3 — Configure Nginx {#part-3}

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

Part 4 — Enable HTTPS {#part-4}

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

Part 5 — Configure Desktop and Mobile Clients {#part-5}

AppFlowy Desktop (Windows, macOS, Linux)

Download from appflowy.io/download.

  1. Open AppFlowy
  2. Click Sign in to AppFlowy Cloud
  3. Click Self-hosted cloud
  4. Enter your server URL: https://cloud.yourdomain.com
  5. Sign in with your account credentials

Mobile (iOS, Android)

Download the AppFlowy mobile app and follow the same steps to point it to your self-hosted server.


Part 6 — Admin Configuration {#part-6}

Create the initial admin account

Visit https://cloud.yourdomain.com/web/sign-up and register with the email you set as GOTRUE_ADMIN_EMAIL.

Manage users via the API

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"

Configure AI (optional)

AppFlowy supports OpenAI and other AI providers. In .env:

APPFLOWY_AI_ENABLED=true
APPFLOWY_AI_OPENAI_API_KEY=your_openai_key

Part 7 — Backups {#part-7}

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 -

The Gotcha: AppFlowy Client Version Compatibility {#gotcha}

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:

  1. The client version matches the server version
  2. The server URL is correct (including https://)
  3. No Nginx proxy errors in /var/log/nginx/appflowy_error.log

Troubleshooting {#troubleshooting}

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

Frequently Asked Questions {#faq}

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.

How do I keep the application updated?
Update procedures vary by application. Container-based apps (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