4a80382b60
ci/woodpecker/tag/build Pipeline was successful
根因: 运行容器默认 UTC 且后端未设时区, time.Now()/gorm 时间戳/DSN loc=Local/手动 Format 全部按 UTC, 导致展示为"美国时间"、月度与每日 边界错位。修复: - main.go 在 database.Init 前固定 time.Local=Asia/Shanghai (DSN loc=Local 随之一致, 一处生效覆盖全部业务点) - pending_school.go 今日判断改北京时间当日0点(原 Truncate 按UTC午夜偏移8h) - Dockerfile/build.yml/compose 加 TZ=Asia/Shanghai 双保险 配套: 存量 datetime 列已 +8h 迁移(备份 /root/cpdaily-backup-pre-tz-*.sql)
156 lines
6.3 KiB
YAML
156 lines
6.3 KiB
YAML
when:
|
|
- event: tag
|
|
tag: v*
|
|
|
|
clone:
|
|
git:
|
|
image: woodpeckerci/plugin-git
|
|
settings:
|
|
remote: http://10.10.10.128:3000/becomer/cpdaily_xiaozhushou.git
|
|
|
|
steps:
|
|
build-image:
|
|
name: 构建 Docker 镜像
|
|
image: docker
|
|
commands: |
|
|
docker build -t cpdaily-xiaozhushou:latest .
|
|
docker tag cpdaily-xiaozhushou:latest cpdaily-xiaozhushou:${CI_COMMIT_TAG:-${CI_COMMIT_SHA:0:8}}
|
|
volumes:
|
|
- /var/run/docker.sock:/var/run/docker.sock
|
|
|
|
deploy:
|
|
name: 蓝绿部署
|
|
image: docker
|
|
commands: |
|
|
set -e
|
|
|
|
IMAGE_TAG="${CI_COMMIT_TAG:-latest}"
|
|
|
|
# 确保网络存在
|
|
docker network create likedream-net 2>/dev/null || true
|
|
|
|
# ============================================================
|
|
# 第一步:初始化 1Panel 站点配置(首次部署时才需要)
|
|
# ============================================================
|
|
# nginx 配置文件在 git clone 后位于 deploy/nginx/ 目录
|
|
# 应用配置由宿主机 /opt/cpdaily-xiaozhushou/config.toml 运维维护
|
|
# (已移出版本库,避免密钥入库;容器以只读挂载方式读取)
|
|
|
|
if ! docker exec 1Panel-openresty-ESmn ls /www/sites/xiaozhushou/proxy/api.conf 2>/dev/null; then
|
|
echo "=== 首次部署:创建 1Panel 站点配置 ==="
|
|
docker exec 1Panel-openresty-ESmn mkdir -p /www/sites/xiaozhushou/proxy /www/sites/xiaozhushou/log
|
|
docker cp deploy/nginx/xiaozhushou.conf 1Panel-openresty-ESmn:/usr/local/openresty/nginx/conf/conf.d/xiaozhushou.conf
|
|
docker cp deploy/nginx/api.conf 1Panel-openresty-ESmn:/www/sites/xiaozhushou/proxy/api.conf
|
|
docker exec 1Panel-openresty-ESmn nginx -s reload
|
|
echo " 1Panel 站点配置完成 ✓"
|
|
fi
|
|
|
|
# ============================================================
|
|
# 第二步:读取当前代理端口,确定蓝绿状态
|
|
# ============================================================
|
|
CURRENT_PORT=$(docker exec 1Panel-openresty-ESmn \
|
|
grep -o 'proxy_pass http://10.10.10.128:[0-9]\+' \
|
|
/www/sites/xiaozhushou/proxy/api.conf | grep -o '[0-9]\+$')
|
|
echo "=== 当前 1Panel 反代端口: $CURRENT_PORT ==="
|
|
|
|
if [ "$CURRENT_PORT" = "8884" ]; then
|
|
PORT_ACTIVE=8884
|
|
PORT_STANDBY=8885
|
|
elif [ "$CURRENT_PORT" = "8885" ]; then
|
|
PORT_ACTIVE=8885
|
|
PORT_STANDBY=8884
|
|
else
|
|
echo "未知当前端口 $CURRENT_PORT,默认使用 8884/8885"
|
|
PORT_ACTIVE=8884
|
|
PORT_STANDBY=8885
|
|
fi
|
|
echo " 活跃: $PORT_ACTIVE | 备用: $PORT_STANDBY"
|
|
|
|
# 清理之前可能残留的临时容器
|
|
docker rm -f cpdaily-xiaozhushou-new 2>/dev/null || true
|
|
|
|
# ============================================================
|
|
# 第三步:在备用端口启动新容器
|
|
# ============================================================
|
|
echo "=== 蓝绿部署: 启动新容器 on :$PORT_STANDBY (image: $IMAGE_TAG) ==="
|
|
|
|
docker run -d --name cpdaily-xiaozhushou-new \
|
|
--restart unless-stopped \
|
|
--network likedream-net \
|
|
-e TZ=Asia/Shanghai \
|
|
-p $PORT_STANDBY:8093 \
|
|
-v /opt/cpdaily-xiaozhushou/config.toml:/app/config.toml:ro \
|
|
cpdaily-xiaozhushou:$IMAGE_TAG
|
|
|
|
# ============================================================
|
|
# 第四步:健康检查
|
|
# ============================================================
|
|
HEALTHY=false
|
|
for i in $(seq 1 15); do
|
|
if wget -q --timeout=3 -O /dev/null http://10.10.10.128:$PORT_STANDBY/health 2>/dev/null; then
|
|
HEALTHY=true
|
|
break
|
|
fi
|
|
echo " 等待新容器就绪... ($i/15)"
|
|
sleep 2
|
|
done
|
|
|
|
if [ "$HEALTHY" = false ]; then
|
|
echo "ERROR: 新容器未通过健康检查,回滚"
|
|
docker stop cpdaily-xiaozhushou-new
|
|
docker rm cpdaily-xiaozhushou-new
|
|
exit 1
|
|
fi
|
|
echo " 新容器已就绪 ✓"
|
|
|
|
# ============================================================
|
|
# 第五步:切换 1Panel 代理到备用端口
|
|
# ============================================================
|
|
echo "=== 切换 1Panel 反代 :$PORT_ACTIVE → :$PORT_STANDBY ==="
|
|
docker exec 1Panel-openresty-ESmn \
|
|
sed -i "s|:$PORT_ACTIVE|:$PORT_STANDBY|g" \
|
|
/www/sites/xiaozhushou/proxy/api.conf
|
|
docker exec 1Panel-openresty-ESmn nginx -s reload
|
|
echo " Nginx 热加载完成(零中断)✓"
|
|
|
|
# ============================================================
|
|
# 第六步:停止旧容器
|
|
# ============================================================
|
|
echo "=== 清理旧容器 ==="
|
|
docker stop cpdaily-xiaozhushou 2>/dev/null || true
|
|
docker rm cpdaily-xiaozhushou 2>/dev/null || true
|
|
|
|
# ============================================================
|
|
# 第七步:在活跃端口启动正式容器
|
|
# ============================================================
|
|
echo "=== 启动正式容器 on :$PORT_ACTIVE ==="
|
|
docker run -d --name cpdaily-xiaozhushou \
|
|
--restart unless-stopped \
|
|
--network likedream-net \
|
|
-e TZ=Asia/Shanghai \
|
|
-p $PORT_ACTIVE:8093 \
|
|
-v /opt/cpdaily-xiaozhushou/config.toml:/app/config.toml:ro \
|
|
cpdaily-xiaozhushou:$IMAGE_TAG
|
|
|
|
# ============================================================
|
|
# 第八步:切回 1Panel 代理到活跃端口
|
|
# ============================================================
|
|
echo "=== 切回 1Panel 反代 :$PORT_STANDBY → :$PORT_ACTIVE ==="
|
|
docker exec 1Panel-openresty-ESmn \
|
|
sed -i "s|:$PORT_STANDBY|:$PORT_ACTIVE|g" \
|
|
/www/sites/xiaozhushou/proxy/api.conf
|
|
docker exec 1Panel-openresty-ESmn nginx -s reload
|
|
echo " Nginx 热加载完成(零中断)✓"
|
|
|
|
# ============================================================
|
|
# 第九步:清理
|
|
# ============================================================
|
|
echo "=== 清理 ==="
|
|
docker rm -f cpdaily-xiaozhushou-new 2>/dev/null || true
|
|
docker images cpdaily-xiaozhushou --format '{{.Tag}}' | grep -v latest | head -n -3 | while read tag; do
|
|
docker rmi cpdaily-xiaozhushou:$tag 2>/dev/null || true
|
|
done
|
|
echo "=== 部署完成 ✓ ==="
|
|
volumes:
|
|
- /var/run/docker.sock:/var/run/docker.sock
|