feat(server): MinIO/S3 对象存储兼容(F21)

- 新增 storage 抽象:local 与 s3: 前缀兼容(不改 schema)
- invoice-pool 上传/预览/ocr 读取适配 S3/MinIO
- trialrun compose 增加 minio profile + env 示例与 runbook 指引
- 更新 README 与 v3 CSV 状态推进
这个提交包含在:
2026-02-09 20:42:53 +08:00
父节点 6ecebf8ad6
当前提交 c791e67b20
共修改 12 个文件,包含 2558 行新增和 28 行删除
+51
查看文件
@@ -19,6 +19,36 @@ services:
timeout: 5s
retries: 10
minio:
image: minio/minio:RELEASE.2025-01-20T14-49-07Z
container_name: hyb-oa-trialrun-minio
restart: unless-stopped
profiles: ["minio"]
environment:
MINIO_ROOT_USER: ${MINIO_ROOT_USER}
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}
command: ["server", "/data", "--console-address", ":9001"]
ports:
- "9000:9000"
- "9001:9001"
volumes:
- ./data/minio:/data
minio_init:
image: minio/mc:RELEASE.2025-08-13T08-35-41Z
container_name: hyb-oa-trialrun-minio-init
profiles: ["minio"]
depends_on:
- minio
entrypoint: ["sh", "-c"]
command: |
set -e
for i in $(seq 1 60); do
mc alias set local http://minio:9000 "$MINIO_ROOT_USER" "$MINIO_ROOT_PASSWORD" && break || true
sleep 1
done
mc mb --ignore-existing "local/$S3_BUCKET"
server:
build:
context: ../..
@@ -35,6 +65,13 @@ services:
JWT_SECRET: ${JWT_SECRET}
DATABASE_URL: ${DATABASE_URL}
STORAGE_DIR: ${STORAGE_DIR}
STORAGE_DRIVER: ${STORAGE_DRIVER}
S3_ENDPOINT: ${S3_ENDPOINT}
S3_REGION: ${S3_REGION}
S3_BUCKET: ${S3_BUCKET}
S3_ACCESS_KEY_ID: ${S3_ACCESS_KEY_ID}
S3_SECRET_ACCESS_KEY: ${S3_SECRET_ACCESS_KEY}
S3_FORCE_PATH_STYLE: ${S3_FORCE_PATH_STYLE}
HOST: ${HOST}
PORT: ${PORT}
COOKIE_SECURE: ${COOKIE_SECURE}
@@ -83,6 +120,13 @@ services:
JWT_SECRET: ${JWT_SECRET}
DATABASE_URL: ${DATABASE_URL}
STORAGE_DIR: ${STORAGE_DIR}
STORAGE_DRIVER: ${STORAGE_DRIVER}
S3_ENDPOINT: ${S3_ENDPOINT}
S3_REGION: ${S3_REGION}
S3_BUCKET: ${S3_BUCKET}
S3_ACCESS_KEY_ID: ${S3_ACCESS_KEY_ID}
S3_SECRET_ACCESS_KEY: ${S3_SECRET_ACCESS_KEY}
S3_FORCE_PATH_STYLE: ${S3_FORCE_PATH_STYLE}
SERVE_CLIENT_DIST: "false"
CLIENT_DIST_DIR: ${CLIENT_DIST_DIR}
@@ -119,6 +163,13 @@ services:
JWT_SECRET: ${JWT_SECRET}
DATABASE_URL: ${DATABASE_URL}
STORAGE_DIR: ${STORAGE_DIR}
STORAGE_DRIVER: ${STORAGE_DRIVER}
S3_ENDPOINT: ${S3_ENDPOINT}
S3_REGION: ${S3_REGION}
S3_BUCKET: ${S3_BUCKET}
S3_ACCESS_KEY_ID: ${S3_ACCESS_KEY_ID}
S3_SECRET_ACCESS_KEY: ${S3_SECRET_ACCESS_KEY}
S3_FORCE_PATH_STYLE: ${S3_FORCE_PATH_STYLE}
SERVE_CLIENT_DIST: ${SERVE_CLIENT_DIST}
CLIENT_DIST_DIR: ${CLIENT_DIST_DIR}
OCR_PROVIDER: ${OCR_PROVIDER}