Aplicações independentes e desenvolvimento multistack
A Vupi suporta nativamente qualquer tecnologia web moderna: Node.js / TypeScript, Python (FastAPI/Flask/Django), Go, Java (Spring/Quarkus), PHP independente, Rust e sites estáticos. O desenvolvedor tem total liberdade para escolher frameworks, versões, gerenciadores de pacotes e estrutura de pastas.
Banco automático sem arquivos de segredos
A plataforma provisiona um banco de dados dedicado e injeta as variáveis no container em tempo de execução. O código nunca precisa de senhas salvas em arquivos .env do workspace:
process.env.DATABASE_URL(Node/TS) ouos.environ['DATABASE_URL'](Python) ouos.Getenv("DATABASE_URL")(Go).DB_HOST,DB_PORT,DB_NOME,DB_USUARIO,DB_SENHAe aliases nativos.
Exemplo 1: Node.js & TypeScript com Express e PostgreSQL
// src/server.ts
import express, { Request, Response } from 'express';
import { Pool } from 'pg';
const app = express();
app.use(express.json());
const pool = new Pool({ connectionString: process.env.DATABASE_URL });
app.get('/api/status', (_req: Request, res: Response) => {
res.json({ status: 'ok', runtime: 'Vupi Container' });
});
app.get('/api/tarefas', async (_req: Request, res: Response) => {
try {
const { rows } = await pool.query('SELECT * FROM tarefas ORDER BY criado_em DESC');
res.json({ ok: true, data: rows });
} catch (error: any) {
res.status(500).json({ ok: false, erro: error.message });
}
});
const port = Number(process.env.PORT || 8080);
app.listen(port, '0.0.0.0', () => {
console.log(`Servidor escutando em http://0.0.0.0:${port}`);
});
Exemplo 2: Python com FastAPI e Psycopg 3
# main.py
import os
import psycopg
from fastapi import FastAPI, HTTPException
app = FastAPI()
@app.get('/api/status')
def status():
return {'status': 'ok', 'plataforma': 'Vupi'}
@app.get('/api/tarefas')
def listar():
db_url = os.environ.get('DATABASE_URL')
if not db_url:
raise HTTPException(status_code=500, detail='DATABASE_URL não configurada')
with psycopg.connect(db_url) as conn:
with conn.cursor() as cur:
cur.execute('SELECT id, titulo, criado_em FROM tarefas ORDER BY criado_em DESC')
return {'ok': True, 'data': cur.fetchall()}
Exemplo 3: Go com pgx
// main.go
package main
import (
"database/sql"
"encoding/json"
"net/http"
"os"
_ "github.com/jackc/pgx/v5/stdlib"
)
func main() {
db, err := sql.Open("pgx", os.Getenv("DATABASE_URL"))
if err != nil { panic(err) }
defer db.Close()
http.HandleFunc("/api/status", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(map[string]string{"status": "ok"})
})
port := os.Getenv("PORT")
if port == "" { port = "8080" }
http.ListenAndServe("0.0.0.0:"+port, nil)
}
Rotas públicas, privadas e declaração de proteção
No roteador PHP da Vupi, use diretamente $auth, $privado ou $protected. Em aplicações multistack (Node/Python/Go), declare requireProjectAuth ou adicione o comentário de anotação imediatamente acima do endpoint:
// @private
app.delete('/api/tarefas/:id', removerTarefa);
Anotações equivalentes suportadas pelo gateway Vupi: // @private, // @protected, // @auth e // @privado. Ao ativar o projeto, o gateway reverso exige a chave individual em X-API-Key antes de repassar a chamada ao container.
Requisitos para Ativação
- O serviço HTTP deve escutar no endereço
0.0.0.0(e não apenas127.0.0.1/localhost). - A porta deve ser obtida da variável de ambiente
PORT(com fallback para 8080). - Dependências e arquivos de lock devem estar presentes na raiz (ex:
package.json,requirements.txt,go.mod).