НАЗНАЧЕНИЕ
Развернуть сервер хранения паролей с доступом через браузер и приложения Bitwarden. HTTPS-сертификат автоматически получает и обновляет Caddy.
ПРИМЕНЕНИЕ
Установка в виртуальной машине Debian 13 рядом с другими контейнерами, включая сайт, занимающий порт 80.
УСЛОВИЕ
- Установлены Docker и Docker Compose;
- В VMware используется сетевой мост — Bridged;
- За Debian закреплён постоянный локальный IP;
- Есть белый IP и доступ к настройкам роутера;
- Есть домен или поддомен и доступ к его DNS;
- Порты Debian
18080и18443свободны; - Внешние TCP-порты
80и443можно направить на Caddy.
В примере используются:
- адрес хранилища —
vault.example.com; - локальный IP Debian —
192.168.1.103.
Заменить их своими значениями.
ШАГИ
1. Проверить Docker и занятые порты
docker compose version
docker ps --format 'table {{.Names}}\t{{.Ports}}'
sudo ss -lntp | grep -E ':(18080|18443)\b'
Последняя команда не должна показывать слушающие службы.
2. Настроить DNS и переадресацию
Добавить DNS-запись:
Тип: A
Поддомен: vault
Значение: белый IP офиса
На роутере создать два правила:
| Вход | Протокол | Внешний порт | Назначение |
|---|---|---|---|
| Интернет-подключение | TCP | 80 | 192.168.1.103:18080 |
| Интернет-подключение | TCP | 443 | 192.168.1.103:18443 |
В Keenetic назначением выбрать устройство Debian. Если внешние 80/443 уже используются другим опубликованным сайтом, потребуется общий обратный прокси.
3. Подготовить рабочую папку
sudo mkdir -p /opt/vaultwarden
sudo chown "$(id -u):$(id -g)" /opt/vaultwarden
cd /opt/vaultwarden
chmod 700 .
4. Создать административный пароль
В инструкции используется проверенная при развёртывании версия Vaultwarden 1.37.4. Перед новой установкой проверить актуальный стабильный релиз.
docker run --rm -it vaultwarden/server:1.37.4 /vaultwarden hash
Ввести новый длинный пароль дважды. Сохранить пароль отдельно и скопировать полученный хеш $argon2id$....
Создайте .env:
nano .env
VW_DOMAIN=vault.example.com
VAULTWARDEN_ADMIN_TOKEN='$argon2id$ВСТАВЬТЕ_ПОЛНЫЙ_ХЕШ'
В .env сохранить одинарные кавычки; символы $ не удваивать.
chmod 600 .env
5. Создать конфигурацию контейнеров
nano docker-compose.yml
services:
vaultwarden:
image: vaultwarden/server:1.37.4
restart: unless-stopped
environment:
DOMAIN: "https://${VW_DOMAIN}"
SIGNUPS_ALLOWED: "false"
INVITATIONS_ALLOWED: "true"
ADMIN_TOKEN: "${VAULTWARDEN_ADMIN_TOKEN}"
SHOW_PASSWORD_HINT: "false"
LOG_LEVEL: "warn"
volumes:
- ./vw-data:/data
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
caddy:
image: caddy:2
restart: unless-stopped
depends_on:
- vaultwarden
environment:
VW_DOMAIN: "${VW_DOMAIN}"
ports:
- "18080:80"
- "18443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- ./caddy-data:/data
- ./caddy-config:/config
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
Создать Caddyfile:
nano Caddyfile
{$VW_DOMAIN} {
reverse_proxy vaultwarden:80
}
6. Запустить сервер
docker compose config --quiet
docker compose pull
docker compose up -d
docker compose ps
docker compose logs --tail=60 -f caddy
Дождаться сообщения:
certificate obtained successfully
Нажать Ctrl+C для выхода из просмотра журнала. Контейнеры продолжат работать.
Открыть https://vault.example.com с телефона через мобильный интернет, отключив Wi-Fi.
7. Создать пользователей и назначить доступ
- Открыть
https://vault.example.com/admin. - Войти с административным паролем из шага 4.
- Через Users → Invite User добавить email пользователя.
- На основной странице пользователь выбирает Create account и регистрируется с тем же email.
Без SMTP письмо не отправляется: приглашение разрешает регистрацию указанного адреса.
Личные записи сохранить с владельцем «Я / Me». Для общих рабочих записей создать организацию и коллекции.
Рекомендуемые роли: ИТ-специалист — Owner, остальные — User с доступом к нужным коллекциям. Пароль серверной панели /admin хранится отдельно.
В приложении Bitwarden выбрать Self-hosted, указать адрес сервера и войти. Включить двухфакторную защиту и сохранить код восстановления отдельно.
8. Настроить резервирование
Перед загрузкой рабочих паролей сделать согласованную копию данных:
(
set -eu
cd /opt/vaultwarden
sudo install -d -m 700 /var/backups/vaultwarden
trap 'docker compose start vaultwarden' EXIT
docker compose stop vaultwarden
sudo tar -czf \
"/var/backups/vaultwarden/vaultwarden-$(date +%F-%H%M%S).tar.gz" \
docker-compose.yml .env Caddyfile vw-data
)
Архивы хранить зашифрованными на другом устройстве. Организовать ежедневное резервирование и проверить восстановление.
РЕЗУЛЬТАТ
Vaultwarden доступен по HTTPS. Пользователи имеют отдельные личные хранилища, общие записи доступны через назначенные коллекции. Сайт на порту 80 Debian продолжает работать.
Для восстановления после перезагрузки Windows обеспечьте автоматический запуск виртуальной машины и Docker.
ТИПОВЫЕ ОШИБКИ
❌ Проблема: По домену открывается роутер: запросы не направлены на Caddy.
✅ Решение: проверить DNS и правила 80 → 18080, 443 → 18443 на IP Debian.
❌ Проблема: ошибка HTTPS или сертификат не получен.
✅ Решение: проверить журнал Caddy. Внешний 443 должен вести на 18443. Если указан connection reset by peer при обращении к Let’s Encrypt, проверить исходящий доступ к серверу сертификатов.
После устранения причины можно один раз запустить новую попытку:
docker compose restart caddy
docker compose logs --since=1m -f caddy
❌ Проблема: Изменения .env не применились.
✅ Решение: пересоздать контейнеры:
docker compose up -d --force-recreate vaultwarden caddy
Если настройки сохранялись через /admin, проверить vw-data/config.json: его значения имеют приоритет над переменными окружения.
❌ Проблема: через отдельный VPN-узел сайт не открывается.
✅ Решение: сравнить доступ без VPN и через другие узлы. Сбой одного узла не подтверждает общую недоступность сервера из-за границы.
Связанные инструкции: установка Vaultwarden с Caddy, резервное копирование.



