Está cansado de clicar em botões numa interface Web para criar um LXC? Gostaria de começar a automatizar as coisas?
A automação é o caminho a seguir, mas saber por onde começar pode ser desafiador. Este guia ajudará a dar os primeiros passos na automação do processo de construção de LXCs no Proxmox.
Pressupostos e Aviso de Responsabilidade
Este é um tópico avançado. Executar algo incorreto PODE resultar em problemas com um LXC no seu sistema ou até mesmo destruir tudo. Dedique tempo para compreender os comandos que estamos a automatizar, verifique cuidadosamente a sintaxe, faça cópias de segurança e tome as precauções necessárias para garantir os melhores resultados para esta operação.
Requisitos
Vamos abordar os requisitos para começar esta jornada. Ao explorar implementações automatizadas, é provável que tenha encontrado o termo “Infraestrutura como Código” (IaC). O IaC tornou-se predominante no mundo DevOps, quando os administradores de servidores precisaram de uma forma fiável de fornecer o que os desenvolvedores necessitavam, sem exigir que estes construíssem os sistemas. Existem várias formas de utilizar frameworks e scripts para implementar coisas. Apenas para mencionar alguns, Jenkins, Ansible, Puppet, Chef, Terraform, e a lista continua. Hoje, vamos reduzir a necessidade dessas ferramentas e frameworks, concentrando-nos apenas em scripts de shell.
Ferramentas Necessárias
Para acompanhar este tutorial, necessitará do seguinte:
- Proxmox totalmente configurado
- Acesso de root ao seu Proxmox
- Familiaridade com a linha de comandos e scripts
Opcional:
- Repositórios Git
- Chaves SSH
O Objetivo
O objetivo deste tutorial/artigo é implementar um LXC completo, utilizando uma imagem LXC Debian 11 completamente atualizada, com uma instalação básica de software e, neste caso, a configuração de um servidor proxy reverso denominado Caddy. O Caddy funcionará como um servidor proxy reverso para o meu domínio e será configurado com certificados Cloudflare desde o início.
Estrutura de Ficheiros
Antes de começarmos, é importante compreender que realizaremos todas as ações através da linha de comandos, sem a interface gráfica. Se preferir, pode criar esses scripts num computador remoto utilizando o seu IDE preferido (que tal o VSCode?), e, em seguida, fazer upload para o servidor Proxmox.
Primeiramente, vamos criar um novo diretório para o nosso projeto e outro para armazenar os nossos segredos. Pretendo transformar isto num repositório Git e não quero que as chaves fiquem nos meus scripts ou sincronizadas com um servidor Git.
Vamos criar os nossos dois diretórios num diretório base sob a raiz (root
):
mkdir -p /root/deploy_scripts/caddy
mkdir -p /root/deploy_scripts/secrets
Configuração de Segredos
Vamos começar com o nosso ficheiro de configuração de segredos. Este será um script bash simples que fornecerá os nossos segredos a outros scripts bash.
#!/bin/bash
export ROOT_PASS=SUPER_53CRET4_P4$$WORD!
Está feito. Simples, não é verdade? Isto cria uma variável de ambiente chamada “ROOT_PASS” com o valor definido de uma senha para utilização posterior. O meu ficheiro de segredos tem muitos mais segredos, como a chave de autenticação do Tailscale, credenciais de base de dados e outras informações para várias LXCs que utilizo para este fim.
Compreensão do Fluxo
Estamos a criar alguns ficheiros aqui, alguns para configuração, outros para execução. Aqui está uma visão geral bastante abrangente do processo.
O script build_vm.sh irá criar um LXC no host Proxmox e copiar alguns ficheiros.
- Para o antigo LXC.
- Destroi o antigo LXC.
- Cria um novo LXC.
- Edita os ficheiros de configuração do LXC no Proxmox para permitir o tunelamento.
- Copia ficheiros para o LXC para serem executados dentro do container.
O script software.sh será executado dentro do LXC para configurar o software.
- Atualiza todos os pacotes.
- Adiciona o repositório do Caddy.
- Instala o Caddy.
- Instala regras UFW para o servidor proxy reverso.
Script build_vm
Este primeiro script será executado no próprio servidor Proxmox para criar o LXC.
Carregando e Definindo mais variáveis
Vamos começar um novo script e chamá-lo de build_vm.sh. As primeiras linhas do nosso script simplesmente definem variáveis de ambiente. Note que essas configurações funcionam para o meu sistema; o seu sistema/rede pode ser diferente. Vá em frente e inicie o seu script com estas linhas.
# carrega os nossos segredos do ficheiro que fizemos anteriormente
source ../secrets/secrets.sh
# nosso ID de container, número de núcleos, configuração de IP, tamanho do disco rígido (em GB), nome do LXC e ponte de rede a ser utilizada.
CT_ID=202
CORES=2
MEM=128
IP=192.168.2.145
GW=192.168.2.1
HD=2
NAME=caddy
BRIDGE=vmbr0
Removendo containers antigos
Esta linha abaixo utiliza o pct (um script auxiliar do Proxmox) para parar qualquer container que possa estar em execução no ID 202 e, em seguida, destruí-lo.
echo "Parando o container antigo"
pct stop $CT_ID
echo "A aguardar 2 segundos para o container encerrar"
sleep 2
echo "Eliminando o container antigo"
pct destroy $CT_ID
Construindo um novo container
Adicione o seguinte ao seu script, isto está realmente a criar o novo LXC Debian 11.
echo "Construindo novo container"
pct create $CT_ID /var/lib/vz/template/cache/debian-11-standard_11.3-1_amd64.tar.zst \
--cores $CORES \
--hostname $NAME \
--memory $MEM \
--net0 name=eth0,bridge=$BRIDGE,firewall=1,gw=$GW,ip=$IP/24,type=veth \
--storage local-lvm \
--rootfs local-lvm:$HD \
--unprivileged 1 \
--features keyctl=1,nesting=1,fuse=1 \
--ostype debian \
--password=$ROOT_PASS \
--start 1 \
--onboot 1 \
--ssh-public-keys /root/.ssh/authorized_keys
Explicação do código acima:
A maior parte do código é dedicada à definição e execução de comandos no ambiente Proxmox para criar, configurar e copiar ficheiros para o container LXC.
Nota sobre segurança: O código faz uso de ficheiros de segredos para proteger informações sensíveis, como senhas. Estes ficheiros são carregados e utilizados, mas são removidos após o uso para manter a segurança.
Ativar Funcionalidades Específicas:
A linha --features keyctl=1,nesting=1,fuse=1 \
ativa funcionalidades específicas do LXC que podem ser necessárias para outras aplicações. Essas funcionalidades são definidas pelo utilizador, dependendo dos requisitos do sistema.
Permitir Tunelamento:
Se for necessário suporte para tunelamento no LXC (por exemplo, tailscale, zerotier, wireguard), são adicionadas configurações ao ficheiro de configuração do LXC para permitir o tunelamento.
# Permitir Tunelamento
echo "lxc.cgroup2.devices.allow: c 10:200 rwm" >> /etc/pve/lxc/$CT_ID.conf
echo "lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file" >> /etc/pve/lxc/$CT_ID.conf
Reiniciar o LXC para Aplicar o Tunelamento:
Após permitir o tunelamento, o LXC é reiniciado para aplicar as alterações.
# Reiniciar para permitir o tunelamento
echo "Reiniciando $CT_ID"
pct reboot $CT_ID
sleep 3
Copiar Ficheiros para o LXC:
Utilizando o script PCT, alguns ficheiros são copiados para o LXC, incluindo scripts de software e ficheiros de segredos.
# Copiar scripts/software secretos PARA dentro do LXC via comando PCT push
pct push $CT_ID /root/deploy_scripts/caddy/software.sh /root/software.sh
pct push $CT_ID /root/deploy_scripts/secrets/secrets.sh /root/secrets.sh
# Executar o comando chmod dentro do LXC para tornar os ficheiros .sh executáveis
pct exec $CT_ID chmod +x /root/software.sh
pct exec $CT_ID chmod +x /root/secrets.sh
# Executar o ficheiro software.sh dentro do LXC para executar processos de instalação e outros.
pct exec $CT_ID /root/software.sh
# Baixar o certificado de origem do Cloudflare para o seu domínio e guardá-lo em /root/deploy_scripts/caddy/certs/
# Copiar certificados SSL via PCT push
pct push $CT_ID /root/deploy_scripts/caddy/certs/cert.pem /etc/ssl/cert.pem
pct push $CT_ID /root/deploy_scripts/caddy/certs/key.pem /etc/ssl/key.pem
Caddyfile:
O Caddyfile é um arquivo de configuração específico do Caddy. Ele é copiado para dentro do LXC e fornece instruções sobre como o Caddy deve manipular as solicitações HTTP.
O ficheiro Caddyfile, localizado em /root/deploy_scripts/caddy/Caddyfile:
*.homeserver.pt {
# Certificados de origem Cloudflare
tls /etc/ssl/cert.pem /etc/ssl/key.pem
@test host test.homeserver.pt
handle @test {
reverse_proxy 192.168.2.100:80
}
handle {
respond "Desculpe, mas não encontramos nada para este subdomínio. Verifique a URL e tente novamente."
}
}
}
# Finalmente, copiar o Caddyfile
pct push $CT_ID Caddyfile /etc/caddy/Caddyfile
# Reiniciar o LXC pela última vez para que os serviços iniciem e possamos garantir que tudo funciona.
pct reboot $CT_ID
Conclusão da Primeira Parte:
A primeira parte do script cria o LXC, configura tunelamento, copia scripts e ficheiros de configuração para o LXC e reinicia o LXC para aplicar as alterações. O próximo passo será criar e executar um script de software dentro do LXC para realizar atualizações, instalações e configurações adicionais.
Atualizações de Software, Instalação e Outras Configurações Dentro do Container
Agora chegamos à parte divertida. Vamos criar outro script em /root/deploy_scripts/caddy/software.sh. Vou comentar abaixo para explicar enquanto lemos o script.
#!/bin/bash
# Carregar as variáveis de ambiente e eliminar o ficheiro por razões de segurança
source /root/secrets.sh
rm -f /root/secrets.sh
### Atualizar, fazer upgrade e instalar pacotes básicos que utilizo regularmente.
apt update
apt upgrade -y
apt install sudo curl wget psmisc fail2ban ca-certificates gnupg lsb-release ufw -y
# Instruções de instalação do Caddy
apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-stable.list
# Outra atualização para o apt
apt update
# Instalação do Caddy
apt install caddy -y
# Regras UFW para um proxy reverso, permitindo tailcale e rede local
ufw allow from 101.45.0.0/10 proto tcp to any
ufw allow from 192.168.2.0/24 proto tcp to any
# Permitir todo o resto para 80/443
ufw allow 80/tcp
ufw allow 443/tcp
# Iniciar o UFW
ufw enable
Este script executa uma série de comandos para atualizar, instalar pacotes e configurar o Caddy, bem como regras UFW para permitir tráfego específico. Certifique-se de ajustar essas configurações conforme necessário para o seu ambiente. Se precisar de mais alguma alteração ou explicação, estou à disposição.
Conclusão
Agora temos vários ficheiros prontos para serem copiados e executados no servidor Proxmox. Copie os seus ficheiros e siga os seguintes passos:
cd /root/deploy_scripts/caddy
./build_vm.sh
Isto irá criar um novo container (ID 202), instalar todo o software necessário e configurar um servidor proxy reverso.