-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathTaskfile.yml
More file actions
84 lines (75 loc) · 3.11 KB
/
Copy pathTaskfile.yml
File metadata and controls
84 lines (75 loc) · 3.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
version: '3'
silent: true
vars:
BOT_IMAGE: '{{.BOT_IMAGE | default "w1ndysbot:latest"}}'
COMPOSE_FILE: '{{.COMPOSE_FILE | default "deploy/compose.prod.yml"}}'
tasks:
setup:
desc: 安装开发依赖
cmds:
- uv sync
dev:
desc: 启动本地开发服务
deps:
- setup
cmds:
- uv run python app/main.py
start:
desc: 启动服务
cmds:
- uv run python app/main.py
build-image:
desc: 构建机器人 Docker 镜像(本地调试用,正式部署改在远程服务器 build)
cmds:
- docker build -t {{.BOT_IMAGE}} .
deploy:
desc: 上传源码到远程服务器并在远程 build/up,示例 task deploy HOST=1.2.3.4 PORT=22 USER=root DIR=/opt/w1ndysbot
vars:
HOST: '{{.HOST | default "mylinux"}}'
PORT: '{{.PORT | default "22"}}'
USER: '{{.USER | default "root"}}'
DIR: '{{.DIR | default "/opt/w1ndysbot"}}'
cmds:
# 1) 确保目标目录存在
- ssh -p {{.PORT}} {{.USER}}@{{.HOST}} "mkdir -p {{.DIR}} {{.DIR}}/app/data {{.DIR}}/app/logs"
# 2) 同步源码:只上传构建/运行所需的代码与部署清单,跳过 .git、data/、logs/、缓存等
- |
rsync -az --delete \
--exclude='.git' \
--exclude='.venv' \
--exclude='__pycache__' \
--exclude='*.pyc' \
--exclude='.ruff_cache' \
--exclude='.pytest_cache' \
--exclude='data' \
--exclude='logs' \
--exclude='napcat' \
--exclude='deploy/dist' \
--exclude='*.tar' \
--exclude='*.tar.gz' \
--exclude='.env' \
-e "ssh -p {{.PORT}}" \
./ {{.USER}}@{{.HOST}}:{{.DIR}}/
# 3) 在远程服务器构建镜像并重启 bot;env 文件首次部署时从样例拷贝
# - 固定 compose project name 为 w1ndysbot,避免跟历史上按 deploy/ 目录名推断出的 project(deploy)不一致,
# 导致同名容器被视为"外部容器"而触发 name 冲突。
# - 兜底清理同名旧容器:历史遗留或手动 run 的容器不归任何 compose project 管,
# `up --force-recreate` 识别不到,只能显式删掉后再拉起。
- |
ssh -p {{.PORT}} {{.USER}}@{{.HOST}} "cd {{.DIR}} && \
if [ ! -f app/.env ]; then cp deploy/.env.example app/.env; fi && \
docker network inspect w1ndysbot >/dev/null 2>&1 || docker network create w1ndysbot && \
if [ -n \"\$(docker ps -aq --filter name=^/w1ndysbot\$)\" ]; then \
docker rm -f w1ndysbot; \
fi && \
BOT_IMAGE={{.BOT_IMAGE}} docker compose -p w1ndysbot -f deploy/compose.prod.yml build w1ndysbot && \
BOT_IMAGE={{.BOT_IMAGE}} docker compose -p w1ndysbot -f deploy/compose.prod.yml up -d --no-deps --force-recreate w1ndysbot && \
docker image prune -f"
prod:up:
desc: 在当前机器用生产 compose 启动服务
cmds:
- BOT_IMAGE={{.BOT_IMAGE}} docker compose -f {{.COMPOSE_FILE}} up -d
prod:logs:
desc: 查看生产 compose 日志
cmds:
- docker compose -f {{.COMPOSE_FILE}} logs -f --tail=200