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

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

相关推荐
随祥2 小时前
Tauri+vue开发桌面程序环境搭建
前端·javascript·vue.js
万少6 小时前
HarmonyOS官方模板集成创新活动-流蓝卡片
前端·harmonyos
-To be number.wan9 小时前
C++ 赋值运算符重载:深拷贝 vs 浅拷贝的生死线!
前端·c++
噢,我明白了9 小时前
JavaScript 中处理时间格式的核心方式
前端·javascript
纸上的彩虹10 小时前
半年一百个页面,重构系统也重构了我对前端工作的理解
前端·程序员·架构
be or not to be10 小时前
深入理解 CSS 浮动布局(float)
前端·css
LYFlied11 小时前
【每日算法】LeetCode 1143. 最长公共子序列
前端·算法·leetcode·职场和发展·动态规划
老华带你飞11 小时前
农产品销售管理|基于java + vue农产品销售管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
小徐_233311 小时前
2025 前端开源三年,npm 发包卡我半天
前端·npm·github
GIS之路12 小时前
GIS 数据转换:使用 GDAL 将 Shp 转换为 GeoJSON 数据
前端