
1. 先聊清楚为什么要在腾讯云上用 Docker 跑 PostgreSQL很多人第一次接触云服务器上的数据库部署第一反应是直接apt install postgresql装完就完事。这个思路在个人测试机上没问题但放到腾讯云这种生产环境里坑会一个接一个出现系统升级把 PostgreSQL 版本顶掉了、数据目录散落在文件系统各个角落、换一台机器迁移成本极高、多个项目共用一台服务器时依赖互相打架。用 Docker 跑 PostgreSQL 解决的核心问题是环境隔离和可移植性。数据库不再直接依赖宿主机的操作系统而是跟着镜像走。你在本地 Ubuntu 上怎么跑在腾讯云上就怎么跑在同事的 Mac 上还是这么跑行为完全一致。这一点在团队协作、多环境交付的场景下价值是实打实的。另外腾讯云服务器的系统盘一般不大默认才 50G 左右而 PostgreSQL 的数据会持续增长。用 Docker 的一大好处就是可以把数据目录通过 volume 挂载到单独的数据盘上系统坏了重装、镜像删了重建数据一点不受影响。这个优势在后面章节我会单独展开讲。这篇文章写给谁给那些已经买了腾讯云服务器、或者准备买想在 Ubuntu 24.04 上把 PostgreSQL 跑起来的人。不管你是个人开发者做 side project还是小团队搭测试环境甚至是要上生产的初级运维这套流程都能直接抄。我会尽量讲清楚每一步为什么这么做而不只是扔给你一串命令。先说下我的环境腾讯云轻量应用服务器配置是 2核4G系统镜像 Ubuntu 24.04 LTSDocker 版本 26.xPostgreSQL 用 16 官方镜像。这个组合是目前兼容性最好、踩坑最少的方案。2. 服务器初始化这些基础配置不做好后面全是坑2.1 腾讯云实例的购买与登录准备买腾讯云服务器的时候地域选离你用户近的这个不用多说。镜像选择上直接选Ubuntu 24.04 LTS64 位版本。如果之前没用过腾讯云建议直接用 SSH 密钥登录而不是密码登录安全性高一个档次。密钥的私钥文件一定要保存好丢了就只能通过控制台重置。登录方式上我推荐直接用终端 SSH 登录而不是用腾讯云的网页版终端。本地终端功能更全复制粘贴命令也方便。Windows 用户可以用 Windows TerminalmacOS 用户直接用自带的 Terminal 就行。首次登录之后第一步不是装 Docker而是更新系统并创建普通用户。虽然腾讯云默认给的 ubuntu 用户已经有 sudo 权限但建议还是把系统更新做完这是后面一切操作的基础sudo apt update sudo apt upgrade -y这一步会花几分钟取决于网络状况。更新完重启一次让内核和系统库都生效。提示腾讯云有些镜像源是内网加速的如果apt update速度很快就没问题如果很慢可以检查一下 /etc/apt/sources.list 里的源地址是否指向了 tx 云内网镜像。2.2 系统参数调优给数据库留足资源PostgreSQL 对系统资源比较敏感尤其是文件句柄数和内存参数。Ubuntu 默认的ulimit限制对普通应用够用但数据库这种高并发场景下文件描述符数量可能不够。检查当前限制ulimit -n如果输出是 1024 或者 65535建议调大一点。Docker 容器内的进程会继承宿主机的 ulimit 限制所以这个参数要在宿主机层面调好。编辑/etc/security/limits.conf在末尾追加* soft nofile 65535 * hard nofile 65535 * soft nproc 65535 * hard nproc 65535同时调整内核参数让网络连接更稳定。编辑/etc/sysctl.conf追加net.core.somaxconn 1024 vm.swappiness 10 fs.file-max 2097152vm.swappiness 10这个参数很多人会忽略。它控制系统在内存不足时使用 swap 的激进程度默认是 60对数据库来说太高了。降到 10 意味着系统尽可能用物理内存减少 swap 导致的性能抖动。执行sudo sysctl -p让配置生效。这些参数不是 PostgreSQL 独有的但做数据库服务器的话属于基础功课。2.3 安全组与防火墙提前把端口留好腾讯云服务器有外层的安全组和操作系统内部的防火墙两层机制两处都要配好。安全组规则在腾讯云控制台操作云服务器 - 安全组 - 入站规则添加一条放行 TCP 5432 端口的规则来源可以限定为你的办公网 IP也可以设为 0.0.0.0/0如果只是测试的话。生产环境强烈建议限定来源 IP。操作系统层面Ubuntu 24.04 默认可能装了 ufw检查一下状态sudo ufw status如果 ufw 是 active 的状态要放行 SSH 和 PostgreSQL 端口sudo ufw allow 22/tcp sudo ufw allow 5432/tcp这里有个小经验很多人配了腾讯云安全组但忘了系统还有 ufw导致外部怎么都连不上。先确认ufw status这个排查成本最低。3. Docker 安装与镜像加速配置装错一步后面全崩3.1 官方源安装 Docker Engine不走弯路Ubuntu 24.04 的 apt 源里带的有 docker.io 包但版本通常比较老而且和 Docker Engine 官方版的配置结构有差异。我建议直接走 Docker 官方源安装获得最新稳定版。先安装依赖包sudo apt install ca-certificates curl gnupg lsb-release添加 Docker 官方 GPG 密钥和软件源sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod ar /etc/apt/keyrings/docker.gpg echo deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null然后更新源并安装sudo apt update sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin这里有一个值得注意的点Ubuntu 24.04 的代号是 noble上面命令里的lsb_release -cs会自动解析为 noble所以不用手动改。但如果你的系统用的是其它版本检查一下这个命令的输出是否正确。3.2 Docker 镜像加速解决拉取慢的问题在国内直接从 Docker Hub 拉镜像速度实在感人尤其是 PostgreSQL 这种几百 MB 的镜像。配置镜像加速器是必须做的一步。编辑/etc/docker/daemon.json如果没有就新建{ registry-mirrors: [ https://docker.m.daocloud.io, https://dockerproxy.com ] }然后重启 Dockersudo systemctl daemon-reload sudo systemctl restart docker测试一下速度docker pull hello-world如果秒级拉取完成说明加速生效了。这里提醒一句镜像加速器地址失效是常有的事如果某天拉镜像突然变慢优先怀疑加速器挂了换个可用的就行。3.3 配置 Docker 开机自启和普通用户权限腾讯云服务器一般不会频繁重启但保不齐哪天因为内核更新重启了。确保 Docker 开机自启sudo systemctl enable docker sudo systemctl start docker另外每次执行 docker 命令都要加 sudo 很烦人。把当前用户加入 docker 组以后就能直接敲 docker 命令了sudo usermod -aG docker $USER newgrp docker注意加入 docker 组等同于拥有 root 权限这是 Docker 的设计机制。如果你跟别人共用服务器给 docker 组权限要慎重。单机自己用的话问题不大。4. PostgreSQL 容器化部署全流程从拉镜像到连接成功4.1 数据目录规划先把数据盘想清楚部署 PostgreSQL 前要先想好数据放哪。腾讯云的数据盘可能挂在/data或者/mnt下先确认一下磁盘情况df -h lsblk如果有多余的云硬盘没挂载要先格式化并挂载上。这里给一个完整的数据盘挂载流程示例以新盘/dev/vdb为例sudo mkfs.ext4 /dev/vdb sudo mkdir -p /data sudo mount /dev/vdb /data echo /dev/vdb /data ext4 defaults 0 0 | sudo tee -a /etc/fstabfstab里那行配置是为了开机自动挂载。这一步做完重启之后数据盘会自动挂到/data下。接下来创建 PostgreSQL 的数据目录sudo mkdir -p /data/postgresql/data sudo mkdir -p /data/postgresql/backup sudo chown -R 1000:1000 /data/postgresql注意最后那行chownPostgreSQL 官方镜像里postgres 用户的 UID 是 1000。不给目录赋正确的属主容器启动时可能因为没权限写数据目录而直接崩溃。4.2 docker run 还是 docker-compose我推荐后者部署 PostgreSQL 的命令行参数不少端口映射、环境变量、卷挂载、重启策略如果全部写在docker run里既难维护又容易写错。我更推荐用 docker-compose 来管理好处是配置即代码以后要改配置直接编辑文件重新拉起就行。在/data/postgresql/下创建docker-compose.ymlversion: 3.8 services: postgres: image: postgres:16-alpine container_name: postgresql restart: always environment: POSTGRES_USER: myuser POSTGRES_PASSWORD: mypassword POSTGRES_DB: mydb TZ: Asia/Shanghai PGTZ: Asia/Shanghai ports: - 5432:5432 volumes: - /data/postgresql/data:/var/lib/postgresql/data - /data/postgresql/backup:/backup healthcheck: test: [CMD-SHELL, pg_isready -U myuser -d mydb] interval: 10s timeout: 5s retries: 5这里插一句镜像选择postgres:16-alpine比完整版镜像小很多运行时内存占用也低对 2G 内存的小服务器很友好。如果你需要 PostGIS 或者一些编译好的扩展那就得用完整版镜像postgres:16扩展工具链更全。4.3 环境变量与用户权限设计POSTGRES_USER、POSTGRES_PASSWORD、POSTGRES_DB这三个环境变量是 PostgreSQL 镜像的启动入口脚本读取的首次初始化数据目录时生效。这里有个细节很多人不知道这三个变量只在数据目录为空时生效。如果你的 volume 里已经有旧数据了启动容器时改这些变量是没用的数据库会沿用旧数据里的用户和密码。所以如果部署后想改密码正确做法是进容器里用ALTER USER命令而不是改 docker-compose.yml 然后重启。关于密码强度建议至少 16 位混合大小写字母、数字和特殊符号。有人说测试环境不用那么复杂但我见过太多因为测试库密码太弱被扫描到然后被勒索加密的案例。腾讯云上的机器暴露在公网攻击者的扫描脚本从不停歇。4.4 启动容器并验证运行状态在/data/postgresql/目录下执行docker compose up -d查看容器状态docker ps如果状态是 Up 且健康检查通过说明容器起来了。查看日志确认没有报错docker logs postgresql日志尾部应该会有类似这样的输出LOG: database system is ready to accept connections这行日志出现说明 PostgreSQL 已经正常工作了。验证本地连接docker exec -it postgresql psql -U myuser -d mydb能进入 psql 交互界面说明服务本身没问题。4.5 从外部连接时最容易踩的坑容器内部连接没问题但从你本地电脑连就失败这种情况太常见了。逐项排查第一确认腾讯云安全组放行了 5432 端口。这个在控制台就能看但很多人配置完忘了点保存或者规则顺序不对被前面的拒绝规则拦截了。第二确认容器映射端口正常。执行docker ps看 PORTS 列应该是0.0.0.0:5432-5432/tcp。如果只显示5432/tcp而没有映射说明容器启动时 --port 参数没传对。第三检查 PostgreSQL 是否监听了所有网络接口。默认情况下官方镜像的listen_addresses是*意味着监听所有接口。如果你自定义过配置文件需要确认这一点。第四确认防火墙没问题。按我在 2.3 节说的检查 ufw 状态。最后用你本地的 psql 或 DBeaver 尝试连接psql -h 你的服务器IP -p 5432 -U myuser -d mydb连接字符串形式是postgresql://myuser:mypassword你的服务器IP:5432/mydb这个注意别输错。5. 数据持久化与备份恢复数据库最怕的不是性能差是数据没了5.1 Docker volume 与 bind mount 怎么选我上面的配置用的是 bind mount也就是把宿主机的/data/postgresql/data目录直接映射到容器的数据目录。这样做的好处是数据文件对宿主机可见备份、迁移、排查问题都方便。另一种方式是 Docker 命名 volume比如volumes: - pgdata:/var/lib/postgresql/data命名 volume 的好处是 Docker 管理更规范卸载容器不会误删数据目录缺点是数据存放在 Docker 管理的目录下/var/lib/docker/volumes/对于不熟悉的人来说可能找不到文件在哪备份也不方便。个人建议生产环境用 bind mount数据目录放在独立数据盘上。这样即使整个 Docker 数据目录坏了你的数据盘还是完好的可以随时换一台机器挂载恢复。5.2 逻辑备份定时任务 pg_dump 实战容器化部署 PostgreSQL 的备份思路和物理机没什么区别还是用 pg_dump只是执行方式变成了docker exec。创建一个备份脚本/data/postgresql/backup.sh#!/bin/bash BACKUP_DIR/data/postgresql/backup DATE$(date %Y%m%d_%H%M%S) DB_NAMEmydb DB_USERmyuser CONTAINER_NAMEpostgresql # 保留最近 7 天的备份 find $BACKUP_DIR -name *.sql.gz -mtime 7 -delete # 执行备份并压缩 docker exec $CONTAINER_NAME pg_dump -U $DB_USER $DB_NAME | gzip $BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz # 检查备份文件大小如果小于 1KB 说明可能有问题 SIZE$(stat -c%s $BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz) if [ $SIZE -lt 1024 ]; then echo [ERROR] Backup file too small, check the backup process! exit 1 fi echo [INFO] Backup completed: ${DB_NAME}_${DATE}.sql.gz ($SIZE bytes)给脚本加执行权限chmod x /data/postgresql/backup.sh然后用 crontab 定时执行每天凌晨两点备份一次crontab -e加入这一行0 2 * * * /data/postgresql/backup.sh /data/postgresql/backup.log 21要注意pg_dump 默认备份的是单个数据库如果你有多个数据库要么逐个备份要么用 pg_dumpall 备份整个集群。另外上面这个脚本备份的是逻辑数据不包含用户角色、表空间等集群级对象。完整的灾难恢复方案应该是逻辑备份 定期快照的组合逻辑备份应对误删数据云硬盘快照应对整个系统崩溃。5.3 数据恢复流程从备份文件还原恢复流程也要提前演练别等到数据丢了才第一次碰恢复。先用备份文件生成一个新容器或者直接在当前库上恢复。单库恢复的命令是gunzip /data/postgresql/backup/mydb_20240101_020000.sql.gz | docker exec -i postgresql psql -U myuser -d mydb如果是要恢复到全新的数据库实例先创建空库再导入docker exec -it postgresql createdb -U myuser newdb gunzip /data/postgresql/backup/mydb_20240101_020000.sql.gz | docker exec -i postgresql psql -U myuser -d newdb注意pg_dump 出来的 SQL 文件里包含建表语句和数据但如果备份时有连接在写入数据得到的备份可能不在一个完全一致的时间点上。要拿到一致性快照可以用pg_dump --single-transaction参数。5.4 恢复演练测试你的备份真的能用这里分享一个我自己的习惯每个月至少演练一次备份恢复。很多人备份脚本跑得很好但从来没验证过备份文件能不能用。直到某天真的出问题才发现备份文件早就损坏了。演练方法很简单用备份文件在一个临时容器里恢复然后检查关键表的数据条数docker run -d --name postgres_restore_test \ -e POSTGRES_USERmyuser \ -e POSTGRES_PASSWORDmypassword \ -e POSTGRES_DBrestore_test \ -v /tmp/restore_test:/var/lib/postgresql/data \ postgres:16-alpine gunzip /data/postgresql/backup/mydb_最新.sql.gz | docker exec -i postgres_restore_test psql -U myuser -d restore_test恢复完成后查几条数据确认没问题然后删掉这个临时容器。这个流程走一遍心里就有底了。6. 安全加固与性能调优跑起来只是开始跑得稳才是目标6.1 PostgreSQL 密码策略与访问控制PostgreSQL 默认的认证方式是scram-sha-256在官方镜像里已经默认启用了安全性上没有大问题。但有几个点值得单独说不要使用trust认证。如果你自定义过 pg_hba.conf确保不要出现trust否则任何人都可以不输入密码直接连接。生产环境建议修改pg_hba.conf只允许特定 IP 访问。在容器里改这个文件的方式是docker exec -it postgresql bash vi /var/lib/postgresql/data/pg_hba.conf但我其实不建议直接进容器改配置因为容器的文件系统是临时的重建容器就丢了。更好的方式是在宿主机挂载一个自定义的 pg_hba.conf 文件进去。不过对大多数个人项目来说默认配置 安全组限定来源 IP 已经足够。还有一点PostgreSQL 的日志默认不记录连接密码但这不代表日志就一定安全。如果你开了log_statement all来排查问题注意日志里会记录所有 SQL 语句敏感数据可能在里面日志文件要做好权限控制。6.2 容器资源限制防止数据库吃光服务器内存Docker 默认不限制容器资源使用PostgreSQL 的 shared_buffers 如果配置得太高再加上连接数和缓存很容易把小内存服务器吃满。这就是为什么我一直强调在 compose 文件里加资源限制。在docker-compose.yml里加deploy: resources: limits: memory: 2g cpus: 1.5这样容器最多使用 2G 内存和 1.5 个 CPU 核心。对于 2G 内存的腾讯云轻量服务器建议 PostgreSQL 的shared_buffers设为 512MBeffective_cache_size设为 1GB这两个参数在 PostgreSQL 性能调优里最核心。修改 PostgreSQL 配置的方式可以直接用 docker run 方式传入参数或者编辑 postgresql.conf。更优雅一点的方案是在 Dockerfile 里用CMD追加参数但为了简单起见我推荐直接编辑配置文件或者用ALTER SYSTEM命令docker exec -it postgresql psql -U myuser -d mydb ALTER SYSTEM SET shared_buffers 512MB; ALTER SYSTEM SET effective_cache_size 1GB; ALTER SYSTEM SET work_mem 16MB; ALTER SYSTEM SET maintenance_work_mem 128MB; SELECT pg_reload_conf();ALTER SYSTEM是 PostgreSQL 9.4 之后引入的功能修改的内容会写入postgresql.auto.conf重启后依然有效比直接改 postgresql.conf 更安全不容易改错语法导致数据库起不来。6.3 连接数与连接池小内存服务器的保命配置很多人在配置 PostgreSQL 时会忽略连接数这个参数。默认max_connections 100在 2G 内存的服务器上每个连接的内存开销大约是 10MB 左右如果连接数真的跑到 100光连接就要吃掉 1G 内存。对于小型应用建议把max_connections调低到 50同时让应用层使用连接池比如 PgBouncer 或者应用自带的连接池机制。如果只是个人项目max_connections 30都够用。另外很多应用连接 PostgreSQL 时喜欢用长连接但如果连接池配置不当会出现大量idle in transaction的空闲连接占着资源不放。可以在 PostgreSQL 里设置ALTER SYSTEM SET idle_in_transaction_session_timeout 10s; SELECT pg_reload_conf();这个参数的含义是一个连接在事务开启后如果 10 秒内没有活动就强制断开避免事务卡死导致连接堆积。对于开发测试环境尤其有用。6.4 从 2G 内存到高并发哪些配置要先改如果服务器内存更大比如 4G 或 8GPostgreSQL 的配置可以进一步调整。给出一个通用的参考内存大小shared_bufferseffective_cache_sizework_memmax_connections2G512MB1GB16MB504G1GB2GB32MB1008G2GB4GB64MB20016G4GB12GB128MB200注意shared_buffers不是越大越好PostgreSQL 官方建议一般不超过物理内存的四分之一。effective_cache_size是给查询优化器用的参考值可以设置得大一些表示操作系统能提供的缓存大小。7. 常见问题与排查技巧实录这些坑我都替你踩过了7.1 容器反复重启日志刷屏 authentication failed这是我见得最多的问题。表现是容器一直处于 Restarting 状态日志里反复出现类似FATAL: password authentication failed for user myuser原因通常是volume 挂载目录里已经有一份旧数据而这份旧数据的密码和当前环境变量POSTGRES_PASSWORD不一致。镜像启动脚本会检查数据目录是否已初始化如果已初始化就完全忽略环境变量里的密码设置。解决办法有两个。如果你确定旧数据不需要直接清空数据目录再启动sudo rm -rf /data/postgresql/data/* docker compose up -d但如果数据目录里的数据很重要就不能清空。此时需要用ALTER USER修改密码docker exec -it postgresql psql -U postgres ALTER USER myuser WITH PASSWORD newpassword;这条 SQL 执行完后用新密码连接即可。这也印证了我在 4.3 节说的话环境变量只在首次初始化时有效。7.2 腾讯云 SSH 连不上但 Web 终端能用这个问题很多人碰到过本地 SSH 突然连不上服务器但腾讯云控制台的网页终端可以正常进去。一般不是 PostgreSQL 的问题而是 SSH 服务本身出了状况。用网页终端登录后排查方向有这几个第一确认 sshd 服务状态sudo systemctl status sshd如果是 active (running)说明服务本身没问题可能是网络层面的问题。第二检查/etc/ssh/sshd_config里有没有禁止密码登录或者改了端口。腾讯云的 Ubuntu 镜像默认允许密码登录但如果你之前配置过密钥登录可能把PasswordAuthentication改成了 no。第三查看/var/log/auth.log看有没有大量认证失败的记录。如果有八成是有人对你的 22 端口在暴力破解可以考虑改 SSH 端口或者用 fail2ban 做防护。7.3 容器启动失败chown 权限问题错误日志大概长这样chmod: changing permissions of /var/lib/postgresql/data: Operation not permitted或者initdb: error: could not change permissions of directory /var/lib/postgresql/data: Operation not permitted原因就是我在 4.1 节强调过的宿主机目录的属主不是 UID 1000。解决方式很简单sudo chown -R 1000:1000 /data/postgresql/data sudo chmod 700 /data/postgresql/data这里有个后续影响要留意如果以后你直接在宿主机上用文件管理器查看这个目录可能会提示权限不足。这是正常现象PostgreSQL 的数据目录本来就应该是只有数据库用户才能访问。7.4 外部连接超时安全组、防火墙、监听地址三层排查连接超时和连接被拒绝是两类不同的问题。超时通常意味着数据包被丢弃了多半是防火墙或安全组的问题连接被拒绝则说明端口根本没在监听或者服务没起来。逐层排查# 1. 确认 PostgreSQL 在容器里监听 docker exec -it postgresql netstat -tlnp | grep 5432 # 2. 确认端口映射存在 docker port postgresql # 3. 在服务器本机测试外网连接 psql -h 127.0.0.1 -p 5432 -U myuser -d mydb # 4. 检查 ufw 状态 sudo ufw status # 5. 用 telnet 或者 nc 测试端口 nc -zv 你的服务器IP 5432如果你在腾讯云控制台安全组里放行了 5432但 ufw 没放行就会出现本机能连、外部超时的情况。这两个地方都要检查。7.5 数据库重启后数据丢了这个问题的锅一般不在 Docker 或 PostgreSQL而在 volume 配置。如果你在docker-compose.yml里没写卷挂载或者挂载的路径不对容器删除后数据就跟着容器一起没了。检查当前容器的挂载情况docker inspect postgresql | grep -A 5 Mounts正常情况下应该看到宿主机路径和容器路径的对应关系。如果没看到说明配置有误。正确配置是容器内路径必须是/var/lib/postgresql/data这个路径是 PostgreSQL 官方镜像默认的数据目录写错任何一个字符都会导致数据没被持久化。另外还有一个隐性坑Windows 的 WSL 环境或者 Mac 的 Docker Desktop 环境下bind mount 的路径映射规则和 Linux 原生环境略有差异。如果你先在本地开发再部署到腾讯云要注意路径格式的差异。8. 从开发到生产这套部署方案的扩展路径到这里一套完整的腾讯云 Ubuntu 24.04 Docker PostgreSQL 部署就已经跑通了。但很多人不只是部署完就结束我来简单说一下后续的扩展方向。如果你要在这个架构上做定时备份到腾讯云 COS可以给 backup.sh 加一段用coscmd上传的代码把备份文件同步到对象存储实现异地容灾。COS 的费用很低存储备份文件一个月也就几毛钱。如果你要搭建 PostgreSQL 的主从复制Docker 环境下可以通过docker-compose同时启动两个 PostgreSQL 容器一个主库一个从库配置流复制。这种方式适合读多写少的场景但对服务器的内存和网络要求更高。如果你要在集群环境下跑可以考虑用 Kubernetes 的 Operator 方案比如 CloudNativePG 或 Zalando Postgres Operator那套方案把 PostgreSQL 的部署、备份、故障转移都自动化了学习成本也高很多。个人项目阶段用不上先知道有这个东西就行。最后再分享一个经验生产环境用的配置文件一定要放 Git 仓库里管理。docker-compose.yml、备份脚本、初始化 SQL 都提交到仓库以后不管是迁移服务器还是排查问题都有据可查。不要只在服务器上留一份服务器挂了配置也跟着没了。