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

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

相关推荐
一只小风华~3 小时前
Vue.js 核心知识点全面解析
前端·javascript·vue.js
2022.11.7始学前端3 小时前
n8n第七节 只提醒重要的待办
前端·javascript·ui·n8n
SakuraOnTheWay3 小时前
React Grab实践 | 记一次与Cursor的有趣对话
前端·cursor
阿星AI工作室4 小时前
gemini3手势互动圣诞树保姆级教程来了!附提示词
前端·人工智能
徐小夕4 小时前
知识库创业复盘:从闭源到开源,这3个教训价值百万
前端·javascript·github
xhxxx4 小时前
函数执行完就销毁?那闭包里的变量凭什么活下来!—— 深入 JS 内存模型
前端·javascript·ecmascript 6
StarkCoder4 小时前
求求你试试 DiffableDataSource!别再手算 indexPath 了(否则迟早崩)
前端
fxshy4 小时前
Cursor 前端Global Cursor Rules
前端·cursor
红彤彤4 小时前
前端接入sse(EventSource)(@fortaine/fetch-event-source)
前端
WindStormrage4 小时前
umi3 → umi4 升级:踩坑与解决方案
前端·react.js·cursor