В этой статье описывается установка сервера хранения паролей и секретов Vaultwarden в Docker на собственном сервере. Из особенностей, я использую базу данных MariaDB и обратный прокси сервер Caddy. Для поднятия контейнеров использую Docker compose.
🕒 3 мин.
Установка Vaultwarden
У вас в системе уже должен быть установлен Docker и Docker compose, как это устанавливается я описывал в статьях:
- Первое знакомство с Docker — установка и базовые понятия.
- Docker Compose — установка и базовое использование.
Во-первых, создадим каталог для нашего проекта:
$ mkdir -p vaultwarden/data && \ cd vaultwarden && \ chmod 700 data && \ sudo chown root:root data/
В нём создадим файл с переменными окружениями .env. Он будет использоваться для настройки контейнеров. Вот его содержимое:
# === Основное === DOMAIN=https://ваш_домен/ ROCKET_PORT=8080 ROCKET_ADDRESS=0.0.0.0 # внутри контейнера будем слушать не только localhost WEBSOCKET_ENABLED=true # включаем для клиентов # === Безопасность === ADMIN_TOKEN='токен' SIGNUPS_ALLOWED=true # для создания первого пользователя, после поменять на false INVITATIONS_ALLOWED=true SHOW_PASSWORD_HINT=false # === Логи === LOG_LEVEL=warn EXTENDED_LOGGING=false # === Вложения === ATTACHMENTS_ALLOWED=true ATTACHMENTS_LIMIT_MB=50 # === База данных (SQLite по умолчанию) === # DATABASE_URL не указываем → будет /data/db.sqlite3 DATABASE_URL=mysql://vaultwarden:12345678@db:3306/vaultwarden MYSQL_ROOT_PASSWORD=12345678 MYSQL_DATABASE=vaultwarden MYSQL_USER=vaultwarden MYSQL_PASSWORD=12345678
- Обратите внимание:
- Подставьте ваш домен.
- Сгенерируйте токен:
sudo docker run --rm -it vaultwarden/server /vaultwarden hash. Токен нужно вставить в одинарные кавычки, для экранирования. - Я буду использовать базу данных MySQL. Если хотите оставить SQLite, то закомментируйте все поля в секции ===База данных===.
- Измените пароли для базы данных на более сложные. В примере я использую:
12345678.
Создадим docker-compose.yml:
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
env_file:
- .env
volumes:
- ./data:/data:rw
depends_on:
- db
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
caddy:
image: caddy:latest
container_name: caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- ./tls:/etc/caddy/tls:ro
- caddy_data:/data
- caddy_config:/config
depends_on:
- vaultwarden
db:
image: mariadb:11
container_name: vaultwarden-db
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- vault_db:/var/lib/mysql
command: >
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
healthcheck:
test: ["CMD-SHELL", "mariadb -uroot -p$$MYSQL_ROOT_PASSWORD -e 'SELECT 1'"]
interval: 10s
timeout: 5s
retries: 5
volumes:
caddy_data:
caddy_config:
vault_db:
- Я создаю три сервиса:
- vaultwarden — сервер для хранения паролей и других секретов;
- caddy — обратный прокси сервер;
- db — база данных mariadb.
- Если вы используете SQLite, то закомментируйте секцию dp.
- Некоторые опции разберу:
restart: unless-stopped— контейнер будет автоматически перезапускаться, если упадёт.env_file: - .env— мы указываем для сервисаvaultwarden, чтобы переменные попали в контейнер без передачи их в виде${ПЕРЕМЕННАЯ}.security_opt: - no-new-privileges:true— опция безопасности, запрещает повышение прав в контейнере (защита от setuid бинарников в контейнере).cap_drop: - ALL— убирает все дополнительные привилегии (capabilities) у контейнера.command: > --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci— устанавливает кодировку для MariaDB и правила сравнения строк (collation).
Подготовка Caddy
Создадим Caddyfile — это конфиг для Caddy:
{
# Отключаем автоматический HTTPS (Let's Encrypt), так как используем свой сертификат
auto_https off
}
https://ваш_домен {
tls /etc/caddy/tls/cert.pem /etc/caddy/tls/key.pem
reverse_proxy vaultwarden:8080
}
- Обратите внимание:
- Подставьте ваш домен.
- Я использую самоподписанный сертификат для упрощения статьи. Для рабочего сервера лучше использовать сертификаты от Let’s Encrypt.
Создадим самоподписанный сертификат:
$ mkdir tls/ $ openssl genrsa -out tls/key.pem 2048 $ openssl req -new -x509 -sha256 \ -key tls/key.pem \ -out tls/cert.pem \ -days 3650 \ -subj "/CN=ваш_домен" -addext "subjectAltName = DNS:ваш_домен"
- Подставьте ваш домен.
Пришло время запустить наши сервисы:
$ sudo docker compose up --build -d [+] up 7/7 ✔ Network vaultwarden_default Created 0.0s ✔ Volume vaultwarden_caddy_config Created 0.0s ✔ Volume vaultwarden_vault_db Created 0.0s ✔ Volume vaultwarden_caddy_data Created 0.0s ✔ Container vaultwarden-db Started 0.6s ✔ Container vaultwarden Started 0.9s ✔ Container caddy Started 1.5s
Создание пользователей
Откроем только что созданный Vaultwarden в браузере: https://ваш_домен/. Так как у нас самоподписанный сертификат, придётся подтвердить переход на сайт.

Регистрируемся, нажав: Создать аккаунт.
Здесь нужно будет ввести:
- свой email,
- имя,
- и придумать пароль.
Таким образом можно будет сделать нескольких пользователей.
После создания всех необходимым пользователей, уберём возможность регистрации новых. Для этого опять правим файл .env:
SIGNUPS_ALLOWED=false
Затем перезапустим все сервисы:
$ sudo docker compose down $ sudo docker compose up --build -d
Если понравилась статья, подпишись на мой канал в VK или Telegram.