aboutsummarylogtreecommitdiffstats
path: root/astrbot-git.install
blob: 5bda9a662ef601693e87ddf072a443e03281b185 (plain)
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
#!/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
    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
}

_has_instances() {
    [ -d /etc/astrbot ] || return 1
    find /etc/astrbot -maxdepth 1 -name '*.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
}

# ─── 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 "  sudo astrbotctl init -f <备份> <实例名>   # 从备份初始化"
        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 "  astrbotctl export <实例名>              # 导出"
        echo "  astrbotctl import <实例名> <备份文件>  # 导入"
        echo ""
        echo "【文件路径】"
        echo "  代码目录:     /opt/astrbot"
        echo "  数据目录:     /var/lib/astrbot/<实例名>"
        echo "  配置文件:     /etc/astrbot/<实例名>.conf"
        echo "  锁文件:       /var/lib/astrbot/<实例名>/astrbot.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/astrbot.lock"
        echo "  如果实例异常退出后锁文件未删除,可手动执行:"
        echo "  sudo rm -f /var/lib/astrbot/<实例名>/astrbot.lock"
        echo ""
        echo "【账号管理】"
        echo "  sudo astrbotctl admin -u admin -p '<新密码>' <实例名>"
        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 "-------------------------------------------------------------------"
}