ASCEND — PRODUÇÃO VISUAL E EXECUTOR PRIVADO

Este serviço não deve ser instalado em public_html nem executado como root.
O FTP do WinSCP não executa Node/Chromium. A ativação exige Terminal do
WHM/cPanel ou SSH e autorização administrativa no VPS.

Instalar em diretório próprio, separado do Instituto e do Moodle.
Requisitos: Linux, Node >=22.13, dependências do Chromium e usuário de
serviço sem privilégios. No diretório deste serviço:
  npm ci
  npx playwright install --with-deps chromium
O comando --with-deps pode exigir que o administrador instale dependências
do sistema; o navegador e o serviço devem rodar como usuário sem privilégios.

Configurar CAROUSEL_RENDERER_TOKEN com segredo aleatório de pelo menos
32 caracteres em arquivo privado com permissão 600, fora do repositório.
Executar npm start por um gerenciador de serviço com reinício automático.
O processo escuta somente 127.0.0.1:3010. Não abrir essa porta na internet.

Um proxy HTTPS dedicado deve encaminhar /health, /render, /artwork,
/media/{id} e /delivery/{id} para o serviço. Limitar JSON a 13 MB e upload
de /media a 500 MiB (524288000 bytes), sem armazenar o corpo em public_html.
Usar timeout de 60 segundos no JSON e até 5 minutos no upload de vídeo.
Não modificar
o vhost do Instituto/Moodle sem revisão. Não registrar o cabeçalho Authorization
nem o corpo das requisições. Usar TLS válido; não desativar validação TLS.

No ambiente privado do Site Ascend, configurar:
  CAROUSEL_RENDERER_URL=https://DOMINIO-DEDICADO
  CAROUSEL_RENDERER_TOKEN=o mesmo segredo do serviço
Nunca colocar esse segredo em formulário público, HTML, Git ou na memória da IA.

Para o serviço, no mesmo arquivo privado (600), configurar também:
  ASCEND_SERVICE_ORIGIN=https://DOMINIO-DEDICADO
  ASCEND_MEDIA_DIRECTORY=/DIRETORIO-PRIVADO-DO-USUARIO-DE-SERVICO/media
  ASCEND_SITE_ORIGIN=https://ascend-studio-elzilane.zisilpe.chatgpt.site
  ASCEND_SITES_TOKEN=credencial de acesso de serviço do Site privado
  ASCEND_EXECUTOR_TOKEN=outro segredo aleatório de pelo menos 32 caracteres
Configurar ASCEND_EXECUTOR_TOKEN também no ambiente privado do Site.
Não copiar DATABASE_URL, chaves de IA ou tokens das redes para a VPS.
Nunca incluir arquivos .env, logs ou mídias de usuários no pacote de código.

/media exige bearer privado e cria uma cópia temporária imutável. /delivery
serve somente essa mídia aprovada por URL assinada com validade de 72 horas;
não libera acesso ao aplicativo, à biblioteca, aos originais ou ao banco.
As assinaturas são segredos de acesso: não registrar query strings nesses
caminhos nem expô-las nas notificações. O serviço apaga somente suas cópias
temporárias vencidas. Rotacionar o token invalida assinaturas antigas.

O executor verifica o Site a cada minuto e não possui credenciais de redes.
Seu primeiro estado é PAUSADO: confirmar heartbeat não publica nada.
Ativar a fila somente no painel privado depois de um ensaio real acompanhado,
com ID e link confirmados pela rede. Uma resposta externa perdida bloqueia
novo envio; não apagar seus recibos nem resetar a fila para forçar tentativa.

Antes de ativar produção: testar /health autenticado, renderizar uma amostra
sem APIs pagas, conferir 1080x1350 nos PNGs, número de páginas no PDF,
ausência de cortes, resposta 401 sem token e bloqueio de recursos externos.
O serviço exporta peças e aciona etapas da fila no Site, que valida aprovação
e destino novamente. Não concede aprovação humana nem publica sozinho.
O LinkedIn pode conceder escrita sem leitura: nesse caso a verificação de
mídia/post fica bloqueada. Não transformar erro 403 em confirmação de sucesso.
Renderização dos vídeos curtos continua no navegador da usuária. Esta
instalação não demonstra qualidade profissional de um vídeo real.
