合并启动脚本到deploy.sh,支持reset重置数据
- 删除 start_web.sh,统一使用 deploy.sh(Docker部署) - 新增子命令:reset(删除所有数据需确认)、logs、stop、restart - 更新 README 文档
This commit is contained in:
@@ -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 界面"代理配置"页面设置:
|
||||
|
||||
@@ -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
|
||||
|
||||
-108
@@ -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
|
||||
Reference in New Issue
Block a user