149 lines
7.2 KiB
Markdown
149 lines
7.2 KiB
Markdown
# investemoz.tempo.co.mz — instalação Linux
|
|
|
|
Modelos para Linux com systemd, Nginx e PHP-FPM. Caminho assumido:
|
|
`/var/www/investemoz`; utilizador web `www-data`; PHP 8.5. Confirmar distribuição,
|
|
binário e socket antes de aplicar (não se assume que os pacotes estejam instalados).
|
|
Nenhum destes ficheiros foi aplicado remotamente. O `.env` local fica intacto.
|
|
|
|
## 1. Preparar o servidor
|
|
|
|
Instalar Nginx, PHP CLI/FPM compatível com composer.lock e extensões exigidas por
|
|
`composer check-platform-reqs --no-dev`, incluindo pdo_pgsql, mbstring, xml, curl
|
|
e intl. Instalar PostgreSQL/PostGIS ou provisionar uma instância externa.
|
|
Usar o gestor de pacotes e versões suportados pela distribuição escolhida.
|
|
Verificar `php -v`, `php -m`, `nginx -v` e o socket em `/run/php/`.
|
|
|
|
Apontar o registo DNS A de investemoz.tempo.co.mz para o IP do servidor. Publicar
|
|
AAAA apenas se IPv6 estiver configurado (os modelos fornecidos escutam IPv4).
|
|
Permitir HTTPS/HTTP e o acesso administrativo necessário no firewall. Não expor
|
|
PostgreSQL publicamente por defeito.
|
|
|
|
Publicar o projecto em `/var/www/investemoz`, excluindo .env local, public/hot,
|
|
node_modules e dados locais de storage. Preservar storage nas actualizações.
|
|
O código pertence ao utilizador de implantação; www-data só necessita de escrita
|
|
em storage e bootstrap/cache. O .env deve ser legível pelo PHP, sem acesso público
|
|
nem permissões globais (por exemplo proprietário de implantação, grupo www-data, 0640).
|
|
|
|
## 2. Aplicação e base de dados
|
|
|
|
Usar production.env.example como ponto de partida apenas numa instalação nova.
|
|
Preencher os segredos no servidor e criar base/utilizadores com privilégios revistos.
|
|
Provisionar PostGIS com a conta administrativa. Seguir
|
|
[o guia de publicação](../../docs/investmoz/deployment.md) para dependências,
|
|
build, APP_KEY, migrations e backups. Não sobrescrever APP_KEY nem .env numa
|
|
actualização. Manter configurações de migração e execução separadas.
|
|
|
|
O build precisa de PHP para gerar as rotas Wayfinder. Não copiar vendor gerado
|
|
para Windows sem reinstalar/verificar dependências na plataforma de destino.
|
|
Não activar notificações até validar o correio. MAIL_MAILER=log é provisório:
|
|
não entrega verificações de conta; os logs podem conter ligações sensíveis.
|
|
|
|
## 3. Certificado e Nginx
|
|
|
|
Instalar Certbot pelo método indicado para a distribuição. Criar
|
|
`/var/www/letsencrypt` e instalar nginx-http.conf como o virtual host deste domínio.
|
|
Em Debian/Ubuntu pode usar sites-available/sites-enabled; noutras distribuições
|
|
usar o directório incluído pelo nginx.conf. Não activar ambos os modelos ao mesmo tempo.
|
|
|
|
```sh
|
|
sudo nginx -t
|
|
sudo systemctl reload nginx
|
|
sudo certbot certonly --webroot -w /var/www/letsencrypt -d investemoz.tempo.co.mz
|
|
```
|
|
|
|
Depois de existir o certificado, substituir o virtual host pelo nginx-https.conf,
|
|
ajustando o socket fastcgi_pass. Validar com nginx -t antes de recarregar. Confirmar
|
|
o mecanismo de renovação do Certbot e configurar um deploy hook que execute
|
|
`systemctl reload nginx` após cada renovação bem sucedida. Testar renovação com
|
|
`sudo certbot renew --dry-run`. Não activar o modelo HTTPS antes do certificado.
|
|
|
|
## 4. Fila
|
|
|
|
Rever utilizador, caminhos e PHP em investemoz-queue.service. Instalar a unidade
|
|
em `/etc/systemd/system/investemoz-queue.service` e executar:
|
|
|
|
```sh
|
|
sudo systemd-analyze verify /etc/systemd/system/investemoz-queue.service
|
|
sudo systemctl daemon-reload
|
|
sudo systemctl enable --now investemoz-queue
|
|
sudo systemctl status investemoz-queue
|
|
sudo journalctl -u investemoz-queue -n 50
|
|
```
|
|
|
|
O serviço lê o .env pelo Laravel, não por EnvironmentFile. Recarregar config e
|
|
executar `php artisan queue:restart` após alterações. Não executar outro supervisor
|
|
para este mesmo worker. Configurar rotação de logs Laravel e monitorização de jobs
|
|
falhados e espaço em disco; a aplicação não remove o histórico de auditoria.
|
|
|
|
## 5. Análise antimalware de documentos
|
|
|
|
Instalar ClamAV pelo gestor de pacotes suportado pela distribuição (`clamav`,
|
|
`clamav-daemon` e `clamav-freshclam`). Rever e incorporar os limites de
|
|
`clamd.conf` e `freshclam.conf` deste directório nos ficheiros da distribuição;
|
|
preservar as restantes opções de serviço. O `TCPSocket` deve escutar apenas em
|
|
`127.0.0.1:3310` neste perfil co-localizado. Nunca publicar a porta 3310 no
|
|
Nginx nem na firewall. O modelo de Docker usa uma rede privada própria e não
|
|
tem mapeamento de porta para o host.
|
|
|
|
Actualizar as assinaturas e iniciar os serviços:
|
|
|
|
```sh
|
|
sudo freshclam
|
|
sudo systemctl enable --now clamav-daemon clamav-freshclam
|
|
sudo ss -ltnp | grep ':3310'
|
|
sudo -u www-data php artisan malware:health
|
|
```
|
|
|
|
Verificar que `malware:health` mostra o motor e a data das assinaturas dentro da
|
|
janela configurada. A aplicação devolve `inconclusive` se o serviço estiver
|
|
indisponível ou as assinaturas estiverem antigas. A fila continua a receber o
|
|
upload privado; não o activa nem publica. `investemoz-queue.service` processa a
|
|
mesma fila usada pela aplicação. O timeout do job (150 s) fica abaixo do
|
|
`retry_after` recomendado (210 s).
|
|
|
|
Após aplicar a migração de antimalware, listar documentos existentes sem uma
|
|
análise registada e despachar lotes pequenos:
|
|
|
|
```sh
|
|
php artisan documents:scan-pending --limit=50
|
|
php artisan documents:scan-pending --limit=50 --apply
|
|
```
|
|
|
|
O primeiro comando só conta registos. O segundo coloca até cinquenta análises
|
|
na fila e pode ser repetido; não muda a revisão editorial nem publica conteúdo.
|
|
Monitorizar a fila, falhas, estados no painel de Documentos e o log do serviço.
|
|
Para recuperar uma fila falhada, corrigir primeiro ClamAV/assinaturas e então
|
|
usar `php artisan queue:retry all` ou a acção de nova tentativa no painel.
|
|
Ficheiros infectados e inconclusivos permanecem privados; não são apagados.
|
|
|
|
`malware_scan_status=clean` significa somente que ClamAV não detectou ameaça
|
|
nos bytes cujo hash está registado. Não equivale a garantia de segurança nem
|
|
altera a publicação. Para o ambiente Linux real, confirmar primeiro distribuição,
|
|
pacotes e unidades systemd; este repositório não tem acesso a esse servidor e,
|
|
por isso, não o declara configurado.
|
|
|
|
## 6. Verificação final
|
|
|
|
```sh
|
|
cd /var/www/investemoz
|
|
php artisan config:cache
|
|
php artisan route:cache
|
|
php artisan view:cache
|
|
php artisan portal:readiness
|
|
curl --fail https://investemoz.tempo.co.mz/up
|
|
curl --fail https://investemoz.tempo.co.mz/api/v1/home
|
|
```
|
|
|
|
Confirmar redireccionamento HTTP, certificado, página inicial, ficheiro estático,
|
|
ligação directa de oportunidade e login. `/acesso-gestao` permite configurar a
|
|
conta mais tarde. Readiness continuará a indicar correio pendente enquanto usar log.
|
|
Testar restauração de backup numa instância separada antes de colocar dados reais.
|
|
|
|
Referências: [Nginx try_files](https://nginx.org/en/docs/http/ngx_http_core_module.html#try_files),
|
|
[systemd.service](https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html).
|
|
|
|
Os uploads ZIP e Office Open XML também requerem a extensão PHP `ZipArchive`
|
|
(`php8.5-zip` em pacotes Debian compatíveis). O Laravel aplica um limite separado
|
|
de 100 MiB de expansão declarada e 1.000 entradas antes de pedir a análise ao
|
|
ClamAV. Sem suporte ZIP, estes ficheiros ficam inconclusivos; nunca são aprovados.
|