备份与恢复
备份 Clouisle 元数据、索引、队列和上传资产
Clouisle 的可恢复备份至少包含 PostgreSQL、Qdrant、上传存储和部署配置/Secret。Redis 主要保存队列、缓存和会话状态,是否备份取决于组织对未完成任务的恢复要求。
备份内容
| 内容 | 作用 | 建议 |
|---|---|---|
| PostgreSQL | 用户、团队、资源、配置、审计、文档元数据 | 每日全量 + 持续归档 |
| Qdrant | 文档向量 | 与数据库备份协调 |
| 上传存储 | 原始文档、附件、媒体和沙箱产物 | 与 PostgreSQL 元数据保持同一时间点 |
.env/Kubernetes Secret | 连接和签名配置 | 加密保管,不提交仓库 |
| Redis | Celery/缓存/会话 | 按任务恢复要求决定 |
备份命令
这是一次在线、尽力而为的多存储备份,不是事务一致的完整快照;需要严格跨存储一致性时,请另行安排停机窗口。命令在包含 docker-compose.yml 与 .env 的目录执行,-T 是 cron/非交互执行的必需参数。
# 先停掉会写入的 Worker,降低备份期间的写入
docker compose stop worker sandbox-worker beat
# PostgreSQL:自定义格式导出
docker compose exec -T db pg_dump -U "${POSTGRES_USER:-postgres}" -Fc "${POSTGRES_DB:-clouisle}" \
> "postgres_$(date +%Y%m%d_%H%M%S).dump"
# Redis(可选,设置了 REDIS_PASSWORD 时需认证)
docker compose exec -T redis sh -c 'redis-cli ${REDIS_PASSWORD:+-a "$REDIS_PASSWORD"} --rdb -' \
> "redis_$(date +%Y%m%d_%H%M%S).rdb"
# 上传文件:只在 api 上挂载,直接流式打包卷内容
docker compose exec -T api tar -czf - -C /app uploads \
> "uploads_$(date +%Y%m%d_%H%M%S).tar.gz"
# 备份完成后恢复 Worker
docker compose start worker sandbox-worker beatQdrant 需要对每个已有集合创建并下载快照。官方镜像是 qdrant/qdrant:v1.18.3,恢复端需使用快照 API 语义兼容的版本。若启用了 QDRANT_API_KEY,先在 shell 里导出(Compose 不会把 .env 注入你的 shell):
QDRANT_URL="${QDRANT_URL:-http://localhost:6333}"
QDRANT_AUTH=()
[ -n "${QDRANT_API_KEY:-}" ] && QDRANT_AUTH=(--header "api-key: $QDRANT_API_KEY")
# 列出所有集合,把其中一个名字填到 COLLECTION,然后对每个集合重复
curl --fail "${QDRANT_URL}/collections" "${QDRANT_AUTH[@]}"
COLLECTION='替换为上面返回的集合名'
curl --fail --request POST "${QDRANT_URL}/collections/${COLLECTION}/snapshots" "${QDRANT_AUTH[@]}"
curl --fail "${QDRANT_URL}/collections/${COLLECTION}/snapshots" "${QDRANT_AUTH[@]}"
SNAPSHOT_NAME='替换为上面返回的快照名'
curl --fail "${QDRANT_URL}/collections/${COLLECTION}/snapshots/${SNAPSHOT_NAME}" \
"${QDRANT_AUTH[@]}" --output "${COLLECTION}_${SNAPSHOT_NAME}.snapshot"知识库向量集合通常命名为 kb_dim_<维度>,记忆向量为 memory_entities_dim_<维度>。默认的 http://localhost:6333 只在 Qdrant 宿主端口仍映射时可用;若生产已移除该映射,临时改绑 127.0.0.1:6333:6333 或改用 network-attached 辅助容器,完成后移除。
Kubernetes 对应命令(namespace clouisle):
kubectl -n clouisle exec -i statefulset/postgres -- pg_dump -U postgres -Fc clouisle > postgres.dump
kubectl -n clouisle exec -i deployment/api -- tar -czf - -C /app uploads > uploads.tar.gz
# Qdrant 镜像不一定带 curl:一个终端做端口转发,另一个终端用 QDRANT_URL=http://127.0.0.1:6333 执行上面的快照命令
kubectl -n clouisle port-forward statefulset/qdrant 6333:6333恢复顺序与命令
恢复顺序:
- 恢复 PostgreSQL 和依赖扩展(
pg_search、pg_stat_statements)。 - 恢复 Qdrant 集合和上传文件。
- 恢复 Secret 与环境变量,确认
SECRET_KEY保持一致。 - 启动 API,确认健康和数据库结构初始化。
- 启动 Worker、Sandbox Worker 和唯一 Beat。
- 检查文档状态、向量维度、Agent、工作流和 API Key。
- 运行一条知识库检索和一条 Agent/工作流冒烟请求。
恢复 PostgreSQL 与 Qdrant 期间保持应用服务停止,但数据库与 Qdrant 服务本身继续运行;两个存储都恢复完再启动应用。
# Compose
docker compose stop api worker sandbox-worker beat
docker compose exec -T db pg_restore -U "${POSTGRES_USER:-postgres}" -d "${POSTGRES_DB:-clouisle}" \
--clean --if-exists < postgres.dump
# Kubernetes
kubectl -n clouisle scale deployment api worker sandbox-worker beat --replicas=0
kubectl -n clouisle exec -i statefulset/postgres -- pg_restore -U postgres -d clouisle --clean --if-exists < postgres.dump对每个备份过的集合上传快照(上传即恢复集合,不要再发额外的 /recover 请求):
COLLECTION='替换为备份过的集合名'
SNAPSHOT_FILE='替换为对应的快照文件.snapshot'
curl --fail --request POST \
"${QDRANT_URL}/collections/${COLLECTION}/snapshots/upload" \
"${QDRANT_AUTH[@]}" \
--form "snapshot=@${SNAPSHOT_FILE}"最后只启动 API 恢复上传归档,再恢复各工作负载副本数(官方 manifest 默认 api=2、worker=2、sandbox-worker=1、beat=1):
# Compose
docker compose start api
docker compose exec -T api tar -xzf - -C /app < uploads.tar.gz
docker compose start worker sandbox-worker beat
# Kubernetes
kubectl -n clouisle scale deployment api --replicas=2
kubectl -n clouisle rollout status deployment/api
kubectl -n clouisle exec -i deployment/api -- tar -xzf - -C /app < uploads.tar.gz
kubectl -n clouisle scale deployment worker --replicas=2
kubectl -n clouisle scale deployment sandbox-worker --replicas=1
kubectl -n clouisle scale deployment beat --replicas=1恢复后验证 GET /api/v1/health、登录、一次知识库检索、一次上传和一条代表性工作流。Redis 队列状态是可选的;不恢复时,重新提交故障时刻仍在排队的任务即可。
自动化
把上述 Compose 命令放进宿主 cron,或在 Kubernetes 中做成 CronJob:CronJob 需挂载显式准备的备份目标并从 Secret 读取凭据。保留加密的异地副本、定义保留期,并定期在隔离环境做恢复演练。
仅恢复 PostgreSQL 会留下缺少原始文件或向量的资源;仅恢复 Qdrant 会留下无法关联的向量。必须按同一恢复点处理元数据、文件和索引。
这篇文章对你有帮助吗?