Self-host WordPress on Linux without Docker, in four commands

From a download to a WordPress site in your browser with no Docker, no sudo and four commands. Then nginx and certbot to take it public.

· Updated · about 8 minutes to read

Guides to self-hosting WordPress on Linux come in two shapes. One is a long list of steps: install a web server, PHP and MariaDB from the distribution, create a database and a user, write a server block, unpack WordPress, set permissions. The other is a Docker Compose file that hides the same steps inside containers. This page is a third shape: one binary that brings its own web server, PHP and MariaDB and deploys a site with four commands. Every block of output below is from the dry run of 17 October 2026 on a clean Linux x64 machine. The last section takes the site public with nginx and certbot, which Nextweb does not do for you.

What you need

  • A Linux x64 machine: a laptop for a first try, or a server you reach over SSH.
  • curl, and an internet connection. Nextweb downloads itself and its packages, and checks its license each time it starts.
  • An email address, for the free license.
  • No root until the last section. Nothing in Nextweb uses sudo.

Install it

In your terminal
mkdir nextweb-tour
cd nextweb-tour
curl -fsSL https://get.nextwebjs.com | bash
You should see
==> Nextweb installer
    Platform: x86_64
...
==> Download complete
...
Nextweb is installed.

Start Nextweb:

    ./nextweb

The installer prints the size and SHA-256 it expects from the published manifest and keeps the file only when both match; leave off | bash to read the script first. The download is about 120 MB. Start it, give it your email address when it asks, and it fetches a free license, downloads its kernel and opens its shell:

In your terminal
./nextweb
You should see
...
[NW] Email address required for license. Enter your email:
...
[NW] Kernel loaded successfully: NextWeb Kernel v1.0.0-rc3
...
Connected to NextWeb (/home/you/nextweb-tour/nextweb_server)
Type "help" for available commands, use <TAB> and ? for completion, "exit" or "quit" to exit.

nextweb:/>

Install WordPress

At the nextweb prompt
pkg install wordpress
You should see
Resolving dependencies...
   Architecture: x64 (auto-detected)
Installation order: php8.3.9-linux-x64 → mariadb-11.4.5-linux-x64 → wordpress

Installing 3 package(s)...

Installing php8.3.9-linux-x64...
...
php8.3.9-linux-x64 8.3.9 installed successfully

Installing mariadb-11.4.5-linux-x64...
...
mariadb-11.4.5-linux-x64 11.4.5 installed successfully

Installing wordpress...
...
wordpress 7.1.3 installed successfully

One name brought three packages, into the Nextweb folder and nowhere else. On this run all three arrived in under twenty seconds.

Deploy it: four commands

A deploy names the site and the domain it answers to. www.example.com is a domain reserved for examples; use your own.

At the nextweb prompt
deploy company-site to www.example.com using wordpress
You should see
Site "company-site" registered for www.example.com (template: wordpress).

  Site root: /home/you/nextweb-tour/nextweb_server/sites/company-site
  Status: pending — configure options, then commit and apply

Next steps:
  configure
  set company-site admin-email you@example.com
  set company-site site-title "My Site"
  exit
  commit "Deploy company-site"
  apply
  verify company-site

Nothing is running yet. commit saves the site into the configuration, and apply turns the configuration into running software:

At the nextweb prompt
commit "Deploy company website"
apply -y
You should see
Committed: Deploy company website
Configuration validated.
Configuration written.
Applying configuration...

Applying site configuration...
Service mariadb: running (manage with "service mariadb status" / "service mariadb restart")

Site: company-site (www.example.com)
  Allocated site listen port 4001 for company-site
  Provisioning database for site company-site...
  MariaDB running (socket /tmp/nw-maria-f982b35671ab.sock)
  Database wp_company_site and user wp_companysite ready
  Starting PHP runtime for site...
  php-cgi listening on 19100 (2 processes, opcache off)
company-site: WordPress provisioned at /home/you/nextweb-tour/nextweb_server/sites/company-site/wordpress
Service company-site: registered (manage with "service company-site status" / "service company-site restart")
Visit: http://127.0.1.10:4001/
Webserver reloaded (site listen ports bound)

Site apply complete.

Configuration changes complete!
Changes 1, Warnings 0, Errors 0

Read it from the top: MariaDB starts as a service, the site gets a port, a database and a user, two PHP processes start for it, WordPress is set up in the site's own folder, and the last line but one is the address. verify asks the site for a page:

At the nextweb prompt
verify company-site
You should see
Verifying site: company-site
wp-config.php present
state.json (domain: www.example.com, status: applied)
database configuration present in site state
HTTP check passed (200)
Response contains WordPress markers
vhost conf.d: company-site.js

Visit: http://127.0.1.10:4001/

All checks passed.

Open the Visit address in a browser and WordPress's own five-minute setup runs: language, site title, a user and a password. The address is on the machine itself: each Nextweb folder on a machine gets one, the first 127.0.1.10, the next 127.0.2.10, and each site in a folder gets its own port. The socket name and the ports on your screen may differ.

What you have on disk

nextweb-tour/
  nextweb                          the program
  nextweb_server/
    config/nextweb-services.json   the saved configuration
    runtime/                       PHP and MariaDB, installed once
    sites/company-site/
      wordpress/                   the site's own copy of WordPress
      .nextweb/state.json          what Nextweb knows about the site

No system package was installed, no service unit was written, and no container is running. A second site gets its own folder, database and user, PHP processes and port; the sites in a folder share one MariaDB. WordPress keeps its own copy up to date as new releases come out. How a deploy works explains each command.

Take it public with nginx and certbot

Nextweb answers on an address on the machine and does not get certificates; automatic HTTPS is on the roadmap under Not yet. On a server with a domain pointed at it, you put nginx in front. These steps are yours, not Nextweb's, and they need root.

Install nginx and certbot the way your distribution and certbot's instructions say; on Ubuntu that is sudo apt install nginx certbot python3-certbot-nginx. Then give nginx a server block that passes the domain and the original scheme through to the site's port:

/etc/nginx/conf.d/www.example.com.conf
server {
    listen 80;
    server_name www.example.com;

    location / {
        proxy_pass http://127.0.1.10:4001;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
In your terminal
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d www.example.com

certbot gets the certificate, adds the 443 server to that block and, if you let it, sends port 80 to 443. Nextweb's web server reads X-Forwarded-Proto and X-Forwarded-For and hands PHP HTTPS=on and the visitor's address, so WordPress sees the request as it arrived.

Last, tell WordPress its public address. apply wrote the Visit address into the site's wp-config.php, in nextweb_server/sites/company-site/wordpress/:

wp-config.php
define( 'WP_HOME', 'http://127.0.1.10:4001' );
define( 'WP_SITEURL', 'http://127.0.1.10:4001' );

Change both to https://www.example.com. Nextweb rewrites those two lines only when its own address moves, and only while they still hold an address of the form it wrote, so your edit stays. The site itself keeps listening on 127.0.1.10, which nothing off the machine can reach: only nginx talks to it, and the firewall needs ports 80 and 443 open and nothing else.

What this does not do

  • Run offline. Nextweb checks its license each time it starts.
  • Cover more than the license says. The free license is one machine and three sites for 30 days, renewed by email; a Developer license is five machines and ten sites (pricing).
  • Run anywhere but Linux x64. Windows x64 and FreeBSD x64 have the program, not the packages; there is no macOS build.
  • Deploy a PHP application that is not WordPress. deploy knows WordPress and a Node.js application of your own.
  • Get certificates or answer on ports 80 and 443. That is the nginx section above.

Next step

The first lesson walks the same path with every command and its output, in about fifteen minutes. Download Nextweb to start.

Questions

Does it need Docker?

No. Nextweb is one binary. PHP and MariaDB are packages it installs into its own folder, and the web server is built in. There is no daemon, no image and no volume.

Does it need root?

Not for Nextweb: nothing it does uses sudo, and it writes to the folder you started it in. nginx and certbot need root, for ports 80 and 443 and the certificate.

Can I run it on a VPS?

Yes, with the same commands. The site listens on an address on the machine itself, so only nginx reaches it, and the firewall needs ports 80 and 443 open and nothing else.

Which WordPress does it install?

On the run this page quotes, pkg install wordpress brought WordPress 7.1.3 with PHP 8.3.9 and MariaDB 11.4.5. WordPress keeps its own copy up to date afterwards, as it does anywhere.

Related: Deploy a website, How a deploy works, WordPress on Nextweb.