
Vaultwarden — это легковесная альтернатива Bitwarden, написанная на Rust. Она предоставляет полную совместимость с клиентами Bitwarden, но требует значительно меньше ресурсов и может быть развернута на собственном сервере.
- Высокая производительность. Написан на Rust, потребляет минимум ресурсов (10-50MB RAM)
- Полная совместимость. Работает со всеми клиентами Bitwarden (браузеры, мобильные приложения)
- Собственный сервер. Полный контроль над данными, нет зависимости от внешних сервисов.
- Простая настройка. Развертывание в Docker за несколько минут.
Установка и базовая настройка
Шаг 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
openssl rand -base64 48
. Без этого ключа любой сможет получить доступ к админ-панели.Шаг 2: Создание необходимых директорий
Создайте директории для данных и логов:
# Создание директорий
mkdir -p vw-data vw-logs
# Установка правильных прав
chmod 700 vw-data
chmod 755 vw-logs
# Запуск контейнера
docker-compose up -d
Шаг 3: Первоначальная настройка
После запуска контейнера выполните следующие шаги:
- Откройте админ-панель:
https://your-domain/admin
- Введите ADMIN_TOKEN для входа
- Создайте первого пользователя через админ-панель
- Настройте SMTP для отправки уведомлений
- Отключите регистрацию если не нужна
Интеграция с 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
После настройки сервера нужно настроить клиенты для работы с вашим сервером:
📱 Настройка мобильных приложений:
- Откройте приложение Bitwarden
- Перейдите в Settings → Server
- Введите URL вашего сервера:
https://vault.example.com
- Сохраните настройки и войдите в аккаунт
🌐 Настройка браузерных расширений:
- Откройте расширение Bitwarden
- Нажмите на иконку настроек
- Выберите «Self-hosted environment»
- Введите 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 "Мониторинг завершен успешно"