Модул 9 · 9.4
Рецепти: Uptime Kuma и Vaultwarden
Модул 9: Docker и docker compose · Време за четене: 13 минути
Цел на урока: След този урок ще можете да стартирате Uptime Kuma и Vaultwarden с docker compose зад Caddy, с https, затворена регистрация, резервни копия на volumes и установен начин за актуализиране.
Основни понятия: reverse proxy контейнер, Caddyfile, автоматичен https, Uptime Kuma, Vaultwarden, DOMAIN, SIGNUPS_ALLOWED, ADMIN_TOKEN, Argon2, .env, websockets, резервно копие на volumes, docker compose pull, собствен header
Какво изграждаме
Две полезни услуги на Вашия собствен сървър, всяка на отделен поддомейн:
- Uptime Kuma на
status.example.com: програма за наблюдение с уеб интерфейс, която следи Вашите уебсайтове, портове и сертификати и Ви изпраща известие, когато нещо спре да работи (урок 8.3). Внимание: наблюдение, което работи на същия сървър като това, което наблюдава, не забелязва, когато целият сървър отпадне. Затова го използвайте за другите си сайтове и услуги или го поставете на втори сървър. - Vaultwarden на
kluis.example.com: лека, независима сървърна версия, която работи с приложенията и разширенията за браузър на Bitwarden. Хранилището за пароли е чувствителен софтуер: правете това само ако сте готови да го поддържате и да правите резервни копия редовно. Напълно нормално е и просто да използвате мениджър на пароли от доставчик.
Пред тях поставяме Caddy в контейнер: той приема портове 80 и 443, сам се грижи за сертификатите от Let's Encrypt (уроци 7.3 и 7.4) и препраща трафика към правилния контейнер. Uptime Kuma и Vaultwarden сами не публикуват портове (урок 9.3).
internet ──443──> caddy ──> uptime-kuma:3001
└─> vaultwarden:80Предварителни условия
- Docker Engine с плъгина compose (урок 9.2).
- Два DNS записа, които сочат към Вашия сървър, A и AAAA (урок 7.1):
status.example.comиkluis.example.com. - Свободни портове 80 и 443 на сървъра. Ако на тези портове вече работи системен nginx или Caddy, контейнерът на Caddy не може да ги използва. Тогава изберете: или спирате системния уеб сървър, или оставяте него да върши работата на proxy и публикувате контейнерите на
127.0.0.1(урок 9.3). В тази рецепта това прави контейнерът на Caddy. - Отворени в ufw 80/tcp, 443/tcp и за HTTP/3 също 443/udp (урок 5.2). Строго погледнато Docker заобикаля ufw, но така прегледът на Вашата защитна стена отговаря на действителността.
Файловете
Всичко се поставя в една папка, /srv/diensten/:
/srv/diensten/
├── compose.yaml
├── Caddyfile
└── .envcompose.yaml
services:
caddy:
image: caddy:2
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy-data:/data
- caddy-config:/config
uptime-kuma:
image: louislam/uptime-kuma:2
restart: unless-stopped
volumes:
- uptime-kuma:/app/data
vaultwarden:
image: vaultwarden/server:1.37.5
restart: unless-stopped
environment:
DOMAIN: "https://kluis.example.com"
SIGNUPS_ALLOWED: "true"
ADMIN_TOKEN: ${VW_ADMIN_TOKEN}
volumes:
- ./vw-data:/data
volumes:
caddy-data:
caddy-config:
uptime-kuma:Преди да започнете, проверете коя е най-новата версия на Vaultwarden (releases в GitHub) и я въведете в tag. Само Caddy публикува портове; те трябва да са публични. Volumes caddy-data (сертификати), uptime-kuma и папката vw-data съдържат всичко, което трябва да запазите.
Caddyfile
{
email beheer@example.com
}
status.example.com {
reverse_proxy uptime-kuma:3001
header {
X-Weboke-Cursus "jouw-code-uit-de-opdracht"
defer
}
}
kluis.example.com {
reverse_proxy vaultwarden:80
}Caddy автоматично получава сертификат и за двете имена и пренасочва http към https. uptime-kuma и vaultwarden са имената на услугите от compose файла: Caddy ги намира във вътрешната мрежа. Блокът header добавя допълнителен header ред във всеки отговор на status.example.com; него ще използвате в задачата като доказателство, че Вашият proxy контейнер работи. С defer header се задава, след като услугата отзад е дала своя отговор. Ако искате и HSTS, и другите headers за сигурност от урок 7.4, поставете ги в същия блок.
Сигурна настройка на Vaultwarden
Четири неща правят разликата между сигурно и опасно хранилище.
Първо: само през https. Уеб хранилището на Bitwarden използва криптографията на браузъра, а браузърите я предоставят само на https страници. Без https то следователно не работи добре, и това е за добро. Документацията на Vaultwarden препоръчва reverse proxy за https, като Caddy тук. Задайте DOMAIN на пълния https адрес.
Второ: затворена регистрация. С SIGNUPS_ALLOWED: "true" всеки, който намери страницата, може да създаде акаунт на Вашия сървър. Затова стартирайте, веднага създайте собствения си акаунт (или акаунти), задайте стойността на "false" и изпълнете отново docker compose up -d. Ако по-късно искате да добавите някого, използвайте функцията за покани в администраторския панел.
Трето: хеширан администраторски token. Администраторският панел (/admin) е защитен с ADMIN_TOKEN. Не поставяйте там четима парола, а Argon2 хеш. Създавате го със самия Vaultwarden:
anna@web1:/srv/diensten$ sudo docker compose exec vaultwarden /vaultwarden hash
Password:
Confirm Password:
ADMIN_TOKEN='$argon2id$v=19$m=65540,t=3,p=4$...'Поставете този ред в .env (т.е. VW_ADMIN_TOKEN='$argon2id$...', с единични кавички) и направете файла четим само за root: sudo chmod 600 .env. Във файл .env не е нужно да удвоявате знаците $; ако поставите хеша директно под environment: в compose файла, тогава е нужно (всеки $ става $$), иначе Compose се опитва да ги попълни като променливи. В /admin влизате с паролата, която сте въвели, а не с хеша. Внимание: настройките, които запазвате в администраторския панел, се записват в vw-data/config.json и тогава имат предимство пред променливите на средата.
Четвърто: резервно копие и възстановяване. Всичко се намира в vw-data: базата данни, прикачените файлове и ключовете. Включете тази папка в резервното си копие с restic (урок 8.2) и за базата данни следвайте указанията за резервни копия в wiki на Vaultwarden, за да не копирате наполовина записан файл. Тествайте възстановяването (задача O8.2): хранилище без работещо резервно копие е риск за всичките Ви пароли.
Известията между устройствата (websockets) при новите версии на Vaultwarden работят през същия порт; Caddy ги препраща без допълнителна настройка.
Настройка на Uptime Kuma
След docker compose up -d отворете https://status.example.com. При първото посещение Uptime Kuma Ви моли да създадете администраторски акаунт. Направете го веднага: докато този акаунт не съществува, всеки, който намери страницата, може да го създаде. Ако изобщо не искате този риск, първо премахнете блока status от Caddyfile, създайте акаунта през SSH тунел (урок 2.3) и след това върнете блока.
След това добавете монитори: HTTP монитор за Вашия уебсайт, TCP монитор за порт, предупреждение за сертификат и канал за известия (имейл, програма за чат или push услуга). Включете също двуфакторното удостоверяване в настройките на Uptime Kuma.
Стартиране и проверка
anna@web1:/srv/diensten$ sudo docker compose up -d
anna@web1:/srv/diensten$ sudo docker compose ps
NAME SERVICE STATUS PORTS
diensten-caddy-1 caddy Up 2 minutes 0.0.0.0:80->80/tcp, [::]:80->80/tcp, 0.0.0.0:443->443/tcp, ...
diensten-uptime-kuma-1 uptime-kuma Up 2 minutes (healthy)
diensten-vaultwarden-1 vaultwarden Up 2 minutes (healthy)
anna@web1:/srv/diensten$ sudo docker compose logs caddy | grep -i "certificate obtained"
anna@web1:~$ curl -sI https://status.example.com | grep -i x-weboke
x-weboke-cursus: jouw-code-uit-de-opdrachtСамо Caddy има портове. Ако сертификатът не се получи, в логовете на Caddy е посочено защо: обикновено DNS още не сочи към сървъра или порт 80 не е достъпен (урок 7.3).
Актуализиране
Контейнерът не се актуализира от unattended-upgrades (урок 4.2). Определете за това постоянен момент, например на всеки две седмици:
anna@web1:/srv/diensten$ sudo docker compose pull
anna@web1:/srv/diensten$ sudo docker compose up -d
anna@web1:/srv/diensten$ sudo docker image prunepull изтегля най-новите images в рамките на избрания от Вас tag (т.е. caddy:2 остава в рамките на версия 2). За Vaultwarden с номер на версия първо променете tag, след като прочетете release notes. При нова основна версия винаги четете release notes: понякога трябва да промените нещо в настройките си. Преди голяма актуализация направете резервно копие на volumes.
Следете и съобщенията за сигурност от създателите. Уязвимост във Vaultwarden или Caddy се отстранява само ако Вие изтеглите новата версия.
На практика
Тази рецепта работи на всеки VPS с Docker, при WebOké или при друг доставчик. Това е самопомощ: доставчикът на Вашия VPS не управлява нищо вътре във Вашите контейнери. Направете snapshot, преди да я настроите за първи път, и ще можете да експериментирате спокойно.
Обобщение
- Един compose файл с Caddy като reverse proxy контейнер; само Caddy публикува портове 80 и 443, услугите не публикуват нищо.
- Caddy се грижи автоматично за сертификатите и https и може да задава собствени header редове с
header. - Vaultwarden: https е задължителен,
DOMAINна https адреса, затворена регистрация след собствения Ви акаунт,ADMIN_TOKENкато Argon2 хеш в.envс права 600. - Uptime Kuma: веднага създайте администраторския акаунт и включете двуфакторното удостоверяване; наблюдавайте с него най-вече други сървъри и сайтове.
- Правете резервни копия на volumes и на папката
vw-dataи актуализирайте сdocker compose pullиup -dв постоянен момент.
Тест (quiz)
Задача
Задача Z9.4: Докажете, че Вашият контейнер работи. Вземете в задачата своя личен код и го поставете в Caddyfile на Вашия Caddy контейнер като header X-Weboke-Cursus за Ваш поддомейн (например status.<jouwdomein>). Презаредете Caddy и въведете името на хоста. Програмата изтегля https://<hostnaam>/ и проверява дали сертификатът е валиден и дали header съдържа точно Вашия код. Освен това поставете изхода от docker compose ps и отговорете коя услуга единствена публикува портове.
Още за четене
- Мениджър на пароли и passkeys: така организирате сигурно Вашето влизане
- Uptime Kuma (инсталация с Docker): https://github.com/louislam/uptime-kuma
- Wiki на Vaultwarden, Using Docker Compose: https://github.com/dani-garcia/vaultwarden/wiki/Using-Docker-Compose
- Wiki на Vaultwarden, Enabling admin page: https://github.com/dani-garcia/vaultwarden/wiki/Enabling-admin-page
- Wiki на Vaultwarden, Enabling HTTPS: https://github.com/dani-garcia/vaultwarden/wiki/Enabling-HTTPS
- Документация на Caddy, header: https://caddyserver.com/docs/caddyfile/directives/header
- VPS: от първото влизане до сигурен сървър 7.1: Uptime Kuma: наблюдение на Вашите сайтове и сървър
- VPS: от първото влизане до сигурен сървър 7.2: Vaultwarden: Вашият собствен трезор за пароли
- Мениджър на пароли на практика 1.4: Всички известни мениджъри на пароли в сравнение: държава, функции, отзиви и оценки
- Безплатен курс Безопасно онлайн за предприемачи 2.2: Избор и използване на мениджъри на пароли
