Instalação automática

Método automático: um único script da área pessoal prepara todo o servidor (stack web Apache + PHP, base de dados, ferramentas de segurança, cron). Depois — implementar o painel, emitir o SSL e introduzir a licença. Funciona em Ubuntu/Debian: num VPS novo configura tudo de raiz, num servidor já configurado — apenas de forma aditiva (perfil «Servidor configurado», passo 01). Todos os comandos abaixo estão por ordem, basta percorrer de cima para baixo.

Substitua os valores de exemplo nos comandos pelos seus: monitor.example.com — o seu domínio; 203.0.113.10 — o IP real do servidor; /var/www/monitor — a raiz do painel (onde estão public/, assets/, config.php); defina a sua própria palavra-passe da BD.
O conjunto completo («Proteção total») destina-se a um VPS novo. Num Ubuntu/Debian limpo, configura o sistema de segurança de raiz — Fail2ban (jail.local), root-crontab, regras do UFW, configuração do Apache. Se o servidor já estiver configurado (painel a funcionar, sites, correio, jails próprias) — escolha o perfil «Servidor configurado»: introduz apenas alterações aditivas e não mexe na sua firewall, no Fail2ban, no correio, no SSH nem no sysctl. Ao detetar um painel de alojamento, o script muda sozinho para este modo. Antes da primeira execução pode ativar a simulação (opção na área pessoal) — mostra o que será feito sem alterar nada. Num servidor em produção, faça uma cópia instantânea (snapshot) por precaução.

01. Comando de configuração automática a partir da área pessoal

Obtém o comando na sua área pessoal my.arciveo.com → secção «Configuração do servidor» (disponível depois de subscrever o Arcivéo Monitor). Está associado à sua conta e contém um token pessoal.

O script prepara todo o servidor: pilha web (Apache + PHP), base de dados, ferramentas para SSL, o conjunto completo de meios de proteção e tarefas cron (Lynis, SMART, debsums, Logwatch, relatório diário, atualização do ipsum).

1) Escolha o nível de proteção (na área pessoal, antes de copiar o comando):

  • Proteção completa (recomendado) — UFW (firewall), Fail2ban, CrowdSec + bouncer, ipsum (lista de bloqueio de IP), Suricata (IDS/IPS), Falco, ModSecurity + OWASP CRS (WAF), PSAD, mod_evasive (anti-DoS), AIDE (integridade dos ficheiros), debsums, ClamAV + maldet (antivírus), Auditd, AppArmor, Monit, Lynis (auditoria), Logwatch, atualizações de segurança automáticas.
  • Ligeira — para VPS com pouca RAM: conjunto básico sem componentes pesados.
  • Servidor configurado (painel de alojamento) — para um servidor já em funcionamento com painel (HestiaCP, etc.), sites e correio: apenas alterações aditivas (instalação de ferramentas, cron, regras sudo), enquanto a firewall, o Fail2ban, o correio, o SSH e o sysctl permanecem tal como estão. Num servidor com painel, o script escolhe este modo automaticamente.
Execução a seco. Na área pessoal pode marcar a opção «Execução a seco» — então o comando apenas mostra o que o script vai instalar e alterar, e termina sem tocar em nada. Útil num servidor já configurado: primeiro a execução a seco, depois a execução real sem a opção marcada.

2) Execute no servidor como root o comando da área pessoal — tem este aspeto:

curl -fsSL "https://my.arciveo.com/install.php?token=YOUR_TOKEN" | sudo bash
Mantenha o comando em segredo — está associado à sua conta. A ligação tem um prazo de validade limitado; se tiver expirado, clique em «Obter nova ligação» na área pessoal.
Após a configuração automática, o servidor web é Apache + PHP-FPM, e as ferramentas de segurança e tarefas cron já estão instaladas e a funcionar «out-of-the-box» — não é preciso configurar mais nada.

02. Domínio e DNS

Para abrir o painel num endereço como monitor.example.com e obter SSL gratuito, o domínio tem de apontar para o servidor. No painel de gestão de DNS (do registador ou do alojamento) crie um registo A:

Tipo: A Nome: monitor (subdomínio → monitor.example.com) ou @ (raiz do domínio → example.com) Valor: 203.0.113.10 ← IP do seu servidor TTL: 3600

Passados alguns minutos (por vezes até uma hora), verifique que o domínio aponta para o servidor:

dig +short monitor.example.com # deve devolver o seu IP # ou, se não tiver o dig: getent hosts monitor.example.com
O certificado SSL (passo 06) é emitido apenas para o domínio — por isso o DNS tem de apontar para o servidor antes da emissão do certificado.

03. Enviar os ficheiros do painel

A configuração automática já criou a diretoria do painel /var/www/monitor e configurou o site Apache (DocumentRoot na raiz do painel, PHP-FPM, AllowOverride para .htaccess). Não é preciso criar a diretoria e o vhost à parte — basta enviar os ficheiros e definir as permissões.
Os ficheiros do painel (arquivo da distribuição) são transferidos após a compra na área pessoal my.arciveo.com«Transferências». Descompacte o arquivo antes de o enviar para o servidor.

Envie o conteúdo da distribuição para /var/www/monitor (de modo a que lá dentro fiquem public/, assets/, config.php etc.) — por SFTP/SCP (FileZilla / WinSCP) ou com o comando scp a partir do computador local:

scp -r ./monitor/* deploy@203.0.113.10:/var/www/monitor/
Para que o seu domínio (ServerName) fique logo definido no vhost, ele é passado ao comando de configuração automática ainda no passo 01: … | sudo bash -s -- monitor.example.com (ou indica-se o domínio no campo «Domínio do painel» na área pessoal). Se o domínio não for passado — o painel responde a qualquer host e por IP, e o ServerName será definido pelo certbot ao emitir o SSL (passo 06); não é preciso reinstalar nada.
Defina as permissões dos ficheiros — é um passo obrigatório. Se enviou como root ou por SFTP, os ficheiros pertencem ao root, e o servidor web (www-data) não os conseguirá ler — o painel abrirá vazio ou com erro 403 (no registo: .htaccess unreadable / directory not executable). O comando abaixo corrige isto:
# Normalizamos as permissões de toda a webroot: a diretoria criada pelo root # é inacessível ao servidor web (www-data) — sem isto o painel devolve página vazia ou 403. cd /var/www/monitor # Criamos as pastas de trabalho ANTES do chown — senão as novas diretorias ficam root:root # e, com chmod 750, o servidor web (www-data) não conseguirá escrever nelas. sudo mkdir -p data/lynis data/logwatch tmp logs sudo chown -R www-data:www-data /var/www/monitor sudo find /var/www/monitor -type d -exec chmod 755 {} \; sudo find /var/www/monitor -type f -exec chmod 644 {} \; sudo chmod 640 /var/www/monitor/config.php sudo chmod 750 data tmp logs

Abra para si próprio o envio de ficheiros por SFTP. Depois do comando acima todos os ficheiros pertencem ao www-data, enquanto o FileZilla / WinSCP se ligam com o seu próprio utilizador — o envio falhará com SSH_FX_PERMISSION_DENIED (Permission denied). Escolha uma das duas variantes.

Variante A — uma ACL apenas para o seu utilizador (recomendado). A permissão de escrita fica só consigo; o servidor web continua sem poder substituir o código do painel:

sudo apt install -y acl # Permissão de escrita para o seu utilizador em todo o diretório do painel: sudo setfacl -R -m u:deploy:rwX /var/www/monitor # A mesma regra por omissão — para ficheiros e pastas criados mais tarde: sudo setfacl -R -d -m u:deploy:rwX /var/www/monitor

Variante B — através do grupo www-data. Mais simples, mas a permissão de escrita nos ficheiros do painel passa também para o servidor web: com uma vulnerabilidade no PHP o código poderia ser substituído. A ordem dos comandos importa — config.php e as pastas de trabalho são fechadas por último:

sudo usermod -aG www-data deploy # Escrita para o grupo + setgid (o bit 2): os ficheiros enviados por SFTP # permanecem no grupo www-data — caso contrário o painel não os consegue substituir. sudo find /var/www/monitor -type d -exec chmod 2775 {} \; sudo find /var/www/monitor -type f -exec chmod 664 {} \; sudo chmod 640 /var/www/monitor/config.php sudo chmod 2750 /var/www/monitor/data /var/www/monitor/tmp /var/www/monitor/logs
Depois da variante B volte a ligar-se no FileZilla (Servidor → Desligar e entrar de novo) — o novo grupo só passa a valer numa nova sessão, até lá continua sem permissões. Verificação: id deploy — na lista de grupos deve aparecer www-data; ls -ld /var/www/monitor — permissões drwxrwsr-x, a letra s em vez de x significa que o setgid está ativo.

04. Base de dados

Crie a base de dados e o utilizador, depois importe o esquema. O bloco da BD é colado no terminal por inteiro (sudo mysql entra como root pelo socket unix — não é preciso a palavra-passe de root). monitor_db e monitor_user são nomes de exemplo, pode definir os seus; memorize o nome da base, do utilizador e a palavra-passe — irá inseri-los no config.php no passo seguinte:

# 1. Base de dados. A palavra-passe define-se UMA vez em DBPASS e é aplicada a todas as linhas. # O bloco cola-se no terminal POR INTEIRO; sudo mysql entra como root pelo socket unix # (não é preciso a palavra-passe de root). NÃO use o interativo `sudo mysql -u root -p` # com copiar/colar — ao colar, as linhas SQL vão para o pedido de palavra-passe e perdem-se. DBPASS='CHOOSE_A_PASSWORD' # ← altere apenas esta linha sudo mysql <<SQL CREATE DATABASE IF NOT EXISTS monitor_db CHARACTER SET utf8mb4; CREATE USER IF NOT EXISTS 'monitor_user'@'localhost' IDENTIFIED BY '$DBPASS'; GRANT ALL ON monitor_db.* TO 'monitor_user'@'localhost'; FLUSH PRIVILEGES; SQL # Verificação (deve mostrar monitor_db): mysql -u monitor_user -p"$DBPASS" -e "SHOW DATABASES;" # Insira esta mesma palavra-passe no config.php → DB_PASS.
Não é preciso importar o esquema — o painel cria por si as tabelas e a conta admin no primeiro acesso pelo navegador (a partir de database/db.sql), se a BD estiver vazia.
O sudo para o servidor web já foi definido pela configuração automática — os módulos veem os dados do sistema de imediato. Só é preciso configurar o sudo à parte se o PHP correr sob um utilizador não padrão (diferente de www-data).

05. Configuração do config.php

config.php na raiz do painel (/var/www/monitor/config.php) é o único ficheiro que precisa de editar à mão. Todas as definições do painel estão definidas nele através de constantes define(). Abra-o num editor:

sudo nano /var/www/monitor/config.php

Introduza os seus valores nos locais realçados; deixe o resto como está:

// --- Base de dados (do passo 04) --- define('DB_HOST', 'localhost'); // manter define('DB_NAME', 'db_name'); // o que criou no passo 04 define('DB_USER', 'user'); // o que criou no passo 04 define('DB_PASS', 'db_password'); // o que definiu no passo 04 define('DB_CHARSET', 'utf8mb4'); // manter // --- Aplicação --- define('APP_URL', 'https://monitor.example.com'); // endereço do painel, sem barra no fim define('TIMEZONE', 'Europe/Lisbon'); // o seu fuso horário // --- Tempo de sessão --- define('SESSION_LIFETIME', 28800); // inatividade até novo início de sessão, seg (28800 = 8 h)

O que alterar:

  • DB_NAME, DB_USER, DB_PASS — exatamente os mesmos nome da base, utilizador e palavra-passe que definiu ao criar a BD no passo 04 (se manteve os exemplos — monitor_db / monitor_user). Não mexa em DB_HOST e DB_CHARSET.
  • APP_URL — o endereço completo do painel com https://, sem barra no fim e sem www. Tem de coincidir com o domínio no qual ativa a licença (passo 07), caso contrário a chave será rejeitada.
  • TIMEZONE — o seu fuso horário (lista — timedatectl list-timezones). Afeta apenas a forma como o painel mostra as datas; não afeta a hora de execução das tarefas cron (aí vale o fuso do sistema).
  • SESSION_LIFETIME — após quantos segundos de inatividade o painel pede novo início de sessão (por predefinição 8 horas). Ex.: 3600 = 1 hora, 86400 = um dia.
  • Bloco de registo de erros (display_errors, log_errors, error_log) — deixe por predefinição.

Guarde o ficheiro (Ctrl+O, Enter, depois Ctrl+X) e reinicie o PHP-FPM — caso contrário, devido ao OPcache, as alterações não serão aplicadas:

sudo systemctl restart php*-fpm
config.php — ficheiro secreto (contém a palavra-passe da BD). Está na raiz do painel, que é a própria raiz web, mas está protegido: permissões 640 (definidas no passo 03) e proibição explícita no .htaccess da raiz. Não o publique em repositórios públicos nem o envie para o suporte com a palavra-passe real.
Análise detalhada de todos os parâmetros — no FAQ: «Ficheiro config.php — todas as definições do painel».

06. Emitir SSL (HTTPS)

O painel funciona apenas por HTTPS. A sessão de início usa uma cookie segura e o WebAuthn (2FA), por norma, só funciona em HTTPS. Por http:// não conseguirá entrar.

O certbot e o plugin para Apache já foram instalados pela configuração automática. O DNS do domínio já deve apontar para o servidor (passo 02). Emissão num único comando:

sudo certbot --apache -d monitor.example.com
O que o certbot vai perguntar:
  1. Enter email address — o seu e-mail (para lá receberá avisos de expiração do certificado).
  2. Terms of Service … (Y)es/(N)oY.
  3. Share email with the EFF … (Y)es/(N)o — ao seu critério.
A seguir o certbot emite o certificado, cria o <VirtualHost *:443>, configura o redirecionamento http→https e a renovação automática. No fim — Successfully enabled HTTPS.
Se a emissão falhar — verifique se dig +short monitor.example.com devolve o IP do servidor e se as portas 80/443 estão abertas (sudo ufw allow 80,443/tcp).

Após a emissão: https://monitor.example.com abre com o cadeado, http:// redireciona para https://.

07. Início de sessão e configuração inicial

Abra https://monitor.example.com, inicie sessão com admin / useradmin e siga a lista de verificação:

  1. Alterar a palavra-passe de admin — secção «Utilizadores» no menu.
  2. Ativar WebAuthn (2FA) — «Chaves WebAuthn» → registar chave/passkey (requer HTTPS). Registe logo duas: em caso de perda da única chave, o início de sessão com ela será impossível. Saber mais.
  3. Restringir o acesso por IP — «Definições» → «Restrição de acesso por IP» (introduza o seu IP antes de ativar, caso contrário perde o acesso).
  4. Introduzir a licença — ative na área pessoal o código de ativação ARCIVEO-… para o seu domínio e cole a chave em «Definições» → «Licença». Saber mais.
  5. Configurar notificações — Telegram e/ou Email em «Definições». Saber mais.
  6. Eliminar o instalador public/start_db.php, se ainda existir: permite recriar a base de dados sem autenticação. Enquanto o ficheiro estiver na raiz do painel ou em public/, o painel avisa disso com um banner vermelho.
Concluído. As ferramentas de segurança já estão a funcionar — o dashboard mostra logo o estado delas e a Pontuação de segurança. O manual de cada ferramenta está nas FAQ.
Arcivéo - Security Monitor © 2026