feat(files): read-only SQL file store (Community Server DB) (#36) #45

Merged
eSlider merged 1 commits from feat/pg-store#36 into main 2026-09-16 18:27:22 +01:00
Owner

Closes #36 (F2 эпика #34).

Что сделано

Read-only SQL-бэкенд файлового клиента: file_pg.go — pgStore на
database/sql, реализует FileStore (List/Stat/Download) и Searcher
по имени. Все write-методы возвращают ErrReadOnly. Name() — фактический
движок (mysql/postgres).

Research — БД на самом деле MySQL, не PostgreSQL

  • Community Server в VM onlyoffice-v2 работает на MySQL 8.0
    (127.0.0.1:3306, база onlyoffice, providerName: MySql.Data.MySqlClient).
    Таблицы files_file/files_folder/files_folder_tree/files_security,
    тенанты — tenants_tenants.
  • PostgreSQL 16 в той же VM — наш контур edw_docs (роли edw/edw_ro),
    files_file там нет.
  • Поэтому pgStore выбирает драйвер по DSN: mysql (live) или pgx
    (PostgreSQL, если портал перенесут). Оба пути живые: MySQL — integration,
    pgx — проверен подключением к edw_ro.

Download

Через MinIO (storage_fallback.go), REST не используется. Ключ
00/00/<tenant>/files/folder_<shard>/file_<id>/v<version>/content.<ext>,
где shard = (id/1000+1)*1000 (файл 3727 → folder_4000, не folder_id).
Стриминг переиспользует новый общий downloadMinioObject.

Тесты

  • Unit (file_pg_test.go): TestRebind, TestCSPObjectKey,
    TestPGDriverDetection, TestNormalizeSQLDSNMySQL, TestFileRowToEntry,
    TestFolderRowToEntry, TestPGStoreWriteMethodsReadOnly, TestPGStoreName,
    TestPGStoreStatRejectsNonNumeric — PASS.
  • Integration (file_pg_integration_test.go, //go:build integration, skip без
    ONLYOFFICE_DSN): TestIntegrationPGStore — PASS live (backend mysql;
    Stat/List/Download vs REST, read-only, байтовое сравнение download).
  • go build ./... && go vet ./... && go test -race ./... — зелёные.
    gitleaks — no leaks found. Секретов нет.
  • Док: docs/community-server-db.md; имена env — в .env.example.

Ветка feat/pg-store#36, коммит bf3ef02. Не мержу и не закрываю.

Closes #36 (F2 эпика #34). ## Что сделано Read-only SQL-бэкенд файлового клиента: `file_pg.go` — `pgStore` на `database/sql`, реализует `FileStore` (`List`/`Stat`/`Download`) и `Searcher` по имени. Все write-методы возвращают `ErrReadOnly`. `Name()` — фактический движок (`mysql`/`postgres`). ## Research — БД на самом деле MySQL, не PostgreSQL - Community Server в VM `onlyoffice-v2` работает на **MySQL 8.0** (`127.0.0.1:3306`, база `onlyoffice`, `providerName: MySql.Data.MySqlClient`). Таблицы `files_file`/`files_folder`/`files_folder_tree`/`files_security`, тенанты — `tenants_tenants`. - PostgreSQL 16 в той же VM — наш контур `edw_docs` (роли `edw`/`edw_ro`), `files_file` там нет. - Поэтому `pgStore` выбирает драйвер по DSN: `mysql` (live) или `pgx` (PostgreSQL, если портал перенесут). Оба пути живые: MySQL — integration, pgx — проверен подключением к `edw_ro`. ## Download Через MinIO (`storage_fallback.go`), REST не используется. Ключ `00/00/<tenant>/files/folder_<shard>/file_<id>/v<version>/content.<ext>`, где `shard = (id/1000+1)*1000` (файл 3727 → folder_4000, не folder_id). Стриминг переиспользует новый общий `downloadMinioObject`. ## Тесты - Unit (`file_pg_test.go`): `TestRebind`, `TestCSPObjectKey`, `TestPGDriverDetection`, `TestNormalizeSQLDSNMySQL`, `TestFileRowToEntry`, `TestFolderRowToEntry`, `TestPGStoreWriteMethodsReadOnly`, `TestPGStoreName`, `TestPGStoreStatRejectsNonNumeric` — PASS. - Integration (`file_pg_integration_test.go`, `//go:build integration`, skip без `ONLYOFFICE_DSN`): `TestIntegrationPGStore` — PASS live (backend mysql; Stat/List/Download vs REST, read-only, байтовое сравнение download). - `go build ./... && go vet ./... && go test -race ./...` — зелёные. gitleaks — no leaks found. Секретов нет. - Док: `docs/community-server-db.md`; имена env — в `.env.example`. Ветка `feat/pg-store#36`, коммит `bf3ef02`. Не мержу и не закрываю.
eSlider added 1 commit 2026-09-16 18:24:29 +01:00
feat(files): read-only SQL file store over Community Server DB (#36)
Release Please / Release Please (push) Skipped
Release / GoReleaser (push) Skipped
Tests / Secret scan (gitleaks) (push) Skipped
Tests / Test (Go 1.25) (push) Skipped
Tests / Test (Go stable) (push) Skipped
Tests / Secret scan (gitleaks) (pull_request) Successful in 4s
Tests / Test (Go 1.25) (pull_request) Successful in 1m56s
Tests / Test (Go stable) (pull_request) Successful in 1m57s
bf3ef025aa
eSlider merged commit 6d93ab5b1f into main 2026-09-16 18:27:22 +01:00
eSlider deleted branch feat/pg-store#36 2026-09-16 18:27:22 +01:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: eSlider/go-onlyoffice#45