1. 参考
2. 环境
- Docker compose部署的OpenProject服务
- 服务器192.168.7.28 作为主服务器,预装OpenProject服务,提供生产环境
- 服务器192.168.15.96 作为备份服务器,预装OpenProject服务,作为备份环境
3. 流程
- 服务器192.168.7.28 备份OpenProject服务的Postgresql数据库
- 服务器192.168.15.96使用rsync命令同步OpenProject服务的配置文件(docker-compose.yml)、存储文件(assets)、Postgresql数据库备份文件
- 服务器192.168.15.96恢复Postgresql数据库备份文件
4. 备份Postgresql数据库
bash
docker exec openproject-db-1 pg_dump -U postgres -d openproject --insert > "/public/postgresql/pgsqlbackup/pgsql_openproject.sql"
- openproject-db-1:posgresql的容器名称
- -U postgres:连接数据库账号
- -d openproject: 备份数据库名称
- --insert 生成insert语句的备份文件
- "/public/postgresql/pgsqlbackup/pgsql_openproject.sql" :备份文件存储路径
5. 恢复备份文件
5.1 服务器192.168.15.96同步备份文件
- 同步主服务器192.168.7.28下OpenProject目录(排除postgresql数据库目录)
bash
/bin/rsync -avz --exclude='/postgresql/' --delete-after root@192.168.7.28:873/public/application/openproject/ /public/application/openproject/
- 同步主服务器192.168.7.28下OpenProject的数据库备份文件
bash
/bin/rsync -avz --delete-after root@192.168.7.28:873/public/postgresql/pgsqlbackup/pgsql_openproject.sql /public/postgresql/pgsqlbackup/
5.2 服务器192.168.15.96恢复数据库备份
- 定义环境变量
bash
# 定义备份数据库名字
DBNAME="openproject"
# 定义postgresql容器名称
CONTAINER_NAME="openproject-db-1"
# 定义docker-compose.yml文件位置,停止openproject服务需要使用
DOCKER_COMPOSE_YML="/public/application/openproject/docker-compose.yml"
# 需要预先停止的docker compose 服务
SERVICE_NAME="web worker"
- 停止openproject项目的web worker,删除数据库
bash
# 停止openproject项目的web worker,删除数据库
docker compose -f ${DOCKER_COMPOSE_YML} kill ${SERVICE_NAME} \
&& docker exec ${CONTAINER_NAME} psql -U postgres -c "DROP DATABASE IF EXISTS ${DBNAME};"
- 重建openproject数据库
bash
# 重建openproject数据库
docker exec ${CONTAINER_NAME} psql -U postgres -c "CREATE USER openproject;"
docker exec ${CONTAINER_NAME} psql -U postgres -c "CREATE DATABASE openproject OWNER ${DBNAME};"
- 导入数据库备份,初始化数据库,重启web、work服务
bash
# 导入数据库备份,初始化数据库,重启web、work服务
docker exec -i ${CONTAINER_NAME} psql -U postgres -d ${DBNAME} < "/public/postgresql/pgsqlbackup/pgsql_openproject.sql"\
&& docker compose -f ${DOCKER_COMPOSE_YML} start seeder \
&& docker compose -f ${DOCKER_COMPOSE_YML} start ${SERVICE_NAME}
6. 检查服务状态
bash
cd /public/application/openproject/ \
&& docker compose ps
bash
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
openproject-autoheal-1 willfarrell/autoheal:1.2.0 "/docker-entrypoint ..." autoheal About an hour ago Up About an hour (healthy)
openproject-cache-1 memcached "docker-entrypoint.s..." cache About an hour ago Up About an hour 11211/tcp
openproject-cron-1 openproject/openproject:16-slim "./docker/prod/entry..." cron About an hour ago Up About an hour 8080/tcp
openproject-db-1 postgres:17 "docker-entrypoint.s..." db About an hour ago Up About an hour 5432/tcp
openproject-proxy-1 openproject/proxy "caddy run --config ..." proxy About an hour ago Up About an hour 443/tcp, 2019/tcp, 443/udp, 0.0.0.0:8899->80/tcp, [::]:8899->80/tcp
openproject-web-1 openproject/openproject:16-slim "./docker/prod/entry..." web About an hour ago Up About an hour (healthy) 8080/tcp
openproject-worker-1 openproject/openproject:16-slim "./docker/prod/entry..." worker About an hour ago Up About an hour 8080/tcp
6. 补充说明
上述命令为简化示例,可以编写成Shell脚本定时执行,实现定时备份,自动恢复的功能