Documentação

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:

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