7.2 KiB
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 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.
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:
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:
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:
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
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, systemd.service.
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.