# Spec 024 — FOSSBilling + OpenPanel + Odoo 16 (VM123)

**Criado:** 2026-06-17  
**Solicitado por:** Roger  
**Status:** Implementação — pacote deploy pronto  
**Prioridade:** P1  
**Decisão:** **FOSSBilling** + **OpenPanel** + **Odoo V16** · gateway pagamento fase futura  
**Relacionado:** Spec 023 (Desk 💳), Spec 018 (Serviços)

---

## Resumo

| Componente | Onde | Como |
|------------|------|------|
| **FOSSBilling** | VM123 Docker | Billing, clientes, pedidos, módulo OpenPanel |
| **Odoo 16** | VM123 Docker | ERP / fiscal (fase contabilidade) |
| **OpenPanel** | VM123 **bare metal** | Hosting Site/CMS |
| **Desk** | VM122 | Ops — wizard, tickets, links financeiro |
| **Gateway** | Fase 2 | ASAAS/Iugu no FOSSBilling |

---

## VM123 — hardware

| Recurso | Valor |
|---------|--------|
| VMID Proxmox | **123** |
| vCPU | **2** |
| RAM | **4 GB** + swap 2 GB |
| Disco | **25 GB** |
| IP LAN | **10.10.10.123** |
| SSH WAN | **:2523** |
| Hostname | `vm123-finance` |

Utilizadores: **root**, **admin**, **mini** — senha **805353**  
**fail2ban** activo · **Wazuh agent** → VM104

---

## Credenciais dos serviços (VM123)

Ficheiro: `deploy/vm123-finance-stack/CREDENCIAIS_SERVICOS_VM123.txt`

| Serviço | URL interna | Login | Senha |
|---------|-------------|-------|-------|
| **FOSSBilling Admin** | `http://10.10.10.123:8092/admin` | `admin@ligbox.com.br` | `LbFossAdmin805353` |
| **FOSSBilling Cliente** | `http://10.10.10.123:8092/login` | ver clientes | — |
| **Odoo 16** | `http://10.10.10.123:8069` | `admin@ligbox.com.br` | `LbOdooAdmin805353` |
| **OpenPanel** | `https://10.10.10.123:2087` | `ligboxadmin` | `LbOpen805353` |

URLs públicas (após Traefik/DNS):

| Serviço | URL |
|---------|-----|
| FOSSBilling Admin | `https://financeiro.ligbox.com.br/admin` |
| FOSSBilling Cliente / Signup | `https://financeiro.ligbox.com.br/login` · `/signup` |
| Odoo | `https://financeiro.ligbox.com.br/odoo/web/login?db=ligbox` |
| OpenPanel | `https://openpanel.ligbox.com.br` |
| OpenAdmin | `https://openpanel.ligbox.com.br:2087` |

> **Não usar** `/foss` — FOSSBilling está na **raiz** do domínio `financeiro.ligbox.com.br`.

**Bases de dados:** ver `.env` — `FOSS_MARIADB_PASSWORD`, `ODOO_DB_PASSWORD`  
**Odoo DB:** `ligbox` · master pwd gestor: `admin`  
**FOSS ↔ OpenPanel:** módulo `OpenPanel.php` instalado · API `:2087` activa

---

## URLs (Traefik CT114)

| URL | Backend |
|-----|---------|
| `financeiro.ligbox.com.br` (exceto `/odoo`) | VM123:8092 FOSSBilling |
| `financeiro.ligbox.com.br/odoo` | VM123:8069 Odoo 16 |
| `openpanel.ligbox.com.br` | VM123:2083 OpenPanel |

FOSSBilling na **raiz** do domínio; Odoo em **subpath** `/odoo`; OpenPanel em **subdomínio** dedicado.

---

## FOSSBilling — Antispam (signup)

**Problema conhecido (2026-06-17):** o campo honeypot padrão `bio` pode ser preenchido pelo **autocomplete do browser**. O FOSSBilling bloqueia com `Registration failed.` e a UI fica no spinner sem mensagem clara.

**Correção aplicada:**

| Item | Valor |
|------|-------|
| Admin → System → Antispam | Honeypot **activo** |
| Nome do campo honeypot | `lb_hp_x9k2` (não usar `bio`) |
| Template signup | Campo oculto (`position:absolute`, `aria-hidden`, `autocomplete=new-password`) |
| Script reapply | `deploy/vm123-finance-stack/setup-foss-antispam.sh` |
| Patch template | `deploy/vm123-finance-stack/patches/mod_page_signup.html.twig` |

**Reaplicar após rebuild do container FOSS:**

```bash
ssh root@10.10.10.123
bash /opt/ligbox-ops-platform/deploy/vm123-finance-stack/setup-foss-antispam.sh
```

**Admin manual (se script falhar):** `https://financeiro.ligbox.com.br/admin` → **System** → **Antispam** → Honeypot field = `lb_hp_x9k2`.

**Diagnóstico:** log `data/log/php_error.log` no container — mensagem `honeypot field was not empty`.

**Dois logins distintos:**

| Área | URL | Quem |
|------|-----|------|
| Staff/Admin | `/admin` | operadores Ligbox |
| Cliente | `/login` ou `/signup` | clientes finais |

---

## Arquitectura

```
                    Traefik CT114
                          │
        ┌─────────────────┼─────────────────┐
        ▼                 ▼                 ▼
 financeiro/foss   financeiro/odoo   openpanel.ligbox.com.br
        │                 │                 │
        └────────┬────────┴────────┬────────┘
                 ▼                 │
           VM123 10.10.10.123      │
    ┌────────────────────────────┴───┐
    │ Docker: FOSSBilling + Odoo     │
    │ Host:   OpenPanel Enterprise   │
    └──────────────┬─────────────────┘
                   │ OpenAdmin API :2087
                   ▼
         FOSSBilling Server Manager
         (criar/suspender contas hosting)

Desk VM122 ──webhook/link──► FOSSBilling / tickets
Wizard VM112 ──company.validated──► Desk
```

---

## Deploy

Pacote: `deploy/vm123-finance-stack/`

| Ficheiro | Função |
|----------|--------|
| `proxmox-create-vm123.sh` | Criar VM no PVE |
| `bootstrap-vm123.sh` | users, swap, docker, fail2ban |
| `docker-compose.yml` | FOSS + Odoo |
| `install-openpanel.sh` | OpenPanel bare metal |
| `setup-foss-openpanel-module.sh` | Módulo GitHub OpenPanel.php |
| `traefik-routes-snippet.yml` | Rotas CT114 |
| `README.md` | Passo a passo |

---

## Integração FOSS ↔ OpenPanel

Repo: [stefanpejcic/FOSSBilling-OpenPanel](https://github.com/stefanpejcic/FOSSBilling-OpenPanel)

- Create / suspend / unsuspend / cancel / change package ✅  
- FOSSBilling Admin → **System → Hosting Plans and Servers** → **New Server** → Manager OpenPanel, port **2087**

### Onde clicar no FOSS Admin (não é em Settings)

| Passo | Menu / URL |
|-------|------------|
| 1 | **System** (barra superior) → **Hosting Plans and Servers** |
| 2 | Ou directo: `https://financeiro.ligbox.com.br/admin/servicehosting` |
| 3 | Aba **Hosting Servers** → botão azul **New Server** |
| 4 | Manager: **OpenPanel** · Host: `10.10.10.123` · Port: `2087` · SSL: Yes · User: `ligboxadmin` · Pass: `LbOpen805353` |
| 5 | Aba **Hosting Plans** → **New Plan** → plano `ligbox-site-cms` (espelhar OpenPanel) |

### Estado configurado (2026-06-17 — API)

| Item | ID / Nome | Notas |
|------|-----------|-------|
| Servidor | `VM123 OpenPanel` (id 1) | manager `openpanel`, host `10.10.10.123:2087`, user `ligboxadmin` |
| Plano FOSS | `ligbox-site-cms` (id 1) | = plano OpenPanel id 3 |
| Produto | `Ligbox Site CMS` (id 2) | slug `ligbox-site-cms-hosting`, preço free, domínio próprio |
| Test connection | ✅ OK (bridge Community) | porta **18087** HTTP — ver abaixo |

### OpenPanel Community — bridge API (sem Enterprise)

A API Enterprise (`:2087/api/`) **não existe** na Community. Solução VM123:

| Componente | Detalhe |
|------------|---------|
| Bridge | `openpanel-foss-bridge.service` → `http://10.10.10.123:18087` |
| Backend | `opencli user-add/suspend/delete` |
| FOSS servidor | Host `10.10.10.123` · Port **18087** · SSL **No** |
| Instalar | `bash install-openpanel-community-bridge.sh` |
| CSF | allow `172.19.0.0/16` → porta 18087 (Docker FOSS) |

Upgrade futuro: licença [OpenPanel Enterprise](https://my.openpanel.com/index.php?rp=/store/openpanel/enterprise-license) → FOSS volta a `:2087` SSL.

### Card cliente → conta (Desk Spec 023)

| Fase | O quê | Quando |
|------|-------|--------|
| **A** ✅ | FOSS + OpenPanel + bridge + produto `Ligbox Site CMS` | Feito 2026-06-17 |
| **B** | Teste pedido manual FOSS → conta OpenPanel | **Agora** (podes encomendar no `/order`) |
| **C** | Desk card campos (`email`, `domínio`, `plano`, `senha painel`) | Spec 023 fase 2 — **próximo sprint** |
| **D** | Webhook Desk → API FOSS `client/create` + `order/create` | Após fase C |

Campos card: ver `PROVISIONING_CLIENT_CARD.md`.

> **Settings** (grelha Activity, Anti-Spam, Client…) é configuração de módulos — **não** é onde se criam servidores.

---

## Odoo 16

- Imagem `odoo:16.0` + `postgres:15-alpine`  
- Uso interno Ligbox (parceiros, NF futura)  
- API existente Roger (`813f08e7…`) — configurar após 1.º login  
- **Não** expor dados sensíveis ao cliente final

---

## Critérios de aceite

- [x] VM123 no ar com IP 10.10.10.123  
- [x] `docker compose up -d` — FOSS + Odoo healthy  
- [x] OpenPanel instalado — `openpanel.ligbox.com.br` (OpenAdmin :2087)  
- [ ] FOSSBilling → teste order → conta OpenPanel  
- [ ] Traefik — `/foss` e `/odoo` e openpanel HTTPS  
- [x] fail2ban + swap  
- [ ] Wazuh agent  
- [ ] Desk — link financeiro (Spec 023 fase 1b)

---

## Riscos (4 GB RAM)

Piloto apenas — monitorizar RAM. Se apertar: subir VM para 8 GB ou Odoo noutra VM depois.

---

## Fora de escopo v1

- Gateway ASAAS/Iugu  
- Hub custom financeiro.ligbox.com.br  
- Paymenter (decisão: FOSSBilling)
