ironwire / documentation

networking & urls

every machine gets a live HTTPS URL. repoint it, publish extra ports, attach your own domain, wire machines together privately.

your machine's URLs

each machine is reachable at https://<machine>.<handle>.<content-domain>: machine name, your handle, the platform's content domain. handle alice, machine app: https://app.alice.ironwire.xyz.

the main URL is served on the standard HTTPS port (443) and forwards to one port inside your machine, 8000 by default. run a web server on that port and it is live. TLS is handled for you.

check the current port setup (main URL and published ports) any time:

ssh

$ ssh dashboard@ironwire.sh ports app
443:  https://app.alice.ironwire.xyz → vm port 8000
published: (none)

cli

$ ironwire ports app
443:  https://app.alice.ironwire.xyz → vm port 8000
published: (none)

dashboard

select the machine and press o (also in the Space actions popup). the ports editor lists the 443 row and every published mapping.

changing the fronted port

point the main URL at a different port with ports <name> main <guest-port>. applies live, no restart. set it to none to turn the main URL off entirely (the URL then reads unreachable rather than serving an empty page).

ssh

$ ssh dashboard@ironwire.sh ports app main 3000
443:  https://app.alice.ironwire.xyz → vm port 3000
published: (none)

cli

$ ironwire ports app main 3000
443:  https://app.alice.ironwire.xyz → vm port 3000
published: (none)

dashboard

press o on the machine, select the 443 row, press and type the new guest port, or none to turn the main URL off.

create without a main URL from the start with create <name> --port=none, or pick the fronted port at creation with --port=<guest>.

publishing extra ports

<SCREENSHOT: ports editor (o in the dashboard) with the main URL row and one published mapping>

beyond the main URL, publish up to 5 extra HTTPS ports. each mapping exposes https://<machine>.<handle>.<content-domain>:<public> and forwards it into the machine. TLS handled here too. all port edits apply live.

ssh

$ ssh dashboard@ironwire.sh ports app add 9443:9000
443:  https://app.alice.ironwire.xyz → vm port 3000
published:
  https://app.alice.ironwire.xyz:9443 → vm port 9000

cli

$ ironwire ports app add 9443:9000
443:  https://app.alice.ironwire.xyz → vm port 3000
published:
  https://app.alice.ironwire.xyz:9443 → vm port 9000

dashboard

press o on the machine, then a, and type the mapping as 9443:9000.

publish at creation time with repeatable --publish=<public>:<guest> flags. remove a mapping with its public port:

ssh

$ ssh dashboard@ironwire.sh ports app rm 9443
443:  https://app.alice.ironwire.xyz → vm port 3000
published: (none)

cli

$ ironwire ports app rm 9443
443:  https://app.alice.ironwire.xyz → vm port 3000
published: (none)

dashboard

press o on the machine, select the mapping, and press x.

both sides of a mapping must be in the range 1 to 65535. each public port can be used once per machine. a few public ports are reserved by the platform:

Public portWhy it's reserved
443your machine's main URL
22SSH
8080, 8081, 2019platform services

custom domains

serve a machine on a domain you own instead of (or alongside) its platform URL. it must be a subdomain like app.example.com, since an apex domain can't be a CNAME.

set the domain on the machine:

ssh

$ ssh dashboard@ironwire.sh domain app set app.example.com
custom domain app.example.com set for app (pending)
  create a CNAME:  app.example.com  →  app.alice.ironwire.xyz
  it goes live automatically once that resolves

cli

$ ironwire domain app set app.example.com
custom domain app.example.com set for app (pending)
  create a CNAME:  app.example.com  →  app.alice.ironwire.xyz
  it goes live automatically once that resolves

running this from a machine requires orchestration mode; see Orchestration.

dashboard

select the machine and press m (also in the Space actions popup), then type the domain and press .

then add a CNAME record at your DNS provider pointing your domain at the machine's platform hostname shown above. the CNAME itself is the ownership proof: no verification token to copy. the platform checks the record about once a minute and flips the domain to active as soon as the CNAME resolves. check where things stand any time:

ssh

$ ssh dashboard@ironwire.sh domain app status
custom domain: app.example.com (active)
  CNAME → app.alice.ironwire.xyz

cli

$ ironwire domain app status
custom domain: app.example.com (active)
  CNAME → app.alice.ironwire.xyz

dashboard

the machine list's URL column shows the custom domain, tagged (pending) until it goes active.

once active, a TLS certificate is issued for your domain and it serves everything the machine exposes: the main URL and any published ports. if the CNAME later stops resolving, the domain drops back to pending until it resolves again.

remove a custom domain:

ssh

$ ssh dashboard@ironwire.sh domain app rm
custom domain cleared for app

cli

$ ironwire domain app rm
custom domain cleared for app

running this from a machine requires orchestration mode; see Orchestration.

dashboard

press m on a machine that has a domain; the domain is removed in place.

note each machine can have one custom domain, and a domain can only be attached to one machine.

machine-to-machine networking

machines in the same account reach each other directly on their private IPs, on any port, without publishing anything. other accounts are blocked both ways: your machines cannot reach theirs, theirs cannot reach yours.

each machine gets a private 10.0.0.x address, shown in list and info. it is not reachable from the internet. inside the guest, the hostname is the machine's name, so machines are easy to tell apart from a shell.

$ ssh dashboard@ironwire.sh info app
...
ip: 10.0.0.2 — reachable by your other machines on any port; not reachable from the internet
...

SSH access

every machine has SSH login: open a shell with connect <name> from the console. see Connecting for details, Machines for the lifecycle, and the command reference for full ports and domain syntax.