# minio-imgproxy-vds-migration ## Goal Перенести MinIO + imgproxy + imgproxy-nginx контейнеры с [[../entities/windows-recovery-host]] на [[../entities/vds-kzntsv]]. Заодно **upgrade MinIO** с `RELEASE.2020-07-13` (5 лет, куча CVE) на `minio/minio:latest`. Доступ снаружи через `minio.vds.kzntsv.site` (S3 API + console). Это **MinIO+imgproxy половина** umbrella'ы `mssql-minio-migration-to-vds` (декомпозирована 2026-05-22). Вторая половина — `mssql-vds-migration`. ## Key files / refs - **Source MinIO:** docker container `minio` на windows-recovery-host, image `minio/minio:RELEASE.2020-07-13T18-09-56Z`, bind `C:\Users\vitya\projects\docker\diskstation\minio\data` → `/data`, ~3 GB. - **Source imgproxy:** docker container `imgproxy`, image `darthsim/imgproxy`, port 8787:8080. Зависит от MinIO как S3 backend. - **Source imgproxy-nginx:** docker container `imgproxy-nginx`, image `nginx:alpine`, port 8788:80. Reverse-proxy перед imgproxy с caching. - **Target stack:** `/opt/stacks/storage/minio-imgproxy/{docker-compose.yml,.env,data,nginx-cache,nginx.conf}` на VDS. - **Target MinIO image:** `minio/minio:latest` (или pinned tag `RELEASE.2025-*`). - **CMS endpoints:** - MinIO S3: `localhost:9000` → `minio.vds.kzntsv.site` (HTTPS) для external, `http://minio:9000` для inter-container на VDS через `shared-dbs` network. - imgproxy: `localhost:8788` → `imgproxy.kzntsv.site` (если CMS реверс-проксит) или прямо в CMS-template URL. ## Decisions - **Upgrade MinIO** (user 2026-05-22, conditional «если ничего не сломает»). Migration via `mc mirror old-minio → new-minio`. Если совместимость bucket-format ломается → fallback `aws s3 sync`. **Rollback ready** через сохранённый snapshot bind-mount data. - **imgproxy + imgproxy-nginx** едут вместе — `IMGPROXY_S3_ENDPOINT` поменять на `http://minio:9000` (internal через `shared-dbs`), не external — экономит latency и не гоняет S3 traffic через traefik. - **Hostname: `minio.vds.kzntsv.site`** (user 2026-05-22). S3 API + Console на одном subdomain (MinIO 2022+ split на :9000 API + :9001 console — два под-роута через traefik PathPrefix или два subdomain). ## Acceptance 1. **Stack deployed на VDS:** - `/opt/stacks/storage/minio-imgproxy/docker-compose.yml` — 3 сервиса: `minio`, `imgproxy`, `imgproxy-nginx`. - `minio` — `minio/minio:latest`, bind `./data:/data`, env `MINIO_ROOT_USER`/`MINIO_ROOT_PASSWORD` из `pass show minio-vds/root-creds`. - Networks `proxy` (для traefik) + `shared-dbs` (для inter-container). 2. **Traefik routing:** - `minio.vds.kzntsv.site` → HTTPS → minio:9000 (S3 API). - `minio-console.vds.kzntsv.site` → HTTPS → minio:9001 (web UI, basicAuth optional). - LE certs auto-issued через existing acme.json. 3. **Data migration:** - Snapshot: `tar czf minio-bind-snapshot-$(date +%Y%m%d).tar.gz C:\Users\vitya\projects\docker\diskstation\minio\data` (3 GB → ~3 GB compressed) — rollback insurance. - Поднять new MinIO **пустой** на VDS, создать matching buckets. - `mc alias set old http://localhost:9000 …` + `mc alias set new https://minio.vds.kzntsv.site …`. - `mc mirror --preserve old/ new/` для каждого bucket. - **Verify:** `mc ls --recursive old/` vs `mc ls --recursive new/` — diff пустой, total size match (±0 bytes). - **Fallback при ошибках mc mirror:** `aws s3 sync s3://old/ s3://new/ --endpoint-url=…`. 4. **imgproxy + imgproxy-nginx подняты на VDS:** - `IMGPROXY_S3_ENDPOINT=http://minio:9000`, `IMGPROXY_USE_S3=true`, `AWS_ACCESS_KEY_ID`/`AWS_SECRET_ACCESS_KEY` из MinIO creds. - `imgproxy-nginx` reverse-proxy с caching layer перед imgproxy. - Сохранить cache path/sizing config с source (`/var/cache/nginx/imgproxy` или эквивалент). 5. **CMS endpoints repointed:** - MinIO endpoint в CMS config → `minio.vds.kzntsv.site` (или прямо `http://minio:9000` если CMS migrate тоже на VDS позже). - imgproxy URL pattern в CMS templates → новый адрес. - Smoke: 8 sites загружают images через imgproxy (admin assets UI + клиентские thumbnails). 6. **Backup pipeline на VDS расширен** (`/opt/stacks/backup/scripts/run.sh`): - `minio_mirror` ежедневно — либо `mc mirror local→backup-bucket-on-kreknin`, либо `rsync /opt/stacks/storage/minio-imgproxy/data → kreknin`. Recommend rsync — проще и hardlink-friendly. 7. **ntfy push verified** для расширенного pipeline (включает MinIO size/duration). 8. **Source windows-host:** после 48ч uptime на VDS — `docker stop minio imgproxy imgproxy-nginx`, через неделю `docker rm + docker volume rm` (minio bind-dir — оставить tar snapshot ещё месяц). 9. **Documented** в [[../.wiki/concepts/minio-imgproxy-on-vds]] (создать): architecture, MinIO upgrade notes (что сломалось при `mc mirror` если что-то), rollback recipe, migration runbook. ## Open questions - [ ] **DNS A-records** `minio.vds.kzntsv.site` + `minio-console.vds.kzntsv.site` → VDS IP — REGRU API или manual? - [ ] **MinIO upgrade compat** — есть ли в bucket'ах metadata format'ы которые новый MinIO не читает? `mc admin info` на source + dry-run `mc mirror --dry-run` для оценки. Если ругается → план B: запустить **тот же** старый MinIO image на VDS, мигрировать as-is, upgrade отдельной таской позже. - [ ] **imgproxy version** — текущий `darthsim/imgproxy` (no tag = latest на момент pull). Upgrade сразу или сохранить same digest? Рекомендую pin digest sources → use same on VDS, separate upgrade task. - [ ] **nginx cache size on VDS** — сколько диска готов выделить под `imgproxy-nginx` cache? Текущее consumption на windows — проверить через `du -sh` к bind-mount. ## Risks - **MinIO format compat (5-year gap):** RELEASE.2020-07-13 → 2025+. `xl.meta` format и erasure-coding mode менялись. `mc mirror` обычно работает (read API stable), но edge-cases возможны. **Mitigation:** snapshot bind-mount + dry-run mirror + fallback aws-s3-sync. - **imgproxy ENV vars** могли переименоваться между версиями (IMGPROXY_S3_* prefix vs IMGPROXY_OBJECT_STORAGE_*). Проверить current container env (`docker inspect imgproxy`) и сопоставить с current imgproxy docs. - **External URL change** — клиентские sites которые ссылаются на `localhost:8788/...` или hardcoded image URLs ломаются. Audit обязателен (`grep -r '8788\|localhost:9000' web.config + appsettings`). - **VDS RAM:** minio idle ~50 MB, imgproxy ~30 MB. Negligible. - **VDS Disk:** ~3 GB MinIO + nginx cache (5-10 GB?) + imgproxy temp. Total ~15 GB. **Проверить `df -h /opt/stacks` перед стартом.** - **DNS propagation:** A-record нужно ставить минимум за 1-2ч до cutover (TTL 300 sec default REGRU). ## Notes - **Зависит от:** `mssql-vds-migration` (нет — независимы). - **Atomic revert (full):** revert CMS endpoints → windows-host MinIO; на VDS — `docker compose down -v` для minio-imgproxy stack; удалить minio nogi из `run.sh`; remove traefik routes. Snapshot tar — rollback source при необходимости.