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.
- Visão Geral do Projeto
- Sistema de Autenticação
- Como Usar
- Deploy e Produção
- Docker
- CI/CD
- Entregável
- Segurança e Manutenção
- Troubleshooting
- Próximos Passos
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
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)
- 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:
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
- Criar receitas
- Calcular nutrição
- Salvar receitas no histórico
- Recarregar receitas antigas
- Todas as funcionalidades de usuário, mais:
- Editar base de dados
- Upload completo de CSV
- Ver todos os alimentos cadastrados
- Gerenciar usuários (planejado)
- 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
- id: INTEGER PRIMARY KEY
- username: TEXT UNIQUE
- password_hash: TEXT
- role: TEXT ('user' ou 'admin')
- created_at: TIMESTAMP
- last_login: TIMESTAMP- 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- id: INTEGER PRIMARY KEY
- user_id: INTEGER (FK para users)
- session_token: TEXT UNIQUE
- created_at: TIMESTAMP
- expires_at: TIMESTAMPcd src
python setup_database.py
streamlit run app_streamlit.py- Acesse http://localhost:8501
- Faça login com uma das contas padrão
- Comece a usar
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')from auth_system import AuthSystem
auth = AuthSystem('taco_database.db')
auth.create_user('nutricionista1', 'senha123', 'user')
auth.create_user('admin2', 'senhaforte', 'admin')- Python 3.11+
- Docker & Docker Compose (opcional)
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.pyAbra no navegador: http://localhost:8501
docker-compose up -d --buildLogs:
docker-compose logs -fParar:
docker-compose downRebuild após mudanças:
docker-compose up -d --builddocker build -t nutriguide:latest .
docker run -d --name nutriguide -p 8501:8501 -v $(pwd)/data:/app/data nutriguide:latest- Criar instância Ubuntu
- Permitir portas 80, 443, 22
- Conectar ao servidor
- Instalar Docker e Docker Compose
- Clonar repositório
docker-compose up -d- Configurar Nginx como proxy reverso
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;
}
}pip install awsebcli
eb init -p docker nutriguide
eb create nutriguide-prod
eb deploy- DigitalOcean: droplet Ubuntu e deploy com Docker Compose
- GCP: Cloud Run ou VM com Docker Compose
- Instale Docker Desktop
- Reinicie o computador
- Verifique:
docker --version
docker-compose --versioncurl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
sudo apt install docker-composecd D:\NutriGuide
docker-compose up -d --build
docker-compose logs -f
docker-compose downdocker build -t nutriguide:latest .
docker run -d `
--name nutriguide-app `
-p 8501:8501 `
-v ${PWD}/data:/app/data `
nutriguide:latestO workflow de CI/CD foi projetado para deploy automático na branch main.
- Projeto no GitHub
- AWS Lightsail rodando
- Docker e Docker Compose instalados no Lightsail
- Código clonado em
/home/ubuntu/NutriGuide
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_deployAdicione estes 3 secrets:
LIGHTSAIL_HOST=> IP do VPSLIGHTSAIL_USERNAME=>ubuntuouadminLIGHTSAIL_SSH_KEY=> chave privada SSH
Certifique-se que existem:
.github/workflows/deploy.ymldeploy.shdocker-compose.ymlDockerfile
cd /home/ubuntu/NutriGuide
chmod +x deploy.shcd /home/ubuntu/NutriGuide
git config pull.rebase false
sudo chown -R ubuntu:ubuntu /home/ubuntu/NutriGuide
git config credential.helper storecd /home/ubuntu/NutriGuide
git pull origin maincd D:\NutriGuide
echo "# Test deploy" >> README.md
git add .
git commit -m "Test CI/CD deployment"
git push origin main- GitHub → Actions
- Veja o workflow rodando
- Ver logs em tempo real
Quando há push para main:
- GitHub Actions detecta o push
- Conecta via SSH ao Lightsail
- Navega para
/home/ubuntu/NutriGuide - Puxa mudanças do GitHub
- Para containers Docker
- Reconstrói e inicia containers
- Retorna deploy completo
- 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
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.
- Criar instância EC2 (Ubuntu) e abrir portas 22, 80, 443, 8501
- Copiar chave pública SSH para
/home/ubuntu/.ssh/authorized_keys - Instalar Docker e Docker Compose no servidor
- Transferir os arquivos da pasta
deliverable/ou clonar o repositório - Copiar
.env.examplepara.enve preencher valores sensíveis - Rodar
docker-compose up -d --build - Configurar Nginx e Certbot para HTTPS
- Usar template de workflow com secrets:
SSH_PRIVATE_KEYSERVER_USERSERVER_HOSTSERVER_PATH
- Alternativa: runner self-hosted no VPS para evitar provedores externos
- Rotacione credenciais após configuração
- Mantenha
.envfora do controle de versão
A pasta deliverable/ contém uma cópia sanitizada do guia de deploy pronta para entrega.
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}")cp taco_database.db taco_database_backup_$(date +%Y%m%d).dbOu via SQLite:
sqlite3 taco_database.db ".backup 'backup.db'"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}")cd src
rm taco_database.db
python setup_database.pyfrom auth_system import AuthSystem
auth = AuthSystem('taco_database.db')
auth.change_password(user_id=1, new_password='novasenha')chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/github_actions_deploycd /home/ubuntu/NutriGuide
git status
git stash
git pull origin mainsudo usermod -aG docker ubuntucd /home/ubuntu/NutriGuide
sudo docker-compose logs -f- 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