Skip to Content

Deploy AFFiNE

There can be more than Notion and Miro. AFFiNE(pronounced [ə‘fain]) is a next-gen knowledge base that brings planning, sorting and creating all together. Privacy first, open-source, customizable and ready to use.

⭐ 62.7k stars📜 Other🔴 Advanced⏱ ~20 minutes

What You’ll Get

A fully working AFFiNE 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)
  • A domain name pointed to your server (optional but recommended)
  • Basic terminal access (SSH)

The Config

Create a directory for AFFiNE and add this docker-compose.yml:

# ------------------------------------------------------------------------- # 🚀 Created and distributed by The AltStack # 🌍 https://thealtstack.com # ------------------------------------------------------------------------- # Docker Compose for AFFiNE version: '3.8' services: affine: image: ghcr.io/toeverything/affine-graphql:latest # Using official as fallback but custom build setup exists in Dockerfile container_name: affine ports: - "3000:3000" environment: - DATABASE_URL=postgres://affine:affine@db:5432/affine - REDIS_URL=redis://redis:6379 - NODE_ENV=production depends_on: db: condition: service_healthy redis: condition: service_healthy networks: - affine_net healthcheck: test: [ "CMD", "curl", "-f", "http://localhost:3000/" ] interval: 30s timeout: 10s retries: 3 db: image: postgres:15-alpine container_name: affine-db environment: POSTGRES_USER: affine POSTGRES_PASSWORD: affine POSTGRES_DB: affine volumes: - affine_db_data:/var/lib/postgresql/data networks: - affine_net healthcheck: test: [ "CMD-SHELL", "pg_isready -U affine" ] interval: 5s timeout: 5s retries: 5 redis: image: redis:7-alpine container_name: affine-redis networks: - affine_net healthcheck: test: [ "CMD", "redis-cli", "ping" ] interval: 5s timeout: 5s retries: 5 networks: affine_net: driver: bridge volumes: affine_db_data: name: affine_db_data

Let’s Ship It

# Create a directory mkdir -p /opt/affine && cd /opt/affine # 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

VariableDefaultRequired
DATABASE_URLpostgres://affine:affine@db:5432/affineNo
REDIS_URLredis://redis:6379No
NODE_ENVproductionNo

Post-Deployment Checklist

  • Service is accessible on the configured port
  • Admin account created (if applicable)
  • Reverse proxy configured (Caddy guide)
  • SSL/HTTPS working
  • Backup script set up (backup guide)
  • Uptime monitor added (Uptime Kuma)

The “I Broke It” Section

Container won’t start?

docker compose logs affine | tail -50

Port already in use?

# Find what's using the port lsof -i :PORT_NUMBER

Need to start fresh?

docker compose down -v # ⚠️ This deletes volumes/data! docker compose up -d

Going Further