Public IPs & raw TCP
Most services are HTTP, and bootload routes those through its shared gateway by
domain — no dedicated IP needed (see custom domains,
or just --publish for an automatic HTTPS URL). But a raw TCP service — a
database, a game server, an SMTP relay, anything that isn't HTTP — needs its own
dedicated public IPv4 to listen on. That's what public IPs are for.
Claim a dedicated IP
bootload ip allocate
This reserves a dedicated IPv4 for your project, billed at the equivalent of €3/month, prorated by the second you hold it. List what you have:
bootload ip list
Expose a TCP port
Deploy (or redeploy) the service with a raw TCP mapping onto your allocated IP:
bootload deploy --image postgres:16 --name db --tcp 5432
--tcp <public-port>[:<container-port>] binds <your-ip>:<public-port> straight
through to the container (the container port defaults to the public one). If your
project holds more than one IP, say which to bind with --ip <addr>:
bootload deploy --image my/game --name arena --tcp 7777 --ip 203.0.113.10
The IP must already be allocated to the project — bootload refuses a TCP route on
an IP you don't hold (bootload ip allocate first). Clients then connect to
<your-ip>:<public-port> directly; raw TCP isn't proxied or TLS-terminated for
you, so terminate TLS in your own service if you need it.
Release an IP
When you're done, release it to stop billing:
bootload ip release <ip>
A release is refused while the IP still has TCP routes — remove the service (or its TCP route) first, then release. Once released, the IP goes back to the pool.
HTTP vs TCP, at a glance
| Want… | Use… |
|---|---|
| A web app on a domain | --domain example.com (custom domains) |
| A web app, any URL is fine | --publish (automatic HTTPS under the platform wildcard) |
| A database / game / SMTP / TCP | bootload ip allocate + --tcp <port> |