-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathastrbot-git.install
More file actions
172 lines (151 loc) · 6.78 KB
/
astrbot-git.install
File metadata and controls
172 lines (151 loc) · 6.78 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
163
164
165
166
167
168
169
170
171
172
#!/bin/bash
# shellcheck shell=bash
set -e
_ASTRBOT_UPSTREAM="https://github.com/AstrBotDevs/AstrBot.git"
_ASTRBOT_BRANCH="dev"
# ─── 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
install -dm755 -o astrbot -g astrbot /var/cache/astrbot/python
install -dm755 -o astrbot -g astrbot /var/cache/astrbot/cargo
install -dm755 -o astrbot -g astrbot /var/cache/astrbot/rustup
install -dm755 -o astrbot -g astrbot /var/cache/astrbot/cargo_target
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
}
# ─── App clone ────────────────────────────────────────────────────────────────
# Download /opt/astrbot from GitHub tarball and write version file.
_clone_app() {
local tarball="/tmp/astrbot-install-$$.tar.gz"
local extract_dir="/tmp/astrbot-install-$$"
local url="https://github.com/AstrBotDevs/AstrBot/archive/refs/heads/${_ASTRBOT_BRANCH}.tar.gz"
# Skip if overlayfs is mounted (astrbotctl update is running)
if mount | grep -q ' /opt/astrbot '; then
echo ">>> Overlay mount detected — skipping clone in pacman hook."
return 0
fi
echo ">>> Downloading AstrBot from GitHub..."
mkdir -p "$extract_dir"
if ! curl -L --fail --silent --show-error -o "$tarball" "$url" 2>&1; then
echo "❌ Error: Failed to download AstrBot." >&2
rm -f "$tarball"; rm -rf "$extract_dir"
exit 1
fi
echo ">>> Extracting..."
if ! tar -xzf "$tarball" -C "$extract_dir" 2>&1; then
echo "❌ Error: Failed to extract tarball." >&2
rm -f "$tarball"; rm -rf "$extract_dir"
exit 1
fi
local extracted
extracted=$(find "$extract_dir" -mindepth 1 -maxdepth 1 -type d | head -1)
if [ -z "$extracted" ]; then
echo "❌ Error: Extraction produced no directory." >&2
rm -f "$tarball"; rm -rf "$extract_dir"
exit 1
fi
rm -rf /opt/astrbot
mv "$extracted" /opt/astrbot
rm -f "$tarball"; rm -rf "$extract_dir"
# Init git repo for version tracking
git -C /opt/astrbot init --quiet
git -C /opt/astrbot remote add origin "$_ASTRBOT_UPSTREAM"
git -C /opt/astrbot fetch --depth=1 origin "$_ASTRBOT_BRANCH" --quiet 2>/dev/null || true
git -C /opt/astrbot checkout "$_ASTRBOT_BRANCH" --quiet 2>/dev/null || true
# Write version file
local _ver
_ver=$(git -C /opt/astrbot describe --long --tags 2>/dev/null | sed 's/\([^-]*-g\)/r\1/;s/-/./g' | sed 's/^v//g')
[ -z "$_ver" ] && _ver="4.22.2"
echo "$_ver" > /opt/astrbot/.version
echo ">>> /opt/astrbot ready ($_ver)"
}
# ─── Hooks ─────────────────────────────────────────────────────────────────────
pre_install() {
_ensure_root
_clone_app
}
pre_upgrade() {
_ensure_root
_clone_app
}
post_install() {
_ensure_root
_ensure_environment
systemctl daemon-reload
# Write version file for pkgver
if [ -f /opt/astrbot/.version ]; then
cp /opt/astrbot/.version /var/lib/astrbot/.version 2>/dev/null || true
fi
echo "-------------------------------------------------------------------"
echo "AstrBot 已安装(多实例支持)"
echo ""
echo "【创建实例】"
echo " sudo astrbotctl init <实例名> # 初始化新实例"
echo " sudo astrbotctl init -f <备份> <实例名> # 从备份初始化"
echo ""
echo "【运行服务】"
echo " sudo systemctl start astrbot@<实例名>"
echo " sudo systemctl enable --now astrbot@<实例名>"
echo ""
echo "【常用管理】"
echo " sudo astrbotctl list / stop / status <实例名>"
echo " sudo astrbotctl reset <实例名> # 重置配置"
echo " sudo astrbotctl update <实例名> # 更新代码+环境+重启"
echo ""
echo "【备份与恢复】"
echo " astrbotctl export <实例名> # 导出"
echo " astrbotctl import <实例名> <备份文件> # 导入"
echo ""
echo "【文件路径】"
echo " 代码目录: /opt/astrbot"
echo " 数据目录: /var/lib/astrbot/<实例名>"
echo " 配置文件: /etc/astrbot/<实例名>.conf"
echo " 服务日志: journalctl -u astrbot@<实例名> -f"
echo "-------------------------------------------------------------------"
}
post_upgrade() {
_ensure_root
_ensure_environment
systemctl daemon-reload
# Write version file for pkgver
if [ -f /opt/astrbot/.version ]; then
cp /opt/astrbot/.version /var/lib/astrbot/.version 2>/dev/null || true
fi
echo "-------------------------------------------------------------------"
echo "AstrBot 已更新"
echo ""
echo "【快速开始】"
echo " sudo astrbotctl init light # 创建首个实例"
echo " sudo systemctl enable --now astrbot@light"
echo ""
echo "【更新代码】"
echo " sudo pacman -Syu # 通过本包更新代码"
echo ""
echo "【更新实例(推荐)】"
echo " sudo astrbotctl update <实例名> # 更新代码+重建环境+重启"
echo " sudo astrbotctl update --all # 更新所有实例"
echo ""
echo "【如遇异常】"
echo " sudo astrbotctl git pull --sync --rebuild-venv <实例名>"
echo "-------------------------------------------------------------------"
}
post_remove() {
_ensure_root
echo "-------------------------------------------------------------------"
echo "⚠️ 代码已删除,数据未删除。如需彻底清理:"
echo " sudo rm -rf /var/lib/astrbot /var/cache/astrbot /etc/astrbot"
echo " sudo userdel astrbot"
echo "-------------------------------------------------------------------"
}