Skip to content

Repository files navigation

NutriGuide

Este README é a junção de todos os arquivos Markdown principais do projeto. Ele reúne informações sobre autenticação, deploy, Docker, CI/CD e entregáveis.


Índice

  1. Visão Geral do Projeto
  2. Sistema de Autenticação
  3. Como Usar
  4. Deploy e Produção
  5. Docker
  6. CI/CD
  7. Entregável
  8. Segurança e Manutenção
  9. Troubleshooting
  10. Próximos Passos

Visão Geral do Projeto

NutriGuide é uma aplicação de Streamlit para criação e cálculo de receitas com dados nutricionais. O projeto possui:

  • Sistema de autenticação com login obrigatório
  • Perfis de usuário e administrador
  • Histórico de receitas salvas por usuário
  • Upload de CSV para administradores
  • Deploy com Docker e Docker Compose
  • Opções de cloud deployment e CI/CD automatizado

Sistema de Autenticação

Visão Geral

O NutriGuide possui um sistema completo de autenticação com:

  • Login obrigatório antes de usar o sistema
  • Dois perfis: Usuário e Administrador
  • Histórico de receitas salvas por usuário
  • Upload de CSV para administradores
  • Edição de banco de dados (apenas admin)

Contas Padrão

Administrador

  • Usuário: admin
  • Senha: admin123
  • Permissões:
    • Criar receitas e calcular nutrição
    • Ver histórico de receitas
    • Editar base de dados (adicionar/editar/deletar alimentos)
    • Fazer upload de CSV completo
    • Gerenciar usuários (futuro)

Usuário Normal

  • Usuário: user
  • Senha: user123
  • Permissões:
    • Criar receitas e calcular nutrição
    • Salvar receitas no histórico
    • Ver histórico de receitas próprias
    • Não pode editar base de dados
    • Não pode fazer upload de CSV

Recursos por Perfil

Usuário Normal

  • Criar receitas
  • Calcular nutrição
  • Salvar receitas no histórico
  • Recarregar receitas antigas

Administrador

  • Todas as funcionalidades de usuário, mais:
  • Editar base de dados
  • Upload completo de CSV
  • Ver todos os alimentos cadastrados
  • Gerenciar usuários (planejado)

Segurança

  • Senhas armazenadas com hash SHA-256
  • Sessões expiram após 24 horas
  • Logout limpa sessão imediatamente
  • Cada usuário tem sessões independentes
  • SQLite com transações ACID
  • Backup automático antes de importar CSV
  • Índices para performance

Tabelas do Banco de Dados

Tabela users

- id: INTEGER PRIMARY KEY
- username: TEXT UNIQUE
- password_hash: TEXT
- role: TEXT ('user' ou 'admin')
- created_at: TIMESTAMP
- last_login: TIMESTAMP

Tabela recipe_history

- id: INTEGER PRIMARY KEY
- user_id: INTEGER (FK para users)
- recipe_name: TEXT
- ingredients: TEXT (JSON)
- portion_size: REAL
- total_weight: REAL
- created_at: TIMESTAMP

Tabela sessions

- id: INTEGER PRIMARY KEY
- user_id: INTEGER (FK para users)
- session_token: TEXT UNIQUE
- created_at: TIMESTAMP
- expires_at: TIMESTAMP

Como Usar

Primeiro Acesso

cd src
python setup_database.py
streamlit run app_streamlit.py

Login

  1. Acesse http://localhost:8501
  2. Faça login com uma das contas padrão
  3. Comece a usar

Mudança de Senha

IMPORTANTE: mude as senhas padrão em produção.

from auth_system import AuthSystem

auth = AuthSystem('taco_database.db')
auth.change_password(user_id=1, new_password='YOUR_ADMIN_PASSWORD')
auth.change_password(user_id=2, new_password='YOUR_USER_PASSWORD')

Criar Novos Usuários via Código

from auth_system import AuthSystem

auth = AuthSystem('taco_database.db')

auth.create_user('nutricionista1', 'senha123', 'user')
auth.create_user('admin2', 'senhaforte', 'admin')

Deploy e Produção

Local Development Setup

Pré-requisitos

  • Python 3.11+
  • Docker & Docker Compose (opcional)

Passos

cd D:\NutriGuide
python -m venv venv
venv\Scripts\activate
pip install -r requirements.txt
cd src
python setup_database.py
streamlit run app_streamlit.py

Abra no navegador: http://localhost:8501

Deploy Com Docker Compose

docker-compose up -d --build

Logs:

docker-compose logs -f

Parar:

docker-compose down

Rebuild após mudanças:

docker-compose up -d --build

Docker Direto

docker build -t nutriguide:latest .
docker run -d --name nutriguide -p 8501:8501 -v $(pwd)/data:/app/data nutriguide:latest

Cloud Deployment Options

AWS EC2 + Docker

  1. Criar instância Ubuntu
  2. Permitir portas 80, 443, 22
  3. Conectar ao servidor
  4. Instalar Docker e Docker Compose
  5. Clonar repositório
  6. docker-compose up -d
  7. Configurar Nginx como proxy reverso
Exemplo de configuração Nginx
server {
    listen 80;
    server_name rotulab.com.br www.rotulab.com.br;

    location / {
        proxy_pass http://localhost:8501;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 86400;
        proxy_connect_timeout 86400;
        proxy_send_timeout 86400;
    }
}

AWS Elastic Beanstalk

pip install awsebcli
eb init -p docker nutriguide
eb create nutriguide-prod
eb deploy

DigitalOcean e GCP

  • DigitalOcean: droplet Ubuntu e deploy com Docker Compose
  • GCP: Cloud Run ou VM com Docker Compose

Docker

Pré-requisitos

Windows

  1. Instale Docker Desktop
  2. Reinicie o computador
  3. Verifique:
docker --version
docker-compose --version

Linux

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
sudo apt install docker-compose

Deploy Local de Teste

Docker Compose (recomendado)

cd D:\NutriGuide
docker-compose up -d --build
docker-compose logs -f
docker-compose down

Docker direto

docker build -t nutriguide:latest .
docker run -d `
  --name nutriguide-app `
  -p 8501:8501 `
  -v ${PWD}/data:/app/data `
  nutriguide:latest

CI/CD

GitHub Actions + AWS Lightsail

O workflow de CI/CD foi projetado para deploy automático na branch main.

Pré-requisitos

  • Projeto no GitHub
  • AWS Lightsail rodando
  • Docker e Docker Compose instalados no Lightsail
  • Código clonado em /home/ubuntu/NutriGuide

Criar chave SSH para GitHub Actions

ssh-keygen -t ed25519 -C "github-actions-deploy" -f ~/.ssh/github_actions_deploy
cat ~/.ssh/github_actions_deploy.pub >> ~/.ssh/authorized_keys
cat ~/.ssh/github_actions_deploy

Configurar Secrets no GitHub

Adicione estes 3 secrets:

  • LIGHTSAIL_HOST => IP do VPS
  • LIGHTSAIL_USERNAME => ubuntu ou admin
  • LIGHTSAIL_SSH_KEY => chave privada SSH

Verificar arquivos do projeto

Certifique-se que existem:

  • .github/workflows/deploy.yml
  • deploy.sh
  • docker-compose.yml
  • Dockerfile

Permissão do script de deploy

cd /home/ubuntu/NutriGuide
chmod +x deploy.sh

Configurar Git no VPS

cd /home/ubuntu/NutriGuide
git config pull.rebase false
sudo chown -R ubuntu:ubuntu /home/ubuntu/NutriGuide
git config credential.helper store

Salvar credenciais GitHub com Token

cd /home/ubuntu/NutriGuide
git pull origin main

Testar o workflow

cd D:\NutriGuide
echo "# Test deploy" >> README.md
git add .
git commit -m "Test CI/CD deployment"
git push origin main

Verificar deploy

  • GitHub → Actions
  • Veja o workflow rodando
  • Ver logs em tempo real

Workflow completo

Quando há push para main:

  1. GitHub Actions detecta o push
  2. Conecta via SSH ao Lightsail
  3. Navega para /home/ubuntu/NutriGuide
  4. Puxa mudanças do GitHub
  5. Para containers Docker
  6. Reconstrói e inicia containers
  7. Retorna deploy completo

Tempo estimado de deploy

  • Detecção do push: ~10-30 segundos
  • Conexão SSH: ~5 segundos
  • Git pull: ~2-5 segundos
  • Docker rebuild: ~1-3 minutos
  • Total: ~2-4 minutos

Entregável

Objetivo

Fornecer uma versão do projeto que qualquer usuário possa publicar em sua própria VPS (EC2, DigitalOcean, etc.) sem referência a CI/CD pessoal.

Passos recomendados

  1. Criar instância EC2 (Ubuntu) e abrir portas 22, 80, 443, 8501
  2. Copiar chave pública SSH para /home/ubuntu/.ssh/authorized_keys
  3. Instalar Docker e Docker Compose no servidor
  4. Transferir os arquivos da pasta deliverable/ ou clonar o repositório
  5. Copiar .env.example para .env e preencher valores sensíveis
  6. Rodar docker-compose up -d --build
  7. Configurar Nginx e Certbot para HTTPS

Sugestão de CI/CD genérico (opcional)

  • Usar template de workflow com secrets:
    • SSH_PRIVATE_KEY
    • SERVER_USER
    • SERVER_HOST
    • SERVER_PATH
  • Alternativa: runner self-hosted no VPS para evitar provedores externos

Segurança

  • Rotacione credenciais após configuração
  • Mantenha .env fora do controle de versão

Nota

A pasta deliverable/ contém uma cópia sanitizada do guia de deploy pronta para entrega.


Segurança e Manutenção

Limpar Sessões Expiradas

from auth_system import AuthSystem

auth = AuthSystem('taco_database.db')

with auth.get_connection() as conn:
    cursor = conn.cursor()
    cursor.execute("""
        DELETE FROM sessions 
        WHERE expires_at < datetime('now')
    """)
    conn.commit()
    print(f"Sessões expiradas removidas: {cursor.rowcount}")

Backup do Banco

cp taco_database.db taco_database_backup_$(date +%Y%m%d).db

Ou via SQLite:

sqlite3 taco_database.db ".backup 'backup.db'"

Ver Estatísticas

from auth_system import AuthSystem

auth = AuthSystem('taco_database.db')
users = auth.get_all_users()
print(f"Total de usuários: {len(users)}")
with auth.get_connection() as conn:
    cursor = conn.cursor()
    cursor.execute("SELECT COUNT(*) FROM recipe_history")
    total = cursor.fetchone()[0]
    print(f"Total de receitas salvas: {total}")

Troubleshooting

Erro ao fazer login

cd src
rm taco_database.db
python setup_database.py

Esqueci a senha do admin

from auth_system import AuthSystem

auth = AuthSystem('taco_database.db')
auth.change_password(user_id=1, new_password='novasenha')

Erro: Permission denied (publickey)

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/github_actions_deploy

Erro: git pull failed

cd /home/ubuntu/NutriGuide
git status
git stash
git pull origin main

Erro: docker-compose: command not found

sudo usermod -aG docker ubuntu

Ver logs do deploy no VPS

cd /home/ubuntu/NutriGuide
sudo docker-compose logs -f

Próximos Passos

  • Adicionar interface de gerenciamento de usuários
  • Exportar receitas para PDF
  • Compartilhar receitas entre usuários
  • Tags e categorias para receitas
  • Estatísticas de uso
  • API REST para integração

About

Repositório contendo o código fonte da aplicação NutriGuide, criada para a Rotulab-UFMG.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages