Bedrud использует GORM в качестве ORM с поддержкой как SQLite, так и PostgreSQL.
Поддерживаемые базы данных
- SQLite: Используется по умолчанию для удобной разработки и небольших установок. База данных хранится в файле (обычно
bedrud.db). - PostgreSQL: Рекомендуется для продакшен-сред с большим количеством пользователей.
Вы можете настроить тип базы данных и параметры подключения в файле config.yaml в разделе database:.
Расположение файлов SQLite
При использовании SQLite Bedrud включает режим WAL (Write-Ahead Log) для лучшей производительности одновременного чтения. Это создаёт два дополнительных файла рядом с основной базой данных:
| Файл | Назначение |
|---|---|
bedrud-local.db | Основной файл базы данных |
bedrud-local.db-shm | Файл разделяемой памяти — координирует доступ между читателями и писателями |
bedrud-local.db-wal | Write-Ahead Log — новые записи сначала попадают сюда, затем переносятся в основную БД |
Эти файлы нормальны. Они автоматически создаются при запуске сервера и очищаются при корректном завершении работы. Если сервер упадёт, SQLite восстановится автоматически — без потери данных.
Чтобы отключить режим WAL (не рекомендуется), установите PRAGMA journal_mode=DELETE; в конфигурации SQLite, но ожидайте более медленного одновременного чтения.
Основные модели
Модели расположены в internal/models/. Вот самые важные из них:
User (user.go)
Хранит информацию об аккаунте, включая учётные данные и роли.
Room (room.go)
Представляет сеанс встречи. Использует встроенные структуры GORM для организации настроек.
Вместо отдельной таблицы или JSON-блока, поля RoomSettings (такие как allow_chat, allow_video) хранятся непосредственно в таблице rooms с префиксом settings_ (например, settings_allow_chat). Это обеспечивает чистую модель в Go при сохранении плоской, производительной структуры базы данных.
Passkey (passkey.go)
Хранит публичные ключи FIDO2/WebAuthn для беспарольного входа.
Пользовательские типы: StringArray
Стандартные SQL-базы данных по-разному обрабатывают массивы (PostgreSQL имеет встроенные массивы, SQLite - нет). Для обеспечения совместимости Bedrud определяет тип StringArray в internal/models/user.go.
- Он реализует
sql.Scannerиdriver.Valuer. - В PostgreSQL используется встроенный тип
text[]. - В SQLite массив сериализуется в строку (например,
{admin,user}) для хранения.
Управление внешними ключами
AutoMigrate от GORM не обрабатывает составные первичные ключи (например, room_participants).
В internal/database/migrations.go Bedrud вручную выполняет операторы ALTER TABLE, чтобы гарантировать правильное применение ограничений внешних ключей (таких как ON DELETE CASCADE) в продакшене (PostgreSQL).
Паттерн Repository
Бэкенд использует паттерн Repository для доступа к базе данных. Обработчики не вызывают GORM напрямую - они используют репозиторий.
Пример:
// В обработчике:
user, err := h.userRepo.GetByEmail(email)
// В репозитории:
func (r *UserRepository) GetByEmail(email string) (*models.User, error) {
var user models.User
err := r.db.Where("email = ?", email).First(&user).Error
return &user, err
}Автоматические миграции
При запуске сервера автоматически выполняется «AutoMigrate». Это создаёт или обновляет таблицы базы данных на основе структур Go в internal/models. Ручные операторы CREATE TABLE не требуются для простых изменений схемы.