Skip to content
Cloudj

VPS use cases

Odoo VPS for Vietnamese businesses: sizing and setup guide

Run Odoo on a VPS for a Vietnamese business: Cloudj has no servers in Vietnam, so choose Singapore, Hong Kong or Tokyo, then size workers, PostgreSQL and Nginx.

Updated · 5 min read

An Odoo VPS is the middle path between Odoo's own hosted service and buying a physical server for the office. You keep full control of modules, data and upgrades, and you pay for a server sized to your company rather than per feature. This guide is written for Vietnamese businesses and the partners who implement Odoo for them: where to place the server, how to size it from user counts, and how to configure workers, PostgreSQL and a reverse proxy.

Be aware before you start: Cloudj does not have servers in Vietnam. The nearest Cloudj locations for a Vietnamese team are Singapore, Hong Kong and Tokyo. For the wider picture of Asian locations, see the Asia VPS guide.

Decide the location first: Singapore, Hong Kong or Tokyo

Odoo is an interactive application. Staff click through sales orders, inventory moves and invoices all day, so the round trip between their browser and the server matters more than raw bandwidth. A server outside Vietnam adds network distance compared with a host inside the country, so measure before you commit.

Use this quick decision path:

  1. Does a policy, regulation or customer contract require data to stay in Vietnam? Then a Cloudj server is not the right fit; you need an in-country host. Ask your legal adviser how the rules apply to your data.
  2. Do you have offices or warehouses across Southeast Asia, or a regional head office in Singapore? Singapore is a neutral regional hub. See the best VPS in Singapore guide.
  3. Are most users in northern Vietnam, or do you also work with partners in Hong Kong, Taiwan or southern China? Hong Kong is worth testing. See the best VPS in Hong Kong guide.
  4. Do you also have staff or customers in Japan or Korea? Tokyo can serve both sides. See the best VPS in Japan guide.

Not sure? Deploy a small test server in two or three of these locations on hourly billing. Ask staff in each office to run ping and mtr to each server from their usual network (the ping and mtr guide explains how), and to use a demo database for a day. Keep the one that measures and feels better. Delete the others afterwards, because hourly servers are billed until they are deleted, even when stopped. The Singapore vs Hong Kong vs Tokyo comparison covers the trade-offs in more depth.

Size your Odoo VPS from users, not from a plan name

Odoo's documentation gives practical rules for production deployments, which are a good starting point:

  • Workers: about (number of CPU cores x 2) + 1 HTTP workers.
  • Users per worker: roughly 6 concurrent users per worker.
  • Memory: plan around 150 MB for a light worker and up to 1 GB for a heavy one (large reports, imports). A typical estimate assumes most requests are light.

Here is how that translates into starting sizes, including PostgreSQL on the same server:

Concurrent usersvCPURAMWorkers
Up to 1024 GB3 to 4
10 to 3048 GB6 to 9
30 to 60816 GB12 to 17

"Concurrent" means people actively working at the same moment, not total accounts. A company with 80 employees on Odoo often has far fewer concurrent users. For steady daytime load, general purpose or dedicated CPU gives more predictable response times than shared CPU. You can resize CPU and RAM from the console when usage grows; plan the change outside office hours.

Disk: leave room for the database, the filestore (attachments, product images, scanned invoices) and local backups. Growing the disk later is possible, but starting with comfortable headroom avoids an emergency.

Install Odoo with PostgreSQL

On Ubuntu, the official Odoo packages are the cleanest route for a single server. Replace 18.0 with the version you use.

sudo apt update && sudo apt install -y postgresql
wget -q -O - https://nightly.odoo.com/odoo.key | sudo gpg --dearmor -o /usr/share/keyrings/odoo-archive-keyring.gpg
echo 'deb [signed-by=/usr/share/keyrings/odoo-archive-keyring.gpg] https://nightly.odoo.com/18.0/nightly/deb/ ./' | sudo tee /etc/apt/sources.list.d/odoo.list
sudo apt update && sudo apt install -y odoo

The package creates an odoo system user, a PostgreSQL role, and the config file /etc/odoo/odoo.conf. Install Vietnamese language support and the Vietnam localization from the Apps menu once the database exists.

Configure workers and limits

Edit /etc/odoo/odoo.conf for a 4 vCPU, 8 GB server:

[options]
admin_passwd = a-long-random-master-password
proxy_mode = True
workers = 8
max_cron_threads = 1
limit_memory_soft = 671088640
limit_memory_hard = 1073741824
limit_time_cpu = 600
limit_time_real = 1200
list_db = False

Eight HTTP workers plus one cron thread follows the (cores x 2) + 1 rule. proxy_mode tells Odoo it sits behind a reverse proxy. list_db = False hides the database manager from the public. Restart with sudo systemctl restart odoo.

PostgreSQL basics

Keep PostgreSQL on the same server for small and medium deployments; it removes a network hop. Tune shared_buffers to about a quarter of RAM and keep PostgreSQL listening on localhost only. The PostgreSQL on a VPS guide covers tuning and access in more depth.

Put Nginx in front

Never expose Odoo's port 8069 directly. Nginx terminates HTTPS, compresses responses and forwards real-time traffic (chat, notifications) to the separate port Odoo uses for it, 8072 by default.

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

server {
    listen 443 ssl http2;
    server_name erp.example.vn;
    # ssl_certificate lines added by certbot
    client_max_body_size 100m;
    proxy_read_timeout 720s;

    location /websocket {
        proxy_pass http://odoochat;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        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 Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        gzip on;
    }
}

Get a certificate with Certbot and redirect port 80 to 443. The full pattern is in the Nginx reverse proxy and SSL guide. Then close every port except 22, 80 and 443 with a firewall.

Back up the database and the filestore

An Odoo backup has two parts: the PostgreSQL database and the filestore directory. One without the other is incomplete.

DB=company
FILESTORE=/var/lib/odoo/.local/share/Odoo/filestore   # check data_dir in odoo.conf
pg_dump -U odoo -Fc $DB > /backup/$DB-$(date +%F).dump
tar czf /backup/$DB-filestore-$(date +%F).tar.gz -C $FILESTORE $DB

Run it nightly with cron, copy the files to a second location (for example, a small server in another region), and test a restore on a staging server every few months. The VPS backup strategy explains retention.

When not to self-host

If nobody in the company or at your implementation partner can patch Linux, renew certificates and test restores, a fully managed Odoo service may be the safer choice. A VPS gives control, and control comes with these duties.

FAQ

How many users can a 4 vCPU Odoo VPS handle?

The rule of thumb gives about 9 workers, which on paper covers around 50 concurrent users. In practice, with PostgreSQL on the same server and some heavy reports, plan for 10 to 30 as in the table above, then measure and adjust.

Should PostgreSQL run on the same server as Odoo?

For most small and medium companies, yes. Separate it only when the database needs its own resources or you run several Odoo instances.

Does Cloudj have an Odoo VPS in Vietnam?

No. Cloudj has no servers in Vietnam. The nearest locations are Singapore, Hong Kong and Tokyo; test two or three of them on hourly billing and keep the one that works best for your staff. If data must stay in Vietnam, use an in-country host.

Can I pay in VND?

You top up a USD account balance, and Vietnamese customers can top up by bank transfer in VND.

Deploy your Odoo server

Measure from your offices, pick Singapore, Hong Kong or Tokyo, deploy a server in the Cloudj console, and size it from your concurrent users. Live prices are on the pricing page.

Deploy a server or order proxies

Pick a location in the console, see the live price, and pay from your balance.