HongShi AI正在绞尽脑汁想思路ING···
HongShiのAI摘要
GPT-4o

抱脸部署FileCodeBox(database同步)

项目地址:https://github.com/vastsa/FileCodeBox

项目名称:FileCodeBox

前言

简介

顾名思义,这个项目能够快速、高效地跨设备、跨网络链接实现文件、字符共享,可以自行设置过期时间/次数。文件大小限制为20MB以内。

由于抱脸容器的特殊性(定时清空数据重启),我们需要设置database同步以达到不丢失数据。

前置条件

1.外网访问环境

2.一个huggingface账户

3.一点耐心

必要环境变量

1.huggingface自带的database服务仓库名

2.huggingface授权key

部署步骤

创建空间

先前往space页面,单击New Space

在space设置页面有几个需要填的东西

Space name:空间名称,决定域名部分(分配域名:用户名-空间名.hf.space)

Selet the Space SDK:选择Docker

Space harware:空间硬件配置,如果你不想多花冤枉钱就选择默认的free配置

其他东西不用填,直接点击下方的Create Space

存储库设置

点击个人头像,选择New Dataset

输入数据库名称,然后点击Create Dataset

这里的Datasets: xxxxx/xxxxx将会作为DATASET_ID这个变量

获取授权Key

点击个人头像,前往Access Tokens 并输入密码进入

单击Creat new token

权限全部勾选(如果你懒得单独调)

创建后会返还以hf-xxxx开头的秘钥,这将作为HF_TOKEN这个变量使用。

空间设置

来到文件页面,选择README.md并在下方添加(如下图所示)

1
app_port: 12345

然后转到Files选项卡,点击Add file并选择Create a new file

文件名为sync_data.sh

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
#!/bin/bash

# 检查环境变量
if [ -z "$HF_TOKEN" ] || [ -z "$DATASET_ID" ]; then
echo "Starting without backup functionality - missing HF_TOKEN or DATASET_ID"
exec python main.py
fi

# 登录HuggingFace (使用环境变量方式避免交互问题)
export HUGGING_FACE_HUB_TOKEN=$HF_TOKEN

# 同步函数
sync_data() {
while true; do
echo "Starting sync process at $(date)"

# 创建临时压缩文件
cd /app
timestamp=$(date +%Y%m%d_%H%M%S)
backup_file="backup_${timestamp}.tar.gz"

tar -czf "/tmp/${backup_file}" data/

python3 -c "
from huggingface_hub import HfApi
import os
def manage_backups(api, repo_id, max_files=2):
files = api.list_repo_files(repo_id=repo_id, repo_type='dataset')
backup_files = [f for f in files if f.startswith('backup_') and f.endswith('.tar.gz')]
backup_files.sort()

if len(backup_files) >= max_files:
files_to_delete = backup_files[:(len(backup_files) - max_files + 1)]
for file_to_delete in files_to_delete:
try:
api.delete_file(path_in_repo=file_to_delete, repo_id=repo_id, repo_type='dataset')
print(f'Deleted old backup: {file_to_delete}')
except Exception as e:
print(f'Error deleting {file_to_delete}: {str(e)}')
try:
api = HfApi()
api.upload_file(
path_or_fileobj='/tmp/${backup_file}',
path_in_repo='${backup_file}',
repo_id='${DATASET_ID}',
repo_type='dataset'
)
print('Backup uploaded successfully')

manage_backups(api, '${DATASET_ID}')
except Exception as e:
print(f'Backup failed: {str(e)}')
"
# 清理临时文件
rm -f "/tmp/${backup_file}"

# 设置同步间隔
SYNC_INTERVAL=${SYNC_INTERVAL:-72000}
echo "Next sync in ${SYNC_INTERVAL} seconds..."
sleep $SYNC_INTERVAL
done
}

# 恢复函数
restore_latest() {
echo "Attempting to restore latest backup..."
python3 -c "
try:
from huggingface_hub import HfApi
import os

api = HfApi()
files = api.list_repo_files('${DATASET_ID}', repo_type='dataset')
backup_files = [f for f in files if f.startswith('backup_') and f.endswith('.tar.gz')]

if backup_files:
latest = sorted(backup_files)[-1]
api.hf_hub_download(
repo_id='${DATASET_ID}',
filename=latest,
repo_type='dataset',
local_dir='/tmp'
)
os.system(f'tar -xzf /tmp/{latest} -C /app')
os.remove(f'/tmp/{latest}')
print(f'Restored from {latest}')
else:
print('No backup found')
except Exception as e:
print(f'Restore failed: {str(e)}')
"
}

# 主程序
(
# 尝试恢复
restore_latest

# 启动同步进程
sync_data &

# 启动主应用
exec python main.py
) 2>&1 | tee -a /app/data/backup.log

再次重复操作,文件名为Dockerfile

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
FROM lanol/filecodebox:beta

RUN apt-get update && apt-get install -y \
python3-pip \
git \
&& rm -rf /var/lib/apt/lists/*

RUN pip3 install --no-cache-dir huggingface_hub datasets

RUN useradd -m -u 1000 user

WORKDIR /app

ENV HOME=/home/user \
PATH=/home/user/.local/bin:$PATH \
HF_HOME=/app/data/hf_cache \
PYTHONUNBUFFERED=1

RUN mkdir -p /app/data && \
chown -R user:user /app/data

COPY sync_data.sh /app/
RUN chmod +x /app/sync_data.sh && \
chown user:user /app/sync_data.sh

USER user

EXPOSE 12345

ENTRYPOINT ["/app/sync_data.sh"]

然后我们转到Setting选项卡,找到Variables and secrets

单击New Secret,并将下面的值键入

  • DATASET_ID 存储库设置 步骤中的值,为用户名/存储库ID
  • HF_TOKEN 获取授权Key 步骤中的值,为hf-xxxxxxxx格式
  • SYNC_INTERVAL 备份间隔时间,以秒为单位,推荐3600

然后我们的项目就可以顺利的跑起来了