mirror of
https://gitverse.ru/kpa39l/vwar.nixg.ru.git
synced 2026-09-29 09:55:06 +00:00
initial commit
This commit is contained in:
@@ -0,0 +1,4 @@
|
|||||||
|
data
|
||||||
|
backups
|
||||||
|
|
||||||
|
|
||||||
@@ -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 базы данных
|
||||||
|
```
|
||||||
@@ -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 завершено!"
|
||||||
@@ -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<KYczQ5V
|
||||||
|
networks:
|
||||||
|
- proxy
|
||||||
|
labels:
|
||||||
|
caddy: vwar.nixg.ru
|
||||||
|
caddy.reverse_proxy: "{{upstreams 80}}"
|
||||||
|
networks:
|
||||||
|
proxy:
|
||||||
|
external: true
|
||||||
Reference in New Issue
Block a user