Подробный гайд: настройка multiotp db_path

Пошаговая инструкция по настройке db_path в MultiOTP: перенос БД SQLite, права доступа, миграция, Docker и решение ошибок.

2026.05.22                  


Подробный гайд: настройка multiotp db_pathПодробный гайд: настройка multiotp db_path

1. Что такое db_path и зачем его менять?

  • Назначение: db_path указывает MultiOTP, где хранить SQLite-базу данных (multiotp.db и сопутствующие файлы журнала/блокировок).
- Зачем менять:
  • Вынос БД на отдельный диск/раздел для повышения отказоустойчивости и скорости I/O.
  • Адаптация под контейнеризацию или централизованные хранилища.
  • Соответствие требованиям безопасности (например, шифрование раздела, политики backup).
  • Избежание переполнения системного раздела /var или /opt.

Важно:

MultiOTP по умолчанию использует SQLite. Параметр db_path обычно указывает на директорию, а не на файл. Внутри неё автоматически создаются multiotp.db, multiotp.db-journal, multiotp.db-wal и т.д.


2. Где хранится конфигурация

Установка Путь к конфигу
Ручная/пакетная Linux /etc/multiotp/multiotp.ini
Docker-образ /etc/multiotp/multiotp.ini внутри контейнера
Web-интерфейс Configuration → Database → DB Path
CLI multiotp.php -config (интерактивно) или multiotp.php -config-set key=value

3. Пошаговая настройка db_path

Вариант A: Через веб-интерфейс (рекомендуется для новичков)

  1. Авторизуйтесь в админ-панели MultiOTP.
  2. Перейдите в Configuration → вкладка Database.
  3. В поле DB Path укажите абсолютный путь к директории, например: /var/lib/multiotp или /opt/multiotp/data.
  4. Нажмите Save Configuration.
5. Перезапустите веб-сервер/PHP-FPM:
   sudo systemctl restart nginx php-fpm  # или apache2

Вариант B: Через командную строку

# Перейдите в директорию установки MultiOTP (обычно /usr/share/multiotp или /opt/multiotp)
cd /opt/multiotp

# Установите новый путь
sudo php multiotp.php -config-set db_path=/opt/multiotp/data

# Проверьте, что параметр применился
sudo php multiotp.php -config-get db_path

Вариант C: Прямое редактирование multiotp.ini

; /etc/multiotp/multiotp.ini
[database]
db_path = /opt/multiotp/data

Сохраните файл и перезапустите веб-сервер.


4. Требования к пути и правам доступа

Параметр Рекомендация
Владелец Пользователь веб-сервера: www-data (Debian/Ubuntu), apache (RHEL), nginx или отдельный сервис-аккаунт multiotp.
Права на директорию chmod 750 /путь/к/db
Права на файлы БД chmod 640 /путь/к/db/multiotp.db*
Пример команды bash sudo mkdir -p /opt/multiotp/data sudo chown -R www-data:www-data /opt/multiotp/data sudo chmod -R 750 /opt/multiotp/data

Примечание по SELinux (RHEL/CentOS/Alma/Rocky):

sudo semanage fcontext -a -t httpd_sys_rw_content_t "/opt/multiotp/data(/.*)?"
sudo restorecon -Rv /opt/multiotp/data

Примечание по AppArmor (Ubuntu/Debian): добавьте правило в /etc/apparmor.d/usr.sbin.apache2 или nginx с rwk /opt/multiotp/data/**.


5. Миграция существующей БД на новый db_path

  1. Остановите сервис (веб-сервер или multiotp systemd-сервис, если используется CLI-демон).
2. Скопируйте файлы:
   sudo cp -a /старый/путь/multiotp.db* /новый/путь/
  1. Обновите db_path в конфиге или через CLI/WebUI.
  2. Проверьте права (см. раздел 4).
5. Запустите сервис и проверьте логи:
   sudo journalctl -u nginx php-fpm -f
   # или
   tail -f /var/log/multiotp/multiotp.log

6. Особенности в Docker

В официальном образе MultiOTP по умолчанию используется /var/lib/multiotp.

Пример docker-compose.yml:

version: '3.8'
services:
  multiotp:
    image: multiotp/multiotp:latest
    volumes:
      - ./multiotp-data:/var/lib/multiotp:rw
      - ./config:/etc/multiotp:rw
    ports:
      - "8080:80"
    environment:
      - MULTIOTP_DB_PATH=/var/lib/multiotp
    restart: unless-stopped

Важно для SQLite в Docker:

  • Не используйте overlay2 без :rw и правильного chown.
  • Избегайте NFS/SMB для хранения SQLite (блокировки файлов работают некорректно).
  • Добавьте PRAGMA journal_mode=WAL; в multiotp.ini, если наблюдаются database is locked.

7. Проверка работоспособности

# Проверка доступа к БД
sudo php /opt/multiotp/multiotp.php -check-db

# Тестовый запрос токена
sudo php /opt/multiotp/multiotp.php -check username testuser token 123456

В веб-интерфейсе: Dashboard → System Status → Database должен показывать OK.


8. Типовые ошибки и решения

Ошибка Причина Решение
SQLITE_CANTOPEN Путь не существует или нет прав mkdir -p, chown/chmod, проверить SELinux
Permission denied Веб-сервер не имеет доступа Смените владельца на www-data/apache, проверьте umask
database is locked Конкурентный доступ, journal mode, NFS Перейдите на WAL, убедитесь в локальном диске, остановите фоновые бэкапы
Invalid configuration after restart Путь указан с / в конце или пробелы Уберите trailing slash: db_path=/opt/data, не db_path=/opt/data/
Пустая БД после миграции Не скопированы -wal/-shm файлы Используйте cp -a или rsync -a, проверьте целостность через .check-db

9. Резервное копирование

SQLite можно копировать "на лету", но безопаснее:

Онлайн-бэкап (рекомендуется):

sudo php /opt/multiotp/multiotp.php -backup-db /backup/multiotp_$(date +%F).sql

Или оффлайн-копия (при остановленном сервисе):

sudo cp -a /opt/multiotp/data/multiotp.db* /backup/

Восстановление:

sudo php /opt/multiotp/multiotp.php -restore-db /backup/multiotp_2024-05-20.sql

10. Полезные ссылки

  • Официальная документация: github.com/multiOTP/multiotp/wiki/
  • GitHub репозиторий: github.com/multiOTP/multiotp
  • SQLite + PHP best practices: php.net/manual/en/book.sqlite3.php

Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.