Manual (Receita de Bolo) – Controlar Sonoff via Site (Hostinger cPanel)

Projeto: ewelinkApiPhp + painel web em public/ + API protegida por segredo (header).
Objetivo Segurança Erros comuns

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).

1) Como funciona (visão rápida)

Componentes

  • Seu navegador abre public/index.html.
  • O site chama public/api.php via AJAX.
  • O api.php usa a biblioteca PHP para falar com a API da eWeLink.
  • Seu Sonoff recebe o comando pela nuvem (desde que esteja online no app eWeLink).

Proteção

  • A API exige um header secreto: X-Acionador-Secret (configurável).
  • Sem esse header, a API retorna 401.

2) Estrutura de pastas recomendada no servidor (Hostinger cPanel)

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.

2.1) Perfeito — então vai ficar assim (Hostinger cPanel) no SEU caso

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

Exemplo final.html (dica final)

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.

3) O que foi preparado neste projeto

4) Credenciais e variáveis (no estilo do seu exemplo)

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).

5) Passo a passo (Receita de bolo) – Hostinger 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).

5.0) Checklist do que você precisa antes de começar

5.1) Preparar no seu computador

  1. Abra a pasta do projeto no seu PC.
  2. Se você tiver o Composer instalado, rode:
composer install

Isso cria a pasta vendor/ (obrigatória). Sem ela, dá erro 500.

Se você NÃO tem composer faça assim:

5.2) Criar as pastas no servidor

Dica prática se você se perder, procure no File Manager o caminho no topo (breadcrumb). Ele costuma mostrar algo como /home/u123456789/.

5.3) Upload (o que vai para onde)

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.

5.3.1) O jeito mais fácil de subir sem confusão (com ZIP)

  1. No seu PC, crie 2 ZIPs:
    • ZIP 1 (privado): contendo app/, src/, vendor/, storage/, composer.json.
    • ZIP 2 (público): contendo index.html, manual.html, api.php (os 3 de dentro de public/).
  2. No File Manager:
    • Abra /home/u123456789/sonoff, faça upload do ZIP 1 e clique em Extract.
    • Abra /home/u123456789/public_html, faça upload do ZIP 2 e clique em Extract.

5.4) Ajustar caminhos (muito importante)

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

  1. No File Manager, abra public_html.
  2. Clique em api.php.
  3. Clique em Edit (ou Code Editor).
  4. Pesquise por $candidates[] e adicione a linha acima se ainda não estiver.
  5. Salve.

5.5) Configurar as credenciais (modo cPanel, recomendado)

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

  1. No File Manager, abra /home/u123456789/sonoff/app/config.
  2. Clique em config.local.php.
  3. Clique em Edit e cole o conteúdo acima (removendo os // se estiver comentado).
  4. Salve.

Nota Se sua conta eWeLink exigir appid/secret, você precisa criar um app no portal de dev da eWeLink (Coolkit) e preencher.

5.6) Teste 1: abrir o painel

Se não aparecer nada

5.7) Teste 2: testar API manualmente

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"

6) Segurança (não pule)

7) Problemas comuns (e soluções)

7.1) Erro 401 (Não autorizado)

7.2) Erro 500 / “Composer autoload not found”

Checklist do 500

7.3) Lista vazia / dispositivo offline

7.5) Aparece “Não autorizado (header secreto ausente/incorreto)”

7.6) Permissões / storage

7.4) “Device control failure (4002)”

8) Próximo upgrade (se você quiser)

Checklist final

Fim. 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%.