ewelinkApiPhp + painel web em public/ + API protegida por segredo (header).Você vai publicar um site que mostra seus dispositivos e permite ligar/desligar um Sonoff remotamente. O controle acontece via eWeLink Cloud (não precisa abrir porta no roteador do Sonoff).
public/index.html.public/api.php via AJAX.X-Acionador-Secret (configurável).401.No cPanel, a pasta pública padrão é public_html.
public_html/
(arquivos públicos)
index.html
manual.html
api.php
(fora do público — não acessível via URL)
../ewelink-app/
app/
bootstrap.php
config/
config.local.php
config.example.php
src/
vendor/
storage/
composer.json
Importante: você deve deixar vendor/, src/, app/, storage/ fora do public_html. Assim suas credenciais e arquivos internos não ficam expostos.
Você confirmou que o caminho real é /home/u123456789/sonoff. Use este exemplo como referência.
Publico (URL):
/home/u123456789/public_html/
index.html
manual.html
api.php
Privado (fora do public_html):
/home/u123456789/sonoff/
app/
bootstrap.php
config/
config.local.php
src/
vendor/
storage/
composer.json
No seu public_html/api.php, garanta que existe um candidato com caminho absoluto para o bootstrap:
// final.html (trecho para você copiar) $candidates[] = '/home/u123456789/sonoff/app/bootstrap.php';
Com isso, mesmo que os caminhos relativos do cPanel variem, a API sempre encontra o bootstrap.php.
public/index.html (interface moderna)public/api.php (GET devices / POST control) + proteção por headerapp/bootstrap.php (carrega credenciais por env ou config.local.php)storage/ (para logs/config.json se habilitado)Você pediu env com fallback. O projeto está assim:
// Segredo para proteger a API (obrigatório no browser) ACIONADOR_SECRET=Vf8q2Zk9sQ3mN7pA ACIONADOR_SECRET_HEADER=X-Acionador-Secret // eWeLink EWELINK_EMAIL=sisteinbr@gmail.com EWELINK_PASSWORD=16057878 EWELINK_REGION=eu EWELINK_DEVICE_ID=100172ddfa // Opcionais EWELINK_DEBUG=0 EWELINK_JSON_LOG_DIR=/home/u123456789/sonoff/storage
Hostinger/cPanel Em hospedagem compartilhada, nem sempre é fácil setar env vars reais.
Por isso existe o arquivo app/config/config.local.php como alternativa (recomendado no cPanel).
Esta é a parte “mão na massa”. Se você seguir na ordem, funciona.
Eu vou assumir o seu caso real:
/home/u123456789/public_html (público) e /home/u123456789/sonoff (privado).
eu, us, as ou cn (no seu caso: eu).Vf8q2Zk9sQ3mN7pA).composer install
Isso cria a pasta vendor/ (obrigatória). Sem ela, dá erro 500.
Se você NÃO tem composer faça assim:
composer install no servidor.vendor/ gerado a partir do seu PC.public_html (é a pasta do site)./home/u123456789) e crie a pasta: sonoff./home/u123456789/sonoff.Dica prática se você se perder, procure no File Manager o caminho no topo (breadcrumb). Ele costuma mostrar algo como /home/u123456789/.
Para dentro de /home/u123456789/sonoff (fora do público):
app/ src/ vendor/ storage/ composer.json
Para dentro de public_html (público):
public/index.html public/manual.html public/api.php
Dica Você pode subir a pasta public/ e depois mover os arquivos de dentro dela para a raiz do public_html.
app/, src/, vendor/, storage/, composer.json.index.html, manual.html, api.php (os 3 de dentro de public/)./home/u123456789/sonoff, faça upload do ZIP 1 e clique em Extract./home/u123456789/public_html, faça upload do ZIP 2 e clique em Extract.
No cPanel, public_html e sonoff ficam em pastas diferentes.
Por isso, a API precisa achar o arquivo bootstrap.php no caminho certo.
Boa notícia eu já deixei o api.php com um sistema de “candidatos”.
Você só precisa garantir que esta linha existe dentro do public_html/api.php:
$candidates[] = '/home/u123456789/sonoff/app/bootstrap.php';
Como editar no cPanel
public_html.api.php.$candidates[] e adicione a linha acima se ainda não estiver.
Como env vars no cPanel podem ser chatinhas, o jeito mais simples é configurar no arquivo
/home/u123456789/sonoff/app/config/config.local.php.
<?php return [ 'EMAIL' => 'sisteinbr@gmail.com', 'PASSWORD' => '16057878', 'REGION' => 'eu', 'DEFAULT_DEVICE_ID' => '100172ddfa', 'ACIONADOR_SECRET' => 'Vf8q2Zk9sQ3mN7pA', 'ACIONADOR_SECRET_HEADER' => 'X-Acionador-Secret', // Se você tiver APPID/APP_SECRET de desenvolvedor, coloque também: // 'APPID' => '...', // 'APP_SECRET' => '...', 'JSON_LOG_DIR' => __DIR__ . '/../../storage', 'DEBUG' => 0, ];
Como editar esse arquivo
/home/u123456789/sonoff/app/config.config.local.php.// se estiver comentado).Nota Se sua conta eWeLink exigir appid/secret, você precisa criar um app no portal de dev da eWeLink (Coolkit) e preencher.
https://SEU_DOMINIO.com/Vf8q2Zk9sQ3mN7pA e clique Salvar.Se não aparecer nada
https://SEU_DOMINIO.com/api.php?action=devices no navegador e veja a mensagem.Usando curl (no seu PC):
curl -H "X-Acionador-Secret: Vf8q2Zk9sQ3mN7pA" "https://SEU_DOMINIO.com/api.php?action=devices"
Controlar (POST JSON):
curl -X POST -H "Content-Type: application/json" \
-H "X-Acionador-Secret: Vf8q2Zk9sQ3mN7pA" \
-d "{\"action\":\"control\",\"status\":\"on\",\"device_id\":\"100172ddfa\"}" \
"https://SEU_DOMINIO.com/api.php"
vendor/, src/, app/, storage/ fora do public_html.X-Acionador-Secret.vendor/ ou rodar composer install.bootstrap.php e do vendor/autoload.php.Checklist do 500
/home/u123456789/sonoff/vendor/autoload.php?/home/u123456789/sonoff/app/bootstrap.php?public_html/api.php existe a linha com o candidato absoluto?
/home/u123456789/sonoff/app/bootstrap.php/home/u123456789/sonoff/app/config/config.local.php tem credenciais preenchidas?eu, us, as, cn.X-Acionador-Secret. Mantenha esse nome./home/u123456789/sonoff/storage precisa existir (ela existe) e pode precisar de permissão de escrita.storage → Change Permissions e teste 755 (ou 775 se necessário).switch para aquele modelo.params.storage/ e criar página de auditoria.public_html contém apenas index.html, manual.html, api.phpFim. Se você me disser seu domínio e o caminho real das pastas no cPanel (sem senha), eu ajusto o caminho do api.php para você deixar pronto 100%.