Arquitetura API Ref Docs v2.1 v1.0.0

1Visão Geral

A API UniFi Controle é uma plataforma de gerenciamento centralizado para múltiplos controladores UniFi. Fornece API REST (FastAPI), autenticação JWT, auditoria completa, monitoramento com InfluxDB e interface web integrada.

ComponenteTecnologiaVersãoFunção
BackendFastAPI + Uvicorn0.104.1 / 0.24.0API REST principal
ORMSQLAlchemy + Alembic2.0.23 / 1.13.0Banco relacional
Banco principalPostgreSQL≥ 14Dados persistentes
Banco de métricasInfluxDB2.0Séries temporais
Proxy reversoApache22.4+HTTP → porta 8000
ProcessosystemdGerenciamento do serviço
SegurançaJWT + Fernet AES-128Autenticação e criptografia
RuntimePython3.12.3Interpretador

Estrutura de Diretórios (após instalação)

filesystem Destino no sistema operacional
/opt/api-unifi-controle/          # Diretório principal da aplicação
├── main.py                           # Entry point FastAPI
├── requirements.txt
├── alembic.ini
├── setup_wizard_server.py            # Servidor HTTP do wizard
├── src/                              # Módulos da aplicação
│   ├── api/                          # 15 routers FastAPI
│   ├── models/                       # SQLAlchemy models
│   └── services/                     # Lógica de negócio
├── alembic/                          # Migrations do banco
├── web/                              # Frontend estático
│   ├── index.html
│   └── setup_wizard.html             # Wizard de configuração
└── venv/                             # Virtualenv (criado no postinst)

/etc/api-unifi-controle/           # Configurações
└── .env                              # Variáveis (modo 0600 — gerado pelo wizard)

/var/log/api-unifi-controle/       # Logs da aplicação
├── access.log
└── error.log

/etc/systemd/system/
├── unifi-api.service                 # Serviço principal (porta 8000)
└── unifi-api-setup.service           # Wizard temporário (porta 8080)

/etc/apache2/sites-available/
└── unifi-api.conf                    # VirtualHost (proxy porta 80 → 8000)

2Pré-requisitos

Sistema Operacional

🐧
Ubuntu 22.04 LTS
Jammy Jellyfish
Recomendado
🐧
Ubuntu 24.04 LTS
Noble Numbat
Recomendado
🌀
Debian 12
Bookworm
Suportado
🌀
Debian 11
Bullseye
Suportado

Recursos de Hardware

RecursoMínimoRecomendadoProdução
CPU1 vCPU2 vCPU4+ vCPU
RAM1 GB2 GB4 GB
Disco5 GB20 GB50 GB+ (SSD)
Rede100 Mbps1 Gbps1 Gbps

Pacotes do Sistema

PacoteVersãoObrigatoriedadeInstalação
python3 + python3-venv ≥ 3.12 Obrigatório Incluído no Ubuntu 22.04+
postgresql ≥ 14 Obrigatório Dependência automática do .deb
apache2 2.4+ Obrigatório Dependência automática do .deb
libpq-dev, gcc Obrigatório Para compilar psycopg2
influxdb2 2.0+ Recomendado Ver §3.3
certbot Opcional SSL com Let's Encrypt
ufw Opcional Firewall
ℹ️ Nota

Ao instalar via .deb, todas as dependências obrigatórias são instaladas automaticamente pelo apt através do campo Depends do pacote.

Portas de Rede

PortaProtocoloServiçoDescrição
8080TCPWizardSetup Wizard (ativo apenas na primeira instalação)
8000TCPAPIUvicorn — API FastAPI (acesso interno/local)
80TCPApache2Proxy HTTP público → porta 8000
443TCPApache2 + TLSProxy HTTPS (após certbot)
5432TCPPostgreSQLBanco de dados (somente local)
8086TCPInfluxDBBanco de métricas (somente local)

3Instalar via Pacote .deb

O método recomendado de instalação é via pacote .deb, que automatiza toda a configuração do ambiente: usuário do sistema, diretórios, virtualenv Python, PostgreSQL e serviços systemd.

1
Instalar pré-requisitos do sistema
Atualizar repositórios e instalar dependências base antes da instalação do pacote.
bash
$ sudo apt update && sudo apt upgrade -y
$ sudo apt install -y \
    python3.12 python3.12-venv python3-pip python3-dev \
    postgresql-14 libpq-dev \
    gcc build-essential \
    apache2 curl openssl
2
Instalar o pacote .deb
Executar o instalador Debian. O dpkg extrai os arquivos e dispara o postinst automaticamente.
bash
# Instalar o pacote
$ sudo dpkg -i api-unifi-controle_1.0.0_amd64.deb

# Corrigir dependências, se necessário
$ sudo apt-get install -f -y
ℹ️ O que acontece durante o postinst
  • Cria usuário de sistema unifi-api (sem login)
  • Cria diretórios /etc/api-unifi-controle/ e /var/log/api-unifi-controle/
  • Instala virtualenv Python e requirements.txt
  • Cria role e banco PostgreSQL unifi_api
  • Importa o schema SQL inicial
  • Registra os serviços systemd
  • Inicia o Setup Wizard na porta 8080
3
Verificar instalação
Confirmar que o wizard está rodando antes de acessar o browser.
bash
$ systemctl status unifi-api-setup
● unifi-api-setup.service - API UniFi Setup Wizard (temporario)
     Loaded: loaded (/etc/systemd/system/unifi-api-setup.service; enabled)
     Active: active (running) since ...

# Verificar IP e porta
$ ss -tlnp | grep 8080
4
Abrir o Setup Wizard no navegador
Acessar o wizard para completar a configuração. O endereço exato é exibido ao final da instalação.
🌐
Setup Wizard
http://<IP_DO_SERVIDOR>:8080/setup
✅ Instalação via .deb concluída

O wizard guia o próximo passo. Continue na seção §4 — Setup Wizard.


3.1 Instalar InfluxDB 2.0 (Recomendado)

O InfluxDB é opcional mas fortemente recomendado para monitoramento de métricas em tempo real.

bash Ubuntu 22.04 / 24.04
# Adicionar repositório oficial InfluxData
$ wget -q -O- https://repos.influxdata.com/influxdata-archive_compat.key | \
    gpg --dearmor | \
    sudo tee /etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg > /dev/null

$ echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg] https://repos.influxdata.com/debian stable main' | \
    sudo tee /etc/apt/sources.list.d/influxdata.list

$ sudo apt update && sudo apt install -y influxdb2

$ sudo systemctl enable --now influxdb

3.2 Abrir Firewall (UFW)

bash
$ sudo ufw allow 8080/tcp comment 'Wizard setup (temporario)'
$ sudo ufw allow 80/tcp   comment 'Apache2 HTTP'
$ sudo ufw allow 443/tcp  comment 'Apache2 HTTPS'
$ sudo ufw enable
⚠️ Importante

Após concluir o wizard, a porta 8080 é fechada automaticamente (serviço desativado). Você pode removê-la do UFW com sudo ufw delete allow 8080/tcp.

4Setup Wizard

O Setup Wizard é uma interface web de configuração guiada (estilo Zabbix) acessível na porta 8080 durante a primeira instalação. Ele cria o arquivo /etc/api-unifi-controle/.env e inicia a API automaticamente.

#StepAçãoResultado
1 Pré-requisitos Verificação automática de Python, PostgreSQL, portas, venv Status verde / vermelho para cada item
2 Banco de Dados Preencher host, porta, nome, usuário e senha do PostgreSQL; botão "Testar Conexão" Confirmação de conexão OK antes de avançar
3 InfluxDB URL, organização, bucket, token; toggle "configurar depois" Teste de conexão ao endpoint /ping
4 Segurança Chaves geradas automaticamente (SECRET_KEY, ENCRYPTION_KEY); senha do admin Validação de complexidade da senha; botão "Copiar"
5 Aplicar Resumo read-only; checkbox de confirmação; botão "APLICAR E INICIAR" Barra de progresso em tempo real + link para API Docs

O que ocorre ao clicar em "APLICAR E INICIAR"

Grava /etc/api-unifi-controle/.env
Arquivo gerado com permissões 0600, proprietário unifi-api.
Atualiza senha do PostgreSQL
Executa ALTER ROLE unifi_api WITH PASSWORD '...' no banco.
Atualiza hash do superadmin (opcional)
Se marcado, recalcula o hash bcrypt (rounds=12) e salva no banco.
Inicia o serviço principal
Executa systemctl enable --now unifi-api.service.
Health check (até 30 s)
Aguarda a API responder em http://localhost:8000/health.
Desativa o wizard
systemctl disable --now unifi-api-setup.service — porta 8080 fechada.
✅ Após o wizard

A API estará disponível em http://<IP>:8000. Documentação interativa: http://<IP>:8000/docs.

5Instalação Manual (sem .deb)

Para ambientes de desenvolvimento ou sem suporte a pacotes Debian, siga os passos abaixo.

⚠️ Recomendação

Para produção, prefira sempre a instalação via .deb (§3), que garante dependências, permissões e serviços configurados corretamente.

5.1 Clonar e preparar ambiente

bash
# Clonar repositório
$ git clone https://github.com/HigorMatos/api-unifi-controle.git
$ cd api-unifi-controle

# Criar e ativar virtualenv
$ python3 -m venv venv
$ source venv/bin/activate

# Instalar dependências
(venv) $ pip install -r requirements.txt

5.2 Configurar PostgreSQL

bash
$ sudo systemctl start postgresql
$ sudo -u postgres psql -c "CREATE ROLE unifi_api WITH LOGIN PASSWORD 'sua_senha';"
$ sudo -u postgres createdb -O unifi_api unifi_api

# Importar schema inicial
$ sudo -u postgres psql -d unifi_api -f scripts/install_database.sql

5.3 Criar arquivo .env

bash
$ sudo mkdir -p /etc/api-unifi-controle
$ sudo cp .env.example /etc/api-unifi-controle/.env
$ sudo nano /etc/api-unifi-controle/.env   # editar variáveis
$ sudo chmod 600 /etc/api-unifi-controle/.env

5.4 Iniciar a API

bash
# Testar diretamente (desenvolvimento)
(venv) $ uvicorn main:app --host 0.0.0.0 --port 8000 --reload

# Produção com workers múltiplos
(venv) $ uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4

6Arquivo de Configuração .env

Localização: /etc/api-unifi-controle/.env
Permissões: -rw------- (0600) — lido apenas pelo usuário unifi-api.

env /etc/api-unifi-controle/.env
# ── Aplicação ─────────────────────────────────────────────────
APP_NAME=API UniFi Controle Multi-Controller
VERSION=1.0.0
DEBUG=false
API_HOST=0.0.0.0
API_PORT=8000
API_WORKERS=4

# ── PostgreSQL ────────────────────────────────────────────────
DB_HOST=localhost
DB_PORT=5432
DB_NAME=unifi_api
DB_USER=unifi_api
DB_PASSWORD=<senha_gerada_pelo_wizard>

# ── InfluxDB ─────────────────────────────────────────────────
INFLUXDB_URL=http://localhost:8086
INFLUXDB_TOKEN=<token_do_influxdb>
INFLUXDB_ORG=unifi
INFLUXDB_BUCKET=unifi_metrics

# ── Segurança JWT ─────────────────────────────────────────────
SECRET_KEY=<64_chars_hex_gerado_pelo_wizard>
ENCRYPTION_KEY=<fernet_base64_44chars_gerado_pelo_wizard>
ALGORITHM=HS256
ACCESS_TOKEN_EXPIRE_MINUTES=30

# ── CORS ─────────────────────────────────────────────────────
ENABLE_CORS=true
ALLOWED_ORIGINS=http://localhost:8000,https://seu-dominio.com

# ── Caminhos ─────────────────────────────────────────────────
CONFIG_PATH=/etc/api-unifi-controle/.env
LOG_PATH=/var/log/api-unifi-controle

Referência de Variáveis

VariávelPadrãoObrigatoriedadeDescrição
SECRET_KEYObrigatórioChave JWT (64 chars hex). Nunca reutilizar entre ambientes.
ENCRYPTION_KEYObrigatórioChave Fernet AES-128 para senhas dos controladores.
DB_PASSWORDObrigatórioSenha do role PostgreSQL unifi_api.
INFLUXDB_TOKENRecomendadoToken de acesso ao InfluxDB 2.0.
API_WORKERS4OpcionalNúmero de workers Uvicorn. Use CPU * 2 + 1.
DEBUGfalseOpcionalHabilitar modo debug. NUNCA true em produção.
ACCESS_TOKEN_EXPIRE_MINUTES30OpcionalExpiração do token JWT em minutos.
ALLOWED_ORIGINShttp://localhost:8000OpcionalOrigens CORS permitidas (separadas por vírgula).
🔒 Segurança

Nunca versione o arquivo .env no Git. Garanta chmod 600 e que apenas o usuário unifi-api possa lê-lo. Nunca reutilize SECRET_KEY ou ENCRYPTION_KEY entre ambientes de produção distintos.

7Gerenciar o Serviço

bash Comandos systemd
# Iniciar
$ sudo systemctl start unifi-api

# Parar
$ sudo systemctl stop unifi-api

# Reiniciar
$ sudo systemctl restart unifi-api

# Ver status detalhado
$ sudo systemctl status unifi-api

# Habilitar inicialização automática
$ sudo systemctl enable unifi-api

# Desabilitar inicialização automática
$ sudo systemctl disable unifi-api

7.1 Visualizar Logs

bash
# Logs em tempo real (journal)
$ sudo journalctl -u unifi-api -f

# Últimas 100 linhas
$ sudo journalctl -u unifi-api -n 100

# Logs do dia
$ sudo journalctl -u unifi-api --since today

# Arquivos de log da aplicação
$ sudo tail -f /var/log/api-unifi-controle/access.log
$ sudo tail -f /var/log/api-unifi-controle/error.log

7.2 Verificar Saúde da API

bash
$ curl -s http://localhost:8000/health | python3 -m json.tool
{
  "status": "ok",
  "version": "1.0.0",
  "database": "connected",
  "influxdb": "connected"
}

8Apache2 — Proxy Reverso

O Apache2 funciona como proxy reverso, expondo a API na porta 80 (e 443 com TLS) enquanto o Uvicorn escuta internamente na porta 8000.

8.1 Habilitar módulos e site

bash
# Habilitar módulos necessários
$ sudo a2enmod proxy proxy_http headers rewrite

# Habilitar VirtualHost gerado pelo instalador
$ sudo a2ensite unifi-api

# Desabilitar site padrão (opcional)
$ sudo a2dissite 000-default

$ sudo systemctl reload apache2

8.2 Configuração do VirtualHost

apache /etc/apache2/sites-available/unifi-api.conf
<VirtualHost *:80>
    ServerName api-unifi.seu-dominio.com

    # Proxy reverso para Uvicorn
    ProxyPreserveHost On
    ProxyPass        /  http://127.0.0.1:8000/
    ProxyPassReverse /  http://127.0.0.1:8000/

    # Suporte a WebSocket
    RewriteEngine On
    RewriteCond %{HTTP:Upgrade} websocket [NC]
    RewriteCond %{HTTP:Connection} upgrade [NC]
    RewriteRule /(.*) "ws://127.0.0.1:8000/$1" [P,L]

    # Headers de segurança
    Header always set X-Content-Type-Options "nosniff"
    Header always set X-Frame-Options "DENY"

    ErrorLog  /var/log/api-unifi-controle/apache-error.log
    CustomLog /var/log/api-unifi-controle/apache-access.log combined
</VirtualHost>

8.3 SSL com Let's Encrypt (Recomendado)

bash
$ sudo apt install -y certbot python3-certbot-apache
$ sudo certbot --apache -d api-unifi.seu-dominio.com

# Renovação automática (já configurada pelo certbot)
$ sudo systemctl status certbot.timer

9Atualização de Versão

Ao instalar uma versão mais recente do .deb sobre a instalação existente, o preinst para o serviço, o postinst detecta o arquivo .env e reinicia a API sem abrir o wizard.

bash Upgrade via dpkg
# Verificar versão atual
$ dpkg -s api-unifi-controle | grep Version

# Fazer backup do .env antes do upgrade
$ sudo cp /etc/api-unifi-controle/.env /etc/api-unifi-controle/.env.bak

# Instalar nova versão (preinst para o serviço automaticamente)
$ sudo dpkg -i api-unifi-controle_1.1.0_amd64.deb

# Verificar que o serviço reiniciou
$ systemctl is-active unifi-api
ℹ️ Migrations do banco

Se a nova versão incluir alterações de schema, execute as migrations Alembic manualmente após o upgrade:

bash
$ cd /opt/api-unifi-controle
$ sudo -u unifi-api venv/bin/alembic upgrade head

10Desinstalação

ComandoEfeitoMantém .env?Mantém banco?
sudo dpkg --remove api-unifi-controle Remove arquivos do pacote, mantém configs Sim Sim
sudo dpkg --purge api-unifi-controle Remove tudo incluindo configs e logs Não Sim
⚠️ Banco de dados preservado

O banco PostgreSQL unifi_api e a role unifi_api não são removidos automaticamente, nem mesmo no purge. Para remover:

bash Remoção manual do banco (IRREVERSÍVEL)
$ sudo -u postgres dropdb unifi_api
$ sudo -u postgres dropuser unifi_api

11URLs da API

🚀
API Principal
http://<IP>:8000
📖
Documentação interativa (Swagger UI)
http://<IP>:8000/docs
📋
ReDoc
http://<IP>:8000/redoc
❤️
Health Check
http://<IP>:8000/health
🧙
Setup Wizard (apenas primeira instalação)
http://<IP>:8080/setup
🌐
Via Apache2 (após configuração)
http://<IP> / https://<DOMINIO>

Endpoints Completos

MétodoEndpointDescriçãoAuth mínima
POST/api/v1/auth/loginAutenticação — retorna par JWTPúblico
POST/api/v1/auth/refreshRenovar access_token (token rotation)Público
POST/api/v1/auth/logoutRevogar refresh_tokenJWT
GET/api/v1/auth/meDados do usuário autenticadoJWT
POST/api/v1/auth/password-reset/requestSolicitar reset de senha via e-mailPúblico
POST/api/v1/auth/password-reset/confirmConfirmar reset com token e nova senhaPúblico
CONTROLADORES
GET/api/v1/controllers/Listar controladores cadastradosoperator
POST/api/v1/controllers/Cadastrar novo controlador (senha cifrada)admin
PUT/api/v1/controllers/{id}Atualizar controladoradmin
DELETE/api/v1/controllers/{id}Remover controladoradmin
GET/api/v1/controllers/statusStatus em tempo real de todos os controladoresJWT
GET/api/v1/controllers/summary/statisticsEstatísticas agregadasJWT
DISPOSITIVOS, CLIENTES & REDE
GET/api/v1/device/{controller_id}Listar dispositivos (APs, Switches, GWs)JWT
POST/api/v1/device/{id}/{mac}/rebootReiniciar dispositivo remotamenteoperator
GET/api/v1/clients/{controller_id}Listar clientes conectadosJWT
POST/api/v1/clients/{id}/{mac}/blockBloquear clienteoperator
GET/api/v1/network/{id}/wlansSSIDs com contagem de clientesJWT
GET/api/v1/network/{id}/networksVLANs / subnetsJWT
SEGURANÇA, LOGS & MÉTRICAS
GET/api/v1/security/{id}/alertsAlertas de segurança (enriquecidos com nome do AP)JWT
POST/api/v1/security/{id}/alerts/archive-allArquivar todos os alertas ativosoperator
GET/api/v1/security/{id}/firmwareVersão de firmware dos dispositivosJWT
GET/api/v1/logs/{id}/recentEventos recentes (janela 1–168h, por categoria)JWT
GET/api/v1/metrics/throughput/{id}Throughput TX/RX em Mbps (InfluxDB)JWT
ADMINISTRAÇÃO (superadmin)
GET/api/v1/users/Listar usuários do sistemaadmin
GET/api/v1/audit/logsLog de auditoria completosuperadmin
GET/api/v1/telegram/configConfiguração do bot Telegramsuperadmin
PUT/api/v1/settings/envEditar .env via API (reinicia serviço)superadmin
WEBSOCKET & HEALTH
WS/ws/statusStream de status de todos os controladores (10s)JWT via msg
WS/ws/controller/{id}Stream detalhado de um controladorJWT via msg
GET/healthHealth check geralPúblico
GET/infoInformações da versão e ambientePúblico
📖 Documentação interativa completa

Veja todos os 50+ endpoints com exemplos curl, parâmetros e payloads em api-reference.html ou acesse /docs?token=<jwt> no servidor.

WebSocket — Status em Tempo Real

A API oferece dois endpoints WebSocket para monitoramento em tempo real, sem necessidade de polling HTTP. A autenticação é feita enviando o JWT como primeira mensagem após a conexão (não como query string).

EndpointDados enviadosIntervaloLimite/IP
wss://<host>/ws/statusStatus de todos os controladores10 segundos5 conexões
wss://<host>/ws/controller/{id}Detalhes de um controlador10 segundos5 conexões

Exemplo JavaScript

javascript
// 1. Obter o access_token via login
const token = "eyJ...";

// 2. Conectar ao WebSocket
const ws = new WebSocket("wss://api-unifi.seu-dominio.com/ws/status");

ws.onopen = () => {
  // 3. Autenticar: enviar token como primeira mensagem
  ws.send(JSON.stringify({ token: token }));
};

ws.onmessage = (event) => {
  const data = JSON.parse(event.data);
  // data = array de controladores com status em tempo real
  data.forEach(ctrl => {
    console.log(`${ctrl.name}: ${ctrl.online ? '✅' : '❌'} — ${ctrl.wlan_clients} clientes`);
  });
};

ws.onclose = (event) => {
  if (event.code === 4008) console.error("Limite de conexões por IP atingido");
};

Exemplo Python (asyncio)

python
# pip install websockets
import asyncio, json, websockets

async def monitor():
    uri = "wss://api-unifi.seu-dominio.com/ws/status"
    token = "eyJ..."
    async with websockets.connect(uri) as ws:
        # Autenticar
        await ws.send(json.dumps({"token": token}))
        async for message in ws:
            data = json.loads(message)
            for ctrl in data:
                print(f"{ctrl['name']}: {'Online' if ctrl['online'] else 'Offline'}")

asyncio.run(monitor())
ℹ️ Shared Snapshot Cache

O servidor usa um cache compartilhado (TTL 8s) entre todas as conexões WS ativas. Isso significa que 50 clientes conectados não geram 50 consultas aos controladores UniFi — todos recebem o mesmo snapshot calculado uma única vez por ciclo.

Reset de Senha via E-mail

Usuários que esqueceram a senha podem solicitar um link de reset via e-mail. O fluxo é público (sem autenticação), com proteção anti-enumeração e rate limit de 5 req/min. O SMTP deve estar configurado no .env.

Fluxo completo

#AçãoEndpointDetalhe
1Usuário informa e-mailPOST /api/v1/auth/password-reset/requestSempre retorna 200 (anti-enumeração). Token enviado por e-mail com TTL.
2Usuário clica no linkLink no e-mail contém o token de reset.
3Usuário define nova senhaPOST /api/v1/auth/password-reset/confirmValida token + aplica nova senha. Token é descartado após uso.

Configuração SMTP no .env

env /etc/api-unifi-controle/.env — seção SMTP
# ── SMTP (Reset de Senha) ──────────────────────────────────────
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USERNAME=noreply@sua-empresa.com
SMTP_PASSWORD=<app_password>
SMTP_FROM=noreply@sua-empresa.com
SMTP_TLS=true
PASSWORD_RESET_EXPIRE_MINUTES=30

Exemplos curl

bash
# Passo 1 — Solicitar reset (sempre retorna 200)
$ curl -s -X POST https://<host>/api/v1/auth/password-reset/request \
  -H "Content-Type: application/json" \
  -d '{ "email": "usuario@empresa.com" }'

# Passo 2 — Confirmar reset com token recebido no e-mail
$ curl -s -X POST https://<host>/api/v1/auth/password-reset/confirm \
  -H "Content-Type: application/json" \
  -d '{ "token": "abc123...", "new_password": "NovaSenha@2025" }'
ℹ️ Requisitos da nova senha

Mínimo 8 caracteres · ao menos 1 letra maiúscula · ao menos 1 letra minúscula · ao menos 1 dígito numérico.
Administradores podem usar PUT /api/v1/users/{id} para redefinir diretamente sem e-mail.

Testar SMTP via API

bash
# Enviar e-mail de teste (requer role superadmin)
$ curl -s -X POST https://<host>/api/v1/settings/smtp/test \
  -H "Authorization: Bearer $TOKEN"

12Solução de Problemas

Verifique se o arquivo .env existe e está com permissões corretas:

bash
$ ls -la /etc/api-unifi-controle/.env
# Deve mostrar: -rw------- 1 unifi-api unifi-api

$ sudo journalctl -u unifi-api -n 50 --no-pager

# Testar configuração manualmente
$ sudo -u unifi-api \
    /opt/api-unifi-controle/venv/bin/python -c \
    "from src.config import settings; print('Config OK:', settings.version)"

Verificar se o PostgreSQL está rodando e se as credenciais estão corretas:

bash
$ sudo systemctl status postgresql
$ pg_isready

# Testar conexão com as credenciais do .env
$ psql -h localhost -U unifi_api -d unifi_api -c "SELECT 1;"

# Resetar senha se necessário
$ sudo -u postgres psql -c "ALTER ROLE unifi_api WITH PASSWORD 'nova_senha';"
# Atualizar DB_PASSWORD no .env correspondentemente

Verificar se o serviço wizard está ativo e se a porta está aberta no firewall:

bash
$ systemctl status unifi-api-setup
$ ss -tlnp | grep 8080

# Abrir no UFW
$ sudo ufw allow 8080/tcp

# Iniciar manualmente se necessário
$ sudo systemctl start unifi-api-setup

Se o arquivo .env já existe, o wizard não inicia (proteção contra reconfiguração acidental). Para forçar, use: sudo WIZARD_FORCE=1 python3 /opt/api-unifi-controle/setup_wizard_server.py

bash
$ sudo systemctl status influxdb
$ curl http://localhost:8086/health

# Verificar token
$ grep INFLUXDB_TOKEN /etc/api-unifi-controle/.env

# Testar autenticação
$ curl -H "Authorization: Token <TOKEN>" \
    http://localhost:8086/api/v2/buckets

O Apache não consegue alcançar o Uvicorn. Verificar se a API está rodando na porta 8000:

bash
$ systemctl is-active unifi-api
$ ss -tlnp | grep 8000
$ curl -v http://127.0.0.1:8000/health
$ sudo tail -n 30 /var/log/apache2/error.log
bash
# Corrigir dependências quebradas automaticamente
$ sudo apt-get install -f -y

# Ver dependências do pacote
$ dpkg -I api-unifi-controle_1.0.0_amd64.deb | grep Depends

13Checklist de Instalação

Verifique cada item após a instalação para garantir que tudo está funcionando corretamente.

🎉 Instalação concluída com sucesso!

A API UniFi Controle está em operação. Acesse a documentação interativa em http://<IP>:8000/docs para explorar todos os endpoints disponíveis. Usuários padrão: superadmin / admin (senhas definidas no wizard ou no schema SQL).