Установка Vaultwarden с Docker и Nginx » История » Версия 1
Redmine Admin, 25.03.2026 10:25
| 1 | 1 | Redmine Admin | <div class="vaultwarden-install-guide"> |
|---|---|---|---|
| 2 | <h2>🔐 Установка Vaultwarden (Docker + Nginx + Certbot)</h2> |
||
| 3 | |||
| 4 | <h3>Шаг 1: Установка Docker и Docker Compose</h3> |
||
| 5 | <p>Vaultwarden удобнее всего запускать в контейнере.</p> |
||
| 6 | |||
| 7 | <pre class="bash"><code># Обновляем пакеты |
||
| 8 | sudo apt update && sudo apt upgrade -y |
||
| 9 | |||
| 10 | # Устанавливаем Docker |
||
| 11 | sudo apt install docker.io -y |
||
| 12 | |||
| 13 | # Устанавливаем плагин Docker Compose |
||
| 14 | sudo apt install docker-compose-plugin -y |
||
| 15 | |||
| 16 | # Добавляем пользователя в группу docker (чтобы не писать sudo перед docker) |
||
| 17 | sudo usermod -aG docker $USER |
||
| 18 | |||
| 19 | # Применим группу без перезагрузки |
||
| 20 | newgrp docker</code></pre> |
||
| 21 | |||
| 22 | <h3>Шаг 2: Установка Nginx и Certbot</h3> |
||
| 23 | <p>Nginx будет работать как обратный прокси (принимать запросы из интернета и передавать их в Vaultwarden), а Certbot получит SSL-сертификат.</p> |
||
| 24 | |||
| 25 | <pre class="bash"><code>sudo apt install nginx certbot python3-certbot-nginx -y</code></pre> |
||
| 26 | |||
| 27 | <h3>Шаг 3: Получение SSL-сертификата</h3> |
||
| 28 | <p>На этом этапе Nginx должен быть запущен и доступен по порту 80.<br> |
||
| 29 | Создайте временный конфиг для Nginx (чтобы Certbot мог проверить домен):</p> |
||
| 30 | |||
| 31 | <pre class="bash"><code>sudo nano /etc/nginx/sites-available/vaultwarden</code></pre> |
||
| 32 | |||
| 33 | <p>Вставьте следующее (замените <code>vault.example.com</code> на ваш домен):</p> |
||
| 34 | |||
| 35 | <pre class="nginx"><code>server { |
||
| 36 | listen 80; |
||
| 37 | server_name vault.example.com; |
||
| 38 | |||
| 39 | location / { |
||
| 40 | return 200 'OK'; |
||
| 41 | add_header Content-Type text/plain; |
||
| 42 | } |
||
| 43 | }</code></pre> |
||
| 44 | |||
| 45 | <p>Включите сайт и перезапустите Nginx:</p> |
||
| 46 | |||
| 47 | <pre class="bash"><code>sudo ln -s /etc/nginx/sites-available/vaultwarden /etc/nginx/sites-enabled/ |
||
| 48 | sudo nginx -t |
||
| 49 | sudo systemctl restart nginx</code></pre> |
||
| 50 | |||
| 51 | <p>Запустите Certbot для получения сертификата:</p> |
||
| 52 | |||
| 53 | <pre class="bash"><code>sudo certbot --nginx -d vault.example.com</code></pre> |
||
| 54 | |||
| 55 | <ul> |
||
| 56 | <li>Введите email для уведомлений</li> |
||
| 57 | <li>Согласитесь с условиями</li> |
||
| 58 | <li>Выберите вариант перенаправления на HTTPS (рекомендуется вариант 2)</li> |
||
| 59 | </ul> |
||
| 60 | |||
| 61 | <p>✅ Certbot автоматически настроил обновление сертификатов через systemd timer.<br> |
||
| 62 | Проверить можно командой: <code>sudo systemctl list-timers | grep certbot</code></p> |
||
| 63 | |||
| 64 | <div class="success-box"> |
||
| 65 | <strong>Пример успешного вывода:</strong> |
||
| 66 | <pre><code>Saving debug log to /var/log/letsencrypt/letsencrypt.log |
||
| 67 | Requesting a certificate for vw.saria.by |
||
| 68 | |||
| 69 | Successfully received certificate. |
||
| 70 | Certificate is saved at: /etc/letsencrypt/live/vw.saria.by/fullchain.pem |
||
| 71 | Key is saved at: /etc/letsencrypt/live/vw.saria.by/privkey.pem |
||
| 72 | This certificate expires on 2026-06-22. |
||
| 73 | These files will be updated when the certificate renews. |
||
| 74 | Certbot has set up a scheduled task to automatically renew this certificate in the background. |
||
| 75 | |||
| 76 | Deploying certificate |
||
| 77 | Successfully deployed certificate for vw.saria.by to /etc/nginx/sites-enabled/vaultwarden |
||
| 78 | Congratulations! You have successfully enabled HTTPS on https://vw.saria.by</code></pre> |
||
| 79 | </div> |
||
| 80 | |||
| 81 | <h3>Шаг 4: Настройка Nginx для проксирования</h3> |
||
| 82 | <p>Теперь нужно настроить Nginx так, чтобы он передавал запросы в контейнер Vaultwarden.<br> |
||
| 83 | Откройте конфиг снова (Certbot мог его изменить):</p> |
||
| 84 | |||
| 85 | <pre class="bash"><code>sudo nano /etc/nginx/sites-available/vaultwarden</code></pre> |
||
| 86 | |||
| 87 | <pre class="nginx"><code># HTTP на порту 80 → редирект на HTTPS с портом 55641 |
||
| 88 | server { |
||
| 89 | listen 80; |
||
| 90 | server_name vw.saria.by; |
||
| 91 | return 301 https://$server_name:55641$request_uri; |
||
| 92 | } |
||
| 93 | |||
| 94 | # HTTPS на порту 55641 |
||
| 95 | server { |
||
| 96 | listen 55641 ssl http2; |
||
| 97 | server_name vw.saria.by; |
||
| 98 | |||
| 99 | # Пути к сертификатам |
||
| 100 | ssl_certificate /etc/letsencrypt/live/vw.saria.by/fullchain.pem; |
||
| 101 | ssl_certificate_key /etc/letsencrypt/live/vw.saria.by/privkey.pem; |
||
| 102 | |||
| 103 | # Современные настройки SSL |
||
| 104 | ssl_protocols TLSv1.2 TLSv1.3; |
||
| 105 | ssl_prefer_server_ciphers on; |
||
| 106 | ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256; |
||
| 107 | |||
| 108 | # Отключаем логирование токенов в доступе (опционально, для приватности) |
||
| 109 | proxy_hide_header Authorization; |
||
| 110 | |||
| 111 | location / { |
||
| 112 | proxy_pass http://127.0.0.1:8000; |
||
| 113 | proxy_set_header Host $host; |
||
| 114 | proxy_set_header X-Real-IP $remote_addr; |
||
| 115 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
||
| 116 | proxy_set_header X-Forwarded-Proto $scheme; |
||
| 117 | proxy_set_header X-Forwarded-Port 55641; # Важно: сообщаем Vaultwarden о внешнем порте |
||
| 118 | |||
| 119 | # Для веб-сокетов (уведомления) |
||
| 120 | proxy_http_version 1.1; |
||
| 121 | proxy_set_header Upgrade $http_upgrade; |
||
| 122 | proxy_set_header Connection "upgrade"; |
||
| 123 | } |
||
| 124 | }</code></pre> |
||
| 125 | |||
| 126 | <p>Примените изменения:</p> |
||
| 127 | <pre class="bash"><code>sudo nginx -t && sudo systemctl reload nginx</code></pre> |
||
| 128 | |||
| 129 | <h3>Шаг 5: Обновите docker-compose.yml для Vaultwarden</h3> |
||
| 130 | <p>Откройте файл:</p> |
||
| 131 | <pre class="bash"><code>nano ~/vaultwarden/docker-compose.yml</code></pre> |
||
| 132 | |||
| 133 | <p>Обновите секцию <code>environment</code>, особенно переменную <code>DOMAIN</code>:</p> |
||
| 134 | |||
| 135 | <pre class="yaml"><code>version: '3' |
||
| 136 | services: |
||
| 137 | vaultwarden: |
||
| 138 | image: vaultwarden/server:latest |
||
| 139 | container_name: vaultwarden |
||
| 140 | restart: always |
||
| 141 | volumes: |
||
| 142 | - ${PWD}/data:/data |
||
| 143 | ports: |
||
| 144 | - 127.0.0.1:8000:80 # Vaultwarden внутри контейнера по-прежнему слушает порт 80 |
||
| 145 | environment: |
||
| 146 | - DOMAIN=https://vw.saria.by:55641 # ← Обязательно укажите порт! |
||
| 147 | - WEBSOCKET_ENABLED=true |
||
| 148 | - SIGNUPS_ALLOWED=false |
||
| 149 | - ADMIN_TOKEN=ПридумайтеОченьСложныйПароль_2026! |
||
| 150 | |||
| 151 | watchtower: |
||
| 152 | image: containrrr/watchtower |
||
| 153 | container_name: watchtower |
||
| 154 | restart: always |
||
| 155 | volumes: |
||
| 156 | - /var/run/docker.sock:/var/run/docker.sock |
||
| 157 | command: --interval 86400 --cleanup</code></pre> |
||
| 158 | |||
| 159 | <p>Перезапустите контейнеры:</p> |
||
| 160 | <pre class="bash"><code>cd ~/vaultwarden |
||
| 161 | docker compose up -d</code></pre> |
||
| 162 | |||
| 163 | <div class="info-box"> |
||
| 164 | 💡 <strong>Важно:</strong> Переменная <code>DOMAIN</code> с указанием порта критически важна: |
||
| 165 | Vaultwarden использует её для генерации ссылок в письмах, настройки клиентов и проверки безопасности. |
||
| 166 | </div> |
||
| 167 | |||
| 168 | <h3>✅ Проверка работы</h3> |
||
| 169 | <pre class="bash"><code># Проверьте, что Nginx слушает порт 55641 |
||
| 170 | sudo ss -tlnp | grep 55641 |
||
| 171 | |||
| 172 | # Протестируйте доступ локально |
||
| 173 | curl -kI https://127.0.0.1:55641 |
||
| 174 | |||
| 175 | # Проверьте, что контейнер Vaultwarden запущен |
||
| 176 | docker ps | grep vaultwarden |
||
| 177 | |||
| 178 | # Посмотрите логи Nginx на ошибки |
||
| 179 | sudo tail -f /var/log/nginx/error.log</code></pre> |
||
| 180 | |||
| 181 | <h3>🔧 Полезные команды</h3> |
||
| 182 | <ul> |
||
| 183 | <li><code>docker compose logs -f vaultwarden</code> — просмотр логов контейнера</li> |
||
| 184 | <li><code>sudo certbot renew --dry-run</code> — тестовое обновление сертификата</li> |
||
| 185 | <li><code>sudo systemctl status nginx</code> — статус Nginx</li> |
||
| 186 | <li><code>docker exec -it vaultwarden /bin/bash</code> — вход в контейнер</li> |
||
| 187 | </ul> |
||
| 188 | </div> |
||
| 189 | |||
| 190 | <style> |
||
| 191 | .vaultwarden-install-guide { |
||
| 192 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; |
||
| 193 | line-height: 1.6; |
||
| 194 | color: #333; |
||
| 195 | max-width: 100%; |
||
| 196 | } |
||
| 197 | .vaultwarden-install-guide h2 { |
||
| 198 | color: #2c3e50; |
||
| 199 | border-bottom: 2px solid #3498db; |
||
| 200 | padding-bottom: 0.5em; |
||
| 201 | margin-top: 1.5em; |
||
| 202 | } |
||
| 203 | .vaultwarden-install-guide h3 { |
||
| 204 | color: #34495e; |
||
| 205 | margin: 1.2em 0 0.8em; |
||
| 206 | background: #f8f9fa; |
||
| 207 | padding: 0.5em 0.8em; |
||
| 208 | border-left: 4px solid #3498db; |
||
| 209 | } |
||
| 210 | .vaultwarden-install-guide pre { |
||
| 211 | background: #2d2d2d; |
||
| 212 | color: #f8f8f2; |
||
| 213 | padding: 1em; |
||
| 214 | border-radius: 4px; |
||
| 215 | overflow-x: auto; |
||
| 216 | font-size: 0.9em; |
||
| 217 | margin: 0.8em 0; |
||
| 218 | } |
||
| 219 | .vaultwarden-install-guide code { |
||
| 220 | font-family: "Consolas", "Monaco", monospace; |
||
| 221 | } |
||
| 222 | .vaultwarden-install-guide .bash::before, |
||
| 223 | .vaultwarden-install-guide .nginx::before, |
||
| 224 | .vaultwarden-install-guide .yaml::before { |
||
| 225 | content: attr(class); |
||
| 226 | display: block; |
||
| 227 | background: #444; |
||
| 228 | color: #aaa; |
||
| 229 | padding: 0.2em 0.5em; |
||
| 230 | margin: -1em -1em 1em -1em; |
||
| 231 | font-size: 0.8em; |
||
| 232 | border-radius: 4px 4px 0 0; |
||
| 233 | } |
||
| 234 | .vaultwarden-install-guide ul { |
||
| 235 | padding-left: 1.5em; |
||
| 236 | } |
||
| 237 | .vaultwarden-install-guide li { |
||
| 238 | margin: 0.3em 0; |
||
| 239 | } |
||
| 240 | .vaultwarden-install-guide .success-box { |
||
| 241 | background: #d4edda; |
||
| 242 | border: 1px solid #c3e6cb; |
||
| 243 | border-left: 4px solid #28a745; |
||
| 244 | padding: 1em; |
||
| 245 | margin: 1em 0; |
||
| 246 | border-radius: 0 4px 4px 0; |
||
| 247 | } |
||
| 248 | .vaultwarden-install-guide .info-box { |
||
| 249 | background: #d1ecf1; |
||
| 250 | border: 1px solid #bee5eb; |
||
| 251 | border-left: 4px solid #17a2b8; |
||
| 252 | padding: 1em; |
||
| 253 | margin: 1em 0; |
||
| 254 | border-radius: 0 4px 4px 0; |
||
| 255 | } |
||
| 256 | .vaultwarden-install-guide a { |
||
| 257 | color: #3498db; |
||
| 258 | text-decoration: none; |
||
| 259 | } |
||
| 260 | .vaultwarden-install-guide a:hover { |
||
| 261 | text-decoration: underline; |
||
| 262 | } |
||
| 263 | </style> |