Files
LerNota/DEPLOY.md
T

101 lines
3.1 KiB
Markdown

# 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
```bash
sudo apt update
sudo apt install -y python3-venv python3-pip nginx \
tesseract-ocr tesseract-ocr-por \
certbot python3-certbot-nginx
```
> `tesseract-ocr-por` habilita 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
```bash
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`)
```bash
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:
```bash
.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
```bash
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
```bash
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
```bash
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):
```bash
# 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.