Recommended Free Tools
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.
Need a server to try this on? Antihost offers Linux VPS plans with NVMe storage, full root access and a 14-day free trial.
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.
Do these 3 things before closing this tab:
1Fix the driver behind crashes, sound loss and screen glitches2Repair Windows errors before they cause bigger problems3Scan for outdated or missing drivers - takes under a minutePrepare 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.
#1 Best Overall
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.
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 →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.
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.
Rank #2
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.
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.
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.
Quick wins for a faster PC:
Clear out junk files and repair common Windows errorsFree Scan →Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →Repair Windows errors before they cause bigger problemsFix Now →Rank #3
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.
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.
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.
Rank #4
- 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.
Windows 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 reinstallCrashes, 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 minuteFor 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
- Reboot the VPS and confirm that
systemctlreports both PostgreSQL and Odoo as active. - Open the hostname through HTTPS and verify that the certificate, redirects and browser security indicators are correct.
- Create a test database through the Odoo web interface using the configured master password and restricted database role.
- Create or open a sample invoice and export it to PDF. Confirm that content, headers and footers render correctly; this validates the
wkhtmltopdfinstallation. - If multi-process mode is enabled, test LiveChat or another real-time feature and inspect the proxy logs for
/websocket/requests. - Run a backup containing both PostgreSQL data and the filestore, then complete a restore drill on a non-production instance.
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.
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.
Best Value
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_passwdis 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
wkhtmltopdf0.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.
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.
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.
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.




