OpenCode no ROOT

Saudações.

Nesse tutorial vou ensinar como criar um servidor OpenCode 2 para o usuário root, com poderes totais e ilimitados, um tipo de instalação que eu uso em servidores de desenvolvimento e pesquisa mas que deve ser evitada em servidores críticos de produção.

Esse método é o mais simples de todos e o opencode roda como root em um serviço persistente gerido pelo systemd.

Instalando

Instalar o OpenCode no servidor dentro da pasta /root

Bash
# Instalar o OpenCode 2 (o instalador deixa o binario em /root/.opencode/bin)
curl -fsSL https://opencode.ai/v2/install | bash;

# Copiar (nao linkar!)
install -m 755 /root/.opencode/bin/opencode /usr/local/bin/opencode;

Unit no SystemD

Crie a unit do serviço “opencode“:

Bash
# Servico OpenCode raiz (root)
(
echo '[Unit]';
echo 'Description=OpenCode Root';
echo 'After=network-online.target';
echo 'Wants=network-online.target';
echo;
echo '[Service]';
echo 'User=root';
echo 'Group=root';
echo 'WorkingDirectory=/root';
echo 'Environment=HOME=/root';
echo 'EnvironmentFile=/root/.opencode/env';
echo 'ExecStart=/root/.opencode/bin/opencode serve --service --hostname 127.0.0.1';
echo 'Restart=always';
echo 'RestartSec=3';
echo 'KillMode=mixed';
echo 'TimeoutStopSec=20';
echo;
echo '[Install]';
echo 'WantedBy=multi-user.target';
echo;
) > /etc/systemd/system/opencode.service;

Variáveis de ambiente particulares

Deixarei o arquivo /root/.opencode/env disponível para registro de variáveis de ambiente específicas para o processo do OpenCode.

Bash

# Configuracao do provedor/roteador (LiteLLM Proxy, OmniRouter, Manifest, Thinker)
[ -f /root/.thinker-url   ] || \
    echo 'https://thinker.dominio.com' > /root/.thinker-url;

[ -f /root/.thinker-key   ] || \
    echo 'thk_xxxxxxxx' > /root/.thinker-key;

[ -f /root/.thinker-model ] || \
    echo 'auto' > /root/.thinker-model;


# Arquivo para variaveis de ambiente do OpenCode root
if [ -f ~/.opencode/env ]; then
    echo "# ENV ja existe: ~/.opencode/env";

else
    # Ambiente root
    (
        echo 'HOME=/root';
        echo;
        echo 'OPENCODE_PASSWORD=senha-aqui';
        echo;
        echo "THINKER_URL=$(head -1 /root/.thinker-url)";
        echo "THINKER_KEY=$(head -1 /root/.thinker-key)";
        echo "THINKER_MODEL=$(head -1 /root/.thinker-model)";
        echo;
    ) > ~/.opencode/env;
fi;

Personalização de tema TUI

Configuração opcional, apenas para já iniciar com o tema colorido de sua preferência.

Bash
# Personalizacoes visuais em Borg (laranja)
if [ -f ~/.config/opencode/cli.json ]; then
    echo "# CLI ja existe: ~/.config/opencode/cli.json";

else
    (
        echo '{';
        echo '    "$schema": "https://opencode.ai/v2/cli.json",';
        echo '    "theme": {';
        echo '    "name": "luent-orng",';
        echo '    "mode": "dark"';
        echo '  }';
        echo '}';
    ) > ~/.config/opencode/cli.json;
fi;

Configuração principal

Configuração inicial para liberar o agente a trabalhar livremente (perigoso mais proveitoso).

Bash
# Configuracoes ROOT (nao pergunta nada, poder ilimitado)
mkdir -p ~/.opencode/config;
if [ -f /root/.opencode/config/opencode.json ]; then
    echo "# Configuracao ja existe: ~/.opencode/config/opencode.json";
else
    (
        echo '{';
        echo '  "$schema": "https://opencode.ai/config.json",';
        echo '  "permissions": [';
        echo '      { "action": "*", "resource": "*", "effect": "allow" }';
        echo '  ]';
        echo '}';
    ) > ~/.opencode/config/opencode.json;
fi;

Ativando o serviço OpenCode do root

Agora vamos ativar e colocar o comando no PATH natural.

Bash
# Parar instancia iniciada pelo modo cliente
opencode   service stop;

# Registrar novos servicos
systemctl  daemon-reload;

# Ativar servico
systemctl  enable  opencode;

# Parar servico
systemctl  stop    opencode;

# Limpar status anterior
systemctl  reset-failed opencode;

# Colocar pra rodar
systemctl  start   opencode;

# Conferir status
systemctl  status  opencode;

Inspecionar serviço

Comandos para analisar se o serviço está rodando e saudável:

Bash
# Analise dos servicos
systemctl  status opencode --no-pager  -l;

# Analise mais especifica (exemplo watson)
journalctl      -u opencode  -n 100 --no-pager
journalctl      -u opencode  -f;
systemd-analyze verify /etc/systemd/system/opencode.service;

# Conferir processos
ps aux | grep opencode;

# Analise da API
opencode api get /api/info | head -c 200;

Atualizar opencode root

Procedimento/script para atualizar o binário e reiniciar o serviço:

Bash
# Parar o servico
systemctl  stop  opencode;
killall    opencode;

# Upgrade
# - Para ultima versao (versao estavel)
/root/.opencode/bin/opencode upgrade;

# - Ou, para pinar em uma versao especifica
#   garante pinagem em versao escolhida
#-/root/.opencode/bin/opencode upgrade v2.1.1;

# Republicar para todos os usuarios
install -m 755 \
    /root/.opencode/bin/opencode \
    /usr/local/bin/opencode;

# Iniciar servico atualizado
systemctl  start  opencode;

TUI via SSH

Acesso remoto OpenCode por meio de canal SSH com TTY (requer -t para TUI funcionar bem):

Bash
# Abrindo TUI remoto no terminal local (tudo roda 100% no lado servidor)
ssh  -t  -p 22  root@45.255.128.2  'opencode --auto';

.

Terminamos por hoje!

Patrick Brandão, patrickbrandao@gmail.com

“Quem tem poder e hesita em usá-lo demonstra
fraqueza perante seus adversários.“
Autor desconhecido