Преглед на файлове

chore(deploy): 部署脚本改为容器化 (Podman)

- 停止/启动 systemd 服务 → 停止/启动 Podman 容器
- 部署时自动构建容器镜像
- 回滚逻辑同步改为容器方式
mqy20260511
humanleft преди 2 седмици
родител
ревизия
ea084791d6
променени са 1 файла, в които са добавени 40 реда и са изтрити 20 реда
  1. 40
    20
      deploy/deploy.sh

+ 40
- 20
deploy/deploy.sh Целия файл

@@ -1,5 +1,5 @@
1 1
 #!/bin/bash
2
-# IoT Platform 一键部署脚本
2
+# IoT Platform 容器化一键部署脚本 (Podman)
3 3
 # 用法:
4 4
 #   ./deploy.sh --build              # 本地构建后部署
5 5
 #   ./deploy.sh --jar path/to/jar    # 使用指定 jar 部署
@@ -107,29 +107,40 @@ ssh "${SERVER_USER}@${SERVER_HOST}" "
107 107
 "
108 108
 echo -e "${GREEN}[2/6] 备份完成${NC}"
109 109
 
110
-# 步骤 3: 停止服务
111
-echo -e "${YELLOW}[3/6] 停止服务...${NC}"
112
-ssh "${SERVER_USER}@${SERVER_HOST}" "systemctl stop ${APP_NAME} || true"
110
+# 步骤 3: 停止旧容器
111
+echo -e "${YELLOW}[3/6] 停止旧容器...${NC}"
112
+ssh "${SERVER_USER}@${SERVER_HOST}" "podman stop ${APP_NAME} >/dev/null 2>&1 && podman rm ${APP_NAME} >/dev/null 2>&1 || true"
113 113
 sleep 2
114
-echo -e "${GREEN}[3/6] 服务已停止${NC}"
114
+echo -e "${GREEN}[3/6] 旧容器已清理${NC}"
115 115
 
116
-# 步骤 4: 替换 JAR
117
-echo -e "${YELLOW}[4/6] 替换 JAR...${NC}"
116
+# 步骤 4: 替换 JAR 并构建镜像
117
+echo -e "${YELLOW}[4/6] 替换 JAR 并构建镜像...${NC}"
118 118
 ssh "${SERVER_USER}@${SERVER_HOST}" "
119 119
     cp ${REMOTE_DIR}/tmp/${JAR_NAME} ${REMOTE_DIR}/${APP_NAME}.jar
120 120
     chmod 644 ${REMOTE_DIR}/${APP_NAME}.jar
121 121
     rm -f ${REMOTE_DIR}/tmp/${JAR_NAME}
122 122
     echo '  新 JAR:'
123 123
     ls -lh ${REMOTE_DIR}/${APP_NAME}.jar
124
+    echo '  构建镜像...'
125
+    cd ${REMOTE_DIR} && podman build -t ${APP_NAME}:latest . >/dev/null 2>&1
126
+    echo '  镜像构建完成'
127
+    podman images | grep ${APP_NAME}
124 128
 "
125
-echo -e "${GREEN}[4/6] 替换完成${NC}"
129
+echo -e "${GREEN}[4/6] 镜像构建完成${NC}"
126 130
 
127
-# 步骤 5: 启动服务
128
-echo -e "${YELLOW}[5/6] 启动服务...${NC}"
129
-ssh "${SERVER_USER}@${SERVER_HOST}" "systemctl start ${APP_NAME}"
130
-sleep 3
131
+# 步骤 5: 启动容器
132
+echo -e "${YELLOW}[5/6] 启动容器...${NC}"
133
+ssh "${SERVER_USER}@${SERVER_HOST}" "
134
+    podman run -d \
135
+        --name ${APP_NAME} \
136
+        --network host \
137
+        --restart unless-stopped \
138
+        -v ${REMOTE_DIR}/logs:/opt/iot-platform/logs \
139
+        localhost/${APP_NAME}:latest >/dev/null 2>&1
140
+"
141
+sleep 5
131 142
 
132
-echo -e "${GREEN}[5/6] 服务已启动${NC}"
143
+echo -e "${GREEN}[5/6] 容器已启动${NC}"
133 144
 
134 145
 # 步骤 6: 健康检查
135 146
 echo -e "${YELLOW}[6/6] 健康检查...${NC}"
@@ -144,8 +155,11 @@ if ssh "${SERVER_USER}@${SERVER_HOST}" "bash ${REMOTE_DIR}/bin/health-check.sh l
144 155
     echo "备份:     ${BACKUP_NAME}"
145 156
     echo "状态:     成功"
146 157
     echo ""
147
-    echo "服务状态:"
148
-    ssh "${SERVER_USER}@${SERVER_HOST}" "systemctl status ${APP_NAME} --no-pager"
158
+    echo "容器状态:"
159
+    ssh "${SERVER_USER}@${SERVER_HOST}" "podman ps | grep ${APP_NAME}"
160
+    echo ""
161
+    echo "查看日志:"
162
+    echo "  ssh ${SERVER_USER}@${SERVER_HOST} 'podman logs -f ${APP_NAME}'"
149 163
     exit 0
150 164
 else
151 165
     echo -e "${RED}[6/6] 健康检查失败!${NC}"
@@ -153,21 +167,27 @@ else
153 167
     if [ "$NO_ROLLBACK" = true ]; then
154 168
         echo -e "${YELLOW}[no-rollback] 已启用不回滚模式,保留新版本用于排查${NC}"
155 169
         echo -e "${YELLOW}排查命令:${NC}"
156
-        echo "  ssh ${SERVER_USER}@${SERVER_HOST} 'journalctl -u ${APP_NAME} -f'"
157
-        echo "  ssh ${SERVER_USER}@${SERVER_HOST} 'systemctl status ${APP_NAME}'"
170
+        echo "  ssh ${SERVER_USER}@${SERVER_HOST} 'podman logs -f ${APP_NAME}'"
171
+        echo "  ssh ${SERVER_USER}@${SERVER_HOST} 'podman ps | grep ${APP_NAME}'"
158 172
         exit 1
159 173
     fi
160 174
 
161 175
     echo -e "${YELLOW}[rollback] 执行回滚...${NC}"
162
-    ssh "${SERVER_USER}@${SERVER_HOST}" "systemctl stop ${APP_NAME} || true"
176
+    ssh "${SERVER_USER}@${SERVER_HOST}" "podman stop ${APP_NAME} >/dev/null 2>&1 && podman rm ${APP_NAME} >/dev/null 2>&1 || true"
163 177
 
164 178
     if ssh "${SERVER_USER}@${SERVER_HOST}" "test -f ${REMOTE_DIR}/backup/${BACKUP_NAME}"; then
165 179
         echo -e "${YELLOW}[rollback] 恢复旧版本...${NC}"
166 180
         ssh "${SERVER_USER}@${SERVER_HOST}" "
167 181
             cp ${REMOTE_DIR}/backup/${BACKUP_NAME} ${REMOTE_DIR}/${APP_NAME}.jar
168
-            systemctl start ${APP_NAME}
182
+            cd ${REMOTE_DIR} && podman build -t ${APP_NAME}:latest . >/dev/null 2>&1
183
+            podman run -d \
184
+                --name ${APP_NAME} \
185
+                --network host \
186
+                --restart unless-stopped \
187
+                -v ${REMOTE_DIR}/logs:/opt/iot-platform/logs \
188
+                localhost/${APP_NAME}:latest >/dev/null 2>&1
169 189
         "
170
-        sleep 3
190
+        sleep 5
171 191
 
172 192
         if ssh "${SERVER_USER}@${SERVER_HOST}" "bash ${REMOTE_DIR}/bin/health-check.sh localhost 8887 60"; then
173 193
             echo -e "${GREEN}[rollback] 回滚成功,旧版本已恢复${NC}"

Loading…
Отказ
Запис