O Speco usa o Invoke como executor de tarefas — um “Makefile” moderno em Python puro. Todas as operações do sistema — subir o ambiente local, provisionar servidores, fazer deploy, construir a documentação — são tarefas Invoke organizadas em namespaces.
A vantagem: um único comando faz o que antes precisava de vários scripts dispersos. E como é Python puro, funciona sem dependências extras.
O ambiente local roda inteiramente em Docker. Você só precisa de Python e Docker na máquina.
Python 3.10+
Docker e docker compose
Git
# 1. Clonar o repositório
git clone ssh://git@git.disroot.org/RedEcovida/speco_dev.git
cd speco_dev
git checkout floatv2
# 2. Criar o ambiente virtual e instalar o Invoke
bash setup_deploy.sh
# 3. Ativar o ambiente virtual
source .venv/bin/activate
# 4. Subir o ambiente (backend + frontend)
inv up
# 5. Instalar dependências e módulos
inv init
# 6. (Opcional) Iniciar Trytond com dados de demonstração
inv dev.trytond-fresh-populated --name speco --scale 1
A partir daqui, o sistema está disponível em http://localhost:8001 (backend) e http://localhost:3000 (frontend).
inv up # Subir backend + frontend
inv down # Parar ambiente
inv init # Instalar dependências e módulos
inv sh # Shell no container
inv dev.trytond # Iniciar Trytond (reutiliza base)
inv dev.trytond-fresh # Base nova sem populate
inv dev.trytond-populated # Base existente + populate
inv dev.trytond-fresh-populated # Base nova + populate
inv dev.docs # Construir documentação Sphinx
inv tests --name speco # Testes de um módulo
inv bdd.run --name speco # BDD de um módulo
O mesmo Invoke que gerencia o ambiente local também provisiona servidores e faz deploy. A diferença é o namespace: cloud.dev.* para operações no VPS, cloud.provision-* para criar o servidor.
Python 3.10+ com venv — apt install python3-venv
Chave SSH autorizada no Forgejo (para clone via SSH)
Token de API do provider de cloud (Hetzner, Linode ou Vultr)
DNS apontando para o servidor
O token permite que o Invoke crie o servidor no seu nome via API.
Provider |
Onde criar o token |
Variável |
|---|---|---|
Hetzner |
console.hetzner.com → Projects → Access → API Tokens |
|
Linode |
cloud.linode.com → Account → API Tokens |
|
Vultr |
my.vultr.com → Settings → API |
|
Exporte o token antes de rodar qualquer comando de provisionamento:
export HETZNER_TOKEN="seu_token"
inv cloud.provision-hetzner --name meu-servidor --location nbg1
# Anotar o IP retornado
Os providers Linode e Vultr também estão disponíveis com cloud.provision-linode e cloud.provision-vultr.
Com o IP do servidor em mãos:
inv cloud.dev.up --host IP_DO_VPS --allowed-hosts portal.ecovida.org.br,float.ecovida.org.br
Isso faz tudo: clone do repositório, instalação do Docker, configuração do ambiente, subida dos containers e atualização do CORS. Em minutos, o sistema está no ar.
Para atualizar um deploy existente, o mesmo comando faz git pull e reinicia os containers.
O Speco usa Caddy como reverse proxy. Caddy obtém e renova certificados TLS via Let’s Encrypt automaticamente — sem certbot, sem cron, sem intervenção manual.
inv cloud.dev.caddy --host IP_DO_VPS \
--frontend-domain portal.ecovida.org.br \
--backend-domain float.ecovida.org.br
Recomendamos usar um único registro A como alias, com CNAMEs apontando para ele. Assim, se o IP mudar, só é preciso atualizar um registro:
devs.ecovida.org.br A 203.0.113.42 ← só este muda
portal.ecovida.org.br CNAME devs.ecovida.org.br
float.ecovida.org.br CNAME devs.ecovida.org.br
Depois do deploy, entre no container e inicialize o banco:
inv cloud.dev.sh --host IP_DO_VPS
# Dentro do container:
inv dev.trytond-fresh-populated # Primeiro uso: base nova + dados
inv cloud.dev.up --host IP --allowed-hosts DOMINIOS # Deploy completo
inv cloud.dev.down --host IP # Parar ambiente
inv cloud.dev.logs --host IP # Ver logs
inv cloud.dev.sh --host IP # Shell no container
inv cloud.dev.restart --host IP # Reiniciar
inv cloud.dev.status --host IP # Status
inv cloud.dev.caddy --host IP --frontend-domain DOM --backend-domain DOM # HTTPS
inv cloud.ssh --host IP # SSH interativo