Upgrade
Dois binários para fazer upgrade: o manager (stack docker-compose) e os edges (um por host). Ambos seguem o mesmo fluxo conceitual: stage dos artefatos novos, swap atômico, fallback para a versão anterior automaticamente se a nova não subir saudável.
TL;DR
Manager:
VER=v0.7.160
gh release download "$VER" --repo ongridio/ongrid \
-p 'ongrid-*-linux-amd64.tar.xz*'
sha256sum -c "ongrid-${VER}-linux-amd64.tar.xz.sha256"
tar xf "ongrid-${VER}-linux-amd64.tar.xz"
cd "ongrid-${VER}-linux-amd64"
sudo ./upgrade.shEdges (todos, em paralelo, da UI):
- Edges → Upgrade all — manager faz push de
MethodFetchPackagea cada edge conectado, cada um baixa o bundle staged dehttps://<manager>/edge/, faz stage, reinicia, faz swap, roda. Falhas auto-roll-back no próximo boot.
Ou para um único edge do shell:
sudo systemctl restart ongrid-edge
# O ExecStartPre roda apply-pending-upgrade.sh que pega qualquer
# bundle staged e aplica antes do novo agent iniciar.O resto desta página explica como tudo isso de fato funciona, para você debugar quando não funciona.
Upgrade do manager: upgrade.sh
upgrade.sh vive em cada tarball de release e é para rodar dentro do tarball mais novo recém-extraído. Assume que já há uma instalação em ${ONGRID_INSTALL_DIR:-/opt/ongrid}/.
Em ordem:
- Preflight. Verifica docker + compose v2, acha o
.envexistente. Aborta se não há. - Determina versão velha vs nova do
.envexistente e do arquivoVERSIONdo tarball novo. Loga ambas — útil para tickets de suporte. docker compose downpara liberar os data volumes para qualquer passo de migração.- Re-assert ownership de data dir sob
${ONGRID_DATA_DIR}/(mysql, prom, loki, tempo, grafana, embeddings, qdrant). Uids de imagem não mudam há tempo mas esse é o único default seguro — re-assert é idempotente. - Re-stage configs do tarball novo em
/opt/ongrid/:docker-compose.yml,prometheus.yml,prometheus-rules.yml,loki-config.yaml,tempo-config.yaml,grafana/,searxng/,nginx.conf,frontier.yaml, os artefatosedge/novos, o arquivoVERSIONnovo..envé preservado —upgrade.shnunca sobrescreve env editado pelo operador. - Carrega imagens docker novas (
ongrid.tar,ongrid-web.tar,frontier.tarse presente). - Bump de
ONGRID_VERSION=no.envpara que o próximo compose-up pegue a nova tag de imagem. docker compose up -dcom o env novo.- Polling em
/healthzpor 60s. - Banner com versão velha → nova, URL Web, comandos úteis de próximo passo.
Se algo falhar antes do passo 8, o operador pode re-rodar após consertar o problema subjacente — upgrade.sh é idempotente. Se o passo 9 falha (/healthz nunca retorna 200), os logs do manager de docker compose logs ongrid vão te dizer o que está quebrado.
Para zero-downtime, rode um setup blue/green com dois hosts de manager atrás de um load balancer; a instalação OSS single-host é breve downtime durante upgrade (~30-60s).
De onde vêm os artefatos de upgrade: make package
Esse é o caminho do operador — como você builda o tarball se você está buildando do source em vez de puxar um release. De um checkout de ongridio/ongrid:
make packageOrdem importa; isto é o que make package faz:
fetch-promtail— baixapromtail-<os>-<arch>.zipda release upstream do Grafana, extrai embin/<os>-<arch>/promtail. Cacheado.fetch-otelcol— idem paraotelcol-contrib.fetch-node-exporter— idem paranode_exporter.fetch-process-exporter— idem paraprocess_exporter.build-edge-all— cross-compilaongrid-edgeparalinux/amd64,linux/arm64,darwin/amd64,darwin/arm64.docker-build— builda a imagemongrid:<version>.docker-build-broker— buildasingchia/frontier:<ver>de$FRONTIER_SRC(ou pula se já está no image store local).docker-build-web— buildaongrid-web:<version>(SPA frontend + nginx).build-edge-bundle— montaedge-bundle-linux-amd64-<ver>.tar.gzdos binários soltos.dist/package.sh— faz stage de tudo emdist/stage/ongrid-<version>-linux-amd64/,docker savedas três imagens,tar.xzda coisa toda, computa o sidecar sha256, coloca emdist/out/.
A saída:
dist/out/ongrid-v0.7.160-linux-amd64.tar.xz
dist/out/ongrid-v0.7.160-linux-amd64.tar.xz.sha256Esse é o artefato que você scp para o host prod e alimenta o ./upgrade.sh.
Modelo RAG offline
O modelo de embedding BGE não é uma dep de package — é lento de fetchar em redes CN, então fica como um passo one-off. Rode make fetch-embedding-model uma vez antes de make package se você quer que ONGRID_EMBEDDING_PROVIDER=local funcione de fábrica em um restore.
Upgrade de edge: stage-then-swap do ADR-024
O caminho do user para fazer upgrade de um edge é "clique Upgrade na UI" ou systemctl restart ongrid-edge depois que um bundle foi staged. O que realmente acontece, de cima a baixo:
1. Manager dispara, edge fetcha
Em "Upgrade all edges" (ou em um único edge):
- Manager lê
dist/out/edge-bundle-<arch>-<ver>.tar.gz.sha256de/opt/ongrid/edge/(colocado lá porinstall.sh/upgrade.sh). - Manager envia
MethodFetchPackage(url=https://<manager>/edge/<bundle>, sha256=<sha>, version=<ver>)pelo tunnel aos edges alvo. - nginx serve os bytes do bundle do mesmo dir
/edge/.
2. Edge faz stage
O edge receptor:
- Baixa o bundle para
/tmp/. - Verifica o sha256 contra o manifesto que o manager mandou.
- Untar para
/var/lib/ongrid-edge/.upgrade/incoming/. - Valida cada linha
<sha> <mode> <src> <dest>deMANIFEST.txt(sha bate, src existe). - Escreve um marker "ready".
- Sai limpo. systemd reinicia a unit conforme
Restart=always.
3. ExecStartPre do systemd roda o swap
A unit vem com:
ExecStartPre=-+/usr/local/lib/ongrid-edge/apply-pending-upgrade.sh
ExecStart=/usr/local/bin/ongrid-edgeO prefixo + roda o hook como root apesar de User=ongrid-edge; o - deixa um script faltante/falhando sair 0 sem bloquear a unit para que o binário pre-upgrade sempre inicie.
apply-pending-upgrade.sh faz, em ordem:
- Modo 1: auto-rollback se um upgrade anterior rodou mas nunca escreveu
healthy_markercasando comlast_upgrade_ver. Restaura cada<dest>.previoussobre<dest>. Limpa o dir de staging. - Modo 2: apply do bundle — para cada linha de
MANIFEST.txt:- re-verifica o sha256,
cp -p $dest $dest.previous(snapshot para rollback),cp $src $dest.newno mesmo filesystem para que o rename final seja POSIX-atômico,chmod $mode $dest.new,mv -f $dest.new $dest.
- Modo 3: apply legacy single-file para back-compat com edges que ainda não foram upgraded por bundle (só o binário do agent, sem manifesto).
- Grava
last_upgrade_atelast_upgrade_verpara o health check do próximo boot.
Então ExecStart=/usr/local/bin/ongrid-edge roda o binário recém-trocado.
4. O novo agent reporta saudável (ou não)
O novo agent, em connect bem-sucedido:
- Escreve
/var/lib/ongrid-edge/.upgrade/healthy_markercom a versão que está rodando. - Reporta
registerpelo tunnel com sua nova versão.
Se esse arquivo existe e casa com last_upgrade_ver pelo próximo boot, apply-pending-upgrade.sh declara sucesso, faz prune de cada .previous para liberar disco, limpa o dir de staging.
Se não (agent crashou, não consegue alcançar manager, qualquer outra coisa), o próximo boot dispara auto-rollback: cada .previous é restaurado, o dir de staging é apagado, o edge roda a versão anterior funcionando de novo. O operador vê isso na UI (o edge continua reportando uma versão "antiga" depois de um upgrade disparado — uma pista que algo está errado com o bundle novo).
Invariantes de bundle
Cada arquivo que o edge troca está no bundle; cada arquivo no bundle é um binário ou script auto-contido. Isso é não-negociável:
- O binário do agent (
ongrid-edge) - Os binários de plugin (
promtail,otelcol-contrib,node_exporter,process_exporter) - O script de hook (
apply-pending-upgrade.sh)
Configs de plugin (promtail.yaml, otelcol.yaml) não estão no bundle — vivem em /etc/ongrid-edge/ e são entregues pelo tunnel como config live. Desse jeito um upgrade do agent não pisa em uma config que o operador editou à mão.
Não asse o bundle de volta na imagem docker
Se você está buildando do source, o bundle é buildado por dist/build-edge-bundle.sh no host no tempo de package, não no container. O ADR-032 impõe isso — re-assar na imagem dobra ~120 MB de bytes incompressíveis e quebra a cadeia de sha.
Onde rollbacks vivem
/usr/local/bin/ongrid-edge # corrente
/usr/local/bin/ongrid-edge.previous # último conhecido bom
/usr/local/lib/ongrid-edge/promtail
/usr/local/lib/ongrid-edge/promtail.previous
...etc.
/var/lib/ongrid-edge/.upgrade/
last_upgrade_at # timestamp ISO
last_upgrade_ver # string de versão
healthy_marker # escrito pelo agent novoUma sequência de boot depois de um upgrade disparado:
boot 1 (pre-upgrade):
apply-pending-upgrade.sh não vê nada staged; exit 0
ongrid-edge v0.7.159 roda
(manager faz push do bundle, edge faz stage, edge sai limpo)
boot 2 (apply):
apply-pending-upgrade.sh
modo 1: sem healthy_marker ainda, mas sem last_upgrade_at também → skip
modo 2: aplica bundle. /usr/local/bin/ongrid-edge.previous = v0.7.159
/usr/local/bin/ongrid-edge = v0.7.160
escreve last_upgrade_at, last_upgrade_ver=v0.7.160
limpa healthy_marker
ongrid-edge v0.7.160 roda
v0.7.160 conecta, escreve healthy_marker=v0.7.160
(reboot, ex.: updates do host)
boot 3 (settle):
apply-pending-upgrade.sh
modo 1: last_upgrade_ver=v0.7.160, healthy_marker=v0.7.160 → sucesso
prune todos os .previous
limpa last_upgrade_at, last_upgrade_ver
ongrid-edge v0.7.160 rodaUm cenário de falha:
boot 2 (apply):
apply-pending-upgrade.sh: aplica bundle como acima
ongrid-edge v0.7.160 crasha imediatamente (ex.: drift de config)
systemd reinicia repetidamente por Restart=always
boot 3 (rollback):
apply-pending-upgrade.sh
modo 1: last_upgrade_ver=v0.7.160, healthy_marker faltante
→ roll back: restaura .previous sobre cada dest
(ongrid-edge.previous → ongrid-edge, etc.)
: > last_upgrade_at, rm -rf incoming/
ongrid-edge v0.7.159 roda de novo (funcionando)Downgrade
Downgrade do manager: extraia o tarball mais antigo, rode ./upgrade.sh dentro dele. Desde que nenhuma migração de schema de DB tenha rolado nas releases intermediárias, isso funciona. Cheque as release notes por qualquer aviso de "breaking schema change" antes de fazer downgrade.
Downgrade de edges: dispare um "upgrade" da UI para a versão de bundle mais antiga. A lógica do manager não se importa com a direção da versão.
O que vem a seguir
- Reference / env — nomes de env vars cujos defaults mudam entre releases.
- Instalação air-gapped — como espelhar artefatos para um webserver privado para que o
apply-pending-upgrade.shainda consiga puxar bundles quando o próprio manager não está na internet.