#FE: Add a server (from backend Phase 8)
Phase 8 status (2026-10-16 10:59, Pair 2): 8.1 (all 5 cloud providers), 8.3, 8.4, 8.5, 8.7, 8.9–8.12 built & pushed. 8.8 checks built except plan active / server limit (wait for Phase 7) and provider enabled by admin (waits for the admin panel). Pending: 8.2 managed (waits for Billing — no user screen anyway, D-36) and 8.6 Lite (waits for Phase 10 + Phase 12 Control Panel). Still needs the OSS installer update before install-based ways go live.
Frontend spec for backend Phase 8 — Servers: create & connect — requirements complete 2026-10-06 (Pair 1), not built. V8 requirement The phase the Servers screens had been waiting on since the first draft of this site. It covers six ways to get a server into Central — five of which install the OSS panel — what Central stores about it, and what happens while the install runs.
i18n namespaces: servers.add.*, servers.create.*, servers.connect.*, servers.install.*.
#Connect a panel — built (B8.5, Pair 2 API62–64)
🆕 Route/navigation: Servers → Add server → Connect a panel (/servers/create?source=connect_oss, proposed) → on success → Server details (/servers/{id}). Backend: API62 connect, API63 list, API64 view — all under the selected organization. Permission: server manage to connect, server view to list/view; not a member → 404, role without the permission → 403 (hide Add server). i18n: servers.connect.*, servers.list.*, servers.errors.*.
- Form fields (updated 2026-10-14 11:22): API address — request field
api_url(renamed frompanel_url) (https://api.…, shown together with the Central token in the OSS panel; port 443 only, no login/query/#; a path is dropped). The panel's web address (https://panel.…) is not accepted — label the field "API address" with an example and help text, not "Panel address" · Central token (from the panel: Admin → Central, shown with the API address; starts withsv_central_, no spaces) · Name (optional, max 100; default = server hostname). Help text tells the user where to find the token. - Connect: button shows loading and is disabled while Central checks the panel live (a few seconds). ✔ 201 →
TOAST"Server connected" → Server details. ✖ 422 → show the backendmessageas is:- private/local address → field error on API address (
api_url); oss_unreachable(offline, wrong address, firewall) ·oss_not_a_panel(something answered, but not the OSS API — e.g. thepanel.…address was entered instead ofapi.…; hint the user to use the API address) ·oss_bad_response(answered with data Central couldn't read) ·oss_error;oss_token_rejected→ also tell the user to generate a new token in the panel;server_already_connected→ this panel (same address or IP) is already in ServerAvatar — keep it neutral, never say whose account.- 429 (10/min) → wait and retry.
- private/local address → field error on API address (
- Server list (API63): cards/rows: name, hostname, status label, source label, API address (
api_url; the panel's web address ispanel_url), public IP (or "—"), stack, OS, created by, connected date. Newest first, 12 per page (max 50). Empty → "No servers yet" + Add server. No search/filters yet (they come with the server-list step). - Server details (API64): the same fields plus the one-time
system_info(renamed fromfacts, 2026-10-14) (OSS version, OS, CPU/cores, RAM and disk in bytes → format with locale, web server, app count) labelled "at the time it was added" — not live. Another organization's server → 404 page. The Central token is never shown. - Statuses: pending, creating, installing, connecting, ready, failed (use
status_label). Sources:connect_oss,install_command. Stack values now includedocker. - Done when: connect form validation, loading/disabled, every 422 code + 429, success redirect, list pagination/empty, details 404, permission hide/deny and locale formatting pass against Pair 2's API.
#Cloud server — all five providers built (B8.1, Pair 2 API71–75)
🆕 Route/navigation: Servers → Add server → Cloud provider (/servers/create?source=cloud, proposed) → progress screen = Server details (/servers/{id}). Backend: API71 accounts, API72 regions, API73 sizes, API74 create, API64 view (poll), API75 retry, API67 delete. Permission: server manage (no Integrations permission needed to pick an account). i18n: servers.cloud.*, servers.install.*, servers.errors.*.
- Step 1 — Account (API71): the organization's connected cloud accounts. Only providers in
meta.supported_providers(all five:digitalocean,vultr,hetzner,linode,lightsail) can be picked; others greyed "Coming soon". Account withstatus: needs_new_token→ disabled with "Update this account in Integrations" link. No accounts → "Connect a cloud account first" → Integrations. - Step 2 — Region (API72) list by name → Size (API73) for that region (1 GB and up, cheapest first; show the price/specs the API returns with its
currency— USD for DigitalOcean/Vultr, EUR for Hetzner; never assume $. Hetzner also lists Arm (CAX) sizes) + Ubuntu (22.04 / 24.04 / 26.04) + Stack (LEMP / LAMP / MERN / OpenLiteSpeed / Docker) + Name (rules per provider, as V7 — DigitalOcean: max 63, letters, numbers, dots, hyphens; Vultr: no dots; show the API's field error) + optional your SSH public key (ssh-ed25519 / ssh-rsa / ecdsa; for your own SSH access) + Linode only: root password (required; 11–128 characters with lower + upper case, a number and one of @$!%*#?&; Linode's own strength check may still refuse it — show its reason; never kept after the request; don't send it for other providers). Linode hides sold-out and GPU/Accelerated plans. Lightsail only: availability zone — regions from API72 carryzones; pick a region, then a zone (required for Lightsail, don't send for others). Tell Lightsail users the server has no static IP (as V7: the IP can change after a stop/start in AWS). - Create (API74) → spinner (a few seconds) → ✔ 201 → progress screen: Creating ("Creating your server at {provider}…", up to 15 min) → Installing (step + title) → Connecting → Ready ("Open your panel now and create your admin account").
- ✖ (nothing saved):
cloud_provider_not_supported·cloud_account_not_connected/cloud_token_rejected→ "Update the account in Integrations" ·cloud_rejected(DigitalOcean's reason, e.g. size not in region) ·cloud_unavailable(503, try again) ·central_ssh_key_missing(503 — Central not set up; contact support) · 429. Region/size loading errors use the same codes. - Failed (extra reasons:
cloud_create_failed,cloud_timeout,cloud_token_rejected,cloud_account_not_connected,server_ip_in_use,ssh_start_failed): Retry (API75)CONFIRM— same droplet, no new cost → back to Creating; 409cloud_server_gone→ "The server was deleted at DigitalOcean — delete it here and create a new one". Delete (API67)CONFIRMwith checkbox "Also delete this server in my {provider} account" (it still costs money there) →delete_at_provider; a provider error stops the delete (nothing removed, try again). - Install fixes (Pair 2, 2026-10-21, built): (1) a panel that only got a self-signed certificate now still becomes Ready — nothing extra to show. (2) New Failed reason
ssh_login_refused(Central's SSH key refused; shows after ~3 min instead of a silent 15-mincloud_timeout). (3) Retry after a finished install only re-checks the panel (no new install, same server) — keep the same RetryCONFIRM, back to Connecting. (4) Show the real cause: under the Failed message renderfailure_detail.messagewhen it is notnull(e.g. "The SSL certificate at … is not valid");failure_detail.codeis for logic only (e.g.cloud_not_active,ssh_port_closed,tls_invalid,connect_timeout). Texts come translated from the backend — never show raw errors. - Start-up script (Pair 2, 2026-10-22, built): a new cloud server now starts the panel install by itself at first boot; Central falls back to SSH after ~5 min if it did not. No new screen or step. Frontend notes: the server's IP may already show while still Creating (
public_ipset) — show it when present; acloud_timeoutfailure can carryfailure_detail.codeuser_data_pending(the start-up script never ran) — show itsfailure_detail.messagelike any other cause. - Note for users: without their own SSH key they reach the server through the panel or the DigitalOcean console (Central's key is removed after a successful install).
- Done when: account/region/size steps with every state, supported-provider greying, needs-new-token link, validation, every create error, progress polling incl. Creating, Retry (+ server gone) and Delete with/without provider deletion pass.
#Root password — built (B8.3, Pair 2 API69–70)
🆕 Route/navigation: Servers → Add server → My own server → "Yes, I have the root password" (/servers/create?source=root_password, proposed) → progress screen = Server details (/servers/{id}), same as the install command but without the command box. Backend: API69 add, API64 view (poll), API70 retry, API67 delete. Permission: server manage (email check in the frontend — see D-59). i18n: servers.rootPassword.*, servers.install.*, servers.errors.*.
- Form: Name (max 100) · Stack (LEMP / LAMP / MERN / OpenLiteSpeed / Docker) · IP (public IPv4 only) · SSH port (default 22) · Root password. Tip under the form: "Allow SSH from 23.172.120.38 and enable root password login." → Add server (spinner, a few seconds).
- Root password: never kept after the request — no state, storage, logs, URLs or analytics; clear the field on success and on error.
- ✔ 201 → progress screen: poll API64 every ~5 s while Installing / Connecting, show
installation_status.step+.title; Ready → "Open your panel now and create your admin account" (panel_url). - ✖ 422 (nothing saved — show the API
messageas is):server_ip_in_use(IP already in ServerAvatar) ·ssh_unreachable_from(wrong IP/port, offline, firewall — plain V7 message since 2026-10-16, Central's IP no longer shown) ·ssh_login_failed(password refused or root login disabled) ·ssh_unsupported_os(not Ubuntu 22.04/24.04/26.04) ·ssh_unsupported_arch(not x86_64/ARM64) ·ssh_start_failed· field errors. 429 (10/min per user, 5/min per IP) → wait. - Failed → Retry (API70)
MODAL: asks for the root password again (+ SSH port) → back to Installing with a new token. 409 if not failed; SSH errors keep it Failed with the message. Delete (API67)CONFIRM→ Servers list. - Hostinger servers: nothing extra for the user (Central cleans up as V7).
- Done when: form validation, IP rules, password never retained, every SSH error, progress polling, Ready link, Retry (password again) and Delete pass.
#Install command — built (B8.4, Pair 2 API65–68)
🆕 Route/navigation: Servers → Add server → My own server → "No root password" → Install command (/servers/create?source=install_command, proposed) → install progress page = Server details (/servers/{id}). Backend (renumbered 2026-10-16): API65 create, API64 view (poll), API66 retry, API67 delete (one delete API for every server; for cloud servers it can also delete the droplet); API68 is the installer report (not for the frontend). The old "command again" API was removed 2026-10-15. Permission: server manage. Email verification (changed 2026-10-15): the API no longer checks it — the backend says the frontend must block unverified users (and an unverified owner, as V7) before showing the form: "Verify your email to add a server" + Resend. See D-59. i18n: servers.install.*, servers.errors.*.
- Simple flow (2026-10-15): Name + Stack → Create server → the command and the live steps on the same screen.
- Form: Name (required, max 100) + Stack (LEMP / LAMP / MERN / OpenLiteSpeed / Docker — added 2026-10-15; API values
lemp,lamp,mern,ols,docker). No IP field, no force-cleanup option, no database field. Submit → 201 → progress page. - Command box: the one-line command (copy button) + "Run this as root on your Ubuntu 22.04 / 24.04 / 26.04 server". The command holds the server's secret token — never log it, put it in a URL or analytics; show it only from the 65/67 answers. No "show command again" (removed 2026-10-15): if the page is refreshed before the command is run, the user starts again.
- Field name (2026-10-16): the install progress object is
installation_status(wasinstall). - Progress (poll API64 every ~5 s while pending / installing / connecting; stop on leave):
- Pending — waiting for the command to run (command + live steps on the same screen). A never-run server is not shown in the server list and is removed automatically after 24 h (not Failed).
- Installing — show
installation_status.step+installation_status.titleas sent by the installer (English, show as is), e.g. "[08] Fetching the panel". - Connecting — "Connecting…" (Central checks the new panel, up to ~5 min).
- Ready — "Open your panel now and create your admin account" + link to
panel_url(the panel's web address;api_urlis the API address). Then the normal server page. - Failed —
failure_message+ where it stopped (installation_status.title/installation_status.message) + Retry and Delete. Codes: install_failed, install_timed_out (30 min silent), oss_unreachable, oss_token_rejected, oss_bad_response, oss_error, install_panel_mismatch, server_already_connected.
- Retry (API66) — only for Failed (2026-10-15) —
CONFIRM("the old command stops working") → new command + Pending again. 409 otherwise. - Delete (API67 — the one delete API for all servers)
CONFIRM→ 204 → Servers list. Only for install-command servers that never became Ready (409 otherwise; deleting a Ready server comes with Phase 9). - 429 (10/min for create + retry) → wait and retry.
- Done when: form validation, frontend email-verified block (user + owner), command copy + no leaks, every status with polling start/stop, Ready panel link, every failure code with Retry/Delete, 409 cases and permission hide/deny pass — and the OSS installer update is live.
#A. The six ways to add a server
| # | Way | Rules from the backend doc | Frontend notes |
|---|---|---|---|
| 8.1 | Your own cloud account | Uses a provider account from Phase 5 (DigitalOcean, Vultr, Linode, Hetzner, Lightsail). The user picks name, region, size, Ubuntu version (22.04, 24.04 or 26.04 — settled 2026-10-07) and an optional SSH key. Linode needs a root password, Lightsail a zone. Name rules per provider, as V7. OSS is installed | Confirms the wizard this site already specced. Two per-provider quirks must be handled by the form rather than hidden: Linode's extra root password field and Lightsail's zone. "Name rules per provider" means validation differs by provider, so the rules come from the API — never one regex for all five |
| 8.2 | Managed server | Pair 1: Step 1 built 2026-10-27 (create only; hourly billing, negative balance and power/resize/reboot come later). The user picks a visible size from the admin price list (Server Plans, 17.18), a name, Ubuntu version, stack and optionally their own SSH key (as V7). Credit and trial checks from 6.9 (owner's paid credits ≥ one month, verified email, no managed-server limit). Delete always deletes the VM too. A failed install deletes its VM automatically (Pair 1, 2026-10-27, as V7): the server stays Failed with its reason and can only be deleted — no Retry for managed servers. Billing starts 10 minutes after the server is Ready. Older text (Pair 2 still says this): Created in ServerAvatar's own cloud account from the admin price list. Credit checks, | Conflict D-36 — the frontend builds no screen for this. Bhavik removed the "Managed server" choice from the wizard on 2026-10-05. Pair 1 has now built the create flow (2026-10-27), so the conflict is no longer only on paper — needs Bhavik's decision (pending entry 101). Existing managed servers still work in full |
| 8.3 | Existing server — root password | The user gives IP, SSH port and root password. Central logs in over SSH and runs the OSS installer. Hostinger fixes as V7 (force cleanup moved to 8.7 on 2026-10-06, and is now optional). The root password is used for the install only and not stored (as V7) | "Not stored" is worth saying on the screen, because users hesitate to type a root password into a web form. The Hostinger case this site has carried since 2026-10-03 is now confirmed. Force cleanup is no longer automatic — it is an optional tick-box (8.7), so the wizard must let the user choose it and say plainly what it removes |
| 8.4 | Existing server — install command | Updated 2026-10-15 (Pair 2, built): user enters name + stack (no IP). Central shows the official OSS install command; the user runs it as root. The installer reports each step; Central checks the new panel → Ready, then tells the user to open the panel and create the admin account. Fails if not run in 24 h or silent for 30 min → Retry (new command) or Delete | See Install command — built |
| 8.5 | Connect an existing OSS panel | In OSS: Settings → Central → Enable, copy the API address and token. In Central: enter the API address (https://api.…) and token — the panel's web address is not accepted (updated 2026-10-14). Checks: HTTPS, health check answers, token accepted, panel not linked to another account, plan limit OK | Matches what this site already documented, with one addition worth the wording: "panel not linked to another account" must be a neutral message — it must not reveal whose account it is |
| 8.6 | Free managed server — "ServerAvatar Lite" | Kept, as V7: an install script registers the server without a ServerAvatar account. The server is attached to ServerAvatar's own accounts (admin-set list) and their plan; the person gets a limited panel login — as V7: 100 apps, 100 databases, with backups, Git, Fail2ban, staging, clone, workers, cloud storage and disk cleaner off. Corrected 2026-10-06: OSS is NOT installed on this type (the phase goal now says so explicitly, and the automatic token rule in 8.10 no longer covers it). Re-installing on the same IP replaces the old free server | Even further outside Central than it first looked (D-41). It has no Central account and no OSS panel — and every server screen in this spec is driven by the OSS API, so Central could not manage one of these even if it wanted to. Whatever the script installs to provide that "limited panel login" is not named in the doc. So there is still nothing to add to the add-server wizard, and now also nothing the server screens could show. Flagged, not invented Changed 2026-10-16 (Pair 2): Lite now does get the OSS panel (it replaces the V7 agent; the install command is the official OSS installer, as 8.4). The limited login is the Control Panel user of Phase 12 (12.1–12.6); 8.6 = backend 12.12. Built after Phase 10 and the Phase 12 Control Panel — no frontend screen yet. |
#B. What every way shares
Update 2026-10-27 (Pair 2, local commit): every way that installs the OSS panel (cloud server, root password, install command, managed) accepts an optional panel administrator (username + password). If the user leaves both empty, Central creates one (
admin+ 24 random letters/digits) and returns it once in the create response. Show it on a one-time screen with copy buttons and a clear "save this now — it won't be shown again" note. Central no longer keeps the username, so the server page must not show a panel-admin username afterwards.
| # | Feature | Rules | Frontend notes |
|---|---|---|---|
| 8.7 | Stack & install options | LEMP, LAMP, OpenLiteSpeed, MERN — and Docker since 2026-10-15 (Jayshree, as the OSS installer; was "No Docker"). No database at creation — the user adds a database engine in OSS after the install. Added 2026-10-06: "force cleanup" is an optional choice in every way that installs on a server (8.1–8.4 and 8.6) Settled 2026-10-07: Ubuntu 22.04, 24.04 and 26.04 only — 20.04 is not supported in V8, and the installer refuses a server on any other version. MongoDB is not available on 26.04 (an OSS limit). | Confirms Bhavik's decision that the wizard has no database-engine field; worth a line on the review step so nobody wonders where MySQL went. The new part is a real control to design: force cleanup is a tick-box the user chooses, not something that silently happens, so it needs plain wording about what gets removed — this is the switch that makes an existing server with Apache or MySQL on it usable |
| 8.8 | Checks before creating | As V7: user and owner email verified, plan active and server limit not reached (Phase 7 — ⏳ skipped for now, added after Phase 7, 2026-10-12), provider enabled by the admin, IP not already used | Five refusals the wizard must show before the create button rather than after. Two are interesting: it is the owner's email that must be verified too (so a member can be blocked by someone else's unverified email — say whose), and "IP not already used" only applies to the existing-server ways |
| 8.9 | Install progress | Live steps until the install finishes. | The progress screen this site already specced, now confirmed: named steps, a real reason on failure, and exactly two recoveries. Safe to leave the page |
| 8.10 | Token — answers Q2 | Narrowed 2026-10-06 to 8.1–8.4: for those the installer creates the Central token and saves it in both OSS and Central automatically (8.6 dropped out, since it gets no OSS). For 8.5 the user pastes it. Stored encrypted; never shown or logged | So the frontend only ever handles a token in one of the five flows that reach Central — 8.5. Everywhere else there is nothing to copy, show or mask — which also means no screen should offer to "view" a server's token |
| 8.11 | What Central stores — answers Q1 | Organization, creator, name, hostname, how it was created, cloud details (provider account, provider server ID, region, size), managed link, stack, status, panel URL, token, last seen. Plus a one-time copy from OSS when the server connects: hostname, public IP, OS, OSS version, stack, CPU, RAM, disk, app count. Name and hostname both start as the OSS hostname. Everything else stays in OSS | The answer this site proposed and the backend accepted: a small cached copy so lists work when a panel is offline. One word matters — the copy is one-time, taken at connect. So IP, OS, CPU, RAM, disk and app count can go stale, and a screen that shows them must either label them as "at connect" or read live values instead. That is exactly the gap Q3 still leaves open |
| 8.12 | Activity log | Who added which server, how and when. Tokens and passwords are never logged | Feeds the organization activity log; "how it was created" makes a useful column |
Who can do it: organization roles with server manage, from Phase 4.
#C. Still open after this phase
The backend listed five things as "not in this phase". Three matter to the screens:
- Refreshing server data — later updates from OSS, offline status and "needs new token" are decided later. This is the heart of Q3, and it leaves the server list's liveliness undefined: the one-time copy from 8.11 is all Central is promised to hold.
- Also parked: everything after a server exists (list, server page, power, resize, delete, disconnect, settings, apps, databases) — their own phases — and whether name and hostname can be edited separately.
#Existing users
V7 servers carry over and move to OSS, but how the move works is decided later. So the migration story this site has flagged since the first draft — that a V7 server only becomes manageable once OSS is installed on it — is still unwritten, and D-19 (installing OSS on a live V7 server is untested) still applies.
#What this phase answers
| Was open | Now |
|---|---|
| Which Ubuntu versions are offered? | Settled 2026-10-07: 22.04, 24.04 and 26.04 V8 requirement. 20.04 is out, which confirms the V7 migration blocker this site has carried since 2026-10-03, and the installer refuses a server on any other version. MongoDB is not available on 26.04, so MERN and 26.04 cannot be chosen together |
| The "unclaimed server" case | Decided 2026-10-07: not in V8 V8 requirement. It was V7 behaviour waiting on "a decision from higher authority" — there is nothing to design, and no screen should offer to claim a server |
| Q1 Which exact server fields does Central store? | Answered (8.11) — and close to what this site proposed: the link record plus a small one-time copy from OSS (IP, OS, version, stack, CPU, RAM, disk, app count) so lists survive an offline panel. The backend removed Q1 from its own list |
| Q2 How does the OSS token reach Central — pasted, or sent by the installer? | Answered (8.10): both, and which depends on the way in. The installer does it automatically for four ways (8.1–8.4); only "connect an existing panel" asks the user to paste, and the free Lite server has no token at all because it gets no OSS. Exactly the answer this site recommended |
| Which ways of adding a server exist? | Six (8.1–8.6) — and Bhavik's wizard covers four of them. 8.2 Managed server is deliberately absent (D-36) and 8.6 ServerAvatar Lite has no screen anywhere (D-41) |