Skip to content

部署运维与故障排查

汇总 DoraCMS Docker 部署后的日常运维要点、备份策略与常见故障排查步骤,整理自仓库的 DOCKER_DEPLOYMENT.mdDOCKER_SETUP_SUMMARY.md

TL;DR

  • 健康检查:docker compose ps + curl http://localhost:8080/api/health
  • 备份优先:数据库卷(MongoDB/MariaDB)与 app-uploads,结合 scripts/backup.sh 做定时
  • 排查顺序:日志 → 端口占用 → 环境变量 → 初始化容器状态

健康检查

  • 查看整体状态:docker compose ps
  • 应用健康接口:curl http://localhost:8080/api/health
  • MongoDB:docker compose exec mongodb mongosh --eval "db.adminCommand('ping')"
  • MariaDB:docker compose exec mariadb healthcheck.sh --connect
  • Redis:docker compose exec redis redis-cli ping

Compose 内置健康检查示例:

yaml
healthcheck:
  test: ['CMD', 'curl', '-f', 'http://localhost:8080/api/health']
  interval: 30s
  timeout: 10s
  retries: 3
  start_period: 40s

日志与监控

bash
# 查看全部/单个服务日志
docker compose logs
docker compose logs -f eggcms-app
docker compose logs --tail=100 mongodb

# 应用容器内日志路径
docker compose exec eggcms-app ls /app/server/logs
tail -f /app/server/logs/egg-web.log
tail -f /app/server/logs/common-error.log
  • 日志轮转:EggJS 默认按日轮转,保留最近 7 天
  • 建议将日志收集到集中式系统(ELK/Loki)并配置告警

备份与恢复

MongoDB

bash
# 备份
docker compose exec mongodb mongodump \
  --username=eggcms --password=请替换 \
  --authenticationDatabase=doracms3 \
  --db=doracms3 --archive > mongodb.archive

# 恢复
cat mongodb.archive | docker compose exec -T mongodb mongorestore --archive --nsInclude=doracms3.*

MariaDB

bash
# 备份
docker compose exec mariadb mariadb-dump \
  -u eggcms -p请替换 doracms3 > mariadb-backup.sql

# 恢复
cat mariadb-backup.sql | docker compose exec -T mariadb mariadb -u eggcms -p请替换 doracms3

上传文件

bash
# 备份上传目录
docker run --rm -v egg-cms_app-uploads:/data -v $(pwd)/backups:/backup \
  alpine tar czf /backup/app-uploads-$(date +%Y%m%d).tar.gz /data

建议结合 scripts/backup.sh 配置定时任务(如 0 2 * * *)并存储异地备份。

常见问题排查

容器无法启动

  • 查看日志:docker compose logs eggcms-app
  • 检查端口占用:lsof -i :8080:27017:3306
  • 必要时重建镜像:docker compose build --no-cache

数据库连接失败

  • 检查服务:docker compose ps mongodb / mariadb
  • 验证网络:docker compose exec eggcms-app ping mongodb
  • 确认环境变量:docker compose exec eggcms-app env | grep DATABASE

初始化失败

  • 查看初始化日志:docker compose logs mongodb-init / mariadb-init
  • 重新执行:docker compose up -d --force-recreate mongodb-init

权限/磁盘不足

  • 检查文件权限:docker compose exec eggcms-app ls -la /app/server/logs
  • 检查资源占用:docker stats,必要时在 docker-compose.yml 中增加内存限制

生产环境清单

  • 修改所有默认密码与密钥(APP_KEYS、SESSION_SECRET、数据库/Redis)
  • 关闭数据库端口对公网的暴露,启用 HTTPS 与防火墙
  • 配置 CORS 与域名白名单:CORS_ORIGINSDOMAIN_WHITELIST
  • 开启 Redis 缓存,使用 NODE_ENV=production
  • 持续监控:健康检查、资源指标、错误日志;设定告警策略

常见问题 FAQ

  • Redis 报错连接失败怎么办?
    使用 docker compose exec redis redis-cli ping 检查连通性,确认 .env 中主机与端口一致,并确保防火墙未阻断。

  • 日志堆积影响磁盘怎么办?
    利用容器日志轮转配置或将日志收集到外部系统(如 ELK/Loki),定期清理宿主机上的 app-logs 卷。

  • 恢复备份时需要停机吗?
    建议在低峰期进行,恢复前先停止应用容器以避免写入冲突,恢复完成后再启动并检查健康状态。