W2 — БД (SQL) бэкенд: реальный DSN + интеграционный тест #55

Closed
opened 2026-09-16 22:20:44 +01:00 by eSlider · 1 comment
Owner

Эпик: #53

W2 — БД (SQL) бэкенд: реальный DSN + интеграционный тест

Цель

Доказать, что SQL-бэкенд реально ходит в БД Community Server (MySQL) и работает.

Работа

  1. Поднять доступ к БД: SSH-туннель в VM (127.0.0.1:32) к MySQL 3306 (см. docs/community-server-db.md).
  2. Задать ONLYOFFICE_DSN (MySQL) и ONLYOFFICE_PG_DRIVER=mysql (самоопределение допускается).
  3. Прогнать go test -tags=integration -run TestIntegrationPGStore ./... (из F2 #45) — зелёный.
  4. Добавить тест, доказывающий использование SQL-стора через фасад: Client.FileStore("sql"/"pg").Stat/List
    на известном id, сверка с REST. Если фасад ещё не умеет SQL — доделать (по F4).
  5. docs/community-server-db.md: как поднять туннель, env-имена, что БД — MySQL.

Критерии

  • Интеграционный тест зелёный на реальном DSN; без DSN — корректный skip.
  • Есть тест, что пик используют именно SQL-стор (не REST).
  • go build/vet/test зелёные; секретов нет.
Эпик: #53 ## W2 — БД (SQL) бэкенд: реальный DSN + интеграционный тест ### Цель Доказать, что SQL-бэкенд реально ходит в БД Community Server (MySQL) и работает. ### Работа 1. Поднять доступ к БД: SSH-туннель в VM (`127.0.0.1:32`) к MySQL `3306` (см. `docs/community-server-db.md`). 2. Задать `ONLYOFFICE_DSN` (MySQL) и `ONLYOFFICE_PG_DRIVER=mysql` (самоопределение допускается). 3. Прогнать `go test -tags=integration -run TestIntegrationPGStore ./...` (из F2 #45) — зелёный. 4. Добавить тест, доказывающий **использование** SQL-стора через фасад: `Client.FileStore("sql"/"pg").Stat/List` на известном id, сверка с REST. Если фасад ещё не умеет SQL — доделать (по F4). 5. `docs/community-server-db.md`: как поднять туннель, env-имена, что БД — MySQL. ### Критерии - [ ] Интеграционный тест зелёный на реальном DSN; без DSN — корректный skip. - [ ] Есть тест, что пик используют именно SQL-стор (не REST). - [ ] `go build/vet/test` зелёные; секретов нет.
eSlider added the feature label 2026-09-16 22:20:52 +01:00
Author
Owner

W2 #55 — отчёт: SQL-бэкенд, реальный DSN + интеграционный тест

PR #60: #60
Ветка feat/db-integration#55 · коммит a6bba30 (base main). Не мержу и не закрываю.

Доступ к БД (без паролей)

  • Community Server VM onlyoffice-v2, SSH -p 32 -i ~/.ssh/id_ed25519 root@127.0.0.1.
  • Туннель: ssh -f -N -o ControlMaster=no -o ControlPath=none -p 32 -i ~/.ssh/id_ed25519 -L 3306:127.0.0.1:3306 root@127.0.0.1.
  • Креды: /etc/onlyoffice/communityserver/appsettings.production.json →
    ConnectionStrings.connectionString (поля User ID, Password), база onlyoffice.
    Значения не печатались.
  • БД MySQL 8.0, тенант 1. Рабочий сервер — host-mysqld на 127.0.0.1:3306
    (207 таблиц, files_file/files_folder). Контейнер onlyoffice-mysql-server
    содержит пустую базу onlyoffice — не тот инстанс (грабля, в доках).
  • Для теста: файл 19423 (папка 676), он же в MinIO (MNIO 127.0.0.1:9000,
    bucket office).

Env

ONLYOFFICE_DSN (MySQL), ONLYOFFICE_PG_DRIVER=mysql, ONLYOFFICE_PG_TENANT=1;
MINIO_ENDPOINT/BUCKET/ACCESS_KEY/SECRET_KEY — только для Download-сверки.

Тесты (живой DSN)

  • TestIntegrationPGStore — PASS (sql store backend: mysql): Stat/List
    сверены с REST, write-методы → ErrReadOnly, Download сверён с REST.
  • TestIntegrationSQLFacade — PASS: c.SQLFileStore() открывает MySQL;
    на фасаде Read().Name() = SQL; f.Stat/f.List отдают Entry.Provider == "mysql"
    (REST — "rest"), title/id/parent сверены с REST; прямой c.FileStore("pg").Stat.
  • Unit: TestNewFileClientReadOrderIncludesSQL, TestClientFileStoreSQLRoutingWithoutDSN,
    TestFileClientMySQLStoreIsPreferredForReads — PASS.
  • Без ONLYOFFICE_DSN оба интеграционных теста — чистый SKIP.
  • go build ./..., go vet ./..., go test ./..., go test -race ./... — зелёные.
  • gitleaks: no leaks; секретов/PII в git нет, env только именами.

Изменения кода

  • Client.SQLFileStore() (FileStore, error); Client.FileStore("pg"|"sql"|"postgres"|"mysql")
    (при ошибке открытия — errStore, не nil).
  • readOrder фасада: postgres → mysql → rest → dav.
  • TestIntegrationPGStore: Download-шаг теперь корректно skip без MINIO_*.
  • Docs: docs/community-server-db.md, docs/unified-file-client.md, README, AGENTS.

Блокеры / ограничения

  • Нет. Одно ограничение задокументировано: pgStore.Download работает по
    MinIO/S3-layout (старые папки); файлы Disc-хранилища (напр. 3603) по этому
    ключу дают 404. Без MINIO_* Download-сверка в тесте skip, Stat/List/
    Search работают.
## W2 #55 — отчёт: SQL-бэкенд, реальный DSN + интеграционный тест PR #60: https://git.produktor.io/eSlider/go-onlyoffice/pulls/60 Ветка `feat/db-integration#55` · коммит `a6bba30` (base `main`). Не мержу и не закрываю. ### Доступ к БД (без паролей) - Community Server VM `onlyoffice-v2`, SSH `-p 32 -i ~/.ssh/id_ed25519 root@127.0.0.1`. - Туннель: `ssh -f -N -o ControlMaster=no -o ControlPath=none -p 32 -i ~/.ssh/id_ed25519 -L 3306:127.0.0.1:3306 root@127.0.0.1`. - Креды: `/etc/onlyoffice/communityserver/appsettings.production.json` → `ConnectionStrings.connectionString` (поля `User ID`, `Password`), база `onlyoffice`. Значения не печатались. - БД **MySQL 8.0**, тенант `1`. Рабочий сервер — host-mysqld на `127.0.0.1:3306` (207 таблиц, `files_file`/`files_folder`). Контейнер `onlyoffice-mysql-server` содержит **пустую** базу `onlyoffice` — не тот инстанс (грабля, в доках). - Для теста: файл `19423` (папка `676`), он же в MinIO (`MNIO 127.0.0.1:9000`, bucket `office`). ### Env `ONLYOFFICE_DSN` (MySQL), `ONLYOFFICE_PG_DRIVER=mysql`, `ONLYOFFICE_PG_TENANT=1`; `MINIO_ENDPOINT/BUCKET/ACCESS_KEY/SECRET_KEY` — только для Download-сверки. ### Тесты (живой DSN) - `TestIntegrationPGStore` — **PASS** (`sql store backend: mysql`): `Stat`/`List` сверены с REST, write-методы → `ErrReadOnly`, `Download` сверён с REST. - `TestIntegrationSQLFacade` — **PASS**: `c.SQLFileStore()` открывает MySQL; на фасаде `Read().Name()` = SQL; `f.Stat`/`f.List` отдают `Entry.Provider == "mysql"` (REST — `"rest"`), title/id/parent сверены с REST; прямой `c.FileStore("pg").Stat`. - Unit: `TestNewFileClientReadOrderIncludesSQL`, `TestClientFileStoreSQLRoutingWithoutDSN`, `TestFileClientMySQLStoreIsPreferredForReads` — **PASS**. - Без `ONLYOFFICE_DSN` оба интеграционных теста — чистый **SKIP**. - `go build ./...`, `go vet ./...`, `go test ./...`, `go test -race ./...` — зелёные. - gitleaks: `no leaks`; секретов/PII в git нет, env только именами. ### Изменения кода - `Client.SQLFileStore() (FileStore, error)`; `Client.FileStore("pg"|"sql"|"postgres"|"mysql")` (при ошибке открытия — `errStore`, не `nil`). - `readOrder` фасада: `postgres` → `mysql` → `rest` → `dav`. - `TestIntegrationPGStore`: Download-шаг теперь корректно skip без `MINIO_*`. - Docs: `docs/community-server-db.md`, `docs/unified-file-client.md`, README, AGENTS. ### Блокеры / ограничения - Нет. Одно ограничение задокументировано: `pgStore.Download` работает по MinIO/S3-layout (старые папки); файлы Disc-хранилища (напр. `3603`) по этому ключу дают 404. Без `MINIO_*` Download-сверка в тесте skip, `Stat`/`List`/ `Search` работают.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: eSlider/go-onlyoffice#55