Programadores → Guias

Implante um app com git push

Um App Server NameOcean é um servidor Linux com o seu projeto em um repositório git. Você faz o push e ele roda. Este guia leva um app Flask do primeiro push até o seu próprio domínio com HTTPS; Django, Node.js e Next.js diferem em apenas uma linha.

Como as requisições chegam ao seu app

caminho da requisição
visitor ──HTTPS:443──▶ NameOcean load balancer ──HTTP:80──▶ nginx ──▶ your app on 127.0.0.1:8000

O balanceador de carga guarda os certificados, então o servidor atende apenas a porta 80. O seu app escuta em 127.0.0.1:8000 sob o supervisor, e o nginx repassa as requisições para ele.

1. Um servidor e a sua chave SSH

nameocean
$ nameocean servers plans
$ nameocean servers create --plan starter --yes
$ nameocean servers ls
ID   NAME      STATUS   PLAN     DEFAULT DOMAIN          DOMAINS
812  3f9a1c2e  running  starter  3f9a1c2e.nameocean.org  -
$ nameocean servers ssh-keys add 3f9a1c2e

Um servidor é cobrado mensalmente; servers create sem --yes apenas mostra o preço. Você também pode criá-lo em Painel → Hospedagem. ssh-keys add instala ~/.ssh/id_ed25519.pub, que o git usa para fazer o push.

2. O projeto

app.py
import os

from flask import Flask

app = Flask(__name__)


@app.get("/")
def home():
    return f"Hello from {os.environ.get('SITE_NAME', 'NameOcean')}"
requirements.txt
flask
gunicorn
.nameocean/deploy.sh
#!/bin/bash
# runs on the server after every push, in /root/app, with your env variables
set -e
pip install -r requirements.txt

O deploy.sh é onde ficam as etapas de build: instalação de pacotes, migrações, npm run build. A saída dele aparece no seu terminal quando você faz o push.

3. Primeira implantação

nameocean
$ git add . && git commit -m "First deploy"
$ nameocean deploy 3f9a1c2e

nameocean deploy adiciona um remote git chamado nameocean, envia o branch atual para /root/app no servidor (a partir daí o servidor implanta esse branch), envia-o também para o seu próprio origin e reinicia os apps.

4. Execute (uma vez)

Indique ao supervisor como iniciar o app e ao nginx como repassar as requisições para ele. Os dois arquivos estão no servidor com exemplos para cada stack; basta descomentar.

ssh
$ nameocean servers info 3f9a1c2e   # the ssh line
$ ssh -p 2152 root@3f9a1c2e.nameocean.org
# vi /root/conf/supervisor.conf   # uncomment the Flask [program:app] and the shared settings
# supervisorctl reread && supervisorctl update
# vi /root/conf/nginx.conf        # remove the static "location /", uncomment the proxy one
# nginx -t && systemctl reload nginx
# curl -s http://127.0.0.1/
Hello from NameOcean

O [program:app] para Flask:

/root/conf/supervisor.conf
[program:app]
command=/root/.pyenv/versions/app/bin/gunicorn app:app --workers 2 --bind 127.0.0.1:8000
directory=/root/app
environment=PATH="/root/.pyenv/versions/app/bin:/usr/local/bin:/usr/bin:/bin"
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/var/log/supervisor/app.log

Para outros stacks, só muda o command (o arquivo também traz estes exemplos):

Django/root/.pyenv/versions/app/bin/gunicorn myproject.wsgi:application --workers 2 --bind 127.0.0.1:8000
FastAPI/root/.pyenv/versions/app/bin/uvicorn main:app --host 127.0.0.1 --port 8000 --workers 2
Node.js/usr/bin/node server.js com environment=NODE_ENV="production",PORT="8000",HOST="127.0.0.1"
Next.js/usr/bin/npx next start -H 127.0.0.1 -p 8000 e npm ci && npm run build no deploy.sh
Go/root/app/server e go build -o server . no deploy.sh

O seu app já está no ar em https://3f9a1c2e.nameocean.org.

5. Configurações e segredos

nameocean
$ nameocean servers env set 3f9a1c2e SITE_NAME=Kahvebot SECRET_KEY=…

Todos os apps, o deploy.sh e as sessões SSH os recebem, e os apps são reiniciados para lê-los. Eles ficam guardados apenas no servidor, nunca no repositório nem no banco de dados da NameOcean.

6. O seu domínio

nameocean
$ nameocean bind kahvebot.com 3f9a1c2e

O DNS do domínio precisa estar na NameOcean. A NameOcean adiciona os registros DNS, emite o certificado e configura o balanceador de carga (HTTP para HTTPS e o domínio sem www para www); isso costuma levar alguns minutos. Nada muda no servidor.

7. Cada deploy a partir daí

nameocean
$ git commit -am "New page"
$ nameocean deploy
$ nameocean servers logs 3f9a1c2e --app app -f   # if it does not come up

Cada deploy envia um evento de webhook server.deployed com o commit e a indicação de se as aplicações arrancaram. Backups, reinícios e o resto da API: App Server API. O servidor tem um guia para agentes de IA em /root/AGENTS.md.