资讯动态

宝塔 Docker Compose + GitHub Actions CI/CD 完整教程

发布时间:2026/10/8 13:13:48 来源:尧图企业网站定制
宝塔 Docker Compose GitHub Actions CI/CD 完整教程宝塔面板官网写字台开源项目地址甲骨文部署结果腾讯云部署结果适用场景宝塔面板 Docker Compose 编排部署 Docker Hub 镜像仓库 GitHub Actions 自动部署本文以实际项目为例镜像zhongdaiqi/xiezitai服务器 Oracle Cloud编排文件由宝塔管理。一、整体架构开发者 push 代码到 GitHub │ ▼ GitHub Actions ├─ 构建 Docker 镜像 ├─ 推送到 Docker Hub └─ SSH 登录服务器 │ ▼ 服务器 authorized_keys 限制 command/data/xiezitai_deploy/deploy.sh │ ▼ deploy.sh 执行 docker compose pull up -d │ ▼ 容器更新完成二、前置条件项要求服务器已装 Docker Docker Compose插件版docker compose宝塔面板已用「Docker 编排」跑起项目镜像仓库Docker Hub 账号镜像已能 pushGitHub仓库已关联代码Actions 可用本地有 SSH 客户端Windows PowerShell / macOS / Linux 均可三、服务器端配置3.1 确认 Docker 环境docker-vdockercompose version应输出类似Docker version 29.8.2 Docker Compose version v5.6.03.2 确认宝塔编排文件位置宝塔编排文件通常在/www/server/panel/data/compose/项目名/docker-compose.yaml本例中项目名为xiezitai所以/www/server/panel/data/compose/xiezitai/docker-compose.yaml确认内容里image:是你的 Docker Hub 镜像cat/www/server/panel/data/compose/xiezitai/docker-compose.yaml3.3 创建部署脚本本例脚本路径为/data/xiezitai_deploy/deploy.sh。mkdir-p/data/xiezitai_deploycat/data/xiezitai_deploy/deploy.shEOF #!/bin/bash set -e COMPOSE_DIR/www/server/panel/data/compose/xiezitai cd $COMPOSE_DIR echo $(date) 开始部署 docker compose pull docker compose up -d --remove-orphans docker image prune -f echo 部署完成 EOFchmodx /data/xiezitai_deploy/deploy.sh说明set -e任何一步失败立即退出CI 能感知。docker compose pull拉取最新镜像。up -d --remove-orphans重建容器并清理孤立容器。image prune -f清理悬空镜像。3.4 手动验证脚本bash/data/xiezitai_deploy/deploy.sh预期输出 ... 开始部署 [] pull 2/2 ✔ Image zhongdaiqi/xiezitai:latest Pulled ✔ Image mariadb:11.4 Pulled [] up 2/2 ✔ Container xiezitai Running ✔ Container xiezitai-db Healthy 部署完成 确认容器状态dockerps--formattable {{.Names}}\t{{.Status}}\t{{.Image}}这一步必须手动跑通再继续。四、SSH 密钥配置4.1 生成专用密钥服务器上执行ssh-keygen-ted25519-f~/.ssh/github_deploy-N生成~/.ssh/github_deploy私钥给 GitHub~/.ssh/github_deploy.pub公钥留服务器4.2 把公钥加入授权列表并加限制cat~/.ssh/github_deploy.pub~/.ssh/authorized_keyschmod700~/.sshchmod600~/.ssh/authorized_keys编辑~/.ssh/authorized_keysvi~/.ssh/authorized_keys找到刚加的那行ssh-ed25519 AAAA...在行首加上限制restrict,command/data/xiezitai_deploy/deploy.sh ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... rootinstance-xxx说明restrict禁用端口转发、X11、PTY 等所有危险功能。command...无论客户端发什么命令只执行指定脚本。这样即使私钥泄露攻击者也只能触发部署无法执行任意命令。4.3 查看私钥内容复制到 GitHubcat~/.ssh/github_deploy完整复制-----BEGIN OPENSSH PRIVATE KEY-----到-----END OPENSSH PRIVATE KEY-----的全部内容。⚠️ 私钥只能填到 GitHub Secrets绝不要提交到仓库或贴到聊天里。4.4 本地验证登录在你本机把私钥下载到本机后chmod600~/.ssh/github_deployssh-i~/.ssh/github_deploy-p22rootip地址预期直接执行 deploy.sh打印部署日志然后自动断开不给你 shell。看到PTY allocation request failed是正常的因为加了no-pty。如果看到Please login as the user opc说明 root 被 Oracle 禁了需要改用opc用户见附录。五、GitHub 配置5.1 添加 Secrets仓库 →Settings → Secrets and variables → Actions → New repository secretSecret 名称值SSH_HOSTip地址SSH_USERrootSSH_PORT22SSH_KEYgithub_deploy私钥全文如果镜像构建也在 GitHub Actions 里做再加DOCKERHUB_USERNAMEDOCKERHUB_TOKENDocker Hub → Account Settings → Security → New Access Token5.2 创建 workflow在项目仓库创建.github/workflows/deploy.yml。情况 A镜像已由其他 workflow 构建推送只需要部署name:Deployon:push:branches:[main]workflow_dispatch:jobs:deploy:runs-on:ubuntu-lateststeps:-name:Deploy via SSHuses:appleboy/ssh-actionv1with:host:${{secrets.SSH_HOST}}username:${{secrets.SSH_USER}}port:${{secrets.SSH_PORT}}key:${{secrets.SSH_KEY}}script_stop:truescript:|echo trigger deploy因为服务器authorized_keys里加了command这里的script内容会被服务器忽略真正执行的是deploy.sh。情况 B构建推送 部署 一条龙name:Build and Deployon:push:branches:[main]workflow_dispatch:jobs:build-and-push:runs-on:ubuntu-lateststeps:-uses:actions/checkoutv4-uses:docker/setup-buildx-actionv3-uses:docker/login-actionv3with:username:${{secrets.DOCKERHUB_USERNAME}}password:${{secrets.DOCKERHUB_TOKEN}}-uses:docker/build-push-actionv6with:context:.push:truetags:|zhongdaiqi/xiezitai:latest zhongdaiqi/xiezitai:${{ github.sha }}deploy:needs:build-and-pushruns-on:ubuntu-lateststeps:-name:Deploy via SSHuses:appleboy/ssh-actionv1with:host:${{secrets.SSH_HOST}}username:${{secrets.SSH_USER}}port:${{secrets.SSH_PORT}}key:${{secrets.SSH_KEY}}script_stop:truescript:|echo trigger deploy六、触发验证提交并 push 到main。打开 GitHub 仓库 →Actions标签页。点进 workflow能看到部署日志与手动 SSH 时一致 ... 开始部署 ... 部署完成 服务器确认dockerps--formattable {{.Names}}\t{{.Status}}\t{{.Image}}七、安全加固强烈建议7.1 锁 appleboy 版本到 commit SHAv1是浮动 tag作者发新版会自动用上。想更稳锁到具体 SHAuses:appleboy/ssh-action0ff4204d59e8e51228ff73bce53f80d53301dee2# v1.2.0到 https://github.com/appleboy/ssh-action/releases 查最新版本对应 SHA。7.2 用专用用户替代 root可选更安全useradd-m-s/bin/bash deployusermod-aGdockerdeploymkdir-p/home/deploy/.sshcat~/.ssh/github_deploy.pub/home/deploy/.ssh/authorized_keyschown-Rdeploy:deploy /home/deploy/.sshchmod700/home/deploy/.sshchmod600/home/deploy/.ssh/authorized_keysGitHub Secrets 里SSH_USER改成deploy。7.3 禁用 root 密码登录/etc/ssh/sshd_configPasswordAuthentication no PermitRootLogin prohibit-password重启 SSHsystemctl restart sshd7.4 修改默认 SSH 端口/etc/ssh/sshd_config改Port 2222云安全组和宝塔防火墙同步放行GitHub Secrets 里SSH_PORT改成2222。八、回滚机制构建时同时打latest和 commit sha 两个 tag见情况 B。回滚时cd/www/server/panel/data/compose/xiezitai# 临时把 image 改成某个 shased-is|zhongdaiqi/xiezitai:latest|zhongdaiqi/xiezitai:sha|docker-compose.yamldockercompose up-d或更规范的方式用.env控制版本# docker-compose.yamlimage:zhongdaiqi/xiezitai:${IMAGE_TAG:-latest}部署时IMAGE_TAGshadockercompose up-d九、常见问题排查现象原因解决Permission denied (publickey)私钥不对/不全重新cat ~/.ssh/github_deploy完整粘贴到SSH_KEYLoad key ... error in libcrypto用了.pub公钥登录改用私钥无.pub后缀PTY allocation request failed正常no-pty忽略Please login as the user opcOracle 禁用 root改用opc用户见附录dial tcp ... i/o timeout网络/防火墙检查 Oracle 安全组、宝塔防火墙放行 SSH 端口Host key verification failedknown_hostsappleboy默认跳过一般不会遇到Action 成功但容器没更新脚本未执行检查authorized_keys的command路径Conflict. container name already in use同名容器残留docker rm -f 容器名后重试十、附录Oracle Cloud 用 opc 用户如果 root 被禁改用opc# 1. 公钥放到 opcsudomkdir-p/home/opc/.sshsudochmod700/home/opc/.sshsudovi/home/opc/.ssh/authorized_keys# 加入# restrict,command/data/xiezitai_deploy/deploy.sh ssh-ed25519 AAAA...sudochown-Ropc:opc /home/opc/.sshsudochmod600/home/opc/.ssh/authorized_keys# 2. opc 加入 docker 组sudousermod-aGdockeropc# 3. deploy.sh 里 docker 命令加 sudo并配置免密echoopc ALL(ALL) NOPASSWD: /usr/bin/docker|sudotee/etc/sudoers.d/opc-dockerGitHub Secrets 里SSH_USER改成opc。十一、完整检查清单服务器端Docker / Docker Compose 已装宝塔编排文件就位服务正常运行deploy.sh已创建并chmod x手动bash deploy.sh成功SSHgithub_deploy密钥已生成公钥加入authorized_keys并加restrict,command...权限 700 / 600 正确本地用私钥 SSH 登录成功自动触发部署GitHubSSH_HOST/SSH_USER/SSH_PORT/SSH_KEY已加 Secrets.github/workflows/deploy.yml已创建push 后 Actions 运行成功服务器容器确认已更新安全私钥只存 GitHub Secretsauthorized_keys已加restrict,command可选锁 appleboy commit SHA可选专用用户替代 root可选禁用密码登录十二、流程总结① 服务器deploy.sh 手动跑通 ② 服务器生成 SSH 密钥公钥加 restrict,command 限制 ③ 本地用私钥 SSH 验证能自动触发部署 ④ GitHub配置 4 个 Secrets ⑤ GitHub创建 deploy.yml ⑥ push 触发Actions 自动 SSH 执行 deploy.sh ⑦ 服务器容器自动更新数据卷复用不丢数据至此代码 push → 镜像构建推送 → 服务器自动更新的完整 CI/CD 链路就跑通了。有任何一步卡住把报错原文和当前执行的命令贴出来我帮你定位。记住私钥永远不要贴出来。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑