> ## Documentation Index
> Fetch the complete documentation index at: https://docs.vertracloud.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Como hospedar uma aplicação Flask na Vertra Cloud

> Faça deploy de uma aplicação Flask na Vertra Cloud com Gunicorn em 0.0.0.0, requirements.txt, a variável PORT e um subdomínio com HTTPS.

## Requisitos

* Python 3.11+ instalado localmente
* Conta na [Vertra Cloud](https://vertracloud.app)
* Arquivo `requirements.txt` na raiz do projeto

## Estrutura do projeto

```
my-api-flask/
├── app.py
├── requirements.txt
└── vertracloud.config
```

## Configuração

### requirements.txt

```txt theme={null}
flask==3.0.0
gunicorn==21.2.0
psycopg2-binary==2.9.9
requests==2.31.0
```

> [!NOTE]
>
> A plataforma executa `pip install -r requirements.txt` automaticamente. Não inclua `venv` nem `__pycache__` no upload.

### vertracloud.config

```ini theme={null}
MAIN=app.py
START=gunicorn --bind 0.0.0.0:$PORT app:app
VERSION=recommended
```

## Exemplo: API REST com Flask

```python theme={null}
from flask import Flask, jsonify, request
import os
import psycopg2
from psycopg2.extras import RealDictCursor

app = Flask(__name__)

# Conexão com o banco de dados
def get_db_connection():
    conn = psycopg2.connect(
        host=os.environ.get('DB_HOST'),
        database=os.environ.get('DB_NAME'),
        user=os.environ.get('DB_USER'),
        password=os.environ.get('DB_PASSWORD'),
        port=os.environ.get('DB_PORT'),  # única por banco, copie-a do dashboard
        # Os bancos da Vertra Cloud exigem TLS e certificado de cliente (veja /pt-br/databases)
        sslmode='verify-full',
        sslrootcert=os.environ.get('DB_SSL_PEM', 'certificate.pem'),
        sslcert=os.environ.get('DB_SSL_CRT', 'certificate.crt'),
        sslkey=os.environ.get('DB_SSL_KEY', 'certificate.key'),
    )
    return conn

@app.route('/')
def index():
    return jsonify({
        'message': 'Flask API on Vertra Cloud',
        'version': '1.0.0'
    })

@app.route('/health')
def health():
    return jsonify({
        'status': 'healthy',
        'client_ip': request.remote_addr
    })

@app.route('/api/items', methods=['GET'])
def get_items():
    try:
        conn = get_db_connection()
        cur = conn.cursor(cursor_factory=RealDictCursor)
        cur.execute('SELECT * FROM items LIMIT 10;')
        items = cur.fetchall()
        cur.close()
        conn.close()
        return jsonify(items), 200
    except Exception as e:
        return jsonify({'error': str(e)}), 500

@app.route('/api/items', methods=['POST'])
def create_item():
    try:
        data = request.get_json()
        conn = get_db_connection()
        cur = conn.cursor()
        cur.execute(
            'INSERT INTO items (name, description) VALUES (%s, %s) RETURNING id;',
            (data['name'], data.get('description', ''))
        )
        item_id = cur.fetchone()[0]
        conn.commit()
        cur.close()
        conn.close()
        return jsonify({'id': item_id, 'name': data['name']}), 201
    except Exception as e:
        return jsonify({'error': str(e)}), 500

@app.errorhandler(404)
def not_found(error):
    return jsonify({'error': 'Not found'}), 404

@app.errorhandler(500)
def server_error(error):
    return jsonify({'error': 'Internal server error'}), 500

if __name__ == '__main__':
    port = int(os.environ.get('PORT', 5000))
    app.run(host='0.0.0.0', port=port)
```

## Deploy

**Dashboard**

1. Compacte o projeto em um `.zip` (pastas como `node_modules`, `venv` e `target` são removidas automaticamente) ou envie-o ao GitHub.
2. No dashboard, clique em **Novo Projeto** e envie o `.zip` ou cole a URL do repositório.
3. Em **Build**, confira o runtime (**Python**), o arquivo principal (`app.py`) e a memória. Os comandos de start e build ficam em **Configurações avançadas**.
4. Adicione suas variáveis de ambiente em **Variáveis de Ambiente**.
5. Em **Rede**, ative a **publicação na web** para que a aplicação receba um endereço `*.vertraweb.app` (plano Pro ou superior, 512 MB de memória). A aplicação precisa escutar na porta 80.
6. Revise e faça o deploy. Acompanhe a saída na aba **Logs**.

**CLI**

```bash theme={null}
vertra upload
vertra logs -f
```

Veja a [CLI](https://docs.vertracloud.app/pt-br/cli.md) para instalação e login.

**VS Code**

Abra a pasta com a extensão da Vertra Cloud instalada e execute **Deploy current project**. Veja a [extensão do VS Code](https://docs.vertracloud.app/pt-br/vscode-extension.md).

O passo a passo completo está em [Primeiro deploy](https://docs.vertracloud.app/pt-br/how-to-host.md).

## Versões disponíveis

| Versão | Status | Descrição |
| - | - | - |
| 3.13.17 | Recomendada e mais recente | Python 3.13 (recomendado para produção) |
| 3.12.15 | Estável | Linha Python 3.12 |
| 3.11.17 | Legado | Linha Python 3.11 |

## Observações

* **Servidor de produção**: use `gunicorn` em vez de `app.run()` em produção
* **Variáveis de ambiente**: configure as credenciais do banco no dashboard
* **Dependências de banco**: use `psycopg2-binary` para PostgreSQL
* **Logs**: disponíveis em tempo real no terminal do dashboard
* **Reinício automático**: ativado por padrão para reiniciar após uma queda
* Sempre escute na porta definida na variável de ambiente `PORT` e no host `0.0.0.0`


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.