Repository navigation
Expand file tree
/
Copy pathastrbot-git.install
More file actions
162 lines (143 loc) · 6.51 KB
/
Copy pathastrbot-git.install
File metadata and controls
162 lines (143 loc) · 6.51 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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#!/bin/bash
# shellcheck shell=bash
set -e
# ─── Guards ───────────────────────────────────────────────────────────────────
_ensure_root() {
if [ "$(id -u)" -ne 0 ]; then
echo "❌ Error: This script must be run as root (sudo)."
exit 1
fi
}
# ─── Environment setup ─────────────────────────────────────────────────────────
_ensure_environment() {
if ! getent passwd astrbot >/dev/null 2>&1; then
useradd -r -M -d /var/lib/astrbot -s /usr/bin/nologin -c "AstrBot Service User" astrbot
fi
install -dm755 -o astrbot -g astrbot /var/lib/astrbot
install -dm755 -o astrbot -g astrbot /var/cache/astrbot
for _subdir in python cargo rustup cargo_target; do
install -dm755 -o astrbot -g astrbot "/var/cache/astrbot/$_subdir"
done
install -dm755 -o root -g root /etc/astrbot
[ -d "/var/lib/astrbot" ] && chown -R astrbot:astrbot /var/lib/astrbot
[ -d "/var/cache/astrbot" ] && chown -R astrbot:astrbot /var/cache/astrbot
}
_has_instances() {
[ -d /etc/astrbot ] || return 1
find /etc/astrbot -maxdepth 1 -name '*.conf' ! -name 'tmpl.conf' -type f -print -quit | grep -q .
}
_sync_instances_best_effort() {
command -v astrbotctl >/dev/null 2>&1 || return 0
_has_instances || return 0
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo " 检测到现有实例,正在重建虚拟环境..."
echo " (这步自动执行 uv pip install --reinstall)"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
if ! astrbotctl sync --all; then
echo "⚠️ 自动同步实例虚拟环境失败,请手动执行:"
echo " sudo astrbotctl sync --all"
else
echo "✅ 虚拟环境重建完成!"
fi
}
# ─── Hooks ─────────────────────────────────────────────────────────────────────
pre_install() {
_ensure_root
}
pre_upgrade() {
_ensure_root
}
pre_remove() {
_ensure_root
local units
units=$(systemctl list-units --type=service --state=active 'astrbot@*' --no-legend 2>/dev/null | awk '{print $1}')
[ -n "$units" ] || return 0
echo ">>> 停止运行中的 AstrBot 实例服务,避免残留进程指向已删除的代码..."
while IFS= read -r unit; do
[ -n "$unit" ] || continue
echo " - stopping $unit"
systemctl stop "$unit" || true
done <<<"$units"
}
# ─── Shared banner (install vs upgrade) ────────────────────────────────────────
_print_banner() {
local mode="$1" # "install" or "upgrade"
echo "-------------------------------------------------------------------"
case "$mode" in
install)
echo "AstrBot 已安装(多实例支持)"
echo ""
echo "【创建实例】"
echo " sudo astrbotctl init <实例名> # 初始化新实例"
echo ""
echo "【运行服务】"
echo " sudo astrbotctl start <实例名> # 通过 systemd 启动实例"
echo " sudo astrbotctl run <实例名> # 前台调试运行实例"
echo ""
echo "【常用管理】"
echo " astrbotctl ls"
echo " sudo astrbotctl stop <实例名>"
echo " astrbotctl status <实例名>"
echo " sudo astrbotctl reset <实例名> # 重置配置"
echo ""
echo "【备份与恢复】"
echo " 请使用 Dashboard 中经认证的备份和恢复流程(恢复会覆盖现有数据)。"
echo ""
echo "【文件路径】"
echo " 代码目录: /opt/astrbot"
echo " 实例根目录: /var/lib/astrbot/<实例名>"
echo " AstrBot 数据: /var/lib/astrbot/<实例名>/data"
echo " 配置文件: /etc/astrbot/<实例名>.conf"
echo " 锁文件: /var/lib/astrbot/<实例名>/.venv-maintenance.lock"
echo " 服务日志: journalctl -u astrbot@<实例名> -f"
;;
upgrade)
echo "AstrBot 已更新"
echo ""
echo "【自动重建虚拟环境】"
echo " 安装完成后会自动执行: astrbotctl sync --all"
echo " → 为每个实例运行: uv pip install --reinstall /opt/astrbot"
echo " 如果未自动触发,可手动执行:"
echo " sudo astrbotctl sync --all"
echo ""
echo "【如遇异常】"
echo " 如果环境异常,请用你的 AUR helper 重新构建并安装 astrbot-git"
echo ""
echo "【锁文件】"
echo " 锁文件位于 ASTRBOT_ROOT/.venv-maintenance.lock"
echo " 进程退出后,内核会自动释放 flock;锁文件保留是正常现象。"
echo " 不要删除仍在使用的锁文件,否则会破坏服务与维护操作之间的互斥。"
echo ""
echo "【账号管理】"
echo " 首次启动前:sudo astrbotctl password <实例名>"
echo " 该命令在终端中隐藏输入密码并要求确认"
echo " 若使用 HTTPS 证书:sudo astrbotctl certbot <实例名>"
;;
esac
echo "-------------------------------------------------------------------"
}
# ─── Common post-install / post-upgrade logic ─────────────────────────────────
_post_common() {
local mode="$1"
_ensure_root
_ensure_environment
systemctl daemon-reload
_sync_instances_best_effort
_print_banner "$mode"
}
post_install() {
_post_common install
}
post_upgrade() {
_post_common upgrade
}
post_remove() {
_ensure_root
echo "-------------------------------------------------------------------"
echo "⚠️ 代码已删除,数据未删除。如需彻底清理:"
echo " sudo rm -rf /var/lib/astrbot /var/cache/astrbot /etc/astrbot"
echo " sudo userdel astrbot"
echo "-------------------------------------------------------------------"
}