commit d1f8a3344c370430e13278636d949de507dd8d0c Author: Storozhenko Evgeny Vladimirovich Date: Fri Jun 26 22:41:13 2026 +0300 initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4b157ef --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +data +backups + + diff --git a/backup.md b/backup.md new file mode 100644 index 0000000..4421757 --- /dev/null +++ b/backup.md @@ -0,0 +1,146 @@ +```markdown +# Резервное копирование Vaultwarden + +## Скрипт backup.sh + +```bash +#!/bin/bash +# Скрипт резервного копирования Vaultwarden с отправкой на Яндекс.Диск + +BACKUP_DIR="/opt/vw/backups" +YADISK_MOUNT="/mnt/yandex-disk" +DATE=$(date +%Y%m%d_%H%M%S) +COMPOSE_DIR="/opt/vw" +CONTAINER_NAME="vaultwarden" +ARCHIVE_NAME="vw_backup_${DATE}.tar.gz" + +mkdir -p "${BACKUP_DIR}" + +echo "[${DATE}] Начинаем резервное копирование Vaultwarden..." + +# Проверка монтирования Яндекс.Диска +if ! mountpoint -q "${YADISK_MOUNT}"; then + echo " ОШИБКА: Яндекс.Диск не примонтирован в ${YADISK_MOUNT}" + echo " Попробуйте: sudo mount ${YADISK_MOUNT}" + exit 1 +fi + +mkdir -p "${YADISK_MOUNT}/backup/vaultwarden-backups" 2>/dev/null +cd "${COMPOSE_DIR}" || exit 1 + +echo " -> Останавливаем контейнер для целостности базы данных..." +docker compose stop "${CONTAINER_NAME}" + +echo " -> Создаем архив всей директории проекта..." +tar -czf "${BACKUP_DIR}/${ARCHIVE_NAME}" -C "${COMPOSE_DIR}" . + +echo " -> Запускаем контейнер..." +docker compose start "${CONTAINER_NAME}" + +if [ -s "${BACKUP_DIR}/${ARCHIVE_NAME}" ]; then + echo " Архив Vaultwarden: $(du -h "${BACKUP_DIR}/${ARCHIVE_NAME}" | cut -f1)" +else + echo " Ошибка создания архива!" + exit 1 +fi + +echo " Копирование на Яндекс.Диск..." +cp "${BACKUP_DIR}/${ARCHIVE_NAME}" "${YADISK_MOUNT}/backup/vaultwarden-backups/" + +echo " Очистка старых бэкапов..." +find "${BACKUP_DIR}" -type f -name "vw_backup_*.tar.gz" -mtime +7 -delete 2>/dev/null +find "${YADISK_MOUNT}/backup/vaultwarden-backups" -type f -name "vw_backup_*.tar.gz" -mtime +30 -delete 2>/dev/null + +echo "[${DATE}] Резервное копирование Vaultwarden завершено!" +``` + +## Инструкция по настройке монтирования Яндекс.Диска + +1. Установить davfs2: +```bash +sudo apt install davfs2 +``` + +2. Получить пароль приложения: +- Открыть https://id.yandex.ru/security +- В разделе "Пароли приложений" создать новый пароль с доступом к WebDAV + +3. Создать точку монтирования и группу: +```bash +sudo mkdir -p /mnt/yandex-disk +sudo groupadd davfs2 2>/dev/null || true +sudo usermod -aG davfs2 $USER +``` +Перелогиниться после добавления в группу. + +4. Настроить учетные данные: +```bash +sudo nano /etc/davfs2/secrets +``` +Добавить строку (заменить на свои данные): +``` +/mnt/yandex-disk login@yandex.ru пароль_приложения +``` +Установить права: +```bash +sudo chmod 600 /etc/davfs2/secrets +``` + +5. Добавить в /etc/fstab: +``` +https://webdav.yandex.ru /mnt/yandex-disk davfs _netdev,auto,rw,uid=1000,file_mode=600,dir_mode=700 0 0 +``` +Заменить uid=1000 на ваш UID (узнать через `id -u`). + +6. Смонтировать: +```bash +sudo mount /mnt/yandex-disk +``` + +Проверка: +```bash +mountpoint -q /mnt/yandex-disk && echo "OK" || echo "FAIL" +``` + +## Настройка регулярного резервного копирования + +Для автоматического запуска скрипта ежедневно в 03:00 используется cron. + +1. Открыть crontab для root: +```bash +sudo crontab -e +``` + +2. Добавить строку: +``` +0 3 * * * /opt/vw/backup.sh >> /var/log/vw-backup.log 2>&1 +``` + +Разбор строки: +- `0 3 * * *` - время запуска: 03:00 ежедневно +- `/opt/vw/backup.sh` - путь к скрипту +- `>> /var/log/vw-backup.log 2>&1` - перенаправление вывода в лог-файл (stdout и stderr) + +3. Сделать скрипт исполняемым: +```bash +sudo chmod +x /opt/vw/backup.sh +``` + +4. Проверить, что cron запущен: +```bash +sudo systemctl status cron +``` + +5. Проверить логи после первого запуска: +```bash +sudo tail -f /var/log/vw-backup.log +``` + +## Особенности + +- davfs2 работает медленно на множестве мелких файлов из-за особенностей WebDAV +- Для бэкапов это приемлемо, так как архив tar.gz представляет собой один файл +- При проблемах с монтированием проверить: `sudo mount -v /mnt/yandex-disk` +- Локальные бэкапы хранятся 7 дней, на Яндекс.Диске - 30 дней +- Контейнер останавливается на время создания архива для обеспечения целостности SQLite базы данных +``` diff --git a/backup.sh b/backup.sh new file mode 100755 index 0000000..0eaee4c --- /dev/null +++ b/backup.sh @@ -0,0 +1,55 @@ +#!/bin/bash +# Скрипт резервного копирования Vaultwarden с отправкой на Яндекс.Диск + +BACKUP_DIR="/opt/vw/backups" +YADISK_MOUNT="/mnt/yandex-disk/" +DATE=$(date +%Y%m%d_%H%M%S) +COMPOSE_DIR="/opt/vw" +CONTAINER_NAME="vaultwarden" +ARCHIVE_NAME="vw_backup_${DATE}.tar.gz" + +mkdir -p "${BACKUP_DIR}" + +echo "[${DATE}] Начинаем резервное копирование Vaultwarden..." + +# Проверка монтирования Яндекс.Диска +if ! mountpoint -q "${YADISK_MOUNT}"; then + echo " ОШИБКА: Яндекс.Диск не примонтирован в ${YADISK_MOUNT}" + echo " Попробуйте: sudo mount ${YADISK_MOUNT}" + exit 1 +fi + +mkdir -p "${YADISK_MOUNT}/backup/vaultwarden-backups" 2>/dev/null +cd "${COMPOSE_DIR}" || exit 1 + +echo " -> Останавливаем контейнер для целостности базы данных..." +docker compose stop "${CONTAINER_NAME}" + +#echo " -> Создаем архив данных..." +#FILES_TO_ARCHIVE="data docker-compose.yml" +#if [ -f ".env" ]; then +# FILES_TO_ARCHIVE="${FILES_TO_ARCHIVE} .env" +#fi +#tar -czf "${BACKUP_DIR}/${ARCHIVE_NAME}" -C "${COMPOSE_DIR}" ${FILES_TO_ARCHIVE} + +echo " -> Создаем архив всей директории проекта..." +tar -czf "${BACKUP_DIR}/${ARCHIVE_NAME}" -C "${COMPOSE_DIR}" . + +echo " -> Запускаем контейнер..." +docker compose start "${CONTAINER_NAME}" + +if [ -s "${BACKUP_DIR}/${ARCHIVE_NAME}" ]; then + echo " Архив Vaultwarden: $(du -h "${BACKUP_DIR}/${ARCHIVE_NAME}" | cut -f1)" +else + echo " Ошибка создания архива!" + exit 1 +fi + +echo " Копирование на Яндекс.Диск..." +cp "${BACKUP_DIR}/${ARCHIVE_NAME}" "${YADISK_MOUNT}/backup/vaultwarden-backups/" + +echo " Очистка старых бэкапов..." +find "${BACKUP_DIR}" -type f -name "vw_backup_*.tar.gz" -mtime +7 -delete 2>/dev/null +find "${YADISK_MOUNT}/backup/vaultwarden-backups" -type f -name "vw_backup_*.tar.gz" -mtime +30 -delete 2>/dev/null + +echo "[${DATE}] Резервное копирование Vaultwarden завершено!" diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..2b785ed --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,25 @@ +services: + vaultwarden: + image: vaultwarden/server:latest + container_name: vaultwarden + restart: unless-stopped + volumes: + - ./data:/data + environment: +# - SIGNUPS_ALLOWED=true + - DOMAIN=https://vwar.nixg.ru + - TZ=Europe/Moscow + - SMTP_HOST=smtp.jino.ru + - SMTP_FROM=vw@nixg.ru + - SMTP_SECURITY=starttls + - SMTP_PORT=587 + - SMTP_USERNAME=vw@nixg.ru + - SMTP_PASSWORD=qQhY