AFFiNE开源知识管理和协作平台的部署,替代Notion不是梦~
AFFiNE 是一款现代化的开源知识管理和协作平台,集成了笔记、白板、数据库等多种功能。它采用块编辑器设计,支持实时协作,提供离线优先的使用体验,是Notion、Obsidian等工具的优秀开源替代方案。
主要特点
多功能集成:笔记、白板、数据库、任务管理一体化
块编辑器:现代化的块级编辑体验,支持富文本、图片、表格等
实时协作:多人同时编辑,实时同步更新
离线优先:本地优先存储,支持离线使用
跨平台:Web、桌面端(Windows、macOS、Linux)全覆盖
自托管:数据完全掌控,隐私安全有保障
这里默认服务器已经安装好了docker,如果没有安装可以自行百度安装教程,或者直接宝塔面板安装docker。
部署 AFFiNE
1.创建并进入项目目录
mkdir -p ~/affine
cd ~/affine
2.创建 compose 文件
cat > docker-compose.yml << 'EOF'
# Docker Compose 项目名称
name: affineservices:# AFFiNE 主服务affine:# 使用官方镜像,版本通过环境变量控制,默认为 stableimage: 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}# 数据库名称,默认为 affinePOSTGRES_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 文件
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
4.启动 AFFiNE 服务
docker compose up -d
这里装装要挺久的,可以多等等。
5. 验证部署
docker ps | grep affine
,如果看到所有容器状态为 Up,说明服务已成功启动。
基本配置
1. 访问 AFFiNE
在浏览器中访问:
http://你的服务器IP:3010
首次访问会进入初始化向导,按提示创建管理员账户。
2. 域名与HTTPS配置
为了更好的使用体验,建议配置域名和HTTPS。我是部署在nas里的,做了端口转发。
3. 管理界面访问
AFFiNE提供了管理界面用于系统配置:
http://你的服务器IP:3010/admin
至此教程结束,且行好事,莫问前程。大家加油~