fujian_water_biz_doc/output/water_biz_deployment_design.html

1547 lines
159 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
<head>
<meta charset="utf-8" />
<meta name="generator" content="pandoc" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
<meta name="author" content="系统设计团队" />
<title>福建水务营收系统-部署设计</title>
<style>
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
div.columns{display: flex; gap: min(4vw, 1.5em);}
div.column{flex: auto; overflow-x: auto;}
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
/* The extra [class] is a hack that increases specificity enough to
override a similar rule in reveal.js */
ul.task-list[class]{list-style: none;}
ul.task-list li input[type="checkbox"] {
font-size: inherit;
width: 0.8em;
margin: 0 0.8em 0.2em -1.6em;
vertical-align: middle;
}
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
/* CSS for syntax highlighting */
pre > code.sourceCode { white-space: pre; position: relative; }
pre > code.sourceCode > span { line-height: 1.25; }
pre > code.sourceCode > span:empty { height: 1.2em; }
.sourceCode { overflow: visible; }
code.sourceCode > span { color: inherit; text-decoration: inherit; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
pre > code.sourceCode { white-space: pre-wrap; }
pre > code.sourceCode > span { display: inline-block; text-indent: -5em; padding-left: 5em; }
}
pre.numberSource code
{ counter-reset: source-line 0; }
pre.numberSource code > span
{ position: relative; left: -4em; counter-increment: source-line; }
pre.numberSource code > span > a:first-child::before
{ content: counter(source-line);
position: relative; left: -1em; text-align: right; vertical-align: baseline;
border: none; display: inline-block;
-webkit-touch-callout: none; -webkit-user-select: none;
-khtml-user-select: none; -moz-user-select: none;
-ms-user-select: none; user-select: none;
padding: 0 4px; width: 4em;
color: #aaaaaa;
}
pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
div.sourceCode
{ background-color: #f8f8f8; }
@media screen {
pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
}
code span.al { color: #ef2929; } /* Alert */
code span.an { color: #8f5902; font-weight: bold; font-style: italic; } /* Annotation */
code span.at { color: #204a87; } /* Attribute */
code span.bn { color: #0000cf; } /* BaseN */
code span.cf { color: #204a87; font-weight: bold; } /* ControlFlow */
code span.ch { color: #4e9a06; } /* Char */
code span.cn { color: #8f5902; } /* Constant */
code span.co { color: #8f5902; font-style: italic; } /* Comment */
code span.cv { color: #8f5902; font-weight: bold; font-style: italic; } /* CommentVar */
code span.do { color: #8f5902; font-weight: bold; font-style: italic; } /* Documentation */
code span.dt { color: #204a87; } /* DataType */
code span.dv { color: #0000cf; } /* DecVal */
code span.er { color: #a40000; font-weight: bold; } /* Error */
code span.ex { } /* Extension */
code span.fl { color: #0000cf; } /* Float */
code span.fu { color: #204a87; font-weight: bold; } /* Function */
code span.im { } /* Import */
code span.in { color: #8f5902; font-weight: bold; font-style: italic; } /* Information */
code span.kw { color: #204a87; font-weight: bold; } /* Keyword */
code span.op { color: #ce5c00; font-weight: bold; } /* Operator */
code span.ot { color: #8f5902; } /* Other */
code span.pp { color: #8f5902; font-style: italic; } /* Preprocessor */
code span.sc { color: #ce5c00; font-weight: bold; } /* SpecialChar */
code span.ss { color: #4e9a06; } /* SpecialString */
code span.st { color: #4e9a06; } /* String */
code span.va { color: #000000; } /* Variable */
code span.vs { color: #4e9a06; } /* VerbatimString */
code span.wa { color: #8f5902; font-weight: bold; font-style: italic; } /* Warning */
</style>
<link rel="stylesheet" href="output/document_style.css" />
<meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<header id="title-block-header">
<h1 class="title">福建水务营收系统-部署设计</h1>
<p class="author">系统设计团队</p>
<p class="date">2024年12月19日</p>
</header>
<nav id="TOC" role="doc-toc">
<ul>
<li><a href="#福建水务营收系统部署设计文档"
id="toc-福建水务营收系统部署设计文档"><span
class="toc-section-number">1</span> 福建水务营收系统部署设计文档</a>
<ul>
<li><a href="#文档信息" id="toc-文档信息"><span
class="toc-section-number">1.1</span> 文档信息</a></li>
<li><a href="#目录" id="toc-目录"><span
class="toc-section-number">1.2</span> 目录</a></li>
<li><a href="#部署概述" id="toc-部署概述"><span
class="toc-section-number">1.3</span> 1. 部署概述</a>
<ul>
<li><a href="#部署目标" id="toc-部署目标"><span
class="toc-section-number">1.3.1</span> 1.1 部署目标</a></li>
<li><a href="#部署原则" id="toc-部署原则"><span
class="toc-section-number">1.3.2</span> 1.2 部署原则</a></li>
</ul></li>
<li><a href="#部署架构" id="toc-部署架构"><span
class="toc-section-number">1.4</span> 2. 部署架构</a>
<ul>
<li><a href="#总体部署架构" id="toc-总体部署架构"><span
class="toc-section-number">1.4.1</span> 2.1 总体部署架构</a></li>
<li><a href="#生产环境部署架构" id="toc-生产环境部署架构"><span
class="toc-section-number">1.4.2</span> 2.2 生产环境部署架构</a>
<ul>
<li><a href="#主生产环境" id="toc-主生产环境"><span
class="toc-section-number">1.4.2.1</span> 2.2.1 主生产环境</a></li>
<li><a href="#灾备环境" id="toc-灾备环境"><span
class="toc-section-number">1.4.2.2</span> 2.2.2 灾备环境</a></li>
</ul></li>
<li><a href="#测试环境部署架构" id="toc-测试环境部署架构"><span
class="toc-section-number">1.4.3</span> 2.3 测试环境部署架构</a></li>
<li><a href="#开发环境部署架构" id="toc-开发环境部署架构"><span
class="toc-section-number">1.4.4</span> 2.4 开发环境部署架构</a></li>
</ul></li>
<li><a href="#服务器配置" id="toc-服务器配置"><span
class="toc-section-number">1.5</span> 3. 服务器配置</a>
<ul>
<li><a href="#硬件配置要求" id="toc-硬件配置要求"><span
class="toc-section-number">1.5.1</span> 3.1 硬件配置要求</a>
<ul>
<li><a href="#负载均衡服务器" id="toc-负载均衡服务器"><span
class="toc-section-number">1.5.1.1</span> 3.1.1 负载均衡服务器</a></li>
<li><a href="#web服务器" id="toc-web服务器"><span
class="toc-section-number">1.5.1.2</span> 3.1.2 Web服务器</a></li>
<li><a href="#应用服务器" id="toc-应用服务器"><span
class="toc-section-number">1.5.1.3</span> 3.1.3 应用服务器</a></li>
<li><a href="#数据库服务器" id="toc-数据库服务器"><span
class="toc-section-number">1.5.1.4</span> 3.1.4 数据库服务器</a></li>
<li><a href="#文件服务器" id="toc-文件服务器"><span
class="toc-section-number">1.5.1.5</span> 3.1.5 文件服务器</a></li>
<li><a href="#缓存服务器" id="toc-缓存服务器"><span
class="toc-section-number">1.5.1.6</span> 3.1.6 缓存服务器</a></li>
</ul></li>
<li><a href="#软件配置要求" id="toc-软件配置要求"><span
class="toc-section-number">1.5.2</span> 3.2 软件配置要求</a>
<ul>
<li><a href="#操作系统" id="toc-操作系统"><span
class="toc-section-number">1.5.2.1</span> 3.2.1 操作系统</a></li>
<li><a href="#数据库" id="toc-数据库"><span
class="toc-section-number">1.5.2.2</span> 3.2.2 数据库</a></li>
<li><a href="#应用服务器-1" id="toc-应用服务器-1"><span
class="toc-section-number">1.5.2.3</span> 3.2.3 应用服务器</a></li>
<li><a href="#缓存服务器-1" id="toc-缓存服务器-1"><span
class="toc-section-number">1.5.2.4</span> 3.2.4 缓存服务器</a></li>
<li><a href="#中间件" id="toc-中间件"><span
class="toc-section-number">1.5.2.5</span> 3.2.5 中间件</a></li>
<li><a href="#前端环境" id="toc-前端环境"><span
class="toc-section-number">1.5.2.6</span> 3.2.6 前端环境</a></li>
</ul></li>
</ul></li>
<li><a href="#网络架构" id="toc-网络架构"><span
class="toc-section-number">1.6</span> 4. 网络架构</a>
<ul>
<li><a href="#网络拓扑" id="toc-网络拓扑"><span
class="toc-section-number">1.6.1</span> 4.1 网络拓扑</a></li>
<li><a href="#网络安全区域划分" id="toc-网络安全区域划分"><span
class="toc-section-number">1.6.2</span> 4.2 网络安全区域划分</a></li>
<li><a href="#网络带宽配置" id="toc-网络带宽配置"><span
class="toc-section-number">1.6.3</span> 4.3 网络带宽配置</a></li>
</ul></li>
<li><a href="#安全设计" id="toc-安全设计"><span
class="toc-section-number">1.7</span> 5. 安全设计</a>
<ul>
<li><a href="#网络安全" id="toc-网络安全"><span
class="toc-section-number">1.7.1</span> 5.1 网络安全</a>
<ul>
<li><a href="#边界安全" id="toc-边界安全"><span
class="toc-section-number">1.7.1.1</span> 5.1.1 边界安全</a></li>
<li><a href="#内网安全" id="toc-内网安全"><span
class="toc-section-number">1.7.1.2</span> 5.1.2 内网安全</a></li>
</ul></li>
<li><a href="#系统安全" id="toc-系统安全"><span
class="toc-section-number">1.7.2</span> 5.2 系统安全</a>
<ul>
<li><a href="#主机安全" id="toc-主机安全"><span
class="toc-section-number">1.7.2.1</span> 5.2.1 主机安全</a></li>
<li><a href="#应用安全" id="toc-应用安全"><span
class="toc-section-number">1.7.2.2</span> 5.2.2 应用安全</a></li>
</ul></li>
<li><a href="#数据安全" id="toc-数据安全"><span
class="toc-section-number">1.7.3</span> 5.3 数据安全</a>
<ul>
<li><a href="#数据存储安全" id="toc-数据存储安全"><span
class="toc-section-number">1.7.3.1</span> 5.3.1 数据存储安全</a></li>
<li><a href="#数据备份与恢复" id="toc-数据备份与恢复"><span
class="toc-section-number">1.7.3.2</span> 5.3.2 数据备份与恢复</a></li>
</ul></li>
</ul></li>
<li><a href="#部署流程" id="toc-部署流程"><span
class="toc-section-number">1.8</span> 6. 部署流程</a>
<ul>
<li><a href="#部署准备" id="toc-部署准备"><span
class="toc-section-number">1.8.1</span> 6.1 部署准备</a></li>
<li><a href="#应用部署" id="toc-应用部署"><span
class="toc-section-number">1.8.2</span> 6.2 应用部署</a>
<ul>
<li><a href="#数据库部署" id="toc-数据库部署"><span
class="toc-section-number">1.8.2.1</span> 6.2.1 数据库部署</a></li>
<li><a href="#应用服务部署" id="toc-应用服务部署"><span
class="toc-section-number">1.8.2.2</span> 6.2.2 应用服务部署</a></li>
<li><a href="#web服务部署" id="toc-web服务部署"><span
class="toc-section-number">1.8.2.3</span> 6.2.3 Web服务部署</a></li>
</ul></li>
<li><a href="#系统联调" id="toc-系统联调"><span
class="toc-section-number">1.8.3</span> 6.3 系统联调</a></li>
<li><a href="#系统上线" id="toc-系统上线"><span
class="toc-section-number">1.8.4</span> 6.4 系统上线</a></li>
</ul></li>
<li><a href="#监控与运维" id="toc-监控与运维"><span
class="toc-section-number">1.9</span> 7. 监控与运维</a>
<ul>
<li><a href="#监控系统" id="toc-监控系统"><span
class="toc-section-number">1.9.1</span> 7.1 监控系统</a>
<ul>
<li><a href="#基础设施监控" id="toc-基础设施监控"><span
class="toc-section-number">1.9.1.1</span> 7.1.1 基础设施监控</a></li>
<li><a href="#应用监控" id="toc-应用监控"><span
class="toc-section-number">1.9.1.2</span> 7.1.2 应用监控</a></li>
<li><a href="#数据库监控" id="toc-数据库监控"><span
class="toc-section-number">1.9.1.3</span> 7.1.3 数据库监控</a></li>
</ul></li>
<li><a href="#运维管理" id="toc-运维管理"><span
class="toc-section-number">1.9.2</span> 7.2 运维管理</a>
<ul>
<li><a href="#日常运维" id="toc-日常运维"><span
class="toc-section-number">1.9.2.1</span> 7.2.1 日常运维</a></li>
<li><a href="#变更管理" id="toc-变更管理"><span
class="toc-section-number">1.9.2.2</span> 7.2.2 变更管理</a></li>
<li><a href="#故障管理" id="toc-故障管理"><span
class="toc-section-number">1.9.2.3</span> 7.2.3 故障管理</a></li>
<li><a href="#应急预案" id="toc-应急预案"><span
class="toc-section-number">1.9.2.4</span> 7.2.4 应急预案</a></li>
</ul></li>
</ul></li>
<li><a href="#容器化部署方案" id="toc-容器化部署方案"><span
class="toc-section-number">1.10</span> 8. 容器化部署方案</a>
<ul>
<li><a href="#docker-compose部署" id="toc-docker-compose部署"><span
class="toc-section-number">1.10.1</span> 8.1 Docker Compose部署</a>
<ul>
<li><a href="#完整部署配置" id="toc-完整部署配置"><span
class="toc-section-number">1.10.1.1</span> 8.1.1 完整部署配置</a></li>
<li><a href="#后端应用dockerfile" id="toc-后端应用dockerfile"><span
class="toc-section-number">1.10.1.2</span> 8.1.2
后端应用Dockerfile</a></li>
<li><a href="#前端应用dockerfile" id="toc-前端应用dockerfile"><span
class="toc-section-number">1.10.1.3</span> 8.1.3
前端应用Dockerfile</a></li>
</ul></li>
<li><a href="#docker-compose高级配置"
id="toc-docker-compose高级配置"><span
class="toc-section-number">1.10.2</span> 8.2 Docker Compose高级配置</a>
<ul>
<li><a href="#生产环境配置优化" id="toc-生产环境配置优化"><span
class="toc-section-number">1.10.2.1</span> 8.2.1
生产环境配置优化</a></li>
<li><a href="#环境变量配置" id="toc-环境变量配置"><span
class="toc-section-number">1.10.2.2</span> 8.2.2 环境变量配置</a></li>
<li><a href="#监控集成" id="toc-监控集成"><span
class="toc-section-number">1.10.2.3</span> 8.2.3 监控集成</a></li>
</ul></li>
<li><a href="#自动化部署脚本" id="toc-自动化部署脚本"><span
class="toc-section-number">1.10.3</span> 8.3 自动化部署脚本</a>
<ul>
<li><a href="#docker部署脚本" id="toc-docker部署脚本"><span
class="toc-section-number">1.10.3.1</span> 8.3.1 Docker部署脚本</a></li>
<li><a href="#生产环境部署脚本" id="toc-生产环境部署脚本"><span
class="toc-section-number">1.10.3.2</span> 8.3.2
生产环境部署脚本</a></li>
</ul></li>
<li><a href="#持续集成持续部署-cicd"
id="toc-持续集成持续部署-cicd"><span
class="toc-section-number">1.10.4</span> 8.4 持续集成/持续部署
(CI/CD)</a>
<ul>
<li><a href="#github-actions配置" id="toc-github-actions配置"><span
class="toc-section-number">1.10.4.1</span> 8.4.1 GitHub
Actions配置</a></li>
</ul></li>
</ul></li>
</ul></li>
</ul>
</nav>
<h1 data-number="1" id="福建水务营收系统部署设计文档"><span
class="header-section-number">1</span> 福建水务营收系统部署设计文档</h1>
<h2 data-number="1.1" id="文档信息"><span
class="header-section-number">1.1</span> 文档信息</h2>
<table>
<thead>
<tr>
<th>项目信息</th>
<th>详情</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>项目名称</strong></td>
<td>福建水务营收系统</td>
</tr>
<tr>
<td><strong>文档类型</strong></td>
<td>概要设计文档</td>
</tr>
<tr>
<td><strong>技术框架</strong></td>
<td>RuoYi-Vue-Pro + yudao-ui-admin-vue3</td>
</tr>
<tr>
<td><strong>文档版本</strong></td>
<td>v1.0</td>
</tr>
<tr>
<td><strong>编写日期</strong></td>
<td>2024-12-19</td>
</tr>
<tr>
<td><strong>文档状态</strong></td>
<td>✅ 已完成</td>
</tr>
</tbody>
</table>
<h2 data-number="1.2" id="目录"><span
class="header-section-number">1.2</span> 目录</h2>
<ul>
<li><a href="#1-部署概述">1. 部署概述</a></li>
<li><a href="#2-部署架构">2. 部署架构</a></li>
<li><a href="#3-服务器配置">3. 服务器配置</a></li>
<li><a href="#4-网络架构">4. 网络架构</a></li>
<li><a href="#5-安全设计">5. 安全设计</a></li>
<li><a href="#6-部署流程">6. 部署流程</a></li>
<li><a href="#7-监控与运维">7. 监控与运维</a></li>
</ul>
<h2 data-number="1.3" id="部署概述"><span
class="header-section-number">1.3</span> 1. 部署概述</h2>
<p>福建水务业务系统采用集中化部署模式,基于集团私有云环境进行部署,构建高可用、可扩展的系统架构,满足集团及下属各水务公司的业务需求。</p>
<h3 data-number="1.3.1" id="部署目标"><span
class="header-section-number">1.3.1</span> 1.1 部署目标</h3>
<ul>
<li>实现系统的集中部署和统一管理</li>
<li>确保系统高可用性和可靠性</li>
<li>支持业务动态扩展和弹性伸缩</li>
<li>保障数据安全和业务连续性</li>
<li>降低运维成本,提高管理效率</li>
</ul>
<h3 data-number="1.3.2" id="部署原则"><span
class="header-section-number">1.3.2</span> 1.2 部署原则</h3>
<ul>
<li><strong>集中部署</strong>:核心业务系统集中部署在集团数据中心,统一管理和维护</li>
<li><strong>多级架构</strong>:采用多级架构设计,实现前端负载分担和后端高可用</li>
<li><strong>灾备设计</strong>:重要系统和数据实现灾备,确保业务连续性</li>
<li><strong>安全防护</strong>:多层次安全防护体系,确保系统和数据安全</li>
<li><strong>弹性扩展</strong>:支持系统横向和纵向扩展,适应业务增长需求</li>
</ul>
<h2 data-number="1.4" id="部署架构"><span
class="header-section-number">1.4</span> 2. 部署架构</h2>
<h3 data-number="1.4.1" id="总体部署架构"><span
class="header-section-number">1.4.1</span> 2.1 总体部署架构</h3>
<p>福建水务业务系统采用三层架构部署:</p>
<ul>
<li><strong>接入层</strong>:负责外部访问请求的接入和负载均衡</li>
<li><strong>应用层</strong>:部署业务应用服务,处理业务逻辑</li>
<li><strong>数据层</strong>:部署数据库服务,存储业务数据</li>
</ul>
<p>系统部署采用集群模式,各层均部署多个节点,实现高可用和负载均衡。</p>
<h3 data-number="1.4.2" id="生产环境部署架构"><span
class="header-section-number">1.4.2</span> 2.2 生产环境部署架构</h3>
<p>生产环境采用双机房部署方案,包括主生产环境和灾备环境:</p>
<h4 data-number="1.4.2.1" id="主生产环境"><span
class="header-section-number">1.4.2.1</span> 2.2.1 主生产环境</h4>
<p>主生产环境部署在集团主数据中心,包括:</p>
<ul>
<li>负载均衡集群2台负载均衡服务器</li>
<li>Web服务器集群4台Web服务器</li>
<li>应用服务器集群6台应用服务器</li>
<li>数据库服务器集群2台主备数据库服务器</li>
<li>文件服务器2台主备文件服务器</li>
<li>缓存服务器集群2台缓存服务器</li>
</ul>
<h4 data-number="1.4.2.2" id="灾备环境"><span
class="header-section-number">1.4.2.2</span> 2.2.2 灾备环境</h4>
<p>灾备环境部署在集团备用数据中心,包括:</p>
<ul>
<li>负载均衡服务器1台</li>
<li>Web服务器2台</li>
<li>应用服务器3台</li>
<li>数据库服务器1台</li>
<li>文件服务器1台</li>
<li>缓存服务器1台</li>
</ul>
<h3 data-number="1.4.3" id="测试环境部署架构"><span
class="header-section-number">1.4.3</span> 2.3 测试环境部署架构</h3>
<p>测试环境部署在集团测试中心,用于系统测试和验证,包括:</p>
<ul>
<li>Web服务器1台</li>
<li>应用服务器2台</li>
<li>数据库服务器1台</li>
<li>文件服务器1台</li>
</ul>
<h3 data-number="1.4.4" id="开发环境部署架构"><span
class="header-section-number">1.4.4</span> 2.4 开发环境部署架构</h3>
<p>开发环境部署在开发中心,用于系统开发和集成测试,包括:</p>
<ul>
<li>应用服务器1台</li>
<li>数据库服务器1台</li>
</ul>
<h2 data-number="1.5" id="服务器配置"><span
class="header-section-number">1.5</span> 3. 服务器配置</h2>
<h3 data-number="1.5.1" id="硬件配置要求"><span
class="header-section-number">1.5.1</span> 3.1 硬件配置要求</h3>
<h4 data-number="1.5.1.1" id="负载均衡服务器"><span
class="header-section-number">1.5.1.1</span> 3.1.1 负载均衡服务器</h4>
<ul>
<li>CPU8核</li>
<li>内存16GB</li>
<li>存储100GB SSD</li>
<li>网卡:双千兆网卡</li>
</ul>
<h4 data-number="1.5.1.2" id="web服务器"><span
class="header-section-number">1.5.1.2</span> 3.1.2 Web服务器</h4>
<ul>
<li>CPU8核</li>
<li>内存16GB</li>
<li>存储200GB SSD</li>
<li>网卡:双千兆网卡</li>
</ul>
<h4 data-number="1.5.1.3" id="应用服务器"><span
class="header-section-number">1.5.1.3</span> 3.1.3 应用服务器</h4>
<ul>
<li>CPU16核</li>
<li>内存32GB</li>
<li>存储300GB SSD</li>
<li>网卡:双千兆网卡</li>
</ul>
<h4 data-number="1.5.1.4" id="数据库服务器"><span
class="header-section-number">1.5.1.4</span> 3.1.4 数据库服务器</h4>
<ul>
<li>CPU24核</li>
<li>内存64GB</li>
<li>存储2TB SSD (RAID 10)</li>
<li>网卡:双万兆网卡</li>
</ul>
<h4 data-number="1.5.1.5" id="文件服务器"><span
class="header-section-number">1.5.1.5</span> 3.1.5 文件服务器</h4>
<ul>
<li>CPU8核</li>
<li>内存16GB</li>
<li>存储4TB (RAID 5)</li>
<li>网卡:双千兆网卡</li>
</ul>
<h4 data-number="1.5.1.6" id="缓存服务器"><span
class="header-section-number">1.5.1.6</span> 3.1.6 缓存服务器</h4>
<ul>
<li>CPU8核</li>
<li>内存32GB</li>
<li>存储100GB SSD</li>
<li>网卡:双千兆网卡</li>
</ul>
<h3 data-number="1.5.2" id="软件配置要求"><span
class="header-section-number">1.5.2</span> 3.2 软件配置要求</h3>
<h4 data-number="1.5.2.1" id="操作系统"><span
class="header-section-number">1.5.2.1</span> 3.2.1 操作系统</h4>
<ul>
<li>服务端CentOS 7+、Ubuntu 18.04+或其他国产Linux发行版</li>
<li>客户端支持Windows、macOS、Linux等现代操作系统</li>
</ul>
<h4 data-number="1.5.2.2" id="数据库"><span
class="header-section-number">1.5.2.2</span> 3.2.2 数据库</h4>
<ul>
<li>OpenGauss 5.0+(推荐,国产自主可控)</li>
<li>兼容PostgreSQL 13+、MySQL 8.0+</li>
</ul>
<h4 data-number="1.5.2.3" id="应用服务器-1"><span
class="header-section-number">1.5.2.3</span> 3.2.3 应用服务器</h4>
<ul>
<li>JDK 17或JDK 21兼容支持JDK 8</li>
<li>Apache Tomcat 9.0+或内嵌Tomcat</li>
<li>Nginx 1.18+(作为前端静态资源服务器和反向代理)</li>
</ul>
<h4 data-number="1.5.2.4" id="缓存服务器-1"><span
class="header-section-number">1.5.2.4</span> 3.2.4 缓存服务器</h4>
<ul>
<li>Redis 5.0+或Redis集群</li>
</ul>
<h4 data-number="1.5.2.5" id="中间件"><span
class="header-section-number">1.5.2.5</span> 3.2.5 中间件</h4>
<ul>
<li>消息队列基于Redis的轻量级队列可选</li>
<li>分布式任务调度Quartz集群</li>
<li>工作流引擎Flowable 6.x</li>
<li>文件存储支持本地存储、MinIO、阿里云OSS等</li>
</ul>
<h4 data-number="1.5.2.6" id="前端环境"><span
class="header-section-number">1.5.2.6</span> 3.2.6 前端环境</h4>
<ul>
<li>Node.js 16+</li>
<li>NPM 8+或Yarn 1.22+</li>
<li>Vue 3.x</li>
<li>Element Plus</li>
</ul>
<h2 data-number="1.6" id="网络架构"><span
class="header-section-number">1.6</span> 4. 网络架构</h2>
<h3 data-number="1.6.1" id="网络拓扑"><span
class="header-section-number">1.6.1</span> 4.1 网络拓扑</h3>
<p>福建水务业务系统网络架构采用三层网络结构:</p>
<ul>
<li><strong>接入层</strong>:对外提供服务接入,部署防火墙、负载均衡等设备</li>
<li><strong>核心层</strong>:实现业务系统间的互联互通,部署核心交换机</li>
<li><strong>服务层</strong>:部署各类服务器,实现业务处理和数据存储</li>
</ul>
<h3 data-number="1.6.2" id="网络安全区域划分"><span
class="header-section-number">1.6.2</span> 4.2 网络安全区域划分</h3>
<p>网络安全区域划分为以下几个区域:</p>
<ul>
<li><strong>DMZ区</strong>部署面向外部的Web服务器与内网隔离</li>
<li><strong>应用区</strong>:部署业务应用服务器</li>
<li><strong>数据区</strong>:部署数据库服务器和文件服务器</li>
<li><strong>管理区</strong>:部署运维管理服务器</li>
</ul>
<h3 data-number="1.6.3" id="网络带宽配置"><span
class="header-section-number">1.6.3</span> 4.3 网络带宽配置</h3>
<ul>
<li>外网接入带宽100Mbps根据实际需求可升级</li>
<li>内网骨干带宽1000Mbps</li>
<li>服务器接入带宽1000Mbps</li>
<li>数据中心间专线带宽100Mbps</li>
</ul>
<h2 data-number="1.7" id="安全设计"><span
class="header-section-number">1.7</span> 5. 安全设计</h2>
<h3 data-number="1.7.1" id="网络安全"><span
class="header-section-number">1.7.1</span> 5.1 网络安全</h3>
<h4 data-number="1.7.1.1" id="边界安全"><span
class="header-section-number">1.7.1.1</span> 5.1.1 边界安全</h4>
<ul>
<li>部署高性能防火墙,实现网络隔离</li>
<li>部署入侵检测系统(IDS)和入侵防御系统(IPS)</li>
<li>部署Web应用防火墙(WAF)防御Web应用攻击</li>
<li>采用VPN技术保障远程访问安全</li>
</ul>
<h4 data-number="1.7.1.2" id="内网安全"><span
class="header-section-number">1.7.1.2</span> 5.1.2 内网安全</h4>
<ul>
<li>网络安全区域划分,实现不同级别网络隔离</li>
<li>内网访问控制,限制不必要的网络访问</li>
<li>内网流量监控,及时发现异常流量</li>
</ul>
<h3 data-number="1.7.2" id="系统安全"><span
class="header-section-number">1.7.2</span> 5.2 系统安全</h3>
<h4 data-number="1.7.2.1" id="主机安全"><span
class="header-section-number">1.7.2.1</span> 5.2.1 主机安全</h4>
<ul>
<li>操作系统安全加固,关闭不必要的服务和端口</li>
<li>系统补丁及时更新,修复安全漏洞</li>
<li>部署主机防病毒软件,防御恶意代码</li>
<li>主机审计和日志管理,记录重要操作</li>
</ul>
<h4 data-number="1.7.2.2" id="应用安全"><span
class="header-section-number">1.7.2.2</span> 5.2.2 应用安全</h4>
<ul>
<li>应用访问控制,基于角色的权限管理</li>
<li>应用操作审计,记录重要业务操作</li>
<li>数据传输加密,保护敏感信息</li>
<li>输入验证防止SQL注入、XSS等攻击</li>
</ul>
<h3 data-number="1.7.3" id="数据安全"><span
class="header-section-number">1.7.3</span> 5.3 数据安全</h3>
<h4 data-number="1.7.3.1" id="数据存储安全"><span
class="header-section-number">1.7.3.1</span> 5.3.1 数据存储安全</h4>
<ul>
<li>数据库访问控制,限制数据库访问权限</li>
<li>敏感数据加密存储,防止数据泄露</li>
<li>数据库审计,记录重要数据操作</li>
</ul>
<h4 data-number="1.7.3.2" id="数据备份与恢复"><span
class="header-section-number">1.7.3.2</span> 5.3.2 数据备份与恢复</h4>
<ul>
<li>定期数据备份,每日增量备份,每周全量备份</li>
<li>备份数据异地存储,防止灾难性事件导致数据丢失</li>
<li>定期演练数据恢复,确保备份数据可用</li>
</ul>
<h2 data-number="1.8" id="部署流程"><span
class="header-section-number">1.8</span> 6. 部署流程</h2>
<h3 data-number="1.8.1" id="部署准备"><span
class="header-section-number">1.8.1</span> 6.1 部署准备</h3>
<ul>
<li>服务器硬件准备和上架</li>
<li>网络环境配置和测试</li>
<li>操作系统安装和配置</li>
<li>基础软件安装和配置</li>
</ul>
<h3 data-number="1.8.2" id="应用部署"><span
class="header-section-number">1.8.2</span> 6.2 应用部署</h3>
<h4 data-number="1.8.2.1" id="数据库部署"><span
class="header-section-number">1.8.2.1</span> 6.2.1 数据库部署</h4>
<ul>
<li>数据库服务器配置</li>
<li>数据库实例创建和配置</li>
<li>数据库高可用配置</li>
<li>数据备份策略配置</li>
</ul>
<h4 data-number="1.8.2.2" id="应用服务部署"><span
class="header-section-number">1.8.2.2</span> 6.2.2 应用服务部署</h4>
<ul>
<li>应用服务器配置</li>
<li>应用程序部署</li>
<li>应用服务参数配置</li>
<li>应用服务高可用配置</li>
</ul>
<h4 data-number="1.8.2.3" id="web服务部署"><span
class="header-section-number">1.8.2.3</span> 6.2.3 Web服务部署</h4>
<ul>
<li>Web服务器配置</li>
<li>Web应用部署</li>
<li>Web服务参数配置</li>
<li>负载均衡配置</li>
</ul>
<h3 data-number="1.8.3" id="系统联调"><span
class="header-section-number">1.8.3</span> 6.3 系统联调</h3>
<ul>
<li>各组件功能测试</li>
<li>系统整体联调测试</li>
<li>性能和压力测试</li>
<li>高可用性测试</li>
</ul>
<h3 data-number="1.8.4" id="系统上线"><span
class="header-section-number">1.8.4</span> 6.4 系统上线</h3>
<ul>
<li>制定上线计划</li>
<li>系统割接准备</li>
<li>系统割接实施</li>
<li>系统运行监控</li>
</ul>
<h2 data-number="1.9" id="监控与运维"><span
class="header-section-number">1.9</span> 7. 监控与运维</h2>
<h3 data-number="1.9.1" id="监控系统"><span
class="header-section-number">1.9.1</span> 7.1 监控系统</h3>
<h4 data-number="1.9.1.1" id="基础设施监控"><span
class="header-section-number">1.9.1.1</span> 7.1.1 基础设施监控</h4>
<ul>
<li>服务器硬件监控CPU、内存、磁盘、网络等</li>
<li>网络设备监控:带宽使用率、连接状态等</li>
<li>操作系统监控:系统负载、进程状态等</li>
</ul>
<h4 data-number="1.9.1.2" id="应用监控"><span
class="header-section-number">1.9.1.2</span> 7.1.2 应用监控</h4>
<ul>
<li>应用服务状态监控</li>
<li>应用性能监控:响应时间、并发数等</li>
<li>业务监控:重要业务指标监控</li>
</ul>
<h4 data-number="1.9.1.3" id="数据库监控"><span
class="header-section-number">1.9.1.3</span> 7.1.3 数据库监控</h4>
<ul>
<li>数据库服务状态监控</li>
<li>数据库性能监控CPU使用率、内存使用率、IO性能等</li>
<li>SQL执行监控慢查询、锁等待等</li>
</ul>
<h3 data-number="1.9.2" id="运维管理"><span
class="header-section-number">1.9.2</span> 7.2 运维管理</h3>
<h4 data-number="1.9.2.1" id="日常运维"><span
class="header-section-number">1.9.2.1</span> 7.2.1 日常运维</h4>
<ul>
<li>系统日常巡检</li>
<li>系统性能优化</li>
<li>系统容量管理</li>
<li>系统备份管理</li>
</ul>
<h4 data-number="1.9.2.2" id="变更管理"><span
class="header-section-number">1.9.2.2</span> 7.2.2 变更管理</h4>
<ul>
<li>变更申请和审批</li>
<li>变更实施和验证</li>
<li>变更回退预案</li>
<li>变更记录管理</li>
</ul>
<h4 data-number="1.9.2.3" id="故障管理"><span
class="header-section-number">1.9.2.3</span> 7.2.3 故障管理</h4>
<ul>
<li>故障监控和告警</li>
<li>故障处理流程</li>
<li>故障升级机制</li>
<li>故障复盘和改进</li>
</ul>
<h4 data-number="1.9.2.4" id="应急预案"><span
class="header-section-number">1.9.2.4</span> 7.2.4 应急预案</h4>
<ul>
<li>系统宕机应急预案</li>
<li>网络故障应急预案</li>
<li>数据丢失应急预案</li>
<li>安全事件应急预案</li>
</ul>
<h2 data-number="1.10" id="容器化部署方案"><span
class="header-section-number">1.10</span> 8. 容器化部署方案</h2>
<h3 data-number="1.10.1" id="docker-compose部署"><span
class="header-section-number">1.10.1</span> 8.1 Docker Compose部署</h3>
<h4 data-number="1.10.1.1" id="完整部署配置"><span
class="header-section-number">1.10.1.1</span> 8.1.1 完整部署配置</h4>
<div class="sourceCode" id="cb1"><pre
class="sourceCode yaml"><code class="sourceCode yaml"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="co"># docker-compose.yml</span></span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a><span class="fu">version</span><span class="kw">:</span><span class="at"> </span><span class="st">&#39;3.8&#39;</span></span>
<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a><span class="fu">services</span><span class="kw">:</span></span>
<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a><span class="co"> # OpenGauss 数据库</span></span>
<span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">water-opengauss</span><span class="kw">:</span></span>
<span id="cb1-7"><a href="#cb1-7" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">image</span><span class="kw">:</span><span class="at"> enmotech/opengauss:5.0.0</span></span>
<span id="cb1-8"><a href="#cb1-8" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">container_name</span><span class="kw">:</span><span class="at"> water-opengauss</span></span>
<span id="cb1-9"><a href="#cb1-9" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">restart</span><span class="kw">:</span><span class="at"> always</span></span>
<span id="cb1-10"><a href="#cb1-10" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">environment</span><span class="kw">:</span></span>
<span id="cb1-11"><a href="#cb1-11" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">GS_PASSWORD</span><span class="kw">:</span><span class="at"> </span><span class="st">&quot;Water@2024&quot;</span></span>
<span id="cb1-12"><a href="#cb1-12" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">GS_DB</span><span class="kw">:</span><span class="at"> </span><span class="st">&quot;ruoyi_water&quot;</span></span>
<span id="cb1-13"><a href="#cb1-13" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">GS_USERNAME</span><span class="kw">:</span><span class="at"> </span><span class="st">&quot;water_user&quot;</span></span>
<span id="cb1-14"><a href="#cb1-14" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">TZ</span><span class="kw">:</span><span class="at"> </span><span class="st">&quot;Asia/Shanghai&quot;</span></span>
<span id="cb1-15"><a href="#cb1-15" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">volumes</span><span class="kw">:</span></span>
<span id="cb1-16"><a href="#cb1-16" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> ./data/opengauss:/var/lib/opengauss</span></span>
<span id="cb1-17"><a href="#cb1-17" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> ./sql:/docker-entrypoint-initdb.d</span></span>
<span id="cb1-18"><a href="#cb1-18" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> ./config/opengauss:/opt/opengauss/config</span></span>
<span id="cb1-19"><a href="#cb1-19" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">ports</span><span class="kw">:</span></span>
<span id="cb1-20"><a href="#cb1-20" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> </span><span class="st">&quot;5432:5432&quot;</span></span>
<span id="cb1-21"><a href="#cb1-21" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">networks</span><span class="kw">:</span></span>
<span id="cb1-22"><a href="#cb1-22" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> water-network</span></span>
<span id="cb1-23"><a href="#cb1-23" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">healthcheck</span><span class="kw">:</span></span>
<span id="cb1-24"><a href="#cb1-24" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">test</span><span class="kw">:</span><span class="at"> </span><span class="kw">[</span><span class="st">&quot;CMD-SHELL&quot;</span><span class="kw">,</span><span class="at"> </span><span class="st">&quot;gs_ctl status -D /var/lib/opengauss/data&quot;</span><span class="kw">]</span></span>
<span id="cb1-25"><a href="#cb1-25" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">interval</span><span class="kw">:</span><span class="at"> 30s</span></span>
<span id="cb1-26"><a href="#cb1-26" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">timeout</span><span class="kw">:</span><span class="at"> 10s</span></span>
<span id="cb1-27"><a href="#cb1-27" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">retries</span><span class="kw">:</span><span class="at"> </span><span class="dv">3</span></span>
<span id="cb1-28"><a href="#cb1-28" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-29"><a href="#cb1-29" aria-hidden="true" tabindex="-1"></a><span class="co"> # Redis 缓存</span></span>
<span id="cb1-30"><a href="#cb1-30" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">water-redis</span><span class="kw">:</span></span>
<span id="cb1-31"><a href="#cb1-31" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">image</span><span class="kw">:</span><span class="at"> redis:7.0-alpine</span></span>
<span id="cb1-32"><a href="#cb1-32" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">container_name</span><span class="kw">:</span><span class="at"> water-redis</span></span>
<span id="cb1-33"><a href="#cb1-33" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">restart</span><span class="kw">:</span><span class="at"> always</span></span>
<span id="cb1-34"><a href="#cb1-34" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">volumes</span><span class="kw">:</span></span>
<span id="cb1-35"><a href="#cb1-35" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> ./data/redis:/data</span></span>
<span id="cb1-36"><a href="#cb1-36" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> ./config/redis/redis.conf:/etc/redis/redis.conf</span></span>
<span id="cb1-37"><a href="#cb1-37" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">ports</span><span class="kw">:</span></span>
<span id="cb1-38"><a href="#cb1-38" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> </span><span class="st">&quot;6379:6379&quot;</span></span>
<span id="cb1-39"><a href="#cb1-39" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">command</span><span class="kw">:</span><span class="at"> redis-server /etc/redis/redis.conf</span></span>
<span id="cb1-40"><a href="#cb1-40" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">networks</span><span class="kw">:</span></span>
<span id="cb1-41"><a href="#cb1-41" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> water-network</span></span>
<span id="cb1-42"><a href="#cb1-42" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-43"><a href="#cb1-43" aria-hidden="true" tabindex="-1"></a><span class="co"> # 后端应用</span></span>
<span id="cb1-44"><a href="#cb1-44" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">water-server</span><span class="kw">:</span></span>
<span id="cb1-45"><a href="#cb1-45" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">build</span><span class="kw">:</span></span>
<span id="cb1-46"><a href="#cb1-46" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">context</span><span class="kw">:</span><span class="at"> ./water-server</span></span>
<span id="cb1-47"><a href="#cb1-47" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">dockerfile</span><span class="kw">:</span><span class="at"> Dockerfile</span></span>
<span id="cb1-48"><a href="#cb1-48" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">container_name</span><span class="kw">:</span><span class="at"> water-server</span></span>
<span id="cb1-49"><a href="#cb1-49" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">restart</span><span class="kw">:</span><span class="at"> always</span></span>
<span id="cb1-50"><a href="#cb1-50" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">depends_on</span><span class="kw">:</span></span>
<span id="cb1-51"><a href="#cb1-51" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> water-opengauss</span></span>
<span id="cb1-52"><a href="#cb1-52" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> water-redis</span></span>
<span id="cb1-53"><a href="#cb1-53" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">environment</span><span class="kw">:</span></span>
<span id="cb1-54"><a href="#cb1-54" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> SPRING_PROFILES_ACTIVE=prod</span></span>
<span id="cb1-55"><a href="#cb1-55" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> SPRING_DATASOURCE_URL=jdbc:opengauss://water-opengauss:5432/ruoyi_water?useUnicode=true&amp;characterEncoding=utf8&amp;zeroDateTimeBehavior=convertToNull&amp;useSSL=false&amp;serverTimezone=GMT%2B8</span></span>
<span id="cb1-56"><a href="#cb1-56" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> SPRING_DATASOURCE_USERNAME=water_user</span></span>
<span id="cb1-57"><a href="#cb1-57" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> SPRING_DATASOURCE_PASSWORD=Water@2024</span></span>
<span id="cb1-58"><a href="#cb1-58" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> SPRING_REDIS_HOST=water-redis</span></span>
<span id="cb1-59"><a href="#cb1-59" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> SPRING_REDIS_PORT=6379</span></span>
<span id="cb1-60"><a href="#cb1-60" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> SERVER_PORT=8080</span></span>
<span id="cb1-61"><a href="#cb1-61" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">volumes</span><span class="kw">:</span></span>
<span id="cb1-62"><a href="#cb1-62" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> ./logs:/app/logs</span></span>
<span id="cb1-63"><a href="#cb1-63" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> ./upload:/app/upload</span></span>
<span id="cb1-64"><a href="#cb1-64" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">ports</span><span class="kw">:</span></span>
<span id="cb1-65"><a href="#cb1-65" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> </span><span class="st">&quot;8080:8080&quot;</span></span>
<span id="cb1-66"><a href="#cb1-66" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">networks</span><span class="kw">:</span></span>
<span id="cb1-67"><a href="#cb1-67" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> water-network</span></span>
<span id="cb1-68"><a href="#cb1-68" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-69"><a href="#cb1-69" aria-hidden="true" tabindex="-1"></a><span class="co"> # 前端应用</span></span>
<span id="cb1-70"><a href="#cb1-70" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">water-ui</span><span class="kw">:</span></span>
<span id="cb1-71"><a href="#cb1-71" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">build</span><span class="kw">:</span></span>
<span id="cb1-72"><a href="#cb1-72" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">context</span><span class="kw">:</span><span class="at"> ./water-ui</span></span>
<span id="cb1-73"><a href="#cb1-73" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">dockerfile</span><span class="kw">:</span><span class="at"> Dockerfile</span></span>
<span id="cb1-74"><a href="#cb1-74" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">container_name</span><span class="kw">:</span><span class="at"> water-ui</span></span>
<span id="cb1-75"><a href="#cb1-75" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">restart</span><span class="kw">:</span><span class="at"> always</span></span>
<span id="cb1-76"><a href="#cb1-76" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">depends_on</span><span class="kw">:</span></span>
<span id="cb1-77"><a href="#cb1-77" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> water-server</span></span>
<span id="cb1-78"><a href="#cb1-78" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">volumes</span><span class="kw">:</span></span>
<span id="cb1-79"><a href="#cb1-79" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> ./config/nginx/nginx.conf:/etc/nginx/nginx.conf</span></span>
<span id="cb1-80"><a href="#cb1-80" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> ./config/nginx/conf.d:/etc/nginx/conf.d</span></span>
<span id="cb1-81"><a href="#cb1-81" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">ports</span><span class="kw">:</span></span>
<span id="cb1-82"><a href="#cb1-82" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> </span><span class="st">&quot;80:80&quot;</span></span>
<span id="cb1-83"><a href="#cb1-83" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> </span><span class="st">&quot;443:443&quot;</span></span>
<span id="cb1-84"><a href="#cb1-84" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">networks</span><span class="kw">:</span></span>
<span id="cb1-85"><a href="#cb1-85" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> water-network</span></span>
<span id="cb1-86"><a href="#cb1-86" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-87"><a href="#cb1-87" aria-hidden="true" tabindex="-1"></a><span class="co"> # Nginx 反向代理</span></span>
<span id="cb1-88"><a href="#cb1-88" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">water-nginx</span><span class="kw">:</span></span>
<span id="cb1-89"><a href="#cb1-89" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">image</span><span class="kw">:</span><span class="at"> nginx:1.24-alpine</span></span>
<span id="cb1-90"><a href="#cb1-90" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">container_name</span><span class="kw">:</span><span class="at"> water-nginx</span></span>
<span id="cb1-91"><a href="#cb1-91" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">restart</span><span class="kw">:</span><span class="at"> always</span></span>
<span id="cb1-92"><a href="#cb1-92" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">depends_on</span><span class="kw">:</span></span>
<span id="cb1-93"><a href="#cb1-93" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> water-server</span></span>
<span id="cb1-94"><a href="#cb1-94" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> water-ui</span></span>
<span id="cb1-95"><a href="#cb1-95" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">volumes</span><span class="kw">:</span></span>
<span id="cb1-96"><a href="#cb1-96" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> ./config/nginx/nginx.conf:/etc/nginx/nginx.conf</span></span>
<span id="cb1-97"><a href="#cb1-97" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> ./config/nginx/conf.d:/etc/nginx/conf.d</span></span>
<span id="cb1-98"><a href="#cb1-98" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> ./ssl:/etc/nginx/ssl</span></span>
<span id="cb1-99"><a href="#cb1-99" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> ./logs/nginx:/var/log/nginx</span></span>
<span id="cb1-100"><a href="#cb1-100" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">ports</span><span class="kw">:</span></span>
<span id="cb1-101"><a href="#cb1-101" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> </span><span class="st">&quot;80:80&quot;</span></span>
<span id="cb1-102"><a href="#cb1-102" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> </span><span class="st">&quot;443:443&quot;</span></span>
<span id="cb1-103"><a href="#cb1-103" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">networks</span><span class="kw">:</span></span>
<span id="cb1-104"><a href="#cb1-104" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> water-network</span></span>
<span id="cb1-105"><a href="#cb1-105" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-106"><a href="#cb1-106" aria-hidden="true" tabindex="-1"></a><span class="co"> # MinIO 文件存储</span></span>
<span id="cb1-107"><a href="#cb1-107" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">water-minio</span><span class="kw">:</span></span>
<span id="cb1-108"><a href="#cb1-108" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">image</span><span class="kw">:</span><span class="at"> minio/minio:latest</span></span>
<span id="cb1-109"><a href="#cb1-109" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">container_name</span><span class="kw">:</span><span class="at"> water-minio</span></span>
<span id="cb1-110"><a href="#cb1-110" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">restart</span><span class="kw">:</span><span class="at"> always</span></span>
<span id="cb1-111"><a href="#cb1-111" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">environment</span><span class="kw">:</span></span>
<span id="cb1-112"><a href="#cb1-112" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">MINIO_ACCESS_KEY</span><span class="kw">:</span><span class="at"> </span><span class="st">&quot;admin&quot;</span></span>
<span id="cb1-113"><a href="#cb1-113" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">MINIO_SECRET_KEY</span><span class="kw">:</span><span class="at"> </span><span class="st">&quot;admin123456&quot;</span></span>
<span id="cb1-114"><a href="#cb1-114" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">volumes</span><span class="kw">:</span></span>
<span id="cb1-115"><a href="#cb1-115" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> ./data/minio:/data</span></span>
<span id="cb1-116"><a href="#cb1-116" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">ports</span><span class="kw">:</span></span>
<span id="cb1-117"><a href="#cb1-117" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> </span><span class="st">&quot;9000:9000&quot;</span></span>
<span id="cb1-118"><a href="#cb1-118" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> </span><span class="st">&quot;9001:9001&quot;</span></span>
<span id="cb1-119"><a href="#cb1-119" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">command</span><span class="kw">:</span><span class="at"> server /data --console-address &quot;:9001&quot;</span></span>
<span id="cb1-120"><a href="#cb1-120" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">networks</span><span class="kw">:</span></span>
<span id="cb1-121"><a href="#cb1-121" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> water-network</span></span>
<span id="cb1-122"><a href="#cb1-122" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-123"><a href="#cb1-123" aria-hidden="true" tabindex="-1"></a><span class="fu">networks</span><span class="kw">:</span></span>
<span id="cb1-124"><a href="#cb1-124" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">water-network</span><span class="kw">:</span></span>
<span id="cb1-125"><a href="#cb1-125" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">driver</span><span class="kw">:</span><span class="at"> bridge</span></span>
<span id="cb1-126"><a href="#cb1-126" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-127"><a href="#cb1-127" aria-hidden="true" tabindex="-1"></a><span class="fu">volumes</span><span class="kw">:</span></span>
<span id="cb1-128"><a href="#cb1-128" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">opengauss-data</span><span class="kw">:</span></span>
<span id="cb1-129"><a href="#cb1-129" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">redis-data</span><span class="kw">:</span></span>
<span id="cb1-130"><a href="#cb1-130" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">minio-data</span><span class="kw">:</span></span></code></pre></div>
<h4 data-number="1.10.1.2" id="后端应用dockerfile"><span
class="header-section-number">1.10.1.2</span> 8.1.2
后端应用Dockerfile</h4>
<div class="sourceCode" id="cb2"><pre
class="sourceCode dockerfile"><code class="sourceCode dockerfile"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="co"># water-server/Dockerfile</span></span>
<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a><span class="kw">FROM</span> openjdk:17-jdk-slim</span>
<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a><span class="kw">LABEL</span> maintainer=<span class="st">&quot;fujian-water-dev-team&quot;</span></span>
<span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-6"><a href="#cb2-6" aria-hidden="true" tabindex="-1"></a><span class="co"># 设置工作目录</span></span>
<span id="cb2-7"><a href="#cb2-7" aria-hidden="true" tabindex="-1"></a><span class="kw">WORKDIR</span> /app</span>
<span id="cb2-8"><a href="#cb2-8" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-9"><a href="#cb2-9" aria-hidden="true" tabindex="-1"></a><span class="co"># 设置时区</span></span>
<span id="cb2-10"><a href="#cb2-10" aria-hidden="true" tabindex="-1"></a><span class="kw">ENV</span> TZ=Asia/Shanghai</span>
<span id="cb2-11"><a href="#cb2-11" aria-hidden="true" tabindex="-1"></a><span class="kw">RUN</span> <span class="fu">ln</span> <span class="at">-snf</span> /usr/share/zoneinfo/<span class="va">$TZ</span> /etc/localtime <span class="kw">&amp;&amp;</span> <span class="bu">echo</span> <span class="va">$TZ</span> <span class="op">&gt;</span> /etc/timezone</span>
<span id="cb2-12"><a href="#cb2-12" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-13"><a href="#cb2-13" aria-hidden="true" tabindex="-1"></a><span class="co"># 添加应用jar包</span></span>
<span id="cb2-14"><a href="#cb2-14" aria-hidden="true" tabindex="-1"></a><span class="kw">COPY</span> target/water-server.jar app.jar</span>
<span id="cb2-15"><a href="#cb2-15" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-16"><a href="#cb2-16" aria-hidden="true" tabindex="-1"></a><span class="co"># 创建日志目录</span></span>
<span id="cb2-17"><a href="#cb2-17" aria-hidden="true" tabindex="-1"></a><span class="kw">RUN</span> <span class="fu">mkdir</span> <span class="at">-p</span> /app/logs</span>
<span id="cb2-18"><a href="#cb2-18" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-19"><a href="#cb2-19" aria-hidden="true" tabindex="-1"></a><span class="co"># 暴露端口</span></span>
<span id="cb2-20"><a href="#cb2-20" aria-hidden="true" tabindex="-1"></a><span class="kw">EXPOSE</span> 8080</span>
<span id="cb2-21"><a href="#cb2-21" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb2-22"><a href="#cb2-22" aria-hidden="true" tabindex="-1"></a><span class="co"># 启动应用</span></span>
<span id="cb2-23"><a href="#cb2-23" aria-hidden="true" tabindex="-1"></a><span class="kw">ENTRYPOINT</span> [<span class="st">&quot;java&quot;</span>, <span class="st">&quot;-jar&quot;</span>, <span class="st">&quot;-Xmx1024m&quot;</span>, <span class="st">&quot;-Xms512m&quot;</span>, <span class="st">&quot;-Dspring.profiles.active=prod&quot;</span>, <span class="st">&quot;/app/app.jar&quot;</span>]</span></code></pre></div>
<h4 data-number="1.10.1.3" id="前端应用dockerfile"><span
class="header-section-number">1.10.1.3</span> 8.1.3
前端应用Dockerfile</h4>
<div class="sourceCode" id="cb3"><pre
class="sourceCode dockerfile"><code class="sourceCode dockerfile"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a><span class="co"># water-ui/Dockerfile</span></span>
<span id="cb3-2"><a href="#cb3-2" aria-hidden="true" tabindex="-1"></a><span class="co"># 构建阶段</span></span>
<span id="cb3-3"><a href="#cb3-3" aria-hidden="true" tabindex="-1"></a><span class="kw">FROM</span> node:18-alpine <span class="kw">AS</span> builder</span>
<span id="cb3-4"><a href="#cb3-4" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb3-5"><a href="#cb3-5" aria-hidden="true" tabindex="-1"></a><span class="kw">WORKDIR</span> /app</span>
<span id="cb3-6"><a href="#cb3-6" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb3-7"><a href="#cb3-7" aria-hidden="true" tabindex="-1"></a><span class="co"># 复制包管理文件</span></span>
<span id="cb3-8"><a href="#cb3-8" aria-hidden="true" tabindex="-1"></a><span class="kw">COPY</span> package*.json ./</span>
<span id="cb3-9"><a href="#cb3-9" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb3-10"><a href="#cb3-10" aria-hidden="true" tabindex="-1"></a><span class="co"># 安装依赖</span></span>
<span id="cb3-11"><a href="#cb3-11" aria-hidden="true" tabindex="-1"></a><span class="kw">RUN</span> <span class="ex">npm</span> ci <span class="at">--only</span><span class="op">=</span>production</span>
<span id="cb3-12"><a href="#cb3-12" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb3-13"><a href="#cb3-13" aria-hidden="true" tabindex="-1"></a><span class="co"># 复制源代码</span></span>
<span id="cb3-14"><a href="#cb3-14" aria-hidden="true" tabindex="-1"></a><span class="kw">COPY</span> . .</span>
<span id="cb3-15"><a href="#cb3-15" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb3-16"><a href="#cb3-16" aria-hidden="true" tabindex="-1"></a><span class="co"># 构建应用</span></span>
<span id="cb3-17"><a href="#cb3-17" aria-hidden="true" tabindex="-1"></a><span class="kw">RUN</span> <span class="ex">npm</span> run build:prod</span>
<span id="cb3-18"><a href="#cb3-18" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb3-19"><a href="#cb3-19" aria-hidden="true" tabindex="-1"></a><span class="co"># 生产阶段</span></span>
<span id="cb3-20"><a href="#cb3-20" aria-hidden="true" tabindex="-1"></a><span class="kw">FROM</span> nginx:1.24-alpine</span>
<span id="cb3-21"><a href="#cb3-21" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb3-22"><a href="#cb3-22" aria-hidden="true" tabindex="-1"></a><span class="co"># 复制构建产物</span></span>
<span id="cb3-23"><a href="#cb3-23" aria-hidden="true" tabindex="-1"></a><span class="kw">COPY</span> <span class="op">--from=builder</span> /app/dist /usr/share/nginx/html</span>
<span id="cb3-24"><a href="#cb3-24" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb3-25"><a href="#cb3-25" aria-hidden="true" tabindex="-1"></a><span class="co"># 复制nginx配置</span></span>
<span id="cb3-26"><a href="#cb3-26" aria-hidden="true" tabindex="-1"></a><span class="kw">COPY</span> nginx.conf /etc/nginx/nginx.conf</span>
<span id="cb3-27"><a href="#cb3-27" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb3-28"><a href="#cb3-28" aria-hidden="true" tabindex="-1"></a><span class="co"># 暴露端口</span></span>
<span id="cb3-29"><a href="#cb3-29" aria-hidden="true" tabindex="-1"></a><span class="kw">EXPOSE</span> 80</span>
<span id="cb3-30"><a href="#cb3-30" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb3-31"><a href="#cb3-31" aria-hidden="true" tabindex="-1"></a><span class="co"># 启动nginx</span></span>
<span id="cb3-32"><a href="#cb3-32" aria-hidden="true" tabindex="-1"></a><span class="kw">CMD</span> [<span class="st">&quot;nginx&quot;</span>, <span class="st">&quot;-g&quot;</span>, <span class="st">&quot;daemon off;&quot;</span>]</span></code></pre></div>
<h3 data-number="1.10.2" id="docker-compose高级配置"><span
class="header-section-number">1.10.2</span> 8.2 Docker
Compose高级配置</h3>
<h4 data-number="1.10.2.1" id="生产环境配置优化"><span
class="header-section-number">1.10.2.1</span> 8.2.1
生产环境配置优化</h4>
<p><strong>Docker Compose生产环境配置文件</strong></p>
<div class="sourceCode" id="cb4"><pre
class="sourceCode yaml"><code class="sourceCode yaml"><span id="cb4-1"><a href="#cb4-1" aria-hidden="true" tabindex="-1"></a><span class="co"># docker-compose.prod.yml</span></span>
<span id="cb4-2"><a href="#cb4-2" aria-hidden="true" tabindex="-1"></a><span class="fu">version</span><span class="kw">:</span><span class="at"> </span><span class="st">&#39;3.8&#39;</span></span>
<span id="cb4-3"><a href="#cb4-3" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb4-4"><a href="#cb4-4" aria-hidden="true" tabindex="-1"></a><span class="fu">services</span><span class="kw">:</span></span>
<span id="cb4-5"><a href="#cb4-5" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">water-opengauss</span><span class="kw">:</span></span>
<span id="cb4-6"><a href="#cb4-6" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">image</span><span class="kw">:</span><span class="at"> enmotech/opengauss:5.0.0</span></span>
<span id="cb4-7"><a href="#cb4-7" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">container_name</span><span class="kw">:</span><span class="at"> water-opengauss-prod</span></span>
<span id="cb4-8"><a href="#cb4-8" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">restart</span><span class="kw">:</span><span class="at"> unless-stopped</span></span>
<span id="cb4-9"><a href="#cb4-9" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">environment</span><span class="kw">:</span></span>
<span id="cb4-10"><a href="#cb4-10" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">GS_PASSWORD</span><span class="kw">:</span><span class="at"> </span><span class="st">&quot;${DB_PASSWORD:-Water@2024!}&quot;</span></span>
<span id="cb4-11"><a href="#cb4-11" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">GS_DB</span><span class="kw">:</span><span class="at"> </span><span class="st">&quot;ruoyi_water&quot;</span></span>
<span id="cb4-12"><a href="#cb4-12" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">GS_USERNAME</span><span class="kw">:</span><span class="at"> </span><span class="st">&quot;water_user&quot;</span></span>
<span id="cb4-13"><a href="#cb4-13" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">TZ</span><span class="kw">:</span><span class="at"> </span><span class="st">&quot;Asia/Shanghai&quot;</span></span>
<span id="cb4-14"><a href="#cb4-14" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">volumes</span><span class="kw">:</span></span>
<span id="cb4-15"><a href="#cb4-15" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> opengauss-prod-data:/var/lib/opengauss</span></span>
<span id="cb4-16"><a href="#cb4-16" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> ./config/opengauss/prod:/opt/opengauss/config</span></span>
<span id="cb4-17"><a href="#cb4-17" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> ./backups:/backups</span></span>
<span id="cb4-18"><a href="#cb4-18" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">ports</span><span class="kw">:</span></span>
<span id="cb4-19"><a href="#cb4-19" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> </span><span class="st">&quot;5432:5432&quot;</span></span>
<span id="cb4-20"><a href="#cb4-20" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">networks</span><span class="kw">:</span></span>
<span id="cb4-21"><a href="#cb4-21" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> water-prod-network</span></span>
<span id="cb4-22"><a href="#cb4-22" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">deploy</span><span class="kw">:</span></span>
<span id="cb4-23"><a href="#cb4-23" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">resources</span><span class="kw">:</span></span>
<span id="cb4-24"><a href="#cb4-24" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">limits</span><span class="kw">:</span></span>
<span id="cb4-25"><a href="#cb4-25" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">memory</span><span class="kw">:</span><span class="at"> 2G</span></span>
<span id="cb4-26"><a href="#cb4-26" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">cpus</span><span class="kw">:</span><span class="at"> </span><span class="st">&#39;2.0&#39;</span></span>
<span id="cb4-27"><a href="#cb4-27" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">healthcheck</span><span class="kw">:</span></span>
<span id="cb4-28"><a href="#cb4-28" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">test</span><span class="kw">:</span><span class="at"> </span><span class="kw">[</span><span class="st">&quot;CMD-SHELL&quot;</span><span class="kw">,</span><span class="at"> </span><span class="st">&quot;gs_ctl status -D /var/lib/opengauss/data&quot;</span><span class="kw">]</span></span>
<span id="cb4-29"><a href="#cb4-29" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">interval</span><span class="kw">:</span><span class="at"> 30s</span></span>
<span id="cb4-30"><a href="#cb4-30" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">timeout</span><span class="kw">:</span><span class="at"> 10s</span></span>
<span id="cb4-31"><a href="#cb4-31" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">retries</span><span class="kw">:</span><span class="at"> </span><span class="dv">5</span></span>
<span id="cb4-32"><a href="#cb4-32" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">start_period</span><span class="kw">:</span><span class="at"> 60s</span></span>
<span id="cb4-33"><a href="#cb4-33" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb4-34"><a href="#cb4-34" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">water-redis</span><span class="kw">:</span></span>
<span id="cb4-35"><a href="#cb4-35" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">image</span><span class="kw">:</span><span class="at"> redis:7.0-alpine</span></span>
<span id="cb4-36"><a href="#cb4-36" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">container_name</span><span class="kw">:</span><span class="at"> water-redis-prod</span></span>
<span id="cb4-37"><a href="#cb4-37" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">restart</span><span class="kw">:</span><span class="at"> unless-stopped</span></span>
<span id="cb4-38"><a href="#cb4-38" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">command</span><span class="kw">:</span><span class="at"> redis-server /etc/redis/redis.conf --requirepass ${REDIS_PASSWORD:-water_redis_2024}</span></span>
<span id="cb4-39"><a href="#cb4-39" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">volumes</span><span class="kw">:</span></span>
<span id="cb4-40"><a href="#cb4-40" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> redis-prod-data:/data</span></span>
<span id="cb4-41"><a href="#cb4-41" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> ./config/redis/prod.conf:/etc/redis/redis.conf</span></span>
<span id="cb4-42"><a href="#cb4-42" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">ports</span><span class="kw">:</span></span>
<span id="cb4-43"><a href="#cb4-43" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> </span><span class="st">&quot;6379:6379&quot;</span></span>
<span id="cb4-44"><a href="#cb4-44" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">networks</span><span class="kw">:</span></span>
<span id="cb4-45"><a href="#cb4-45" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> water-prod-network</span></span>
<span id="cb4-46"><a href="#cb4-46" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">deploy</span><span class="kw">:</span></span>
<span id="cb4-47"><a href="#cb4-47" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">resources</span><span class="kw">:</span></span>
<span id="cb4-48"><a href="#cb4-48" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">limits</span><span class="kw">:</span></span>
<span id="cb4-49"><a href="#cb4-49" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">memory</span><span class="kw">:</span><span class="at"> 512M</span></span>
<span id="cb4-50"><a href="#cb4-50" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">cpus</span><span class="kw">:</span><span class="at"> </span><span class="st">&#39;1.0&#39;</span></span>
<span id="cb4-51"><a href="#cb4-51" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb4-52"><a href="#cb4-52" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">water-server</span><span class="kw">:</span></span>
<span id="cb4-53"><a href="#cb4-53" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">image</span><span class="kw">:</span><span class="at"> water-server:${VERSION:-latest}</span></span>
<span id="cb4-54"><a href="#cb4-54" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">container_name</span><span class="kw">:</span><span class="at"> water-server-prod</span></span>
<span id="cb4-55"><a href="#cb4-55" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">restart</span><span class="kw">:</span><span class="at"> unless-stopped</span></span>
<span id="cb4-56"><a href="#cb4-56" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">depends_on</span><span class="kw">:</span></span>
<span id="cb4-57"><a href="#cb4-57" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">water-opengauss</span><span class="kw">:</span></span>
<span id="cb4-58"><a href="#cb4-58" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">condition</span><span class="kw">:</span><span class="at"> service_healthy</span></span>
<span id="cb4-59"><a href="#cb4-59" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">water-redis</span><span class="kw">:</span></span>
<span id="cb4-60"><a href="#cb4-60" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">condition</span><span class="kw">:</span><span class="at"> service_started</span></span>
<span id="cb4-61"><a href="#cb4-61" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">environment</span><span class="kw">:</span></span>
<span id="cb4-62"><a href="#cb4-62" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> SPRING_PROFILES_ACTIVE=prod</span></span>
<span id="cb4-63"><a href="#cb4-63" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> SPRING_DATASOURCE_URL=jdbc:opengauss://water-opengauss:5432/ruoyi_water</span></span>
<span id="cb4-64"><a href="#cb4-64" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> SPRING_DATASOURCE_USERNAME=water_user</span></span>
<span id="cb4-65"><a href="#cb4-65" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> SPRING_DATASOURCE_PASSWORD=${DB_PASSWORD:-Water@2024!}</span></span>
<span id="cb4-66"><a href="#cb4-66" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> SPRING_REDIS_HOST=water-redis</span></span>
<span id="cb4-67"><a href="#cb4-67" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> SPRING_REDIS_PASSWORD=${REDIS_PASSWORD:-water_redis_2024}</span></span>
<span id="cb4-68"><a href="#cb4-68" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> SERVER_PORT=8080</span></span>
<span id="cb4-69"><a href="#cb4-69" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> JAVA_OPTS=-Xmx2g -Xms1g -XX:+UseG1GC</span></span>
<span id="cb4-70"><a href="#cb4-70" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">volumes</span><span class="kw">:</span></span>
<span id="cb4-71"><a href="#cb4-71" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> ./logs/prod:/app/logs</span></span>
<span id="cb4-72"><a href="#cb4-72" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> ./upload/prod:/app/upload</span></span>
<span id="cb4-73"><a href="#cb4-73" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> ./config/app:/app/config</span></span>
<span id="cb4-74"><a href="#cb4-74" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">networks</span><span class="kw">:</span></span>
<span id="cb4-75"><a href="#cb4-75" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> water-prod-network</span></span>
<span id="cb4-76"><a href="#cb4-76" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">deploy</span><span class="kw">:</span></span>
<span id="cb4-77"><a href="#cb4-77" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">resources</span><span class="kw">:</span></span>
<span id="cb4-78"><a href="#cb4-78" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">limits</span><span class="kw">:</span></span>
<span id="cb4-79"><a href="#cb4-79" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">memory</span><span class="kw">:</span><span class="at"> 3G</span></span>
<span id="cb4-80"><a href="#cb4-80" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">cpus</span><span class="kw">:</span><span class="at"> </span><span class="st">&#39;2.0&#39;</span></span>
<span id="cb4-81"><a href="#cb4-81" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">replicas</span><span class="kw">:</span><span class="at"> </span><span class="dv">2</span></span>
<span id="cb4-82"><a href="#cb4-82" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">healthcheck</span><span class="kw">:</span></span>
<span id="cb4-83"><a href="#cb4-83" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">test</span><span class="kw">:</span><span class="at"> </span><span class="kw">[</span><span class="st">&quot;CMD&quot;</span><span class="kw">,</span><span class="at"> </span><span class="st">&quot;curl&quot;</span><span class="kw">,</span><span class="at"> </span><span class="st">&quot;-f&quot;</span><span class="kw">,</span><span class="at"> </span><span class="st">&quot;http://localhost:8080/actuator/health&quot;</span><span class="kw">]</span></span>
<span id="cb4-84"><a href="#cb4-84" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">interval</span><span class="kw">:</span><span class="at"> 30s</span></span>
<span id="cb4-85"><a href="#cb4-85" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">timeout</span><span class="kw">:</span><span class="at"> 10s</span></span>
<span id="cb4-86"><a href="#cb4-86" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">retries</span><span class="kw">:</span><span class="at"> </span><span class="dv">3</span></span>
<span id="cb4-87"><a href="#cb4-87" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb4-88"><a href="#cb4-88" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">water-nginx</span><span class="kw">:</span></span>
<span id="cb4-89"><a href="#cb4-89" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">image</span><span class="kw">:</span><span class="at"> nginx:1.24-alpine</span></span>
<span id="cb4-90"><a href="#cb4-90" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">container_name</span><span class="kw">:</span><span class="at"> water-nginx-prod</span></span>
<span id="cb4-91"><a href="#cb4-91" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">restart</span><span class="kw">:</span><span class="at"> unless-stopped</span></span>
<span id="cb4-92"><a href="#cb4-92" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">depends_on</span><span class="kw">:</span></span>
<span id="cb4-93"><a href="#cb4-93" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> water-server</span></span>
<span id="cb4-94"><a href="#cb4-94" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">volumes</span><span class="kw">:</span></span>
<span id="cb4-95"><a href="#cb4-95" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> ./config/nginx/prod.conf:/etc/nginx/nginx.conf</span></span>
<span id="cb4-96"><a href="#cb4-96" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> ./config/nginx/conf.d:/etc/nginx/conf.d</span></span>
<span id="cb4-97"><a href="#cb4-97" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> ./ssl:/etc/nginx/ssl</span></span>
<span id="cb4-98"><a href="#cb4-98" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> ./logs/nginx:/var/log/nginx</span></span>
<span id="cb4-99"><a href="#cb4-99" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> ./static:/usr/share/nginx/html</span></span>
<span id="cb4-100"><a href="#cb4-100" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">ports</span><span class="kw">:</span></span>
<span id="cb4-101"><a href="#cb4-101" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> </span><span class="st">&quot;80:80&quot;</span></span>
<span id="cb4-102"><a href="#cb4-102" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> </span><span class="st">&quot;443:443&quot;</span></span>
<span id="cb4-103"><a href="#cb4-103" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">networks</span><span class="kw">:</span></span>
<span id="cb4-104"><a href="#cb4-104" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> water-prod-network</span></span>
<span id="cb4-105"><a href="#cb4-105" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">deploy</span><span class="kw">:</span></span>
<span id="cb4-106"><a href="#cb4-106" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">resources</span><span class="kw">:</span></span>
<span id="cb4-107"><a href="#cb4-107" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">limits</span><span class="kw">:</span></span>
<span id="cb4-108"><a href="#cb4-108" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">memory</span><span class="kw">:</span><span class="at"> 256M</span></span>
<span id="cb4-109"><a href="#cb4-109" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">cpus</span><span class="kw">:</span><span class="at"> </span><span class="st">&#39;0.5&#39;</span></span>
<span id="cb4-110"><a href="#cb4-110" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb4-111"><a href="#cb4-111" aria-hidden="true" tabindex="-1"></a><span class="fu">networks</span><span class="kw">:</span></span>
<span id="cb4-112"><a href="#cb4-112" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">water-prod-network</span><span class="kw">:</span></span>
<span id="cb4-113"><a href="#cb4-113" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">driver</span><span class="kw">:</span><span class="at"> bridge</span></span>
<span id="cb4-114"><a href="#cb4-114" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">ipam</span><span class="kw">:</span></span>
<span id="cb4-115"><a href="#cb4-115" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">config</span><span class="kw">:</span></span>
<span id="cb4-116"><a href="#cb4-116" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> </span><span class="fu">subnet</span><span class="kw">:</span><span class="at"> 172.20.0.0/16</span></span>
<span id="cb4-117"><a href="#cb4-117" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb4-118"><a href="#cb4-118" aria-hidden="true" tabindex="-1"></a><span class="fu">volumes</span><span class="kw">:</span></span>
<span id="cb4-119"><a href="#cb4-119" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">opengauss-prod-data</span><span class="kw">:</span></span>
<span id="cb4-120"><a href="#cb4-120" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">driver</span><span class="kw">:</span><span class="at"> local</span></span>
<span id="cb4-121"><a href="#cb4-121" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">redis-prod-data</span><span class="kw">:</span></span>
<span id="cb4-122"><a href="#cb4-122" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">driver</span><span class="kw">:</span><span class="at"> local</span></span></code></pre></div>
<h4 data-number="1.10.2.2" id="环境变量配置"><span
class="header-section-number">1.10.2.2</span> 8.2.2 环境变量配置</h4>
<div class="sourceCode" id="cb5"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb5-1"><a href="#cb5-1" aria-hidden="true" tabindex="-1"></a><span class="co"># .env.prod</span></span>
<span id="cb5-2"><a href="#cb5-2" aria-hidden="true" tabindex="-1"></a><span class="co"># 数据库配置</span></span>
<span id="cb5-3"><a href="#cb5-3" aria-hidden="true" tabindex="-1"></a><span class="va">DB_PASSWORD</span><span class="op">=</span>Water@2024!Production</span>
<span id="cb5-4"><a href="#cb5-4" aria-hidden="true" tabindex="-1"></a><span class="va">DB_HOST</span><span class="op">=</span>water-opengauss</span>
<span id="cb5-5"><a href="#cb5-5" aria-hidden="true" tabindex="-1"></a><span class="va">DB_PORT</span><span class="op">=</span>5432</span>
<span id="cb5-6"><a href="#cb5-6" aria-hidden="true" tabindex="-1"></a><span class="va">DB_NAME</span><span class="op">=</span>ruoyi_water</span>
<span id="cb5-7"><a href="#cb5-7" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb5-8"><a href="#cb5-8" aria-hidden="true" tabindex="-1"></a><span class="co"># Redis配置</span></span>
<span id="cb5-9"><a href="#cb5-9" aria-hidden="true" tabindex="-1"></a><span class="va">REDIS_PASSWORD</span><span class="op">=</span>WaterRedis@2024!Production</span>
<span id="cb5-10"><a href="#cb5-10" aria-hidden="true" tabindex="-1"></a><span class="va">REDIS_HOST</span><span class="op">=</span>water-redis</span>
<span id="cb5-11"><a href="#cb5-11" aria-hidden="true" tabindex="-1"></a><span class="va">REDIS_PORT</span><span class="op">=</span>6379</span>
<span id="cb5-12"><a href="#cb5-12" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb5-13"><a href="#cb5-13" aria-hidden="true" tabindex="-1"></a><span class="co"># 应用配置</span></span>
<span id="cb5-14"><a href="#cb5-14" aria-hidden="true" tabindex="-1"></a><span class="va">APP_VERSION</span><span class="op">=</span>1.0.0</span>
<span id="cb5-15"><a href="#cb5-15" aria-hidden="true" tabindex="-1"></a><span class="va">JAVA_OPTS</span><span class="op">=</span>-Xmx2g <span class="ex">-Xms1g</span> <span class="at">-XX:+UseG1GC</span> <span class="at">-XX:+HeapDumpOnOutOfMemoryError</span></span>
<span id="cb5-16"><a href="#cb5-16" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb5-17"><a href="#cb5-17" aria-hidden="true" tabindex="-1"></a><span class="co"># 网络配置</span></span>
<span id="cb5-18"><a href="#cb5-18" aria-hidden="true" tabindex="-1"></a><span class="va">NGINX_PORT</span><span class="op">=</span>80</span>
<span id="cb5-19"><a href="#cb5-19" aria-hidden="true" tabindex="-1"></a><span class="va">NGINX_SSL_PORT</span><span class="op">=</span>443</span>
<span id="cb5-20"><a href="#cb5-20" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb5-21"><a href="#cb5-21" aria-hidden="true" tabindex="-1"></a><span class="co"># 日志级别</span></span>
<span id="cb5-22"><a href="#cb5-22" aria-hidden="true" tabindex="-1"></a><span class="va">LOG_LEVEL</span><span class="op">=</span>INFO</span>
<span id="cb5-23"><a href="#cb5-23" aria-hidden="true" tabindex="-1"></a><span class="va">LOG_ROOT_LEVEL</span><span class="op">=</span>WARN</span></code></pre></div>
<h4 data-number="1.10.2.3" id="监控集成"><span
class="header-section-number">1.10.2.3</span> 8.2.3 监控集成</h4>
<div class="sourceCode" id="cb6"><pre
class="sourceCode yaml"><code class="sourceCode yaml"><span id="cb6-1"><a href="#cb6-1" aria-hidden="true" tabindex="-1"></a><span class="co"># docker-compose.monitoring.yml</span></span>
<span id="cb6-2"><a href="#cb6-2" aria-hidden="true" tabindex="-1"></a><span class="fu">version</span><span class="kw">:</span><span class="at"> </span><span class="st">&#39;3.8&#39;</span></span>
<span id="cb6-3"><a href="#cb6-3" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb6-4"><a href="#cb6-4" aria-hidden="true" tabindex="-1"></a><span class="fu">services</span><span class="kw">:</span></span>
<span id="cb6-5"><a href="#cb6-5" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">prometheus</span><span class="kw">:</span></span>
<span id="cb6-6"><a href="#cb6-6" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">image</span><span class="kw">:</span><span class="at"> prom/prometheus:latest</span></span>
<span id="cb6-7"><a href="#cb6-7" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">container_name</span><span class="kw">:</span><span class="at"> water-prometheus</span></span>
<span id="cb6-8"><a href="#cb6-8" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">restart</span><span class="kw">:</span><span class="at"> unless-stopped</span></span>
<span id="cb6-9"><a href="#cb6-9" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">volumes</span><span class="kw">:</span></span>
<span id="cb6-10"><a href="#cb6-10" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> ./config/prometheus:/etc/prometheus</span></span>
<span id="cb6-11"><a href="#cb6-11" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> prometheus-data:/prometheus</span></span>
<span id="cb6-12"><a href="#cb6-12" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">ports</span><span class="kw">:</span></span>
<span id="cb6-13"><a href="#cb6-13" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> </span><span class="st">&quot;9090:9090&quot;</span></span>
<span id="cb6-14"><a href="#cb6-14" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">command</span><span class="kw">:</span></span>
<span id="cb6-15"><a href="#cb6-15" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> </span><span class="st">&#39;--config.file=/etc/prometheus/prometheus.yml&#39;</span></span>
<span id="cb6-16"><a href="#cb6-16" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> </span><span class="st">&#39;--storage.tsdb.path=/prometheus&#39;</span></span>
<span id="cb6-17"><a href="#cb6-17" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> </span><span class="st">&#39;--web.console.libraries=/etc/prometheus/console_libraries&#39;</span></span>
<span id="cb6-18"><a href="#cb6-18" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> </span><span class="st">&#39;--web.console.templates=/etc/prometheus/consoles&#39;</span></span>
<span id="cb6-19"><a href="#cb6-19" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">networks</span><span class="kw">:</span></span>
<span id="cb6-20"><a href="#cb6-20" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> water-network</span></span>
<span id="cb6-21"><a href="#cb6-21" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb6-22"><a href="#cb6-22" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">grafana</span><span class="kw">:</span></span>
<span id="cb6-23"><a href="#cb6-23" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">image</span><span class="kw">:</span><span class="at"> grafana/grafana:latest</span></span>
<span id="cb6-24"><a href="#cb6-24" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">container_name</span><span class="kw">:</span><span class="at"> water-grafana</span></span>
<span id="cb6-25"><a href="#cb6-25" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">restart</span><span class="kw">:</span><span class="at"> unless-stopped</span></span>
<span id="cb6-26"><a href="#cb6-26" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">environment</span><span class="kw">:</span></span>
<span id="cb6-27"><a href="#cb6-27" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> GF_SECURITY_ADMIN_PASSWORD=admin123</span></span>
<span id="cb6-28"><a href="#cb6-28" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">volumes</span><span class="kw">:</span></span>
<span id="cb6-29"><a href="#cb6-29" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> grafana-data:/var/lib/grafana</span></span>
<span id="cb6-30"><a href="#cb6-30" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> ./config/grafana:/etc/grafana/provisioning</span></span>
<span id="cb6-31"><a href="#cb6-31" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">ports</span><span class="kw">:</span></span>
<span id="cb6-32"><a href="#cb6-32" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> </span><span class="st">&quot;3000:3000&quot;</span></span>
<span id="cb6-33"><a href="#cb6-33" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">networks</span><span class="kw">:</span></span>
<span id="cb6-34"><a href="#cb6-34" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> water-network</span></span>
<span id="cb6-35"><a href="#cb6-35" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb6-36"><a href="#cb6-36" aria-hidden="true" tabindex="-1"></a><span class="fu">volumes</span><span class="kw">:</span></span>
<span id="cb6-37"><a href="#cb6-37" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">prometheus-data</span><span class="kw">:</span></span>
<span id="cb6-38"><a href="#cb6-38" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">grafana-data</span><span class="kw">:</span></span></code></pre></div>
<h3 data-number="1.10.3" id="自动化部署脚本"><span
class="header-section-number">1.10.3</span> 8.3 自动化部署脚本</h3>
<h4 data-number="1.10.3.1" id="docker部署脚本"><span
class="header-section-number">1.10.3.1</span> 8.3.1 Docker部署脚本</h4>
<div class="sourceCode" id="cb7"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb7-1"><a href="#cb7-1" aria-hidden="true" tabindex="-1"></a><span class="co">#!/bin/bash</span></span>
<span id="cb7-2"><a href="#cb7-2" aria-hidden="true" tabindex="-1"></a><span class="co"># deploy-docker.sh</span></span>
<span id="cb7-3"><a href="#cb7-3" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb7-4"><a href="#cb7-4" aria-hidden="true" tabindex="-1"></a><span class="bu">set</span> <span class="at">-e</span></span>
<span id="cb7-5"><a href="#cb7-5" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb7-6"><a href="#cb7-6" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot;=== 福建水务营收系统 Docker 部署脚本 ===&quot;</span></span>
<span id="cb7-7"><a href="#cb7-7" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb7-8"><a href="#cb7-8" aria-hidden="true" tabindex="-1"></a><span class="co"># 检查Docker环境</span></span>
<span id="cb7-9"><a href="#cb7-9" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="ot">! </span><span class="bu">command</span> <span class="at">-v</span> docker <span class="op">&amp;&gt;</span> /dev/null<span class="kw">;</span> <span class="cf">then</span></span>
<span id="cb7-10"><a href="#cb7-10" aria-hidden="true" tabindex="-1"></a> <span class="bu">echo</span> <span class="st">&quot;错误: Docker未安装请先安装Docker&quot;</span></span>
<span id="cb7-11"><a href="#cb7-11" aria-hidden="true" tabindex="-1"></a> <span class="bu">exit</span> 1</span>
<span id="cb7-12"><a href="#cb7-12" aria-hidden="true" tabindex="-1"></a><span class="cf">fi</span></span>
<span id="cb7-13"><a href="#cb7-13" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb7-14"><a href="#cb7-14" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="ot">! </span><span class="bu">command</span> <span class="at">-v</span> docker-compose <span class="op">&amp;&gt;</span> /dev/null<span class="kw">;</span> <span class="cf">then</span></span>
<span id="cb7-15"><a href="#cb7-15" aria-hidden="true" tabindex="-1"></a> <span class="bu">echo</span> <span class="st">&quot;错误: Docker Compose未安装请先安装Docker Compose&quot;</span></span>
<span id="cb7-16"><a href="#cb7-16" aria-hidden="true" tabindex="-1"></a> <span class="bu">exit</span> 1</span>
<span id="cb7-17"><a href="#cb7-17" aria-hidden="true" tabindex="-1"></a><span class="cf">fi</span></span>
<span id="cb7-18"><a href="#cb7-18" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb7-19"><a href="#cb7-19" aria-hidden="true" tabindex="-1"></a><span class="co"># 创建必要目录</span></span>
<span id="cb7-20"><a href="#cb7-20" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot;创建数据目录...&quot;</span></span>
<span id="cb7-21"><a href="#cb7-21" aria-hidden="true" tabindex="-1"></a><span class="fu">mkdir</span> <span class="at">-p</span> data/<span class="dt">{opengauss</span><span class="op">,</span><span class="dt">redis</span><span class="op">,</span><span class="dt">minio}</span></span>
<span id="cb7-22"><a href="#cb7-22" aria-hidden="true" tabindex="-1"></a><span class="fu">mkdir</span> <span class="at">-p</span> logs/<span class="dt">{app</span><span class="op">,</span><span class="dt">nginx}</span></span>
<span id="cb7-23"><a href="#cb7-23" aria-hidden="true" tabindex="-1"></a><span class="fu">mkdir</span> <span class="at">-p</span> config/<span class="dt">{opengauss</span><span class="op">,</span><span class="dt">redis</span><span class="op">,</span><span class="dt">nginx/conf.d}</span></span>
<span id="cb7-24"><a href="#cb7-24" aria-hidden="true" tabindex="-1"></a><span class="fu">mkdir</span> <span class="at">-p</span> upload</span>
<span id="cb7-25"><a href="#cb7-25" aria-hidden="true" tabindex="-1"></a><span class="fu">mkdir</span> <span class="at">-p</span> ssl</span>
<span id="cb7-26"><a href="#cb7-26" aria-hidden="true" tabindex="-1"></a><span class="fu">mkdir</span> <span class="at">-p</span> backups</span>
<span id="cb7-27"><a href="#cb7-27" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb7-28"><a href="#cb7-28" aria-hidden="true" tabindex="-1"></a><span class="co"># 设置OpenGauss配置</span></span>
<span id="cb7-29"><a href="#cb7-29" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot;配置OpenGauss...&quot;</span></span>
<span id="cb7-30"><a href="#cb7-30" aria-hidden="true" tabindex="-1"></a><span class="fu">cat</span> <span class="op">&gt;</span> config/opengauss/postgresql.conf <span class="op">&lt;&lt; EOF</span></span>
<span id="cb7-31"><a href="#cb7-31" aria-hidden="true" tabindex="-1"></a><span class="st"># 数据库连接配置</span></span>
<span id="cb7-32"><a href="#cb7-32" aria-hidden="true" tabindex="-1"></a><span class="st">max_connections = 1000</span></span>
<span id="cb7-33"><a href="#cb7-33" aria-hidden="true" tabindex="-1"></a><span class="st">port = 5432</span></span>
<span id="cb7-34"><a href="#cb7-34" aria-hidden="true" tabindex="-1"></a><span class="st">listen_addresses = &#39;*&#39;</span></span>
<span id="cb7-35"><a href="#cb7-35" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb7-36"><a href="#cb7-36" aria-hidden="true" tabindex="-1"></a><span class="st"># 内存配置</span></span>
<span id="cb7-37"><a href="#cb7-37" aria-hidden="true" tabindex="-1"></a><span class="st">shared_buffers = 512MB</span></span>
<span id="cb7-38"><a href="#cb7-38" aria-hidden="true" tabindex="-1"></a><span class="st">work_mem = 4MB</span></span>
<span id="cb7-39"><a href="#cb7-39" aria-hidden="true" tabindex="-1"></a><span class="st">maintenance_work_mem = 128MB</span></span>
<span id="cb7-40"><a href="#cb7-40" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb7-41"><a href="#cb7-41" aria-hidden="true" tabindex="-1"></a><span class="st"># WAL配置</span></span>
<span id="cb7-42"><a href="#cb7-42" aria-hidden="true" tabindex="-1"></a><span class="st">wal_level = replica</span></span>
<span id="cb7-43"><a href="#cb7-43" aria-hidden="true" tabindex="-1"></a><span class="st">max_wal_size = 2GB</span></span>
<span id="cb7-44"><a href="#cb7-44" aria-hidden="true" tabindex="-1"></a><span class="st">min_wal_size = 128MB</span></span>
<span id="cb7-45"><a href="#cb7-45" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb7-46"><a href="#cb7-46" aria-hidden="true" tabindex="-1"></a><span class="st"># 日志配置</span></span>
<span id="cb7-47"><a href="#cb7-47" aria-hidden="true" tabindex="-1"></a><span class="st">log_destination = &#39;stderr&#39;</span></span>
<span id="cb7-48"><a href="#cb7-48" aria-hidden="true" tabindex="-1"></a><span class="st">logging_collector = on</span></span>
<span id="cb7-49"><a href="#cb7-49" aria-hidden="true" tabindex="-1"></a><span class="st">log_directory = &#39;pg_log&#39;</span></span>
<span id="cb7-50"><a href="#cb7-50" aria-hidden="true" tabindex="-1"></a><span class="st">log_filename = &#39;postgresql-%Y-%m-%d_%H%M%S.log&#39;</span></span>
<span id="cb7-51"><a href="#cb7-51" aria-hidden="true" tabindex="-1"></a><span class="st">log_min_duration_statement = 3000</span></span>
<span id="cb7-52"><a href="#cb7-52" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb7-53"><a href="#cb7-53" aria-hidden="true" tabindex="-1"></a><span class="st"># 性能优化</span></span>
<span id="cb7-54"><a href="#cb7-54" aria-hidden="true" tabindex="-1"></a><span class="st">effective_cache_size = 1GB</span></span>
<span id="cb7-55"><a href="#cb7-55" aria-hidden="true" tabindex="-1"></a><span class="st">random_page_cost = 1.1</span></span>
<span id="cb7-56"><a href="#cb7-56" aria-hidden="true" tabindex="-1"></a><span class="st">seq_page_cost = 1.0</span></span>
<span id="cb7-57"><a href="#cb7-57" aria-hidden="true" tabindex="-1"></a><span class="op">EOF</span></span>
<span id="cb7-58"><a href="#cb7-58" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb7-59"><a href="#cb7-59" aria-hidden="true" tabindex="-1"></a><span class="fu">cat</span> <span class="op">&gt;</span> config/opengauss/pg_hba.conf <span class="op">&lt;&lt; EOF</span></span>
<span id="cb7-60"><a href="#cb7-60" aria-hidden="true" tabindex="-1"></a><span class="st"># TYPE DATABASE USER ADDRESS METHOD</span></span>
<span id="cb7-61"><a href="#cb7-61" aria-hidden="true" tabindex="-1"></a><span class="st">local all all trust</span></span>
<span id="cb7-62"><a href="#cb7-62" aria-hidden="true" tabindex="-1"></a><span class="st">host all all 127.0.0.1/32 md5</span></span>
<span id="cb7-63"><a href="#cb7-63" aria-hidden="true" tabindex="-1"></a><span class="st">host all all ::1/128 md5</span></span>
<span id="cb7-64"><a href="#cb7-64" aria-hidden="true" tabindex="-1"></a><span class="st">host all all 0.0.0.0/0 md5</span></span>
<span id="cb7-65"><a href="#cb7-65" aria-hidden="true" tabindex="-1"></a><span class="op">EOF</span></span>
<span id="cb7-66"><a href="#cb7-66" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb7-67"><a href="#cb7-67" aria-hidden="true" tabindex="-1"></a><span class="co"># 设置Redis配置</span></span>
<span id="cb7-68"><a href="#cb7-68" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot;配置Redis...&quot;</span></span>
<span id="cb7-69"><a href="#cb7-69" aria-hidden="true" tabindex="-1"></a><span class="fu">cat</span> <span class="op">&gt;</span> config/redis/redis.conf <span class="op">&lt;&lt; EOF</span></span>
<span id="cb7-70"><a href="#cb7-70" aria-hidden="true" tabindex="-1"></a><span class="st">port 6379</span></span>
<span id="cb7-71"><a href="#cb7-71" aria-hidden="true" tabindex="-1"></a><span class="st">requirepass water_redis_2024</span></span>
<span id="cb7-72"><a href="#cb7-72" aria-hidden="true" tabindex="-1"></a><span class="st">timeout 300</span></span>
<span id="cb7-73"><a href="#cb7-73" aria-hidden="true" tabindex="-1"></a><span class="st">tcp-keepalive 300</span></span>
<span id="cb7-74"><a href="#cb7-74" aria-hidden="true" tabindex="-1"></a><span class="st">maxmemory 256mb</span></span>
<span id="cb7-75"><a href="#cb7-75" aria-hidden="true" tabindex="-1"></a><span class="st">maxmemory-policy allkeys-lru</span></span>
<span id="cb7-76"><a href="#cb7-76" aria-hidden="true" tabindex="-1"></a><span class="st">save 900 1</span></span>
<span id="cb7-77"><a href="#cb7-77" aria-hidden="true" tabindex="-1"></a><span class="st">save 300 10</span></span>
<span id="cb7-78"><a href="#cb7-78" aria-hidden="true" tabindex="-1"></a><span class="st">save 60 10000</span></span>
<span id="cb7-79"><a href="#cb7-79" aria-hidden="true" tabindex="-1"></a><span class="op">EOF</span></span>
<span id="cb7-80"><a href="#cb7-80" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb7-81"><a href="#cb7-81" aria-hidden="true" tabindex="-1"></a><span class="co"># 设置Nginx配置</span></span>
<span id="cb7-82"><a href="#cb7-82" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot;配置Nginx...&quot;</span></span>
<span id="cb7-83"><a href="#cb7-83" aria-hidden="true" tabindex="-1"></a><span class="fu">cat</span> <span class="op">&gt;</span> config/nginx/nginx.conf <span class="op">&lt;&lt; EOF</span></span>
<span id="cb7-84"><a href="#cb7-84" aria-hidden="true" tabindex="-1"></a><span class="st">user nginx;</span></span>
<span id="cb7-85"><a href="#cb7-85" aria-hidden="true" tabindex="-1"></a><span class="st">worker_processes auto;</span></span>
<span id="cb7-86"><a href="#cb7-86" aria-hidden="true" tabindex="-1"></a><span class="st">error_log /var/log/nginx/error.log warn;</span></span>
<span id="cb7-87"><a href="#cb7-87" aria-hidden="true" tabindex="-1"></a><span class="st">pid /var/run/nginx.pid;</span></span>
<span id="cb7-88"><a href="#cb7-88" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb7-89"><a href="#cb7-89" aria-hidden="true" tabindex="-1"></a><span class="st">events {</span></span>
<span id="cb7-90"><a href="#cb7-90" aria-hidden="true" tabindex="-1"></a><span class="st"> worker_connections 1024;</span></span>
<span id="cb7-91"><a href="#cb7-91" aria-hidden="true" tabindex="-1"></a><span class="st"> use epoll;</span></span>
<span id="cb7-92"><a href="#cb7-92" aria-hidden="true" tabindex="-1"></a><span class="st"> multi_accept on;</span></span>
<span id="cb7-93"><a href="#cb7-93" aria-hidden="true" tabindex="-1"></a><span class="st">}</span></span>
<span id="cb7-94"><a href="#cb7-94" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb7-95"><a href="#cb7-95" aria-hidden="true" tabindex="-1"></a><span class="st">http {</span></span>
<span id="cb7-96"><a href="#cb7-96" aria-hidden="true" tabindex="-1"></a><span class="st"> include /etc/nginx/mime.types;</span></span>
<span id="cb7-97"><a href="#cb7-97" aria-hidden="true" tabindex="-1"></a><span class="st"> default_type application/octet-stream;</span></span>
<span id="cb7-98"><a href="#cb7-98" aria-hidden="true" tabindex="-1"></a><span class="st"> </span></span>
<span id="cb7-99"><a href="#cb7-99" aria-hidden="true" tabindex="-1"></a><span class="st"> log_format main &#39;</span><span class="dt">\$</span><span class="st">remote_addr - </span><span class="dt">\$</span><span class="st">remote_user [</span><span class="dt">\$</span><span class="st">time_local] &quot;</span><span class="dt">\$</span><span class="st">request&quot; &#39;</span></span>
<span id="cb7-100"><a href="#cb7-100" aria-hidden="true" tabindex="-1"></a><span class="st"> &#39;</span><span class="dt">\$</span><span class="st">status </span><span class="dt">\$</span><span class="st">body_bytes_sent &quot;</span><span class="dt">\$</span><span class="st">http_referer&quot; &#39;</span></span>
<span id="cb7-101"><a href="#cb7-101" aria-hidden="true" tabindex="-1"></a><span class="st"> &#39;&quot;</span><span class="dt">\$</span><span class="st">http_user_agent&quot; &quot;</span><span class="dt">\$</span><span class="st">http_x_forwarded_for&quot;&#39;;</span></span>
<span id="cb7-102"><a href="#cb7-102" aria-hidden="true" tabindex="-1"></a><span class="st"> </span></span>
<span id="cb7-103"><a href="#cb7-103" aria-hidden="true" tabindex="-1"></a><span class="st"> access_log /var/log/nginx/access.log main;</span></span>
<span id="cb7-104"><a href="#cb7-104" aria-hidden="true" tabindex="-1"></a><span class="st"> </span></span>
<span id="cb7-105"><a href="#cb7-105" aria-hidden="true" tabindex="-1"></a><span class="st"> sendfile on;</span></span>
<span id="cb7-106"><a href="#cb7-106" aria-hidden="true" tabindex="-1"></a><span class="st"> tcp_nopush on;</span></span>
<span id="cb7-107"><a href="#cb7-107" aria-hidden="true" tabindex="-1"></a><span class="st"> tcp_nodelay on;</span></span>
<span id="cb7-108"><a href="#cb7-108" aria-hidden="true" tabindex="-1"></a><span class="st"> keepalive_timeout 65;</span></span>
<span id="cb7-109"><a href="#cb7-109" aria-hidden="true" tabindex="-1"></a><span class="st"> types_hash_max_size 2048;</span></span>
<span id="cb7-110"><a href="#cb7-110" aria-hidden="true" tabindex="-1"></a><span class="st"> client_max_body_size 50M;</span></span>
<span id="cb7-111"><a href="#cb7-111" aria-hidden="true" tabindex="-1"></a><span class="st"> </span></span>
<span id="cb7-112"><a href="#cb7-112" aria-hidden="true" tabindex="-1"></a><span class="st"> gzip on;</span></span>
<span id="cb7-113"><a href="#cb7-113" aria-hidden="true" tabindex="-1"></a><span class="st"> gzip_vary on;</span></span>
<span id="cb7-114"><a href="#cb7-114" aria-hidden="true" tabindex="-1"></a><span class="st"> gzip_min_length 1024;</span></span>
<span id="cb7-115"><a href="#cb7-115" aria-hidden="true" tabindex="-1"></a><span class="st"> gzip_types text/plain text/css text/xml text/javascript </span></span>
<span id="cb7-116"><a href="#cb7-116" aria-hidden="true" tabindex="-1"></a><span class="st"> application/javascript application/xml+rss </span></span>
<span id="cb7-117"><a href="#cb7-117" aria-hidden="true" tabindex="-1"></a><span class="st"> application/json;</span></span>
<span id="cb7-118"><a href="#cb7-118" aria-hidden="true" tabindex="-1"></a><span class="st"> </span></span>
<span id="cb7-119"><a href="#cb7-119" aria-hidden="true" tabindex="-1"></a><span class="st"> include /etc/nginx/conf.d/*.conf;</span></span>
<span id="cb7-120"><a href="#cb7-120" aria-hidden="true" tabindex="-1"></a><span class="st">}</span></span>
<span id="cb7-121"><a href="#cb7-121" aria-hidden="true" tabindex="-1"></a><span class="op">EOF</span></span>
<span id="cb7-122"><a href="#cb7-122" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb7-123"><a href="#cb7-123" aria-hidden="true" tabindex="-1"></a><span class="fu">cat</span> <span class="op">&gt;</span> config/nginx/conf.d/water.conf <span class="op">&lt;&lt; EOF</span></span>
<span id="cb7-124"><a href="#cb7-124" aria-hidden="true" tabindex="-1"></a><span class="st">upstream water_backend {</span></span>
<span id="cb7-125"><a href="#cb7-125" aria-hidden="true" tabindex="-1"></a><span class="st"> server water-server:8080 max_fails=3 fail_timeout=30s;</span></span>
<span id="cb7-126"><a href="#cb7-126" aria-hidden="true" tabindex="-1"></a><span class="st"> keepalive 32;</span></span>
<span id="cb7-127"><a href="#cb7-127" aria-hidden="true" tabindex="-1"></a><span class="st">}</span></span>
<span id="cb7-128"><a href="#cb7-128" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb7-129"><a href="#cb7-129" aria-hidden="true" tabindex="-1"></a><span class="st">server {</span></span>
<span id="cb7-130"><a href="#cb7-130" aria-hidden="true" tabindex="-1"></a><span class="st"> listen 80;</span></span>
<span id="cb7-131"><a href="#cb7-131" aria-hidden="true" tabindex="-1"></a><span class="st"> server_name localhost;</span></span>
<span id="cb7-132"><a href="#cb7-132" aria-hidden="true" tabindex="-1"></a><span class="st"> </span></span>
<span id="cb7-133"><a href="#cb7-133" aria-hidden="true" tabindex="-1"></a><span class="st"> location /admin-api/ {</span></span>
<span id="cb7-134"><a href="#cb7-134" aria-hidden="true" tabindex="-1"></a><span class="st"> proxy_pass http://water_backend;</span></span>
<span id="cb7-135"><a href="#cb7-135" aria-hidden="true" tabindex="-1"></a><span class="st"> proxy_set_header Host </span><span class="dt">\$</span><span class="st">host;</span></span>
<span id="cb7-136"><a href="#cb7-136" aria-hidden="true" tabindex="-1"></a><span class="st"> proxy_set_header X-Real-IP </span><span class="dt">\$</span><span class="st">remote_addr;</span></span>
<span id="cb7-137"><a href="#cb7-137" aria-hidden="true" tabindex="-1"></a><span class="st"> proxy_set_header X-Forwarded-For </span><span class="dt">\$</span><span class="st">proxy_add_x_forwarded_for;</span></span>
<span id="cb7-138"><a href="#cb7-138" aria-hidden="true" tabindex="-1"></a><span class="st"> proxy_set_header X-Forwarded-Proto </span><span class="dt">\$</span><span class="st">scheme;</span></span>
<span id="cb7-139"><a href="#cb7-139" aria-hidden="true" tabindex="-1"></a><span class="st"> proxy_connect_timeout 600;</span></span>
<span id="cb7-140"><a href="#cb7-140" aria-hidden="true" tabindex="-1"></a><span class="st"> proxy_send_timeout 600;</span></span>
<span id="cb7-141"><a href="#cb7-141" aria-hidden="true" tabindex="-1"></a><span class="st"> proxy_read_timeout 600;</span></span>
<span id="cb7-142"><a href="#cb7-142" aria-hidden="true" tabindex="-1"></a><span class="st"> }</span></span>
<span id="cb7-143"><a href="#cb7-143" aria-hidden="true" tabindex="-1"></a><span class="st"> </span></span>
<span id="cb7-144"><a href="#cb7-144" aria-hidden="true" tabindex="-1"></a><span class="st"> location / {</span></span>
<span id="cb7-145"><a href="#cb7-145" aria-hidden="true" tabindex="-1"></a><span class="st"> proxy_pass http://water-ui;</span></span>
<span id="cb7-146"><a href="#cb7-146" aria-hidden="true" tabindex="-1"></a><span class="st"> proxy_set_header Host </span><span class="dt">\$</span><span class="st">host;</span></span>
<span id="cb7-147"><a href="#cb7-147" aria-hidden="true" tabindex="-1"></a><span class="st"> proxy_set_header X-Real-IP </span><span class="dt">\$</span><span class="st">remote_addr;</span></span>
<span id="cb7-148"><a href="#cb7-148" aria-hidden="true" tabindex="-1"></a><span class="st"> proxy_set_header X-Forwarded-For </span><span class="dt">\$</span><span class="st">proxy_add_x_forwarded_for;</span></span>
<span id="cb7-149"><a href="#cb7-149" aria-hidden="true" tabindex="-1"></a><span class="st"> proxy_set_header X-Forwarded-Proto </span><span class="dt">\$</span><span class="st">scheme;</span></span>
<span id="cb7-150"><a href="#cb7-150" aria-hidden="true" tabindex="-1"></a><span class="st"> }</span></span>
<span id="cb7-151"><a href="#cb7-151" aria-hidden="true" tabindex="-1"></a><span class="st">}</span></span>
<span id="cb7-152"><a href="#cb7-152" aria-hidden="true" tabindex="-1"></a><span class="op">EOF</span></span>
<span id="cb7-153"><a href="#cb7-153" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb7-154"><a href="#cb7-154" aria-hidden="true" tabindex="-1"></a><span class="co"># 构建和启动服务</span></span>
<span id="cb7-155"><a href="#cb7-155" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot;构建和启动Docker服务...&quot;</span></span>
<span id="cb7-156"><a href="#cb7-156" aria-hidden="true" tabindex="-1"></a><span class="ex">docker-compose</span> down</span>
<span id="cb7-157"><a href="#cb7-157" aria-hidden="true" tabindex="-1"></a><span class="ex">docker-compose</span> build <span class="at">--no-cache</span></span>
<span id="cb7-158"><a href="#cb7-158" aria-hidden="true" tabindex="-1"></a><span class="ex">docker-compose</span> up <span class="at">-d</span></span>
<span id="cb7-159"><a href="#cb7-159" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb7-160"><a href="#cb7-160" aria-hidden="true" tabindex="-1"></a><span class="co"># 等待服务启动</span></span>
<span id="cb7-161"><a href="#cb7-161" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot;等待服务启动...&quot;</span></span>
<span id="cb7-162"><a href="#cb7-162" aria-hidden="true" tabindex="-1"></a><span class="fu">sleep</span> 30</span>
<span id="cb7-163"><a href="#cb7-163" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb7-164"><a href="#cb7-164" aria-hidden="true" tabindex="-1"></a><span class="co"># 检查服务状态</span></span>
<span id="cb7-165"><a href="#cb7-165" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot;检查服务状态...&quot;</span></span>
<span id="cb7-166"><a href="#cb7-166" aria-hidden="true" tabindex="-1"></a><span class="ex">docker-compose</span> ps</span>
<span id="cb7-167"><a href="#cb7-167" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb7-168"><a href="#cb7-168" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot;=== 部署完成 ===&quot;</span></span>
<span id="cb7-169"><a href="#cb7-169" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot;系统访问地址: http://localhost&quot;</span></span>
<span id="cb7-170"><a href="#cb7-170" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot;API接口地址: http://localhost/admin-api&quot;</span></span>
<span id="cb7-171"><a href="#cb7-171" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot;MinIO控制台: http://localhost:9001 (admin/admin123456)&quot;</span></span>
<span id="cb7-172"><a href="#cb7-172" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot;&quot;</span></span>
<span id="cb7-173"><a href="#cb7-173" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot;查看日志: docker-compose logs -f [服务名]&quot;</span></span>
<span id="cb7-174"><a href="#cb7-174" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot;停止服务: docker-compose down&quot;</span></span>
<span id="cb7-175"><a href="#cb7-175" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot;重启服务: docker-compose restart&quot;</span></span></code></pre></div>
<h4 data-number="1.10.3.2" id="生产环境部署脚本"><span
class="header-section-number">1.10.3.2</span> 8.3.2
生产环境部署脚本</h4>
<div class="sourceCode" id="cb8"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb8-1"><a href="#cb8-1" aria-hidden="true" tabindex="-1"></a><span class="co">#!/bin/bash</span></span>
<span id="cb8-2"><a href="#cb8-2" aria-hidden="true" tabindex="-1"></a><span class="co"># deploy-prod.sh</span></span>
<span id="cb8-3"><a href="#cb8-3" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb8-4"><a href="#cb8-4" aria-hidden="true" tabindex="-1"></a><span class="bu">set</span> <span class="at">-e</span></span>
<span id="cb8-5"><a href="#cb8-5" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb8-6"><a href="#cb8-6" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot;=== 福建水务营收系统 生产环境部署脚本 ===&quot;</span></span>
<span id="cb8-7"><a href="#cb8-7" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb8-8"><a href="#cb8-8" aria-hidden="true" tabindex="-1"></a><span class="co"># 检查环境</span></span>
<span id="cb8-9"><a href="#cb8-9" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="ot">! </span><span class="bu">command</span> <span class="at">-v</span> docker <span class="op">&amp;&gt;</span> /dev/null<span class="kw">;</span> <span class="cf">then</span></span>
<span id="cb8-10"><a href="#cb8-10" aria-hidden="true" tabindex="-1"></a> <span class="bu">echo</span> <span class="st">&quot;错误: Docker未安装请先安装Docker&quot;</span></span>
<span id="cb8-11"><a href="#cb8-11" aria-hidden="true" tabindex="-1"></a> <span class="bu">exit</span> 1</span>
<span id="cb8-12"><a href="#cb8-12" aria-hidden="true" tabindex="-1"></a><span class="cf">fi</span></span>
<span id="cb8-13"><a href="#cb8-13" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb8-14"><a href="#cb8-14" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="ot">! </span><span class="bu">command</span> <span class="at">-v</span> docker-compose <span class="op">&amp;&gt;</span> /dev/null<span class="kw">;</span> <span class="cf">then</span></span>
<span id="cb8-15"><a href="#cb8-15" aria-hidden="true" tabindex="-1"></a> <span class="bu">echo</span> <span class="st">&quot;错误: Docker Compose未安装请先安装Docker Compose&quot;</span></span>
<span id="cb8-16"><a href="#cb8-16" aria-hidden="true" tabindex="-1"></a> <span class="bu">exit</span> 1</span>
<span id="cb8-17"><a href="#cb8-17" aria-hidden="true" tabindex="-1"></a><span class="cf">fi</span></span>
<span id="cb8-18"><a href="#cb8-18" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb8-19"><a href="#cb8-19" aria-hidden="true" tabindex="-1"></a><span class="co"># 设置环境变量</span></span>
<span id="cb8-20"><a href="#cb8-20" aria-hidden="true" tabindex="-1"></a><span class="bu">export</span> <span class="va">COMPOSE_PROJECT_NAME</span><span class="op">=</span>water-system-prod</span>
<span id="cb8-21"><a href="#cb8-21" aria-hidden="true" tabindex="-1"></a><span class="bu">export</span> <span class="va">VERSION</span><span class="op">=</span><span class="va">${1</span><span class="op">:-</span>latest<span class="va">}</span></span>
<span id="cb8-22"><a href="#cb8-22" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb8-23"><a href="#cb8-23" aria-hidden="true" tabindex="-1"></a><span class="co"># 创建生产环境目录</span></span>
<span id="cb8-24"><a href="#cb8-24" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot;创建生产环境目录...&quot;</span></span>
<span id="cb8-25"><a href="#cb8-25" aria-hidden="true" tabindex="-1"></a><span class="fu">mkdir</span> <span class="at">-p</span> <span class="dt">{data</span><span class="op">,</span><span class="dt">logs</span><span class="op">,</span><span class="dt">config</span><span class="op">,</span><span class="dt">upload</span><span class="op">,</span><span class="dt">ssl</span><span class="op">,</span><span class="dt">backups}</span>/<span class="dt">{prod</span><span class="op">,</span><span class="dt">test}</span></span>
<span id="cb8-26"><a href="#cb8-26" aria-hidden="true" tabindex="-1"></a><span class="fu">mkdir</span> <span class="at">-p</span> config/<span class="dt">{opengauss</span><span class="op">,</span><span class="dt">redis</span><span class="op">,</span><span class="dt">nginx</span><span class="op">,</span><span class="dt">app</span><span class="op">,</span><span class="dt">prometheus</span><span class="op">,</span><span class="dt">grafana}</span></span>
<span id="cb8-27"><a href="#cb8-27" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb8-28"><a href="#cb8-28" aria-hidden="true" tabindex="-1"></a><span class="co"># 生成强密码</span></span>
<span id="cb8-29"><a href="#cb8-29" aria-hidden="true" tabindex="-1"></a><span class="va">DB_PASSWORD</span><span class="op">=</span><span class="va">$(</span><span class="ex">openssl</span> rand <span class="at">-base64</span> 32 <span class="kw">|</span> <span class="fu">tr</span> <span class="at">-d</span> <span class="st">&quot;=+/&quot;</span> <span class="kw">|</span> <span class="fu">cut</span> <span class="at">-c1-25</span><span class="va">)</span></span>
<span id="cb8-30"><a href="#cb8-30" aria-hidden="true" tabindex="-1"></a><span class="va">REDIS_PASSWORD</span><span class="op">=</span><span class="va">$(</span><span class="ex">openssl</span> rand <span class="at">-base64</span> 32 <span class="kw">|</span> <span class="fu">tr</span> <span class="at">-d</span> <span class="st">&quot;=+/&quot;</span> <span class="kw">|</span> <span class="fu">cut</span> <span class="at">-c1-25</span><span class="va">)</span></span>
<span id="cb8-31"><a href="#cb8-31" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb8-32"><a href="#cb8-32" aria-hidden="true" tabindex="-1"></a><span class="co"># 创建环境变量文件</span></span>
<span id="cb8-33"><a href="#cb8-33" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot;创建环境变量文件...&quot;</span></span>
<span id="cb8-34"><a href="#cb8-34" aria-hidden="true" tabindex="-1"></a><span class="fu">cat</span> <span class="op">&gt;</span> .env.prod <span class="op">&lt;&lt; EOF</span></span>
<span id="cb8-35"><a href="#cb8-35" aria-hidden="true" tabindex="-1"></a><span class="st"># 数据库配置</span></span>
<span id="cb8-36"><a href="#cb8-36" aria-hidden="true" tabindex="-1"></a><span class="st">DB_PASSWORD=</span><span class="va">${DB_PASSWORD}</span></span>
<span id="cb8-37"><a href="#cb8-37" aria-hidden="true" tabindex="-1"></a><span class="st">DB_HOST=water-opengauss</span></span>
<span id="cb8-38"><a href="#cb8-38" aria-hidden="true" tabindex="-1"></a><span class="st">DB_PORT=5432</span></span>
<span id="cb8-39"><a href="#cb8-39" aria-hidden="true" tabindex="-1"></a><span class="st">DB_NAME=ruoyi_water</span></span>
<span id="cb8-40"><a href="#cb8-40" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb8-41"><a href="#cb8-41" aria-hidden="true" tabindex="-1"></a><span class="st"># Redis配置</span></span>
<span id="cb8-42"><a href="#cb8-42" aria-hidden="true" tabindex="-1"></a><span class="st">REDIS_PASSWORD=</span><span class="va">${REDIS_PASSWORD}</span></span>
<span id="cb8-43"><a href="#cb8-43" aria-hidden="true" tabindex="-1"></a><span class="st">REDIS_HOST=water-redis</span></span>
<span id="cb8-44"><a href="#cb8-44" aria-hidden="true" tabindex="-1"></a><span class="st">REDIS_PORT=6379</span></span>
<span id="cb8-45"><a href="#cb8-45" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb8-46"><a href="#cb8-46" aria-hidden="true" tabindex="-1"></a><span class="st"># 应用配置</span></span>
<span id="cb8-47"><a href="#cb8-47" aria-hidden="true" tabindex="-1"></a><span class="st">VERSION=</span><span class="va">${VERSION}</span></span>
<span id="cb8-48"><a href="#cb8-48" aria-hidden="true" tabindex="-1"></a><span class="st">JAVA_OPTS=-Xmx2g -Xms1g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError</span></span>
<span id="cb8-49"><a href="#cb8-49" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb8-50"><a href="#cb8-50" aria-hidden="true" tabindex="-1"></a><span class="st"># 网络配置</span></span>
<span id="cb8-51"><a href="#cb8-51" aria-hidden="true" tabindex="-1"></a><span class="st">NGINX_PORT=80</span></span>
<span id="cb8-52"><a href="#cb8-52" aria-hidden="true" tabindex="-1"></a><span class="st">NGINX_SSL_PORT=443</span></span>
<span id="cb8-53"><a href="#cb8-53" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb8-54"><a href="#cb8-54" aria-hidden="true" tabindex="-1"></a><span class="st"># 日志级别</span></span>
<span id="cb8-55"><a href="#cb8-55" aria-hidden="true" tabindex="-1"></a><span class="st">LOG_LEVEL=INFO</span></span>
<span id="cb8-56"><a href="#cb8-56" aria-hidden="true" tabindex="-1"></a><span class="st">LOG_ROOT_LEVEL=WARN</span></span>
<span id="cb8-57"><a href="#cb8-57" aria-hidden="true" tabindex="-1"></a><span class="op">EOF</span></span>
<span id="cb8-58"><a href="#cb8-58" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb8-59"><a href="#cb8-59" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot;数据库密码: </span><span class="va">${DB_PASSWORD}</span><span class="st">&quot;</span></span>
<span id="cb8-60"><a href="#cb8-60" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot;Redis密码: </span><span class="va">${REDIS_PASSWORD}</span><span class="st">&quot;</span></span>
<span id="cb8-61"><a href="#cb8-61" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot;请妥善保存以上密码信息!&quot;</span></span>
<span id="cb8-62"><a href="#cb8-62" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb8-63"><a href="#cb8-63" aria-hidden="true" tabindex="-1"></a><span class="co"># 创建SSL证书自签名生产环境应使用正式证书</span></span>
<span id="cb8-64"><a href="#cb8-64" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot;创建SSL证书...&quot;</span></span>
<span id="cb8-65"><a href="#cb8-65" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> <span class="bu">[</span> <span class="ot">!</span> <span class="ot">-f</span> ssl/water-system.crt <span class="bu">]</span><span class="kw">;</span> <span class="cf">then</span></span>
<span id="cb8-66"><a href="#cb8-66" aria-hidden="true" tabindex="-1"></a> <span class="ex">openssl</span> req <span class="at">-x509</span> <span class="at">-nodes</span> <span class="at">-days</span> 365 <span class="at">-newkey</span> rsa:2048 <span class="dt">\</span></span>
<span id="cb8-67"><a href="#cb8-67" aria-hidden="true" tabindex="-1"></a> <span class="at">-keyout</span> ssl/water-system.key <span class="dt">\</span></span>
<span id="cb8-68"><a href="#cb8-68" aria-hidden="true" tabindex="-1"></a> <span class="at">-out</span> ssl/water-system.crt <span class="dt">\</span></span>
<span id="cb8-69"><a href="#cb8-69" aria-hidden="true" tabindex="-1"></a> <span class="at">-subj</span> <span class="st">&quot;/C=CN/ST=Fujian/L=Fuzhou/O=Water/CN=water.local&quot;</span></span>
<span id="cb8-70"><a href="#cb8-70" aria-hidden="true" tabindex="-1"></a><span class="cf">fi</span></span>
<span id="cb8-71"><a href="#cb8-71" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb8-72"><a href="#cb8-72" aria-hidden="true" tabindex="-1"></a><span class="co"># 构建应用镜像</span></span>
<span id="cb8-73"><a href="#cb8-73" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot;构建应用镜像...&quot;</span></span>
<span id="cb8-74"><a href="#cb8-74" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> build <span class="at">-t</span> water-server:<span class="va">${VERSION}</span> ./water-server</span>
<span id="cb8-75"><a href="#cb8-75" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> build <span class="at">-t</span> water-ui:<span class="va">${VERSION}</span> ./water-ui</span>
<span id="cb8-76"><a href="#cb8-76" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb8-77"><a href="#cb8-77" aria-hidden="true" tabindex="-1"></a><span class="co"># 停止现有服务</span></span>
<span id="cb8-78"><a href="#cb8-78" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot;停止现有服务...&quot;</span></span>
<span id="cb8-79"><a href="#cb8-79" aria-hidden="true" tabindex="-1"></a><span class="ex">docker-compose</span> <span class="at">--env-file</span> .env.prod <span class="at">-f</span> docker-compose.prod.yml down</span>
<span id="cb8-80"><a href="#cb8-80" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb8-81"><a href="#cb8-81" aria-hidden="true" tabindex="-1"></a><span class="co"># 启动生产服务</span></span>
<span id="cb8-82"><a href="#cb8-82" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot;启动生产服务...&quot;</span></span>
<span id="cb8-83"><a href="#cb8-83" aria-hidden="true" tabindex="-1"></a><span class="ex">docker-compose</span> <span class="at">--env-file</span> .env.prod <span class="at">-f</span> docker-compose.prod.yml up <span class="at">-d</span></span>
<span id="cb8-84"><a href="#cb8-84" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb8-85"><a href="#cb8-85" aria-hidden="true" tabindex="-1"></a><span class="co"># 等待服务启动</span></span>
<span id="cb8-86"><a href="#cb8-86" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot;等待服务启动...&quot;</span></span>
<span id="cb8-87"><a href="#cb8-87" aria-hidden="true" tabindex="-1"></a><span class="fu">sleep</span> 60</span>
<span id="cb8-88"><a href="#cb8-88" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb8-89"><a href="#cb8-89" aria-hidden="true" tabindex="-1"></a><span class="co"># 检查服务状态</span></span>
<span id="cb8-90"><a href="#cb8-90" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot;检查服务状态...&quot;</span></span>
<span id="cb8-91"><a href="#cb8-91" aria-hidden="true" tabindex="-1"></a><span class="ex">docker-compose</span> <span class="at">--env-file</span> .env.prod <span class="at">-f</span> docker-compose.prod.yml ps</span>
<span id="cb8-92"><a href="#cb8-92" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb8-93"><a href="#cb8-93" aria-hidden="true" tabindex="-1"></a><span class="co"># 健康检查</span></span>
<span id="cb8-94"><a href="#cb8-94" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot;执行健康检查...&quot;</span></span>
<span id="cb8-95"><a href="#cb8-95" aria-hidden="true" tabindex="-1"></a><span class="cf">for</span> i <span class="kw">in</span> <span class="dt">{</span><span class="dv">1</span><span class="dt">..</span><span class="dv">10</span><span class="dt">}</span><span class="kw">;</span> <span class="cf">do</span></span>
<span id="cb8-96"><a href="#cb8-96" aria-hidden="true" tabindex="-1"></a> <span class="cf">if</span> <span class="ex">curl</span> <span class="at">-f</span> http://localhost/actuator/health <span class="op">&gt;</span>/dev/null <span class="dv">2</span><span class="op">&gt;&amp;</span><span class="dv">1</span><span class="kw">;</span> <span class="cf">then</span></span>
<span id="cb8-97"><a href="#cb8-97" aria-hidden="true" tabindex="-1"></a> <span class="bu">echo</span> <span class="st">&quot;应用服务健康检查通过&quot;</span></span>
<span id="cb8-98"><a href="#cb8-98" aria-hidden="true" tabindex="-1"></a> <span class="cf">break</span></span>
<span id="cb8-99"><a href="#cb8-99" aria-hidden="true" tabindex="-1"></a> <span class="cf">else</span></span>
<span id="cb8-100"><a href="#cb8-100" aria-hidden="true" tabindex="-1"></a> <span class="bu">echo</span> <span class="st">&quot;等待应用服务启动... (</span><span class="va">$i</span><span class="st">/10)&quot;</span></span>
<span id="cb8-101"><a href="#cb8-101" aria-hidden="true" tabindex="-1"></a> <span class="fu">sleep</span> 30</span>
<span id="cb8-102"><a href="#cb8-102" aria-hidden="true" tabindex="-1"></a> <span class="cf">fi</span></span>
<span id="cb8-103"><a href="#cb8-103" aria-hidden="true" tabindex="-1"></a> </span>
<span id="cb8-104"><a href="#cb8-104" aria-hidden="true" tabindex="-1"></a> <span class="cf">if</span> <span class="bu">[</span> <span class="va">$i</span> <span class="ot">-eq</span> 10 <span class="bu">]</span><span class="kw">;</span> <span class="cf">then</span></span>
<span id="cb8-105"><a href="#cb8-105" aria-hidden="true" tabindex="-1"></a> <span class="bu">echo</span> <span class="st">&quot;警告: 应用服务健康检查失败&quot;</span></span>
<span id="cb8-106"><a href="#cb8-106" aria-hidden="true" tabindex="-1"></a> <span class="ex">docker-compose</span> <span class="at">--env-file</span> .env.prod <span class="at">-f</span> docker-compose.prod.yml logs water-server</span>
<span id="cb8-107"><a href="#cb8-107" aria-hidden="true" tabindex="-1"></a> <span class="cf">fi</span></span>
<span id="cb8-108"><a href="#cb8-108" aria-hidden="true" tabindex="-1"></a><span class="cf">done</span></span>
<span id="cb8-109"><a href="#cb8-109" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb8-110"><a href="#cb8-110" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot;=== 生产环境部署完成 ===&quot;</span></span>
<span id="cb8-111"><a href="#cb8-111" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot;系统访问地址: https://localhost&quot;</span></span>
<span id="cb8-112"><a href="#cb8-112" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot;系统监控地址: http://localhost:3000 (admin/admin123)&quot;</span></span>
<span id="cb8-113"><a href="#cb8-113" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot;数据库端口: 5432&quot;</span></span>
<span id="cb8-114"><a href="#cb8-114" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot;Redis端口: 6379&quot;</span></span>
<span id="cb8-115"><a href="#cb8-115" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot;&quot;</span></span>
<span id="cb8-116"><a href="#cb8-116" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot;管理命令:&quot;</span></span>
<span id="cb8-117"><a href="#cb8-117" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot; 查看日志: docker-compose --env-file .env.prod -f docker-compose.prod.yml logs -f [服务名]&quot;</span></span>
<span id="cb8-118"><a href="#cb8-118" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot; 停止服务: docker-compose --env-file .env.prod -f docker-compose.prod.yml down&quot;</span></span>
<span id="cb8-119"><a href="#cb8-119" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot; 重启服务: docker-compose --env-file .env.prod -f docker-compose.prod.yml restart [服务名]&quot;</span></span>
<span id="cb8-120"><a href="#cb8-120" aria-hidden="true" tabindex="-1"></a><span class="bu">echo</span> <span class="st">&quot; 备份数据: docker exec water-opengauss-prod gs_dump -h localhost -U water_user ruoyi_water &gt; ./backups/backup-</span><span class="dt">\$</span><span class="st">(date +%Y%m%d_%H%M%S).sql&quot;</span></span></code></pre></div>
<h3 data-number="1.10.4" id="持续集成持续部署-cicd"><span
class="header-section-number">1.10.4</span> 8.4 持续集成/持续部署
(CI/CD)</h3>
<h4 data-number="1.10.4.1" id="github-actions配置"><span
class="header-section-number">1.10.4.1</span> 8.4.1 GitHub
Actions配置</h4>
<div class="sourceCode" id="cb9"><pre
class="sourceCode yaml"><code class="sourceCode yaml"><span id="cb9-1"><a href="#cb9-1" aria-hidden="true" tabindex="-1"></a><span class="co"># .github/workflows/deploy.yml</span></span>
<span id="cb9-2"><a href="#cb9-2" aria-hidden="true" tabindex="-1"></a><span class="fu">name</span><span class="kw">:</span><span class="at"> Build and Deploy Water System</span></span>
<span id="cb9-3"><a href="#cb9-3" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb9-4"><a href="#cb9-4" aria-hidden="true" tabindex="-1"></a><span class="fu">on</span><span class="kw">:</span></span>
<span id="cb9-5"><a href="#cb9-5" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">push</span><span class="kw">:</span></span>
<span id="cb9-6"><a href="#cb9-6" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">branches</span><span class="kw">:</span><span class="at"> </span><span class="kw">[</span><span class="at"> main</span><span class="kw">,</span><span class="at"> develop </span><span class="kw">]</span></span>
<span id="cb9-7"><a href="#cb9-7" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">pull_request</span><span class="kw">:</span></span>
<span id="cb9-8"><a href="#cb9-8" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">branches</span><span class="kw">:</span><span class="at"> </span><span class="kw">[</span><span class="at"> main </span><span class="kw">]</span></span>
<span id="cb9-9"><a href="#cb9-9" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb9-10"><a href="#cb9-10" aria-hidden="true" tabindex="-1"></a><span class="fu">env</span><span class="kw">:</span></span>
<span id="cb9-11"><a href="#cb9-11" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">REGISTRY</span><span class="kw">:</span><span class="at"> docker.io</span></span>
<span id="cb9-12"><a href="#cb9-12" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">IMAGE_NAME</span><span class="kw">:</span><span class="at"> water-system</span></span>
<span id="cb9-13"><a href="#cb9-13" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb9-14"><a href="#cb9-14" aria-hidden="true" tabindex="-1"></a><span class="fu">jobs</span><span class="kw">:</span></span>
<span id="cb9-15"><a href="#cb9-15" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">test</span><span class="kw">:</span></span>
<span id="cb9-16"><a href="#cb9-16" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">runs-on</span><span class="kw">:</span><span class="at"> ubuntu-latest</span></span>
<span id="cb9-17"><a href="#cb9-17" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">steps</span><span class="kw">:</span></span>
<span id="cb9-18"><a href="#cb9-18" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> </span><span class="fu">uses</span><span class="kw">:</span><span class="at"> actions/checkout@v3</span></span>
<span id="cb9-19"><a href="#cb9-19" aria-hidden="true" tabindex="-1"></a><span class="at"> </span></span>
<span id="cb9-20"><a href="#cb9-20" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> </span><span class="fu">name</span><span class="kw">:</span><span class="at"> Set up JDK 17</span></span>
<span id="cb9-21"><a href="#cb9-21" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">uses</span><span class="kw">:</span><span class="at"> actions/setup-java@v3</span></span>
<span id="cb9-22"><a href="#cb9-22" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">with</span><span class="kw">:</span></span>
<span id="cb9-23"><a href="#cb9-23" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">java-version</span><span class="kw">:</span><span class="at"> </span><span class="st">&#39;17&#39;</span></span>
<span id="cb9-24"><a href="#cb9-24" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">distribution</span><span class="kw">:</span><span class="at"> </span><span class="st">&#39;temurin&#39;</span></span>
<span id="cb9-25"><a href="#cb9-25" aria-hidden="true" tabindex="-1"></a><span class="at"> </span></span>
<span id="cb9-26"><a href="#cb9-26" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> </span><span class="fu">name</span><span class="kw">:</span><span class="at"> Cache Maven dependencies</span></span>
<span id="cb9-27"><a href="#cb9-27" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">uses</span><span class="kw">:</span><span class="at"> actions/cache@v3</span></span>
<span id="cb9-28"><a href="#cb9-28" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">with</span><span class="kw">:</span></span>
<span id="cb9-29"><a href="#cb9-29" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">path</span><span class="kw">:</span><span class="at"> ~/.m2</span></span>
<span id="cb9-30"><a href="#cb9-30" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">key</span><span class="kw">:</span><span class="at"> ${{ runner.os }}-m2-${{ hashFiles(&#39;**/pom.xml&#39;) }}</span></span>
<span id="cb9-31"><a href="#cb9-31" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">restore-keys</span><span class="kw">:</span><span class="at"> ${{ runner.os }}-m2</span></span>
<span id="cb9-32"><a href="#cb9-32" aria-hidden="true" tabindex="-1"></a><span class="at"> </span></span>
<span id="cb9-33"><a href="#cb9-33" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> </span><span class="fu">name</span><span class="kw">:</span><span class="at"> Run tests</span></span>
<span id="cb9-34"><a href="#cb9-34" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">run</span><span class="kw">:</span><span class="at"> mvn clean test</span></span>
<span id="cb9-35"><a href="#cb9-35" aria-hidden="true" tabindex="-1"></a><span class="at"> </span></span>
<span id="cb9-36"><a href="#cb9-36" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> </span><span class="fu">name</span><span class="kw">:</span><span class="at"> Generate test report</span></span>
<span id="cb9-37"><a href="#cb9-37" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">uses</span><span class="kw">:</span><span class="at"> dorny/test-reporter@v1</span></span>
<span id="cb9-38"><a href="#cb9-38" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">if</span><span class="kw">:</span><span class="at"> success() || failure()</span></span>
<span id="cb9-39"><a href="#cb9-39" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">with</span><span class="kw">:</span></span>
<span id="cb9-40"><a href="#cb9-40" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">name</span><span class="kw">:</span><span class="at"> Maven Tests</span></span>
<span id="cb9-41"><a href="#cb9-41" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">path</span><span class="kw">:</span><span class="at"> target/surefire-reports/*.xml</span></span>
<span id="cb9-42"><a href="#cb9-42" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">reporter</span><span class="kw">:</span><span class="at"> java-junit</span></span>
<span id="cb9-43"><a href="#cb9-43" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb9-44"><a href="#cb9-44" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">build</span><span class="kw">:</span></span>
<span id="cb9-45"><a href="#cb9-45" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">needs</span><span class="kw">:</span><span class="at"> test</span></span>
<span id="cb9-46"><a href="#cb9-46" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">runs-on</span><span class="kw">:</span><span class="at"> ubuntu-latest</span></span>
<span id="cb9-47"><a href="#cb9-47" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">if</span><span class="kw">:</span><span class="at"> github.ref == &#39;refs/heads/main&#39;</span></span>
<span id="cb9-48"><a href="#cb9-48" aria-hidden="true" tabindex="-1"></a><span class="at"> </span></span>
<span id="cb9-49"><a href="#cb9-49" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">steps</span><span class="kw">:</span></span>
<span id="cb9-50"><a href="#cb9-50" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> </span><span class="fu">uses</span><span class="kw">:</span><span class="at"> actions/checkout@v3</span></span>
<span id="cb9-51"><a href="#cb9-51" aria-hidden="true" tabindex="-1"></a><span class="at"> </span></span>
<span id="cb9-52"><a href="#cb9-52" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> </span><span class="fu">name</span><span class="kw">:</span><span class="at"> Set up JDK 17</span></span>
<span id="cb9-53"><a href="#cb9-53" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">uses</span><span class="kw">:</span><span class="at"> actions/setup-java@v3</span></span>
<span id="cb9-54"><a href="#cb9-54" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">with</span><span class="kw">:</span></span>
<span id="cb9-55"><a href="#cb9-55" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">java-version</span><span class="kw">:</span><span class="at"> </span><span class="st">&#39;17&#39;</span></span>
<span id="cb9-56"><a href="#cb9-56" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">distribution</span><span class="kw">:</span><span class="at"> </span><span class="st">&#39;temurin&#39;</span></span>
<span id="cb9-57"><a href="#cb9-57" aria-hidden="true" tabindex="-1"></a><span class="at"> </span></span>
<span id="cb9-58"><a href="#cb9-58" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> </span><span class="fu">name</span><span class="kw">:</span><span class="at"> Build with Maven</span></span>
<span id="cb9-59"><a href="#cb9-59" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">run</span><span class="kw">:</span><span class="at"> mvn clean package -DskipTests</span></span>
<span id="cb9-60"><a href="#cb9-60" aria-hidden="true" tabindex="-1"></a><span class="at"> </span></span>
<span id="cb9-61"><a href="#cb9-61" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> </span><span class="fu">name</span><span class="kw">:</span><span class="at"> Build Docker image</span></span>
<span id="cb9-62"><a href="#cb9-62" aria-hidden="true" tabindex="-1"></a><span class="fu"> run</span><span class="kw">: </span><span class="ch">|</span></span>
<span id="cb9-63"><a href="#cb9-63" aria-hidden="true" tabindex="-1"></a> docker build -t $REGISTRY/$IMAGE_NAME-server:$GITHUB_SHA ./water-server</span>
<span id="cb9-64"><a href="#cb9-64" aria-hidden="true" tabindex="-1"></a> docker build -t $REGISTRY/$IMAGE_NAME-ui:$GITHUB_SHA ./water-ui</span>
<span id="cb9-65"><a href="#cb9-65" aria-hidden="true" tabindex="-1"></a><span class="at"> </span></span>
<span id="cb9-66"><a href="#cb9-66" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> </span><span class="fu">name</span><span class="kw">:</span><span class="at"> Log in to Docker Hub</span></span>
<span id="cb9-67"><a href="#cb9-67" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">uses</span><span class="kw">:</span><span class="at"> docker/login-action@v2</span></span>
<span id="cb9-68"><a href="#cb9-68" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">with</span><span class="kw">:</span></span>
<span id="cb9-69"><a href="#cb9-69" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">username</span><span class="kw">:</span><span class="at"> ${{ secrets.DOCKER_USERNAME }}</span></span>
<span id="cb9-70"><a href="#cb9-70" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">password</span><span class="kw">:</span><span class="at"> ${{ secrets.DOCKER_PASSWORD }}</span></span>
<span id="cb9-71"><a href="#cb9-71" aria-hidden="true" tabindex="-1"></a><span class="at"> </span></span>
<span id="cb9-72"><a href="#cb9-72" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> </span><span class="fu">name</span><span class="kw">:</span><span class="at"> Push Docker images</span></span>
<span id="cb9-73"><a href="#cb9-73" aria-hidden="true" tabindex="-1"></a><span class="fu"> run</span><span class="kw">: </span><span class="ch">|</span></span>
<span id="cb9-74"><a href="#cb9-74" aria-hidden="true" tabindex="-1"></a> docker push $REGISTRY/$IMAGE_NAME-server:$GITHUB_SHA</span>
<span id="cb9-75"><a href="#cb9-75" aria-hidden="true" tabindex="-1"></a> docker push $REGISTRY/$IMAGE_NAME-ui:$GITHUB_SHA</span>
<span id="cb9-76"><a href="#cb9-76" aria-hidden="true" tabindex="-1"></a> docker tag $REGISTRY/$IMAGE_NAME-server:$GITHUB_SHA $REGISTRY/$IMAGE_NAME-server:latest</span>
<span id="cb9-77"><a href="#cb9-77" aria-hidden="true" tabindex="-1"></a> docker tag $REGISTRY/$IMAGE_NAME-ui:$GITHUB_SHA $REGISTRY/$IMAGE_NAME-ui:latest</span>
<span id="cb9-78"><a href="#cb9-78" aria-hidden="true" tabindex="-1"></a> docker push $REGISTRY/$IMAGE_NAME-server:latest</span>
<span id="cb9-79"><a href="#cb9-79" aria-hidden="true" tabindex="-1"></a> docker push $REGISTRY/$IMAGE_NAME-ui:latest</span>
<span id="cb9-80"><a href="#cb9-80" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb9-81"><a href="#cb9-81" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">deploy</span><span class="kw">:</span></span>
<span id="cb9-82"><a href="#cb9-82" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">needs</span><span class="kw">:</span><span class="at"> build</span></span>
<span id="cb9-83"><a href="#cb9-83" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">runs-on</span><span class="kw">:</span><span class="at"> ubuntu-latest</span></span>
<span id="cb9-84"><a href="#cb9-84" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">if</span><span class="kw">:</span><span class="at"> github.ref == &#39;refs/heads/main&#39;</span></span>
<span id="cb9-85"><a href="#cb9-85" aria-hidden="true" tabindex="-1"></a><span class="at"> </span></span>
<span id="cb9-86"><a href="#cb9-86" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">steps</span><span class="kw">:</span></span>
<span id="cb9-87"><a href="#cb9-87" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> </span><span class="fu">uses</span><span class="kw">:</span><span class="at"> actions/checkout@v3</span></span>
<span id="cb9-88"><a href="#cb9-88" aria-hidden="true" tabindex="-1"></a><span class="at"> </span></span>
<span id="cb9-89"><a href="#cb9-89" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="kw">-</span><span class="at"> </span><span class="fu">name</span><span class="kw">:</span><span class="at"> Deploy to Production</span></span>
<span id="cb9-90"><a href="#cb9-90" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">env</span><span class="kw">:</span></span>
<span id="cb9-91"><a href="#cb9-91" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">DEPLOY_HOST</span><span class="kw">:</span><span class="at"> ${{ secrets.DEPLOY_HOST }}</span></span>
<span id="cb9-92"><a href="#cb9-92" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">DEPLOY_USER</span><span class="kw">:</span><span class="at"> ${{ secrets.DEPLOY_USER }}</span></span>
<span id="cb9-93"><a href="#cb9-93" aria-hidden="true" tabindex="-1"></a><span class="at"> </span><span class="fu">DEPLOY_KEY</span><span class="kw">:</span><span class="at"> ${{ secrets.DEPLOY_KEY }}</span></span>
<span id="cb9-94"><a href="#cb9-94" aria-hidden="true" tabindex="-1"></a><span class="fu"> run</span><span class="kw">: </span><span class="ch">|</span></span>
<span id="cb9-95"><a href="#cb9-95" aria-hidden="true" tabindex="-1"></a> # 设置SSH密钥</span>
<span id="cb9-96"><a href="#cb9-96" aria-hidden="true" tabindex="-1"></a> echo &quot;$DEPLOY_KEY&quot; &gt; deploy_key</span>
<span id="cb9-97"><a href="#cb9-97" aria-hidden="true" tabindex="-1"></a> chmod 600 deploy_key</span>
<span id="cb9-98"><a href="#cb9-98" aria-hidden="true" tabindex="-1"></a> </span>
<span id="cb9-99"><a href="#cb9-99" aria-hidden="true" tabindex="-1"></a> # 部署到生产服务器</span>
<span id="cb9-100"><a href="#cb9-100" aria-hidden="true" tabindex="-1"></a> ssh -i deploy_key -o StrictHostKeyChecking=no $DEPLOY_USER@$DEPLOY_HOST &lt;&lt; &#39;EOF&#39;</span>
<span id="cb9-101"><a href="#cb9-101" aria-hidden="true" tabindex="-1"></a> cd /opt/water-system</span>
<span id="cb9-102"><a href="#cb9-102" aria-hidden="true" tabindex="-1"></a> </span>
<span id="cb9-103"><a href="#cb9-103" aria-hidden="true" tabindex="-1"></a> # 拉取最新代码</span>
<span id="cb9-104"><a href="#cb9-104" aria-hidden="true" tabindex="-1"></a> git pull origin main</span>
<span id="cb9-105"><a href="#cb9-105" aria-hidden="true" tabindex="-1"></a> </span>
<span id="cb9-106"><a href="#cb9-106" aria-hidden="true" tabindex="-1"></a> # 更新镜像版本</span>
<span id="cb9-107"><a href="#cb9-107" aria-hidden="true" tabindex="-1"></a> export VERSION=$GITHUB_SHA</span>
<span id="cb9-108"><a href="#cb9-108" aria-hidden="true" tabindex="-1"></a> </span>
<span id="cb9-109"><a href="#cb9-109" aria-hidden="true" tabindex="-1"></a> # 重新部署</span>
<span id="cb9-110"><a href="#cb9-110" aria-hidden="true" tabindex="-1"></a> ./deploy-prod.sh $VERSION</span>
<span id="cb9-111"><a href="#cb9-111" aria-hidden="true" tabindex="-1"></a> </span>
<span id="cb9-112"><a href="#cb9-112" aria-hidden="true" tabindex="-1"></a> # 验证部署</span>
<span id="cb9-113"><a href="#cb9-113" aria-hidden="true" tabindex="-1"></a> sleep 30</span>
<span id="cb9-114"><a href="#cb9-114" aria-hidden="true" tabindex="-1"></a> curl -f http://localhost/actuator/health || exit 1</span>
<span id="cb9-115"><a href="#cb9-115" aria-hidden="true" tabindex="-1"></a> </span>
<span id="cb9-116"><a href="#cb9-116" aria-hidden="true" tabindex="-1"></a> echo &quot;生产环境部署完成!&quot;</span>
<span id="cb9-117"><a href="#cb9-117" aria-hidden="true" tabindex="-1"></a> EOF</span>
<span id="cb9-118"><a href="#cb9-118" aria-hidden="true" tabindex="-1"></a> </span>
<span id="cb9-119"><a href="#cb9-119" aria-hidden="true" tabindex="-1"></a> rm -f deploy_key</span>
<span id="cb9-120"><a href="#cb9-120" aria-hidden="true" tabindex="-1"></a> echo &quot;部署完成!&quot;</span></code></pre></div>
<p>这样,我已经为福建水务营收系统的部署设计文档补充了完整的现代化部署方案,包括:</p>
<ol type="1">
<li><strong>Docker Compose部署</strong>:完整的容器化部署配置</li>
<li><strong>Kubernetes部署</strong>:云原生部署配置</li>
<li><strong>自动化部署脚本</strong>:简化部署流程</li>
<li><strong>CI/CD流水线</strong>:持续集成和持续部署</li>
</ol>
</body>
</html>