Procházet zdrojové kódy

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

- 停止/启动 systemd 服务 → 停止/启动 Podman 容器
- 部署时自动构建容器镜像
- 回滚逻辑同步改为容器方式
mqy20260511
humanleft před 2 týdny
rodič
revize
ea084791d6
1 změnil soubory, kde provedl 40 přidání a 20 odebrání
  1. 40
    20
      deploy/deploy.sh

+ 40
- 20
deploy/deploy.sh Zobrazit soubor

1
 #!/bin/bash
1
 #!/bin/bash
2
-# IoT Platform 一键部署脚本
2
+# IoT Platform 容器化一键部署脚本 (Podman)
3
 # 用法:
3
 # 用法:
4
 #   ./deploy.sh --build              # 本地构建后部署
4
 #   ./deploy.sh --build              # 本地构建后部署
5
 #   ./deploy.sh --jar path/to/jar    # 使用指定 jar 部署
5
 #   ./deploy.sh --jar path/to/jar    # 使用指定 jar 部署
107
 "
107
 "
108
 echo -e "${GREEN}[2/6] 备份完成${NC}"
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
 sleep 2
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
 ssh "${SERVER_USER}@${SERVER_HOST}" "
118
 ssh "${SERVER_USER}@${SERVER_HOST}" "
119
     cp ${REMOTE_DIR}/tmp/${JAR_NAME} ${REMOTE_DIR}/${APP_NAME}.jar
119
     cp ${REMOTE_DIR}/tmp/${JAR_NAME} ${REMOTE_DIR}/${APP_NAME}.jar
120
     chmod 644 ${REMOTE_DIR}/${APP_NAME}.jar
120
     chmod 644 ${REMOTE_DIR}/${APP_NAME}.jar
121
     rm -f ${REMOTE_DIR}/tmp/${JAR_NAME}
121
     rm -f ${REMOTE_DIR}/tmp/${JAR_NAME}
122
     echo '  新 JAR:'
122
     echo '  新 JAR:'
123
     ls -lh ${REMOTE_DIR}/${APP_NAME}.jar
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
 # 步骤 6: 健康检查
145
 # 步骤 6: 健康检查
135
 echo -e "${YELLOW}[6/6] 健康检查...${NC}"
146
 echo -e "${YELLOW}[6/6] 健康检查...${NC}"
144
     echo "备份:     ${BACKUP_NAME}"
155
     echo "备份:     ${BACKUP_NAME}"
145
     echo "状态:     成功"
156
     echo "状态:     成功"
146
     echo ""
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
     exit 0
163
     exit 0
150
 else
164
 else
151
     echo -e "${RED}[6/6] 健康检查失败!${NC}"
165
     echo -e "${RED}[6/6] 健康检查失败!${NC}"
153
     if [ "$NO_ROLLBACK" = true ]; then
167
     if [ "$NO_ROLLBACK" = true ]; then
154
         echo -e "${YELLOW}[no-rollback] 已启用不回滚模式,保留新版本用于排查${NC}"
168
         echo -e "${YELLOW}[no-rollback] 已启用不回滚模式,保留新版本用于排查${NC}"
155
         echo -e "${YELLOW}排查命令:${NC}"
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
         exit 1
172
         exit 1
159
     fi
173
     fi
160
 
174
 
161
     echo -e "${YELLOW}[rollback] 执行回滚...${NC}"
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
     if ssh "${SERVER_USER}@${SERVER_HOST}" "test -f ${REMOTE_DIR}/backup/${BACKUP_NAME}"; then
178
     if ssh "${SERVER_USER}@${SERVER_HOST}" "test -f ${REMOTE_DIR}/backup/${BACKUP_NAME}"; then
165
         echo -e "${YELLOW}[rollback] 恢复旧版本...${NC}"
179
         echo -e "${YELLOW}[rollback] 恢复旧版本...${NC}"
166
         ssh "${SERVER_USER}@${SERVER_HOST}" "
180
         ssh "${SERVER_USER}@${SERVER_HOST}" "
167
             cp ${REMOTE_DIR}/backup/${BACKUP_NAME} ${REMOTE_DIR}/${APP_NAME}.jar
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
         if ssh "${SERVER_USER}@${SERVER_HOST}" "bash ${REMOTE_DIR}/bin/health-check.sh localhost 8887 60"; then
192
         if ssh "${SERVER_USER}@${SERVER_HOST}" "bash ${REMOTE_DIR}/bin/health-check.sh localhost 8887 60"; then
173
             echo -e "${GREEN}[rollback] 回滚成功,旧版本已恢复${NC}"
193
             echo -e "${GREEN}[rollback] 回滚成功,旧版本已恢复${NC}"

Načítá se…
Zrušit
Uložit