Hardware FixRecommendedDevice not working? Your driver may be the problemCheck updates for common hardware issues.Fix DriversOctober DealsAmazon USOctober deal check: compare before you payAmazon US: current deals, useful picks and tech finds.Check DealsPC HealthRecommendedCrashes, freezes, slowdowns? Check your PC nowSpot repairable issues before they interrupt work.Check PC×
Skip to content
VGSources
Blog

How to Install Odoo 18 on a Linux VPS

A practical Odoo 18 VPS installation guide covering package and source methods, PostgreSQL roles, wkhtmltopdf 0.12.6, HTTPS reverse proxies, WebSockets, worker sizing and restore testing.
Length14 min Posted Quest giverVGSources Team
Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

The most reliable production setup is Odoo 18 from the official Debian package on a supported Ubuntu or Debian VPS, with PostgreSQL on the same server, wkhtmltopdf 0.12.6 for complete PDF reports, and Nginx or another reverse proxy terminating HTTPS. Use a source checkout instead when you need custom-module development or several Odoo versions side by side.

Choose the Odoo release before touching the server

Odoo commands and dependencies change between major releases. This guide uses Odoo 18 as the concrete example. Odoo 18 packaged installers support Debian Bookworm 12 and Ubuntu Jammy 22.04 LTS or newer. If you choose another release, verify its supported operating systems, Python version, PostgreSQL range, repository instructions and required PDF-rendering build before running any command.

As an Amazon Associate I earn from qualifying purchases.

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

Prepare the VPS

  • A fresh supported Ubuntu or Debian VPS with a sudo-capable account.
  • A DNS record for the hostname that will serve Odoo.
  • A firewall or cloud security group allowing SSH. Open HTTP and HTTPS only after the reverse proxy and certificate are ready.
  • Enough CPU, memory and disk for your users, installed modules, database growth, filestore and backups.

Decide the public hostname, database location, installation method and Odoo release before you begin. Keeping those decisions fixed prevents a common failure mode: following package instructions for one major release, then adding a source tree, Python requirements or PDF binary from another. Write down the intended service user, configuration file, addon locations and backup destination so a second administrator can reproduce the setup.

Package or source: which installation fits?

Consideration Official Debian package Source checkout
Best use One conventional production installation Development, custom modules or multiple Odoo versions
Operating-system alignment Uses the Odoo-supported Debian/Ubuntu package targets You must match the source branch to compatible system libraries yourself
Service management Installs a service and starts it for you You create and maintain the service unit and system user
Dependencies Resolved by the package manager You must manage system libraries, Python isolation and requirements
Upgrades and rollback Convenient package upgrades; test each release before production More control over checkouts and rollback, but you own the procedure
Side-by-side releases Less convenient Practical when each checkout, configuration, port and service is isolated

For a first VPS deployment, the package is the safer default. Source installation is worthwhile when your team actively develops addons or must keep different major releases available at the same time.

What the package does for you

The official package is more than a tarball of application files. It supplies a service definition, integrates with the operating system’s package database, creates the PostgreSQL application role required by the packaged setup and starts Odoo. That reduces the number of moving parts you must invent, but it also means upgrades follow the package’s release and dependency rules. Keep a copy of your configuration and custom addons outside package-managed paths, and test an upgrade on a staging copy before applying it to production.

When source is the better engineering choice

A source checkout lets you pin a branch, inspect changes, add custom addon directories and run two major releases on one development host. The trade-off is that every checkout needs its own configuration, Python environment, filestore strategy, service unit and listening port. You are responsible for dependency compatibility, migrations and a rollback plan. Never run the checkout as root; use a dedicated account with only the file and database access that Odoo needs.

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

Install Odoo 18 with the Debian package

1. Update the operating system and install PostgreSQL

Odoo cannot run without PostgreSQL. On a new server, update the package index and apply security updates before installing the database:

sudo apt update
sudo apt upgrade
sudo apt install postgresql

Keep PostgreSQL local unless you have a reason to separate it. The packaged setup normally connects through a local Unix socket or loopback interface.

2. Add the signed Odoo 18 repository

Use the signed-keyring repository procedure in the current Odoo 18 installation documentation for your exact Debian or Ubuntu release. Then refresh APT metadata and install the package:

sudo apt update
sudo apt install odoo

The package creates the required PostgreSQL application role, installs Odoo as a service and starts it. Do not copy a repository line or signing-key command from a different Odoo major release; repository paths and signing procedures can change. A signed keyring lets APT verify repository metadata instead of trusting an unverified package source, so do not bypass signature checks to force an installation.

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

3. If you downloaded a community or enterprise .deb

For a local package file, use the documented dependency-repair sequence:

sudo dpkg -i odoo_package.deb
sudo apt-get install -f
sudo dpkg -i odoo_package.deb

Replace the filename with the package you downloaded. Enterprise package downloads require an eligible paid on-premise customer or partner login. Do not use an enterprise package without the corresponding entitlement. The dependency-repair step is important because dpkg installs a file but does not resolve every dependency by itself; rerunning it after APT has corrected dependencies confirms that the same package is completely configured.

4. Install the PDF renderer separately

Install the Odoo 18-compatible wkhtmltopdf build separately. Odoo specifies version 0.12.6 when you need report headers and footers; installing Python packages with pip does not install it. A missing or incompatible renderer is a common reason invoices export as blank PDFs or lose their header and footer.

5. Inspect the generated configuration and service

Package installations commonly create /etc/odoo.conf. Read it before exposing the site, confirm the database connection settings and set a long, random admin_passwd. This master password protects database-management operations and is separate from individual user passwords.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
sudo systemctl status odoo
sudo systemctl enable odoo
sudo journalctl -u odoo --no-pager -n 100

Also check PostgreSQL:

sudo systemctl status postgresql
sudo systemctl enable postgresql

Resolve startup errors in the logs before proceeding to DNS or proxy configuration. Check ownership and permissions on the configuration, log and filestore paths; the service account must be able to read its settings and write application data, while ordinary shell users should not be able to read secrets.

Install from Odoo source

Source installation gives you control over the checkout, custom addon paths and Python environment, but it adds operational responsibility. Keep each release in its own directory and run it as a dedicated, non-root system user.

1. Install a supported PostgreSQL server

For Odoo 18 source installation, PostgreSQL 12.0 or newer is supported. Create a dedicated database role with only the privileges Odoo needs. Odoo explicitly forbids connecting as the PostgreSQL postgres superuser. Separate database ownership and application login privileges where your deployment policy allows it.

2. Obtain the matching source branch

Check out the Odoo Community branch or release archive that exactly matches the version you intend to run. Do not mix an Odoo 18 source tree with requirements or addons from another major release.

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

3. Install Debian dependencies

From the source tree on Debian or Ubuntu, Odoo documents this helper:

sudo ./setup/debinstall.sh

If you install dependencies manually, first install the documented system libraries and then use that release’s requirements.txt inside an isolated Python environment where practical. Odoo warns that careless pip-based dependency installation can create security and dependency problems; do not blindly install arbitrary versions from an unrelated release.

4. Add the service and supporting files

Install the release-specific wkhtmltopdf build, create a systemd unit that runs Odoo as the dedicated user, and explicitly define the executable path, configuration file, log destination and working directory. Keep the source checkout, configuration, custom addons path and filestore separate so you can test an upgrade and roll back by switching the service to the previous release. Give each side-by-side release a distinct service name and port, and verify that its unit starts from the intended checkout rather than whichever directory happens to be current.

Configure PostgreSQL and Odoo safely

Local database connections

The default package setup expects PostgreSQL on the same host and normally uses a local Unix socket or loopback connection. Confirm that the Odoo role can access its databases but is not a superuser. Keep the master admin_passwd out of shell history and configuration backups that are readable by ordinary users.

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

Database-management operations are especially sensitive because the master password can authorize creation or deletion of databases through the web interface. Use a generated value that is unrelated to any employee or database-user password, restrict read permissions on the configuration file and rotate it through a planned maintenance procedure if it is exposed.

Remote PostgreSQL

If the database is on another machine, deliberately configure PostgreSQL to listen on the required private interface and edit pg_hba.conf for the Odoo server’s address. Prefer encrypted connections, restrict the database firewall to the application host and set Odoo’s database host, port, user, password and SSL options explicitly. Never open PostgreSQL to the entire internet.

Test remote connectivity from the VPS before starting Odoo, then test it again after a reboot. A permissive network rule can make an initial connection work while an incorrect host-based authentication rule still blocks database creation. Keep the database listener and Odoo application traffic on private addresses; only the reverse proxy should need public HTTP or HTTPS exposure.

Filestore and permissions

Odoo stores uploaded documents and other binary data in its filestore as well as in PostgreSQL. The service account must be able to read and write the configured filestore, while unrelated users must not. A database-only backup is incomplete because it cannot restore those files. Include configuration and custom addons in your operational backup plan when they are needed to recreate the service, but protect files containing passwords as carefully as the database dump.

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.

Put Odoo behind HTTPS with a reverse proxy

Do not make Odoo’s development HTTP listener the public endpoint. Place Nginx, Apache or another reverse proxy in front of it, obtain a valid certificate for the DNS name and forward requests to Odoo over the private interface.

Required proxy behavior

  • Enable Odoo’s proxy mode in the configuration. Odoo’s documentation states that proxy mode must be enabled when Odoo is behind a reverse proxy.
  • Pass the original host, HTTPS scheme and client IP headers so generated links, redirects, audit information and access controls see the real request.
  • Forward normal web traffic to Odoo’s HTTP port and allow request bodies large enough for the files your users upload.
  • Terminate TLS at the proxy, redirect plain HTTP to HTTPS and renew the certificate before it expires.

Validate the complete chain rather than checking only that the proxy process is running: resolve the hostname to the VPS, request the HTTPS URL from an external network, inspect the certificate name and expiry, and confirm that Odoo generates HTTPS links after login. If the browser shows mixed-content warnings or redirects between HTTP and HTTPS, recheck the original scheme header and proxy mode before changing application URLs.

Route WebSockets when using multiple processes

In multi-process mode, Odoo’s dedicated LiveChat worker listens on the gevent port. Configure the proxy so every path beginning with /websocket/ is sent to that worker, with WebSocket upgrade and connection headers preserved. If this route is missing, ordinary pages may work while LiveChat and other real-time features silently fail.

Size workers and limits for the VPS

Worker count, memory ceilings, request limits and timeouts depend on CPU, RAM, installed modules and concurrent users. Odoo gives a theoretical maximum worker formula of (CPU threads × 2) + 1, but it is a sizing heuristic, not a universal setting. Start conservatively, observe CPU and memory under representative load, and adjust only after checking database and proxy behavior.

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

Odoo’s example describes a four-CPU system with eight threads, 60 concurrent users, eight workers plus one cron worker and approximately 3 GB of RAM for Odoo. That example is not a promise that the same VPS will support your workload: attachments, reporting, imports, custom modules and background jobs can change requirements substantially.

  • Leave memory for PostgreSQL, the operating system, the proxy and filesystem cache.
  • Set limits that prevent one report or import from exhausting the entire VPS.
  • Use separate staging and production configurations when testing worker changes.
  • Watch service logs, load average, RAM, swap, disk space and PostgreSQL activity after every change.

Increase workers only when measurements justify it. More workers consume memory even when idle, and reducing available memory for PostgreSQL can make the whole installation slower. Test report generation, imports and scheduled jobs because a browser-only smoke test does not exercise the same limits as a production workload.

Backups, updates and day-to-day operation

Enable both Odoo and PostgreSQL at boot, monitor their logs and schedule backups for every Odoo database plus the filestore. Store copies outside the VPS and protect them with access controls. A backup is only trustworthy after a restore drill has recreated a test database and its uploaded files.

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

For package installations, apply updates through the package manager after testing them in a staging copy. For source installations, test the new checkout, Python dependencies, custom addons and database migration before changing the production service. Keep the previous release, configuration and backup available until the new version is proven.

Plan maintenance around database migrations and addon compatibility, not only around replacing application files. Record which release, configuration and dependency set produced each backup. During a rollback, stop the service, restore the matching database and filestore state if necessary, point the service unit back to the known-good release and verify PDF output and proxy behavior again.

Verify the installation before opening it publicly

  1. Reboot the VPS and confirm that systemctl reports both PostgreSQL and Odoo as active.
  2. Open the hostname through HTTPS and verify that the certificate, redirects and browser security indicators are correct.
  3. Create a test database through the Odoo web interface using the configured master password and restricted database role.
  4. Create or open a sample invoice and export it to PDF. Confirm that content, headers and footers render correctly; this validates the wkhtmltopdf installation.
  5. If multi-process mode is enabled, test LiveChat or another real-time feature and inspect the proxy logs for /websocket/ requests.
  6. Run a backup containing both PostgreSQL data and the filestore, then complete a restore drill on a non-production instance.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Common failures and targeted fixes

Odoo will not start

Read journalctl -u odoo and the Odoo log first. Typical causes are a malformed configuration, an unavailable PostgreSQL service, an incorrect file permission or a Python dependency from the wrong release. Confirm the service user can read the configuration and write the filestore.

Database creation fails

Check the configured master password, database host and port, and the PostgreSQL role’s privileges. Ensure the role is not being replaced with the postgres superuser and that remote PostgreSQL access, if used, is allowed only from the VPS address in pg_hba.conf.

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.

PDFs are blank or missing headers

Verify that wkhtmltopdf was installed separately and that the binary is the Odoo 18-compatible 0.12.6 build. Restart Odoo after correcting the executable path, then export a fresh report. A browser opening the HTML successfully does not prove that the server-side PDF renderer is installed correctly.

Pages work but LiveChat or notifications do not

Check that Odoo is actually running in multi-process mode and that the reverse proxy routes /websocket/ to the gevent worker with upgrade headers. Review both proxy and Odoo logs for rejected upgrades or an incorrect backend port.

The proxy returns 502 or redirects endlessly

Confirm that Odoo is listening on the address and port used by the proxy, that local firewall rules permit that connection and that proxy mode and original scheme headers are consistent. A redirect loop commonly means Odoo does not know the original request was HTTPS.

Final deployment checklist

  • Release, operating system, PostgreSQL and Python versions are an explicitly supported combination.
  • Odoo runs under a dedicated account, not root, and PostgreSQL access does not use a superuser.
  • admin_passwd is strong and protected; database-management access is not exposed unnecessarily.
  • HTTPS terminates at the reverse proxy, proxy mode is enabled and original request headers are preserved.
  • /websocket/ reaches the LiveChat worker when multi-process mode is enabled.
  • PDF output has been tested with the required wkhtmltopdf 0.12.6 build.
  • PostgreSQL and filestore backups are automated, stored separately and proven restorable.
  • Monitoring and log review are in place before production users are invited.

Frequently Asked Questions

How do I install Odoo 18 on an Ubuntu VPS?

Use Ubuntu Jammy 22.04 LTS or newer, install PostgreSQL, add the signed Odoo 18 repository, install the odoo package, install wkhtmltopdf 0.12.6 separately, then configure HTTPS through a reverse proxy. Verify the service and logs before opening the hostname publicly.

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

Should I use the Odoo package or install from source?

Choose the official Debian package for a conventional single production installation because it supplies dependency integration, a service and the PostgreSQL application role. Choose source when you develop custom addons or need multiple Odoo major releases side by side; you then manage Python isolation, service units, upgrades and rollback yourself.

Which PostgreSQL version does Odoo 18 need?

Odoo 18 source documentation supports PostgreSQL 12.0 or newer. The packaged setup normally uses a local PostgreSQL service and a dedicated application role. Do not configure Odoo to connect as the postgres superuser.

Why are Odoo PDF reports blank or missing headers?

Odoo does not install the PDF renderer through pip. Install the Odoo 18-compatible wkhtmltopdf 0.12.6 build separately, confirm Odoo can execute that binary, restart the service and export a new report. Test an invoice with headers and footers rather than relying on browser HTML.

How do I put Odoo behind Nginx or another HTTPS proxy?

Terminate TLS at Nginx, Apache or another reverse proxy, forward requests to Odoo over the private interface, enable Odoo proxy mode and pass the original host, HTTPS scheme and client IP. Redirect HTTP to HTTPS and renew the certificate before expiry. In multi-process mode, route /websocket/ to the gevent worker with upgrade headers.

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.

Can PostgreSQL run on another server?

Yes, but configure the database listener and pg_hba.conf deliberately for the VPS address, restrict the database firewall to that application host, prefer encrypted connections and set Odoo’s host, port, credentials and SSL options explicitly. Never expose PostgreSQL to the entire internet.

How many Odoo workers should a VPS use?

Odoo gives (CPU threads × 2) + 1 as a theoretical maximum, not a universal setting. Start conservatively and measure CPU, memory, PostgreSQL activity and proxy behavior. Odoo’s example uses four CPUs, eight threads, 60 concurrent users, eight workers, one cron worker and about 3 GB of RAM for Odoo, but your modules and reports may require different capacity.

What must an Odoo backup include?

Back up every PostgreSQL database and the Odoo filestore. Keep copies outside the VPS, protect them, and complete a restore drill that recreates both database records and uploaded files. Retain the matching configuration, custom addons and release information needed to start the restored service.

The Bottom Line

For most Linux VPS deployments, install Odoo 18 from the signed Debian package on supported Ubuntu or Debian, use a dedicated PostgreSQL role, add wkhtmltopdf 0.12.6, and publish it only through an HTTPS reverse proxy with proxy mode enabled. Choose source installation for controlled development or side-by-side releases, size workers from measured load, and prove that database and filestore backups restore before production use.

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

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.

Leave a Reply

Your email address will not be published. Required fields are marked *

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

More quests from Patch Notes

  1. How to Set Up a RedM (RDR2) Server in 2026: License Key, txAdmin and server.cfg, Step by StepBlog11min
  2. Best RedM (RDR2) Server Hosting in 2026: Comparing Four Hosts on Slots, Memory and PriceBlog10min
  3. How to Host a Mindustry Server in 2026: server-release.jar, Port 6567 and the Commands That MatterBlog7min
Recommended PC Tool
Recommended PC Tool
PC Slower Than It Used to Be?Free scan - under a minute
Crashes, No Sound, or Screen Glitches?Free driver scan

Two free Windows tools

One Free Minute Could Fix That PC

Before you go - each of these free tools takes about a minute and tackles what quietly slows a Windows PC down.

Special offer. View Outbyte info, uninstall instructions, EULA, and Privacy Policy.