CentralCloud unified portal — Elixir/Phoenix umbrella (centralcloud_my: customer, centralcloud_ops: staff/oncall, centralcloud_core: shared)
Find a file
Mikael Hugo a3622f29ef feat: elixir 1.20-rc4 flake, AI ops chat (ChatLive + RouterAgent)
- flake.nix: custom elixir_1_20_rc4 derivation via overrideAttrs on
  beamPackages.elixir_1_19 with headless OTP 28; nixos-25.11 pinned
- mix.exs (ops + my): elixir ~> 1.20
- Dockerfile: note 1.19.5 stays until hexpm publishes 1.20 stable image
- New: ChatLive — full-screen AI ops chat with SSE streaming, scroll hook,
  suggestion buttons, typing indicator, clear history
- New: RouterAgent — streams OpenAI-compatible SSE from router-agent svc;
  configurable URL + API key via env; sends {:chunk,t}/:stream_done msgs to LiveView
- Router: add live /chat route under auth pipeline
- Layouts: AI Chat nav link + ScrollBottom JS hook inline
- Application: Finch pool started for RouterAgent HTTP client
- Priv/static: phoenix.min.js + phoenix_live_view.min.js bundled
- Config: ROUTER_AGENT_URL / ROUTER_AGENT_API_KEY in dev.exs + runtime.exs

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-11 11:23:14 +02:00
_build/dev fix: use Bandit adapter via config — Phoenix boots on port 4001 2026-05-09 20:25:18 +02:00
apps feat: elixir 1.20-rc4 flake, AI ops chat (ChatLive + RouterAgent) 2026-05-11 11:23:14 +02:00
config feat: elixir 1.20-rc4 flake, AI ops chat (ChatLive + RouterAgent) 2026-05-11 11:23:14 +02:00
deps feat: Elixir 1.20-rc4/OTP28, wire Phoenix endpoints, router, LiveViews, auth plug 2026-05-09 20:20:19 +02:00
rel/overlays/bin feat: add health endpoint, release config, and Dockerfile for k8s deployment 2026-05-09 20:45:22 +02:00
.envrc feat: add flake.nix, .envrc, fix config (runtime.exs), deps compile clean 2026-05-09 19:55:48 +02:00
.gitignore chore: add _build/ and deps/ to .gitignore 2026-05-09 20:25:22 +02:00
Dockerfile feat: elixir 1.20-rc4 flake, AI ops chat (ChatLive + RouterAgent) 2026-05-11 11:23:14 +02:00
erl_crash.dump feat: add health endpoint, release config, and Dockerfile for k8s deployment 2026-05-09 20:45:22 +02:00
flake.lock chore: pin nixpkgs to nixos-25.11 and add centralcloud cache config 2026-05-10 23:16:14 +02:00
flake.nix feat: elixir 1.20-rc4 flake, AI ops chat (ChatLive + RouterAgent) 2026-05-11 11:23:14 +02:00
mix.exs feat: add health endpoint, release config, and Dockerfile for k8s deployment 2026-05-09 20:45:22 +02:00
mix.lock feat: add flake.nix, .envrc, fix config (runtime.exs), deps compile clean 2026-05-09 19:55:48 +02:00
README.md feat: scaffold centralcloud Elixir umbrella (my. + ops. + core) 2026-05-09 19:49:01 +02:00

centralcloud

Elixir umbrella app for CentralCloud customer and staff portals.

Apps

App URL Audience
centralcloud_my my.centralcloud.com Customers — unified dashboard
centralcloud_ops ops.centralcloud.com Staff — ops and on-call
centralcloud_core (library) Shared: HostBill client, DR API client, OIDC

my.centralcloud.com will also serve www.centralcloud.com (marketing pages) when DNS is repointed.

Quick start

# Install Elixir 1.17+ and Phoenix
mix local.hex --force
mix archive.install hex phx_new --force

# Install deps
mix deps.get

# Run my. portal (port 4001)
cd apps/centralcloud_my
mix phx.server

# Run ops portal (port 4000)
cd apps/centralcloud_ops
mix phx.server

Required env vars

MY_SECRET_KEY_BASE=...        # mix phx.gen.secret
OPS_SECRET_KEY_BASE=...
HOSTBILL_API_ID=...           # from HostBill admin API keys
HOSTBILL_API_KEY=...
DR_PORTAL_URL=https://dr.centralcloud.com
DR_PORTAL_API_KEY=...
OIDC_CLIENT_ID=...            # Authentik application client ID
OIDC_CLIENT_SECRET=...

Architecture

See ../dr-repo/docs/adr/001-unified-portal-architecture.md