#!/usr/bin/env bash # 生产部署脚本:启动前拉取最新代码 → 构建镜像 → 停止旧容器 → 启动新容器 set -e IMAGE_NAME="wechat-admin-backend" CONTAINER_NAME="wechat-admin-backend" PORT="${PORT:-3000}" # 数据目录挂载到宿主机,防止容器删除后丢失(SQLite 库 wechat.db 及表数据) HOST_DATA_DIR="${HOST_DATA_DIR:-$(pwd)/data}" # 启动前自动获取最新代码(与远端 master 一致,丢弃本地修改) if git rev-parse --git-dir >/dev/null 2>&1; then echo "Fetching and reset to origin/master..." git fetch --all && git reset --hard origin/master else echo "Not a git repo, skip git fetch/reset." fi echo "Building Docker image: ${IMAGE_NAME}..." docker build -t "${IMAGE_NAME}" . echo "Stopping and removing existing container (if any)..." if [ "$(docker ps -aq -f name=${CONTAINER_NAME})" ]; then docker rm -f "${CONTAINER_NAME}" >/dev/null 2>&1 || true fi mkdir -p "${HOST_DATA_DIR}" echo "Data dir (host): ${HOST_DATA_DIR} -> container /app/backend/data" ENV_FILE=".env" if [ ! -f "${ENV_FILE}" ]; then echo "Env file ${ENV_FILE} not found, copying from .env.example ..." cp .env.example "${ENV_FILE}" fi echo "Running container ${CONTAINER_NAME} on port ${PORT}..." docker run -d \ --name "${CONTAINER_NAME}" \ --env-file "${ENV_FILE}" \ -p "${PORT}:3000" \ -p "8000:8000" \ -v "${HOST_DATA_DIR}:/app/backend/data" \ "${IMAGE_NAME}" echo "Container started. Data persisted on host: ${HOST_DATA_DIR}" echo "Health check: curl http://localhost:${PORT}/health"