Quickstart
This guide takes you from a fresh Linux machine to a public HTTPS URL that serves a real response, in roughly ten minutes. By the end you will have:
- An Edgible account, logged in on your machine.
- The Edgible agent installed and running as a
systemdservice. - A
pre-existingworkload published ashttps://<generated-name>.edgible.app.
The path uses the canonical Application v3 YAML model.
Prerequisites
Section titled “Prerequisites”- A Linux machine (Ubuntu 22.04+, Fedora, or a modern equivalent). The agent has been tested most heavily on Debian-family systems.
- Root / sudo access on that machine. The agent manages WireGuard, iptables, and a Caddy install — all need elevated privileges.
- Outbound HTTPS reachable. The agent talks to
api.v2.dev.edgible.comover TCP/443. No inbound connectivity is required. - An Edgible account. If you don’t have one, sign up first — you’ll receive an email and password.
- The
edgibleCLI installed and on yourPATH. Runedgible --versionto confirm.
The ten steps
Section titled “The ten steps”-
Log in.
Terminal window edgible auth login \--user-email you@example.com \--user-password 'your-password'The CLI writes auth tokens and your active organization ID to a config file under your user home directory.
-
Install the agent.
Terminal window sudo edgible agent install \--type systemd \--device-type serving \--device-name my-first \--non-interactiveThis registers a new device named
my-firstin your organization, generates its credentials, and installs asystemdunit. Installation takes 30–60 seconds. -
Start the agent.
Terminal window sudo edgible agent startYou can confirm with
sudo systemctl status edgible-agent. The agent will connect to the control plane over WebSocket within a few seconds. -
Verify the device is healthy.
Terminal window edgible device health --name my-firstExpect a
Health check OKresponse within ten or fifteen seconds. If this hangs, see Troubleshooting. -
Start something to serve.
For this walkthrough we’ll use Python’s built-in HTTP server as the placeholder workload. Run it on the device, in the background, on port 8080:
Terminal window python3 -m http.server 8080 &Anything listening on
127.0.0.1:8080will work — substitute your own service if you have one ready. -
Author the application YAML.
Save the following as
app.ymlsomewhere on the same machine. Replace<your-org-id>with your organization ID —edgible config listwill show it.app.yml apiVersion: v3kind: Applicationmetadata:name: hello-worldorganization: <your-org-id>spec:placement:strategy: serving-devicedeviceSelector:deviceName: my-firstworkloads:- name: webtype: pre-existinghostPort: 8080ports:- { name: http, containerPort: 8080, protocol: tcp }access:- name: publictype: httpstarget: { workload: web, port: http }hostname: { generated: true }tls: { managedBy: edgible }policies:auth: { mode: none }What’s happening:
placement.deviceSelector.deviceNamepins this application to the device you just installed.- The
pre-existingworkload tells Edgible there is already a process listening onhostPort: 8080. - One
accessentry exposes that port over HTTPS, on a hostname Edgible generates, with a managed TLS certificate, and no auth check (anyone can reach it).
-
Deploy.
Terminal window edgible stack deploy -f app.ymlThe CLI parses the file, validates it locally, and posts the application to the control plane. Within a second or two the agent on
my-firstwill receive the update and start reconciling. -
Watch the deployment finish.
Terminal window edgible stack status -f app.ymlYou’ll see the application move through
pending→deploying→deploying_gateway→ready. Thedeploying_gatewaystep is where Edgible orders the TLS certificate and configures HAProxy on the gateway; this typically takes 30–90 seconds the first time. -
Visit the URL.
Once status is
ready, the samestack statusoutput (oredgible application get -i <id>) will show the generated hostname, something likehello-world-a1b2c3.edgible.app.Terminal window curl https://hello-world-a1b2c3.edgible.app/You should see the directory listing Python’s HTTP server produces. That response is travelling over the public internet, into the gateway, through a WireGuard tunnel to your machine, through Caddy, into your
python3 -m http.server, and back. -
(Optional) Tear it down.
Terminal window edgible stack teardown -f app.ymlThe application is removed from the agent, Caddy stops serving the route, and the gateway forgets the hostname. The device itself stays installed and registered.
What you just built
Section titled “What you just built”https://hello-world-a1b2c3.edgible.app │ ▼Edgible Gateway (HAProxy + WireGuard) │ encrypted tunnel ▼Your machine (Caddy on :443 → python http.server on :8080)The hostname is bound to your specific device for as long as the application exists. If you stop the Python server, the URL keeps responding 502 (because the workload is dead, not the route). If you delete the application, the hostname is released.
Where to go next
Section titled “Where to go next”- Replace the placeholder with a real workload. Deploy a Docker Compose app walks through a multi-container example.
- Add a custom domain. Use a custom domain covers the DNS hand-off and a per-hostname certificate.
- Lock it down. Protect with API keys shows how to require a bearer token on every request.
- Understand what’s happening under the hood. How it works and the Concepts section.