W2 — БД (SQL) бэкенд: реальный DSN + интеграционный тест
Цель
Доказать, что SQL-бэкенд реально ходит в БД Community Server (MySQL) и работает.
Работа
Поднять доступ к БД: SSH-туннель в VM (127.0.0.1:32) к MySQL 3306 (см. docs/community-server-db.md).
Задать ONLYOFFICE_DSN (MySQL) и ONLYOFFICE_PG_DRIVER=mysql (самоопределение допускается).
Прогнать go test -tags=integration -run TestIntegrationPGStore ./... (из F2 #45) — зелёный.
Добавить тест, доказывающий использование SQL-стора через фасад: Client.FileStore("sql"/"pg").Stat/List
на известном id, сверка с REST. Если фасад ещё не умеет SQL — доделать (по F4).
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
Креды: /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.
Нет. Одно ограничение задокументировано: 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` работают.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Эпик: #53
W2 — БД (SQL) бэкенд: реальный DSN + интеграционный тест
Цель
Доказать, что SQL-бэкенд реально ходит в БД Community Server (MySQL) и работает.
Работа
127.0.0.1:32) к MySQL3306(см.docs/community-server-db.md).ONLYOFFICE_DSN(MySQL) иONLYOFFICE_PG_DRIVER=mysql(самоопределение допускается).go test -tags=integration -run TestIntegrationPGStore ./...(из F2 #45) — зелёный.Client.FileStore("sql"/"pg").Stat/Listна известном id, сверка с REST. Если фасад ещё не умеет SQL — доделать (по F4).
docs/community-server-db.md: как поднять туннель, env-имена, что БД — MySQL.Критерии
go build/vet/testзелёные; секретов нет.W2 #55 — отчёт: SQL-бэкенд, реальный DSN + интеграционный тест
PR #60: #60
Ветка
feat/db-integration#55· коммитa6bba30(basemain). Не мержу и не закрываю.Доступ к БД (без паролей)
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.Значения не печатались.
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.TestNewFileClientReadOrderIncludesSQL,TestClientFileStoreSQLRoutingWithoutDSN,TestFileClientMySQLStoreIsPreferredForReads— PASS.ONLYOFFICE_DSNоба интеграционных теста — чистый SKIP.go build ./...,go vet ./...,go test ./...,go test -race ./...— зелёные.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/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работают.