AFFiNE Docker部署完整教程
前言:为什么选择Docker部署AFFiNE?
在知识管理和协作工具领域,AFFiNE正迅速成为Notion和Miro的强大替代品。作为一款开源的一体化工作区操作系统,它集成了维基、知识管理、演示和数字内容管理等功能。通过Docker部署AFFiNE,您可以获得:
- 环境一致性:消除"在我机器上能运行"的问题
- 快速部署:几分钟内完成从零到生产环境的搭建
- 易于维护:版本升级、备份恢复变得简单
- 资源隔离:数据库、缓存、应用服务独立运行
- 高可用性:支持水平扩展和负载均衡
本文将为您提供从零开始的AFFiNE Docker部署完整指南,包含单机部署、生产环境配置、性能优化等实用内容。
环境准备与系统要求
硬件要求
| 资源类型 | 最低配置 | 推荐配置 | 生产环境 |
|---|---|---|---|
| CPU | 2核 | 4核 | 8核+ |
| 内存 | 4GB | 8GB | 16GB+ |
| 存储 | 20GB | 50GB | 100GB+ |
| 网络 | 100Mbps | 1Gbps | 1Gbps+ |
软件要求
- Docker Engine: 20.10.0+
- Docker Compose: 2.0.0+
- 操作系统: Linux (Ubuntu 20.04+, CentOS 7+), macOS, Windows WSL2
端口要求
| 端口 | 服务 | 说明 |
|---|---|---|
| 3010 | AFFiNE Server | 主应用服务端口 |
| 5432 | PostgreSQL | 数据库服务端口 |
| 6379 | Redis | 缓存服务端口 |
快速开始:单机部署
步骤1:创建部署目录
mkdir affine-docker && cd affine-docker
步骤2:创建环境配置文件
创建 .env 文件:
# 数据库配置
DB_USERNAME=affineuser
DB_PASSWORD=your_secure_password_here
DB_DATABASE=affine_db
# 存储路径配置
UPLOAD_LOCATION=./storage
CONFIG_LOCATION=./config
DB_DATA_LOCATION=./postgres_data
# 应用版本
AFFINE_REVISION=stable
# 服务端口
PORT=3010
步骤3:创建Docker Compose文件
创建 docker-compose.yml:
version: '3.8'
services:
affine:
image: ghcr.io/toeverything/affine:${AFFINE_REVISION:-stable}
container_name: affine_server
ports:
- '${PORT:-3010}:3010'
depends_on:
redis:
condition: service_healthy
postgres:
condition: service_healthy
affine_migration:
condition: service_completed_successfully
volumes:
- ${UPLOAD_LOCATION}:/root/.affine/storage
- ${CONFIG_LOCATION}:/root/.affine/config
env_file:
- .env
environment:
- REDIS_SERVER_HOST=redis
- 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:${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_SERVER_HOST=redis
- DATABASE_URL=postgresql://${DB_USERNAME}:${DB_PASSWORD}@postgres:5432/${DB_DATABASE:-affine}
- AFFINE_INDEXER_ENABLED=false
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
redis:
image: redis:alpine
container_name: affine_redis
healthcheck:
test: ['CMD', 'redis-cli', '--raw', 'incr', 'ping']
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped
postgres:
image: pgvector/pgvector:pg16
container_name: affine_postgres
volumes:
- ${DB_DATA_LOCATION}:/var/lib/postgresql/data
environment:
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: ${DB_DATABASE:-affine}
POSTGRES_INITDB_ARGS: '--data-checksums'
POSTGRES_HOST_AUTH_METHOD: trust
healthcheck:
test:
['CMD', 'pg_isready', '-U', "${DB_USERNAME}", '-d', "${DB_DATABASE:-affine}"]
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped
步骤4:启动服务
# 创建必要的目录
mkdir -p storage config postgres_data
# 启动所有服务
docker-compose up -d
# 查看服务状态
docker-compose logs -f
步骤5:验证部署
访问 http://localhost:3010,您应该能看到AFFiNE的欢迎界面。
生产环境部署配置
高级环境配置
创建 config/production.json:
{
"server": {
"name": "AFFiNE Production Server",
"host": "0.0.0.0",
"port": 3010,
"workers": 4,
"maxMemory": "512MB"
},
"database": {
"poolSize": 20,
"connectionTimeout": 30000,
"idleTimeout": 60000
},
"redis": {
"maxRetriesPerRequest": 3,
"enableReadyCheck": true
},
"storage": {
"maxFileSize": "100MB",
"allowedMimeTypes": [
"image/*",
"application/pdf",
"text/plain",
"application/msword",
"application/vnd.openxmlformats-officedocument.wordprocessingml.document"
]
}
}
优化版Docker Compose
version: '3.8'
services:
affine:
image: ghcr.io/toeverything/affine:${AFFINE_REVISION:-stable}
container_name: affine_production
ports:
- '${PORT:-3010}:3010'
deploy:
resources:
limits:
memory: 1G
cpus: '2'
reservations:
memory: 512M
cpus: '1'
depends_on:
redis:
condition: service_healthy
postgres:
condition: service_healthy
affine_migration:
condition: service_completed_successfully
volumes:
- ${UPLOAD_LOCATION}:/root/.affine/storage
- ${CONFIG_LOCATION}:/root/.affine/config
- ./config/production.json:/root/.affine/config/production.json
env_file:
- .env
environment:
- NODE_ENV=production
- REDIS_SERVER_HOST=redis
- DATABASE_URL=postgresql://${DB_USERNAME}:${DB_PASSWORD}@postgres:5432/${DB_DATABASE:-affine}
- AFFINE_INDEXER_ENABLED=true
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3010/api/health"]
interval: 30s
timeout: 10s
retries: 3
# 其他服务配置保持不变...
性能优化与监控
数据库优化配置
-- 在PostgreSQL中执行以下优化
ALTER SYSTEM SET shared_buffers = '1GB';
ALTER SYSTEM SET effective_cache_size = '3GB';
ALTER SYSTEM SET work_mem = '16MB';
ALTER SYSTEM SET maintenance_work_mem = '512MB';
ALTER SYSTEM SET max_connections = 100;
Redis性能配置
创建 redis.conf:
maxmemory 1gb
maxmemory-policy allkeys-lru
save 900 1
save 300 10
save 60 10000
监控配置
集成Prometheus监控:
# 在docker-compose中添加监控服务
monitoring:
image: prom/prometheus:latest
ports:
- 9090:9090
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
restart: unless-stopped
grafana:
image: grafana/grafana:latest
ports:
- 3000:3000
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
restart: unless-stopped
备份与恢复策略
数据库备份脚本
创建 scripts/backup.sh:
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="./backups"
mkdir -p $BACKUP_DIR
# 备份PostgreSQL
docker exec affine_postgres pg_dump -U affineuser affine_db > $BACKUP_DIR/affine_db_$DATE.sql
# 备份上传文件
tar -czf $BACKUP_DIR/storage_$DATE.tar.gz ./storage/
# 备份配置文件
tar -czf $BACKUP_DIR/config_$DATE.tar.gz ./config/
echo "Backup completed: $BACKUP_DIR/affine_db_$DATE.sql"
自动恢复脚本
创建 scripts/restore.sh:
#!/bin/bash
BACKUP_FILE=$1
if [ -z "$BACKUP_FILE" ]; then
echo "Usage: $0 <backup_file.sql>"
exit 1
fi
# 停止服务
docker-compose stop affine
# 恢复数据库
cat $BACKUP_FILE | docker exec -i affine_postgres psql -U affineuser affine_db
# 启动服务
docker-compose start affine
echo "Restore completed from $BACKUP_FILE"
安全加固措施
SSL/TLS配置
# 生成自签名证书
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
# 在Nginx配置中启用SSL
server {
listen 443 ssl;
server_name your-domain.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://affine:3010;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
防火墙规则
# 只开放必要端口
ufw allow 22/tcp # SSH
ufw allow 443/tcp # HTTPS
ufw allow 80/tcp # HTTP重定向
ufw enable
故障排除与常见问题
常见问题解决方案
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 服务启动失败 | 端口冲突 | 修改PORT环境变量 |
| 数据库连接失败 | 密码错误 | 检查.env文件中的DB_PASSWORD |
| 存储权限问题 | 目录权限 | chmod 755 ./storage |
| 内存不足 | 资源限制 | 增加Docker内存分配 |
日志查看命令
# 查看实时日志
docker-compose logs -f affine
# 查看特定服务的日志
docker logs affine_production
# 查看数据库日志
docker logs affine_postgres
# 查看Redis日志
docker logs affine_redis
扩展与集群部署
多节点部署架构
水平扩展配置
# 在docker-compose中扩展服务
affine:
image: ghcr.io/toeverything/affine:stable
deploy:
replicas: 3
resources:
limits:
memory: 512M
cpus: '0.5'
environment:
- AFFINE_CLUSTER_MODE=true
- REDIS_CLUSTER_ENABLED=true
总结与最佳实践
通过本教程,您已经掌握了AFFiNE的Docker部署全流程。以下是关键最佳实践:
- 定期备份:设置自动化备份策略,确保数据安全
- 监控告警:集成监控系统,实时掌握服务状态
- 版本控制:使用明确的版本标签,便于回滚和升级
- 安全加固:定期更新镜像,配置适当的网络策略
- 性能优化:根据实际使用情况调整资源分配
AFFiNE的Docker化部署不仅简化了运维工作,更为团队协作和知识管理提供了稳定可靠的基础平台。现在就开始您的AFFiNE之旅,体验下一代知识工作区的强大功能吧!
提示:部署过程中如遇问题,可查看详细日志或参考AFFiNE官方文档获取更多支持。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



