mirror of https://github.com/interlegis/sapl.git
Browse Source
• INSTRUCOES_DEPLOY_TCE.md: Guia detalhado de instalação • RESUMO_ALTERACOES_TCE.md: Resumo executivo das alterações • scripts/install_tce_module.sh: Script de instalação automatizada Inclui: - Lista de dependências Python (pyhanko, pyhanko-certvalidator) - Instruções passo a passo para produção - Checklist de deploy - Troubleshooting - Comandos de verificação 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>pull/3858/head
3 changed files with 791 additions and 0 deletions
@ -0,0 +1,272 @@ |
|||||
|
# Instruções de Deploy - Módulo TCE |
||||
|
|
||||
|
## 📋 Resumo das Alterações |
||||
|
|
||||
|
O módulo TCE foi implementado com funcionalidades de: |
||||
|
- Upload e organização de arquivos por processo/pasta/subpasta |
||||
|
- Verificação de tamanho de arquivos (≤5MB) |
||||
|
- Aplicação de OCR (preparado, mas simulado) |
||||
|
- **Assinatura digital com certificado A1 (.pfx)** - IMPLEMENTADO |
||||
|
- Geração de arquivos .p7s |
||||
|
- Visualização de PDFs |
||||
|
|
||||
|
## 🔧 Instalação no Servidor de Produção |
||||
|
|
||||
|
### 1. Atualizar o Código |
||||
|
|
||||
|
```bash |
||||
|
cd /caminho/do/sapl |
||||
|
git pull origin 3.1.x |
||||
|
``` |
||||
|
|
||||
|
### 2. Instalar Dependências Python |
||||
|
|
||||
|
```bash |
||||
|
# Ativar o virtualenv do SAPL (ajuste o caminho conforme necessário) |
||||
|
source /opt/venv/bin/activate # ou o caminho do seu venv |
||||
|
|
||||
|
# Instalar bibliotecas necessárias |
||||
|
pip install pyhanko==0.31.0 |
||||
|
pip install pyhanko-certvalidator==0.29.0 |
||||
|
pip install cryptography>=43.0.3 |
||||
|
``` |
||||
|
|
||||
|
**OU** use o arquivo requirements: |
||||
|
|
||||
|
```bash |
||||
|
pip install -r /caminho/para/tce_requirements.txt |
||||
|
``` |
||||
|
|
||||
|
### 3. Executar Migrações do Banco de Dados |
||||
|
|
||||
|
```bash |
||||
|
python manage.py migrate |
||||
|
``` |
||||
|
|
||||
|
**Migrações criadas:** |
||||
|
- `0001_initial.py` - Estrutura inicial (TceProcesso, TcePasta, TceArquivo, etc) |
||||
|
- `0002_tcearquivo_subpasta.py` - Campo subpasta em TceArquivo |
||||
|
- `0003_tcepasta_subpastas_customizadas.py` - Campo para subpastas customizadas |
||||
|
|
||||
|
### 4. Coletar Arquivos Estáticos |
||||
|
|
||||
|
```bash |
||||
|
python manage.py collectstatic --noinput |
||||
|
``` |
||||
|
|
||||
|
### 5. Criar Diretórios de Upload |
||||
|
|
||||
|
```bash |
||||
|
# Criar diretórios para arquivos TCE |
||||
|
mkdir -p /caminho/do/media/tce/arquivos |
||||
|
mkdir -p /caminho/do/media/tce/reduzidos |
||||
|
mkdir -p /caminho/do/media/tce/ocr |
||||
|
mkdir -p /caminho/do/media/tce/assinados |
||||
|
mkdir -p /caminho/do/media/tce/p7s |
||||
|
|
||||
|
# Dar permissões adequadas (ajuste o usuário conforme necessário) |
||||
|
chown -R www-data:www-data /caminho/do/media/tce |
||||
|
chmod -R 755 /caminho/do/media/tce |
||||
|
``` |
||||
|
|
||||
|
### 6. Reiniciar Serviços |
||||
|
|
||||
|
```bash |
||||
|
# Para Apache |
||||
|
sudo systemctl restart apache2 |
||||
|
|
||||
|
# OU para Nginx + Gunicorn/uWSGI |
||||
|
sudo systemctl restart gunicorn # ou uwsgi |
||||
|
sudo systemctl restart nginx |
||||
|
``` |
||||
|
|
||||
|
## 📁 Arquivos Criados/Modificados |
||||
|
|
||||
|
### Novos Arquivos: |
||||
|
|
||||
|
1. **Modelos:** |
||||
|
- `/sapl/tce/models.py` - Modelos TceProcesso, TcePasta, TceArquivo, TceAssinatura, TceLog |
||||
|
|
||||
|
2. **Views:** |
||||
|
- `/sapl/tce/admin_views.py` - Views e APIs do módulo TCE |
||||
|
|
||||
|
3. **URLs:** |
||||
|
- `/sapl/tce/urls.py` - Rotas do módulo |
||||
|
|
||||
|
4. **Templates:** |
||||
|
- `/sapl/templates/admin/tce/admin_index.html` - Dashboard TCE |
||||
|
- `/sapl/templates/admin/tce/processo_detail.html` - Detalhes do processo |
||||
|
- `/sapl/templates/admin/tce/subpasta_detail.html` - Detalhes da subpasta (com wizard de upload) |
||||
|
- `/sapl/templates/admin/tce/change_form.html` - Formulário admin |
||||
|
- `/sapl/templates/admin/tce/change_list.html` - Lista admin |
||||
|
- `/sapl/templates/admin/tce/app_index.html` - Índice do app |
||||
|
|
||||
|
5. **Template Filters:** |
||||
|
- `/sapl/tce/templatetags/tce_filters.py` - Filtros customizados |
||||
|
|
||||
|
6. **Migrações:** |
||||
|
- `/sapl/tce/migrations/0001_initial.py` |
||||
|
- `/sapl/tce/migrations/0002_tcearquivo_subpasta.py` |
||||
|
- `/sapl/tce/migrations/0003_tcepasta_subpastas_customizadas.py` |
||||
|
|
||||
|
### Arquivos Modificados: |
||||
|
|
||||
|
1. `/sapl/templates/admin/base_site.html` - Navbar do SAPL no admin |
||||
|
|
||||
|
## 🔐 Configurações de Segurança |
||||
|
|
||||
|
### Permissões de Arquivos |
||||
|
|
||||
|
```python |
||||
|
# Em settings.py, verificar: |
||||
|
MEDIA_ROOT = '/caminho/do/media' |
||||
|
MEDIA_URL = '/media/' |
||||
|
|
||||
|
# Limite de upload (opcional) |
||||
|
FILE_UPLOAD_MAX_MEMORY_SIZE = 5242880 # 5MB |
||||
|
DATA_UPLOAD_MAX_MEMORY_SIZE = 5242880 # 5MB |
||||
|
``` |
||||
|
|
||||
|
### Configuração do Servidor Web |
||||
|
|
||||
|
**Para Apache (.htaccess ou VirtualHost):** |
||||
|
|
||||
|
```apache |
||||
|
# Permitir upload de arquivos PDF e certificados |
||||
|
<Directory /caminho/do/media/tce> |
||||
|
Options -Indexes |
||||
|
AllowOverride None |
||||
|
Require all granted |
||||
|
|
||||
|
# Apenas permitir acesso a arquivos específicos |
||||
|
<FilesMatch "\.(pdf|p7s)$"> |
||||
|
Require all granted |
||||
|
</FilesMatch> |
||||
|
</Directory> |
||||
|
``` |
||||
|
|
||||
|
**Para Nginx:** |
||||
|
|
||||
|
```nginx |
||||
|
location /media/tce/ { |
||||
|
alias /caminho/do/media/tce/; |
||||
|
|
||||
|
# Apenas permitir download de PDFs e p7s |
||||
|
location ~ \.(pdf|p7s)$ { |
||||
|
add_header Content-Disposition "inline"; |
||||
|
} |
||||
|
|
||||
|
# Bloquear acesso a outros arquivos |
||||
|
location ~ \.(pfx|p12)$ { |
||||
|
deny all; |
||||
|
} |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
## 🧪 Testar a Instalação |
||||
|
|
||||
|
### 1. Verificar se as bibliotecas foram instaladas: |
||||
|
|
||||
|
```bash |
||||
|
python -c "from pyhanko.sign import signers; print('✓ PyHanko OK')" |
||||
|
python -c "from pyhanko_certvalidator import ValidationContext; print('✓ Certvalidator OK')" |
||||
|
``` |
||||
|
|
||||
|
### 2. Acessar o módulo: |
||||
|
|
||||
|
``` |
||||
|
http://seu-servidor.com/tce/admin/ |
||||
|
``` |
||||
|
|
||||
|
### 3. Testar funcionalidades: |
||||
|
|
||||
|
1. **Criar um processo** - Dashboard TCE > Novo Processo |
||||
|
2. **Criar pastas/subpastas** - Dentro do processo |
||||
|
3. **Upload de arquivo** - Com wizard de 5 abas |
||||
|
4. **Assinatura digital** - Na aba 4 do wizard (requer certificado .pfx) |
||||
|
5. **Geração .p7s** - Na aba 5 do wizard |
||||
|
|
||||
|
## ⚠️ Problemas Conhecidos e Soluções |
||||
|
|
||||
|
### Erro: "Biblioteca de assinatura não instalada" |
||||
|
|
||||
|
**Solução:** |
||||
|
```bash |
||||
|
pip install pyhanko pyhanko-certvalidator |
||||
|
sudo systemctl restart gunicorn # ou seu servidor WSGI |
||||
|
``` |
||||
|
|
||||
|
### Erro de permissão ao fazer upload |
||||
|
|
||||
|
**Solução:** |
||||
|
```bash |
||||
|
chown -R www-data:www-data /caminho/do/media/tce |
||||
|
chmod -R 755 /caminho/do/media/tce |
||||
|
``` |
||||
|
|
||||
|
### Erro 404 ao visualizar arquivo |
||||
|
|
||||
|
**Solução:** |
||||
|
Verificar se a rota está registrada em `urls.py`: |
||||
|
```python |
||||
|
path('arquivo/<uuid:arquivo_id>/visualizar/', admin_views.visualizar_arquivo, name='visualizar_arquivo'), |
||||
|
``` |
||||
|
|
||||
|
### JSONField não encontrado (Django < 3.1) |
||||
|
|
||||
|
O código já está preparado com fallback: |
||||
|
```python |
||||
|
try: |
||||
|
from django.db.models import JSONField |
||||
|
except ImportError: |
||||
|
from django.contrib.postgres.fields import JSONField |
||||
|
``` |
||||
|
|
||||
|
## 📊 Monitoramento |
||||
|
|
||||
|
### Logs para verificar: |
||||
|
|
||||
|
```bash |
||||
|
# Logs do Django |
||||
|
tail -f /var/log/sapl/django.log |
||||
|
|
||||
|
# Logs do servidor web |
||||
|
tail -f /var/log/apache2/error.log # Apache |
||||
|
tail -f /var/log/nginx/error.log # Nginx |
||||
|
``` |
||||
|
|
||||
|
### Verificar uploads: |
||||
|
|
||||
|
```bash |
||||
|
ls -lah /caminho/do/media/tce/arquivos/ |
||||
|
ls -lah /caminho/do/media/tce/assinados/ |
||||
|
ls -lah /caminho/do/media/tce/p7s/ |
||||
|
``` |
||||
|
|
||||
|
## 🔄 Rollback (se necessário) |
||||
|
|
||||
|
Se precisar reverter as alterações: |
||||
|
|
||||
|
```bash |
||||
|
# Reverter migrações |
||||
|
python manage.py migrate tce 0000_initial # ou zero |
||||
|
|
||||
|
# Reverter código |
||||
|
git revert <commit_hash> |
||||
|
git push |
||||
|
``` |
||||
|
|
||||
|
## 📞 Suporte |
||||
|
|
||||
|
Em caso de dúvidas ou problemas: |
||||
|
|
||||
|
1. Verificar logs do servidor |
||||
|
2. Testar em ambiente de desenvolvimento primeiro |
||||
|
3. Verificar se todas as dependências foram instaladas |
||||
|
4. Confirmar permissões de arquivos e diretórios |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
**Data de criação:** 03/10/2025 |
||||
|
**Versão do SAPL:** 3.1.x |
||||
|
**Última atualização:** Após merge com branch principal |
||||
@ -0,0 +1,273 @@ |
|||||
|
# Resumo das Alterações - Módulo TCE |
||||
|
|
||||
|
## 🎯 O que foi implementado |
||||
|
|
||||
|
Sistema completo de gestão de documentos para prestação de contas ao TCE (Tribunal de Contas do Estado) com: |
||||
|
|
||||
|
### Funcionalidades Principais: |
||||
|
1. ✅ **Gestão de Processos** - Criar processos por período (trimestral, anual, etc) |
||||
|
2. ✅ **Organização em Pastas** - 3 categorias padrão + pastas customizadas |
||||
|
3. ✅ **Subpastas Dinâmicas** - Estrutura hierárquica com subpastas customizáveis |
||||
|
4. ✅ **Upload com Wizard** - 5 etapas para preparação de documentos |
||||
|
5. ✅ **Verificação de Tamanho** - Validação ≤5MB |
||||
|
6. ✅ **OCR** - Preparado (simulado no frontend) |
||||
|
7. ✅ **Assinatura Digital Real** - Com certificado A1 (.pfx) usando PyHanko |
||||
|
8. ✅ **Geração .p7s** - Arquivo de assinatura destacada |
||||
|
9. ✅ **Visualização de PDFs** - Inline no navegador |
||||
|
10. ✅ **Logs e Auditoria** - Rastreamento completo de ações |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
## 📦 Para o Servidor de Produção |
||||
|
|
||||
|
### **Comando Rápido (Instalação Automática):** |
||||
|
|
||||
|
```bash |
||||
|
cd /caminho/do/sapl |
||||
|
./scripts/install_tce_module.sh |
||||
|
``` |
||||
|
|
||||
|
### **OU Manual:** |
||||
|
|
||||
|
```bash |
||||
|
# 1. Atualizar código |
||||
|
git pull origin 3.1.x |
||||
|
|
||||
|
# 2. Ativar virtualenv |
||||
|
source /opt/venv/bin/activate |
||||
|
|
||||
|
# 3. Instalar dependências |
||||
|
pip install pyhanko==0.31.0 pyhanko-certvalidator==0.29.0 |
||||
|
|
||||
|
# 4. Migrar banco |
||||
|
python manage.py migrate |
||||
|
|
||||
|
# 5. Criar diretórios |
||||
|
mkdir -p media/tce/{arquivos,assinados,p7s,ocr,reduzidos} |
||||
|
chown -R www-data:www-data media/tce |
||||
|
chmod -R 755 media/tce |
||||
|
|
||||
|
# 6. Coletar estáticos |
||||
|
python manage.py collectstatic --noinput |
||||
|
|
||||
|
# 7. Reiniciar serviço |
||||
|
sudo systemctl restart gunicorn # ou apache2/nginx |
||||
|
``` |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
## 🔑 Dependências NOVAS Instaladas |
||||
|
|
||||
|
### Python: |
||||
|
- ✅ `pyhanko==0.31.0` - Assinatura digital de PDFs |
||||
|
- ✅ `pyhanko-certvalidator==0.29.0` - Validação de certificados |
||||
|
- ✅ `cryptography>=43.0.3` - Criptografia |
||||
|
- ✅ `tzlocal>=5.0.0` - Timezone |
||||
|
- ✅ `uritools>=5.0.0` - Manipulação de URIs |
||||
|
|
||||
|
### Frontend (CDN): |
||||
|
- ✅ Font Awesome 6.5.1 - Ícones |
||||
|
- ✅ SweetAlert2 - Alertas modernos |
||||
|
- ✅ Bootstrap (já existente) - UI |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
## 📁 Arquivos Principais Criados |
||||
|
|
||||
|
### Backend: |
||||
|
``` |
||||
|
sapl/tce/ |
||||
|
├── models.py # 5 modelos (Processo, Pasta, Arquivo, Assinatura, Log) |
||||
|
├── admin_views.py # 10+ views e APIs |
||||
|
├── urls.py # Rotas do módulo |
||||
|
├── admin.py # Admin Django |
||||
|
└── migrations/ |
||||
|
├── 0001_initial.py |
||||
|
├── 0002_tcearquivo_subpasta.py |
||||
|
└── 0003_tcepasta_subpastas_customizadas.py |
||||
|
``` |
||||
|
|
||||
|
### Frontend: |
||||
|
``` |
||||
|
sapl/templates/admin/tce/ |
||||
|
├── admin_index.html # Dashboard principal |
||||
|
├── processo_detail.html # Detalhes do processo |
||||
|
├── subpasta_detail.html # Upload wizard (5 abas) |
||||
|
├── change_form.html # Formulário admin |
||||
|
├── change_list.html # Lista admin |
||||
|
└── app_index.html # Índice do app |
||||
|
``` |
||||
|
|
||||
|
### Template Filters: |
||||
|
``` |
||||
|
sapl/tce/templatetags/ |
||||
|
└── tce_filters.py # Filtros customizados |
||||
|
``` |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
## 🔄 Migrações do Banco de Dados |
||||
|
|
||||
|
### 3 Migrações Criadas: |
||||
|
|
||||
|
1. **0001_initial** - Estrutura base: |
||||
|
- TceProcesso (processos TCE) |
||||
|
- TcePasta (categorias/pastas) |
||||
|
- TceArquivo (arquivos PDF/XML) |
||||
|
- TceAssinatura (assinaturas digitais) |
||||
|
- TceLog (auditoria) |
||||
|
|
||||
|
2. **0002_tcearquivo_subpasta** - Campo para subpastas |
||||
|
|
||||
|
3. **0003_tcepasta_subpastas_customizadas** - Subpastas customizadas (JSON em TextField) |
||||
|
|
||||
|
### Executar: |
||||
|
```bash |
||||
|
python manage.py migrate tce |
||||
|
``` |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
## 🌐 URLs Adicionadas |
||||
|
|
||||
|
```python |
||||
|
/tce/admin/ # Dashboard |
||||
|
/tce/processo/<uuid>/ # Detalhes do processo |
||||
|
/tce/processo/<uuid>/pasta/<uuid>/<subpasta>/ # Detalhes da subpasta |
||||
|
/tce/arquivo/<uuid>/visualizar/ # Visualizar PDF |
||||
|
/tce/api/arquivos/upload/ # Upload |
||||
|
/tce/api/arquivos/<uuid>/assinar/ # Assinar |
||||
|
/tce/api/arquivos/<uuid>/gerar-p7s/ # Gerar .p7s |
||||
|
/tce/api/arquivos/<uuid>/delete/ # Deletar |
||||
|
/tce/api/pastas/criar/ # Criar pasta |
||||
|
/tce/api/subpastas/adicionar/ # Adicionar subpasta |
||||
|
``` |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
## ✅ Checklist de Deploy |
||||
|
|
||||
|
- [ ] Git pull executado |
||||
|
- [ ] Dependências Python instaladas (`pyhanko`, `pyhanko-certvalidator`) |
||||
|
- [ ] Migrações executadas (`python manage.py migrate`) |
||||
|
- [ ] Diretórios de mídia criados (`media/tce/`) |
||||
|
- [ ] Permissões configuradas (755, owner www-data) |
||||
|
- [ ] Arquivos estáticos coletados (`collectstatic`) |
||||
|
- [ ] Servidor web reiniciado |
||||
|
- [ ] Teste de acesso: `http://servidor/tce/admin/` |
||||
|
- [ ] Teste de upload de arquivo |
||||
|
- [ ] Teste de assinatura digital (com certificado .pfx) |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
## 🧪 Como Testar |
||||
|
|
||||
|
1. **Acessar:** `http://seu-servidor/tce/admin/` |
||||
|
2. **Criar processo:** Clicar em "Novo Processo TCE" |
||||
|
3. **Entrar no processo:** Ver pastas e subpastas |
||||
|
4. **Upload:** Clicar em "Adicionar Arquivos" em uma subpasta |
||||
|
5. **Wizard (5 abas):** |
||||
|
- Aba 1: Selecionar PDF |
||||
|
- Aba 2: Verificar tamanho |
||||
|
- Aba 3: Aplicar OCR (simulado) |
||||
|
- Aba 4: **Assinar digitalmente** (usar certificado .pfx + senha) |
||||
|
- Aba 5: Gerar .p7s |
||||
|
6. **Finalizar:** Arquivo aparece na lista |
||||
|
7. **Visualizar:** Clicar no ícone 👁️ para ver o PDF assinado |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
## 🚨 Problemas Comuns |
||||
|
|
||||
|
### "Biblioteca de assinatura não instalada" |
||||
|
```bash |
||||
|
pip install pyhanko pyhanko-certvalidator |
||||
|
sudo systemctl restart gunicorn |
||||
|
``` |
||||
|
|
||||
|
### Erro de permissão ao fazer upload |
||||
|
```bash |
||||
|
chown -R www-data:www-data /caminho/do/media/tce |
||||
|
chmod -R 755 /caminho/do/media/tce |
||||
|
``` |
||||
|
|
||||
|
### Arquivo não aparece após upload |
||||
|
- Verificar logs: `/var/log/sapl/` ou `/var/log/apache2/error.log` |
||||
|
- Verificar se diretórios existem: `ls -la media/tce/` |
||||
|
- Verificar se migrações foram aplicadas: `python manage.py showmigrations tce` |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
## 📊 Estrutura de Dados |
||||
|
|
||||
|
### Hierarquia: |
||||
|
``` |
||||
|
TceProcesso (Prestação de Contas - 3º Tri/2025) |
||||
|
└── TcePasta (Gestão Administrativa) |
||||
|
└── Subpasta (Atos de pessoal) |
||||
|
└── TceArquivo (documento.pdf) |
||||
|
├── arquivo_assinado.pdf |
||||
|
├── documento.p7s |
||||
|
└── TceAssinatura (dados do certificado) |
||||
|
``` |
||||
|
|
||||
|
### Campos Principais: |
||||
|
|
||||
|
**TceProcesso:** |
||||
|
- titulo, ano, periodo, status |
||||
|
- numero_protocolo (TCE) |
||||
|
- data_envio, recibo_tce |
||||
|
|
||||
|
**TceArquivo:** |
||||
|
- arquivo (original) |
||||
|
- arquivo_assinado (com assinatura) |
||||
|
- arquivo_p7s (destacado) |
||||
|
- tamanho_ok, ocr_ok, assinado, p7s_gerado |
||||
|
- certificado_info (JSON) |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
## 📝 Logs e Monitoramento |
||||
|
|
||||
|
### Verificar logs: |
||||
|
```bash |
||||
|
# Django |
||||
|
tail -f /var/log/sapl/django.log |
||||
|
|
||||
|
# Servidor web |
||||
|
tail -f /var/log/apache2/error.log # ou nginx/error.log |
||||
|
|
||||
|
# Verificar uploads |
||||
|
ls -lah media/tce/arquivos/ |
||||
|
ls -lah media/tce/assinados/ |
||||
|
``` |
||||
|
|
||||
|
### Django shell: |
||||
|
```python |
||||
|
python manage.py shell |
||||
|
|
||||
|
from sapl.tce.models import * |
||||
|
|
||||
|
# Ver processos |
||||
|
TceProcesso.objects.all() |
||||
|
|
||||
|
# Ver arquivos |
||||
|
TceArquivo.objects.all() |
||||
|
|
||||
|
# Ver assinaturas |
||||
|
TceAssinatura.objects.all() |
||||
|
``` |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
## 📞 Documentação Completa |
||||
|
|
||||
|
- 📄 `INSTRUCOES_DEPLOY_TCE.md` - Instruções detalhadas |
||||
|
- 🔧 `scripts/install_tce_module.sh` - Script de instalação automática |
||||
|
- 📋 `RESUMO_ALTERACOES_TCE.md` - Este arquivo |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
**Desenvolvido em:** Outubro/2025 |
||||
|
**Branch:** 3.1.x |
||||
|
**Status:** ✅ Pronto para produção |
||||
@ -0,0 +1,246 @@ |
|||||
|
#!/bin/bash |
||||
|
|
||||
|
############################################################################### |
||||
|
# Script de Instalação do Módulo TCE |
||||
|
# Versão: 1.0 |
||||
|
# Data: 03/10/2025 |
||||
|
############################################################################### |
||||
|
|
||||
|
set -e # Parar em caso de erro |
||||
|
|
||||
|
# Cores para output |
||||
|
RED='\033[0;31m' |
||||
|
GREEN='\033[0;32m' |
||||
|
YELLOW='\033[1;33m' |
||||
|
NC='\033[0m' # No Color |
||||
|
|
||||
|
# Função para log |
||||
|
log_info() { |
||||
|
echo -e "${GREEN}[INFO]${NC} $1" |
||||
|
} |
||||
|
|
||||
|
log_warn() { |
||||
|
echo -e "${YELLOW}[WARN]${NC} $1" |
||||
|
} |
||||
|
|
||||
|
log_error() { |
||||
|
echo -e "${RED}[ERROR]${NC} $1" |
||||
|
} |
||||
|
|
||||
|
# Verificar se está rodando como root ou com sudo |
||||
|
if [ "$EUID" -eq 0 ]; then |
||||
|
log_warn "Rodando como root. Certifique-se de que as permissões estão corretas." |
||||
|
fi |
||||
|
|
||||
|
############################################################################### |
||||
|
# 1. VERIFICAÇÕES INICIAIS |
||||
|
############################################################################### |
||||
|
|
||||
|
log_info "Verificando ambiente..." |
||||
|
|
||||
|
# Verificar se o Python está disponível |
||||
|
if ! command -v python3 &> /dev/null; then |
||||
|
log_error "Python3 não encontrado. Instale o Python 3.8 ou superior." |
||||
|
exit 1 |
||||
|
fi |
||||
|
|
||||
|
PYTHON_VERSION=$(python3 --version | awk '{print $2}') |
||||
|
log_info "Python versão: $PYTHON_VERSION" |
||||
|
|
||||
|
# Verificar se o virtualenv está ativado |
||||
|
if [ -z "$VIRTUAL_ENV" ]; then |
||||
|
log_warn "Virtualenv não está ativado. Ativando..." |
||||
|
|
||||
|
# Tentar encontrar o virtualenv |
||||
|
if [ -d "/opt/venv" ]; then |
||||
|
source /opt/venv/bin/activate |
||||
|
log_info "Virtualenv ativado: /opt/venv" |
||||
|
elif [ -d "venv" ]; then |
||||
|
source venv/bin/activate |
||||
|
log_info "Virtualenv ativado: venv" |
||||
|
else |
||||
|
log_error "Virtualenv não encontrado. Ative manualmente antes de executar." |
||||
|
exit 1 |
||||
|
fi |
||||
|
fi |
||||
|
|
||||
|
# Verificar se o Django está instalado |
||||
|
if ! python3 -c "import django" &> /dev/null; then |
||||
|
log_error "Django não encontrado. Instale o Django primeiro." |
||||
|
exit 1 |
||||
|
fi |
||||
|
|
||||
|
DJANGO_VERSION=$(python3 -c "import django; print(django.get_version())") |
||||
|
log_info "Django versão: $DJANGO_VERSION" |
||||
|
|
||||
|
############################################################################### |
||||
|
# 2. INSTALAR DEPENDÊNCIAS |
||||
|
############################################################################### |
||||
|
|
||||
|
log_info "Instalando dependências do módulo TCE..." |
||||
|
|
||||
|
pip install --upgrade pip |
||||
|
|
||||
|
# Instalar pyhanko e dependências |
||||
|
log_info "Instalando pyhanko (assinatura digital)..." |
||||
|
pip install pyhanko==0.31.0 pyhanko-certvalidator==0.29.0 |
||||
|
|
||||
|
# Instalar dependências complementares |
||||
|
log_info "Instalando dependências complementares..." |
||||
|
pip install cryptography>=43.0.3 requests>=2.31.0 python-dateutil>=2.8.0 tzlocal>=5.0.0 |
||||
|
|
||||
|
# Verificar instalação |
||||
|
log_info "Verificando instalação das bibliotecas..." |
||||
|
python3 -c "from pyhanko.sign import signers; print('✓ PyHanko instalado com sucesso')" || { |
||||
|
log_error "Falha ao instalar pyhanko" |
||||
|
exit 1 |
||||
|
} |
||||
|
|
||||
|
python3 -c "from pyhanko_certvalidator import ValidationContext; print('✓ Certvalidator instalado com sucesso')" || { |
||||
|
log_error "Falha ao instalar pyhanko-certvalidator" |
||||
|
exit 1 |
||||
|
} |
||||
|
|
||||
|
############################################################################### |
||||
|
# 3. EXECUTAR MIGRAÇÕES |
||||
|
############################################################################### |
||||
|
|
||||
|
log_info "Executando migrações do banco de dados..." |
||||
|
|
||||
|
python3 manage.py migrate tce |
||||
|
|
||||
|
log_info "Migrações concluídas com sucesso" |
||||
|
|
||||
|
############################################################################### |
||||
|
# 4. CRIAR DIRETÓRIOS DE UPLOAD |
||||
|
############################################################################### |
||||
|
|
||||
|
log_info "Criando diretórios para uploads..." |
||||
|
|
||||
|
# Detectar MEDIA_ROOT do Django |
||||
|
MEDIA_ROOT=$(python3 -c "from django.conf import settings; print(settings.MEDIA_ROOT)" 2>/dev/null || echo "media") |
||||
|
|
||||
|
mkdir -p "$MEDIA_ROOT/tce/arquivos" |
||||
|
mkdir -p "$MEDIA_ROOT/tce/reduzidos" |
||||
|
mkdir -p "$MEDIA_ROOT/tce/ocr" |
||||
|
mkdir -p "$MEDIA_ROOT/tce/assinados" |
||||
|
mkdir -p "$MEDIA_ROOT/tce/p7s" |
||||
|
|
||||
|
log_info "Diretórios criados em: $MEDIA_ROOT/tce/" |
||||
|
|
||||
|
# Configurar permissões |
||||
|
if [ -d "$MEDIA_ROOT/tce" ]; then |
||||
|
# Tentar detectar o usuário do servidor web |
||||
|
WEB_USER="" |
||||
|
if id "www-data" &>/dev/null; then |
||||
|
WEB_USER="www-data" |
||||
|
elif id "apache" &>/dev/null; then |
||||
|
WEB_USER="apache" |
||||
|
elif id "nginx" &>/dev/null; then |
||||
|
WEB_USER="nginx" |
||||
|
fi |
||||
|
|
||||
|
if [ -n "$WEB_USER" ]; then |
||||
|
log_info "Configurando permissões para o usuário: $WEB_USER" |
||||
|
chown -R "$WEB_USER:$WEB_USER" "$MEDIA_ROOT/tce" 2>/dev/null || log_warn "Não foi possível alterar o owner. Execute com sudo se necessário." |
||||
|
else |
||||
|
log_warn "Usuário do servidor web não detectado. Configure as permissões manualmente." |
||||
|
fi |
||||
|
|
||||
|
chmod -R 755 "$MEDIA_ROOT/tce" |
||||
|
log_info "Permissões configuradas: 755" |
||||
|
fi |
||||
|
|
||||
|
############################################################################### |
||||
|
# 5. COLETAR ARQUIVOS ESTÁTICOS |
||||
|
############################################################################### |
||||
|
|
||||
|
log_info "Coletando arquivos estáticos..." |
||||
|
|
||||
|
python3 manage.py collectstatic --noinput |
||||
|
|
||||
|
log_info "Arquivos estáticos coletados" |
||||
|
|
||||
|
############################################################################### |
||||
|
# 6. VERIFICAÇÕES FINAIS |
||||
|
############################################################################### |
||||
|
|
||||
|
log_info "Realizando verificações finais..." |
||||
|
|
||||
|
# Verificar se o app TCE está instalado |
||||
|
python3 manage.py showmigrations tce | grep -q "\[X\]" && log_info "✓ Migrações TCE aplicadas" || log_error "✗ Migrações TCE não aplicadas" |
||||
|
|
||||
|
# Listar URLs do módulo TCE |
||||
|
log_info "URLs do módulo TCE registradas:" |
||||
|
python3 manage.py show_urls 2>/dev/null | grep "tce" || log_warn "Comando show_urls não disponível" |
||||
|
|
||||
|
############################################################################### |
||||
|
# 7. REINICIAR SERVIÇOS |
||||
|
############################################################################### |
||||
|
|
||||
|
log_info "Preparando para reiniciar serviços..." |
||||
|
|
||||
|
# Detectar serviço |
||||
|
SERVICE="" |
||||
|
if systemctl list-units --type=service | grep -q "gunicorn"; then |
||||
|
SERVICE="gunicorn" |
||||
|
elif systemctl list-units --type=service | grep -q "uwsgi"; then |
||||
|
SERVICE="uwsgi" |
||||
|
elif systemctl list-units --type=service | grep -q "apache2"; then |
||||
|
SERVICE="apache2" |
||||
|
elif systemctl list-units --type=service | grep -q "httpd"; then |
||||
|
SERVICE="httpd" |
||||
|
fi |
||||
|
|
||||
|
if [ -n "$SERVICE" ]; then |
||||
|
log_info "Serviço detectado: $SERVICE" |
||||
|
read -p "Deseja reiniciar o serviço $SERVICE agora? (s/N): " -n 1 -r |
||||
|
echo |
||||
|
if [[ $REPLY =~ ^[SsYy]$ ]]; then |
||||
|
sudo systemctl restart "$SERVICE" |
||||
|
log_info "Serviço $SERVICE reiniciado" |
||||
|
|
||||
|
# Reiniciar nginx se existir |
||||
|
if systemctl list-units --type=service | grep -q "nginx"; then |
||||
|
sudo systemctl restart nginx |
||||
|
log_info "Nginx reiniciado" |
||||
|
fi |
||||
|
else |
||||
|
log_warn "Lembre-se de reiniciar o serviço manualmente:" |
||||
|
log_warn " sudo systemctl restart $SERVICE" |
||||
|
fi |
||||
|
else |
||||
|
log_warn "Serviço web não detectado automaticamente." |
||||
|
log_warn "Reinicie manualmente seu servidor web (Apache/Nginx/Gunicorn/uWSGI)" |
||||
|
fi |
||||
|
|
||||
|
############################################################################### |
||||
|
# 8. RESUMO |
||||
|
############################################################################### |
||||
|
|
||||
|
echo "" |
||||
|
log_info "==========================================" |
||||
|
log_info "Instalação do Módulo TCE Concluída!" |
||||
|
log_info "==========================================" |
||||
|
echo "" |
||||
|
log_info "Próximos passos:" |
||||
|
echo " 1. Acesse: http://seu-servidor/tce/admin/" |
||||
|
echo " 2. Crie um novo processo TCE" |
||||
|
echo " 3. Faça upload de documentos" |
||||
|
echo " 4. Teste a assinatura digital (aba 4 do wizard)" |
||||
|
echo "" |
||||
|
log_info "Dependências instaladas:" |
||||
|
echo " ✓ pyhanko 0.31.0" |
||||
|
echo " ✓ pyhanko-certvalidator 0.29.0" |
||||
|
echo " ✓ cryptography >= 43.0.3" |
||||
|
echo "" |
||||
|
log_info "Diretórios criados:" |
||||
|
echo " $MEDIA_ROOT/tce/" |
||||
|
echo "" |
||||
|
log_info "Para mais informações, consulte:" |
||||
|
echo " - INSTRUCOES_DEPLOY_TCE.md" |
||||
|
echo " - Logs do servidor web" |
||||
|
echo "" |
||||
|
log_info "==========================================" |
||||
|
|
||||
|
exit 0 |
||||
Loading…
Reference in new issue