--- title: "Deploy AppFlowy Self-Hosted (Docker)" description: "Step-by-step guide to self-hosting AppFlowy with Docker Compose. " --- # Deploy AppFlowy Bring projects, wikis, and teams together with AI. AppFlowy is the AI collaborative workspace where you achieve more without losing control of your data. The leading open source Notion alternative.
⭐ 68.0k stars 📜 GNU Affero General Public License v3.0 🔴 Advanced ⏱ ~20 minutes
🚀 Deploy on DigitalOcean ($200 Free Credit)
## What You'll Get A fully working AppFlowy instance running on your server. Your data stays on your hardware — no third-party access, no usage limits, no surprise invoices. ## Prerequisites - A server with Docker and Docker Compose installed ([setup guide](/quick-start/choosing-a-server)) - A domain name pointed to your server (optional but recommended) - Basic terminal access (SSH) ## The Config Create a directory for AppFlowy and add this `docker-compose.yml`: ```yaml # ------------------------------------------------------------------------- # 🚀 Created and distributed by The AltStack # 🌍 https://thealtstack.com # ------------------------------------------------------------------------- # Docker Compose for AppFlowy Cloud version: '3.8' services: appflowy: build: context: . dockerfile: Dockerfile container_name: appflowy-cloud ports: - "8080:8080" environment: - DATABASE_URL=postgres://postgres:${POSTGRES_PASSWORD:-password}@db:5432/appflowy - REDIS_URL=redis://redis:6379 depends_on: db: condition: service_healthy redis: condition: service_healthy networks: - appflowy_net healthcheck: test: [ "CMD", "curl", "-f", "http://localhost:8080/health" ] interval: 10s timeout: 5s retries: 5 db: image: postgres:15-alpine container_name: appflowy-db environment: POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-password} POSTGRES_DB: appflowy volumes: - appflowy_db_data:/var/lib/postgresql/data networks: - appflowy_net healthcheck: test: [ "CMD-SHELL", "pg_isready -U postgres" ] interval: 5s timeout: 5s retries: 5 redis: image: redis:7-alpine container_name: appflowy-redis networks: - appflowy_net healthcheck: test: [ "CMD", "redis-cli", "ping" ] interval: 5s timeout: 5s retries: 5 networks: appflowy_net: driver: bridge volumes: appflowy_db_data: name: appflowy_db_data ``` ## Let's Ship It ```bash # Create a directory mkdir -p /opt/appflowy && cd /opt/appflowy # Create the docker-compose.yml (paste the config above) nano docker-compose.yml # Pull images and start docker compose up -d # Watch the logs docker compose logs -f ``` ## Environment Variables | Variable | Default | Required | |---|---|---| | `DATABASE_URL` | `postgres://postgres:${POSTGRES_PASSWORD:-password}@db:5432/appflowy` | No | | `REDIS_URL` | `redis://redis:6379` | No | | `POSTGRES_PASSWORD` | `password` | No | ## Post-Deployment Checklist - [ ] Service is accessible on the configured port - [ ] Admin account created (if applicable) - [ ] Reverse proxy configured ([Caddy guide](/concepts/reverse-proxies)) - [ ] SSL/HTTPS working - [ ] Backup script set up ([backup guide](/concepts/backups)) - [ ] Uptime monitor added ([Uptime Kuma](/deploy/uptime-kuma)) ## The "I Broke It" Section **Container won't start?** ```bash docker compose logs appflowy | tail -50 ``` **Port already in use?** ```bash # Find what's using the port lsof -i :PORT_NUMBER ``` **Need to start fresh?** ```bash docker compose down -v # ⚠️ This deletes volumes/data! docker compose up -d ``` ## Going Further - [AppFlowy on AltStack Directory](https://thealtstack.com/alternative-to/appflowy) - [AppFlowy Self-Hosted Guide](https://thealtstack.com/self-hosted/appflowy) - [Official Documentation](https://www.appflowy.io) - [GitHub Repository](https://github.com/AppFlowy-IO/AppFlowy)