Vaultwarden: установка и базовая настройка
Это руководство покажет, как установить менеджер паролей Vaultwarden на виртуальный сервер (VPS). Vaultwarden — это легковесная, но полнофункциональная замена Bitwarden для тех, кто хочет самостоятельно управлять своими паролями и избавиться от небезопасных методов хранения паролей вроде: стикеры на мониторе или использовать один пароль для всех сервисов (что очень плохая идея).
Также Vaultwarden совместим с мобильными приложениями, браузерными расширениями и десктопными приложениями Bitwarden. Благодаря этому можно получить доступ к паролям с различных устройств и операционных систем.
Для установки потребуется около 1-1.5 часа времени при бюджете от 300 рублей в месяц.
Содержание статьи
Что нужно для работы Vaultwarden?
Для работы Vaultwarden потребуется:
- VPS для хранения зашифрованных паролей, вложений;
- Доменное имя для доступа к серверу.
Минимальная конфигурация VPS:
- 1 CPU;
- 1 ГБ оперативной памяти (RAM);
- 10–15 ГБ SSD-диска;
- Дистрибутив Linux: Ubuntu 24.04.
Для размещения Vaultwarden рекомендую следующих провайдеров:
- Timeweb Cloud с тарифом Cloud 15 за 300 рублей в месяц (поддержите блог, приобретая VPS по моей реферальной ссылке);
- SpaceWeb с тарифом Cloud Promo за 329 рублей в месяц.
Конфигурации тарифов будет достаточно для работы Vaultwarden с небольшим количеством пользователей.
Также понадобится доменное имя. Необходимо для доступа к Vaultwarden через:
- Браузер;
- Мобильное приложение Bitwarden;
- Десктоп-приложение Bitwarden.
Те же провайдеры (Timeweb, SpaceWeb) предлагают домены в зоне .ru от 175 рублей/год.
После приобретения домена нужно будет настроить A-записи в настройках DNS (инструкция по настройке А-записей в Timeweb):
- Хост
example.ru
→ IP вашего VPS; - Хост
www.example.ru
→ IP вашего VPS.
Примечание: Если хотите разместить Vaultwarden на поддомене, например, на vault.example.ru, то укажите поддомен в А-записях.
A-записи связывают домен с IP-адресом сервера, где будет размещен Vaultwarden.
Примечание: Полный доступ появится в течение 24 часов — это время необходимо для распространения A-записей по DNS-серверам интернет-провайдеров.
Наличие А-записей у вашего интернет-провайдера можно проверить командами:
- Windows (PowerShell):
Resolve-DnsName -Name tutorial.mukminov.dev
Замените tutorial.mukminov.dev на свой домен (поддомен).
Пример вывода:
Name Type TTL Section IPAddress
---- ---- --- ------- ---------
tutorial.mukminov.dev A 600 Answer 77.222.55.183
Поддомен tutorial.mukminov.dev имеет ip-адрес 77.222.55.183
- Linux (терминал):
dig +short tutorial.mukminov.dev A
Пример вывода:
77.222.55.183
Подготовка VPS
Для подключения к серверу по протоколу SSH можно использовать Windows PowerShell. Найти программу можно в меню «Пуск» в Windows. Также можно использовать терминал в Linux.
Для подключения к серверу по SSH можно использовать одну из команд:
ssh root@77.222.55.183 # подключится к серверу можно по ip-адресу
ssh root@tutorial.mukminov.dev # или использовать домен (поддомен)
В процессе подключения может потребоваться подтверждение: Yes
→ Enter
После подключения к серверу необходимо создать нового пользователя "vaultwarden":
adduser --gecos "" vaultwarden
Выбор имени пользователя не важен — подойдет любое. Система попросит задать пароль для нового пользователя, рекомендую использовать минимум 20 символов в пароле, который бы содержал буквы в разных регистрах, цифры, спецсимволы.
usermod -aG sudo vaultwarden
Предоставляем пользователю права администратора через sudo.
su - vaultwarden
Переключаемся с пользователя root на vaultwarden.
sudo apt update && sudo apt upgrade -y
Проверяем список доступных пакетов из репозиториев и обновляем установленные пакеты.
Установка Docker, Nginx и Certbot
Установка Nginx и Cerbot
Установим Nginx в качестве веб-сервера и reverse proxy, а также Certbot для автоматического получения и обновления SSL-сертификатов от Let's Encrypt. Это обеспечит безопасное HTTPS-соединение с сервером.
sudo apt install -y nginx certbot python3-certbot-nginx
Настроим фаервол. Разрешим порты для подключения по SSH, HTTP, HTTPS:
sudo ufw allow 'Nginx Full' # Порт 80 (HTTP) и 443 (HTTPS)
sudo ufw allow 'OpenSSH' # Порт 22
После этого необходимо активировать фаервол (с подтверждением активации):
echo "y" | sudo ufw enable
Чтобы убедиться, что правила применены воспользуемся командой:
sudo ufw status
Пример корректного вывода:
Status: active
To Action From
-- ------ ----
Nginx Full ALLOW Anywhere
OpenSSH ALLOW Anywhere
Nginx Full (v6) ALLOW Anywhere (v6)
OpenSSH (v6) ALLOW Anywhere (v6)
Выпустим SSL-сертификат для нашего домена для подключения к серверу по HTTPS.
Подготовим папку для Cerbot на сервере:
sudo mkdir -p /var/www/certbot
sudo chown $USER:$USER /var/www/certbot # Полные права для текущего пользователя
sudo chmod 755 /var/www/certbot # Безопасные права доступа
Certbot будет временно размещать в этой папке проверочные файлы при получении/продлении SSL-сертификатов.
Создадим базовый файл конфигурации Nginx:
sudo nano /etc/nginx/sites-available/tutorial.mukminov.dev.conf
Разместим в нем следующую конфигурацию:
server {
listen 80;
server_name www.tutorial.mukminov.dev tutorial.mukminov.dev;
location ^~ /.well-known/acme-challenge/ {
root /var/www/certbot;
default_type "text/plain";
}
location / {
return 301 https://tutorial.mukminov.dev$request_uri;
}
}
Для сохранения изменений нажмите Ctrl
+X
, затем Y
→ Enter
После сохранения файла активируем конфигурацию путем создания симлинка:
sudo ln -s /etc/nginx/sites-available/tutorial.mukminov.dev.conf /etc/nginx/sites-enabled/
Проверяем и применяем конфигурацию:
# Проверка синтаксиса конфигурации
sudo nginx -t
# Если проверка прошла успешно - перезапускаем Nginx, чтобы конфигурация применилась
sudo systemctl reload nginx
Получаем SSL-сертификаты для доменов tutorial.mukminov.dev и www.tutorial.mukminov.dev:
sudo certbot certonly --webroot -w /var/www/certbot -d tutorial.mukminov.dev -d www.tutorial.mukminov.dev --email your@email.ru --agree-tos --no-eff-email
Вместо your@email.ru укажите ваш e-mail. Также замените tutorial.mukminov.dev на свой домен (поддомен).
Выполняем тестовый запуск процесса обновления SSL-сертификатов:
sudo certbot renew --dry-run
Убеждаемся, что тестовый запуск завершится успешно. SSL-сертификаты обновились.
Открываем снова базовый файл конфигурации Nginx и корректируем его, чтобы он выглядил так:
upstream vaultwarden {
zone vaultwarden 64k;
server 127.0.0.1:8080;
keepalive 3;
}
map $http_upgrade $connection_upgrade {
default upgrade;
'' "";
}
map $request_uri $loggable {
~*/notifications/hub.* 0;
~*/notifications/anonymous-hub.* 0;
default 1;
}
server {
listen 80;
server_name www.tutorial.mukminov.dev tutorial.mukminov.dev;
location ^~ /.well-known/acme-challenge/ {
root /var/www/certbot;
default_type "text/plain";
}
location / {
return 301 https://tutorial.mukminov.dev$request_uri;
}
}
server {
listen 443 ssl http2;
server_name www.tutorial.mukminov.dev;
ssl_certificate /etc/letsencrypt/live/tutorial.mukminov.dev/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/tutorial.mukminov.dev/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/tutorial.mukminov.dev/fullchain.pem;
return 301 https://tutorial.mukminov.dev$request_uri;
}
server {
listen 443 ssl http2;
server_name tutorial.mukminov.dev;
ssl_certificate /etc/letsencrypt/live/tutorial.mukminov.dev/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/tutorial.mukminov.dev/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/tutorial.mukminov.dev/fullchain.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 512M;
access_log /var/log/nginx/vaultwarden.log combined if=$loggable;
error_log /var/log/nginx/vaultwarden-errors.log;
location / {
proxy_pass http://vaultwarden;
}
}
Вместо tutorial.mukminov.dev необходимо везде указать свой домен (поддомен).
Снова проверяем и применяем конфигурацию:
sudo nginx -t && sudo systemctl reload nginx
На этом этапе была произведена установка и настройка Nginx в качестве веб-сервера, и reverse proxy. Также получили и установили SSL-сертификат для подключения к серверу по HTTPS.
Установка Docker
Устанановим Docker c помощью официального скрипта с сайта Docker:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh ./get-docker.sh
Чтобы проверить, что установка прошла успешно нужно выполнить команду:
sudo docker run hello-world
Ожидаемый вывод:
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
Установка и настройка Vaultwarden
Для установки Valutwarden скачиваем образ с помощью команды:
sudo docker pull vaultwarden/server:latest
Подготавливаем папку где будут храниться зашифрованные пароли, вложения:
sudo mkdir -p /srv/vaultwarden # создаем директорию
sudo chmod 700 /srv/vaultwarden # устанавливаем безопасные права
Запускаем контейнер Valutwarden:
sudo docker run -d --name vaultwarden -v /srv/vaultwarden:/data -e DOMAIN="https://tutorial.mukminov.dev" -p 127.0.0.1:8080:80 --restart always vaultwarden/server:latest
Для переменной DOMAIN необходимо указать свой домен (поддомен).
Введите ваш домен в браузере и у вас должна открыться главная страница Vaultwarden.
Для защиты от возможных злоупотреблений менеджером паролей со стороны третьих лиц после создания аккаунта следует:
- Закрыть регистрацию для новых пользователей;
- Отключить функцию приглашений новых пользователей по электронной почте.
Для этого останавливаем и удаляем наш контейнер (данные в папке /srv/vaultwarden
сохраняются):
sudo docker stop vaultwarden # останавливаем контейнер
sudo docker rm vaultwarden # удаляем контейнер
Запускаем контейнер заново, но уже с переменными SIGNUPS_ALLOWED
, INVITATIONS_ALLOWED
со значением false
:
sudo docker run -d --name vaultwarden -v /srv/vaultwarden:/data -e DOMAIN="https://tutorial.mukminov.dev" -e SIGNUPS_ALLOWED=false -e INVITATIONS_ALLOWED=false -p 127.0.0.1:8080:80 --restart always vaultwarden/server:latest
Проверяем, что кнопка «Создать аккаунт» пропала на главной странице:
Для подключения к собственному менеджеру паролей через браузерное расширение Bitwarden (включая мобильное приложение) необходимо выбрать пункт «Собственный хостинг» и указать свой домен. После этого появится сообщение: «URL окружения сохранены» и доступ осуществляется через «Собственный хостинг».
Настройка браузерного расширения Bitwarden для подключения к Vaultwarden.
Поздравляю!
Вы успешно установили собственный менеджер паролей Vaultwarden на VPS. Теперь у вас есть:
- 🔒 Безопасное хранилище паролей с шифрованием;
- 🌐 Доступ с любых устройств через ваш домен;
- 🛡️ Защита HTTPS и автоматическое обновление сертификатов.
🚀 Ваши пароли теперь под полным вашим контролем!
Если возникнут вопросы — пишите в комментарии в Telegram.