NixOS: Gestão Declarativa e Reprodutível de Servidores

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.nix em repositório Git
  • ✓ Documentar cada módulo e opção com comentários
  • ✓ Definir system.stateVersion e nunca mudá-lo
  • ✓ Configurar colecta de lixo periódica: nix.gc.automatic = true;
  • ✓ Validar configuração com nixos-rebuild build antes de switch
  • ✓ 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.