Ir diretamente para o conteúdo

Definições de cookies

Escolha que tipos de cookies permite. Pode alterar a sua escolha a qualquer momento em Definições de cookies, no fundo de cada página. Política de privacidade

Necessários

Sempre ativos

Necessários para iniciar sessão, manter o seu carrinho e memorizar as suas escolhas. Estão sempre ativos.

Que cookies?
  • weboke_sessie, weboke_klant, weboke_remember: a sua sessão e manter a sessão iniciada
  • weboke_basket: o seu carrinho
  • wkBtwIncl: mostrar preços com ou sem IVA
  • wok_cookies: a sua escolha de cookies, 12 meses

Mede que anúncio leva a uma visita ou encomenda, para não pagarmos por anúncios que não dão resultado.

Que cookies?
  • Google Ads via Google Tag Manager (_gcl_au, _gcl_aw), até 90 dias
  • OpenAI Ads, anúncios no ChatGPT
  • wok_aff: através de que parceiro chegou até nós (programa de afiliados), 60 dias

4,6

País e idioma

Cada país tem o seu próprio site, com os preços e o IVA desse país.

Ver

Receitas: Uptime Kuma e Vaultwarden

Módulo 9: Docker e docker compose · Tempo de leitura: 13 minutos

Objetivo de aprendizagem: No final desta lição, conseguirá executar o Uptime Kuma e o Vaultwarden com docker compose atrás do Caddy, com https, registo fechado, cópia de segurança dos volumes e uma forma fixa de atualizar.

Conceitos-chave: contentor de proxy inverso, Caddyfile, https automático, Uptime Kuma, Vaultwarden, DOMAIN, SIGNUPS_ALLOWED, ADMIN_TOKEN, Argon2, .env, websockets, cópia de segurança de volumes, docker compose pull, cabeçalho próprio

O que vamos construir

Dois serviços úteis no seu próprio servidor, cada um no seu subdomínio:

  • Uptime Kuma em status.example.com: um programa de monitorização com interface web que vigia os seus sites, portas e certificados e lhe envia um alerta quando algo falha (lição 8.3). Atenção: uma monitorização que corre no mesmo servidor que aquilo que vigia não deteta a falha do servidor inteiro. Utilize-a, portanto, para os seus outros sites e serviços, ou instale-a num segundo servidor.
  • Vaultwarden em kluis.example.com: uma versão de servidor leve e independente que funciona com as aplicações e extensões de navegador do Bitwarden. Um cofre de palavras-passe é software sensível: faça-o apenas se estiver disposto a mantê-lo bem atualizado e a fazer cópias de segurança. Utilizar simplesmente um gestor de palavras-passe de um fornecedor também é perfeitamente aceitável.

À frente colocamos o Caddy num contentor: recebe as portas 80 e 443, trata ele próprio dos certificados da Let's Encrypt (lições 7.3 e 7.4) e encaminha o tráfego para o contentor certo. O Uptime Kuma e o Vaultwarden não publicam portas próprias (lição 9.3).

internet ──443──> caddy ──> uptime-kuma:3001
                        └─> vaultwarden:80

Antes de começar

  1. Docker Engine com o plug-in compose (lição 9.2).
  2. Dois registos DNS que apontem para o seu servidor, A e AAAA (lição 7.1): status.example.com e kluis.example.com.
  3. As portas 80 e 443 livres no servidor. Se já houver um nginx ou Caddy do sistema nessas portas, o contentor do Caddy não as pode utilizar. Nesse caso, escolha: ou para o servidor web do sistema, ou deixa-o fazer o trabalho de proxy e publica os contentores em 127.0.0.1 (lição 9.3). Nesta receita, é o contentor do Caddy que o faz.
  4. No ufw, abra 80/tcp, 443/tcp e, para HTTP/3, também 443/udp (lição 5.2). Em rigor, o Docker contorna o ufw, mas assim a sua visão geral da firewall corresponde à realidade.

Os ficheiros

Tudo fica numa só pasta, /srv/diensten/:

/srv/diensten/
├── compose.yaml
├── Caddyfile
└── .env

compose.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:

Antes de começar, verifique qual é a versão mais recente do Vaultwarden (as releases no GitHub) e coloque-a na tag. Só o Caddy publica portas; essas têm de ser públicas. Os volumes caddy-data (certificados), uptime-kuma e a pasta vw-data contêm tudo o que tem de guardar.

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
}

O Caddy obtém automaticamente um certificado para ambos os nomes e redireciona http para https. uptime-kuma e vaultwarden são os nomes dos serviços do ficheiro compose: o Caddy encontra-os na rede interna. O bloco header acrescenta uma linha de cabeçalho extra a cada resposta de status.example.com; é essa linha que utiliza no exercício como prova de que o seu contentor de proxy está em execução. Com defer, o cabeçalho é definido depois de o serviço subjacente ter dado a sua resposta. Se também quiser o HSTS e os outros cabeçalhos de segurança da lição 7.4, coloque-os no mesmo bloco.

Configurar o Vaultwarden com segurança

Quatro coisas fazem a diferença entre um cofre seguro e um cofre perigoso.

Um: apenas via https. O cofre web do Bitwarden utiliza a criptografia do navegador, e os navegadores só a disponibilizam em páginas https. Sem https, portanto, não funciona bem, e ainda bem. A documentação do Vaultwarden recomenda um proxy inverso para o https, como o Caddy aqui. Defina DOMAIN com o endereço https completo.

Dois: registo fechado. Com SIGNUPS_ALLOWED: "true", qualquer pessoa que encontre a página pode criar uma conta no seu servidor. Por isso, arranque o serviço, crie de imediato a(s) sua(s) conta(s), altere o valor para "false" e execute novamente docker compose up -d. Se mais tarde quiser acrescentar alguém, utilize a função de convite no ecrã de administração.

Três: um token de administração em hash. O ecrã de administração (/admin) está protegido com ADMIN_TOKEN. Não coloque aí uma palavra-passe legível, mas sim um hash Argon2. Cria-o com o próprio 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$...'

Coloque essa linha em .env (ou seja, VW_ADMIN_TOKEN='$argon2id$...', com aspas simples) e torne o ficheiro legível apenas para root: sudo chmod 600 .env. Num ficheiro .env não é necessário duplicar os caracteres $; se colocar o hash diretamente em environment: no ficheiro compose, então é necessário (cada $ passa a $$), caso contrário o Compose tenta preenchê-los como variáveis. Para iniciar sessão em /admin, utilize a palavra-passe que escreveu, não o hash. Atenção: as definições que guardar no ecrã de administração ficam em vw-data/config.json e passam a ter prioridade sobre as variáveis de ambiente.

Quatro: cópia de segurança e reposição. Tudo está em vw-data: a base de dados, os anexos e as chaves. Inclua essa pasta na sua cópia de segurança com o restic (lição 8.2) e, para a base de dados, siga as indicações de cópia de segurança do wiki do Vaultwarden, para não copiar um ficheiro escrito a meio. Teste a reposição (exercício O8.2): um cofre sem uma cópia de segurança funcional é um risco para todas as suas palavras-passe.

As notificações entre dispositivos (websockets) funcionam, nas versões recentes do Vaultwarden, pela mesma porta; o Caddy encaminha-as sem configuração adicional.

Configurar o Uptime Kuma

Depois de docker compose up -d, abra https://status.example.com. Na primeira visita, o Uptime Kuma pede-lhe que crie uma conta de administrador. Faça-o de imediato: enquanto essa conta não existir, qualquer pessoa que encontre a página a pode criar. Se não quiser correr esse risco de todo, retire primeiro o bloco status do Caddyfile, crie a conta através de um túnel SSH (lição 2.3) e volte a colocar o bloco depois.

Em seguida, adicione monitores: um monitor HTTP para o seu site, um monitor TCP para uma porta, um aviso de certificado e um canal de notificação (e-mail, um programa de chat ou um serviço de notificações push). Ative também a autenticação de dois fatores nas definições do Uptime Kuma.

Arrancar e verificar

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

Só o Caddy tem portas. Se o certificado falhar, os registos do Caddy indicam porquê: normalmente o DNS ainda não aponta para o servidor, ou a porta 80 não está acessível (lição 7.3).

Atualizar

Um contentor não é atualizado pelo unattended-upgrades (lição 4.2). Defina um momento fixo, por exemplo de duas em duas semanas:

anna@web1:/srv/diensten$ sudo docker compose pull
anna@web1:/srv/diensten$ sudo docker compose up -d
anna@web1:/srv/diensten$ sudo docker image prune

pull obtém as imagens mais recentes dentro da tag que escolheu (assim, caddy:2 mantém-se na versão 2). Para o Vaultwarden com número de versão, ajuste primeiro a tag depois de ler as notas de lançamento. Numa nova versão principal, leia sempre as notas de lançamento: por vezes é preciso alterar algo nas suas definições. Antes de uma atualização grande, faça uma cópia de segurança dos volumes.

Acompanhe também os avisos de segurança dos criadores. Uma vulnerabilidade no Vaultwarden ou no Caddy só fica resolvida quando obtém a nova versão.

Na prática

Esta receita funciona em qualquer VPS com Docker, na WebOké ou noutro fornecedor. É autoajuda: o fornecedor do seu VPS não gere nada dentro dos seus contentores. Faça um snapshot antes da primeira instalação; assim pode experimentar com toda a tranquilidade.

Resumo

  • Um único ficheiro compose com o Caddy como contentor de proxy inverso; só o Caddy publica as portas 80 e 443, os serviços não publicam nenhuma.
  • O Caddy trata automaticamente dos certificados e do https e pode definir cabeçalhos próprios com header.
  • Vaultwarden: https obrigatório, DOMAIN com o endereço https, registo fechado depois da sua própria conta, ADMIN_TOKEN como hash Argon2 num .env com permissões 600.
  • Uptime Kuma: criar de imediato a conta de administrador e ativar a autenticação de dois fatores; utilize-o sobretudo para vigiar outros servidores e sites.
  • Faça cópia de segurança dos volumes e da pasta vw-data e atualize com docker compose pull e up -d num momento fixo.

Questionário

1. Porque é que o Uptime Kuma e o Vaultwarden não publicam portas próprias nesta receita?



2. Porque é que o cofre web do Vaultwarden não funciona bem através de http simples?



3. Criou a sua própria conta no Vaultwarden. Qual é o passo seguinte?



4. Coloca o hash Argon2 do token de administração diretamente em environment: no compose.yaml e recebe avisos sobre variáveis desconhecidas. Porquê?



5. Como se atualizam estes serviços?



Exercício

Exercício Z9.4: Provar que o seu contentor está em execução. Obtenha o seu código pessoal no exercício e coloque-o no Caddyfile do seu contentor do Caddy como cabeçalho X-Weboke-Cursus para um subdomínio seu (como status.<jouwdomein>). Recarregue o Caddy e introduza o nome do anfitrião. O programa obtém https://<hostnaam>/ e verifica se o certificado é válido e se o cabeçalho contém exatamente o seu código. Cole também a saída de docker compose ps e responda qual é o único serviço que publica portas.

Exercício Z9.4: Provar que o seu contentor está em execução

Clique em "Mostrar o meu código" e coloque o cabeçalho X-Weboke-Cursus com esse código no seu Caddyfile, por exemplo: header { X-Weboke-Cursus "<code>" }. Do exterior não é possível ver se algo corre num contentor; por isso, cole também a saída de docker compose ps (não a guardamos).




O que preenche e o que encontramos não ficam guardados. O seu navegador memoriza as suas respostas e se concluiu o exercício com sucesso. Se tiver sessão iniciada, guardamos apenas que concluiu o exercício (quase) com sucesso em Os meus cursos; aí também o pode eliminar.

Para saber mais

Um momento…

Configurar os seus domínios

Para cada domínio, defina os servidores de nomes, a ligação ao seu alojamento e quem fica como titular.

A carregar os seus domínios…