Free tools Windows power users keep installed
One-click scans. No signup required.
The reliable pattern is to let Terraform create the Linux VPS, firewall rules, SSH association, and public address, then pass a cloud-init document to the new machine. cloud-init installs the runtime and web server, creates a non-root application account, writes a systemd service, and configures NGINX to proxy public requests to Node.js on 127.0.0.1:3000. Terraform handles infrastructure; systemd keeps the application running.
Need a server to try this on? Antihost offers Linux VPS plans with NVMe storage, full root access and a 14-day free trial.
This guide uses Ubuntu 24.04 as an example operating system and targets Node.js 22 LTS. Substitute versions that your application and provider support, but pin those choices rather than allowing an unplanned package upgrade.
As an Amazon Associate I earn from qualifying purchases.
What Terraform should and should not do
Terraform is an infrastructure-as-code tool. It records the desired VPS, network dependencies, SSH key association, and public address in state, then creates or replaces those resources through a provider. It is not a Node.js process manager and it does not supervise a process after an SSH session ends.
Use four layers:
- Terraform: declares the VPS, firewall rules, SSH key, and output address.
- cloud-init: performs first-boot installation and configuration without requiring Terraform to log in to the server.
- systemd: starts the Node.js service at boot and restarts it after a failure.
- NGINX: accepts HTTP and HTTPS traffic on the public interfaces and forwards it to the private Node.js listener.
HashiCorp describes cloud-init as a standard configuration tool available on most Linux distributions and major cloud providers. The cloud-init project calls it the industry-standard, multi-distribution method for initializing cloud instances. Its job ends after bootstrapping; systemd and NGINX handle runtime operation.
#1 Best Overall
- [Ultra-Lightweight Ear Buds Designed for Small Ears] Each earbud weighs only 3.7g and features a compact, ergonomic in-ear design made especially for small ears. Secure, low-profile, and comfortable for workouts, all-day wear or overnight sleeping.The ultra-slim profile sits flush in your ear with no hard edges poking or rubbing, so you can even sleep on your side without discomfort.
- [Immersive Stereo Sound with TOZO OrigX Technology] TOZO OrigX tuning delivers clear vocals, balanced mids, and natural stereo sound for music, podcasts, and videos.
- [Long Battery Life for Daily Use] Get up to 7 hours of playtime on a single charge, with up to 32 hours total using the charging case—ideal for workdays, commuting, and extended listening sessions.
- [Bluetooth 5.3 & Stable Connection] Bluetooth 5.3 provides fast pairing, stable wireless performance, and reduced dropouts as you move around home or office.
- [Deep Bass with Clear Vocals] High-performance drivers produce punchy bass while keeping vocals clean and detailed for everyday listening.
Decide the deployment contract before writing Terraform
A reproducible deployment starts with decisions that are otherwise hidden in package managers or shell history.
- Operating system: this example assumes Ubuntu 24.04 LTS.
- Node.js: the example targets the 22.x LTS line. Configure the distribution package source or a trusted vendor repository so that this major version is actually installed, and fail the bootstrap if another major version appears.
- Application command: the sample service runs
npm startfrom/opt/nodeapp. ChangeExecStartif the project uses a different command. - Listener: the application listens on port 3000 and binds to localhost. NGINX, not Node.js, owns the public ports.
- Application delivery: the example writes a tiny application during bootstrap. For a real project, replace that step with a versioned artifact, private package, or source checkout and provide credentials through a secret-management mechanism rather than Terraform source.
- Provider and region: select a provider whose image, size, IPv4/IPv6 behavior, bandwidth policy, snapshots, firewall controls, Terraform provider quality, support, and total monthly cost fit the workload. These details and prices vary by provider, region, and date.
Recommended file layout
Keep infrastructure and bootstrap code reviewable as separate files:
Quick wins for a faster PC:
Repair Windows errors before they cause bigger problemsFix Now →Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →Clear out junk files and repair common Windows errorsFree Scan →node-vps/
├── main.tf
├── variables.tf
├── outputs.tf
├── cloud-init.yaml
└── .gitignore
Do not commit a private SSH key, application secret, or a state file containing sensitive values. A local state file can contain credentials and other data even when the configuration does not visibly contain them.
Declare the VPS and pass cloud-init
Resource names and arguments differ between providers, so the following is a provider-neutral mapping rather than a copy-and-apply provider configuration. In the selected provider’s documentation, map the image, size, region, SSH-key association, firewall attachment, and public-address output to its actual resource names.
variable "ssh_public_key" {
type = string
description = "Public key installed for administrative access"
}
# Replace this illustrative resource with the selected provider's VPS resource.
resource "provider_vps_instance" "app" {
image = "ubuntu-24.04"
region = var.region
size = var.vps_size
ssh_keys = [var.ssh_public_key]
user_data = file("${path.module}/cloud-init.yaml")
firewall_id = provider_firewall.app.id
}
output "public_ip" {
value = provider_vps_instance.app.public_ip
}
The important field is the provider’s startup-data field, usually called user_data, custom_data, or an equivalent. Attach the firewall in the provider resource or separately, as that provider requires. Keep the Node.js port out of the public rules.
Rank #2
- 【IP68 Waterproof Multifunctinal Smart Watch】Torjalph fitness activity tracker smart watch is IP68 waterproof technology ,you can wear it when swimming,handwashing,it's rain-proof which means that you perform multiple exercise modes outside without worrying about sweat or rain corroding your fitness smart watch,and this watch equipped with a 230 mAh large capacity battery magnetic charging ,and this sports activity tracker watch can be used 5-7 days If fully charged.
- 【Larger 1.83'' Full Screen Watch & Multi-dial Selection】1.83 inch full HD color touch screen smart watch for men / women provides excellent 240*284 resolution image quality ,This Bluetooth smart watch offers a better touch experience and remarkable immersion and ,more than 200 watch faces for you to choose from App"Da Fit ", you can change the dial style according to your mood to wear keeping the world on your wrist
- 【Accurate Activity Tracker Smart Watch 】sports watch activity tracker uses sweat and dust resistant breathable silicone strap, our Fitness Tracker Smart Watch for Android iOS Phones supports 12 sports modes,walking,running,bicycle,swimming,badminton,basketball,football,rope skipping. This bluetooth calls smart watch for men women is lightweight and stylish, bringing more convenient and relaxing sports experience while also providing more protection.
- 【Your 24 Hour Personal Daily Health Monitor】Fitness watch for women men full touch screen IP67 waterproof bluetooth smartwatch for Android iOS Phones with heart rate blood pressure monitor multifunction Andriod smart watch with steps counter sleep monitor sports fitness watch, monitoring blood oxygen saturation allows you to understand your physical condition in real time to track fitness progress ,to know your health status in time.
- 【More Functions Bluetooth Call Smart Watch】This fitness activity smart watch full screen for iPhone and Android phones includes a bunch of new features including:The bluetooth smart watch can hang up the phone, receive and display WhatsAPP /Text /Facebook /Twitter /Messenger reminder.Support sedentary reminder, alarm clock, stopwatch, timer,weather information,music control, remote camera control compatible with Android 5.0 and above or iOS 9.0 and above smartphones.
A minimal network policy is:
- TCP 22 only from your administrative address range.
- TCP 80 and 443 from the internet when the site is public.
- No public rule for TCP 3000.
- Optional IPv6 rules that mirror the IPv4 policy if the VPS has IPv6.
Build the cloud-init bootstrap
cloud-init runs after the VPS is provisioned, so the machine can exist before the application is ready. The first connection may take several minutes. The following example demonstrates the required sequence: package updates, a least-privilege user, Node.js and NGINX installation, application files, a systemd unit, and an NGINX proxy.
Crashes, No Sound, or Screen Glitches?
Random freezes, missing sound and display glitches usually trace back to one bad driver. Find and replace yours safely.Free scan · under a minuteWindows Errors? Fix Them Before They Spread
Repair common Windows errors and clear accumulated junk for a smoother, more stable PC - no reinstall needed.Free scan · no reinstall#cloud-config
package_update: true
package_upgrade: true
users:
- default
- name: deploy
groups: ["www-data"]
shell: /bin/bash
sudo: []
ssh_authorized_keys:
- ssh-ed25519 AAAA_REPLACE_WITH_YOUR_PUBLIC_KEY deploy
packages:
- nginx
- nodejs
- npm
write_files:
- path: /opt/nodeapp/package.json
owner: deploy:deploy
permissions: '0644'
content: |
{
"name": "node-vps-example",
"version": "1.0.0",
"private": true,
"scripts": { "start": "node server.js" }
}
- path: /opt/nodeapp/server.js
owner: deploy:deploy
permissions: '0644'
content: |
const http = require('http');
const port = Number(process.env.PORT || 3000);
const server = http.createServer((req, res) => {
if (req.url === '/health') {
res.writeHead(200, { 'content-type': 'application/json' });
return res.end(JSON.stringify({ status: 'ok' }));
}
res.writeHead(200, { 'content-type': 'text/plain' });
res.end('Node.js is runningn');
});
server.listen(port, '127.0.0.1');
- path: /etc/nodeapp.env
owner: root:root
permissions: '0600'
content: |
NODE_ENV=production
PORT=3000
- path: /etc/systemd/system/nodeapp.service
owner: root:root
permissions: '0644'
content: |
[Unit]
Description=Node.js application
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=deploy
Group=deploy
WorkingDirectory=/opt/nodeapp
EnvironmentFile=/etc/nodeapp.env
ExecStart=/usr/bin/npm start
Restart=on-failure
RestartSec=5
NoNewPrivileges=true
PrivateTmp=true
[Install]
WantedBy=multi-user.target
- path: /etc/nginx/sites-available/nodeapp
owner: root:root
permissions: '0644'
content: |
server {
listen 80;
listen [::]:80;
server_name _;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
runcmd:
- [bash, -c, "install -d -o deploy -g deploy -m 0755 /opt/nodeapp"]
- [bash, -c, "cd /opt/nodeapp && npm install --omit=dev"]
- [bash, -c, "node --version | grep -E '^v22\.'"]
- [bash, -c, "ln -sfn /etc/nginx/sites-available/nodeapp /etc/nginx/sites-enabled/nodeapp"]
- [bash, -c, "rm -f /etc/nginx/sites-enabled/default"]
- [bash, -c, "systemctl daemon-reload"]
- [bash, -c, "systemctl enable --now nodeapp.service"]
- [bash, -c, "nginx -t"]
- [bash, -c, "systemctl enable --now nginx"]
The public-key line is intentionally a value you replace in your generated file; keep the private half off the server and out of Terraform. For a real application, commit a lockfile and use npm ci --omit=dev rather than an unconstrained install. The package installation shown above is illustrative: configure Ubuntu’s package source or a trusted vendor repository to provide the pinned Node.js 22.x LTS line before applying this file. If the version check fails, cloud-init stops before enabling the application, which is safer than silently running an unsupported runtime.
When the application has native dependencies or a build step, perform that build from a reproducible artifact or add the documented production build command before enabling the service. Do not copy development secrets into /opt/nodeapp; use the root-owned environment file only for values the process must read, and restrict its permissions.
Run Terraform safely
- Install the Terraform CLI on your workstation and configure the selected provider’s credentials using its supported credential mechanism.
- Place
main.tf, variables, outputs, andcloud-init.yamlin one working directory. Supply the region, VPS size, and public SSH key through a variable file or environment variables. - Run
terraform fmt -checkto catch formatting drift. - Run
terraform initto install the provider and initialize the backend. - Run
terraform validateto check configuration structure and types. - Run
terraform plan. Confirm the image, region, firewall attachments, SSH association, and replacement actions before approving. - Run
terraform apply, review the proposed changes, and confirm. Save the resulting public address from the output.
Use a protected remote backend for team work, with access controls and state locking where the backend supports them. State is an operational secret: it can contain sensitive values even if they were supplied indirectly. Encrypt it at rest, restrict read access, and never publish it in a repository. Keep private keys and application secrets outside Terraform source and avoid placing secret values in plan output, user-data text, or shell history.
Wait for first boot before testing
Terraform declaring the VPS complete does not mean the application is ready. cloud-init executes after provisioning and may need several minutes for package downloads and service setup.
Rank #3
- [Low Noise High Fidelity] New bee guitar cord with 22AWG oxygen-free-copper center conductors provides enhanced signal transfer, the PVC insulation material and the high-density stranded copper double shield provide noise rejection for quiet operation
- [Ideal for Choice] New bee 1/4 straight and right angle metal connectors, ensures a secure connection in any instrument, pedal, or amp jack. L shape great fro on stage guitar stands
- [Wide Compatible] Suitable for mixer, power amplifier, microphone, effector, decoder, equalizer, electoronic organ, electric guitar, electric bass and other electronic equipments. Widely used in the installation of smart home, karaoke speaker, professional stage audio, etc
- [Easy Disassemble] Making incidental repairs quick and easy! Very nice, flexible cable
- [Dont Hesite to Order] 24 hours customer services and professional technology team are standing by
- Use the output address and the intended non-root account:
ssh deploy@PUBLIC_IP. - Wait for cloud-init:
sudo cloud-init status --wait. Use the distribution’s equivalent command if cloud-init reports a different interface. - Confirm the runtime:
node --versionshould show the pinned 22.x major line, andnpm --versionshould return successfully. - Check the local health endpoint:
curl http://127.0.0.1:3000/health. - Check systemd:
systemctl is-enabled --quiet nodeapp.service && systemctl is-active --quiet nodeapp.service. - Validate NGINX:
sudo nginx -t, then request the public URL from a separate network withcurl http://PUBLIC_IP/health. - Confirm that the provider firewall exposes SSH only to the administrative range and exposes HTTP/HTTPS publicly, while port 3000 remains private.
Keep Node.js running after SSH disconnects
Do not rely on node server.js in an interactive shell, nohup, or a terminal multiplexer as the production mechanism. Those approaches do not provide dependable boot startup, failure restart, ownership, or centralized logs. The systemd unit’s User=deploy, WorkingDirectory, EnvironmentFile, ExecStart, and Restart=on-failure settings provide those properties without running the app as root.
Inspect failures with:
sudo systemctl status nodeapp.service
sudo journalctl -u nodeapp.service -n 100 --no-pager
sudo journalctl -u nodeapp.service -f
sudo tail -n 100 /var/log/nginx/error.log
If the service repeatedly restarts, inspect the first error rather than increasing restart limits. Common causes are a wrong working directory, a missing production dependency, an invalid environment variable, a port already in use, or a Node.js major version incompatible with the application.
Cloud-init, images, configuration management, or provisioners?
Cloud-init is the best first choice for a fresh VPS because startup data travels with the instance and does not require Terraform to establish an SSH session. Other approaches are useful at different scales:
| Approach | Repeatability | Boot-time speed | Drift handling | Secret exposure and reachability | Rollback and debugging |
|---|---|---|---|---|---|
| cloud-init | Good when the document and package sources are pinned | Runs during first boot; readiness is delayed by package installation | Primarily establishes initial state; later drift needs another mechanism | No Terraform-to-server session required, but startup data must be protected | Replace the instance for a clean rerun; inspect cloud-init logs and status |
| Machine image | High for an immutable, versioned image | Fast startup because software is preinstalled | New image versions are used for changes | Secrets should not be baked into images | Rollback means selecting an earlier image; image builds add a pipeline |
| Configuration management | High when roles and convergence are maintained | Depends on when the agent or run is triggered | Designed to correct declared configuration drift | Usually requires an agent, control connection, or credentials | Strong reporting, but introduces another control plane |
| Terraform provisioner | Lower; Terraform cannot model arbitrary script behavior predictably | Runs during apply after connectivity is available | Not a general drift-remediation system | Often requires direct network access and SSH credentials | Script ordering is explicit, but a failed provisioner normally fails apply; retries and replacement behavior require care |
HashiCorp recommends provider-native startup data, machine images, or configuration-management tools before provisioners. Its guidance describes Terraform as primarily intended for immutable infrastructure and recommends purpose-built solutions for provisioning work.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.When a provisioner is justified
Terraform includes local-exec, remote-exec, and file provisioners. Treat them as a narrow escape hatch for a post-apply action that the provider, cloud-init, image pipeline, or configuration-management tool cannot perform.
Rank #4
- Digital Family Calendar: BSIMB digital calendar wall touch screen puts an end to your chaotic life. Designed for busy families, the digital calendar keeps you organised and in step with your family. Assign different colours and tasks to each family member to make family scheduling easier and more intuitive.
- Easy Setup and Auto-Sync: Plug in, connect to WLAN and auto-syn your electric calendar in minutes. Digital wall calendar compatible with Google calendar, iCloud calendar, Outlook calendar, Cozi calendar and Yahoo calendar. Add events directly on the device or through the ecalendar app. Electronic calendar stays current whether you're at work or traveling—no manual updates needed.
- All-In-One Home Assistant: Smart calendar builds habits and encourage independence with personalised chores. Display daily meal plan to reduce the daily ‘What's for dinner?’ stress. To-do lists keep track of everything you want. Turning chores into valuable achievements with stars and rewards, making life easier and more enjoyable.
- Manage Anytime Anywhere: BSIMB electronic calendar for family stay connected with the powerful ecalendar app. Access and manage your digital wall calendar anytime, anywhere with free features like stars & rewards, photo screensaver, chore charts, meals plans, to-do lists etc. Electronic planner paid features like Magic Import tailor advanced tools for users with special needs.
- Stay in Touch with Loved Ones: Share photos or videos from your phone to electronic wall calendar with app, instantly update your life moment, and keep in touch with your family, especially those who are far away; you can also surprise your smart calendar digital wall by sending him a wish card; it's also great for keeping tech-illiterate elders in touch with the youngsters.
Remote execution requires a connection block, commonly SSH. Scripts execute in the order declared, and a failed provisioner normally causes terraform apply to fail. If you must use one:
- Make every command idempotent so a retry produces the same result.
- Use a dedicated or ephemeral deployment key with the smallest possible scope.
- Restrict SSH at the firewall and destroy or rotate the key after the action.
- Do not pass long-lived secrets on command lines or place them in state unintentionally.
- Document whether a changed provisioner forces replacement, reruns in place, or requires manual recovery.
- Log the exact remote changes and provide a tested rollback path.
Troubleshoot by symptom
SSH times out
Check that the instance has a public address, the firewall allows TCP 22 from your current administrative address, and the intended public key was associated with the instance. If cloud-init is still installing packages, wait and inspect provider console output or connect after startup completes.
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
SSH works but the app is not reachable
Run systemctl status nodeapp.service, then inspect its journal. Verify that Node.js is listening on 127.0.0.1:3000 and that the local health request succeeds. A public request should reach NGINX on port 80 or 443; it should not require exposing 3000.
NGINX returns 502
A 502 usually means the upstream process is stopped, listening on a different port, or bound somewhere other than the address in proxy_pass. Check the systemd journal, the NGINX error log, and the value of PORT in /etc/nodeapp.env.
cloud-init reports failure
Use sudo cloud-init status --long and inspect /var/log/cloud-init.log and /var/log/cloud-init-output.log. A failed package repository, an invalid YAML indentation, a missing key, or the deliberate Node.js version guard can stop later commands. Correct the file and recreate the disposable VPS when you need a clean first-boot run.
Best Value
Terraform wants to replace the VPS unexpectedly
Read the plan before applying. Image changes, provider-side address behavior, altered SSH associations, or a changed immutable field can trigger replacement. Confirm that state is current and that the desired region, size, image, and user-data hash are intentional. Do not approve a replacement if the existing machine contains data that has not been backed up.
Updating and replacing the application
For a small disposable environment, rebuild the instance from a reviewed cloud-init file or immutable image rather than accumulating undocumented SSH changes. For a long-lived service, deploy a versioned artifact, run its production install, and restart the systemd unit in a controlled release step. Keep infrastructure changes in Terraform and application releases in a deployment process so that changing JavaScript does not unnecessarily replace networking resources.
Before a replacement, verify backups or snapshots, confirm DNS and public-address behavior, and understand whether the provider assigns a new IPv4 or IPv6 address. Terraform can report the new output, but DNS, certificates, and external allowlists may need updating.
Destroy disposable environments deliberately
For test infrastructure, terraform destroy removes the resources tracked in the current state and helps avoid continuing VPS charges. Review the destroy plan carefully, especially when the same state contains shared networking, snapshots, or data resources. Production environments need a separate lifecycle policy, backups, and an approved decommissioning procedure rather than an unreviewed destroy command.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.
The Tool Desk
Outbyte Driver Updater FREEFix the driver behind crashes, sound loss and screen glitchesFind Drivers →Outbyte PC Repair FREEClear out junk files and repair common Windows errorsFree Scan →




