生产环境部署指南:用 Docker Compose 搭建高可用 Cockpit + MongoDB 集群

生产环境部署指南:用 Docker Compose 搭建高可用 Cockpit + MongoDB 集群 生产环境部署指南用 Docker Compose 搭建高可用 Cockpit MongoDB 集群【免费下载链接】CockpitCockpit Core - Content Platform项目地址: https://gitcode.com/gh_mirrors/cockp/CockpitCockpit 是一款开源的 Headless CMS无头内容管理系统也被称为 Cockpit Core 内容平台它通过 REST 与 GraphQL API 为网站、移动应用和物联网设备提供灵活的内容管理能力。本文将手把手教你使用 Docker Compose 搭建高可用 Cockpit MongoDB 集群从编写编排文件、配置数据库连接到副本集高可用与数据备份恢复一套完整的生产环境部署方案帮助你快速上线一个稳定可靠的内容平台。一、为什么生产环境推荐用 Docker Compose 部署 CockpitCockpit 官方提供了基于 PHP 8.3 Apache 的 Docker 镜像项目根目录的 Dockerfile 已经内置了 GD、Zip、PDO、MongoDB 驱动、Redis 扩展和 Apache mod_rewrite省去了手动编译 PHP 扩展的繁琐过程。用 Docker Compose 编排 Cockpit MongoDB可以一次性解决三个生产环境难题难题Docker Compose 的解法环境不一致镜像固化运行环境本地与服务器行为一致数据库依赖一条命令同时拉起应用与 MongoDBdepends_on保证启动顺序扩展与迁移通过环境变量注入配置扩容节点无需改代码Cockpit 默认使用 SQLitemongolite://存储数据适合开发调试生产环境建议切换到真正的 MongoDB以获得更好的并发性能、索引能力和副本集高可用支持。这一点在 bootstrap.php 的默认配置中可以看到你只需在config/config.php中覆盖database.server即可无缝切换。二、整体架构高可用 Cockpit MongoDB 集群长什么样推荐的生产架构分为三层接入层Nginx 反向代理负责 HTTPS 终结、静态资源缓存与流量转发应用层1 个或多个 Cockpit 容器官方镜像cockpithq/cockpit:core-latest无状态应用可横向扩容数据层MongoDB 副本集Replica Set一主多从实现数据冗余与自动故障转移。Cockpit 通过 lib/MongoHybrid/Client.php 统一抽象了 MongoDB 与 SQLite 两种驱动连接串以mongodb://或mongodbsrv://开头时走真实 MongoDB应用层无需改动任何业务代码。三、快速搭建步骤编写 docker-compose.yml3.1 第一步获取代码并准备目录生产环境建议拉取官方发布版本而非源码仓库如果你需要基于源码二次开发可以克隆git clone https://gitcode.com/gh_mirrors/cockp/Cockpit创建项目目录结构storage目录必须可写安装引导程序 install/index.php 会检查storage/data、storage/cache、storage/uploads等目录的写入权限/opt/cockpit/ ├── docker-compose.yml ├── config/ │ └── config.php └── storage/ # 挂载数据卷3.2 第二步编写 docker-compose.yml这是全文核心一份可直接上生产的高可用编排文件version: 3.8 services: mongo: image: mongo:8 container_name: cockpit-mongo restart: unless-stopped command: [mongod, --replSet, rs0, --bind_ip_all] volumes: - mongo_data:/data/db - mongo_config:/data/configdb healthcheck: test: [CMD, mongosh, --quiet, --eval, db.adminCommand(ping).ok] interval: 10s timeout: 5s retries: 5 networks: - cockpit-net mongo-init: image: mongo:8 container_name: cockpit-mongo-init depends_on: mongo: condition: service_healthy command: mongosh --host mongo:27017 --eval try { rs.initiate({_id:rs0, members:[{_id:0, host:mongo:27017}]}) } catch(e) { print(e) } networks: - cockpit-net cockpit: image: cockpithq/cockpit:core-latest container_name: cockpit-app restart: unless-stopped ports: - 127.0.0.1:8080:80 # 只暴露到本机由 Nginx 转发 environment: - COCKPIT_DATABASE_SERVERmongodb://mongo:27017/?replicaSetrs0 - COCKPIT_DATABASE_NAMEcockpit - COCKPIT_SEC_KEY${COCKPIT_SEC_KEY} # 从 .env 读取绝不写死在文件里 volumes: - ./config:/var/www/html/config - cockpit_storage:/var/www/html/storage depends_on: mongo: condition: service_healthy networks: - cockpit-net volumes: mongo_data: mongo_config: cockpit_storage: networks: cockpit-net: driver: bridge说明mongo-init是一个一次性容器负责把 MongoDB 初始化为副本集rs0这是实现故障自动切换的关键一步。Cockpit 只暴露到127.0.0.1对外统一由反向代理接管。3.3 第三步配置 config.php 与安全密钥Cockpit 会优先加载config/config.php挂载到容器内/var/www/html/config。创建如下配置?php // config/config.php return [ database [ server getenv(COCKPIT_DATABASE_SERVER) ?: mongodb://mongo:27017, database getenv(COCKPIT_DATABASE_NAME) ?: cockpit, ], sec-key getenv(COCKPIT_SEC_KEY) ?: please-change-me, ];安全提醒必须做Cockpit 默认的sec-key是写死在 bootstrap.php 里的公开值生产环境务必通过环境变量覆盖否则存在会话伪造风险。同时在同目录创建.env文件COCKPIT_SEC_KEY$(openssl rand -hex 32)3.4 第四步启动并完成安装docker compose up -d docker compose ps # 确认三个容器都 healthy浏览器访问http://服务器IP/install跟随 install/index.php 的引导完成初始化设置管理员账号即可。安装完成后REST 与 GraphQL API 就可以通过/api/*对外提供服务了。四、高可用关键点副本集、持久化与备份恢复4.1 MongoDB 副本集实现自动故障转移生产环境单体 MongoDB 一旦宕机整个内容平台随之不可用。通过--replSet rs0将 MongoDB 初始化为副本集后主节点故障时从节点会自动选举出新主节点Cockpit 连接串中的?replicaSetrs0让驱动自动感知角色变化实现高可用无缝切换。4.2 数据持久化与备份策略应用数据cockpit_storage卷持久化上传的图片、文件与缓存数据库mongo_data卷持久化全部内容数据备份方案生产环境建议每日执行mongodump并同步到异地存储docker exec cockpit-mongo mongodump --archive/tmp/cockpit-backup.gz --gzip docker cp cockpit-mongo:/tmp/cockpit-backup.gz /backup/cockpit-$(date %F).gz恢复时使用mongorestore --gzip --archive/backup/cockpit-xxx.gz即可。4.3 多副本扩容建议当流量增长时可以把 MongoDB 扩展为一主两从副本集并把 Cockpit 应用容器扩到 23 个实例前面用 Nginx 做负载均衡。由于 Cockpit 应用本身无状态扩容只需docker compose up -d --scale cockpit2再在 Nginx 中配置upstream即可。五、反向代理与 HTTPS快速上线前必做的一步Cockpit 容器默认监听 80 端口Apache我们把它映射到本机 8080再由 Nginx 对外提供 HTTPS。参考配置server { listen 443 ssl; server_name yourdomain.com; ssl_certificate /etc/nginx/ssl/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/privkey.pem; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Real-IP $remote_addr; } }X-Forwarded-Proto头一定要带上否则 HTTPS 场景下 API 返回的 URL 可能错误地使用 http 协议。六、上线检查清单与常见问题排查上线前逐项检查✅sec-key已通过环境变量替换为随机值✅ MongoDB 副本集rs.status()状态为正常PRIMARY/SECONDARY✅storage目录可写安装引导检查项全部通过✅ HTTPS 已启用API 仅通过反向代理对外暴露✅ 已配置每日数据库备份与恢复演练常见问题速查现象原因与解决办法安装页提示目录不可写检查./config、cockpit_storage挂载权限容器内www-data用户 UID 为 1000连接 MongoDB 失败确认depends_on的 healthcheck 生效MongoDB 容器已初始化副本集重启后数据丢失确认使用了命名卷而非匿名卷且docker compose down而非-v更换数据库后老数据消失Cockpit 默认 SQLite 数据在storage/data切换 MongoDB 前先导出旧内容七、总结通过 Docker Compose 搭建高可用 Cockpit MongoDB 集群并不复杂官方镜像解决了 PHP 运行环境问题config/config.php一处配置即可从 SQLite 平滑切换到 MongoDB 副本集再配合 Nginx 反向代理与定时备份就能得到一个开箱即用、可横向扩展的企业级内容平台。希望这份生产环境部署指南能帮你一次上线成功让内容团队专注创作让开发团队专注业务。【免费下载链接】CockpitCockpit Core - Content Platform项目地址: https://gitcode.com/gh_mirrors/cockp/Cockpit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考