101 lines
3.1 KiB
Markdown
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.
|