Перейти к содержимому
Главная страница » Vaultwarden в Docker: собственный менеджер паролей

Vaultwarden в Docker: собственный менеджер паролей

Vaultwarden — это легковесная альтернатива Bitwarden, написанная на Rust. Она предоставляет полную совместимость с клиентами Bitwarden, но требует значительно меньше ресурсов и может быть развернута на собственном сервере.

Vaultwarden (ранее Bitwarden_rs) — это неофициальная реализация сервера Bitwarden, написанная на Rust. Основные преимущества:
  • Высокая производительность. Написан на Rust, потребляет минимум ресурсов (10-50MB RAM)
  • Полная совместимость. Работает со всеми клиентами Bitwarden (браузеры, мобильные приложения)
  • Собственный сервер. Полный контроль над данными, нет зависимости от внешних сервисов.
  • Простая настройка. Развертывание в Docker за несколько минут.
Интересный факт: Vaultwarden использует в 10-20 раз меньше ресурсов по сравнению с официальным сервером Bitwarden, что делает его идеальным для домашних серверов и небольших VPS.

Установка и базовая настройка

Шаг 1: Создание Docker Compose файла

Создайте файл docker-compose.yml для Vaultwarden. Я объясню каждый параметр:

version: '3.8'

services:
  vaultwarden:
    # Использую официальный образ Vaultwarden
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: unless-stopped
    
    # Порты для доступа
    ports:
      - "8080:80" # HTTP порт
      - "3012:3012" # WebSocket для уведомлений
    
    # Тома для данных
    volumes:
      # Основные данные Vaultwarden
      - ./vw-data:/data
      # Логи для отладки
      - ./vw-logs:/var/log/vaultwarden
    
    # Переменные окружения
    environment:
      # ВАЖНО: Смените этот ключ на случайный!
      # Используйте: openssl rand -base64 48
      - ADMIN_TOKEN=your-admin-token-here
      
      # Домен вашего сервера
      - DOMAIN=https://vault.example.com
      
      # Настройки безопасности
      - SIGNUPS_ALLOWED=false # Отключить регистрацию
      - INVITATIONS_ALLOWED=true # Разрешить приглашения
      
      # Настройки SMTP для уведомлений
      - SMTP_HOST=smtp.gmail.com
      - SMTP_FROM=vault@example.com
      - SMTP_PORT=587
      - SMTP_SECURITY=starttls
      - SMTP_USERNAME=your-email@gmail.com
      - SMTP_PASSWORD=your-app-password
      
      # Дополнительные настройки
      - WEBSOCKET_ENABLED=true
      - WEBSOCKET_ADDRESS=0.0.0.0
      - WEBSOCKET_PORT=3012
      - LOG_LEVEL=warn
      - EXTENDED_LOGGING=true
Критически важно: Обязательно смените ADMIN_TOKEN на случайный ключ! Используйте команду: openssl rand -base64 48. Без этого ключа любой сможет получить доступ к админ-панели.

Шаг 2: Создание необходимых директорий

Создайте директории для данных и логов:

# Создание директорий
mkdir -p vw-data vw-logs

# Установка правильных прав
chmod 700 vw-data
chmod 755 vw-logs

# Запуск контейнера
docker-compose up -d

Шаг 3: Первоначальная настройка

После запуска контейнера выполните следующие шаги:

  1. Откройте админ-панель: https://your-domain/admin
  2. Введите ADMIN_TOKEN для входа
  3. Создайте первого пользователя через админ-панель
  4. Настройте SMTP для отправки уведомлений
  5. Отключите регистрацию если не нужна
Мой опыт: Всегда создавайте первого пользователя через админ-панель, а не через регистрацию. Это дает больше контроля и позволяет настроить права доступа.

Интеграция с Traefik и SSL

Настройка Traefik для Vaultwarden

Для продакшена я рекомендую использовать Traefik с автоматическим SSL. Вот полная конфигурация:

version: '3.8'

services:
  # Traefik reverse proxy
  traefik:
    image: traefik:v2.10
    container_name: traefik
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./traefik.yml:/traefik.yml:ro
      - ./acme.json:/acme.json
    command:
      - --api.dashboard=true
      - --api.insecure=true
      - --providers.docker=true
      - --providers.docker.exposedbydefault=false
      - --entrypoints.web.address=:80
      - --entrypoints.websecure.address=:443
      - --certificatesresolvers.myresolver.acme.tlschallenge=true
      - --certificatesresolvers.myresolver.acme.email=your-email@example.com
      - --certificatesresolvers.myresolver.acme.storage=/acme.json
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.dashboard.rule=Host(`traefik.example.com`)"
      - "traefik.http.routers.dashboard.entrypoints=websecure"
      - "traefik.http.routers.dashboard.tls.certresolver=myresolver"
      - "traefik.http.routers.dashboard.service=api@internal"

  # Vaultwarden
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: unless-stopped
    volumes:
      - ./vw-data:/data
      - ./vw-logs:/var/log/vaultwarden
    environment:
      - ADMIN_TOKEN=your-admin-token-here
      - DOMAIN=https://vault.example.com
      - SIGNUPS_ALLOWED=false
      - INVITATIONS_ALLOWED=true
      - WEBSOCKET_ENABLED=true
      - WEBSOCKET_ADDRESS=0.0.0.0
      - WEBSOCKET_PORT=3012
      # SMTP настройки
      - SMTP_HOST=smtp.gmail.com
      - SMTP_FROM=vault@example.com
      - SMTP_PORT=587
      - SMTP_SECURITY=starttls
      - SMTP_USERNAME=your-email@gmail.com
      - SMTP_PASSWORD=your-app-password
    labels:
      - "traefik.enable=true"
      # Основной веб-интерфейс
      - "traefik.http.routers.vaultwarden.rule=Host(`vault.example.com`)"
      - "traefik.http.routers.vaultwarden.entrypoints=websecure"
      - "traefik.http.routers.vaultwarden.tls.certresolver=myresolver"
      - "traefik.http.services.vaultwarden.loadbalancer.server.port=80"
      
      # WebSocket для уведомлений
      - "traefik.http.routers.vaultwarden-ws.rule=Host(`vault.example.com`) && Path(`/notifications/hub`)"
      - "traefik.http.routers.vaultwarden-ws.entrypoints=websecure"
      - "traefik.http.routers.vaultwarden-ws.tls.certresolver=myresolver"
      - "traefik.http.services.vaultwarden-ws.loadbalancer.server.port=3012"
      - "traefik.http.routers.vaultwarden-ws.service=api@internal"

Настройка клиентов Bitwarden

После настройки сервера нужно настроить клиенты для работы с вашим сервером:

📱 Настройка мобильных приложений:
  1. Откройте приложение Bitwarden
  2. Перейдите в Settings → Server
  3. Введите URL вашего сервера: https://vault.example.com
  4. Сохраните настройки и войдите в аккаунт
🌐 Настройка браузерных расширений:
  1. Откройте расширение Bitwarden
  2. Нажмите на иконку настроек
  3. Выберите «Self-hosted environment»
  4. Введите URL сервера и сохраните
Совет: После настройки всех клиентов обязательно протестируйте синхронизацию. Создайте тестовый пароль в одном клиенте и проверьте, что он появился в других.

Настройка резервного копирования

Автоматическое резервное копирование

Для защиты данных я рекомендую настроить автоматическое резервное копирование. Вот несколько подходов:

Вариант 1: Простой скрипт резервного копирования

Создайте скрипт backup-vaultwarden.sh:

#!/bin/bash

# Настройки
BACKUP_DIR="/backup/vaultwarden"
DATA_DIR="./vw-data"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="vaultwarden_backup_$DATE.tar.gz"

# Создание директории для бэкапов
mkdir -p $BACKUP_DIR

# Остановка контейнера для консистентного бэкапа
echo "Остановка Vaultwarden..."
docker-compose stop vaultwarden

# Создание архива
echo "Создание резервной копии..."
tar -czf "$BACKUP_DIR/$BACKUP_FILE" -C $DATA_DIR .

# Запуск контейнера
echo "Запуск Vaultwarden..."
docker-compose start vaultwarden

# Удаление старых бэкапов (старше 30 дней)
echo "Очистка старых бэкапов..."
find $BACKUP_DIR -name "vaultwarden_backup_*.tar.gz" -mtime +30 -delete

echo "Резервное копирование завершено: $BACKUP_FILE"

Вариант 2: Интеграция с Docker Compose

Добавьте сервис резервного копирования в ваш docker-compose.yml:

services:
  # ... существующие сервисы ...

  # Сервис резервного копирования
  backup:
    image: alpine:latest
    container_name: vaultwarden-backup
    volumes:
      - ./vw-data:/data:ro
      - ./backups:/backup
      - ./backup-script.sh:/backup-script.sh:ro
    command: /backup-script.sh
    depends_on:
      - vaultwarden
    # Запуск каждый день в 2:00
    restart: "no"

  # Cron для автоматического запуска
  cron:
    image: alpine:latest
    container_name: vaultwarden-cron
    volumes:
      - ./crontab:/etc/crontabs/root:ro
    command: crond -f -l 2
    restart: unless-stopped

Вариант 3: Интеграция с внешними сервисами

Для дополнительной безопасности я рекомендую загружать бэкапы в облако:

#!/bin/bash

# Настройки
BACKUP_DIR="/backup/vaultwarden"
RCLONE_CONFIG="/config/rclone.conf"
REMOTE_NAME="gdrive" # Имя удаленного хранилища в rclone
REMOTE_PATH="vaultwarden-backups"

# Создание резервной копии
./backup-vaultwarden.sh

# Загрузка в облако
echo "Загрузка в облако..."
rclone copy $BACKUP_DIR $REMOTE_NAME:$REMOTE_PATH --config $RCLONE_CONFIG

# Очистка локальных бэкапов (оставляем только последние 7 дней)
find $BACKUP_DIR -name "vaultwarden_backup_*.tar.gz" -mtime +7 -delete

echo "Резервное копирование в облако завершено"

 Мой опыт: Я использую комбинированный подход: ежедневные локальные бэкапы + еженедельная загрузка в облако. Это обеспечивает быстрый доступ к недавним бэкапам и защиту от потери сервера.

Безопасность и лучшие практики

Настройки безопасности

Для максимальной безопасности я рекомендую следующие настройки:

# Дополнительные переменные окружения для безопасности
environment:
  # Основные настройки
  - ADMIN_TOKEN=your-secure-admin-token
  - DOMAIN=https://vault.example.com
  
  # Безопасность
  - SIGNUPS_ALLOWED=false # Отключить публичную регистрацию
  - INVITATIONS_ALLOWED=true # Разрешить приглашения
  - SHOW_PASSWORD_HINT=false # Скрыть подсказки паролей
  - DISABLE_SIGNUP=false # Полностью отключить регистрацию
  
  # Настройки сессий
  - SESSION_TIMEOUT=28800 # 8 часов
  - SESSION_TIMEOUT_ACTION=lock # Блокировать вместо выхода
  
  # Дополнительные настройки
  - LOG_LEVEL=warn # Минимальное логирование
  - EXTENDED_LOGGING=false # Отключить расширенное логирование
  - DISABLE_ICON_DOWNLOAD=false # Разрешить загрузку иконок
  
  # Настройки базы данных
  - DATABASE_URL=/data/db.sqlite3
  - DATABASE_MAX_CONNS=10
  
  # Настройки SMTP
  - SMTP_HOST=smtp.gmail.com
  - SMTP_FROM=vault@example.com
  - SMTP_PORT=587
  - SMTP_SECURITY=starttls
  - SMTP_USERNAME=your-email@gmail.com
  - SMTP_PASSWORD=your-app-password
  - SMTP_TIMEOUT=15
  - SMTP_VERIFY_SSL=true

Настройка файрвола

Ограничьте доступ к серверу только необходимыми портами:

# Настройка UFW (Ubuntu Firewall)
# Разрешить SSH
sudo ufw allow 22/tcp

# Разрешить HTTP и HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# Запретить прямой доступ к Vaultwarden
sudo ufw deny 8080/tcp

# Включить файрвол
sudo ufw enable

# Проверить статус
sudo ufw status

Мониторинг и алерты

Настройте мониторинг для отслеживания состояния сервера:

Безопасность
  • Регулярно обновляйте образы
  • Используйте сильные пароли
  • Включите двухфакторную аутентификацию
  • Мониторьте логи на подозрительную активность
Производительность
  • Мониторьте использование ресурсов
  • Настройте алерты на недоступность
  • Проверяйте статус резервных копий
  • Отслеживайте размер базы данных

Скрипт мониторинга

Создайте простой скрипт для проверки состояния:

#!/bin/bash

# Скрипт мониторинга Vaultwarden
WEB_URL="https://vault.example.com"
ADMIN_URL="https://vault.example.com/admin"
EMAIL="admin@example.com"

# Проверка доступности веб-интерфейса
if ! curl -s -f $WEB_URL > /dev/null; then
  echo "Vaultwarden недоступен!" | mail -s "Vaultwarden Alert" $EMAIL
  exit 1
fi

# Проверка размера базы данных
DB_SIZE=$(du -h ./vw-data/db.sqlite3 | cut -f1)
echo "Размер базы данных: $DB_SIZE"

# Проверка последнего бэкапа
LAST_BACKUP=$(find ./backups -name "vaultwarden_backup_*.tar.gz" -printf '%T@ %p\n' | sort -n | tail -1 | cut -d' ' -f2)
if [ -z "$LAST_BACKUP" ]; then
  echo "Бэкапы не найдены!" | mail -s "Vaultwarden Backup Alert" $EMAIL
else
  BACKUP_AGE=$(($(date +%s) - $(stat -c %Y "$LAST_BACKUP")))
  if [ $BACKUP_AGE -gt 86400 ]; then # Более 24 часов
    echo "Последний бэкап старше 24 часов!" | mail -s "Vaultwarden Backup Alert" $EMAIL
  fi
fi

echo "Мониторинг завершен успешно"
Важно: Обязательно протестируйте восстановление из резервной копии! Создание бэкапов без проверки восстановления может привести к потере данных в критический момент.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *