minio 部署前端

检查当前配置,确定如何将这些文件上传到 MinIO。

2 tools called

前端构建产物包含 assets/static/uni_modules/index.html。下面是上传到 MinIO 的方案:

MinIO 目录结构规划

建议在 MinIO 中这样组织:

复制代码
myapp-bucket/
├── frontend/              # 前端文件根目录
│   ├── index.html
│   ├── assets/
│   ├── static/
│   └── uni_modules/
├── static/               # Django 静态文件(admin、xadmin 等)
└── media/                # 媒体文件

方案 1:使用 MinIO 客户端(mc)上传

1. 安装 MinIO 客户端

bash 复制代码
# 下载 MinIO 客户端
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/

# 或者使用 Docker
docker run --rm -v $(pwd):/data minio/mc:latest --version

2. 配置 MinIO 连接

bash 复制代码
# 配置 MinIO 别名(从宿主机访问,使用映射的端口)
mc alias set myminio https://localhost:11100 6mcDgoCRw89yxMMe zhvJvZS3eZ2kJwcv7JKmvtvcsSSAmzc8 --insecure

# 或者如果从容器内访问
mc alias set myminio https://minio:9000 6mcDgoCRw89yxMMe zhvJvZS3eZ2kJwcv7JKmvtvcsSSAmzc8 --insecure

3. 上传前端文件

bash 复制代码
# 进入前端构建目录
cd ../yixiangfront/unpackage/dist/build/web

# 上传整个目录到 MinIO
mc cp --recursive . myminio/myapp-bucket/frontend/ --insecure

# 或者分别上传各个目录
mc cp index.html myminio/myapp-bucket/frontend/ --insecure
mc cp --recursive assets/ myminio/myapp-bucket/frontend/assets/ --insecure
mc cp --recursive static/ myminio/myapp-bucket/frontend/static/ --insecure
mc cp --recursive uni_modules/ myminio/myapp-bucket/frontend/uni_modules/ --insecure

方案 2:使用 Python 脚本上传(推荐)

创建一个上传脚本:

python 复制代码
# upload_frontend_to_minio.py
from minio import Minio
from minio.error import S3Error
import os
import sys

# MinIO 配置
MINIO_ENDPOINT = "localhost:11100"  # 或 "minio:9000"(从容器内访问)
MINIO_ACCESS_KEY = "6mcDgoCRw89yxMMe"
MINIO_SECRET_KEY = "zhvJvZS3eZ2kJwcv7JKmvtvcsSSAmzc8"
BUCKET_NAME = "myapp-bucket"
FRONTEND_DIR = "../yixiangfront/unpackage/dist/build/web"
MINIO_PREFIX = "frontend"

def upload_directory(client, bucket_name, local_path, minio_prefix):
    """递归上传目录到 MinIO"""
    for root, dirs, files in os.walk(local_path):
        for file in files:
            local_file = os.path.join(root, file)
            # 计算相对路径
            relative_path = os.path.relpath(local_file, local_path)
            # MinIO 对象路径
            minio_path = f"{minio_prefix}/{relative_path}".replace("\\", "/")
            
            try:
                client.fput_object(bucket_name, minio_path, local_file)
                print(f"✓ 上传成功: {minio_path}")
            except S3Error as e:
                print(f"✗ 上传失败: {minio_path} - {e}")

def main():
    # 创建 MinIO 客户端
    client = Minio(
        MINIO_ENDPOINT,
        access_key=MINIO_ACCESS_KEY,
        secret_key=MINIO_SECRET_KEY,
        secure=True  # 使用 HTTPS
    )
    
    # 检查 bucket 是否存在
    found = client.bucket_exists(BUCKET_NAME)
    if not found:
        print(f"创建 bucket: {BUCKET_NAME}")
        client.make_bucket(BUCKET_NAME)
    else:
        print(f"Bucket {BUCKET_NAME} 已存在")
    
    # 上传前端文件
    if not os.path.exists(FRONTEND_DIR):
        print(f"错误: 目录不存在 {FRONTEND_DIR}")
        sys.exit(1)
    
    print(f"开始上传前端文件从 {FRONTEND_DIR} 到 {BUCKET_NAME}/{MINIO_PREFIX}/")
    upload_directory(client, BUCKET_NAME, FRONTEND_DIR, MINIO_PREFIX)
    print("上传完成!")

if __name__ == "__main__":
    main()

运行脚本:

bash 复制代码
# 安装依赖
pip install minio

# 运行上传脚本
python upload_frontend_to_minio.py

方案 3:使用 Docker 容器上传

如果 MinIO 在 Docker 网络中,可以使用容器上传:

bash 复制代码
# 创建一个临时容器来上传文件
docker run --rm \
  -v $(pwd)/../yixiangfront/unpackage/dist/build/web:/data \
  -v $(pwd):/script \
  --network yixiang_yixiang_network \
  python:3.9-slim \
  sh -c "pip install minio && python /script/upload_frontend_to_minio.py"

修改 nginx.conf 支持从 MinIO 提供前端文件

上传后,需要修改 nginx 配置:

nginx:docker/configs/frontend/nginx.conf 复制代码
server {
    listen 80;
    server_name _;
    root /usr/share/nginx/html;
    index index.html;

    # ... existing code ...

    # 前端静态文件从 MinIO 提供
    location ~ ^/(assets|static|uni_modules)/ {
        proxy_pass https://minio:9000/myapp-bucket/frontend$request_uri;
        proxy_set_header Host minio:9000;
        proxy_ssl_verify off;
        proxy_ssl_server_name on;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        expires 30d;
        add_header Cache-Control "public, immutable";
        access_log off;
    }

    # index.html 从 MinIO 提供(或者保持从本地提供,因为需要频繁更新)
    location = /index.html {
        proxy_pass https://minio:9000/myapp-bucket/frontend/index.html;
        proxy_set_header Host minio:9000;
        proxy_ssl_verify off;
        proxy_ssl_server_name on;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        expires -1;  # 不缓存 index.html,确保更新及时
        add_header Cache-Control "no-cache, no-store, must-revalidate";
    }

    # Django 静态文件从 MinIO 提供(admin、xadmin 等)
    location ^~ /static/admin/ {
        proxy_pass https://minio:9000/myapp-bucket/static$request_uri;
        proxy_set_header Host minio:9000;
        proxy_ssl_verify off;
        proxy_ssl_server_name on;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        expires 7d;
        add_header Cache-Control "public, immutable";
    }

    location ^~ /static/xadmin/ {
        proxy_pass https://minio:9000/myapp-bucket/static$request_uri;
        proxy_set_header Host minio:9000;
        proxy_ssl_verify off;
        proxy_ssl_server_name on;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        expires 7d;
        add_header Cache-Control "public, immutable";
    }

    # 媒体文件从 MinIO 提供
    location ^~ /media/ {
        proxy_pass https://minio:9000/myapp-bucket/media/;
        proxy_set_header Host minio:9000;
        proxy_ssl_verify off;
        proxy_ssl_server_name on;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        expires 1d;
        add_header Cache-Control "public";
    }

    # ... existing code ...
}

快速上传命令(推荐)

最简单的方式是使用 MinIO 客户端:

bash 复制代码
# 1. 下载并安装 mc
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/

# 2. 配置连接
mc alias set myminio https://localhost:11100 6mcDgoCRw89yxMMe zhvJvZS3eZ2kJwcv7JKmvtvcsSSAmzc8 --insecure

# 3. 上传前端文件
cd ../yixiangfront/unpackage/dist/build/web
mc cp --recursive . myminio/myapp-bucket/frontend/ --insecure

# 4. 验证上传
mc ls myminio/myapp-bucket/frontend/ --insecure

注意事项

  1. 每次前端构建后需要重新上传到 MinIO
  2. 可以将上传步骤集成到构建脚本中
  3. index.html 建议不缓存或短缓存,确保更新及时
  4. 其他静态资源可以设置较长缓存时间

需要我帮你创建一个自动化的上传脚本吗?

相关推荐
C_心欲无痕19 小时前
前端实现文件下载的完整流程
前端·状态模式
Fighting_p19 小时前
【element UI】el-select 组件下拉数据某一行文字过多时,文字换行展示,避免el-select下拉框被撑宽,导致页面过丑
前端·javascript
王家视频教程图书馆19 小时前
vue3从本地选择一个视频 展示到视频组件中
前端·javascript·音视频
天外来鹿20 小时前
Map/Set/WeakMap/WeakSet学习笔记
前端·javascript·笔记·学习
Luna-player20 小时前
前端中stylus是干嘛用的
前端·css·stylus
CHQIUU20 小时前
解决 npm 全局安装 EACCES 权限问题(macOS 篇)
前端·macos·npm
程序员鱼皮20 小时前
OpenClaw接入飞书保姆级教程,几分钟搞定手机养龙虾!
前端·人工智能·后端
紫_龙20 小时前
最新版vue3+TypeScript开发入门到实战教程之vue3与vue2语法优劣对比
前端·javascript·typescript
SouthRosefinch21 小时前
一、HTML简介与开发环境
开发语言·前端·html
全栈小521 小时前
【前端】Vue 组件开发中的枚举值验证:从一个Type属性错误说起
前端·javascript·vue.js