✅ Verificado em 23/09/2026 lendo direto o servidor (docker, systemd, arquivos de configuração). Não é de memória.
O servidor onde praticamente tudo roda.
| Item | Valor |
|---|---|
| Host | vps8999.panel.icontainer.cloud |
| IP | 207.58.172.147 |
| Acesso | ssh fenix (chave já instalada, entra sem senha) |
| Sistema | Ubuntu 24.04.4 LTS |
| CPU | 6 vCPU |
| RAM | 15 GB (usando cerca de 5,5 GB) |
| Disco | 197 GB, 43% usado |
| Painel | iContainer (fork do 1Panel), porta 2090 |
Versões instaladas: Docker 29.5.1, Node 22.22.2, Python 3.12.3, nginx 1.24.0, certbot 2.9.0.
⚠️ Pendência em aberto: ainda não está confirmado se esta VPS continua com o Will depois da divisão da empresa em 22/09/2026. Vários projetos pessoais rodam aqui. Se a máquina ficar do outro lado, tudo isso precisa migrar.
Este é o detalhe que mais confunde quem chega agora:
O nginx do sistema (systemd) está DESLIGADO de propósito.
Quem atende as portas 80 e 443 é o container ic-openresty-mVOb.
Mexer em /etc/nginx/ no host não tem efeito nenhum. Os arquivos que valem são os do container.
Mapeamento de volumes (host para container):
| No host | No container |
|---|---|
/etc/icontainer/apps/openresty/openresty/conf/conf.d/users |
/usr/local/openresty/nginx/conf/conf.d |
/etc/icontainer/apps/openresty/openresty/conf/conf.d |
/usr/local/openresty/nginx/conf/default |
/etc/icontainer/apps/openresty/openresty/www |
/www |
/etc/icontainer/apps/openresty/openresty/root |
/usr/share/nginx/html |
⚠️ Armadilha clássica: existe uma pasta
/wwwno host que não é a que o container enxerga. Copiar certificado para/www/sites/...no host não funciona. O caminho real é/etc/icontainer/apps/openresty/openresty/www/sites/....
Hoje são 88 arquivos de vhost servindo 133 nomes de domínio, com 89 certificados emitidos.
Passo a passo testado, é o mesmo para qualquer serviço.
1. Criar o registro DNS (domínios ficam na Hostinger)
curl -s --http1.1 -X PUT "https://developers.hostinger.com/api/dns/v1/zones/<dominio>" \
-H "Authorization: Bearer $TOKEN_HOSTINGER" \
-H "Content-Type: application/json" \
-d '{"overwrite": false, "zone": [{"name":"<sub>","type":"A","ttl":300,
"records":[{"content":"207.58.172.147"}]}]}'
⚠️ O
--http1.1é obrigatório. Sem ele a API da Hostinger trava e o curl sai com erro 43.
O"overwrite": falsefaz merge, preservando os registros que já existem. Sem isso você apaga a zona inteira.
2. Esperar propagar
dig +short <sub>.<dominio> @8.8.8.8
3. Criar o vhost só com HTTP (necessário para o desafio do Let's Encrypt funcionar)
Arquivo em /etc/icontainer/apps/openresty/openresty/conf/conf.d/users/<dominio>.conf:
server {
listen 80; listen [::]:80;
server_name <dominio>;
location ^~ /.well-known/acme-challenge { allow all; root /usr/share/nginx/html; }
location / { return 301 https://$host$request_uri; }
}
Depois: docker exec ic-openresty-mVOb nginx -t && docker exec ic-openresty-mVOb nginx -s reload
4. Emitir o certificado
certbot certonly --webroot -w /etc/icontainer/apps/openresty/openresty/root -d <dominio> \
--non-interactive --agree-tos -m <email>
5. Copiar o certificado para onde o container enxerga
BASE=/etc/icontainer/apps/openresty/openresty
mkdir -p $BASE/www/sites/<dominio>/ssl
cp /etc/letsencrypt/live/<dominio>/fullchain.pem $BASE/www/sites/<dominio>/ssl/
cp /etc/letsencrypt/live/<dominio>/privkey.pem $BASE/www/sites/<dominio>/ssl/
chmod 644 $BASE/www/sites/<dominio>/ssl/fullchain.pem
chmod 600 $BASE/www/sites/<dominio>/ssl/privkey.pem
6. Acrescentar o bloco HTTPS ao vhost
server {
listen 443 ssl; listen [::]:443 ssl;
http2 on;
server_name <dominio>;
ssl_certificate /www/sites/<dominio>/ssl/fullchain.pem;
ssl_certificate_key /www/sites/<dominio>/ssl/privkey.pem;
location / {
proxy_pass http://127.0.0.1:<porta>;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_buffering off;
proxy_read_timeout 86400s;
client_max_body_size 100M;
}
}
Recarregar de novo e testar: curl -sI https://<dominio>
Os certificados renovam sozinhos pelo certbot, mas o container serve uma cópia, não o original. O hook /etc/letsencrypt/renewal-hooks/deploy/copiar-certs.sh resolve isso: a cada renovação ele recopia para todo domínio que já tem pasta ssl/ e recarrega o servidor.
Quem cria uma pasta ssl/ nova já entra no hook automaticamente. Quem aponta o vhost direto para /etc/letsencrypt/live/ não funciona, porque essa pasta não é montada no container.
São 28 containers rodando. A convenção importante:
Toda porta publicada usa
127.0.0.1:porta:porta, nuncaporta:portapuro.
Bind sem o 127.0.0.1 deixa o serviço acessível pela internet direto pelo IP, contornando o proxy e o SSL. A exposição externa deve passar sempre pelo OpenResty.
Além dos containers, 34 processos Node rodam sob PM2, a maioria em /var/www/ ou /opt/.
pm2 list # ver tudo
pm2 logs <nome> # acompanhar log
pm2 restart <nome> # reiniciar
pm2 save # salvar o estado atual, para voltar sozinho no boot
Dois ficam parados de propósito: matrix-api e motor-email-matrix, porque a Matrix mora em outro servidor.
28 entradas ativas no crontab do root: backups, enriquecimento de dados, leitura de caixa de email, sincronizações.
crontab -l