Logo 📚 Digital Library

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).sql

2️⃣ 备份文件存储与配置目录#

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 timercron 自动执行。


🚀 三、迁移到新服务器#

假设你在新服务器也部署了 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#

在新服务器上准备好 .envdocker-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