Установка Vaultwarden через Docker Compose на Ubuntu
Vaultwarden — лёгкий self-hosted сервер, совместимый с клиентами Bitwarden. Он позволяет хранить пароли, защищённые заметки и другие данные на собственном сервере, при этом продолжая использовать привычные приложения и браузерные расширения Bitwarden.
Для постоянной установки удобнее всего использовать Docker Compose. Все данные Vaultwarden будут храниться отдельно от контейнера, поэтому обновление или пересоздание контейнера не приведёт к потере хранилища.
В этой инструкции используем структуру:
/opt/vaultwarden/
├── compose.yaml
├── .env
└── data/
Официальный проект рекомендует запускать Vaultwarden через его контейнерные образы. Web Vault требует HTTPS и безопасного контекста браузера, поэтому для постоянного использования Vaultwarden также рекомендуется размещать за reverse proxy или другим HTTPS-прокси.
Что понадобится
Перед установкой потребуется:
Ubuntu Server
Docker Engine
Docker Compose
доменное имя — желательно
HTTPS для Web Vault
Проверяем Docker:
docker --version
Проверяем Compose:
docker compose version
Проверяем, что Docker работает:
systemctl status docker
В нормальном состоянии:
active (running)
Если Docker ещё не установлен, сначала воспользуйтесь инструкцией AppsHome по установке Docker на Ubuntu.
Создаём каталог Vaultwarden
Создадим отдельный каталог приложения:
sudo mkdir -p /opt/vaultwarden/data
Переходим в него:
cd /opt/vaultwarden
Проверяем:
pwd
Должно быть:
/opt/vaultwarden
Создаём файл .env
Чтобы не хранить основные настройки непосредственно в Compose-файле, создадим:
sudo nano /opt/vaultwarden/.env
Добавляем:
DOMAIN=https://vault.example.com
SIGNUPS_ALLOWED=true
Замените:
vault.example.com
на собственный адрес Vaultwarden.
Например:
DOMAIN=https://vault.example.de
SIGNUPS_ALLOWED=true
Параметр:
SIGNUPS_ALLOWED=true
пока оставляем включённым, чтобы создать первый пользовательский аккаунт.
После первоначальной регистрации мы его отключим.
Vaultwarden поддерживает DOMAIN и SIGNUPS_ALLOWED как штатные параметры конфигурации; по умолчанию регистрация новых пользователей разрешена, поэтому для закрытого личного сервера после создания нужных аккаунтов её разумно отключить.
Создаём Docker Compose
Открываем:
sudo nano /opt/vaultwarden/compose.yaml
Добавляем:
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
environment:
DOMAIN: ${DOMAIN}
SIGNUPS_ALLOWED: ${SIGNUPS_ALLOWED}
volumes:
- ./data:/data
ports:
- "127.0.0.1:8080:80"
Официальный пример Vaultwarden также использует образ:
vaultwarden/server:latest
и сохраняет постоянные данные через каталог /data.
Почему используется 127.0.0.1
Обратите внимание на строку:
ports:
- "127.0.0.1:8080:80"
Это означает:
контейнер Vaultwarden
│
│ :80
↓
127.0.0.1:8080
Порт будет доступен только локально на самом сервере.
Из интернета он напрямую открыт не будет.
Для административного сервиса с паролями это намного безопаснее, чем:
ports:
- "8080:80"
которое публикует порт на всех сетевых интерфейсах.
Официальный пример Vaultwarden также показывает привязку контейнера к 127.0.0.1.
Проверяем Compose
Перед запуском:
cd /opt/vaultwarden
Выполняем:
docker compose config
Если ошибок нет, Docker покажет итоговую конфигурацию.
Особенно проверьте:
DOMAIN
SIGNUPS_ALLOWED
volume
port
Запускаем Vaultwarden
Теперь:
docker compose up -d
Docker скачает образ и создаст контейнер.
Проверяем:
docker compose ps
Должно появиться примерно:
NAME STATUS
vaultwarden Up
Можно также использовать:
docker ps
Проверяем журнал
Посмотрим последние сообщения:
docker logs --tail=50 vaultwarden
Следить за журналом:
docker logs -f vaultwarden
Для выхода:
Ctrl + C
Контейнер продолжит работать.
Проверяем Vaultwarden локально
Так как порт опубликован только на localhost:
curl -I http://127.0.0.1:8080
Если Vaultwarden запущен, сервер должен ответить HTTP-заголовками.
Можно также проверить:
curl http://127.0.0.1:8080/alive
Это позволяет убедиться, что контейнер работает ещё до настройки домена и HTTPS.
Почему нельзя просто использовать HTTP
Vaultwarden хранит крайне чувствительные данные, поэтому использовать его через обычный HTTP не следует.
Кроме того, Web Vault использует браузерный Web Crypto API и требует HTTPS / secure context. Сам проект прямо указывает, что для работы Web Vault HTTPS необходим.
То есть адрес вида:
http://192.168.1.100:8080
не должен использоваться как постоянный способ доступа.
Нормальная схема выглядит так:
Internet / LAN
│
│ HTTPS
↓
vault.example.com
│
Reverse Proxy
│
↓
127.0.0.1:8080
│
↓
Vaultwarden
В качестве внешнего слоя можно использовать:
Nginx
Caddy
Traefik
Cloudflare Tunnel
Tailscale + HTTPS
Если используется Cloudflare Tunnel
Vaultwarden можно вообще не публиковать наружу напрямую.
Например:
Пользователь
│
│ HTTPS
↓
Cloudflare
│
Cloudflare Tunnel
│
↓
Vaultwarden
Если cloudflared работает непосредственно на хосте, origin можно направить на:
http://127.0.0.1:8080
При этом публичный порт 8080 на сервере открывать не требуется.
Если cloudflared также работает в Docker, лучше подключить оба контейнера к общей Docker-сети и обращаться к Vaultwarden по имени контейнера.
Например:
cloudflared
│
Docker network
│
vaultwarden:80
В такой конфигурации секцию ports: у Vaultwarden можно вообще убрать.
Первый вход
После настройки HTTPS открываем:
https://vault.example.com
Появится Web Vault.
Создаём первый пользовательский аккаунт.
Используйте:
- уникальный email;
- длинный master password;
- двухфакторную авторизацию.
Особенно важно не потерять Master Password: именно он используется для защиты вашего хранилища.
Отключаем свободную регистрацию
Когда все необходимые пользователи созданы, снова открываем:
sudo nano /opt/vaultwarden/.env
Меняем:
SIGNUPS_ALLOWED=true
на:
SIGNUPS_ALLOWED=false
После изменения переменных окружения контейнер необходимо пересоздать:
cd /opt/vaultwarden
docker compose up -d
Проверяем:
docker compose config
Должно отображаться:
SIGNUPS_ALLOWED: "false"
Теперь посторонний пользователь не сможет просто зарегистрировать новый аккаунт на вашем сервере.
Где хранятся данные
В Compose указано:
volumes:
- ./data:/data
Следовательно все постоянные данные находятся здесь:
/opt/vaultwarden/data
Контейнер:
vaultwarden
можно удалить и создать заново.
Пока каталог:
/opt/vaultwarden/data
остаётся на месте, постоянные данные сохраняются.
Это одна из основных причин, почему мы не храним важные данные непосредственно внутри контейнера.
Что находится в data
После запуска можно посмотреть:
sudo ls -lah /opt/vaultwarden/data
Там появляются база данных и другие файлы Vaultwarden.
В обычной небольшой установке Vaultwarden по умолчанию может использовать SQLite, поэтому отдельный контейнер MariaDB или PostgreSQL для домашнего сервера обычно не требуется.
Для большинства личных инсталляций это делает Vaultwarden значительно проще Nextcloud или других более тяжёлых систем.
Административная страница Vaultwarden
Vaultwarden имеет отдельную административную панель:
https://vault.example.com/admin
Но по умолчанию она должна быть защищена специальным:
ADMIN_TOKEN
Если ADMIN_TOKEN вообще не настроен, административная страница отключена. Проект рекомендует использовать не простой текстовый пароль, а Argon2-хеш.
Для первой установки админ-панель можно вообще не включать.
Vaultwarden прекрасно работает без неё.
Если она понадобится, безопасный токен можно сгенерировать непосредственно Vaultwarden:
docker exec -it vaultwarden /vaultwarden hash
Команда попросит дважды ввести пароль и создаст Argon2-хеш.
При использовании хеша в Docker Compose нужно внимательно учитывать символы $: официальная конфигурация предупреждает, что в Compose их может потребоваться экранировать как $$.
Для начинающей установки AppsHome мы рекомендуем сначала оставить админ-панель выключенной, а её настройку разобрать отдельно.
Подключаем приложения Bitwarden
Одно из главных преимуществ Vaultwarden — совместимость с клиентами Bitwarden.
Можно использовать:
Bitwarden для Windows
Bitwarden для macOS
Bitwarden для Linux
Bitwarden для Android
Bitwarden для iPhone
расширения Chrome
расширения Firefox
расширения Edge
В клиенте необходимо изменить адрес сервера.
Например:
Server URL:
https://vault.example.com
После этого выполняем вход с учётными данными, созданными в Vaultwarden.
Рекомендуем включить двухфакторную авторизацию
После первого входа стоит настроить 2FA.
Vaultwarden поддерживает несколько вариантов двухфакторной защиты, включая authenticator-приложения, email, FIDO2/WebAuthn и другие механизмы.
Для домашней установки хороший вариант:
Master Password
+
TOTP
или ещё лучше:
Master Password
+
FIDO2 Security Key
Не забудьте сохранить recovery-коды отдельно от сервера Vaultwarden.
Автоматический запуск
Мы указали:
restart: unless-stopped
Поэтому после перезагрузки Ubuntu контейнер должен запускаться автоматически вместе с Docker.
Проверить политику:
docker inspect vaultwarden \
--format '{{.HostConfig.RestartPolicy.Name}}'
Результат:
unless-stopped
Как остановить Vaultwarden
cd /opt/vaultwarden
docker compose stop
Запустить:
docker compose start
Перезапустить:
docker compose restart
Как удалить контейнер без удаления данных
cd /opt/vaultwarden
docker compose down
Контейнер будет удалён.
Но:
/opt/vaultwarden/data
останется.
Запустить снова:
docker compose up -d
Vaultwarden увидит прежние данные.
Как обновить Vaultwarden
Переходим:
cd /opt/vaultwarden
Сначала желательно сделать backup.
После этого скачиваем новую версию образа:
docker compose pull
Пересоздаём контейнер:
docker compose up -d
Проверяем:
docker compose ps
И журнал:
docker logs --tail=100 vaultwarden
Резервное копирование
Vaultwarden хранит пароли, поэтому резервная копия здесь особенно важна.
Для простого и надёжного ручного backup можно сначала остановить контейнер:
cd /opt/vaultwarden
docker compose stop
Создаём архив:
sudo tar -czf \
/opt/vaultwarden-backup-$(date +%F).tar.gz \
/opt/vaultwarden/data \
/opt/vaultwarden/compose.yaml \
/opt/vaultwarden/.env
После этого запускаем:
docker compose start
Получим, например:
/opt/vaultwarden-backup-2026-09-16.tar.gz
Но хранить единственную резервную копию на том же сервере бессмысленно.
Её нужно перенести:
на NAS
на другой сервер
на внешний диск
в зашифрованное облако
Минимально разумная схема:
Vaultwarden Server
│
├── рабочие данные
│
└── Backup
│
└── другое физическое устройство
Не забываем о .env
В нашем .env нет Master Password пользователей, но в будущем там могут появиться:
SMTP_PASSWORD
ADMIN_TOKEN
другие секреты
Поэтому файл:
/opt/vaultwarden/.env
не должен быть публично доступен.
Можно ограничить права:
sudo chmod 600 /opt/vaultwarden/.env
Проверяем:
ls -l /opt/vaultwarden/.env
Проверяем состояние после установки
Полезный набор команд:
cd /opt/vaultwarden
docker compose ps
docker logs --tail=50 vaultwarden
curl http://127.0.0.1:8080/alive
docker inspect vaultwarden \
--format '{{.State.Status}}'
Если всё нормально:
running
Рекомендуемая схема AppsHome
В результате получаем:
Ubuntu Server
│
├── Docker
│ │
│ └── Vaultwarden
│ │
│ └── /data
│
└── /opt/vaultwarden/
├── compose.yaml
├── .env
└── data/
Снаружи:
Bitwarden Client
│
│ HTTPS
↓
vault.example.com
│
Reverse Proxy / Tunnel
│
↓
127.0.0.1:8080
│
↓
Vaultwarden
Так контейнер не выставляется напрямую в интернет, данные хранятся отдельно, а доступ осуществляется только через HTTPS.
Итог
Для собственного менеджера паролей Vaultwarden очень удобен именно в Docker.
Базовая установка состоит всего из одного контейнера:
Vaultwarden
+
persistent /data
+
HTTPS
+
backup
Но поскольку здесь хранятся одни из самых важных данных пользователя, к безопасности необходимо относиться серьёзнее, чем к обычному домашнему сервису.
После установки мы рекомендуем обязательно:
✓ настроить HTTPS
✓ отключить свободную регистрацию
✓ включить 2FA
✓ регулярно обновлять Vaultwarden
✓ делать резервные копии
✓ хранить backup на другом устройстве
✓ не публиковать Docker-порт напрямую в интернет
