TinyDeploy — Docs

Home   Dashboard
On this page Quickstart — any Linux VPS Installer flags API: Access Info API: Images API: Build Install Command Init script (cloud-init) Provider guides (AWS / DigitalOcean / Linode / dedicated) TICONFIG partition spec (credential injection) Billing integration

Quickstart — any Linux VPS

SSH into your Linux VPS as root and run your install command (from the dashboard, or built via the API):

(wget https://your-domain/setup.sh -4O tinydeploy.sh || curl https://your-domain/setup.sh -Lo tinydeploy.sh) \
  && bash tinydeploy.sh 

You will be prompted to select an image. The disk is wiped, the image is written, credentials are shown, and the server reboots into the new OS. Requirements: a Linux environment with root, curl or wget, and at least as much RAM+disk as the image size.

You can also try the anonymous public key free — no account needed, limited to free-tier images, one install per IP per 6 months.

Installer flags

FlagMeaning
-i={image_id}Pre-select the image (from the Images API). Without it an interactive menu is shown.
-port={number}Remote access port. Default: 3389 (RDP) for Windows profiles, 22 (SSH) otherwise.
-username={name}Login username. Random if omitted.
-password={pass}Login password. Random if omitted.
-ySkip confirmation prompts.
-fForce install — skip the port-in-use check.
--mode=kexecReboot into an Alpine RAM environment via kexec and install from there (needs kexec-tools; the production-grade path — validate on a real VPS before offering it).
-disk=/dev/vdXOverride target disk (default: auto-detect).

API — Access Info

GET /api/access-info?key={key}
→ { "setup_url": "https://your-domain/setup.sh", "key": "..." }

API — Images

GET /api/images?key={key}
→ { "images": [ { "image_id": "...", "name": "...", "os_type": "windows|linux",
                  "remote_desktop": true, "size_gb": 20 } ] }

Only images available to that key's plan (and that user's custom sources) are returned. Without key the full public catalog is returned.

API — Build Install Command

GET /api/build-install-command?key={key}[&image_id=…][&port=…]
                             [&username=…][&password=…][&y=true][&f=true]
→ { "command": "(wget … && bash setup.sh …)", "setup_url": "…", "key": "…" }

Init script (cloud-init)

For providers that support instance init scripts (AWS EC2 user-data, DigitalOcean, Linode, Vultr), generate one from the dashboard or:

GET /api/init-script?key={key}&image_id={image_id}

The script retries the bootstrap download with DNS fallback, then runs the installer non-interactively.

Provider guides

Usage on AWS

Usage on DigitalOcean / Linode / Vultr / any KVM VPS

Dedicated / bare-metal servers

TinyInstaller-style services often add a QEMU/KVM compatibility layer for bare metal (booting the image inside a VM first, with a wide driver set, then a --mode=direct for native boot). This build deploys directly; bare-metal compatibility depends on your images including the right storage/network drivers. A QEMU staging mode is on the roadmap — see README.

TICONFIG partition spec (credential injection)

So that every install gets working credentials without a VNC console, images should carry a small FAT32 partition labelled TICONFIG with a first-boot agent that reads tinydeploy.conf:

RDP_PORT=3389
USERNAME=td_a1b2c3d4e5f6
PASSWORD=XXXXXXXXXXXXXXXX

Windows images: a scheduled task / service at first boot reads the file, creates/renames the user, sets the password, configures the RDP port and enables RDP + firewall. Linux images: a systemd oneshot unit does the same for SSH. If the partition is absent, the installer falls back to the image's built-in credentials (for example an OOBE image waits for first-boot setup).

Billing — Razorpay + crypto (production flow)

Both gateways are built in, webhook-driven and signature-verified.

Razorpay (UPI / cards / netbanking)

Crypto (NOWPayments-compatible)

Credits are granted only after a signature-verified webhook — client-side callbacks are never trusted. Repeated webhooks are idempotent (credits are not double-granted; covered by the test-suite).

Never enable TINYDEPLOY_DEV_BILLING in production — it grants free credits. Note: crypto revenue in India is taxed as VDA income (30% + TDS) — talk to a CA before scaling.

Public API v1 (TinyInstaller-compatible)

Tools written against tinyinstaller.top/api/v1/my/* work with TinyDeploy unchanged. Authenticate with your profile key: Authorization: Bearer {YOUR_KEY} (the shared free key is not a personal credential and is rejected here).

GET  /api/v1/my/info                      # setup_url, key, plan, credits, expiry
GET  /api/v1/my/images?q=&page=           # your visible catalog (search + pagination)
GET  /api/v1/my/instances?ip_address=&status=&page=   # your deployments
GET  /api/v1/my/instances/{id}           # detail incl. username / password / port
POST /api/v1/my/key/regenerate            # rotate a leaked key

Instance statuses use the public vocabulary: new → installing → installed → done, with error and timed_out for failures. A deployment that stops reporting progress for over 2 hours is automatically marked timed_out by the server-side watchdog.

Custom sources & supported image formats

Paid plans can register custom images (any public direct-download URL):

An optional custom command runs after deployment on images that ship the TinyDeploy first-boot agent (our Linux images):
apt update && apt install -y docker.io
It is delivered to the TICONFIG partition as post-deploy.sh. Commands containing commas or quotes require jq on the target VPS (the fallback parser is flat). Windows images currently skip the custom command.

Windows: evaluation → licensed edition

Deployment images ship as evaluation editions. To move to your licensed edition, run DISM with the official Microsoft generic setup keys — these convert the edition but do not activate; activate with your own key after:

DISM /online /Set-Edition:ServerStandard /ProductKey:MFY9F-XBN2F... /AcceptEula

RDP port change: Set-ItemProperty 'HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name PortNumber -Value 3390 plus a matching firewall rule — or just deploy with -port=3390 and let the image apply it on first boot.