Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

iTechGuides is reader-supported. When you buy through links on our site, we may earn an affiliate commission. As an Amazon Associate I earn from qualifying purchases. Learn more

Cursor is where you edit and build the project; the VPS is where the finished files are served. For a typical static site, the dependable workflow is: build in Cursor’s terminal, copy the generated output to a non-root user’s web directory with rsync, configure Nginx, point DNS at the VPS, and enable HTTPS. You can repeat that manually for occasional releases or have GitHub Actions build and sync every approved commit.

This guide covers both approaches, plus Cursor’s optional Remote-SSH workflow. It assumes an Ubuntu VPS and a site that produces a static directory such as dist/, build/, or public/. A server-rendered application needs an application process and a different Nginx proxy configuration; do not point Nginx at source files and expect a Node, Python, or PHP application to run.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

How the deployment is divided between Cursor and the VPS

Cursor does not host your website. It is the local editor, terminal, and Git client. The VPS performs the production work: it stores the deployed files, accepts HTTP and HTTPS traffic, and serves requests through a web server such as Nginx.

Method What happens Best for Main trade-off
Build then rsync You run the build locally in Cursor, then synchronize its output to the VPS. First deployments, small sites, and deliberate releases You must run the build and transfer commands each time.
GitHub Actions then rsync A push triggers a hosted workflow that builds the site and copies the output over SSH. Teams and repeatable deployments Secrets, workflow YAML, and a deploy key must be maintained.
Cursor Remote-SSH Cursor opens the VPS filesystem through SSH; you edit or run commands on the host. Server-side debugging and direct remote editing The host needs a compatible Cursor Server runtime and a stable SSH connection.

A static-site deployment guide describes the first pattern with rsync and --delete, while another documents a GitHub Actions build-and-sync flow for Hugo behind a Caddy/Nginx Docker stack: static site on an Ubuntu VPS and Hugo deployment with GitHub Actions. The commands below use the same general model, but you must substitute your project’s actual build output and domain.

#1 Best Overall
HP OmniBook 3 17.3 inch Laptop PC, FHD Display, AMD Ryzen 3 30, 8 GB RAM, 512 GB SSD, AMD Radeon 610M Graphics, Windows 11 Home, Mica Silver, 17-dp0199nr
  • FULL HD IPS DISPLAY - Enjoy vibrant, crystal-clear images with 178-degree wide-viewing angles
  • AMD RYZEN 3 30 PROCESSOR - Everyday performance you can count on; Multitask, stream, game casually, and edit photos smoothly with responsive power and vibrant HDR visuals
  • ENJOY UP TO 14 HOURS AND 15 MINUTES OF BATTERY LIFE - HP Fast Charge restores battery from 0 to 50% in approximately 45 minutes
  • AMD RADEON 610M GRAPHICS - Experience smooth entertainment; Built for streaming and multitasking, enjoy realistic visuals and efficient performance for work and play
  • STORAGE AND MEMORY - 512 GB PCIe NVMe M.2 SSD offers fast speed and efficient storage; and 8 GB LPDDR5 RAM memory boosts performance with higher bandwidth

Prerequisites and decisions

  • An Ubuntu VPS with a public IPv4 address (and IPv6 if you intend to publish an AAAA record).
  • A domain name whose DNS you can edit.
  • Local SSH access from the computer running Cursor.
  • A project that has a documented production build command, commonly npm run build.
  • The output directory produced by that command, such as dist/, build/, or public/.
  • An SSH key rather than a password for the deployment user.
  • A decision about whether releases are manual or triggered by pushes to a protected branch.

Use a placeholder domain such as example.com while reading. Replace it everywhere before running a command. Package names, service names, and Certbot options can differ between Ubuntu releases, so check the current Ubuntu, Nginx, and Certbot documentation for the release installed on your VPS before applying production changes.

Prepare a safer SSH account on the VPS

Create a non-root deploy user

Log in as the provider’s initial administrator, create a dedicated account, grant it administrative privileges through sudo, and install your public key. The exact VPS image may already provide an administrative user; in that case, create a separate deploy account rather than copying your workflow’s private key into a shared account.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
ssh root@SERVER_IP
adduser deploy
usermod -aG sudo deploy

Copy your local public key to the new account with your operating system’s equivalent of ssh-copy-id, then test a new session before closing the original one:

ssh-copy-id deploy@SERVER_IP
ssh deploy@SERVER_IP
sudo -v

Do not disable the original administrative session until the new key-based login and sudo access work. A guide describing Ubuntu VPS setup also recommends creating a non-root deploy user and testing key login first: Ubuntu VPS static-site guide.

Update the host and install Nginx

sudo apt update
sudo apt upgrade
sudo apt install nginx
sudo systemctl enable --now nginx

Visit http://SERVER_IP. The default Nginx page confirms that the service is reachable before you add your own site. The installation and server-block sequence is also outlined in this Ubuntu Nginx tutorial.

Open the firewall without locking yourself out

If UFW is installed, allow SSH before enabling the firewall, then allow Nginx traffic:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
sudo ufw status verbose

If your provider has a separate network firewall, allow TCP ports 22, 80, and 443 there as well. Restrict SSH to your own IP only when you have a reliable fixed address and an out-of-band console for recovery.

Rank #2
HP 14" HD Chromebook Laptop for Students, Intel Quad-Core N4120(> N4020), 4GB RAM, 64GB eMMC, WiFi, Webcam, HDMI, USB-A&C, 14 Hours Battery Life, Zoom, Chrome OS, CUE Accessories
  • Intel Celeron N4120: 4 Cores & Threads, 1.1GHz Base Clock, Up to 2.6GHz Boost Clock, 4MB Cache, Intel UHD Graphics 600. The perfect combination of performance, power consumption, and value helps your device handle multitasking smoothly and reliably with four processing cores to divide up the work.

Point DNS at the VPS

Create an A record for the apex domain, for example example.com to the VPS IPv4 address. Create a www CNAME pointing to the apex name, or an additional A record, according to your DNS provider. If you use IPv6, add an AAAA record only when Nginx and the provider firewall are configured for IPv6.

DNS changes can be visible at different times because resolvers cache records. You can proceed with Nginx configuration immediately, but HTTPS issuance will fail until the names resolve to this VPS and ports 80/443 are reachable from the public internet.

Build the site in Cursor

Install dependencies reproducibly

Open the project folder in Cursor and use its integrated terminal. For a JavaScript project, install the lockfile-defined versions before building:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
npm ci
npm run build

Use the project’s documented equivalent when it is not JavaScript. Common output names are dist/, build/, and public/; inspect the build log and the project configuration instead of assuming one. The directory you synchronize must contain the production entry point, normally index.html, plus the generated assets.

Check production paths locally

Open the generated directory with a local static server or the framework’s preview command. Check that asset URLs, client-side routes, images, and environment-specific API endpoints use the public domain rather than localhost. Environment variables intended only for development must not be copied into a public bundle.

Deploy manually with rsync

Create a web root owned by the deploy account

sudo mkdir -p /var/www/example.com
sudo chown -R deploy:deploy /var/www/example.com

Keeping the destination writable by the deploy user avoids using a private key with root SSH access. If your hosting image uses a different web-root convention, keep the same ownership principle and adjust the path.

Synchronize the build output

Run this from the project directory on your local computer:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Rank #3
Sale
AKCHART 15.6'' AI Laptop with Office 365 12GB RAM 256GB SSD Win 11 Laptops | 7000mAh Battery, IPS FHD, 180°Viewing, Quad-Core Processor, Type-C, WiFi5, Portable Thin Business Student Laptops, Light Gray
  • Stunning 15.6" FHD IPS Display: Experience crisp 1920x1080 resolution on this 15.6 inch laptop with an IPS panel that delivers wide viewing angles and vivid colors. The narrow-bezel design maximizes screen real estate for comfortable viewing on this Win 11 laptop, whether you're studying or working.
  • Celeron J4105 Processor & 256GB SSD: Powered by a reliable Celeron J4105 processor paired with 12GB DDR4 memory and a fast 256GB M.2 SSD. This laptop computer supports SSD expansion up to 2TB and TF card expansion up to 1TB, so your storage grows with your needs. Delivers smooth multitasking for daily productivity.
  • AI-Powered Win 11 Laptop: Built-in AI features enhance your productivity with smart assistance for writing, summarizing, and task management. Pre-installed with Win 11 and includes Office 365 subscription. This student laptop is backed by 1-year warranty and 24/7 customer support.
  • All-Day 7000mAh Battery & 180° Hinge: The high-capacity 7000mAh battery keeps this laptop powered through long classes or meetings. The 180-degree lay-flat hinge lets you share your screen effortlessly during presentations. This durable laptop computer adapts to your dynamic workflow.
  • Versatile Connectivity Hub: Equipped with USB 3.2, Type-C, Mini HDMI, and 3.5mm audio jack to connect all your peripherals. Stay online anywhere with high-speed 5G WiFi and Bluetooth 4.2. This college laptop keeps you connected at home, in the library, or on the go.
rsync -avz --delete dist/ deploy@SERVER_IP:/var/www/example.com/

Replace dist/ with the real output directory. The trailing slash means “copy the contents of this directory.” --delete removes files from the server that no longer exist in the current build, preventing stale JavaScript chunks from remaining online. Never point this command at a directory containing uploads, user-generated content, or server-managed files; keep those outside the release directory or back them up first.

Before using --delete on a new project, perform a dry run:

rsync -avzn --delete dist/ deploy@SERVER_IP:/var/www/example.com/

The n flag reports changes without making them. Review the list, then run the real command. The static-site guide cited earlier uses this same synchronization shape for an Ubuntu VPS.

Configure Nginx for the domain

Create a server block

On the VPS, create /etc/nginx/sites-available/example.com:

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;

    root /var/www/example.com;
    index index.html;

    location / {
        try_files $uri $uri/ /index.html;
    }

    location ~* .(?:css|js|png|jpg|jpeg|gif|svg|ico|webp|woff2?)$ {
        try_files $uri =404;
        add_header Cache-Control "public, max-age=31536000, immutable";
    }
}

The try_files fallback is appropriate for many single-page applications because unknown client-side routes return index.html. A traditional multi-page site may need a different fallback; do not add it automatically if the site must return a real 404 for unknown paths. Long-lived asset caching is safe only when your build creates content-hashed filenames. Remove that cache header when filenames are reused between releases.

Enable and validate the site

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com
sudo nginx -t
sudo systemctl reload nginx

If the test reports a duplicate server_name, disable the default site or remove the conflicting block after confirming it is not serving another domain:

sudo rm /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx

Test both names over HTTP and inspect the deployed files if you receive a 403 or 404. A 403 commonly means the directory or files are not readable by Nginx; a 404 commonly means the root path or build directory is wrong.

Rank #4
HP Essential Laptop 2026, Intel CPU, 128GB Storage, Office 365, Windows 11
  • Efficient Performance for Everyday Computing: Powered by Intel N150 processor with up to 3.6 GHz Intel Turbo Boost Technology, 6 MB L3 cache, 4 cores, and 4 threads, this HP laptop delivers responsive performance for web browsing, streaming, document editing, and multitasking. Paired with 4GB LPDDR5 RAM and 128GB UFS storage, it handles daily tasks smoothly. Includes 1-year Microsoft 365 Personal subscription for Word, Excel, PowerPoint, and cloud storage to maximize your productivity.
  • 14-Inch HD Micro-Edge Display:Enjoy clear visuals on the 14-inch HD (1366 x 768) anti-glare screen with 250-nit brightness and 62.5% sRGB coverage. The micro-edge bezel delivers a 79% screen-to-body ratio in a compact design. An HP True Vision 720p HD camera with noise reduction and dual-array microphones supports clear video calls, remote work, and online learning.
  • Modern Connectivity and Wireless Technology: Stay connected with Wi-Fi 6 (2x2) for faster wireless speeds and Bluetooth 5.4 for seamless pairing with accessories. Versatile port selection includes 1 USB Type-C 10Gbps with DisplayPort 1.2 for external displays, 2 USB Type-A 5Gbps ports for peripherals, 1 HDMI 1.4b port, 1 headphone/microphone combo jack, and 1 multi-format SD media card reader. Connect monitors, transfer files quickly, and expand your workspace with ease.
  • All-Day Battery Life and Portable Design: Enjoy up to 11 hours of video playback, 7.5 hours of mixed usage, or 7.5 hours of wireless streaming on a single charge, perfect for students and professionals on the go. Weighing just 3.24 lb and measuring 12.76" x 8.86" x 0.71", this lightweight laptop fits easily in backpacks and bags. The stylish willow green top cover with matte finish and natural silver keyboard deck with vertical brushing pattern offer a modern, professional look.
  • AI-Enhanced Productivity: Access Microsoft Copilot instantly with the dedicated Copilot key for faster assistance. AI Noise Reduction filters background sounds and improves voice clarity during calls. Dual speakers provide clear audio, while the full-size natural silver keyboard and HP Imagepad support comfortable typing and navigation.

Enable HTTPS with Let’s Encrypt

After DNS resolves correctly and Nginx answers on port 80, install Certbot using the package instructions for your Ubuntu release and its Nginx integration. A commonly used package layout is:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com

Certbot will ask for an email address, terms acceptance, and whether HTTP should redirect to HTTPS. Verify the resulting configuration with sudo nginx -t, then reload if necessary. Test both https://example.com and https://www.example.com, and check that the certificate covers every hostname you publish.

Certificate renewal is automated on most current Ubuntu installations through a timer. Confirm that a renewal simulation succeeds:

sudo certbot renew --dry-run

The Nginx and HTTPS sequence is covered in the referenced Nginx-on-Ubuntu tutorial. Package behavior changes over time, so treat the commands as a starting point and follow the current Certbot instructions for your distribution.

Automate releases with GitHub Actions

For repeat deployments, keep the source in Git, push from Cursor’s Git integration, and let a workflow build the project and synchronize only the generated directory. This keeps build tools off the web server and makes each deployment reproducible.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Prepare an SSH deploy key

  1. Generate a dedicated key pair for automation on a trusted machine. Do not reuse your personal key.
  2. Add the public key to /home/deploy/.ssh/authorized_keys on the VPS.
  3. Store the private key in the repository’s encrypted Actions secrets, for example VPS_SSH_KEY.
  4. Create separate secrets for VPS_HOST, VPS_USER, and VPS_PATH. Limit the key’s account and directory permissions where practical.

Example workflow

Create .github/workflows/deploy.yml and adapt the runtime version, build command, output directory, and action versions to your project:

name: Deploy website

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Check out source
        uses: actions/checkout@v4

      - name: Set up Node
        uses: actions/setup-node@v4
        with:
          node-version: 22
          cache: npm

      - name: Install and build
        run: |
          npm ci
          npm run build

      - name: Install rsync and SSH tools
        run: sudo apt-get update && sudo apt-get install -y rsync openssh-client

      - name: Configure SSH
        run: |
          install -m 700 -d ~/.ssh
          printf '%sn' "${{ secrets.VPS_SSH_KEY }}" > ~/.ssh/deploy_key
          chmod 600 ~/.ssh/deploy_key
          ssh-keyscan -H "${{ secrets.VPS_HOST }}" >> ~/.ssh/known_hosts

      - name: Synchronize site
        run: |
          rsync -avz --delete -e "ssh -i ~/.ssh/deploy_key" 
            dist/ "${{ secrets.VPS_USER }}@${{ secrets.VPS_HOST }}:${{ secrets.VPS_PATH }}/"

ssh-keyscan records the server key presented during the run; for a high-assurance setup, verify that fingerprint out of band and store a fixed known-hosts value instead. Protect the workflow with branch protection and environment approvals so an unreviewed commit cannot publish immediately. The Hugo example described in this deployment article illustrates the same build-then-rsync architecture, although its web stack differs from the Nginx-only setup here.

Best Value
HP 14 inch Laptop, 2027 Edition, Intel N150 CPU, 4GB RAM, 128GB SSD, 1TB Cloud Storage, Long Battery Life, Win 11 with Microsoft 365
  • 【Powerful Performance】Equipped with an Intel N150 CPU, featuring up to 4.4 GHz, ensuring efficient and powerful multitasking capabilities.
  • 【Versatile Connectivity】Stay connected with multiple ports including USB 3.0 Type-C, USB 3.0 Type-A, and a headphone/mic combo jack, with Wi-Fi and Bluetooth for seamless wireless networking.

Make deployments recoverable

Keep the previous build as a versioned directory when instant rollback matters. A simple --delete sync replaces files in place; it does not preserve a previous release. For stronger rollback, upload to /var/www/releases/COMMIT_SHA, update a current symlink after a successful upload, and point Nginx at /var/www/current. That pattern requires a small server-side script and permission design, but it lets you switch back to the preceding commit without rebuilding.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Use Cursor Remote-SSH when you need remote editing

Remote-SSH is optional; it is not required for the rsync workflow. Community results identify the Cursor extension ID as anysphere.remote-ssh, but that identification and several compatibility details are community-reported rather than confirmed product documentation. Treat the extension listing and its current requirements as version-sensitive.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Define an SSH alias

On your local computer, edit ~/.ssh/config:

Host my-vps
    HostName SERVER_IP
    User deploy
    IdentityFile ~/.ssh/id_ed25519
    ServerAliveInterval 60
    ServerAliveCountMax 3

Test it with ssh my-vps, then choose the alias from Cursor’s Remote-SSH connection command. The alias keeps the hostname, user, and key consistent; a Cursor community thread discusses using one alias per user on shared servers: SSH for beginners and SSH config troubleshooting.

Check compatibility before relying on it

Remote-SSH installs a Cursor Server component on the VPS. Community reports indicate that it requires a modern GNU C library; one report says a CentOS 7.9 host with glibc 2.17 failed while glibc 2.28 was cited as a minimum. These are reports, not a guaranteed support matrix. Confirm the current requirement for your Cursor build before changing an operating system solely for this feature. See the discussion at Cursor Server questions.

Cursor’s AI features run on your local machine and use the SSH connection for remote files. If the editor connects but AI features do not respond, check local internet access first, then the VPS’s available CPU and memory. Cursor’s network troubleshooting page is available here. For an offline host, a community workaround copies the server package to the machine manually; it is not presented as an official feature: manual Cursor Remote-SSH server download discussion.

Raise remote.SSH.connectTimeout in Cursor settings only when a slow network is the cause. A larger timeout cannot fix a blocked port, a wrong key, an incompatible libc version, or an unavailable SSH daemon.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Troubleshoot by symptom

Symptom Likely cause Checks and fixes
Permission denied (publickey) Wrong user, key, or remote file permissions Run ssh -v deploy@SERVER_IP; confirm the public key is in the deploy user’s authorized_keys, and test the same identity used by rsync.
SSH times out Port 22 blocked, wrong IP, provider firewall, or offline host Check the VPS console and both provider and UFW rules. Do not repeatedly increase the Cursor timeout until basic SSH works.
Rsync says the source does not exist Wrong build output directory or command was not run Run the build again, list the project directory, and replace dist/ with the actual generated folder.
Old assets remain after deployment Files were copied without deletion or a cache is serving them Use a dry-run rsync --delete, then the real command; invalidate any CDN or browser cache and use hashed filenames.
Nginx returns 403 Incorrect ownership, permissions, or missing index file Check ls -la /var/www/example.com; ensure directories are searchable and files readable by Nginx, and confirm index.html exists.
Every client-side route returns 404 No SPA fallback Add try_files $uri $uri/ /index.html; for a single-page app, then run sudo nginx -t and reload.
HTTPS issuance fails DNS has not propagated, port 80 is closed, or another server answers Resolve both hostnames to this VPS, allow HTTP temporarily, and test the domain from an external network before rerunning Certbot.
Remote-SSH installs then disconnects Insufficient memory, incompatible glibc, or unstable SSH Use ordinary SSH to inspect memory and logs, verify the host’s libc against the current Cursor requirement, and add keep-alive settings.

Production checks before calling the deployment complete

  • Open the HTTPS URL in a private browser window and test the apex and www hostnames you published.
  • Use browser developer tools to confirm CSS, JavaScript, fonts, images, and API calls load from the intended domain.
  • Check that secrets are not present in the generated HTML or JavaScript bundle.
  • Run sudo nginx -t after every Nginx edit and reload rather than restarting unnecessarily.
  • Confirm the deploy user cannot write unrelated system directories and that the workflow key is stored only in encrypted secrets.
  • Keep the previous build or commit identifier so you can identify what is live and restore a known-good release.
  • Schedule operating-system security updates and monitor disk space, memory, Nginx errors, and certificate-renewal logs.

Once these checks pass, Cursor remains your development and release-control surface while Nginx serves the exact build output that was transferred to the VPS.

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.