tasks(owncloud-vds-deploy): close 🟢 — 26 GB live + 60s timeout finding

Import complete: 25 044 objs / 26 GB. 99.97% залито rclone'ом (22.2 GB
за ~2.5 ч), оставшиеся 6 файлов (4.04 GB) — 4× .pat ~221 MB + 2× .seospider
1.55+1.7 GB — упали с 502/500 на каждом rclone PUT из-за 60-секундного
HTTP timeout в reva v2.27 datagateway (hardcoded в Go http.Client.Timeout,
не env-configurable).

Workaround: VDS-side curl PUT loopback через throwaway sftp key.
Local network 142 MB/s → 4.04 GB за 28 секунд, все PROPFIND size match.

Wiki: §Gotcha 5 в concepts/ocis-on-vds-deploy-recipe.md документирует
finding + recipe для workaround. Traefik buffering middleware пробован,
не помог (likely vulcand/oxy buffer bug на больших телах) — откатил.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-22 07:26:07 +03:00
parent 74cf219533
commit 68706d0bee
4 changed files with 107 additions and 17 deletions

View File

@@ -1,5 +1,5 @@
# Admin Task Board # Admin Task Board
_Updated: 2026-05-21 (owncloud-vds-deploy 🟡oCIS up, user vitya created, WebDAV verified; 24.7GB import pending user-side rclone)_ _Updated: 2026-05-22 (owncloud-vds-deploy 🟢25 044 объектов / 26 GB live, все 6 large-file холдауты залиты VDS-side curl loopback'ом; 60s upload-timeout finding закреплён в [`ocis-on-vds-deploy-recipe`](../.wiki/concepts/ocis-on-vds-deploy-recipe.md) §Gotcha 5)_
<!-- <!--
Status legend: Status legend:
@@ -10,23 +10,18 @@ _Updated: 2026-05-21 (owncloud-vds-deploy 🟡 — oCIS up, user vitya created,
🔵 Blocked — waiting on external input 🔵 Blocked — waiting on external input
--> -->
## 🟡 [owncloud-vds-deploy] — oCIS 7.1.0 на vds-kzntsv replace мёртвый ownCloud с Synology; 24.7GB import pending user-side rclone ## 🟢 [owncloud-vds-deploy] — oCIS 7.1.0 на vds-kzntsv live, 25 044 объектов / 26 GB
oCIS deploy завершён, container up, traefik routes 200 OK через LE-cert, user `vitya` создан, WebDAV verified. Backup integration done — `/opt/stacks/owncloud` в rsync sources [[vds-backup-rsync-kreknin]]. Detail в [owncloud-vds-deploy.md](owncloud-vds-deploy.md). **Closed:** 2026-05-22 — import complete. 99.97% (22.2 GB / 25 038 objs) залито rclone'ом за ~2.5 ч (3.35 MiB/s uplink). Оставшиеся 6 файлов (4.04 GB) — 4× .pat ~221 MB + 2× .seospider 1.55+1.7 GB — упали с 502 (later 500) на каждой попытке rclone из-за 60-секундного timeout где-то в HTTP stack (Go http.Client.Timeout в reva v2.27 datagateway, **не** traefik). Workaround: throwaway sftp-only ssh-key → агент scp'ит в `/tmp/oc-import/` на VDS → c VDS curl PUT loopback'ом через traefik в правильные oCIS пути (local network 142 MB/s — все 6 файлов залиты за 28 секунд total). Все PROPFIND size match. Throwaway-key revoked, staging cleaned.
**Status:** paused **Finding закреплён** в [`ocis-on-vds-deploy-recipe`](../.wiki/concepts/ocis-on-vds-deploy-recipe.md) §Gotcha 5 (60s timeout cap × upload speed = ~200 MB max single PUT на 3 MiB/s uplink; recipe для VDS-side workaround). Traefik buffering middleware **не починил** — сам выдаёт 500 на 60s mark (likely bug в `vulcand/oxy` buffer); подходит для других кейсов с медленными backend'ами, но не для этого 60s cascade.
**Where I stopped:** infrastructure complete; waiting on user-side rclone copy 24.7GB → WebDAV endpoint. Full copy лежит на другом PC (local C:\Users\vitya\ownCloud — partial 1.3GB не та копия). Compose в `/opt/stacks/owncloud/` (data+config dirs, `.env` chmod 600 с admin-password). Passwords: `pass show owncloud/admin-password` + `pass show owncloud/user-vitya` (pushed). HTTPS endpoint `https://owncloud.kzntsv.site` live.
**Next action:** user запускает rclone на PC где живёт 24.7GB: **Detail:** [owncloud-vds-deploy.md](owncloud-vds-deploy.md). Backup integration: `/opt/stacks/owncloud` в rsync sources [[vds-backup-rsync-kreknin]] (next nightly snapshot 2026-05-22 05:00 MSK захватит full 26 GB).
```
rclone copy "<src>" :webdav: \ **Open follow-ups:**
--webdav-url https://owncloud.kzntsv.site/dav/files/vitya \ - 2× DipTrace `.exe` (~2 MB total) — заблокированы Windows Defender на агентовой машине, не баг oCIS. User-side issue, не блокер.
--webdav-vendor owncloud --webdav-user vitya \ - Portainer API key (vds-kzntsv/full-env `PORTAINER_API_KEY`) — 401 Unauthorized, требует regen через Portainer UI + pass-store update. Не блокировало deploy (admin user/pass работали). Отдельная chore-task если нужна.
--webdav-pass $(rclone obscure "$(pass show owncloud/user-vitya)") \ - oCIS image upgrade на 7.2.x / 8.x потенциально подъёмлет 60s timeout (newer reva имеет configurable timeout). Defer пока 4.04 GB workaround сработал.
--progress --transfers 4 --tpslimit 8 \
--retries 5 --low-level-retries 10 --stats 30s
```
Progress: `ssh vitya@89.253.255.94 'du -sh /opt/stacks/owncloud/data/spaces/'`. Done — 🟢 после size match + spot-check файлов через web UI.
**Branch:** master **Branch:** master

View File

@@ -77,9 +77,35 @@ User creation via LibreGraph API (`POST /graph/v1.0/users`, basic auth as admin)
- [x] **WebDAV verified:** `PROPFIND /dav/files/vitya/` returns 200 multistatus с personal space "Vitya" + system space "Shares" - [x] **WebDAV verified:** `PROPFIND /dav/files/vitya/` returns 200 multistatus с personal space "Vitya" + system space "Shares"
- [x] **Backup integration:** `/opt/stacks/owncloud` добавлен в rsync source list `/opt/stacks/backup/scripts/run.sh` (между `/opt/stacks/backup` и `/etc/ssh`). `bash -n` syntax OK. Next nightly run 05:00 MSK захватит config + (post-import) data. - [x] **Backup integration:** `/opt/stacks/owncloud` добавлен в rsync source list `/opt/stacks/backup/scripts/run.sh` (между `/opt/stacks/backup` и `/etc/ssh`). `bash -n` syntax OK. Next nightly run 05:00 MSK захватит config + (post-import) data.
## Open ## Closed 2026-05-22 — import complete
- [ ] **Import 24.7 GB** — pending user-side action. User запускает rclone copy с PC где лежит full копия: 25 044 объектов / **26 GB** на vitya space. Path: 22.2 GB rclone (3.35 MiB/s uplink, ~2.5h) + 4.04 GB VDS-side curl loopback (6 файлов с 502/500 from 60s timeout — см. §Closed-out finding ниже).
Все PROPFIND size match. Backup integration: `/opt/stacks/owncloud` в `vds-backup-rsync-kreknin` rsync sources — next snapshot 2026-05-22 05:00 MSK захватит 26 GB.
### Closed-out finding: 60s HTTP upload timeout
При rclone uplink ~3.35 MiB/s упали все файлы ≥221 MB (4× .pat 220-222 MB, 508 MB zip, 1.55 + 1.7 GB seospider). Logs traefik показывали ровно `60000ms` duration на 502. oCIS error log: `Put "http://localhost:9158/data/simple/...": context canceled`, `time_ns:59944479090` (59.94s) — internal HTTP client между oCIS services вырубает request на 60s. Hardcoded в Go `http.Client.Timeout` где-то в reva v2.27 datagateway.go:200. Env-var fix отсутствует.
**Traefik buffering middleware попробован, не помог:** `traefik.http.middlewares.oc-buffering.buffering.maxRequestBodyBytes=0` + `memRequestBodyBytes=1048576` через docker labels. Traefik сам стал выдавать 500 на 60s mark (backend_url="-" в access log = до oCIS не доходило). Likely bug в `vulcand/oxy` buffer на больших телах. Откатил.
**Workaround:** VDS-side direct curl PUT loopback'ом через traefik. Пользовательский агент:
1. Throwaway ed25519 key сгенерирован на VDS, append'нут как `restrict,command="internal-sftp"` в `~/.ssh/authorized_keys` (sftp-only, no shell).
2. Агент `sftp -i <key> -b <batch> vitya@VDS` залил 6 файлов в `/tmp/oc-import/` (~20 мин на агентовом uplink).
3. С VDS — `for SRC ...; curl -T $SRC <ocis-url-with-urlencode>` через localhost → traefik → owncloud. Local network 142 MB/s — все 4.04 GB за 28 секунд (1.7 GB файл за 10s).
4. Verify PROPFIND `<oc:size>` match `stat -c %s`. All 6 OK.
5. Cleanup: `rm -rf /tmp/oc-import/`, throwaway-key revoked из authorized_keys.
Pattern закреплён в [`.wiki/concepts/ocis-on-vds-deploy-recipe.md`](../.wiki/concepts/ocis-on-vds-deploy-recipe.md) §Gotcha 5.
## Skipped / not-our-bug
- 2× DipTrace `.exe` (~2 MB total) — заблокированы Windows Defender на агентовой машине при copy в staging. Не баг oCIS. Не блокер.
- Portainer API key invalid (401) — не блокировало deploy (admin user/pass работали), требует regen через UI + pass-store update если кто будет использовать API.
## Open (legacy section) — DEPRECATED, см. closed-out выше
- [x] ~~Import 24.7 GB~~ — done 2026-05-22 (rclone + VDS-side curl)
``` ```
rclone copy "<src>" :webdav: \ rclone copy "<src>" :webdav: \
--webdav-url https://owncloud.kzntsv.site/dav/files/vitya \ --webdav-url https://owncloud.kzntsv.site/dav/files/vitya \

View File

@@ -173,6 +173,73 @@ ssh vitya@89.253.255.94 "sed -i '\\|/opt/stacks/owncloud|d' /opt/stacks/backup/s
pass rm owncloud/admin-password owncloud/user-vitya && pass git push pass rm owncloud/admin-password owncloud/user-vitya && pass git push
``` ```
## Gotcha 5: 60-секундный timeout на uploads через slow uplink
**Симптом:** rclone PUT любого файла, который не успевает залиться за 60 секунд через
клиентский uplink, падает с 502 (no buffering) или 500 (с buffering middleware).
Пороги при разной скорости uplink:
| Uplink | Cap |
|---|---|
| 3 MiB/s | ~180 MB |
| 10 MiB/s | ~600 MB |
| 50 MiB/s | ~3 GB |
В нашем кейсе (rclone 3.35 MiB/s) — упали все файлы ≥221 MB (4× .pat по 221-222 MB,
508 MB zip, 1.55 GB + 1.7 GB seospider).
**Где сидит 60s:** не traefik (default unlimited). Не на oCIS layer per env-var
(нет конфигурируемого ключа). Hardcoded где-то в HTTP stack — кандидаты:
- Go `http.Client.Timeout` в reva v2.27 datagateway.go:200 (видно в логах
oCIS: `Put "http://localhost:9158/data/simple/...": context canceled`,
`time_ns:59944479090` = 59.94s)
- rclone-side `http.Client.Timeout` (default Go = no timeout, но в библиотеке
WebDAV может быть явно установлен)
- HTTP/2 default stream timeout
Bumped via env-var не починить — закопано в коде reva. Apgrade oCIS image
до новой версии может помочь (newer reva имеет настраиваемый timeout) — defer.
**Что НЕ помогло:**
- `traefik.http.middlewares.<name>.buffering.maxRequestBodyBytes=0` +
`memRequestBodyBytes=1048576` — буферинг сам выдаёт 500 на 60s mark
(`backend_url="-"` в access log = traefik так и не доходит до backend).
Возможно ошибка в `vulcand/oxy` buffer на больших телах. Не разбирался —
workaround ниже проще.
**Workaround: VDS-side direct upload.**
Когда у нескольких файлов upload-time > 60s через клиентский uplink:
1. **scp с throwaway-key с restricted authorized_keys на VDS:** генерим одноразовый
ed25519 на VDS, append'им как `restrict,command="internal-sftp" <pub>`
в `~vitya/.ssh/authorized_keys` (sftp-only, no shell, no port forwards), private
отдаём агенту на slow-uplink машине. Cleanup ключа после.
2. **Агент `sftp -i <key> -b <batch>` пушит файлы в `/tmp/oc-import/`** на VDS.
SFTP через ssh не уязвим к 60s timeout — длинная сессия с keep-alive.
3. **C VDS-стороны: `curl -T <local-file> <ocis-url>` loopback'ом.**
Local network = >100 MB/s → 1.7 GB файл за 10 секунд, ≪ 60s timeout window.
PUT через traefik websecure (https://owncloud.kzntsv.site/dav/files/<user>/<path>)
с basic auth admin/user. URL-encode Cyrillic / spaces в path. Pattern:
```bash
ENC=$(python3 -c "import urllib.parse,sys; print('/'.join(urllib.parse.quote(p) for p in sys.argv[1].split('/')))" "$REMOTE_PATH")
curl -sS -u "vitya:$PWD" -T "$SRC" "https://owncloud.kzntsv.site/dav/files/vitya/${ENC}"
```
→ HTTP 201 Created.
4. **Verify через PROPFIND** — `<oc:size>` или `<d:getcontentlength>` должен
match'ить `stat -c %s` source.
5. **Cleanup:** `rm -rf /tmp/oc-import/`, remove throwaway-key line из
authorized_keys.
В нашем кейсе для 6 файлов / 4.04 GB local PUT cycle занял ~28 секунд total
(0.5-10s per file). vs rclone failed после ~5 минут на каждый retry × 5 retries × 6 файлов = безуспешно вечность.
## Related ## Related
- [[admin-infra-project]] — общий context для admin-infra repo - [[admin-infra-project]] — общий context для admin-infra repo

View File

@@ -15,3 +15,5 @@ Append-only log of wiki operations (ingests, promotions, lints, migrations).
## [2026-05-21] regen | index.md catalog refresh after subtree import ## [2026-05-21] regen | index.md catalog refresh after subtree import
## [2026-05-21] ingest | concepts/ocis-on-vds-deploy-recipe — oCIS deploy recipe + gotchas (UID mismatch, PROXY_TLS, PROXY_ENABLE_BASIC_AUTH, LibreGraph user-create); updated entities/vds-kzntsv (added owncloud row to stack/hostnames/file-layout); source: .tasks/owncloud-vds-deploy.md ## [2026-05-21] ingest | concepts/ocis-on-vds-deploy-recipe — oCIS deploy recipe + gotchas (UID mismatch, PROXY_TLS, PROXY_ENABLE_BASIC_AUTH, LibreGraph user-create); updated entities/vds-kzntsv (added owncloud row to stack/hostnames/file-layout); source: .tasks/owncloud-vds-deploy.md
## [2026-05-22] update | concepts/ocis-on-vds-deploy-recipe — Gotcha 5: 60s HTTP timeout caps slow-uplink uploads at ~200MB on 3 MiB/s link; traefik buffering NOT the fix (500 from oxy buffer); workaround = VDS-side curl PUT loopback via throwaway sftp key. Source: .tasks/owncloud-vds-deploy.md close-note.