<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>DevOps on Leanku 的博客</title><link>https://www.leanku.com/tags/devops/</link><description>Recent content in DevOps on Leanku 的博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sat, 09 Aug 2025 16:46:01 +0800</lastBuildDate><atom:link href="https://www.leanku.com/tags/devops/index.xml" rel="self" type="application/rss+xml"/><item><title>Drone CICD自动化部署指南</title><link>https://www.leanku.com/post/devops/drone-cicd%E8%87%AA%E5%8A%A8%E5%8C%96%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97/</link><pubDate>Sat, 09 Aug 2025 16:46:01 +0800</pubDate><guid>https://www.leanku.com/post/devops/drone-cicd%E8%87%AA%E5%8A%A8%E5%8C%96%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97/</guid><description>&lt;h2 id="一drone核心优势与架构设计"&gt;一、Drone核心优势与架构设计&lt;/h2&gt;&#10;&lt;h3 id="11-为什么选择drone"&gt;1.1 为什么选择Drone&lt;/h3&gt;&#10;&lt;p&gt;&lt;a href="https://docs.drone.io"&gt;官方文档&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Drone作为轻量级云原生CI/CD工具，相比Jenkins具有显著优势：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;资源占用低&lt;/strong&gt;：基于Docker容器化运行，单个Pipeline平均内存消耗&amp;lt;100MB&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;云原生支持&lt;/strong&gt;：原生集成Kubernetes、Docker等云原生技术栈&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;配置即代码&lt;/strong&gt;：完全通过.drone.yml定义流程，版本可控&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;高性能&lt;/strong&gt;：测试显示并发构建能力比Jenkins高3-5倍16&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="12-企业级架构设计"&gt;1.2 企业级架构设计&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;[Gitee/GitHub] → [Drone Server] → [Docker Runner] (开发环境)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt; ↘ [K8s Runner] (生产环境)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt; ↘ [SSH Runner] (特殊场景)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="二-注册-oauth-应用-gitee为例"&gt;二、 注册 OAuth 应用 （Gitee为例）&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;登录 Gitee → 点击右上角头像 → &lt;strong&gt;设置&lt;/strong&gt; → &lt;strong&gt;第三方应用&lt;/strong&gt; → &lt;strong&gt;创建应用&lt;/strong&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;填写应用信息：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;应用名称：&lt;code&gt;Drone CI&lt;/code&gt;（自定义）&lt;/li&gt;&#10;&lt;li&gt;应用描述：&lt;code&gt;Drone CI/CD 工具&lt;/code&gt;（自定义）&lt;/li&gt;&#10;&lt;li&gt;授权回调地址：&lt;code&gt;http://你的服务器IP或域名/login&lt;/code&gt;（必须正确，否则无法登录）&lt;/li&gt;&#10;&lt;li&gt;应用主页：&lt;code&gt;http://你的服务器IP或域名&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;权限选择：（最少权限原则）user_info，projects，pull_requests，hooks&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;提交后，记录生成的 &lt;strong&gt;Client ID&lt;/strong&gt; 和 &lt;strong&gt;Client Secret&lt;/strong&gt;（后续配置需要）&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="三安装-drone-服务器和-runner"&gt;三、安装 Drone 服务器和 Runner&lt;/h2&gt;&#10;&lt;p&gt;Drone 由两部分组成：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Drone Server&lt;/strong&gt;：管理项目、接收仓库事件、协调任务&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Drone Runner&lt;/strong&gt;：执行流水线任务（编译、测试、部署等）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="31-手动启动-drone-server"&gt;3.1 手动启动 Drone Server&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;docker run -d &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt; --name drone-server &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt; --restart always &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt; -p 80:80 &lt;span class="se"&gt;\ &lt;/span&gt; &lt;span class="c1"&gt;# 端口映射（生产环境建议加 HTTPS）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt; -v /var/lib/drone:/data &lt;span class="se"&gt;\ &lt;/span&gt; &lt;span class="c1"&gt;# 数据持久化&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;DRONE_RPC_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_agent_secret &lt;span class="se"&gt;\ &lt;/span&gt; &lt;span class="c1"&gt;# 自定义密钥（与 Runner 保持一致）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;DRONE_GITEE_CLIENT_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;你的Gitee Client ID &lt;span class="se"&gt;\ &lt;/span&gt; &lt;span class="c1"&gt;# 替换为 Gitee 应用的 Client ID&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;DRONE_GITEE_CLIENT_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;你的Gitee Client Secret &lt;span class="se"&gt;\ &lt;/span&gt; &lt;span class="c1"&gt;# 替换为 Gitee 应用的 Secret&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;DRONE_GITEE_SERVER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://gitee.com &lt;span class="se"&gt;\ &lt;/span&gt; &lt;span class="c1"&gt;# Gitee 服务器地址（固定）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;DRONE_SERVER_HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;你的服务器IP或域名 &lt;span class="se"&gt;\ &lt;/span&gt; &lt;span class="c1"&gt;# Drone 访问地址（如 drone.example.com）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;DRONE_SERVER_PROTO&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http &lt;span class="se"&gt;\ &lt;/span&gt; &lt;span class="c1"&gt;# 协议（http 或 https）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;12&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;DRONE_USER_CREATE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;username:你的Gitee用户名,admin:true &lt;span class="se"&gt;\ &lt;/span&gt; &lt;span class="c1"&gt;# 设置 Gitee 用户名作为管理员&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;13&lt;/span&gt;&lt;span class="cl"&gt; drone/drone:2.16&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;DRONE_AGENT_SECRET 可以简单用命令生成&lt;code&gt;openssl rand -hex 16&lt;/code&gt;&#10;Drone Server 默认监听容器内的 80 端口（HTTP）和 443 端口（HTTPS，若配置证书），你可以通过 Docker 的端口映射映射（-p 参数）自定义宿主机的端口。&lt;/p&gt;</description></item><item><title>轻量级容器编排工具指南</title><link>https://www.leanku.com/post/devops/%E8%BD%BB%E9%87%8F%E7%BA%A7%E5%AE%B9%E5%99%A8%E7%BC%96%E6%8E%92%E5%B7%A5%E5%85%B7%E6%8C%87%E5%8D%97/</link><pubDate>Sat, 09 Aug 2025 16:46:01 +0800</pubDate><guid>https://www.leanku.com/post/devops/%E8%BD%BB%E9%87%8F%E7%BA%A7%E5%AE%B9%E5%99%A8%E7%BC%96%E6%8E%92%E5%B7%A5%E5%85%B7%E6%8C%87%E5%8D%97/</guid><description>&lt;h1 id="轻量级容器编排工具指南"&gt;轻量级容器编排工具指南&lt;/h1&gt;&#10;&lt;p&gt;在 Docker 环境中，除了 K8s，还有多种轻量级方案可以实现服务自动重启、健康检查等功能，特别适合单机或中小规模部署。&lt;/p&gt;&#10;&lt;h2 id="一简单方案"&gt;一、简单方案&lt;/h2&gt;&#10;&lt;h3 id="11-docker-自身的重启策略最基础方案"&gt;1.1 Docker 自身的重启策略（最基础方案）&lt;/h3&gt;&#10;&lt;p&gt;Docker Engine 内置了容器重启策略，可直接在启动容器时配置，实现容器退出后自动重启。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;常用重启策略：&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;--restart always&lt;/code&gt;：无论容器因何种原因退出（包括正常退出），总是自动重启。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;--restart on-failure[:max-retries]&lt;/code&gt;：仅在容器以非 0 状态码退出时重启，可选最大重试次数（如&lt;code&gt;on-failure:3&lt;/code&gt;最多重启 3 次）。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;--restart unless-stopped&lt;/code&gt;：除非手动执行&lt;code&gt;docker stop&lt;/code&gt;，否则始终重启（包括 Docker daemon 重启时）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 启动PHP容器，配置always重启策略&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;docker run -d &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt; --name php-app &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt; --restart always &lt;span class="se"&gt;\ &lt;/span&gt; &lt;span class="c1"&gt;# 核心：容器挂掉后自动重启&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt; -p 80:80 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;6&lt;/span&gt;&lt;span class="cl"&gt; -v /path/to/php/code:/var/www/html &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;7&lt;/span&gt;&lt;span class="cl"&gt; php:8.2-apache&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;优势：&lt;/strong&gt; 零依赖，直接使用 Docker 原生功能，适合单机部署。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;局限：&lt;/strong&gt; 仅能监控容器本身是否存活，无法检测应用内部故障（如 PHP-FPM 假死但容器仍运行）。&lt;/p&gt;&#10;&lt;h3 id="12-ocker-compose适合多容器应用"&gt;1.2 ocker Compose（适合多容器应用）&lt;/h3&gt;&#10;&lt;p&gt;如果 项目依赖其他服务（如 MySQL、Redis），可使用docker-compose管理，通过配置restart参数实现自动重启，同时支持健康检查。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;docker-compose.yml示例：&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;3.8&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;php-app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;php:8.2-apache&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 容器退出后自动重启&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;80:80&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./php-code:/var/www/html&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;depends_on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;mysql&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;12&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 健康检查：检测PHP服务是否正常响应&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;13&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;healthcheck&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;14&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CMD&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;curl&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-f&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http://localhost/health.php&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 自定义健康检查接口&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;15&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;30s &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 每30秒检查一次&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;16&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;10s &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 检查超时时间&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;17&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;retries&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 连续3次失败视为不健康&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;18&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;start_period&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;60s &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 启动后60秒内不检查&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;19&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;20&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;mysql&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;21&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;mysql:8.0&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;22&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;23&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;24&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;rootpass&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;25&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;MYSQL_DATABASE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;phpapp&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;健康检查补充：&lt;/strong&gt;&#10;在 PHP 项目中创建health.php作为健康检查接口（返回 200 状态码表示正常）：&lt;/p&gt;</description></item><item><title>基于 Gogs + Jenkins + Harbor + Docker 的自动化部署方案</title><link>https://www.leanku.com/post/devops/%E5%9F%BA%E4%BA%8E-gogs--jenkins--harbor--docker-%E7%9A%84%E8%87%AA%E5%8A%A8%E5%8C%96%E9%83%A8%E7%BD%B2%E6%96%B9%E6%A1%88/</link><pubDate>Sat, 17 May 2025 18:46:01 +0800</pubDate><guid>https://www.leanku.com/post/devops/%E5%9F%BA%E4%BA%8E-gogs--jenkins--harbor--docker-%E7%9A%84%E8%87%AA%E5%8A%A8%E5%8C%96%E9%83%A8%E7%BD%B2%E6%96%B9%E6%A1%88/</guid><description>&lt;h1 id="基于-gogs--jenkins--harbor--docker-的自动化部署方案"&gt;基于 Gogs + Jenkins + Harbor + Docker 的自动化部署方案&lt;/h1&gt;&#10;&lt;h2 id="1-系统架构总览"&gt;1. 系统架构总览&lt;/h2&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-mermaid" data-lang="mermaid"&gt;开发者提交代码 → Git仓库 → Jenkins触发构建 → Docker构建镜像 → 推送至Harbor → &#10;Kubernetes部署更新 → 监控反馈&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="2-环境准备"&gt;2. 环境准备&lt;/h2&gt;&#10;&lt;h3 id="21-硬件要求"&gt;2.1 硬件要求&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;最低配置：2核CPU/4GB内存/100GB存储&lt;/li&gt;&#10;&lt;li&gt;推荐配置：4核CPU/8GB内存/200GB SSD&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="3-组件安装与配置"&gt;3. 组件安装与配置&lt;/h2&gt;&#10;&lt;h3 id="31-gogs-安装"&gt;3.1 Gogs 安装&lt;/h3&gt;&#10;&lt;p&gt;另外一篇&lt;a href="https://www.leanku.com/content/post/Jenkins%20%E4%BD%BF%E7%94%A8.md"&gt;Jenkins 使用&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="32-jenkins-安装"&gt;3.2 &lt;a href="https://www.jenkins.io/doc/book/installing/linux/"&gt;Jenkins&lt;/a&gt; 安装&lt;/h3&gt;&#10;&lt;p&gt;另外一篇&lt;a href="https://www.leanku.com/content/post/Gogs%20%20%E4%BD%BF%E7%94%A8.md"&gt;Gogs 使用&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="33-harbor-安装"&gt;3.3 Harbor 安装&lt;/h3&gt;&#10;&lt;p&gt;另外一篇&lt;a href="https://www.leanku.com/content/post/Harbor%20%E4%BD%BF%E7%94%A8.md"&gt;Harbor 使用&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 id="4-环境配置"&gt;4. 环境配置&lt;/h2&gt;&#10;&lt;p&gt;下面以wordpress项目为例&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;wordpress/&#10;├── app/ # 项目代码&#10;├── docker # Docker 相关文件&#10;| ├── Dockerfile &#10;| ├── entrypont.sh &#10;| └── nginx.conf &#10;| └── nginx-wordpress.conf &#10;├── Jenkinsfile # Jenkins Pipeline 定义&#10;└── k8s/ # Kubernetes 部署文件&#10; ├── deployment.yaml # Deployment 配置&#10; ├── service.yaml # Service 配置&#10; └── ingress.yaml # Ingress 配置（可选）&#10; └── namespace.yaml # namespace 配置（可选）&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="41-jenkinspipeline配置"&gt;4.1 JenkinsPipeline配置&lt;/h3&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;安装必要插件&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Kubernetes Continuous Deploy&lt;/li&gt;&#10;&lt;li&gt;Docker Pipeline&lt;/li&gt;&#10;&lt;li&gt;Gogs plugin&lt;/li&gt;&#10;&lt;li&gt;Harbor&lt;/li&gt;&#10;&lt;li&gt;Git&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol start="2"&gt;&#10;&lt;li&gt;配置凭据:&#10;Manage Jenkins &amp;gt; Credentials&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Git仓库访问凭据 ID如 gogs-credential&lt;/li&gt;&#10;&lt;li&gt;Harbor仓库凭据 ID如harbor-credential&lt;/li&gt;&#10;&lt;li&gt;Kubernetes集群凭据 （/etc/rancher/k3s）ID如 k3s-kubeconfig&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Jenkins 示例：&lt;/p&gt;</description></item></channel></rss>