Установка Vaultwarden в Docker

В этой статье описывается установка сервера хранения паролей и секретов Vaultwarden в Docker на собственном сервере. Из особенностей, я использую базу данных MariaDB и обратный прокси сервер Caddy. Для поднятия контейнеров использую Docker compose.

🕒 3 мин.

Установка Vaultwarden

У вас в системе уже должен быть установлен 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.

Мы используем cookie-файлы для наилучшего представления нашего сайта. Продолжая использовать этот сайт, вы соглашаетесь с использованием cookie-файлов.
Принять
Отказаться
Политика конфиденциальности