Предыстория Link to heading
Давно уже не помню пароли для своих сервисов. И помог мне в этом освобождении памяти — Bitwarden. Битводен – это многофункциональный с открытым исходным кодом, менеджер паролей.
Из плюсов этого решения:
кроссплатформенность: МакОсь, Виндовс, Линукс, айОС, Андройд, екстешены для браузеров, и даже консольный клиент
2х факторка и для него и внутри можно TOTP хранить
автозаполнение форм
генерация паролей по правилам
шаринг паролей
сохранение данный платежных карт
не тошнит от интерфейса клиента
Создание базового аккаунта битводен является бесплатным на их серверах и даже за подписку можно больше фич, но можно самостоятельно разместить и свой сервер, но официальный сервер говорят подтормаживает, да и еще надо вагонить майкрософт эс ку эль сервер, да и не будет всех “платных” фич. Да и времена сейчас такие, что лучше иметь все свое и при себе.
Поэтому навел резкость, своих прекрасных глаз на такое решение как vaultwarden
Ваултводен — ранее известный как “Bitwarden_RS”, написан на языке Rust и использует Sqlite в качестве базы данных. и обрантно совместим с Bitwarden API.
Как будем разворачивать ? Link to heading
Нам нужно:
- Домен, чтобы был SSl
- Сервер (свой или VPS)
- Docker с docker-compose
- Caddy
Что такое випиэска и докеры\шмокеры знает почти каждый, немного расскажу про кэдди.
Очень часто, в последнее время, все больше использую его для простой раздачи статики или для проксирования. Очень лаконичные конфиги получаются и SSL делается в разы проще и автоматически. Честно для дома для семьи почти заменил энджинкс.
Настраиваем домен Link to heading
На вашем операторе доменных имен добавляете A запись для вашего домена, которая ведет на ваш сервер.
Ставим docker-compose Link to heading
Ставим, если еще нет. На убунту делается так:
apt install docker.io docker-compose
Создаем docker-compose.yml файл Link to heading
Делаем стильно, модно и микросервисно. Поднимаем ваултводен сразу вместе с кэдди.
Создаем docker-compose.yml в удобном вам месте в любимом вашем текстовом редакторе с таким содержимым:
version: "3"
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: always
volumes:
- /etc/localtime:/etc/localtime:ro
- /srv/vaultwarden:/data
caddy:
image: caddy:2
container_name: caddy
restart: always
ports:
- 80:80
- 443:443
volumes:
- /srv/caddy/Caddyfile:/etc/caddy/Caddyfile:ro
- /srv/caddy/config:/config
- /srv/caddy/data:/data
- /srv/caddy/logs:/logs
environment:
DOMAIN: "<yourdomain>"
EMAIL: "<youremail>"
LOG_FILE: /srv/caddy/logs/access.log
Где DOMAIN и EMAIL вам надо заполнить, для выпуска сертификата. Указываем например так:
DOMAIN: "notbitwarden.tatar.beaver"
EMAIL: "noreplay@tatar.beaver"
Немного поясню Link to heading
Первый сервис, это и есть “vaultwarden”, он основан на последнем образе vaultwarden/server. Имя ему не будем выдумывать и наречем его — vaultwarden. Также назначим ему рестарт - всегда.
Также определили два монтирования (bind mounts):
первый из этих файлов – /etc/localtime: это для проверки часового пояса и времени между контейнером и хостовой машиной
каталог /data внутри контейнера с /srv/vaultwarden на хосте нужен для хранения базы данных и прочих кешей с аттачментами. Да и бекапить удобнее будет.
Второй сервис это и есть сам кэдди. Из интересного для использования его в качестве реверс прокси и для работы его как ACME клиента для получения сертификата у Let’s Encrypt, мы также сопоставили порты 80 и 443 на хосте с теми же портами внутри контейнера. Тут мудрить не стал особо.
Мы определили четыре “монтирования”: с помощью первой мы привязали файл /etc/caddy/CaddyFile - это основной конфиг. Остальное - “системное” и логи.
Создаем Caddyfile Link to heading
Создаем папку:
sudo mkdir /srv/caddy
создаем Caddyfile в вашем любимом текстовом редакторе:
vim /srv/caddy/Caddyfile
с таким содержимым:
{$DOMAIN}:443 {
log {
output file {$LOG_FILE} {
roll_size 10MB
roll_keep 10
}
}
tls {$EMAIL}
reverse_proxy /notifications/hub vaultwarden:3012
reverse_proxy vaultwarden:80 {
header_up X-Real-IP {remote_host}
}
}
Немного поясню Link to heading
{$DOMAIN} и {$EMAIL} возмется из docker-compose.yml
Сделали логи цикличным и не очень большими и в правильное место их пишем в виде файла.
reverse_proxy. У него синтаксис простой:
reverse_proxy [чо][куда]:
— “Чо” используется для ограничения применения. Мы использовали путь, начинающийся со /: запрос будет обработан только при его совпадении.
“Куда” - это адрес, на который должен быть перенаправлен запрос. Т.е мы перенаправляем запросы с путем /notifications/hub в “vaultwarden” на порт 3012 (“vaultwarden” – это имя сервиса и имя хоста, которое мы определили в файле docker-compose.yml, а все остальное – в порт 80.
- header_up в нем мы ставим “{remote_host}” в “X-Real-IP”
Запускаем Link to heading
- в каталоге где у нас лежит docker-compose.yml выполняем:
sudo docker-compose up -d
- ждем
— проверяем что все работает, выполняем:
sudo docker ps
В ответе будут наши контейнерны с именами: caddy и vaultwarden
Теперь открываем в браузере домен который вы указали ранее и выполняем регистрацию новой учетной записи. В клиентах битводен для ваших ОС указываем его как URL для self-hosted системы.