SQL 03:基于 Linux Docker 快速拉起 Kitsu 服务与 PostgreSQL 生产级定时备份配置
前言
在上一篇 SQL 02 中,我们从大厂资产管理系统 Kitsu 的底层表结构出发,剖析了关系型数据库在 CG 管线中的灵魂设计。然而,作为一名 Pipeline TD,只在本地用 Python 连接 SQLite 玩玩是不够的,我们必须具备在生产服务器上部署、运维和保护数据库的能力。
一旦项目上线,整个剧组、成百上千个镜头的生命线都系于这台服务器上。如果因为服务器断电、硬盘损坏或误操作导致后端数据库崩溃,而你又没有备份,那将是一场灭顶之灾。
今天这一篇,我们直接进入工业级运维实战:利用 Linux Docker 一键拉起标准的 Kitsu 全套服务,并配置一套坚不可摧的 PostgreSQL 生产级定时自动备份系统。
一、 工业级环境编排:使用 Docker Compose 一键拉起服务
在标准生产环境中,Kitsu 的 Web 服务、前端反向代理以及后端的 PostgreSQL 数据库是各自独立的容器。我们使用 docker-compose.yml 配置文件,可以将它们完美编排在一起。
登录你的 Linux 服务器,创建项目目录并新建 docker-compose.yml:
version: '3.8'
services:
# 后端核心:PostgreSQL 关系型数据库
kitsu-db:
image: postgres:15-alpine
container_name: kitsu-db
environment:
POSTGRES_USER: kitsu_admin
POSTGRES_PASSWORD: YourHardPassword123 # 请修改为复杂的密码
POSTGRES_DB: kitsu_production
volumes:
- ./postgres_data:/var/lib/postgresql/data # 将数据库数据持久化到宿主机
ports:
- "5432:5432"
restart: always
# 前端与业务逻辑:Kitsu 资产管理系统服务
kitsu-web:
image: cgwire/kitsu:latest
container_name: kitsu-web
ports:
- "80:80"
environment:
- DB_HOST=kitsu-db
- DB_USER=kitsu_admin
- DB_PASSWORD=YourHardPassword123
- DB_NAME=kitsu_production
depends_on:
- kitsu-db
restart: always
部署指令:
在同级目录下执行以下命令,全套服务即在后台静默启动:
docker-compose up -d
启动完成后,直接在浏览器输入服务器 IP 即可访问 Kitsu 漂亮的资产管理界面。
二、 生产级的绝对后路:PostgreSQL 自动化备份脚本
服务跑起来了,接下来必须解决备份问题。大厂的硬性标准是:每日凌晨自动备份,备份保留 7 天,过期的自动删除。
在 Linux 宿主机上,我们编写一个自动化 Shell 脚本。创建 backup_kitsu.sh:
#!/bin/bash
# --- 基础配置 ---
BACKUP_DIR="/opt/kitsu_backups" # 备份文件存放目录
CONTAINER_NAME="kitsu-db" # PostgreSQL 容器名
DB_USER="kitsu_admin" # 数据库用户名
DB_NAME="kitsu_production" # 数据库名
DATE=$(date +%Y%m%d_%H%M%S) # 时间戳
FILENAME="${DB_NAME}_backup_${DATE}.sql.gz" # 备份文件名
# 创建备份目录
mkdir -p ${BACKUP_DIR}
# --- 核心备份动作 ---
# 1. 使用 docker exec 调用容器内的 pg_dump 工具
# 2. 通过 gzip 压缩,极大减少磁盘占用(好莱坞大厂的核心资产数据也都是压缩存储)
echo "开始备份 Kitsu 数据库..."
docker exec -t ${CONTAINER_NAME} pg_dump -U ${DB_USER} ${DB_NAME} | gzip > ${BACKUP_DIR}/${FILENAME}
# 检查备份是否成功
if [ $? -eq 0 ]; then
echo "备份成功: ${BACKUP_DIR}/${FILENAME}"
else
echo "错误:数据库备份失败!"
exit 1
fi
# --- 自动清理历史垃圾 ---
# 仅保留 7 天内的备份,自动删除 7 天前的旧备份,防止把服务器硬盘撑爆
echo "清理 7 天前的历史备份..."
find ${BACKUP_DIR} -name "${DB_NAME}_backup_*.sql.gz" -mtime +7 -exec rm -f {} \;
echo "数据运维任务完成。"
给脚本赋予执行权限:
chmod +x backup_kitsu.sh
三、 自动化挂载:配置 Linux Crontab 定时任务
有了脚本,我们总不能每天人工去执行。我们需要让 Linux 系统在每天凌晨 2 点(剧组员工大多熬夜修完仙、服务器负载最低的时候)自动运行。
在 Linux 终端输入以下命令进入定时任务配置:
crontab -e
在文件末尾添加以下一行:
0 2 * * * /bin/bash /你的脚本绝对路径/backup_kitsu.sh >> /var/log/kitsu_backup.log 2>&1
💡 TD 技巧: 后面的
>> /var/log/kitsu_backup.log 2>&1会把每天的备份日志记录下来。如果哪天备份没成功,直接去这个 log 文件里查原因。
四、 演练:当灾难降临,如何1秒钟恢复全剧组数据?
做备份的 TD 很多,但验证过恢复流程的却很少。假设某天数据库被外包意外清空,不要慌,掏出备份文件,一行命令满血复活:
# 解压并导回数据库(将备份的 sql.gz 文件重新注入运行中的 Docker 容器)
gunzip -c /opt/kitsu_backups/kitsu_production_backup_xxxx.sql.gz | docker exec -i kitsu-db psql -U kitsu_admin -d kitsu_production
瞬间,所有的项目进度、资产连线、审批状态全部完璧归赵。
总结
作为技术美术或管线 TD,我们的职责不仅是写出炫酷的 Maya 工具,更是核心数据的守护者。通过 Docker 完成环境隔离,再通过 crontab 配合 pg_dump 焊死备份的大门。只有后方阵地稳如泰山,前方的资产管线才能放开手脚全速运转。
下一篇,我们将重回 SQL 查询性能调优:《SQL 04:深入索引(Index)原理:如何让百万级管线日志查询速度提升 1000 倍?》。敬请期待!