AFFiNE
自托管笔记
路径:/home/ding/docker/test/affine 管理员: ding@isrv.cn
使用已有的postgres和redis部署#
[ding@ArchLinux affine]$ pwd
/home/ding/docker/test/affine
[ding@ArchLinux affine]$ cat docker-compose.yml
services:
affine:
image: ghcr.io/toeverything/affine:${AFFINE_REVISION:-stable}
container_name: affine_server
ports:
- '${PORT:-3010}:3010'
depends_on:
affine_migration:
condition: service_completed_successfully
volumes:
- ${UPLOAD_LOCATION}:/root/.affine/storage
- ${CONFIG_LOCATION}:/root/.affine/config
env_file:
- .env
environment:
# Redis 连接参数
- REDIS_SERVER_HOST=${REDIS_HOST}
- REDIS_SERVER_PORT=${REDIS_PORT}
- REDIS_SERVER_PASSWORD=${REDIS_PASSWORD} # ✅ 新增
# 数据库连接
- DATABASE_URL=postgresql://${DB_USERNAME}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_DATABASE}
- AFFINE_INDEXER_ENABLED=false
# 邮件服务器配置
- MAILER_HOST=${MAILER_HOST}
- MAILER_PORT=${MAILER_PORT}
- MAILER_USER=${MAILER_USER}
- MAILER_PASSWORD=${MAILER_PASSWORD}
- MAILER_SENDER=${MAILER_SENDER}
- MAILER_IGNORE_TLS=${MAILER_IGNORE_TLS}
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_HOST}
- REDIS_SERVER_PORT=${REDIS_PORT}
- REDIS_SERVER_PASSWORD=${REDIS_PASSWORD} # ✅ 同样新增
- DATABASE_URL=postgresql://${DB_USERNAME}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_DATABASE}
- AFFINE_INDEXER_ENABLED=false
restart: on-failure
[ding@ArchLinux affine]$ cat .env
# ------------------------
# Affine 版本配置
# ------------------------
AFFINE_REVISION=stable
PORT=3010
# ------------------------
# Affine 数据持久化路径(可改为绝对路径)
# ------------------------
DB_DATA_LOCATION=./affine/self-host/postgres/pgdata
UPLOAD_LOCATION=./affine/self-host/storage
CONFIG_LOCATION=./affine/self-host/config
# ------------------------
# 外部 PostgreSQL 数据库配置
# ------------------------
# PostgreSQL 服务器 IP 或主机名
DB_HOST=192.168.10.2
# PostgreSQL 端口
DB_PORT=5433
# 数据库名称
DB_DATABASE=affine
# 用户名与密码(例如来自你之前部署的数据库)
DB_USERNAME=affine
DB_PASSWORD=W8NCcyZeQ2hRzM3B
# ------------------------
# 外部 Redis 配置
# ------------------------
# Redis 服务器地址与端口
REDIS_HOST=192.168.10.2
REDIS_PORT=6379
REDIS_PASSWORD=redis_Zj2xNz # ✅ 新增此行
# ------------------------
# 邮件配置 (SMTP)
# ------------------------
MAILER_HOST=mail.isrv.cn
MAILER_PORT=465
MAILER_USER=srv@isrv.cn
MAILER_PASSWORD=passwd # 邮箱密码
MAILER_SENDER="Affine System <srv@isrv.cn>"
MAILER_IGNORE_TLS=true
[ding@ArchLinux affine]$
查看数据库#
PGPASSWORD=W8NCcyZeQ2hRzM3B psql -h 192.168.10.2 -p 5433 -U affine -d affine
\dt
备份 → 导出 → 迁移 → 导入 → 再部署 的标准流程。
🧩 一、AFFiNE 数据结构说明#
AFFiNE 的持久化数据包括三类:
| 类型 | 说明 | 典型路径 / 服务 |
|---|---|---|
| 1️⃣ 数据库 | 存储用户、文档、AI 配置等核心数据 | PostgreSQL(即 affine 数据库) |
| 2️⃣ 文件存储 | 存放上传的图片、附件等 | UPLOAD_LOCATION(例如 /affine/self-host/storage/) |
| 3️⃣ 配置文件 | 系统配置、授权信息等 | CONFIG_LOCATION(例如 /affine/self-host/config/) |
🧱 二、备份操作(推荐定期执行)#
1️⃣ 备份数据库#
使用 pg_dump 导出 SQL 备份文件:
PGPASSWORD=W8NCcyZeQ2hRzM3B pg_dump \
-h 192.168.10.2 \
-p 5433 \
-U affine \
-d affine \
-F c \
-f affine_$(date +%Y-%m-%d).dump说明:
-F c使用 PostgreSQL 自定义格式(推荐)- 导出的文件例如:
affine_2025-11-13.dump
👉 你也可以用纯文本 SQL 格式:
PGPASSWORD=W8NCcyZeQ2hRzM3B pg_dump \
-h 192.168.10.2 -p 5433 -U affine -d affine \
> affine_$(date +%Y-%m-%d).sql2️⃣ 备份文件存储与配置目录#
tar czf affine_files_$(date +%Y-%m-%d).tar.gz ./affine/self-host/storage/
tar czf affine_config_$(date +%Y-%m-%d).tar.gz ./affine/self-host/config/你可以定期用 systemd timer 或 cron 自动执行。
🚀 三、迁移到新服务器#
假设你在新服务器也部署了 PostgreSQL、Redis、Docker 环境。
1️⃣ 恢复数据库#
先复制 .dump 文件过去:
scp affine_2025-11-13.dump user@newserver:/root/在新服务器导入:
PGPASSWORD=W8NCcyZeQ2hRzM3B pg_restore \
-h 127.0.0.1 \
-p 5433 \
-U affine \
-d affine \
--clean --create \
affine_2025-11-13.dump⚠️ 如果数据库还没创建,可用:
createdb -h 127.0.0.1 -p 5433 -U affine affine
2️⃣ 恢复文件存储与配置目录#
tar xzf affine_files_2025-11-13.tar.gz -C ./affine/self-host/storage/
tar xzf affine_config_2025-11-13.tar.gz -C ./affine/self-host/config/🧩 四、重新部署 Docker#
在新服务器上准备好 .env 和 docker-compose.yml(可直接拷贝旧的)。
确保 .env 中数据库和 Redis 地址、密码正确。
然后运行:
docker compose up -d💡 五、自动化建议#
你可以创建一个脚本 /opt/affine-backup.sh:
#!/bin/bash
set -e
DATE=$(date +%Y-%m-%d)
BACKUP_DIR=/opt/affine-backups
mkdir -p $BACKUP_DIR
cd /root/docker/test/affine
# PostgreSQL 备份
PGPASSWORD=W8NCcyZeQ2hRzM3B pg_dump -h 192.168.10.2 -p 5433 -U affine -d affine -F c -f $BACKUP_DIR/affine_${DATE}.dump
# 文件和配置
tar czf $BACKUP_DIR/affine_files_${DATE}.tar.gz affine/self-host/storage/
tar czf $BACKUP_DIR/affine_config_${DATE}.tar.gz affine/self-host/config/
echo "[✓] AFFiNE backup completed at $DATE"再配合定时任务:
sudo crontab -e加入:
0 2 * * * /opt/affine-backup.sh >> /var/log/affine-backup.log 2>&1
📚 Digital Library