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
| Flag | Meaning |
|---|---|
-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. |
-y | Skip confirmation prompts. |
-f | Force install — skip the port-in-use check. |
--mode=kexec | Reboot 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/vdX | Override 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
- Launch an instance (T3, M5, C5, T2, C4 or similar Linux instance types).
- Expand Advanced Options → Add initialization scripts and paste the generated init script as user-data.
- Allow the RDP/SSH port in the security group.
- Watch progress in the dashboard's deployment history; connect via RDP/SSH with the shown credentials when done.
Usage on DigitalOcean / Linode / Vultr / any KVM VPS
- Create a normal Linux droplet/instance.
- SSH in as root and paste the install command, or use the init-script feature where available.
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)
- Set
RAZORPAY_KEY_ID,RAZORPAY_KEY_SECRET,RAZORPAY_WEBHOOK_SECRET(from Dashboard → Settings → Webhooks). - Webhook URL:
https://your-domain/api/billing/razorpay/webhook, subscribe to thepayment.capturedevent. - The dashboard opens Razorpay Checkout automatically when configured
(
GET /api/billing/configtells it what is available).
Crypto (NOWPayments-compatible)
- Set
NOWPAYMENTS_API_KEYandNOWPAYMENTS_IPN_SECRET. - IPN callback:
https://your-domain/api/billing/crypto/ipn— verified with thex-nowpayments-sigHMAC-SHA512 signature. INR_TO_USD(default 83) converts credit prices to the invoice amount.
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):
- Raw images:
.raw,.dd,.img - Compressed raw:
.gz,.zst,.xz,.bz2(compression applies to raw images only) - VM disks:
.qcow2,.vhd,.vhdx,.vmdk— converted to raw withqemu-img convertduring deployment (needs temp disk space for the download)
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
- Server 2022 Standard:
VFY9P-N2JD4-.../ Datacenter:VVDN9-...— see the Microsoft docs “KMS client setup keys” page for the full, current list.
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.