Deploy de Aplicações Flask no Wolke
Overview
Este guia descreve como fazer deploy de aplicações Flask no wolke, incluindo configuração de ambiente, base de dados, estáticos, Gunicorn, migrações e boas práticas de produção.
Sobre Flask
O Flask é um micro-framework web em Python, conhecido pela sua simplicidade e flexibilidade. Ao contrário do Django, ele fornece o essencial, permitindo que o desenvolvedor adicione extensões conforme a necessidade.
Pré‑requisitos
- Python 3.10+
- Flask
- Gunicorn
- Git
- Conta Wolke
Configuração Inicial no Wolke
Para passos comuns a qualquer framework, consulta Wolke Setup. O que é específico do Flask está detalhado abaixo.
Estruturas Recomendadas
É fundamental seguir rigorosamente uma destas estruturas para garantir que o processo de build e deploy no wolke ocorra sem falhas. A organização correta dos ficheiros permite que o servidor Gunicorn localize o ponto de entrada da aplicação e que o Flask consiga servir os recursos necessários automaticamente.
Simples
Ideal para APIs ou aplicações minimalistas:
├── app.py
└── requirements.txt
Exemplo de Aplicação
app.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "Hello from Wolke!"
@app.route("/healthz")
def health():
return {"status": "healthy"}, 200
requirements.txt
flask
gunicorn
Com Estáticos e Templates
Ideal para aplicações web completas com interface:
.
├── app.py
├── static/
│ ├── css/
│ └── js/
├── templates/
│ └── index.html
└── requirements.txt
Exemplo de Aplicação
app.py
import os
from flask import Flask, render_template
app = Flask(__name__,
static_folder='static',
template_folder='templates')
@app.route("/")
def index():
# Retorna o ficheiro HTML da pasta /templates
return render_template("index.html")
@app.route("/healthz")
def health():
return {"status": "healthy"}, 200
if __name__ == "__main__":
app.run()
requirements.txt
flask
gunicorn
psycopg2-binary
python-dotenv
Definição do template
Cria uma pasta chamada templates e guarda lá este ficheiro como index.html. Este exemplo já inclui a ligação para o CSS (estáticos):
templates/index.html
<!DOCTYPE html>
<html lang="pt-mz">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Flask no Wolke</title>
<link
rel="stylesheet"
href="{{ url_for('static', filename='css/style.css') }}"
/>
</head>
<body>
<div class="container">
<h1>Olá de Mundo!</h1>
<p>
A tua aplicação Flask está a correr de forma <strong>smooth</strong> no
Wolke.
</p>
<img src="{{ url_for('static', filename='img/logo.png') }}" alt="Logo" />
</div>
</body>
</html>
Definição de estilos
Cria a pasta static/css/ e adiciona este estilo básico para testar se os estáticos estão a carregar:
static/css/style.css
body {
background-color: #f4f4f9;
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
}
.container {
text-align: center;
background: white;
padding: 2rem;
border-radius: 12px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
}
h1 {
color: #333;
}
Enviar Código para GitHub
git init
git add .
git commit -m "Initial Flask app"
git remote add origin <repo-url>
git push -u origin main
Configuração para Produção
No Flask as configurações são carregadas via objeto ou variáveis de ambiente no próprio app.py ou num ficheiro config.py:
config.py
import os
class Config:
SECRET_KEY = os.getenv("SECRET_KEY")
DEBUG = os.getenv("DEBUG", "False") == "True"
SQLALCHEMY_DATABASE_URI = os.getenv("DATABASE_URL")
Carregue as configuraçãoes no app.py
app.py
# os seus outros imports
from config import Config
app.config.from_object(Config)
# outra parte da aplicação
Base de Dados e Migrações
O Wolke utiliza o conceito de Environment Variables (Variáveis de Ambiente) para gerir credenciais sensíveis e o Pre-Deploy Command para preparar o ambiente antes da aplicação entrar em funcionamento.
Configuração da Base de Dados (PostgreSQL)
Para ligar a sua aplicação a uma base de dados, não deve colocar as credenciais diretamente no código. Em vez disso:
- Define
DATABASE_URL(ex:postgres://user:pass@host:5432/dbname).
Gestão de Migrações
As migrações garantem que a estrutura da sua base de dados (tabelas e colunas) está sincronizada com o seu código Python.
Pré‑Deploy Command
Para automatizar este processo e evitar erros manuais, o Wolke permite executar comandos antes do deploy final. Se estiver a utilizar a extensão Flask-Migrate, adicione o seguinte comando no campo Pre‑Deploy Command:
flask db upgrade
Ficheiros Estáticos
Para servir ficheiros da pasta /static de forma eficiente:
- O Flask serve automaticamente ficheiros em
/static.
Media Files
- Em produção, recomenda‑se armazenamento externo (S3/MinIO).
- O sistema de ficheiros dos containers é efémero e os ficheiros serão perdidos no restart.
Troubleshooting
Consulta Troubleshooting para erros comuns.