A small VPS is one of the most useful tools a developer can have. It’s an always-on Linux machine with a public IP, root access, and fast internet, which you can use for remote development, side projects, CI, testing, and learning the operations skills that make you a better engineer.
What developers use a VPS for
| Use | Why a VPS helps |
|---|---|
| Remote dev environment | Code from any laptop or tablet; builds run on the server |
| Side projects and demos | Public URL with HTTPS in minutes |
| Staging servers | Production-like environment for testing |
| CI/CD runners | Self-hosted GitHub Actions or GitLab runners with your own resources |
| Self-hosted Git | Gitea or GitLab for private repositories |
| Databases for development | PostgreSQL, MySQL, Redis, MongoDB reachable from anywhere (securely) |
| Webhooks and tunnels | Receive webhooks for local development via a reverse tunnel |
| Testing from another region | Check latency, geo-routing, CDNs, and how your app behaves abroad |
| Learning ops | Linux, Docker, Nginx, firewalls, monitoring, Kubernetes |
Remote development
- VS Code Remote-SSH (desktop VS Code, with the server as backend) or code-server (VS Code in the browser). See code-server.
- JetBrains Gateway for IntelliJ-family IDEs.
- tmux keeps long-running processes and sessions alive. See tmux.
- Dev containers: the same container config locally and on the server.
Pick a server location close to you, so typing in remote terminals and editors stays snappy. See choosing a VPS location.
CI runners
Self-hosted runners give you more CPU and RAM than free hosted minutes, plus caches that persist between builds:
- GitHub Actions self-hosted runner;
- GitLab Runner with the Docker executor. See GitLab Runner;
- Gitea Actions (act_runner). See Gitea Actions.
Keep runners for private repositories only. Public repositories can run untrusted code from pull requests.
Webhooks and local development
Expose a local dev server through your VPS with a reverse tunnel, instead of third-party tunnel services:
ssh -R 8080:localhost:3000 user@your-vps # VPS port 8080 → your laptop's port 3000
Put Nginx with HTTPS in front of port 8080 on the VPS (with GatewayPorts or a local proxy), or use FRP, or a Cloudflare Tunnel. See SSH tunnelling and FRP reverse proxy.
A recommended starter setup
- 2 vCPU / 4 GB RAM Ubuntu or Debian VPS. Upgrade when builds or databases need more. See Ubuntu VPS.
- Harden SSH (keys only), enable UFW, install Fail2ban. See Linux server hardening checklist.
- Install Docker + Compose. Run each project in its own Compose stack. See install Docker.
- Caddy or Nginx Proxy Manager for automatic HTTPS on subdomains (
app1.dev.example.com). See Caddy reverse proxy. - Tailscale or WireGuard so databases and admin tools are reachable only from your devices. See Tailscale.
- Backups of anything you’d miss (databases, Git repositories). See backup strategy.
Databases for development: keep them private
Don’t expose PostgreSQL, MySQL, Redis or MongoDB to the internet. Bots scan for open database ports constantly. Bind them to localhost or the VPN interface, and connect through the VPN or an SSH tunnel:
ssh -L 5432:127.0.0.1:5432 user@your-vps # then connect to localhost:5432
Cost-effective habits
- One VPS can host many small projects in containers.
- Destroy and recreate experimental environments with cloud-init or Ansible, instead of keeping snowflake servers. See cloud-init explained and Ansible.
- Use the provider’s OS reinstall for a clean slate when you’re done experimenting. VPS.DO’s control panel includes OS reinstall and a VNC console.
Quick reference
| Goal | Tool |
|---|---|
| Remote coding | VS Code Remote-SSH / code-server |
| CI | Self-hosted runner (private repos) |
| Webhooks to localhost | ssh -R, FRP, Cloudflare Tunnel |
| Private databases | Tailscale/WireGuard, SSH -L |
| HTTPS for side projects | Caddy / Nginx + Let’s Encrypt |
Related: VPS for a SaaS startup and Docker VPS hosting.