Подробный гайд: настройка 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: Через веб-интерфейс (рекомендуется для новичков)
- Авторизуйтесь в админ-панели MultiOTP.
- Перейдите в
Configuration→ вкладкаDatabase. - В поле
DB Pathукажите абсолютный путь к директории, например:/var/lib/multiotpили/opt/multiotp/data. - Нажмите
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
- Остановите сервис (веб-сервер или
multiotpsystemd-сервис, если используется CLI-демон).
2. Скопируйте файлы:
sudo cp -a /старый/путь/multiotp.db* /новый/путь/
- Обновите
db_pathв конфиге или через CLI/WebUI. - Проверьте права (см. раздел 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
Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.