LIONFIN
Use case

Odoo Hosting

Run your Odoo Community or Enterprise installation with PostgreSQL, a multi-worker setup and an Nginx reverse proxy on a VDS with dedicated cores and full root access.

See packages From ₺899.00 per month (excl. VAT)
Odoo 19 requirement
Python 3.10+, PostgreSQL 13+
Worker rule
(cores × 2) + 1; ≈ 6 concurrent users per worker
Default ports
8069 (HTTP), a separate port for the gevent worker (8072 in the sample configuration)
Recommended operating system
Ubuntu 24.04 LTS or Debian
Suitable product
KVM-based NVMe VDS with full root access

Quick answer

Odoo hosting means running the open-source Odoo ERP on a server you fully control, where your own data lives. Odoo 19 needs Python 3.10+ and PostgreSQL 13+; in production the worker count follows the (cores × 2) + 1 rule, and each worker serves about six concurrent users. The application runs behind an Nginx reverse proxy, with a separate gevent port for chat and notifications. A VDS server with dedicated cores delivers predictable performance under the daytime reporting and accounting load of an ERP.

Odoo Hosting packages

Monthly starting prices in Turkish lira, excluding VAT. You complete the order on our Turkish store page.

VDS Pro

₺1,599.00 / month

  • 8 ayrılmış çekirdek
  • 16 GB RAM
  • 400 GB NVMe
  • 15 TB Trafik
  • 1 IPv4
  • Günlük yedek
Order (Turkish checkout)

VDS Max

₺2,899.00 / month

  • 12 ayrılmış çekirdek
  • 32 GB RAM
  • 800 GB NVMe
  • 25 TB Trafik
  • 2 IPv4
  • Öncelikli destek
Order (Turkish checkout)

Approximate server needs by concurrent Odoo users (application and PostgreSQL on the same server)

Concurrent usersDedicated coresRAMHTTP workers
1–102–44–8 GB2–4
10–3048–16 GB5–8
30–75816–32 GB9–13
75–15012+32 GB or more13–25 (PostgreSQL on a separate server recommended)

Estimates; actual needs depend on mods, plugins and settings.

What is Odoo hosting and who is it for?

Odoo hosting means renting resources to run the Odoo ERP software on a server you manage yourself (on-premise) instead of Odoo’s own cloud services. Odoo is modular business software that combines accounting, inventory, purchasing, sales, CRM, manufacturing, HR and e-commerce apps in a single database.

Running it on your own server makes sense when:

  • You develop custom modules: you want to install your own and community (OCA) modules freely and change the code
  • Data location matters: you want accounting and staff data to stay on a server in Türkiye under your own control
  • Integrations are heavy: e-invoicing providers, marketplaces, bank and shipping connections need server-level access
  • You will use the Community edition: the licence-free Community edition runs only on your own server

Installing and running Odoo requires Linux, PostgreSQL and Python knowledge. If you are looking for ready-made, browser-based accounting or CRM software rather than installing an ERP, LIONFIN business software can be used without any installation.

What are the Odoo 19 system requirements?

Odoo 19 requires Python 3.10 or newer and PostgreSQL 13 or newer; with this release, the official installation documentation raised the PostgreSQL minimum from 12 to 13. The documentation on Odoo’s development branch shows minimums of Python 3.12 and PostgreSQL 16 for the next major version, so choosing Ubuntu 24.04 LTS and PostgreSQL 16 or newer for a new installation reduces the need to change infrastructure at the next upgrade.

ComponentRequirement / recommendation
Operating systemUbuntu 24.04 LTS or Debian (official Odoo packages are Debian-based)
Python3.10 or newer for Odoo 19
DatabasePostgreSQL 13 or newer (Odoo works only with PostgreSQL)
PDF reportsThe wkhtmltopdf version specified in the Odoo documentation
Web serverNginx (reverse proxy and HTTPS)
PortsOnly 80 and 443 open externally; 8069 and the gevent port local only

Odoo does not work with MySQL or MariaDB; there is no alternative database. For invoice and quotation PDFs to render properly, install the wkhtmltopdf version Odoo recommends; the version in your distribution’s repository may print headers and footers incompletely. Because all these components require full root access, Odoo does not run on shared hosting.

Should you install Odoo Community or Enterprise?

Odoo Community is open source and can be used on your own server without licence fees; Odoo Enterprise adds extra apps and features on top of Community and requires a per-user subscription. Both editions can run on your own server; to use Enterprise on-premise you need a valid subscription.

Consider these points when choosing:

  • The apps you need: Some accounting reports, advanced manufacturing planning, quality, maintenance and Studio (no-code customisation) are Enterprise-only.
  • Community modules: Community users commonly fill missing features with OCA (Odoo Community Association) modules; you are responsible for tracking their version compatibility.
  • Version upgrades: An Enterprise subscription covers Odoo’s upgrade service; on Community, major upgrades are done with community tools and more effort.
  • Support: On Enterprise, functional support comes from Odoo; on Community, it comes from your partner or your own team.

In infrastructure terms, both editions have the same server requirements: the same Python, PostgreSQL and worker calculation apply. The sizing and configuration advice on this page applies to both.

How many workers and how much RAM does Odoo need?

Odoo’s official deployment documentation gives the rule (number of cores × 2) + 1 for the number of HTTP workers and states that one worker serves about six concurrent users. The memory calculation assumes that 20% of requests are heavy (about 1 GB) and 80% are light (about 150 MB); multiplying this weighted average by the number of workers gives the total requirement.

Example calculation for 50 concurrent users:

  1. Workers needed: 50 / 6 ≈ 8 HTTP workers, plus 1 cron worker.
  2. Core limit: (4 × 2) + 1 = 9; four dedicated cores carry this number of workers.
  3. Memory: weighted average per worker ≈ (0.2 × 1 GB) + (0.8 × 150 MB) ≈ 320 MB; for nine workers ≈ 3 GB.
  4. Extra headroom for PostgreSQL and the operating system: several gigabytes depending on database size.

This calculation gives the minimum for the application itself; jobs such as bulk imports, large inventory reports and period-end accounting close briefly need much more memory. The values in the table include this headroom. Dedicated cores let workers truly run in parallel, so they give more predictable results for an ERP than shared virtual cores.

What should the Odoo production configuration (odoo.conf) look like?

In production, Odoo should run in multi-processing mode, behind a reverse proxy and with the database manager disabled. To do this, the worker count, memory and time limits and security settings are defined in the odoo.conf file.

[options]
proxy_mode = True
workers = 8
max_cron_threads = 1
limit_memory_soft = 629145600
limit_memory_hard = 1677721600
limit_time_cpu = 600
limit_time_real = 1200
list_db = False
dbfilter = ^company$
http_interface = 127.0.0.1
gevent_port = 8072

What the settings mean:

  • workers: the number of HTTP workers; if left at 0, Odoo runs in single-process development mode, which is not suitable for production.
  • limit_memory_soft / limit_memory_hard: worker memory limits in bytes (about 600 MB and 1.6 GB in the example). A worker that exceeds the soft limit is restarted after finishing its request; one that exceeds the hard limit is terminated immediately.
  • limit_time_cpu / limit_time_real: time limits in seconds for long-running reports; if your large reports time out, raise these values carefully.
  • proxy_mode: lets Odoo read the real client address and HTTPS information from the reverse proxy headers; enable it only behind a proxy.
  • list_db and dbfilter: hide the database list and make the server serve only a specific database.

How do you set up an Nginx reverse proxy for Odoo?

Nginx terminates HTTPS in front of Odoo, forwards normal requests to the HTTP workers on port 8069, and forwards requests starting with /websocket/ to the real-time worker on the gevent port. Without this split, chat (Discuss), instant notifications and live chat do not work.

upstream odoo { server 127.0.0.1:8069; }
upstream odoochat { server 127.0.0.1:8072; }

server {
    listen 443 ssl;
    server_name erp.yourdomain.com;
    client_max_body_size 100m;
    proxy_read_timeout 720s;

    location /websocket {
        proxy_pass http://odoochat;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
    location / {
        proxy_pass http://odoo;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $host;
    }
}

You can obtain the certificate with Let’s Encrypt and redirect HTTP requests to HTTPS. The client_max_body_size value matters for large attachments and import files, and proxy_read_timeout for long reports. Odoo’s ports 8069 and 8072 must stay closed to the outside in the firewall; Odoo should be reachable only through Nginx.

How do you tune PostgreSQL for Odoo?

Odoo’s speed depends heavily on PostgreSQL’s memory settings; the default PostgreSQL settings are designed for small servers and fall short under ERP load. The first values to adjust are shared_buffers, effective_cache_size and work_mem.

  • shared_buffers: The PostgreSQL documentation recommends about 25% of memory as a starting value on a dedicated database server. If it runs on the same server as Odoo, set the ratio taking the workers’ memory needs into account.
  • effective_cache_size: Estimates the total memory available to the database including the operating system’s file cache; it affects the query planner’s decision to use indexes.
  • work_mem: Memory per connection for sort and join operations; too high a value, multiplied by concurrent connections, can exhaust memory.
  • max_connections: Choose a value that covers the connections required by Odoo workers and cron, without being needlessly high.

Keeping database files on NVMe storage makes a difference for write-heavy work such as stock moves and accounting entries. Once concurrent users exceed 75–100, moving PostgreSQL to a separate VDS stops the application and database from sharing the same memory.

How do you install Odoo on a server?

You can install Odoo on Ubuntu 24.04 LTS in two ways: from Odoo’s official Debian package repository or from source via the Git repository. The package installation is faster and comes with a ready service definition; installing from source is more flexible for running several Odoo versions side by side and developing custom modules.

  1. Update the server, enable SSH key login and leave only ports 22, 80 and 443 open in the firewall.
  2. Install PostgreSQL and create a password-protected database user for Odoo; this user must not be a superuser.
  3. For a source installation, create a separate system user for Odoo, clone the code from the relevant version branch (for example 19.0) and install the dependencies in a Python virtual environment.
  4. Install the wkhtmltopdf version Odoo recommends.
  5. Prepare the odoo.conf file with production settings and define Odoo as a systemd service.
  6. Configure Nginx as a reverse proxy, enable HTTPS with Let’s Encrypt and create the database.

After installation, the first things to do are change the administrator password, enable two-factor authentication and set up the company, currency and language settings.

How do you manage Odoo modules and localisation?

In Odoo, custom and community modules should live in separate folders added to the addons_path list in odoo.conf, not copied into the core code. This separation keeps your own modules unaffected when you update Odoo.

  • Folder layout: For example /opt/odoo/odoo for the core, /opt/odoo/oca for community modules and /opt/odoo/custom for your company-specific modules.
  • Module updates: When code changes, update the module with odoo-bin -u module_name -d database --stop-after-init and restart the service.
  • Version compatibility: Use the same branch of community modules as your Odoo major version (for example 19.0).

Odoo’s country-specific accounting localisations bring the chart of accounts and tax definitions for each country. Legally required electronic documents, such as e-invoices, are usually sent through certified provider modules; in Türkiye, for example, e-Fatura, e-Arşiv and e-İrsaliye are sent via integrators authorised by the tax administration. When choosing a provider, verify that its module supports your Odoo version.

How do you keep an Odoo server secure?

The most critical Odoo security steps are changing the master password to a strong value, closing the database manager to the internet, making Odoo ports listen only locally and enforcing two-factor authentication on user accounts. The master password grants the right to create, delete and restore databases from backup; losing it means losing all your ERP data.

  1. Master password: Set admin_passwd in odoo.conf to a long, random password; Odoo stores this value hashed in the file.
  2. Database manager: Hide the database list with list_db = False and in Nginx allow access to the /web/database paths only from your own IP address.
  3. Ports: Keep 8069 and the gevent port closed externally; Odoo should listen only on 127.0.0.1.
  4. Users: Give everyone only the app access rights they need; enable two-factor authentication for all users.
  5. SSH: Disable password login and install Fail2ban against brute-force attempts.
  6. Updates: Regularly apply the fixes for your Odoo version branch and operating system security updates.

At network level, the RouteFence firewall in the LIONFIN infrastructure filters DDoS attacks, and 24/7 SOC monitoring tracks security events. See our data center for details.

How do you back up Odoo and upgrade versions?

An Odoo backup has two parts: the PostgreSQL database and the filestore folder, which holds attachments and images. Backing up only the database is the most common mistake; after a restore, invoice attachments, product images and documents are lost. By default the filestore is in the Odoo user’s home directory, in a subfolder with the same name as the database.

  • Daily backup: Take a compressed database dump with pg_dump -Fc, sync the filestore folder with rsync, and store both with the same timestamp.
  • Off-site copy: Keep a copy of the backups somewhere outside the server; the 3-2-1 backup rule applies to ERP data too.
  • Snapshot: Take a server snapshot before major updates.

A major version upgrade (for example from 18 to 19) is not done by just changing the code; the database schema must also be migrated. Enterprise users use Odoo’s upgrade service, while Community users use community tools such as OpenUpgrade. Always test the upgrade on a copy of the database; if you neutralise the copy with the odoo-bin neutralize command, which disables outgoing email and scheduled actions, the test system will not email real customers.

What are the most common problems on an Odoo server?

The most common problems on Odoo servers are wrong worker and memory limits, missing websocket routing, the wrong wkhtmltopdf version and scheduled actions that do not run. You can trace problems in the Odoo log file (the path set with the logfile option) and in journalctl output.

  • Large reports stop halfway: The worker has hit the limit_time_real or limit_memory_hard limit. Look for the log line showing the worker was terminated and raise the limits in a balanced way.
  • Chat and notifications do not arrive: /websocket requests are not routed to the gevent port, or the Upgrade headers are not passed.
  • PDFs are unformatted or missing headers: The recommended wkhtmltopdf version is not installed, or the web.base.url system parameter is wrong.
  • Scheduled actions do not run: max_cron_threads is zero, or the jobs were disabled because of an error; check Settings → Technical → Scheduled Actions.
  • Slowness increases in the mornings: There are too few workers for the concurrent users; redo the worker calculation and increase VDS resources if needed.
  • 127.0.0.1 shows instead of the real IP: proxy_mode is off, or Nginx is not sending the X-Forwarded-For header.

When you need more resources, you can upgrade your VDS from the customer panel.

How do you set up an Odoo server?

  1. 1

    Choose a VDS plan

    Pick a VDS from the package table based on your concurrent user count and install Ubuntu 24.04 LTS.

  2. 2

    Prepare the server

    Apply updates, enable SSH key login and leave only ports 22, 80 and 443 open in the firewall.

  3. 3

    Install PostgreSQL

    Install PostgreSQL, create a non-superuser database user for Odoo and adjust the memory settings.

  4. 4

    Install Odoo

    Install the relevant version branch from the official package repository or Git, then add the Python dependencies and wkhtmltopdf.

  5. 5

    Configure odoo.conf

    Calculate worker, memory and time limits, set proxy_mode, list_db and a strong master password, and create a systemd service.

  6. 6

    Enable Nginx and HTTPS

    Set up Nginx as a reverse proxy, route /websocket requests to the gevent port and obtain a Let’s Encrypt certificate.

  7. 7

    Plan backups

    Set up a daily backup job for the database and filestore and run a test restore.

FAQ

Frequently asked questions about Odoo Hosting

Because Odoo needs components such as PostgreSQL, Python, wkhtmltopdf and Nginx, it requires a virtual or dedicated server with full root access; it does not run on shared hosting. For an ERP used all day, a VDS with dedicated cores delivers predictable performance for reporting and accounting work.

According to the calculation in the Odoo documentation, a worker uses a weighted average of about 320 MB, so nine workers need about 3 GB. PostgreSQL and operating system headroom come on top. 4–8 GB for up to ten users and 8–16 GB for up to 30 users are realistic starting values.

Odoo’s recommended rule is that the worker count should not exceed (number of cores × 2) + 1. One worker serves about six concurrent users; for 50 concurrent users, for example, you need about eight HTTP workers and one cron worker. Memory limits should be calculated together with the worker count.

No. Odoo works only with PostgreSQL; there is no MySQL or MariaDB support. Odoo 19 requires PostgreSQL 13 or newer. Choosing a more recent PostgreSQL version for a new installation reduces the need to upgrade the database as well during future Odoo version upgrades.

Odoo Community is open source and can be used without licence fees; you pay only for the server and, if needed, installation, development and support services. The Enterprise edition includes extra apps and requires a per-user subscription. Both editions can run on your own server.

Yes, through localisation and provider modules. In Türkiye, for example, e-Fatura, e-Arşiv and e-İrsaliye are sent via Odoo modules from integrators authorised by the tax administration. When choosing a provider, make sure its module supports the Odoo major version you use and that updates are published regularly.

A complete Odoo backup consists of a PostgreSQL database dump and the filestore folder. The filestore contains invoice attachments, product images and documents, and cannot be recovered from the database backup alone. Take both at the same time and store them together, and keep your custom module code in a Git repository.

Yes. Odoo has an official Docker image and can be installed with PostgreSQL using Docker Compose. Docker makes switching versions and spinning up test environments easier, but worker, memory, Nginx and backup settings still need the same care. Remember to define persistent volumes for the filestore and database; see Docker hosting.