From 5ccf39022af3abad63179726739ccec51084df5a Mon Sep 17 00:00:00 2001 From: dekun Date: Fri, 22 May 2026 13:15:12 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitattributes | 3 + DEPLOY.md | 4 ++ deploy/docker-deploy.sh | 100 +++++++++++++++-------------- deploy/lib.sh | 38 +++++++++++ deploy/pm2-deploy.sh | 138 ++++++++++++++++++++-------------------- 5 files changed, 166 insertions(+), 117 deletions(-) create mode 100644 .gitattributes create mode 100644 deploy/lib.sh diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..fe2a8cf --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +* text=auto +*.sh text eol=lf +deploy/* text eol=lf diff --git a/DEPLOY.md b/DEPLOY.md index 3cb6d7b..0a8b798 100644 --- a/DEPLOY.md +++ b/DEPLOY.md @@ -67,6 +67,7 @@ sudo usermod -aG docker $USER ```bash cd /opt/Binance_Altcoin_Monitor +sed -i 's/\r$//' deploy/*.sh chmod +x deploy/docker-deploy.sh ./deploy/docker-deploy.sh ``` @@ -120,6 +121,7 @@ sudo npm install -g pm2 ```bash cd /opt/Binance_Altcoin_Monitor +sed -i 's/\r$//' deploy/*.sh # 若从 Windows 克隆,先去掉 CRLF chmod +x deploy/pm2-deploy.sh ./deploy/pm2-deploy.sh ``` @@ -280,6 +282,8 @@ pm2 restart binance-altcoin-monitor | 现象 | 处理 | |------|------| +| `bash\r: No such file or directory` | 脚本为 Windows 换行,执行:`sed -i 's/\r$//' deploy/*.sh && chmod +x deploy/*.sh` | +| `cannot pull with rebase: unstaged changes` | 执行 `git stash` 后重试;或 `DEPLOY_SKIP_GIT_PULL=1 ./deploy/pm2-deploy.sh` 跳过拉取 | | Web 无数据 | 检查能否访问币安;国内服务器尝试 `PROXY_ENABLED=true` | | 企微收不到 | 检查 `WECOM_WEBHOOK_URL`;`curl -X POST .../api/push/test` | | 08:10 未推送 | 确认容器/PM2 在 08:10 前已运行;查日志 | diff --git a/deploy/docker-deploy.sh b/deploy/docker-deploy.sh index 84ef5ab..5e92bfb 100644 --- a/deploy/docker-deploy.sh +++ b/deploy/docker-deploy.sh @@ -1,49 +1,51 @@ -#!/usr/bin/env bash -# Docker 一键部署 — 安装目录 /opt/Binance_Altcoin_Monitor -set -euo pipefail - -INSTALL_DIR="/opt/Binance_Altcoin_Monitor" -REPO_URL="${REPO_URL:-https://git.bz121.com/dekun/Binance_Altcoin_Monitor.git}" - -echo "==> Docker 部署 Binance Altcoin Monitor" -echo " 目录: ${INSTALL_DIR}" - -if ! command -v docker &>/dev/null; then - echo "错误: 未安装 docker,请先安装 Docker Engine 与 Compose 插件" - exit 1 -fi - -if [ ! -d "${INSTALL_DIR}/.git" ]; then - echo "==> 克隆仓库..." - sudo mkdir -p /opt - sudo git clone "${REPO_URL}" "${INSTALL_DIR}" - sudo chown -R "$(whoami):$(whoami)" "${INSTALL_DIR}" 2>/dev/null || true -else - echo "==> 更新代码..." - cd "${INSTALL_DIR}" - git pull --rebase -fi - -cd "${INSTALL_DIR}" - -if [ ! -f .env ]; then - echo "==> 创建 .env(请编辑 WECOM_WEBHOOK_URL 等)" - cp .env.example .env -fi - -mkdir -p data logs - -echo "==> 构建并启动容器..." -docker compose build --no-cache -docker compose up -d - -echo "" -echo "部署完成。" -echo " Web: http://$(hostname -I | awk '{print $1}'):${PORT:-21450}" -echo " 日志: docker compose -f ${INSTALL_DIR}/docker-compose.yml logs -f" -echo " 停止: docker compose -f ${INSTALL_DIR}/docker-compose.yml down" -echo "" -echo "开启 SOCKS5 代理: 编辑 ${INSTALL_DIR}/.env" -echo " PROXY_ENABLED=true" -echo " PROXY_URL=socks5h://192.168.8.4:1081" -echo " 然后: docker compose up -d --force-recreate" +#!/usr/bin/env bash +# Docker 一键部署 — 安装目录 /opt/Binance_Altcoin_Monitor +set -euo pipefail + +INSTALL_DIR="/opt/Binance_Altcoin_Monitor" +REPO_URL="${REPO_URL:-https://git.bz121.com/dekun/Binance_Altcoin_Monitor.git}" +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +# shellcheck source=lib.sh +source "${SCRIPT_DIR}/lib.sh" + +echo "==> Docker 部署 Binance Altcoin Monitor" +echo " 目录: ${INSTALL_DIR}" + +if ! command -v docker &>/dev/null; then + echo "错误: 未安装 docker,请先安装 Docker Engine 与 Compose 插件" + exit 1 +fi + +if [ ! -d "${INSTALL_DIR}/.git" ]; then + echo "==> 克隆仓库..." + sudo mkdir -p /opt + sudo git clone "${REPO_URL}" "${INSTALL_DIR}" + sudo chown -R "$(whoami):$(whoami)" "${INSTALL_DIR}" 2>/dev/null || true +else + echo "==> 更新代码..." + git_update_safe "${INSTALL_DIR}" +fi + +cd "${INSTALL_DIR}" + +if [ ! -f .env ]; then + echo "==> 创建 .env(请编辑 WECOM_WEBHOOK_URL 等)" + cp .env.example .env +fi + +mkdir -p data logs + +echo "==> 构建并启动容器..." +docker compose build --no-cache +docker compose up -d + +echo "" +echo "部署完成。" +echo " Web: http://$(hostname -I | awk '{print $1}'):${PORT:-21450}" +echo " 日志: docker compose -f ${INSTALL_DIR}/docker-compose.yml logs -f" +echo " 停止: docker compose -f ${INSTALL_DIR}/docker-compose.yml down" +echo "" +echo "开启 SOCKS5 代理: 编辑 ${INSTALL_DIR}/.env" +echo " PROXY_ENABLED=true" +echo " PROXY_URL=socks5h://192.168.8.4:1081" +echo " 然后: docker compose up -d --force-recreate" diff --git a/deploy/lib.sh b/deploy/lib.sh new file mode 100644 index 0000000..a71c84e --- /dev/null +++ b/deploy/lib.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash +# 部署脚本公共函数(LF 换行) + +# 安全拉取远程代码:有本地修改时先 stash,pull 失败不中断部署 +git_update_safe() { + local repo_dir="${1:?}" + cd "$repo_dir" + + if [ ! -d .git ]; then + return 0 + fi + + if [ "${DEPLOY_SKIP_GIT_PULL:-}" = "1" ]; then + echo " 已跳过 git pull (DEPLOY_SKIP_GIT_PULL=1)" + return 0 + fi + + local stashed=0 + if ! git diff --quiet 2>/dev/null || ! git diff --cached --quiet 2>/dev/null; then + echo " 检测到未提交修改,暂存到 git stash..." + if git stash push -m "deploy-auto-$(date +%Y%m%d%H%M%S)"; then + stashed=1 + else + echo " 警告: stash 失败,将尝试直接 pull" + fi + fi + + if git pull --rebase; then + echo " 代码已更新" + else + echo " 警告: git pull 失败,使用当前目录代码继续部署" + fi + + if [ "$stashed" = 1 ]; then + echo " 恢复本地修改 (git stash pop)..." + git stash pop || echo " 提示: stash 恢复冲突时可手动处理: git stash list" + fi +} diff --git a/deploy/pm2-deploy.sh b/deploy/pm2-deploy.sh index b9c04c9..6c429a7 100644 --- a/deploy/pm2-deploy.sh +++ b/deploy/pm2-deploy.sh @@ -1,68 +1,70 @@ -#!/usr/bin/env bash -# PM2 一键部署 — 安装目录 /opt/Binance_Altcoin_Monitor -set -euo pipefail - -INSTALL_DIR="/opt/Binance_Altcoin_Monitor" -REPO_URL="${REPO_URL:-https://git.bz121.com/dekun/Binance_Altcoin_Monitor.git}" - -echo "==> PM2 部署 Binance Altcoin Monitor" -echo " 目录: ${INSTALL_DIR}" - -if ! command -v python3 &>/dev/null; then - echo "错误: 未安装 python3" - exit 1 -fi - -if ! command -v pm2 &>/dev/null; then - echo "==> 安装 PM2..." - if command -v npm &>/dev/null; then - sudo npm install -g pm2 - else - echo "错误: 请先安装 Node.js/npm,或手动: npm install -g pm2" - exit 1 - fi -fi - -if [ ! -d "${INSTALL_DIR}/.git" ]; then - echo "==> 克隆仓库..." - sudo mkdir -p /opt - sudo git clone "${REPO_URL}" "${INSTALL_DIR}" - sudo chown -R "$(whoami):$(whoami)" "${INSTALL_DIR}" 2>/dev/null || true -else - echo "==> 更新代码..." - cd "${INSTALL_DIR}" - git pull --rebase -fi - -cd "${INSTALL_DIR}" - -if [ ! -f .env ]; then - echo "==> 创建 .env" - cp .env.example .env -fi - -mkdir -p data logs - -echo "==> 安装 Python 依赖..." -python3 -m pip install -U pip -q -python3 -m pip install -r backend/requirements.txt -q - -echo "==> 启动 PM2..." -pm2 delete binance-altcoin-monitor 2>/dev/null || true -pm2 start ecosystem.config.cjs -pm2 save - -# 开机自启(可选) -if command -v pm2 &>/dev/null; then - pm2 startup 2>/dev/null | tail -1 | grep -q sudo && \ - echo "提示: 若需开机自启,请执行上一条 pm2 startup 输出的 sudo 命令" || true -fi - -echo "" -echo "部署完成。" -echo " Web: http://$(hostname -I | awk '{print $1}'):21450" -echo " 状态: pm2 status" -echo " 日志: pm2 logs binance-altcoin-monitor" -echo "" -echo "开启 SOCKS5 代理: 编辑 ${INSTALL_DIR}/.env 后执行" -echo " pm2 restart binance-altcoin-monitor" +#!/usr/bin/env bash +# PM2 一键部署 — 安装目录 /opt/Binance_Altcoin_Monitor +set -euo pipefail + +INSTALL_DIR="/opt/Binance_Altcoin_Monitor" +REPO_URL="${REPO_URL:-https://git.bz121.com/dekun/Binance_Altcoin_Monitor.git}" +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +# shellcheck source=lib.sh +source "${SCRIPT_DIR}/lib.sh" + +echo "==> PM2 部署 Binance Altcoin Monitor" +echo " 目录: ${INSTALL_DIR}" + +if ! command -v python3 &>/dev/null; then + echo "错误: 未安装 python3" + exit 1 +fi + +if ! command -v pm2 &>/dev/null; then + echo "==> 安装 PM2..." + if command -v npm &>/dev/null; then + sudo npm install -g pm2 + else + echo "错误: 请先安装 Node.js/npm,或手动: npm install -g pm2" + exit 1 + fi +fi + +if [ ! -d "${INSTALL_DIR}/.git" ]; then + echo "==> 克隆仓库..." + sudo mkdir -p /opt + sudo git clone "${REPO_URL}" "${INSTALL_DIR}" + sudo chown -R "$(whoami):$(whoami)" "${INSTALL_DIR}" 2>/dev/null || true +else + echo "==> 更新代码..." + git_update_safe "${INSTALL_DIR}" +fi + +cd "${INSTALL_DIR}" + +if [ ! -f .env ]; then + echo "==> 创建 .env" + cp .env.example .env +fi + +mkdir -p data logs + +echo "==> 安装 Python 依赖..." +python3 -m pip install -U pip -q +python3 -m pip install -r backend/requirements.txt -q + +echo "==> 启动 PM2..." +pm2 delete binance-altcoin-monitor 2>/dev/null || true +pm2 start ecosystem.config.cjs +pm2 save + +# 开机自启(可选) +if command -v pm2 &>/dev/null; then + pm2 startup 2>/dev/null | tail -1 | grep -q sudo && \ + echo "提示: 若需开机自启,请执行上一条 pm2 startup 输出的 sudo 命令" || true +fi + +echo "" +echo "部署完成。" +echo " Web: http://$(hostname -I | awk '{print $1}'):21450" +echo " 状态: pm2 status" +echo " 日志: pm2 logs binance-altcoin-monitor" +echo "" +echo "开启 SOCKS5 代理: 编辑 ${INSTALL_DIR}/.env 后执行" +echo " pm2 restart binance-altcoin-monitor"