Skip to content

AFFiNE 简介

AFFiNE封面

AFFiNE 是一款现代化的开源知识管理和协作平台,集成了笔记、白板、数据库等多种功能。它采用块编辑器设计,支持实时协作,提供离线优先的使用体验,是Notion、Obsidian等工具的优秀开源替代方案。

官方网站:https://affine.pro
GitHub仓库:https://github.com/toeverything/AFFiNE

主要特点

  • 多功能集成:笔记、白板、数据库、任务管理一体化
  • 块编辑器:现代化的块级编辑体验,支持富文本、图片、表格等
  • 实时协作:多人同时编辑,实时同步更新
  • 离线优先:本地优先存储,支持离线使用
  • 跨平台:Web、桌面端(Windows、macOS、Linux)全覆盖
  • 自托管:数据完全掌控,隐私安全有保障

准备工作

在开始部署之前,请确保您已经具备以下条件:

  1. 已安装 Docker 和 Docker Compose(参考本站 Linux Docker 安装教程
  2. 服务器建议配置:1核 CPU, 1GB 内存, 5GB 可用存储空间以上。
  3. 准备域名,用于HTTPS访问(可选)

使用 Docker Compose 部署 AFFiNE

1. 创建并进入项目目录

bash
mkdir -p ~/affine
cd ~/affine

2. 创建 docker-compose.yml 文件

bash
cat > docker-compose.yml << 'EOF'
# Docker Compose 项目名称
name: affine

services:
  # AFFiNE 主服务
  affine:
    # 使用官方镜像,版本通过环境变量控制,默认为 stable
    image: ghcr.io/toeverything/affine-graphql:${AFFINE_REVISION:-stable}
    # 容器名称,便于管理和识别
    container_name: affine_server
    # 端口映射:宿主机端口:容器端口
    ports:
      - '${PORT:-3010}:3010'  # 默认映射到3010端口
    # 服务依赖关系,确保依赖服务健康后再启动
    depends_on:
      redis:
        condition: service_healthy      # Redis 服务健康检查通过
      postgres:
        condition: service_healthy      # PostgreSQL 服务健康检查通过
      affine_migration:
        condition: service_completed_successfully  # 数据库迁移任务完成
    # 数据卷挂载,实现数据持久化
    volumes:
      # 用户上传文件存储目录(图片、附件等)
      - ${UPLOAD_LOCATION}:/root/.affine/storage
      # 应用配置文件存储目录
      - ${CONFIG_LOCATION}:/root/.affine/config
    # 引用外部环境变量文件
    env_file:
      - .env
    # 容器内环境变量设置
    environment:
      # Redis 服务器主机名(Docker 网络内部通信)
      - REDIS_SERVER_HOST=redis
      # PostgreSQL 数据库连接字符串
      - DATABASE_URL=postgresql://${DB_USERNAME}:${DB_PASSWORD}@postgres:5432/${DB_DATABASE:-affine}
      # 禁用索引器功能(自托管环境推荐设置)
      - AFFINE_INDEXER_ENABLED=false
    # 容器重启策略:除非手动停止,否则总是重启
    restart: unless-stopped

  # 数据库迁移服务(一次性任务)
  affine_migration:
    # 使用与主服务相同的镜像
    image: ghcr.io/toeverything/affine-graphql:${AFFINE_REVISION:-stable}
    # 迁移任务容器名称
    container_name: affine_migration_job
    # 挂载相同的数据卷以访问配置和存储
    volumes:
      # 用户上传文件存储目录
      - ${UPLOAD_LOCATION}:/root/.affine/storage
      # 应用配置文件存储目录
      - ${CONFIG_LOCATION}:/root/.affine/config
    # 执行数据库预部署脚本
    command: ['sh', '-c', 'node ./scripts/self-host-predeploy.js']
    # 引用外部环境变量文件
    env_file:
      - .env
    # 容器内环境变量设置
    environment:
      # Redis 服务器主机名
      - REDIS_SERVER_HOST=redis
      # PostgreSQL 数据库连接字符串
      - DATABASE_URL=postgresql://${DB_USERNAME}:${DB_PASSWORD}@postgres:5432/${DB_DATABASE:-affine}
      # 禁用索引器功能
      - AFFINE_INDEXER_ENABLED=false
    # 依赖关系:等待数据库服务就绪
    depends_on:
      postgres:
        condition: service_healthy      # PostgreSQL 健康检查通过
      redis:
        condition: service_healthy      # Redis 健康检查通过

  # Redis 缓存服务
  redis:
    # 使用官方 Redis 镜像
    image: redis
    # Redis 容器名称
    container_name: affine_redis
    # 健康检查配置
    healthcheck:
      # 检查命令:使用 redis-cli 执行简单操作
      test: ['CMD', 'redis-cli', '--raw', 'incr', 'ping']
      # 检查间隔:每10秒检查一次
      interval: 10s
      # 超时时间:5秒内必须响应
      timeout: 5s
      # 重试次数:失败5次后标记为不健康
      retries: 5
    # 容器重启策略
    restart: unless-stopped

  # PostgreSQL 数据库服务
  postgres:
    # 使用支持 pgvector 扩展的 PostgreSQL 16 镜像
    image: pgvector/pgvector:pg16
    # PostgreSQL 容器名称
    container_name: affine_postgres
    # 数据卷挂载:持久化数据库数据
    volumes:
      # 数据库数据目录挂载到宿主机
      - ${DB_DATA_LOCATION}:/var/lib/postgresql/data
    # 数据库环境变量配置
    environment:
      # 数据库用户名
      POSTGRES_USER: ${DB_USERNAME}
      # 数据库密码
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      # 数据库名称,默认为 affine
      POSTGRES_DB: ${DB_DATABASE:-affine}
      # 数据库初始化参数:启用数据校验
      POSTGRES_INITDB_ARGS: '--data-checksums'
      # 认证方式:信任本地连接(开发环境)
      # 生产环境建议设置强密码并移除此配置
      POSTGRES_HOST_AUTH_METHOD: trust
    # 健康检查配置
    healthcheck:
      # 检查命令:使用 pg_isready 检查数据库可用性
      test:
        ['CMD', 'pg_isready', '-U', "${DB_USERNAME}", '-d', "${DB_DATABASE:-affine}"]
      # 检查间隔:每10秒检查一次
      interval: 10s
      # 超时时间:5秒内必须响应
      timeout: 5s
      # 重试次数:失败5次后标记为不健康
      retries: 5
    # 容器重启策略
    restart: unless-stopped
EOF

3.创建 .env 文件

bash
cat > .env << 'EOF'
# 选择要部署的版本,可用值:stable(稳定版)、beta(测试版)、canary(开发版)
AFFINE_REVISION=stable

# 设置服务器容器暴露的端口
PORT=3010

# 设置服务器对外链接的主机地址
# 启用HTTPS协议(生产环境推荐)
# AFFINE_SERVER_HTTPS=true
# 设置服务器主机名(用于生成对外链接)
# AFFINE_SERVER_HOST=affine.yourdomain.com
# 或者使用完整的外部访问URL(包含协议和域名)
# AFFINE_SERVER_EXTERNAL_URL=https://affine.yourdomain.com

# 数据库数据持久化存储位置
DB_DATA_LOCATION=~/.affine/self-host/postgres/pgdata
# 上传数据(图片、文件等)持久化存储位置
UPLOAD_LOCATION=~/.affine/self-host/storage
# 配置文件持久化存储位置
CONFIG_LOCATION=~/.affine/self-host/config

# 数据库认证信息
DB_USERNAME=affine
DB_PASSWORD=
DB_DATABASE=affine
EOF

参数说明

DB_PASSWORD = 填写的数据库密码(自定义)

4. 启动 AFFiNE 服务

bash
docker compose up -d

5. 验证部署

bash
docker ps | grep affine

如果看到所有容器状态为 Up,说明服务已成功启动。

基本配置

1. 访问 AFFiNE

在浏览器中访问:

bash
http://你的服务器IP:3010

首次访问会进入初始化向导,按提示创建管理员账户。

2. 域名与HTTPS访问(推荐)

为了更好的使用体验,建议配置域名和HTTPS。可以使用本站的 Nginx Proxy Manager教程 来实现反向代理和SSL证书自动管理。

3. 管理界面访问

AFFiNE提供了管理界面用于系统配置:

bash
http://你的服务器IP:3010/admin

总结

通过本教程,您已成功使用 Docker 部署了 AFFiNE 知识管理平台。AFFiNE 提供了现代化、功能丰富的知识管理和协作环境,是个人和团队自托管的理想选择。


如果在使用过程中遇到任何问题,欢迎在评论区留言,我会尽快为您解答。