# 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 . # 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.