Featured image of post 使用HuggingFace部署FileCodeBox

使用HuggingFace部署FileCodeBox

一个基于 FastAPI + Vue3 开发的轻量级文件分享工具

项目地址:

https://github.com/vastsa/FileCodeBox

前期准备:

  • 一个cloudflare账号
  • 一个huggingface账号

创建dockerfile

注册好huggingface后,点击头像新建一个空间:

 , 50%

选择用docker部署:

然后划到最底,点击左下角的Create Space, 新建一个dockerfile

填入以下内容,然后点击Commit new file to main

 1FROM lanol/filecodebox:beta
 2
 3RUN apt-get update && apt-get install -y \
 4    python3-pip \
 5    git \
 6    && rm -rf /var/lib/apt/lists/*
 7
 8RUN pip3 install --no-cache-dir huggingface_hub datasets
 9
10RUN useradd -m -u 1000 user
11
12WORKDIR /app
13
14ENV HOME=/home/user \
15    PATH=/home/user/.local/bin:$PATH \
16    HF_HOME=/app/data/hf_cache \
17    PYTHONUNBUFFERED=1
18
19RUN mkdir -p /app/data && \
20    chown -R user:user /app/data
21
22COPY sync_data.sh /app/
23RUN chmod +x /app/sync_data.sh && \
24    chown user:user /app/sync_data.sh
25
26USER user
27
28EXPOSE 12345
29
30ENTRYPOINT ["/app/sync_data.sh"]

 , 150%

创建sync_data.sh文件

 , 50%

 , 50%

  1#!/bin/bash
  2
  3# 检查环境变量
  4if [ -z "$HF_TOKEN" ] || [ -z "$DATASET_ID" ]; then
  5    echo "Starting without backup functionality - missing HF_TOKEN or DATASET_ID"
  6    exec python main.py
  7fi
  8
  9# 登录HuggingFace (使用环境变量方式避免交互问题)
 10export HUGGING_FACE_HUB_TOKEN=$HF_TOKEN
 11
 12# 同步函数
 13sync_data() {
 14    while true; do
 15        echo "Starting sync process at $(date)"
 16        
 17        # 创建临时压缩文件
 18        cd /app
 19        timestamp=$(date +%Y%m%d_%H%M%S)
 20        backup_file="backup_${timestamp}.tar.gz"
 21        
 22        tar -czf "/tmp/${backup_file}" data/
 23        
 24        python3 -c "
 25from huggingface_hub import HfApi
 26import os
 27def manage_backups(api, repo_id, max_files=50):
 28    files = api.list_repo_files(repo_id=repo_id, repo_type='dataset')
 29    backup_files = [f for f in files if f.startswith('backup_') and f.endswith('.tar.gz')]
 30    backup_files.sort()
 31    
 32    if len(backup_files) >= max_files:
 33        files_to_delete = backup_files[:(len(backup_files) - max_files + 1)]
 34        for file_to_delete in files_to_delete:
 35            try:
 36                api.delete_file(path_in_repo=file_to_delete, repo_id=repo_id, repo_type='dataset')
 37                print(f'Deleted old backup: {file_to_delete}')
 38            except Exception as e:
 39                print(f'Error deleting {file_to_delete}: {str(e)}')
 40try:
 41    api = HfApi()
 42    api.upload_file(
 43        path_or_fileobj='/tmp/${backup_file}',
 44        path_in_repo='${backup_file}',
 45        repo_id='${DATASET_ID}',
 46        repo_type='dataset'
 47    )
 48    print('Backup uploaded successfully')
 49    
 50    manage_backups(api, '${DATASET_ID}')
 51except Exception as e:
 52    print(f'Backup failed: {str(e)}')
 53"
 54        # 清理临时文件
 55        rm -f "/tmp/${backup_file}"
 56        
 57        # 设置同步间隔
 58        SYNC_INTERVAL=${SYNC_INTERVAL:-7200}
 59        echo "Next sync in ${SYNC_INTERVAL} seconds..."
 60        sleep $SYNC_INTERVAL
 61    done
 62}
 63
 64# 恢复函数
 65restore_latest() {
 66    echo "Attempting to restore latest backup..."
 67    python3 -c "
 68try:
 69    from huggingface_hub import HfApi
 70    import os
 71    
 72    api = HfApi()
 73    files = api.list_repo_files('${DATASET_ID}', repo_type='dataset')
 74    backup_files = [f for f in files if f.startswith('backup_') and f.endswith('.tar.gz')]
 75    
 76    if backup_files:
 77        latest = sorted(backup_files)[-1]
 78        api.hf_hub_download(
 79            repo_id='${DATASET_ID}',
 80            filename=latest,
 81            repo_type='dataset',
 82            local_dir='/tmp'
 83        )
 84        os.system(f'tar -xzf /tmp/{latest} -C /app')
 85        os.remove(f'/tmp/{latest}')
 86        print(f'Restored from {latest}')
 87    else:
 88        print('No backup found')
 89except Exception as e:
 90    print(f'Restore failed: {str(e)}')
 91"
 92}
 93
 94# 主程序
 95(
 96    # 尝试恢复
 97    restore_latest
 98    
 99    # 启动同步进程
100    sync_data &
101    
102    # 启动主应用
103    exec python main.py
104) 2>&1 | tee -a /app/data/backup.log

然后划到最底,点击左下角的Commit new file to main

修改README.md

跟上面创建新文件一样,新建README.md文件,填入:

 1---
 2title: Filebox
 3emoji: 🚀
 4colorFrom: pink
 5colorTo: pink
 6sdk: docker
 7pinned: false
 8app_port: 12345
 9---
10
11Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference

创建dataset数据库

a, 50%


记住你的数据库地址,格式:huggingface用户名称/dataset名称

创建HF-token



划到最底下点击Create token保存并记住你的token

在后台添加环境变量


查看你的dataset 对应填入 DATASET_ID

HF_TOKEN -> #你的token
DATASET_ID -> # 用户名/数据集名称
SYNC_INTERVAL -> # 同步时间(秒钟,推荐填3600

点击App就能看到你的项目已经运行起来啦!

完成后可以在后端改密码,可外接webdav进行东西存储,重启spaces会拉取dataset数据库中的文件进行同步,不用担心数据丢失啦

1后端地址:/#/admin
2
3后台默认密码:FileCodeBox2023

在cloudflare进行反代


然后划到最底下点击部署

然后点击编辑代码 , 填入以下内容:

1export default {
2  async fetch(request, env) {
3    const url = new URL(request.url);
4    url.host = '你的地址';  # 注意地址不要有https://
5    return fetch(new Request(url, request))
6  }
7}

查看你项目的地址:



然后点击右边的部署,再在worker的设置里填入自定义域域名,就可以啦!

给博主施舍一个赞吧(;へ:) ❤️