feat(storage): S3-совместимое хранилище файлов (SeaweedFS/MinIO) и миграция uploads
- storage.js: абстракция хранилища с драйверами local и s3 (AWS SDK v3), ключи объектов совпадают с текущими путями /uploads/<файл>, поэтому схема БД и URL не меняются - docker-compose.yml: сервис s3 (SeaweedFS, том s3-data, API только на loopback), переменные S3_*/STORAGE_*, restart unless-stopped для app и db - docker-compose.minio.yml: оверрайд S3-сервиса на MinIO (образ из своего зеркала) - server.js/worker.js: чтение и запись файлов только через storage (отдача /uploads/*, миниатюры, share-файлы, zip-отчёты, enhance/apply/rollback, photo-worker), автосоздание бакета, глобальная персистенция загрузок multer - бэкап/восстановление и scripts/backup.sh, restore.sh — через scripts/storage-sync.js - scripts/migrate-to-s3.js: идемпотентная миграция uploads/ в бакет (--dry-run, --verify-only, --delete-local) - админка: блок «Хранилище» в системной информации - .env.example, README.md, AGENTS.md: описание драйверов, переменных и перехода на S3
This commit is contained in:
@@ -3,6 +3,7 @@ name: whatido
|
||||
services:
|
||||
db:
|
||||
image: postgres:16-alpine
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
POSTGRES_DB: whereldo
|
||||
POSTGRES_USER: app
|
||||
@@ -24,6 +25,7 @@ services:
|
||||
args:
|
||||
GIT_COMMIT: ${GIT_COMMIT:-}
|
||||
GIT_COMMIT_DATE: ${GIT_COMMIT_DATE:-}
|
||||
restart: unless-stopped
|
||||
extra_hosts:
|
||||
- "host.docker.internal:host-gateway"
|
||||
expose:
|
||||
@@ -43,12 +45,46 @@ services:
|
||||
PHOTO_AI_URL: ${PHOTO_AI_URL:-http://photo-ai:8080}
|
||||
NODE_ENV: production
|
||||
TZ: Europe/Moscow
|
||||
STORAGE_DRIVER: ${STORAGE_DRIVER:-local}
|
||||
STORAGE_LOCAL_FALLBACK: ${STORAGE_LOCAL_FALLBACK:-1}
|
||||
STORAGE_KEEP_LOCAL: ${STORAGE_KEEP_LOCAL:-0}
|
||||
STORAGE_CACHE_MAX_AGE_HOURS: ${STORAGE_CACHE_MAX_AGE_HOURS:-168}
|
||||
S3_ENDPOINT: ${S3_ENDPOINT:-http://minio:9000}
|
||||
S3_REGION: ${S3_REGION:-us-east-1}
|
||||
S3_BUCKET: ${S3_BUCKET:-whatido}
|
||||
S3_ACCESS_KEY: ${S3_ACCESS_KEY:-whatido}
|
||||
S3_SECRET_KEY: ${S3_SECRET_KEY:-whatido-secret}
|
||||
S3_FORCE_PATH_STYLE: ${S3_FORCE_PATH_STYLE:-1}
|
||||
S3_PREFIX: ${S3_PREFIX:-}
|
||||
depends_on:
|
||||
db:
|
||||
condition: service_healthy
|
||||
volumes:
|
||||
- ./uploads:/app/uploads
|
||||
|
||||
# S3-совместимое хранилище файлов. API 9000 доступен только внутри сети compose
|
||||
# (плюс loopback хоста для отладки/миграции).
|
||||
# По умолчанию — SeaweedFS: свободный S3-сервер, доступный в Docker Hub.
|
||||
# Для MinIO (если образ доступен в вашем зеркале) используйте:
|
||||
# docker compose -f docker-compose.yml -f docker-compose.minio.yml up -d s3
|
||||
# Перенос файлов из ./uploads в бакет:
|
||||
# docker compose exec -T app node scripts/migrate-to-s3.js --dry-run
|
||||
s3:
|
||||
image: ${S3_IMAGE:-chrislusf/seaweedfs:latest}
|
||||
container_name: whatido-s3
|
||||
restart: unless-stopped
|
||||
command: server -dir=/data -s3 -s3.port=9000
|
||||
environment:
|
||||
AWS_ACCESS_KEY_ID: ${S3_ACCESS_KEY:-whatido}
|
||||
AWS_SECRET_ACCESS_KEY: ${S3_SECRET_KEY:-whatido-secret}
|
||||
TZ: Europe/Moscow
|
||||
expose:
|
||||
- "9000"
|
||||
ports:
|
||||
- "127.0.0.1:9000:9000"
|
||||
volumes:
|
||||
- s3-data:/data
|
||||
|
||||
# Публикация через Tailscale (Serve / Funnel) без проброса портов.
|
||||
# Приложение доступно по https://whatido.<tailnet>.ts.net
|
||||
# tailscale:
|
||||
@@ -134,3 +170,4 @@ services:
|
||||
volumes:
|
||||
pgdata:
|
||||
photo-ai-models:
|
||||
s3-data:
|
||||
|
||||
Reference in New Issue
Block a user