3.1 KiB
Deploy — VPS Ubuntu + systemd + Nginx + HTTPS
Guia para publicar o Lernotafiscal em uma VPS Ubuntu (22.04+). O app roda em
127.0.0.1:8000 via Uvicorn sob systemd; o Nginx faz proxy reverso e TLS.
1. Pacotes do sistema
sudo apt update
sudo apt install -y python3-venv python3-pip nginx \
tesseract-ocr tesseract-ocr-por \
certbot python3-certbot-nginx
tesseract-ocr-porhabilita o OCR em português usado no fallback local.PyMuPDF(render de PDF) vem via pip, não precisa de pacote do sistema.
2. Usuário e código
sudo useradd --system --create-home --home-dir /opt/lernotafiscal lernotafiscal
sudo -u lernotafiscal -H bash
cd /opt/lernotafiscal
git clone <seu-repo> . # ou copie os arquivos do projeto para cá
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
3. Configuração (.env)
cp .env.example .env
# gere um SECRET_KEY forte:
python3 -c "import secrets; print(secrets.token_urlsafe(48))"
nano .env
Defina no mínimo: SECRET_KEY, ADMIN_USERNAME, ADMIN_PASSWORD,
SESSION_HTTPS_ONLY=true e, se for usar IA, OPENAI_API_KEY (+ OPENAI_MODEL).
Sem OPENAI_API_KEY o app funciona com OCR/heurística local.
4. Dados iniciais (opcional)
Para migrar o histórico existente (21 notas da skill) para o banco do app:
.venv/bin/python scripts/migrate_notas.py
O banco é criado em data/app.sqlite3 na primeira execução do app de qualquer forma.
5. Serviço systemd
sudo cp deploy/lernotafiscal.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now lernotafiscal
sudo systemctl status lernotafiscal
# a senha temporária (se ADMIN_PASSWORD estiver vazio) aparece no log:
sudo journalctl -u lernotafiscal -n 30
6. Nginx + HTTPS
sudo cp deploy/nginx.conf /etc/nginx/sites-available/lernotafiscal
sudo nano /etc/nginx/sites-available/lernotafiscal # ajuste server_name
sudo ln -s /etc/nginx/sites-available/lernotafiscal /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d seu.dominio.com # emite e configura o TLS
Após o certbot, confirme que o .env tem SESSION_HTTPS_ONLY=true e reinicie:
sudo systemctl restart lernotafiscal.
7. Atualizações
sudo -u lernotafiscal -H bash -c 'cd /opt/lernotafiscal && git pull && .venv/bin/pip install -r requirements.txt'
sudo systemctl restart lernotafiscal
8. Backup
O estado vive em dois lugares — faça backup dos dois (ex.: cron diário):
# banco (checkpoint do WAL antes de copiar)
sqlite3 /opt/lernotafiscal/data/app.sqlite3 "PRAGMA wal_checkpoint(TRUNCATE);"
cp /opt/lernotafiscal/data/app.sqlite3 /backup/app-$(date +%F).sqlite3
# arquivos enviados
tar czf /backup/uploads-$(date +%F).tgz -C /opt/lernotafiscal/data uploads
Notas de segurança
- Os arquivos enviados nunca são servidos por static mount; o download passa
pela rota autenticada
GET /files/{id}. - Segredos ficam só no
.env(fora do git via.gitignore). - Rode o Uvicorn apenas em
127.0.0.1— a exposição pública é só via Nginx/TLS.