跳转至

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 倍?》。敬请期待!