From ab84355cdc405ee299dd27a71141cda08b749abc Mon Sep 17 00:00:00 2001 From: yml2213 Date: Wed, 24 Jun 2026 16:11:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=88=E5=B9=B6=E5=90=AF=E5=8A=A8=E8=84=9A?= =?UTF-8?q?=E6=9C=AC=E5=88=B0deploy.sh=EF=BC=8C=E6=94=AF=E6=8C=81reset?= =?UTF-8?q?=E9=87=8D=E7=BD=AE=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 删除 start_web.sh,统一使用 deploy.sh(Docker部署) - 新增子命令:reset(删除所有数据需确认)、logs、stop、restart - 更新 README 文档 --- README.md | 55 +++--------- deploy.sh | 241 ++++++++++++++++++++++++++++++++++++++------------- start_web.sh | 108 ----------------------- 3 files changed, 196 insertions(+), 208 deletions(-) delete mode 100755 start_web.sh diff --git a/README.md b/README.md index 4cbffab..6f2c220 100644 --- a/README.md +++ b/README.md @@ -35,30 +35,29 @@ douyu_login_py/ ├── utils/ # 通用工具 │ └── logger.py ├── data/ # 运行时数据(gitignore) -├── start_web.sh # 一键启动 +├── deploy.sh # 部署/重置工具 └── pyproject.toml ``` ## 快速开始 ```bash -# 一键启动(自动检查依赖) -./start_web.sh +# Docker 部署(推荐) +./deploy.sh ``` -或手动启动: +访问 `http://localhost:8000`,默认账号 `admin / admin123`。 + +**常用命令:** ```bash -# 后端 -uv pip install -e . -.venv/bin/python -m uvicorn web.backend.main:app --reload --port 8000 - -# 前端 -cd web/frontend && npm install && npm run dev +./deploy.sh # 构建并部署 +./deploy.sh logs # 查看实时日志 +./deploy.sh stop # 停止服务 +./deploy.sh restart # 重启服务 +./deploy.sh reset # 重置所有数据(需二次确认) ``` -访问 `http://localhost:5173`,默认账号 `admin / admin123`。 - ### 敏感数据加密 账号密码、邮箱密码、Cookie、代理密钥等敏感字段会以密文形式落盘。生产环境请在 `.env` 中设置稳定的 `APP_ENCRYPTION_KEY`,并长期保留;更换该密钥会导致历史密文无法解密。 @@ -100,46 +99,20 @@ MIT License ## 部署 -### Docker 部署(推荐,生产环境) +### Docker 部署 ```bash # 一键部署(自动构建镜像 + 启动服务) ./deploy.sh -# 或手动操作: -docker compose up -d --build +# 重置所有数据(删除数据库/Cookie/日志,需二次确认) +./deploy.sh reset ``` 部署完成后访问 `http://服务器IP:8000`,默认账号 `admin / admin123`。 -**Docker 常用命令:** - -```bash -docker compose logs -f # 查看实时日志 -docker compose restart # 重启服务 -docker compose down # 停止服务 -docker compose up -d --build # 重新构建并启动(代码更新后) -``` - **数据持久化:** 数据库和日志通过 volume 挂载到宿主机 `./data` 和 `./logs` 目录,容器重建后数据不丢失。 -### 本地开发 - -```bash -# 一键启动(自动检查依赖,前后端分离开发模式) -./start_web.sh - -# 或手动启动: -# 后端 -uv pip install -e . -.venv/bin/python -m uvicorn web.backend.main:app --reload --port 8000 - -# 前端 -cd web/frontend && npm install && npm run dev -``` - -访问 `http://localhost:5173`(开发模式),默认账号 `admin / admin123`。 - ### 代理配置说明 在 Web 界面"代理配置"页面设置: diff --git a/deploy.sh b/deploy.sh index 110a874..3c18fb3 100755 --- a/deploy.sh +++ b/deploy.sh @@ -6,67 +6,190 @@ set -e ROOT_DIR="$(cd "$(dirname "$0")" && pwd)" cd "$ROOT_DIR" -echo "" -echo "==============================" -echo " 斗鱼批量登录 - Docker 部署" -echo "==============================" +# ── 工具函数 ────────────────────────────────────────────── -# 检查 Docker -if ! command -v docker &> /dev/null; then - echo "❌ 未安装 Docker,请先安装:" - echo " curl -fsSL https://get.docker.com | sh" - exit 1 -fi - -# 检查 docker compose -if docker compose version &> /dev/null; then - COMPOSE="docker compose" -elif command -v docker-compose &> /dev/null; then - COMPOSE="docker-compose" -else - echo "❌ 未安装 docker compose,请先安装 Docker Compose" - exit 1 -fi - -echo " 使用: $COMPOSE" -echo "" - -# 创建数据和日志目录 -mkdir -p data logs - -# 构建并启动 -echo "正在构建镜像(首次构建约3-5分钟)..." -$COMPOSE build - -echo "" -echo "正在启动服务..." -$COMPOSE up -d - -echo "" -echo "等待服务启动..." -sleep 3 - -# 健康检查 -for i in $(seq 1 10); do - if curl -s http://localhost:8000/api/health | grep -q "ok" 2>/dev/null; then +detect_compose() { + if docker compose version &> /dev/null; then + echo "docker compose" + elif command -v docker-compose &> /dev/null; then + echo "docker-compose" + else echo "" - echo "==============================" - echo " ✅ 部署成功!" - echo "==============================" - echo " 访问地址: http://localhost:8000" - echo " 默认账号见环境变量 ADMIN_USERNAME/ADMIN_PASSWORD(未设置则为 admin/admin123)" - echo "" - echo " 查看日志: $COMPOSE logs -f" - echo " 停止服务: $COMPOSE down" - echo " 重启服务: $COMPOSE restart" - echo "==============================" + fi +} + +# ── 子命令 ────────────────────────────────────────────── + +cmd_deploy() { + echo "" + echo "==============================" + echo " 斗鱼批量登录 - Docker 部署" + echo "==============================" + + if ! command -v docker &> /dev/null; then + echo "❌ 未安装 Docker,请先安装:" + echo " curl -fsSL https://get.docker.com | sh" + exit 1 + fi + + COMPOSE=$(detect_compose) + if [ -z "$COMPOSE" ]; then + echo "❌ 未安装 docker compose,请先安装 Docker Compose" + exit 1 + fi + + echo " 使用: $COMPOSE" + echo "" + + # 创建数据和日志目录 + mkdir -p data logs + + # 构建并启动 + echo "正在构建镜像(首次构建约3-5分钟)..." + $COMPOSE build + + echo "" + echo "正在启动服务..." + $COMPOSE up -d + + echo "" + echo "等待服务启动..." + + # 健康检查 + for i in $(seq 1 15); do + if curl -s http://localhost:8000/api/health | grep -q "ok" 2>/dev/null; then + echo "" + echo "==============================" + echo " ✅ 部署成功!" + echo "==============================" + echo " 访问地址: http://localhost:8000" + echo " 默认账号见环境变量 ADMIN_USERNAME/ADMIN_PASSWORD(未设置则为 admin/admin123)" + echo "" + echo " 查看日志: $COMPOSE logs -f" + echo " 停止服务: $COMPOSE down" + echo " 重启服务: $COMPOSE restart" + echo " 重置数据: ./deploy.sh reset" + echo "==============================" + exit 0 + fi + echo " 等待中... ($i/15)" + sleep 2 + done + + echo "" + echo "❌ 服务启动超时,查看日志:" + $COMPOSE logs --tail 30 + exit 1 +} + +cmd_reset() { + echo "" + echo "==============================" + echo " ⚠️ 重置所有数据" + echo "==============================" + echo "" + echo " 将删除以下内容:" + echo " • 数据库文件 (data/web.db)" + echo " • 历史Cookie (data/cookies/)" + echo " • 应用日志 (logs/)" + echo " • Docker容器和镜像" + echo "" + + # 交互确认 + read -rp " 确认删除所有数据?输入 YES 继续: " confirm + if [ "$confirm" != "YES" ]; then + echo " 已取消" exit 0 fi - echo " 等待中... ($i/10)" - sleep 2 -done -echo "" -echo "❌ 服务启动超时,查看日志:" -$COMPOSE logs --tail 30 -exit 1 + COMPOSE=$(detect_compose) + + # 停止并删除容器 + if [ -n "$COMPOSE" ]; then + echo " 停止并删除容器..." + $COMPOSE down --rmi local 2>/dev/null || $COMPOSE down 2>/dev/null || true + fi + + # 删除数据文件 + echo " 删除数据库..." + rm -rf data/web.db data/web.db-shm data/web.db-wal + + echo " 删除Cookie..." + rm -rf data/cookies/ + + echo " 删除日志..." + rm -rf logs/*.log + + # 删除其他临时文件 + rm -rf data/accounts.json data/gui_state.json data/app.db 2>/dev/null || true + + echo "" + echo "==============================" + echo " ✅ 数据已重置" + echo "==============================" + echo " 运行 ./deploy.sh 重新部署" + echo "==============================" +} + +cmd_logs() { + COMPOSE=$(detect_compose) + if [ -z "$COMPOSE" ]; then + echo "❌ 未检测到 docker compose" + exit 1 + fi + $COMPOSE logs -f +} + +cmd_stop() { + COMPOSE=$(detect_compose) + if [ -z "$COMPOSE" ]; then + echo "❌ 未检测到 docker compose" + exit 1 + fi + $COMPOSE down + echo "✅ 服务已停止" +} + +cmd_restart() { + COMPOSE=$(detect_compose) + if [ -z "$COMPOSE" ]; then + echo "❌ 未检测到 docker compose" + exit 1 + fi + $COMPOSE restart + echo "✅ 服务已重启" +} + +# ── 帮助 ────────────────────────────────────────────────── + +cmd_help() { + echo "" + echo "==============================" + echo " 斗鱼批量登录 - 部署工具" + echo "==============================" + echo "" + echo " 用法: ./deploy.sh <命令>" + echo "" + echo " 命令:" + echo " (无参数) 构建并部署" + echo " reset 删除所有数据并重置(需确认)" + echo " logs 查看实时日志" + echo " stop 停止服务" + echo " restart 重启服务" + echo " help 显示帮助" + echo "" + echo " 访问地址: http://localhost:8000" + echo " 默认账号见环境变量 ADMIN_USERNAME/ADMIN_PASSWORD" + echo "" +} + +# ── 入口 ────────────────────────────────────────────────── + +case "${1:-}" in + reset) cmd_reset ;; + logs) cmd_logs ;; + stop) cmd_stop ;; + restart) cmd_restart ;; + help|-h) cmd_help ;; + *) cmd_deploy ;; +esac diff --git a/start_web.sh b/start_web.sh deleted file mode 100755 index 25b0942..0000000 --- a/start_web.sh +++ /dev/null @@ -1,108 +0,0 @@ -#!/usr/bin/env bash -set -eo pipefail - -ROOT_DIR="$(cd "$(dirname "$0")" && pwd)" -cd "$ROOT_DIR" - -PYTHON="$ROOT_DIR/.venv/bin/python" -FRONTEND_DIR="$ROOT_DIR/web/frontend" -BACKEND_PORT=8000 -FRONTEND_PORT=5173 -HEALTH_TIMEOUT=30 # 后端健康检查最长等待秒数 - -# ── 工具函数 ────────────────────────────────────────────── - -log() { echo "[$(date '+%H:%M:%S')] $*"; } -warn() { echo "[$(date '+%H:%M:%S')] ⚠️ $*" >&2; } -die() { echo "[$(date '+%H:%M:%S')] ❌ $*" >&2; exit 1; } - -check_port() { - if lsof -iTCP:"$1" -sTCP:LISTEN -P &>/dev/null; then - die "端口 $1 已被占用,请先释放或更改端口号(lsof -i :$1)" - fi -} - -# ── 预检查 ──────────────────────────────────────────────── - -check_port "$BACKEND_PORT" -check_port "$FRONTEND_PORT" - -if [ ! -f "$PYTHON" ]; then - log "未找到 .venv,正在创建..." - uv venv .venv - uv pip install -e . -fi - -if [ ! -d "$FRONTEND_DIR/node_modules" ]; then - log "前端依赖未安装,正在安装..." - (cd "$FRONTEND_DIR" && npm install) -fi - -# ── 启动信息 ────────────────────────────────────────────── - -echo "" -echo "==============================" -echo " 斗鱼批量登录 - Web 后台" -echo "==============================" -echo " 后端: http://localhost:$BACKEND_PORT" -echo " 前端: http://localhost:$FRONTEND_PORT" -echo " 默认账号见环境变量 ADMIN_USERNAME/ADMIN_PASSWORD(未设置则为 admin/admin123)" -echo " 按 Ctrl+C 停止所有服务" -echo "==============================" -echo "" - -# ── 清理子进程 ──────────────────────────────────────────── - -PIDS=() - -cleanup() { - echo "" - log "正在停止服务..." - for pid in "${PIDS[@]}"; do - if kill -0 "$pid" 2>/dev/null; then - kill "$pid" 2>/dev/null - fi - done - for pid in "${PIDS[@]}"; do - wait "$pid" 2>/dev/null - done - log "已停止" -} -trap cleanup EXIT INT TERM - -# ── 启动后端 ────────────────────────────────────────────── - -log "启动后端 (FastAPI :$BACKEND_PORT)..." -RELOAD_FLAG="" -if [ "${UVICORN_RELOAD:-true}" = "true" ]; then - RELOAD_FLAG="--reload" -fi -"$PYTHON" -m uvicorn web.backend.main:app --host 0.0.0.0 --port "$BACKEND_PORT" $RELOAD_FLAG & -PIDS+=($!) - -# 等后端就绪(健康检查循环替代固定 sleep) -log "等待后端就绪(最多 ${HEALTH_TIMEOUT}s)..." -elapsed=0 -while [ "$elapsed" -lt "$HEALTH_TIMEOUT" ]; do - if curl -sf "http://localhost:$BACKEND_PORT/docs" -o /dev/null 2>/dev/null; then - log "后端已就绪 ✓" - break - fi - sleep 1 - elapsed=$((elapsed + 1)) -done -if [ "$elapsed" -ge "$HEALTH_TIMEOUT" ]; then - warn "后端未在 ${HEALTH_TIMEOUT}s 内就绪,前端可能无法正常连接" -fi - -# ── 启动前端 ────────────────────────────────────────────── - -log "启动前端 (Vite :$FRONTEND_PORT)..." -cd "$FRONTEND_DIR" -npm run dev -- --port "$FRONTEND_PORT" --host 0.0.0.0 & -PIDS+=($!) -cd "$ROOT_DIR" - -# ── 等待子进程 ──────────────────────────────────────────── - -wait