Pular para o conteúdo
Docker

Project NOMAD: seu servidor offline de emergência

A tela do Command Center do Project NOMAD, com o logotipo em forma de caixa no topo e os cartões Maps, Easy Setup, Supply Depot, Docs e Settings

Olá meus Unicórnios! 🦄✨

Semana passada faltou luz aqui por quase cinco horas. 😅 O celular tinha bateria, o notebook também, mas a internet foi embora junto com a energia do poste, e eu me peguei no escuro tentando lembrar de uma coisa boba: quanto tempo se ferve água para esterilizar de verdade? 💧

Eu sei a resposta. Todo mundo sabe que é "uns minutinhos". Mas na hora, sem conseguir confirmar em lugar nenhum, aquilo me incomodou de um jeito difícil de explicar. Nós terceirizamos a memória inteira para uma caixinha que depende de fibra ótica e de um data center em outro continente. 🌎

Foi procurando sobre isso que encontrei o Project NOMAD. E ele resolve exatamente esse incômodo: é um servidor que guarda a Wikipédia inteira, mapas do mundo, cursos escolares e até uma IA, tudo dentro de uma máquina sua, funcionando com o cabo de rede arrancado da parede. 🔌

Neste artigo eu instalo ele do zero numa VPS Ubuntu, mostro cada tela e, no fim, corto a internet da máquina de propósito para ver se a promessa é verdadeira.

🧭 O que é o Project NOMAD

O nome é uma sigla: Node for Offline Media, Archives, and Data. Em português, algo como "nó para mídia, arquivos e dados offline". É um projeto de código aberto da Crosstalk Solutions, e a proposta cabe numa frase: conhecimento que nunca sai do ar.

Na prática, o NOMAD não é um programa só. Ele é um painel de controle (que o projeto chama de Command Center) que sabe instalar, configurar e atualizar um monte de ferramentas conhecidas, cada uma dentro do seu próprio contêiner Docker.

Esta é a tela inicial dele, recém-instalado:

A tela inicial do Command Center do Project NOMAD, com o logotipo em forma de caixa no topo e os cartões Maps, Easy Setup, Supply Depot, Docs e Settings

Repare que não há tela de login. Voltarei nisso, porque é a coisa mais importante do artigo. 🔐

🌍 Por que ter tudo offline importa

É fácil achar que isso é assunto de quem se prepara para o fim do mundo. 🧟 Não é. Eu levei um tempo para entender que "offline" aqui não é sobre catástrofe, é sobre não depender de ninguém para lembrar.

Pense em quantas coisas somem juntas quando a conexão cai:

  • Toda referência médica. Dosagem, primeiros socorros, o que fazer numa queimadura. Você sabe pesquisar, mas não sabe de cor.
  • Todo mapa. O aplicativo de mapas até guarda um pedacinho, e só o pedacinho por onde você já passou.
  • Todo material de estudo. Se tem criança em casa e a escola manda "assista a videoaula", acabou.
  • Toda a Wikipédia. Seis milhões de artigos que existem exatamente enquanto a fibra existir.

E não precisa de apocalipse para isso acontecer. Precisa de uma chuva forte, de um sítio sem sinal, de um barco, de uma viagem, de uma escola rural, de uma operadora com problema. O NOMAD é a resposta para "e se eu simplesmente guardasse tudo isso comigo?". 📦

🎁 O que vem dentro

O catálogo do NOMAD junta ferramentas que já eram boas sozinhas. O mérito dele é fazer todas funcionarem juntas sem você configurar nada:

  • Biblioteca de Informação (Kiwix): a Wikipédia offline, mais referências médicas, guias de reparo e livros do Projeto Gutenberg.
  • Plataforma de Educação (Kolibri): cursos do Khan Academy, exercícios e acompanhamento de progresso, com vários usuários.
  • Assistente de IA (Ollama + Qdrant): conversa com um modelo rodando na sua máquina, e ainda deixa você enviar documentos para ele consultar.
  • Mapas offline (ProtoMaps): regiões do mundo baixadas para ver e buscar sem rede.
  • Ferramentas de dados (CyberChef): o canivete suíço de codificação, criptografia e análise.
  • Notas (FlatNotes): anotações em markdown, guardadas localmente.
  • Supply Depot: um catálogo de aplicativos que instala com um clique, e aceita contêiner Docker seu também.

🖥️ O que você precisa para instalar

Eu instalei numa VPS Ubuntu 24.04 com 4 núcleos, 7,8 GB de RAM e 96 GB de disco. O projeto pede, no mínimo:

  • Processador de 2 GHz com dois núcleos
  • 4 GB de memória RAM
  • 5 GB de disco livre (só para o painel)
  • Sistema baseado em Debian (Ubuntu 24.04 serve)
  • Internet durante a instalação

Esse "5 GB" é só o painel. Quem come disco é o conteúdo que você escolher depois, e a diferença é brutal: a Wikipédia vai de 331 MB a 121 GB, dependendo da versão. 😳

⚡ Instalando com um comando

Entre na sua VPS por SSH. Se você nunca fez isso, o comando é este, trocando o endereço pelo IP da sua máquina:

ssh root@SEU_IP_AQUI

Ele vai pedir a senha. Enquanto você digita nada aparece na tela, nem asterisco: é assim mesmo, o terminal esconde a senha inteira. Digite e aperte Enter.

Já dentro da VPS, o instalador é este bloco. Copie tudo de uma vez, incluindo as barras invertidas no fim das linhas (elas dizem ao terminal que o comando continua embaixo):

sudo apt-get update && \
sudo apt-get install -y curl && \
curl -fsSL https://raw.githubusercontent.com/Crosstalk-Solutions/project-nomad/refs/heads/main/install/install_nomad.sh \
  -o install_nomad.sh && \
sudo bash install_nomad.sh

Para colar no terminal, atenção: Ctrl+V não funciona. No terminal do Linux o atalho é Ctrl+Shift+V, ou o botão direito do mouse. Esse detalhe bobo trava todo mundo na primeira vez. 😅

Lendo o que esse comando faz, linha por linha: o apt-get update atualiza a lista de programas disponíveis; o apt-get install -y curl instala o curl, que é quem baixa arquivos (o -y responde "sim" às perguntas antes de elas aparecerem); o curl -fsSL ... -o install_nomad.sh baixa o instalador e salva com esse nome; e o sudo bash install_nomad.sh executa.

As duas perguntas que ele faz

O instalador para duas vezes esperando você. A primeira é um aviso de que ele pode sobrescrever configuração existente, e a segunda é o aceite da licença. Nas duas, responda y e Enter.

Depois disso ele trabalha sozinho por alguns minutos: instala o Docker se não houver, cria a pasta /opt/project-nomad, baixa o arquivo de composição dos contêineres, gera as senhas internas do banco e sobe tudo. O fim da saída é assim:

# Management containers started successfully.

# GPU Setup Verification
===========================================
No NVIDIA GPU detected (nvidia-smi not available)
NVIDIA Container Toolkit not installed
Docker NVIDIA runtime not detected
===========================================

# GPU acceleration not detected. The AI Assistant will run in CPU-only mode.

# Project NOMAD installation completed successfully!

# Installation files are located at /opt/project-nomad

Aquele aviso de GPU não é erro. Ele só está dizendo que não achou placa de vídeo e que a IA, se você instalar, vai rodar no processador.

Conferindo que subiu

Seis contêineres têm de aparecer. Este comando lista os que estão de pé, mostrando nome e estado:

docker ps --format '{{.Names}}\t{{.Status}}'

A saída aqui foi esta:

nomad_admin             Up 21 minutes (healthy)
nomad_redis             Up 22 minutes (healthy)
nomad_mysql             Up 22 minutes (healthy)
nomad_dozzle            Up 22 minutes
nomad_updater           Up 22 minutes
nomad_disk_collector    Up 22 minutes

Cada um tem um papel: o admin é o painel em si, o mysql guarda as configurações, o redis cuida das filas de download, o dozzle mostra os registros de log numa tela, o updater atualiza o próprio painel, e o disk_collector lê o espaço em disco da máquina.

E o teste definitivo, que pergunta ao painel se ele está saudável:

curl -s http://localhost:8080/api/health
{"status":"ok"}

Pronto. Agora abra http://SEU_IP_AQUI:8080 no navegador. 🎉

🚪 A porta 8080, e o que fazer se ela estiver ocupada

O NOMAD atende na porta 8080, e o painel de logs na 9999. Se a sua máquina já usa a 8080 para outra coisa, o painel não sobe, e a mensagem de erro do Docker não é nada óbvia.

Antes de instalar, veja quem está usando a porta:

ss -ltn | grep :8080

Se não sair nada, está livre. Se sair alguma linha, você precisa trocar a porta do NOMAD, e o lugar é o arquivo /opt/project-nomad/compose.yml. Abra com o nano, que é o editor de texto mais simples do Linux:

nano /opt/project-nomad/compose.yml

Procure o trecho "8080:8080" e troque só o número da esquerda, que é a porta de fora:

    ports:
      - "9080:8080"

Esse detalhe é o que mais confunde. O número da esquerda é a porta na sua máquina; o da direita é a porta dentro do contêiner, e essa nunca se mexe, porque o programa lá dentro só sabe escutar na 8080. Trocar o da direita quebra tudo.

No nano, para salvar: Ctrl+O, Enter para confirmar o nome, e Ctrl+X para sair. Aqueles símbolos ^O no rodapé da tela querem dizer Ctrl mais a letra.

Para valer a mudança:

cd /opt/project-nomad && docker compose -p project-nomad up -d

🔓 A parte séria: ele não tem senha

Preciso parar o tutorial aqui, porque essa é a parte que ninguém pode pular. 🙏

O Project NOMAD não tem autenticação. Não é bug nem versão incompleta: é decisão declarada do projeto, que foi desenhado para ser aberto e sem obstáculos dentro da rede da sua casa.

Agora pense no que isso significa numa VPS, que tem IP público. Quem chegar na porta 8080 tem controle total: pode ver tudo, apagar conteúdo, mudar configuração e, o pior de tudo, instalar contêineres Docker novos. Como o painel conversa com o Docker da máquina, isso é praticamente o mesmo que ter a máquina inteira. 😰

O próprio projeto diz, com todas as letras, que o NOMAD não foi feito para ficar exposto na internet. Então:

  • Numa VPS, feche a porta no firewall e entre por uma VPN. Se for só você, o caminho mais simples é um túnel SSH (o ssh -L 8080:localhost:8080 root@SEU_IP_AQUI abre o painel no seu localhost sem abrir nada para o mundo).
  • Em casa, deixe na rede local e nunca redirecione a porta no roteador.

Eu diria que o lugar natural do NOMAD é mesmo uma máquina na sua casa, não uma VPS. Usei a VPS aqui porque é onde eu consigo mostrar a instalação inteira para vocês, do zero. 🏠

📚 Escolhendo o conteúdo

Com o painel no ar, o passeio começa pelo Content Explorer. É aqui que mora a decisão mais importante da instalação, e ela é sobre disco:

A tela Content Explorer mostrando as cinco versões da Wikipédia lado a lado, de Quick Reference com 331 MB até Complete Wikipedia Full com 121,1 GB

Repare na escada de tamanhos, porque ela é a melhor coisa do projeto:

  • Quick Reference, 331 MB. Os 100 mil artigos mais acessados, com pouca imagem. Cabe num pendrive.
  • Popular Articles, 2,2 GB. Os artigos populares sem imagem nenhuma.
  • Complete (Compact), 12,2 GB. Os mais de 6 milhões de artigos, em formato condensado.
  • Complete (No Images), 51,5 GB. Tudo, sem imagem.
  • Complete (Full), 121,1 GB. Tudo mesmo, com imagens e mídia.

Achei essa escolha muito acertada. A diferença entre 331 MB e 121 GB não é de "qualidade": é de propósito. Para responder "quanto tempo se ferve água", o pacote de 331 MB resolve, e cabe até num cartão de memória velho. 💾

🛒 O Supply Depot, e instalando algo de verdade

O Supply Depot é a loja de aplicativos do NOMAD. São 15 opções, e cada cartão já mostra a porta em que aquele aplicativo vai atender:

A tela Supply Depot com 15 aplicativos disponíveis em cartões, mostrando Information Library na porta 8090, Education Platform na 8310 e Data Tools na 8100

Vamos instalar um. Cliquei no Install do Data Tools, e apareceu esta confirmação:

Janela de confirmação escrito Install Data Tools, avisando que vai baixar e iniciar o Data Tools na porta 8100

Essa telinha é mais útil do que parece: ela avisa a porta antes de instalar. Se a porta 8100 já estivesse ocupada na sua máquina, é aqui que você descobre, e não depois com um contêiner quebrado.

Instalei também a Biblioteca de Informação, e em pouco mais de um minuto os dois estavam rodando:

O Supply Depot mostrando Installed (2) com os cartões Information Library na porta 8090 e Data Tools na 8100, ambos com a marcação verde Running

Do lado do sistema, é só mais um contêiner Docker, com a porta mapeada exatamente como o painel prometeu:

nomad_kiwix_server    0.0.0.0:8090->8080/tcp
nomad_cyberchef       0.0.0.0:8100->80/tcp

E o melhor: a biblioteca já vem com um pacote pequeno da Wikipédia dentro, de 4,3 MB, para você não abrir uma tela vazia. Dá para ver na tela de Content Manager:

A tela Content Manager listando o arquivo wikipedia_en_100_mini_2026-01.zim com 4,3 MB e um botão Delete

Abrindo a porta 8090, é a Wikipédia de verdade, com imagens, rodando dentro da máquina:

A Wikipédia offline aberta no navegador, mostrando um mosaico de artigos com fotos: presidentes dos Estados Unidos, animais, Antártica, Shakespeare e Michael Jackson

Eu confesso que dei um sorriso bobo nessa hora. 🥹 É a Wikipédia, com foto, saindo de um arquivo de 4,3 MB parado num disco.

E o CyberChef, na 8100, com as 476 operações de codificação e criptografia dele:

A interface do CyberChef com a lista de operações à esquerda, os painéis Recipe, Input e Output, e o botão verde BAKE

🗺️ Os mapas, e a armadilha dos 128 GB

A tela de mapas tem uma pegadinha que eu quase caí. Olhe o aviso de cima:

A tela Maps Manager com o aviso de que o mapa global tem 128,6 GB e um botão Download Global Map, e abaixo a opção de baixar por país com o botão Choose Countries

Um botão convidativo escrito Download Global Map, e do lado o tamanho: 128,6 GB. O disco desta VPS tem 96 GB no total, com 23 GB já usados. Ou seja: esse botão não cabe aqui de jeito nenhum, e clicar nele seria baixar dezenas de gigabytes até o disco encher no meio do caminho. 😬

A saída está logo embaixo, no Choose Countries: em vez do planeta inteiro, você escolhe os países e ele recorta só aqueles pedaços do arquivo mundial. Para quem quer o Brasil, é a diferença entre alguns gigabytes e um disco inteiro.

📊 O benchmark, e o que ele mede

O NOMAD tem uma tela de Benchmark que dá uma nota para a sua máquina e permite comparar com a comunidade. Rodei a versão só de sistema, que leva alguns minutos:

A tela System Benchmark mostrando a nota 44,1 de 100 com a etiqueta PARTIAL e o aviso de que resultados parciais não podem ser compartilhados com a comunidade

Nota 44,1 de 100, marcada como PARTIAL. Essa etiqueta é honesta: como eu não instalei o assistente de IA, ele não mediu a parte de inferência e avisa que isso não é a nota completa nem pode ir para o ranking.

Rolando a tela, vem o detalhe por componente, que é onde está a informação útil:

O detalhe do benchmark com quatro medidores: CPU 53 por cento, memória 63 por cento, leitura de disco 18 por cento e escrita de disco 18 por cento, e abaixo o hardware com processador AMD EPYC de 4 núcleos, 7,8 GB de RAM e GPU não detectada

Processador 53%, memória 63%, e o disco em 18% na leitura e na escrita. Esse 18% vermelho conta uma história: disco de VPS compartilhada é lento, e isso é exatamente o que mais importa quando você vai servir arquivos grandes de Wikipédia e de mapa. Uma máquina com SSD local teria um número bem melhor aí.

E a tela de System mostra o consumo ao vivo, atualizando a cada 30 segundos:

A tela System Information com três medidores circulares: uso de CPU em 62 por cento, uso de memória em 52 por cento com 4,02 GB de 7,76 GB, e swap em zero

🔌 A hora da verdade: arrancando a internet

Chegamos no que eu realmente queria testar. Todo mundo diz que é offline. Eu quis ver.

Então bloqueei na máquina a saída para o endereço que o próprio NOMAD usa para testar se tem internet, e pedi as três coisas de volta: o painel, a Wikipédia e o CyberChef.

# bloqueia a saida para o teste de conectividade
iptables -I OUTPUT -d 1.1.1.1 -j DROP
iptables -I DOCKER-USER -d 1.1.1.1 -j DROP

# agora pergunta para cada servico se ele ainda responde
curl -s -o /dev/null -w "internet:   %{http_code}\n" https://1.1.1.1/cdn-cgi/trace
curl -s -o /dev/null -w "NOMAD:      %{http_code}\n" http://localhost:8080/home
curl -s -o /dev/null -w "Wikipedia:  %{http_code}\n" http://localhost:8090/viewer
curl -s -o /dev/null -w "CyberChef:  %{http_code}\n" http://localhost:8100/

O -o /dev/null joga fora o conteúdo da página, porque aqui só interessa o número da resposta; o -w "%{http_code}" é quem imprime esse número. E 200 quer dizer "respondi normalmente".

O resultado:

internet:   sem resposta
NOMAD:      200
Wikipedia:  200
CyberChef:  200

A internet sumiu e nada mais se mexeu. 🎯 A Wikipédia continuou abrindo, o painel continuou desenhando, as ferramentas continuaram funcionando. Isso é a coisa toda: o conhecimento estava ali, no disco, desde sempre.

Depois do teste, é importante remover as regras, senão a máquina fica com esse bloqueio para sempre:

iptables -D OUTPUT -d 1.1.1.1 -j DROP
iptables -D DOCKER-USER -d 1.1.1.1 -j DROP

O -I insere a regra e o -D apaga, e é preciso repetir a regra inteirinha, igual, para ele saber qual apagar. 🧹

🛠️ Os comandos do dia a dia

O instalador deixa três atalhos prontos na pasta /opt/project-nomad, e eles são a forma certa de mexer no NOMAD:

/opt/project-nomad/start_nomad.sh     # liga
/opt/project-nomad/stop_nomad.sh      # desliga
/opt/project-nomad/update_nomad.sh    # atualiza

Você não precisa ligar depois de reiniciar a máquina: os contêineres sobem sozinhos, porque estão marcados como restart: unless-stopped. Isso quer dizer "sobe sempre, menos se eu tiver desligado de propósito".

E, muito importante, onde ficam os seus dados:

/opt/project-nomad/storage    # Wikipedia, mapas, modelos de IA, notas
/opt/project-nomad/mysql      # as configuracoes do painel

Essa é a pasta que você copia se quiser fazer backup ou mudar de máquina. Tudo o que você baixou em horas de download mora ali.

🤔 Para quem isto serve de verdade

Terminada a instalação, ficou claro para mim que o NOMAD não é um brinquedo de quem gosta de Docker. Ele resolve problema concreto de gente bem diferente:

  • Escola sem internet boa. O Kolibri com o Khan Academy inteiro, servindo a sala toda por um Wi-Fi local que não vai a lugar nenhum.
  • Sítio, barco, lugar remoto. Mapas da região e referência médica, que é justamente onde o socorro demora.
  • Quem quer privacidade. A IA responde sem mandar sua pergunta para a nuvem de ninguém.
  • Quem só não gosta de depender. Esse sou eu, depois de cinco horas no escuro. 🕯️

O que me conquistou foi a honestidade do projeto em dois pontos: ele mostra o tamanho real de cada download antes de você clicar, e declara sem rodeios que não tem autenticação, em vez de fingir uma segurança que não existe.

Por hoje é só, meus unicórnios! 🦄✨

Que a magia do arco-íris continue brilhando em suas vidas! Até mais! 🌈🌟

Perguntas frequentes

O Project NOMAD é gratuito?
É gratuito e de código aberto. Você paga só o hardware ou a VPS onde ele roda. Não há licença, assinatura nem limite de uso, e o projeto declara zero telemetria.
Preciso de internet para usar?
Só para instalar e para baixar os conteúdos que você escolher. Depois disso ele funciona desconectado: bloqueei a saída de internet da máquina e o painel, a Wikipédia offline e as ferramentas continuaram respondendo 200 normalmente.
Quanto de disco a Wikipédia completa ocupa?
Depende da versão. São cinco tamanhos: 331 MB (100 mil artigos), 2,2 GB (artigos populares sem imagem), 12,2 GB (tudo em formato condensado), 51,5 GB (tudo sem imagens) e 121,1 GB (a experiência completa, com imagens e mídia).
Dá para rodar numa VPS pequena?
O painel em si é leve: o mínimo pedido é 2 núcleos, 4 GB de RAM e 5 GB de disco. Quem come recurso é o que você instala em cima. A IA local sem placa de vídeo roda em modo CPU, e aí fica lenta.
O NOMAD tem senha de acesso?
Não tem, e isso é uma decisão declarada do projeto: ele nasceu para ser aberto e sem obstáculos na rede local. A consequência é séria: quem alcança a porta 8080 tem controle total, inclusive de instalar contêineres. Proteja por firewall ou VPN.
Por que o mapa global não cabe no meu disco?
Porque o mapa mundial do ProtoMaps tem 128,6 GB, e num disco de 96 GB ele simplesmente não entra. A saída é o botão Choose Countries, que baixa só os blocos dos países que você escolher.

Leia também