Camel Towers documentation
This handbook explains how a guest Wi-Fi purchase travels through the portal, Go API, mobile-money provider, database, and Cudy access point. It is written from the implementation in this repository; sections that depend on a physical AP or provider account are marked as needing verification.
Start with the task you have
- Understand the system: services, hostnames, and trust boundaries.
- Run it locally: start the Docker stack and browse the apps.
- Connect the Cudy AP1300 Outdoor: field-by-field portal and RADIUS setup.
- Understand payment and access: invoices, signed callbacks, grants, and login.
- Use the HTTP API: routes, methods, inputs, responses, and errors.
- Deploy to the VPS: DNS, Caddy, Docker Compose, firewall, and secrets.
What this platform sells
Guests buy Wi-Fi access time with Tanzania mobile money. The product is a time-limited network pass; it does not buy phone airtime or mobile data bundles. Plans can store a data-limit value, but the current RADIUS implementation does not enforce byte quotas. Do not advertise quota-based plans yet.
Readiness at a glance
The software has a Go API, two Next.js apps, PostgreSQL migrations, Abliner and SendAfrica adapters, a RADIUS listener, and a manual Cudy configuration page. A local stack was started and its pages and admin API were checked. A successful payment and access session on the AP1300 firmware have not been verified.
The screenshots identify the AP1300 Outdoor Manual captive-portal page, but Cudy’s published field descriptions differ between product families. Verify the UAM redirect, RADIUS accounting, lease behavior, and CoA disconnect on the exact AP1300 hardware and firmware before enabling real sales.
Public services
| Hostname | Purpose |
|---|---|
api-towers.camelcreatives.com | Go REST API, Abliner callback, and RADIUS host DNS |
wateja-towers.camelcreatives.com | Guest purchase portal and UAM callback page |
towers.camelcreatives.com | Staff admin console |
docs-towers.camelcreatives.com | This public, read-only handbook |
All domains can point to the same VPS. Caddy selects the upstream by hostname and terminates HTTPS. RADIUS uses UDP ports and does not pass through Caddy.