DomainsMode

Multi-network domain management

DomainsMode

Two API backends, one unified UI. Browse domains across both networks, apply content in bulk, and track per-domain results — all in one authenticated dashboard.

Two independent networks

API 1 and API 2 run as separate containers, each with their own MySQL database and Bearer token. Internal-only — accessed by the UI over the Docker network, never exposed publicly.

Bulk content creation

Select any number of domains across both networks, write title + body once, and submit. Results show per-domain — successes and 409 conflicts inline.

Filter & paginate

Filter by network, nameserver, MX record, A record, or domain name. Configurable page size (10 – 250 rows). Pagination with smart ellipsis.

API authentication

Each API container is protected by a static Bearer token. Tokens differ between api1 and api2. The UI injects the correct key per request automatically.

Dockerised, zero setup

docker-compose up -d --build starts all services, runs migrations, and seeds a default admin account automatically.

One content per user / domain

A unique constraint on (domain_id, user_id) enforces one record per user per domain. Duplicates return a 409 displayed inline.

Architecture

UI :8000
  • Laravel 12 + Livewire 3
  • Breeze auth
  • DB: domainsmode_ui
  • Fetches & merges both networks
  • Bulk content orchestration
API 1 internal
  • Laravel 12 JSON API
  • DB: network_1
  • Bearer token auth
  • GET /api/domains
  • POST /api/domains/{id}/content
API 2 internal
  • Same codebase as API 1
  • DB: network_2
  • Different Bearer token
  • ~450 domains, independent
  • Separate contents table

Quick start

Run locally

# clone and start everything
git clone https://github.com/ash-rain/domainsmode
cd domainsmode
docker-compose up -d --build

# done — open in browser
open https://localhost:8443

Migrations and seeding run automatically inside each container on startup.

Default credentials

Field Value
Email [email protected]
Password password

Created by the UI container on first start via DatabaseSeeder. Uses firstOrCreate — safe to restart.

Services

UI Dashboard localhost:8443
API — Network 1 localhost:8444
API — Network 2 localhost:8445
Grafana Logs /grafana