NixOS: Gestão Declarativa e Reprodutível de Servidores
Neste artigo
1. Introdução ao NixOS
O NixOS é uma distribuição Linux construída sobre o gestor de pacotes Nix. A diferença fundamental face ao Debian, Ubuntu ou CentOS é que toda a configuração do sistema — pacotes, serviços, utilizadores, rede, carregador de arranque — é declarada num único ficheiro configuration.nix.
Esta abordagem declarativa significa que podes reproduzir um servidor completo num outro hardware apenas copiando um ficheiro. Nada de configuração dispersa em dezenas de ficheiros /etc. O estado do sistema está sempre num sítio.
ℹ Reversão Atómica
O NixOS permite reversão atómica — cada alteração cria uma geração nova e podes voltar à anterior com um comando.
O NixOS é particularmente útil para PMEs que precisam de ambientes idênticos em múltiplos servidores, imutabilidade e capacidade de reverter alterações problemáticas sem reinstalar. A documentação oficial é extensa e cobre desde instalação até módulos avançados.
2. Instalação
A instalação do NixOS segue um processo diferente das distribuições tradicionais. Não há instalador gráfico por defeito — faz-se por linha de comandos, o que dá controlo total sobre o particionamento e configuração inicial.
O processo resume-se a: arrancar pelo ISO, particionar o disco manualmente, gerar a configuração base, editar e instalar.
# Arrancar pelo ISO e preparar o disco
sudo parted /dev/sda -- mklabel gpt
sudo parted /dev/sda -- mkpart primary 512MB -8GB
sudo parted /dev/sda -- mkpart primary linux-swap -8GB 100%
sudo mkfs.ext4 -L nixos /dev/sda1
sudo mkswap -L swap /dev/sda2
sudo mount /dev/disk/by-label/nixos /mnt
sudo swapon /dev/sda2
# Gerar configuração inicial
sudo nixos-generate-config --root /mnt
# Editar /mnt/etc/nixos/configuration.nix
# (ver secção seguinte para detalhes)
# Instalar
sudo nixos-install
Após nixos-install terminar, reinicia o sistema e remove o ISO. O novo servidor arranca com a configuração definida.
3. Configuração Declarativa (configuration.nix)
O coração do NixOS é o ficheiro /etc/nixos/configuration.nix. Aqui declaras tudo: carregador de arranque, serviços, utilizadores, rede, firewall, pacotes do sistema. Um exemplo mínimo para um servidor web:
{ config, pkgs, ... }:
{
# Bootloader
boot.loader.grub.device = "/dev/sda";
# Rede
networking.hostName = "srv-web01";
networking.firewall.allowedTCPPorts = [ 80 443 22 ];
# Serviços
services.nginx.enable = true;
services.openssh.enable = true;
# Utilizadores
users.users.admin = {
isNormalUser = true;
extraGroups = [ "wheel" ];
};
# Pacotes do sistema
environment.systemPackages = with pkgs; [
git vim curl htop
];
# Estado do sistema
system.stateVersion = "24.11";
}
Depois de editar, aplica as alterações com um único comando:
# Aplicar a configuração e mudar para a nova geração
sudo nixos-rebuild switch
⚠ Curva de Aprendizagem
A curva de aprendizagem da linguagem Nix é íngreme — recomenda-se testar em VM antes de migrar servidores de produção.
4. Gerações e Reversão
Cada vez que corres nixos-rebuild switch, o NixOS cria uma geração nova. Isto não é um instantâneo, é um perfil completo do sistema — pacotes, configurações, kernel, tudo. Podes listar, mudar e reverter entre gerações.
# Listar gerações do sistema
nix-env --list-generations --profile /nix/var/nix/profiles/system
# Exemplo de saída:
# 1 2026-08-10 10:30:00 (initial)
# 2 2026-08-12 14:20:00 (nginx added)
# 3 2026-08-14 09:15:00 (current)
# Voltar à geração anterior imediatamente
sudo nixos-rebuild switch --rollback
# Actualizar o sistema (canal + rebuild)
sudo nixos-rebuild switch --upgrade
O rollback é atómico: o sistema muda de geração num único passo. Se uma actualização partir um serviço, basta --rollback e o servidor volta ao estado funcional em segundos. Não precisas de reinstalar, restaurar cópias de segurança ou fazer regressões manuais de pacotes.
No arranque (GRUB), as últimas gerações aparecem como entradas seleccionáveis. Mesmo que o sistema não arranque, podes escolher uma geração anterior no menu de arranque.
5. Gestão de Pacotes
O gestor de pacotes Nix oferece três níveis distintos de instalação, consoante a permanência pretendida:
| Método | Comando | Persistência |
|---|---|---|
| Sistema (declarativo) | environment.systemPackages |
Permanente em configuration.nix |
| Utilizador (perfil) | nix-env -iA nixpkgs.git |
Persiste no perfil do utilizador |
| Temporário (consola) | nix-shell -p python3 |
Só dura durante a sessão |
Exemplos práticos:
# Instalar pacote temporário (sem alterar o sistema)
nix-shell -p python3
# Instalar pacote permanente no perfil do utilizador
nix-env -iA nixpkgs.git
# Remover pacote do perfil
nix-env -e git
# Procurar pacotes disponíveis
nix-env -qaP '.*python.*'
# Actualizar todos os pacotes do perfil
nix-env -u '*'
A melhor prática em servidores é usar environment.systemPackages no configuration.nix, mantendo tudo declarativo e reproduzível. Reserva nix-env para estações de trabalho e nix-shell para testes rápidos.
6. NixOS vs Ansible vs Imutáveis
O NixOS não substitui directamente o Ansible — ocupam espaços próximos mas distintos. O NixOS gere o sistema operativo; o Ansible orquestra configuração em múltiplos nós. O Pulumi, por sua vez, foca-se em infra-estrutura na nuvem.
| Característica | NixOS | Ansible | Fedora Silverblue |
|---|---|---|---|
| Abordagem | Declarativa total | Imperativa (passos) | Imutável + rpm-ostree |
| Rollback atómico | Sim, nativo | Não (manual) | Sim, limitado |
| Reprodutibilidade | Total (mesmo binário) | Parcial (depende do estado) | Limitada (camadas) |
| Alvo principal | Servidor completo | Config de múltiplos nós | Ambiente de trabalho imutável |
| Curva de aprendizagem | Alta (linguagem Nix) | Média (YAML) | Baixa (parece Fedora) |
Em PME, o cenário típico é usar NixOS como sistema base nos servidores e Ansible para orquestrar implementações de aplicações. Para infra-estrutura na nuvem, o Pulumi complementa ambos. Quem vem do Linux tradicional deve começar pelo Ansible antes de saltar para NixOS.
7. Erros Comuns e Lista de Verificação
Migrar para NixOS tem armadilhas. Estes são os erros mais frequentes e como evitar cada um:
| Erro | Causa | Solução |
|---|---|---|
| Configuração manual não persiste | Editar ficheiros em /etc directamente | Declarar tudo em configuration.nix |
| Sistema cheio de gerações | Nunca apagar gerações antigas | nix-collect-garbage -d |
| Pacote não encontrado | Canal desactualizado | nix-channel --update |
| Serviço não arranca após rebuild | Sintaxe inválida no .nix | Correr com --check antes |
Lista de verificação antes de migrar para NixOS:
- ✓ Testar NixOS em máquina virtual antes de migrar produção
- ✓ Manter o
configuration.nixem repositório Git - ✓ Documentar cada módulo e opção com comentários
- ✓ Definir
system.stateVersione nunca mudá-lo - ✓ Configurar colecta de lixo periódica:
nix.gc.automatic = true; - ✓ Validar configuração com
nixos-rebuild buildantes deswitch - ✓ Testar reversão numa VM: aplicar, reverter, confirmar
ℹ Primeiros Passos
Começa com uma VM simples: instala o NixOS, configura Nginx e SSH, faz uma alteração e pratica reversão. Em duas horas dominas o fluxo básico.
O NixOS representa uma mudança de paradigma: em vez de configurar servidores manualmente e rezar para que sejam idênticos, declaras o estado pretendido e o sistema garante a reprodutibilidade. Para PME com 3+ servidores, o ganho em consistência e capacidade de reversão compensa a curva de aprendizagem inicial.