File size: 3,057 Bytes
e6d9d25
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
FROM soulter/astrbot:latest

USER root

# 安装 nginx + huggingface_hub(新增)
RUN apt-get update && apt-get install -y nginx && rm -rf /var/lib/apt/lists/* && \
    pip install --no-cache-dir huggingface_hub -i https://mirrors.aliyun.com/pypi/simple/

# 配置 nginx(你的原配置)
RUN echo 'server { \
    listen 7860; \
    client_max_body_size 50M; \
    \
    location /health { \
        return 200 "OK\n"; \
        add_header Content-Type text/plain; \
    } \
    \
    location /ws { \
        proxy_pass http://127.0.0.1:6199; \
        proxy_http_version 1.1; \
        proxy_set_header Upgrade $http_upgrade; \
        proxy_set_header Connection "upgrade"; \
        proxy_set_header Host $host; \
        proxy_read_timeout 86400; \
    } \
    \
    location / { \
        proxy_pass http://127.0.0.1:6185; \
        proxy_set_header Host $host; \
        proxy_set_header X-Real-IP $remote_addr; \
    } \
}' > /etc/nginx/sites-enabled/default

# 持久化入口脚本(新增:恢复+备份逻辑)
RUN echo '#!/bin/bash\n\
set -e\n\
\n\
RESTORE_DATA() {\n\
    if [ -z "$HF_TOKEN" ] || [ -z "$DATASET_REPO" ]; then\n\
        echo "[Restore] 未配置 HF_TOKEN/DATASET_REPO,跳过恢复"\n\
        return 0\n\
    fi\n\
    echo "[Restore] 尝试从 HF Dataset 恢复数据..."\n\
    python3 -c "\n\
import os\n\
from huggingface_hub import hf_hub_download\n\
import zipfile\n\
\ntry:\n\
    path = hf_hub_download(\n\
        repo_id=os.environ['DATASET_REPO'],\n\
        filename='astrbot_data.zip',\n\
        repo_type='dataset',\n\
        token=os.environ['HF_TOKEN'],\n\
        local_dir='/tmp'\n\
    )\n\
    with zipfile.ZipFile(path, 'r') as z:\n\
        z.extractall('/app')\n\
    print('[Restore] 数据恢复成功')\n\
except Exception as e:\n\
    print(f'[Restore] 恢复失败(可能首次运行): {e}')\n\
"\n\
}\n\
\n\
BACKUP_DATA() {\n\
    if [ -z "$HF_TOKEN" ] || [ -z "$DATASET_REPO" ]; then\n\
        echo "[Backup] 未配置 HF_TOKEN/DATASET_REPO,跳过备份"\n\
        return 0\n\
    fi\n\
    echo "[Backup] 正在备份 AstrBot 数据..."\n\
    cd /app\n\
    zip -r /tmp/astrbot_data.zip data/ 2>/dev/null || true\n\
    python3 -c "\n\
import os\n\
from huggingface_hub import HfApi\n\
api = HfApi(token=os.environ['HF_TOKEN'])\n\
api.upload_file(\n\
    path_or_fileobj='/tmp/astrbot_data.zip',\n\
    path_in_repo='astrbot_data.zip',\n\
    repo_id=os.environ['DATASET_REPO'],\n\
    repo_type='dataset'\n\
)\n\
print('[Backup] 上传成功')\n\
"\n\
    rm -f /tmp/astrbot_data.zip\n\
    echo "[Backup] 完成"\n\
}\n\
\n\
# 启动前:恢复数据\nRESTORE_DATA\n\
\n\
# 退出时:备份数据\ntrap "BACKUP_DATA; exit 0" SIGTERM SIGINT\n\
\n\
# 定时备份(后台,每6小时)\n\
(\n\
    while true; do\n\
        sleep 21600\n\
        BACKUP_DATA\n\
    done\n\
) &\n\
\n\
# 启动 nginx + AstrBot(你的原命令)\n\
nginx &\n\
cd /AstrBot && python main.py\n\
' > /entrypoint.sh && chmod +x /entrypoint.sh

EXPOSE 7860

ENTRYPOINT ["/entrypoint.sh"]