Guia de Instalação
Instruções completas para instalar e configurar a API UniFi Controle Multi-Controller
em ambientes Linux, via pacote .deb ou instalação manual.
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.
| Componente | Tecnologia | Versão | Função |
|---|---|---|---|
| Backend | FastAPI + Uvicorn | 0.104.1 / 0.24.0 | API REST principal |
| ORM | SQLAlchemy + Alembic | 2.0.23 / 1.13.0 | Banco relacional |
| Banco principal | PostgreSQL | ≥ 14 | Dados persistentes |
| Banco de métricas | InfluxDB | 2.0 | Séries temporais |
| Proxy reverso | Apache2 | 2.4+ | HTTP → porta 8000 |
| Processo | systemd | — | Gerenciamento do serviço |
| Segurança | JWT + Fernet AES-128 | — | Autenticação e criptografia |
| Runtime | Python | 3.12.3 | Interpretador |
Estrutura de Diretórios (após instalação)
/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
Recursos de Hardware
| Recurso | Mínimo | Recomendado | Produção |
|---|---|---|---|
| CPU | 1 vCPU | 2 vCPU | 4+ vCPU |
| RAM | 1 GB | 2 GB | 4 GB |
| Disco | 5 GB | 20 GB | 50 GB+ (SSD) |
| Rede | 100 Mbps | 1 Gbps | 1 Gbps |
Pacotes do Sistema
| Pacote | Versão | Obrigatoriedade | Instalaçã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 |
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
| Porta | Protocolo | Serviço | Descrição |
|---|---|---|---|
| 8080 | TCP | Wizard | Setup Wizard (ativo apenas na primeira instalação) |
| 8000 | TCP | API | Uvicorn — API FastAPI (acesso interno/local) |
| 80 | TCP | Apache2 | Proxy HTTP público → porta 8000 |
| 443 | TCP | Apache2 + TLS | Proxy HTTPS (após certbot) |
| 5432 | TCP | PostgreSQL | Banco de dados (somente local) |
| 8086 | TCP | InfluxDB | Banco 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.
$ 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
.debdpkg extrai os arquivos e dispara o postinst automaticamente.# 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
- 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
$ 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
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.
# 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)
$ 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
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.
| # | Step | Ação | Resultado |
|---|---|---|---|
| 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"
/etc/api-unifi-controle/.env0600, proprietário unifi-api.ALTER ROLE unifi_api WITH PASSWORD '...' no banco.systemctl enable --now unifi-api.service.http://localhost:8000/health.systemctl disable --now unifi-api-setup.service — porta 8080 fechada.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.
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
# 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
$ 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
$ 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
# 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.
# ── 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ável | Padrão | Obrigatoriedade | Descrição |
|---|---|---|---|
SECRET_KEY | — | Obrigatório | Chave JWT (64 chars hex). Nunca reutilizar entre ambientes. |
ENCRYPTION_KEY | — | Obrigatório | Chave Fernet AES-128 para senhas dos controladores. |
DB_PASSWORD | — | Obrigatório | Senha do role PostgreSQL unifi_api. |
INFLUXDB_TOKEN | — | Recomendado | Token de acesso ao InfluxDB 2.0. |
API_WORKERS | 4 | Opcional | Número de workers Uvicorn. Use CPU * 2 + 1. |
DEBUG | false | Opcional | Habilitar modo debug. NUNCA true em produção. |
ACCESS_TOKEN_EXPIRE_MINUTES | 30 | Opcional | Expiração do token JWT em minutos. |
ALLOWED_ORIGINS | http://localhost:8000 | Opcional | Origens CORS permitidas (separadas por vírgula). |
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
# 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
# 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
$ 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
# 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
<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)
$ 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.
# 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
Se a nova versão incluir alterações de schema, execute as migrations Alembic manualmente após o upgrade:
$ cd /opt/api-unifi-controle $ sudo -u unifi-api venv/bin/alembic upgrade head
10Desinstalação
| Comando | Efeito | Manté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 |
O banco PostgreSQL unifi_api e a role unifi_api não são removidos
automaticamente, nem mesmo no purge. Para remover:
$ sudo -u postgres dropdb unifi_api $ sudo -u postgres dropuser unifi_api
11URLs da API
Endpoints Completos
| Método | Endpoint | Descrição | Auth mínima |
|---|---|---|---|
| POST | /api/v1/auth/login | Autenticação — retorna par JWT | Público |
| POST | /api/v1/auth/refresh | Renovar access_token (token rotation) | Público |
| POST | /api/v1/auth/logout | Revogar refresh_token | JWT |
| GET | /api/v1/auth/me | Dados do usuário autenticado | JWT |
| POST | /api/v1/auth/password-reset/request | Solicitar reset de senha via e-mail | Público |
| POST | /api/v1/auth/password-reset/confirm | Confirmar reset com token e nova senha | Público |
| CONTROLADORES | |||
| GET | /api/v1/controllers/ | Listar controladores cadastrados | operator |
| POST | /api/v1/controllers/ | Cadastrar novo controlador (senha cifrada) | admin |
| PUT | /api/v1/controllers/{id} | Atualizar controlador | admin |
| DELETE | /api/v1/controllers/{id} | Remover controlador | admin |
| GET | /api/v1/controllers/status | Status em tempo real de todos os controladores | JWT |
| GET | /api/v1/controllers/summary/statistics | Estatísticas agregadas | JWT |
| DISPOSITIVOS, CLIENTES & REDE | |||
| GET | /api/v1/device/{controller_id} | Listar dispositivos (APs, Switches, GWs) | JWT |
| POST | /api/v1/device/{id}/{mac}/reboot | Reiniciar dispositivo remotamente | operator |
| GET | /api/v1/clients/{controller_id} | Listar clientes conectados | JWT |
| POST | /api/v1/clients/{id}/{mac}/block | Bloquear cliente | operator |
| GET | /api/v1/network/{id}/wlans | SSIDs com contagem de clientes | JWT |
| GET | /api/v1/network/{id}/networks | VLANs / subnets | JWT |
| SEGURANÇA, LOGS & MÉTRICAS | |||
| GET | /api/v1/security/{id}/alerts | Alertas de segurança (enriquecidos com nome do AP) | JWT |
| POST | /api/v1/security/{id}/alerts/archive-all | Arquivar todos os alertas ativos | operator |
| GET | /api/v1/security/{id}/firmware | Versão de firmware dos dispositivos | JWT |
| GET | /api/v1/logs/{id}/recent | Eventos 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 sistema | admin |
| GET | /api/v1/audit/logs | Log de auditoria completo | superadmin |
| GET | /api/v1/telegram/config | Configuração do bot Telegram | superadmin |
| PUT | /api/v1/settings/env | Editar .env via API (reinicia serviço) | superadmin |
| WEBSOCKET & HEALTH | |||
| WS | /ws/status | Stream de status de todos os controladores (10s) | JWT via msg |
| WS | /ws/controller/{id} | Stream detalhado de um controlador | JWT via msg |
| GET | /health | Health check geral | Público |
| GET | /info | Informações da versão e ambiente | Público |
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).
| Endpoint | Dados enviados | Intervalo | Limite/IP |
|---|---|---|---|
wss://<host>/ws/status | Status de todos os controladores | 10 segundos | 5 conexões |
wss://<host>/ws/controller/{id} | Detalhes de um controlador | 10 segundos | 5 conexões |
Exemplo 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)
# 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())
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ção | Endpoint | Detalhe |
|---|---|---|---|
| 1 | Usuário informa e-mail | POST /api/v1/auth/password-reset/request | Sempre retorna 200 (anti-enumeração). Token enviado por e-mail com TTL. |
| 2 | Usuário clica no link | — | Link no e-mail contém o token de reset. |
| 3 | Usuário define nova senha | POST /api/v1/auth/password-reset/confirm | Valida token + aplica nova senha. Token é descartado após uso. |
Configuração SMTP no .env
# ── 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
# 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" }'
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
# 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:
$ 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:
$ 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:
$ 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
$ 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:
$ 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
# 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.
- ☐ SO compatível (Ubuntu 22.04+ / Debian 12+) com acesso root
- ☐ PostgreSQL instalado e rodando (
pg_isready) - ☐ InfluxDB 2.0 instalado (recomendado)
- ☐
sudo dpkg -i api-unifi-controle_1.0.0_amd64.deb— sem erros - ☐
systemctl is-active unifi-api-setup→active - ☐ Wizard acessível em
http://IP:8080/setup - ☐ Step 1 do wizard: todos os pré-requisitos verdes
- ☐ Step 2: teste de conexão PostgreSQL OK
- ☐ Step 3: teste InfluxDB OK (ou toggle "configurar depois" marcado)
- ☐ Step 4: chaves SECRET_KEY e ENCRYPTION_KEY copiadas para local seguro
- ☐ Step 5: "APLICAR E INICIAR" — barra de progresso completa ✅
- ☐
/etc/api-unifi-controle/.envexiste com permissão0600 - ☐
systemctl is-active unifi-api→active - ☐
curl http://localhost:8000/health→{"status":"ok"} - ☐
systemctl is-active unifi-api-setup→inactive - ☐ Apache2 habilitado e proxy reverso funcionando
- ☐ SSL configurado com Let's Encrypt (produção)
- ☐ Logrotate configurado (
/etc/logrotate.d/unifi-api)
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).