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. 其他静态资源可以设置较长缓存时间

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

相关推荐
于慨12 小时前
Lambda 表达式、方法引用(Method Reference)语法
java·前端·servlet
石小石Orz12 小时前
油猴脚本实现生产环境加载本地qiankun子应用
前端·架构
从前慢丶12 小时前
前端交互规范(Web 端)
前端
CHU72903513 小时前
便捷约玩,沉浸推理:线上剧本杀APP功能版块设计详解
前端·小程序
GISer_Jing13 小时前
Page-agent MCP结构
前端·人工智能
王霸天13 小时前
💥别再抄网上的Scale缩放代码了!50行源码教你写一个永不翻车的大屏适配
前端·vue.js·数据可视化
小领航13 小时前
用 Three.js + Vue 3 打造炫酷的 3D 行政地图可视化组件
前端·github
@大迁世界13 小时前
2026年React大洗牌:React Hooks 将迎来重大升级
前端·javascript·react.js·前端框架·ecmascript
PieroPc13 小时前
一个功能强大的 Web 端标签设计和打印工具,支持服务器端直接打印到局域网打印机。Fastapi + html
前端·html·fastapi
悟空瞎说13 小时前
深入 Vue3 响应式:为什么有的要加.value,有的不用?从设计到源码彻底讲透
前端·vue.js