Self-host AppFlowy
A Notion-style workspace for docs, wikis, kanban boards and databases, with desktop and mobile clients built on Flutter and Rust. The clients are AGPL-3.0, but the self-hosted sync server (AppFlowy Cloud) is now a commercial, closed-source distribution with a free tier limited to one user seat and three guest editors; the open-source AppFlowy-Cloud repository is archived.
Key facts
Pick AppFlowy when you want a Notion-style workspace with fast native desktop and mobile clients and are happy to run a server for a single person. Read the licence before planning anything bigger: the self-hosted server is now AppFlowy's commercial distribution, free for one user seat, and the open-source server repository is archived. For a team on a fully open stack, AFFiNE or a wiki such as BookStack is the safer self-hosting bet.
What you need
- Any VPS with at least 2048 MB of RAM
- A domain you control — most self-hosted setups need HTTPS in front of them
- About the better part of a day
Paid link — we earn a commission if you shop through it.
Install
Run these commands on your server:
# AppFlowy Self-Hosted (commercial server, free tier) — official repo + .env template, image tags pinned to the 0.19.5 release set
# the server refuses to start on a non-loopback http:// URL, so this needs a domain pointing at the server, with ports 80 and 443 open
sudo apt-get install -y certbot
sudo certbot certonly --standalone -d appflowy.example.com -m you@example.com --agree-tos -n
git clone https://github.com/AppFlowy-IO/AppFlowy-SelfHost-Commercial.git && cd AppFlowy-SelfHost-Commercial
git checkout 136f92396b551f10c144994d96cba45d9adfbae8
# nginx serves the Let's Encrypt certificate in place of the bundled development one (renew with certbot and re-copy)
sudo cp /etc/letsencrypt/live/appflowy.example.com/fullchain.pem docker/nginx/ssl/certificate.crt
sudo cp /etc/letsencrypt/live/appflowy.example.com/privkey.pem docker/nginx/ssl/private_key.key
cp deploy.env .env
# replace the template's example credentials (admin login is admin@example.com) and set the public address
sed -i "s|^FQDN=.*|FQDN=appflowy.example.com|; s|^SCHEME=.*|SCHEME=https|; s|^WS_SCHEME=.*|WS_SCHEME=wss|; s|^POSTGRES_PASSWORD=.*|POSTGRES_PASSWORD=$(openssl rand -hex 16)|; s|^GOTRUE_ADMIN_PASSWORD=.*|GOTRUE_ADMIN_PASSWORD=$(openssl rand -hex 16)|; s|^GOTRUE_JWT_SECRET=.*|GOTRUE_JWT_SECRET=$(openssl rand -hex 32)|; s|^AWS_SECRET=.*|AWS_SECRET=$(openssl rand -hex 16)|" .env
# the compose file floats its images on :latest; pin them to the published release tags
printf 'APPFLOWY_CLOUD_VERSION=0.19.5\nAPPFLOWY_WORKER_VERSION=0.19.5\nAPPFLOWY_SEARCH_VERSION=0.19.5\nAPPFLOWY_ADMIN_FRONTEND_VERSION=0.19.0\nAPPFLOWY_WEB_VERSION=0.19.10\nAPPFLOWY_AI_VERSION=0.17.7\nGOTRUE_VERSION=0.18.11\n' >> .env
grep ^GOTRUE_ADMIN_PASSWORD .env
docker compose up -d # → https://appflowy.example.com (sign in as admin@example.com with the password printed above; admin console at /console)
# nginx publishes 80 and 443 on all interfaces; Postgres, Redis and MinIO are not publishedWhat you take on
AppFlowy's open-source story has changed, and that changes what "self-hosted" means here: