Categoria: Gestão Financeira Aplicativo Web

Visão Geral

Este é um projeto para criar uma aplicação financeira que rodará dentro de um servidor local. O servidor local roda Proxmox para oferecer uma estrutura de multiplas aplicações rodando tanto em máquinas virtuais quanto em containers. O aplicativo de finanças rodará em fastHTML dentro de um container Docker. O Docker roda em um servidor Ubuntu que por sua vez roda sob um container do Proxmox (LXC).

Plataforma: Web

Framework: FastHTML

Infraestrutura: Container Docker rodando em Ubuntu Server que, por sua vez, roda em um container de Servidor Promox.

Análise e Desenvolvimento

Levantamento de Requisitos

Controle básico de finanças e orçamento, permitindo lançamentos rápidos e direcionados.

Diagrama de Casos de Uso

Descrição dos Casos de Uso

Gestão de Contas de Finanças

Listar contas

Criar conta

Editar Conta

Excluir Conta

Registro de Transações

Lançar Despesa

Lançar Receita

Fazer Transferência

Pagar Cartão

Registrar Despesa Recorrente

Cadastrar Conta

Estornar lançamento

Excluir lançamento

Diagrama de Classes

Descrição das Classes

Estrutura das Tabelas do Banco de Dados

SQL
CREATE TABLE usuarios(
  id SERIAL PRIMARY KEY,
  nome VARCHAR(100) NOT NULL,
  email VARCHAR(100) UNIQUE NOT NULL,
  senha_hash VARCHAR(255) NOT NULL,
  criado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Preparação do Ambiente

Pré-Requisitos

Criando o container do Python para rodar o fastHTML

Preparar o seu Projeto FastHTML

Certificar que a aplicação funciona localmente.

O arquivo principal geralmente se chama main.py ou app.py.
Crie um arquivo de dependências requirements.txt:

python-fasthtml
uvicorn

#Adicionar outras dependências se necessário

Criar o Dockerfile

Criar um arquivo chamado Dockerfile (sem extensão) na pasta raiz do projeto e editar conforme abaixo:

Dockerfile
#Usa uma imagem oficial Python leve
FROM python:3.15-slim
#Define o diretório de trabalho
WORKDIR /app
#Copia os arquivos de requisitos e instala as dependências
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
#Copia o restante do código do projeto
COPY . .
#Expõe a porta que o FastHTML/Uvicorn vai usar (padrão 5000 ou 8000)
EXPOSE 5000
#Comando para rodar a aplicação usando o Uvicorn
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "5000"]

Criando o Banco de Dados

O que é FastHTML

Framework para aplicações web modernas em Python puro construídas sobre bases sólidas da web. Com o FastHTML você pode começar a desenvolver desde painéis simples até aplicações web escaláveis ​​em minutos.

Principais características do projeto do framework:

Os aplicativos FastHTML são código Python, então você pode usar o FastHTML com todo o poder da linguagem e do ecossistema Python.

Ativando o ambiente virtual do Python

Bash
source venv/bin/activate

Instalação

Como o fasthtml é uma biblioteca Python, você pode instalá-lo com:

Bash
pip install python-fasthtml

Uso
Para um aplicativo mínimo, crie um arquivo “app.py” da seguinte forma:

app.py

Python
from fasthtml.common import *

app,rt = fast_app()

@rt('/')
def get():
  return Div(P('Olá Mundo!'), hx_get="/change")
serve()

Executar o aplicativo com

Bash
python3 app.py

Isso exibirá um link para o seu aplicativo em execução: http://localhost:5001. Acesse esse link no seu navegador e você deverá ver uma página com o texto “Olá Mundo!”. Parabéns, você acabou de criar seu primeiro aplicativo FastHTML!

Acessando o Banco de Dados

Para acessar um banco MariaDB local, você não depende do FastHTML em si, mas sim de um driver Python para MariaDB.

Instalar a biblioteca mariadb

Bash
sudo apt update
sudo apt install -y libmariadb-dev gcc python3-dev
install mariadb

Conectar ao banco de dados

app.py

Python
import mariadb

conn = mariadb.connect(
  host="localhost",
  port= número-da-porta, #padrão mariadb 3406
  user="seu_usuario",
  password="sua_senha",
  database="seu_banco"
)

cursor = conn.cursor()

Integrar ao FastHTML

Python
from fasthtml import *

import mariadb

def get_db():
  return mariadb.connect(
    host="localhost",
    port=3405, #padrão mariadb
    user="root",
    password="senha",
    database="meubanco"
  )

@route("/")
def get():
  conn = get_db()
  cur = conn.cursor()
  cur.execute("SELECT nome FROM usuarios")
  
  names = [row[0] for row in cur]
  
  return Titled(
    "Finanças " + app_version + " - Contas",
    app_menu(),
    P("Contas"),
    Card(
      Ul(*[Li(name) for name in names]),
      header=Strong("Contas Registradas")
  )
  cur.close()
  conn.close()
)