Odoo 19 Community
Overview
Odoo is an open-source business application suite. It provides an integrated ERP, CRM, eCommerce, accounting, inventory, project management and HR platform in a single Apache 2.0 licensed package. This SecureAnyCloud image delivers Odoo 19 Community Edition on Ubuntu 24.04 on Azure, with PostgreSQL and PDF reporting already set up and a unique master password generated for each virtual machine.
Version 19 introduces an updated UI framework, improved accounting localisation, an enhanced eCommerce engine and a faster ORM. The Community Edition includes over 50 business modules at no per-user licensing cost, which makes it a good starting point for small to medium businesses and for developers building custom business applications.
No database is pre-created in the shipped image. On every fresh virtual machine, odoo-firstboot.service generates a strong random master password unique to that machine and injects it into /etc/odoo/odoo.conf. It then restarts Odoo and writes the credentials to /root/odoo-credentials.txt and /stage/scripts/odoo-credentials.log.
No two virtual machines ever share a master password, and no password is baked into the image at any point. You create your first Odoo database through the web interface at /web/database/manager, using the generated master password.
What you get:
- Odoo 19.0 Community Edition, installed from the official Odoo nightly APT repository at nightly.odoo.com.
- PostgreSQL 16 database backend, installed as a dependency and bound to localhost only (
127.0.0.1:5432). - wkhtmltopdf for PDF report generation (invoices, purchase orders, delivery notes).
- Node.js for Odoo asset compilation.
- Ubuntu 24.04 LTS (Noble Numbat) with the latest security patches applied at build time.
- Azure Linux Agent (waagent) for cloud-init, SSH key provisioning and disk management.
- ufw firewall with ports 8069 and 8072 open. All other ports are restricted by default.
odoo-firstboot.service, a systemd unit that rotates the master password on every first boot.
Prerequisites
- An active Azure subscription with permission to create virtual machines.
- An SSH key pair (Ed25519 or RSA 4096 recommended).
- A network security group (NSG) rule that allows inbound TCP on port 8069 (and 8072 for long-polling) from your trusted IP range.
- A terminal with the Azure CLI installed, for the CLI deployment steps.
Deploy the Virtual Machine from the Azure Portal
- In the Azure Marketplace, search for Odoo 19 CE on Ubuntu 24.04 LTS by SecureAnyCloud.
- Click Create and select your subscription and resource group.
- Choose a region. The image is available globally.
- Select a VM size. Standard_D4s_v3 (4 vCPU, 16 GB RAM) is recommended for small teams. Use Standard_D8s_v3 or larger for multi-user production workloads.
- Under Administrator account, select SSH public key and provide your public key.
- Under Inbound port rules, open port 22 (SSH). After deployment, add NSG rules for ports 8069 and 8072, scoped to your trusted source IP range rather than
0.0.0.0/0. - On the Disks tab, select Standard SSD or better for the OS disk.
- Choose Review + create. The VM is ready within two to three minutes.
Deploy the Virtual Machine from the Azure CLI
# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:odoo-19-community-ubuntu-24-04:standard:latest
az vm create \
--subscription "<sub-id>" \
--resource-group "<rg>" \
--name odoo-19-vm \
--image sac1647283583153:odoo-19-community-ubuntu-24-04:standard:latest \
--size Standard_D4s_v3 \
--storage-sku StandardSSD_LRS \
--admin-username azureuser \
--ssh-key-values ~/.ssh/id_ed25519.pub \
--public-ip-sku Standard \
--output tableAfter the VM is created, add NSG rules that permit inbound TCP on ports 8069 and 8072 from your source IP:
az network nsg rule create \
--resource-group "<rg>" \
--nsg-name odoo-19-vmNSG \
--name allow-odoo \
--priority 310 \
--protocol Tcp \
--destination-port-ranges 8069 8072 \
--source-address-prefixes "<your-ip>/32" \
--access AllowConnect via SSH
ssh azureuser@<vm-ip>Substitute the public IP address assigned to your virtual machine. The default user is azureuser.
Retrieve the Master Password
odoo-firstboot.service runs automatically on first boot and generates a unique master password for your virtual machine. Retrieve it with:
sudo cat /root/odoo-credentials.txtExample output:
Odoo Master Password: aB3kPqRwXm7nYvZc2sD9tFgH To create your first database: 1. Navigate to http://<YOUR-IP>:8069/web/database/manager 2. Enter the master password above and create your first database 3. Log in to Odoo with your chosen admin credentialsThe machine-readable form is at /stage/scripts/odoo-credentials.log (mode 600, root only):
sudo cat /stage/scripts/odoo-credentials.logVerify the Odoo Service
Confirm that Odoo and PostgreSQL are running and that port 8069 is listening. Start with the service status:
systemctl status odooss -tlnp | grep -E '8069|8072|5432'Check the Odoo version:
odoo --versionVerify the health endpoint returns HTTP 200:
curl -s -o /dev/null -w "%{http_code}\n" http://localhost:8069/web/healthThe expected output is 200.
Access the Web Interface and Create Your First Database
- Open
http://<your-vm-ip>:8069/web/database/managerin a browser. - Click Create database.
- Enter the Master Password you retrieved in Step 4.
- Choose a Database Name (for example,
mycompany). - Select your Language and Country.
- Optionally, tick Demo data for a sandbox environment. Leave it unchecked for production.
- Set the Email and Password for the initial
adminaccount. - Click Create database and wait approximately 60 to 90 seconds while Odoo initialises the schema.
When the database is created, Odoo redirects you to the login page. Sign in with the admin email and password you chose during database creation.
Install and Configure Business Modules
After you sign in, you land on the Odoo home screen.
- Click Apps in the top navigation bar to open the app store.
- Remove the Apps filter in the search bar to see all available modules.
- Search for the modules your business requires and click Install.
Common starting modules:
- Sales: quotations, sales orders, invoicing.
- Inventory: warehouse, stock moves, delivery orders.
- Accounting: chart of accounts, journals, bank reconciliation.
- CRM: leads, pipeline, customer portal.
- Project: tasks, timesheets, Gantt view.
- Purchase: purchase orders, vendor bills.
- eCommerce: online shop tied to Inventory and Accounting.
After installing modules, open Settings to configure your company name, logo, currency and fiscal year.
Configure Outgoing Email
Odoo sends transactional emails (order confirmations, invoices, password resets) through a configured SMTP server. Set one up alongside your other company settings.
- Go to Settings > Technical > Email > Outgoing Mail Servers.
- Click Create and enter your SMTP host, port, authentication method and credentials.
- Click Test Connection to verify the settings before you save.
For production deployments, use a dedicated transactional email provider (SendGrid, Mailgun, Amazon SES) rather than a personal Gmail account. This avoids rate limiting and deliverability issues.
Server Components
Component Version Notes
Odoo Community 19.0-20260423 Installed from nightly.odoo.com/19.0/nightly/deb
PostgreSQL 16 localhost only (127.0.0.1:5432)
Python 3.12 Ubuntu 24.04 system Python
Node.js 18+ Required for Odoo asset compilation
wkhtmltopdf 0.12.6 Ubuntu 24.04 patched build for PDF reports
Ubuntu 24.04 LTS (Noble Numbat) Kernel 6.8
Azure Linux Agent 2.9+ waagent: cloud-init, disk and SSH key management
Check the currently running Odoo version:
odoo --versionOdoo Server 19.0-20260423Filesystem Layout
Path Purpose
/usr/bin/odoo Odoo server binary
/etc/odoo/odoo.conf Main configuration file (mode 640, root:odoo)
/var/lib/odoo Odoo data directory (filestore, sessions, addons)
/var/log/odoo/odoo-server.log Odoo server log
/usr/lib/python3/dist-packages/odoo/ Odoo Python package
/usr/lib/python3/dist-packages/odoo/addons/ Built-in Odoo modules
/stage/scripts/odoo-credentials.log Machine-readable master password (mode 600, root)
/root/odoo-credentials.txt Human-readable master password and first-use instructions
/usr/local/sbin/odoo-firstboot.sh First-boot credential generation script
/etc/systemd/system/odoo-firstboot.service Systemd unit for first-boot initialisation
/var/lib/sac/data/odoo-firstboot.done Sentinel file; presence prevents firstboot re-running
/var/run/postgresql/ PostgreSQL runtime socket directory
Managing the Odoo Service
Check service status:
systemctl status odooStop the service:
sudo systemctl stop odooStart the service:
sudo systemctl start odooRestart the service (for example, after editing odoo.conf):
sudo systemctl restart odooTail the Odoo log in real time:
sudo tail -n 50 /var/log/odoo/odoo-server.logBackups
Web UI backup (recommended for most users)
Odoo provides a built-in database backup tool at /web/database/manager:
- Open
http://<your-vm-ip>:8069/web/database/manager. - Enter the master password when prompted.
- Click Backup next to your database name.
- Select a format: zip (includes the filestore, recommended) or pg_dump (schema and data only).
- Download the archive and store it in a secure off-site location.
PostgreSQL dump (for scripted or scheduled backups)
pg_dump -U odoo -F c -f /home/azureuser/odoo-backup-$(date +%Y%m%d).dump <your-db-name>Transfer the dump to Azure Blob Storage or another durable destination.
Back up Odoo's filestore at /var/lib/odoo/.local/share/Odoo/filestore/<db-name>/ alongside the database dump to preserve uploaded attachments.
Automate with a cron job
# Example: nightly backup at 02:00, keep 7 days 0 2 * * * azureuser pg_dump -U odoo -F c -f /home/azureuser/odoo-backup-$(date +\%Y\%m\%d).dump mycompany && find /home/azureuser -name 'odoo-backup-*.dump' -mtime +7 -deleteHTTPS with a Reverse Proxy
Running Odoo directly on port 8069 over plain HTTP is acceptable for internal tools, but do not use it for internet-facing deployments. Instead, use nginx as a reverse proxy with a TLS certificate from Let's Encrypt.
Install nginx and certbot:
sudo apt-get install -y nginx certbot python3-certbot-nginxCreate an nginx virtual host at /etc/nginx/sites-available/odoo:
upstream odoo { server 127.0.0.1:8069; } upstream odoo-longpolling { server 127.0.0.1:8072; } server { listen 80; server_name your-domain.example.com; location /longpolling { proxy_pass http://odoo-longpolling; } location / { proxy_pass http://odoo; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_read_timeout 720s; client_max_body_size 50m; } }Enable the site and obtain a certificate:
sudo ln -s /etc/nginx/sites-available/odoo /etc/nginx/sites-enabled/odoo
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d your-domain.example.comAfter enabling the proxy, set proxy_mode = True in /etc/odoo/odoo.conf and restart Odoo. This makes Odoo trust the X-Forwarded-For header:
sudo sed -i 's/proxy_mode = False/proxy_mode = True/' /etc/odoo/odoo.conf
sudo systemctl restart odooTroubleshooting
Odoo does not respond on port 8069
Check whether the service is running:
systemctl is-active odooIf inactive, check the log for startup errors:
sudo tail -50 /var/log/odoo/odoo-server.logCheck whether PostgreSQL is running and accepting connections:
systemctl is-active postgresql
sudo -u postgres psql -c "SELECT version();"/web/database/manager is inaccessible or returns an error
Check that the admin password in odoo.conf has been replaced with a generated value:
sudo grep admin_passwd /etc/odoo/odoo.confIf the value is PLACEHOLDER_MASTER_PASSWORD, the first-boot service did not run. Check whether the sentinel file exists:
ls -la /var/lib/sac/data/odoo-firstboot.doneIf the file is absent, the service did not complete. Read its journal:
sudo journalctl -u odoo-firstboot --no-pagerTo run it again, remove the sentinel and start the service manually:
sudo rm -f /var/lib/sac/data/odoo-firstboot.done
sudo systemctl start odoo-firstboot
sudo cat /root/odoo-credentials.txtPort 8069 is not reachable from the browser
In the Azure portal, verify that the NSG rule permits inbound TCP on port 8069 from your source IP. Then confirm that ufw allows the port locally:
sudo ufw status | grep 8069PDF reports are blank or produce errors
Verify that wkhtmltopdf is installed and is the version Odoo expects:
wkhtmltopdf --versionOdoo uses the wkhtmltopdf binary at /usr/bin/wkhtmltopdf. The version in the Ubuntu 24.04 repositories is the patched headless build that is compatible with Odoo.
Odoo is slow on the first request after idle
With workers = 2 in odoo.conf, workers are pre-forked but may sleep. The first request after an idle period can be slow because of Python module loading.
For production, consider increasing the number of workers to match the available CPU cores.
Security Recommendations
Restrict database manager access
After you create your database, restrict the database manager to localhost to prevent unauthorised database creation or deletion:
sudo sed -i '/^\[options\]/a dbfilter = ^mycompany$' /etc/odoo/odoo.conf
sudo systemctl restart odooAlternatively, add list_db = False to disable the database list entirely once your database is created:
echo "list_db = False" | sudo tee -a /etc/odoo/odoo.conf
sudo systemctl restart odooRotate the master password
The master password is regenerated automatically at every first boot, so every VM starts with a unique credential. To rotate it manually at any time, run:
NEW_PW=$(openssl rand -base64 24 | tr -d '+/=\n' | head -c 32)
sudo sed -i "s|^admin_passwd = .*|admin_passwd = ${NEW_PW}|" /etc/odoo/odoo.conf echo "New master password: ${NEW_PW}"
sudo systemctl restart odooEnable two-factor authentication
Go to Settings > Users and Companies > Users, select a user, and enable Two-Factor Authentication in the account security section.
Restrict NSG rules
Limit inbound access to ports 8069 and 8072 to your office or VPN IP ranges rather than the public internet. PostgreSQL on port 5432 is bound to localhost and is not exposed through the NSG.
Keep packages up to date
Apply security patches regularly with:
sudo apt-get update && sudo apt-get upgrade -y odoo
sudo systemctl restart odooSupport and Licensing
Odoo 19 Community Edition is licensed under the Apache License 2.0. The full licence text is available at www.apache.org/licenses/LICENSE-2.0.
SecureAnyCloud provides 24/7/365 expert technical support, with a guaranteed 24-hour response for all requests and a one-hour average response time for critical issues. Contact sales@secureanycloud.com.
For the full user guide, visit secureanycloud.com/guides/odoo-19-community-on-ubuntu-24-04-azure. For the complete product catalogue, visit secureanycloud.com/products.
Deploy on Azure
The SecureAnyCloud Odoo 19 Community Edition image is available on the Azure Marketplace. Search for Odoo 19 CE on Ubuntu 24.04 LTS by SecureAnyCloud, or open it directly from the Azure Portal.
Need Help?
- Email: sales@secureanycloud.com
- Website: secureanycloud.com
- Azure Marketplace: search for SecureAnyCloud to view the full catalogue of production-ready images.
Deploy on Azure
Launch Odoo 19 Community on Ubuntu 24.04 on Azure, with 24/7 support from SecureAnyCloud.
View this image
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com
Deploy the SecureAnyCloud Odoo 19 Community Edition AMI on AWS, retrieve your automatically generated credentials, open the Odoo web interface and set up HTTPS with Let's Encrypt.
Prerequisites
- An AWS account with EC2 access.
- The Odoo 19 Community AMI, launched (t3.medium or larger recommended; m5.large for production).
- A security group with inbound TCP 22, 80, 443 and 8069 open.
- Your instance's public IP address or DNS hostname.
Connecting to your instance
OS variant SSH login user
Ubuntu 24.04 ubuntu
ssh -i /path/to/your-key.pem ubuntu@<instance-public-ip>Checking Odoo is running
After launch, cloud-init runs the first-boot service, which initialises the database and rotates credentials. Wait approximately two minutes, then verify that all services are active:
sudo systemctl status odoo.service postgresql.service nginx.serviceExpected output:
● odoo.service - Odoo Open Source ERP and CRM Active: active (running) since Wed 2026-05-27 19:55:18 UTC; 28s ago Main PID: 9231 (/usr/bin/python3 /usr/bin/odoo) ● postgresql.service - PostgreSQL RDBMS Active: active (exited) since Wed 2026-05-27 19:47:44 UTC; 7min ago ● nginx.service - A high performance web server and a reverse proxy server Active: active (running) since Wed 2026-05-27 19:55:18 UTC; 28s agoCheck which ports are listening:
ss -tlnp | grep -E ':80|:8069'LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=9235,fd=5)) LISTEN 0 16 0.0.0.0:8069 0.0.0.0:* users:(("odoo",pid=9231,fd=6))Verify the Odoo version:
odoo --versionOdoo Server 19.0-20260527Retrieving your credentials
On first boot, a one-shot service generates unique credentials for your instance and writes them to a root-only file. Read it with:
sudo cat /root/odoo-credentials.txt# Odoo 19 Community - generated on first boot by odoo-firstboot.service
# These credentials are unique to this VM. Store them somewhere safe. odoo.url=http://172.31.90.207/ odoo.database=sac odoo.admin.email=admin@example.com odoo.admin.user=admin odoo.admin.pass=<ODOO_ADMIN_PASSWORD> odoo.master.pass=<master-password>
# To access Odoo, browse to http://<this-vm-public-ip>/ and sign in to the
# database 'sac' as 'admin' with the password above.Note the odoo.admin.pass value. You use it to sign in to the web interface.
Accessing the Odoo web interface
Browse to your instance's public IP address:
http://<instance-public-ip>/Odoo redirects to the login page automatically:
Sign in with:
- Email / Username: admin
- Password: the odoo.admin.pass value from /root/odoo-credentials.txt
- Database: SecureAnyCloud (pre-selected)
After you sign in, you reach the Odoo application launcher.
Installing modules
The image ships with the Odoo base framework and web modules. Install business modules from the Apps catalogue:
- Click the grid icon in the top-left corner and select Apps.
- Browse or search for the module you want (Sales, CRM, Accounting, Inventory and so on).
- Click Activate to install it.
The most commonly used modules are:
- Sales: quotations and invoices.
- CRM: customer relationships and pipeline.
- Invoicing: billing and payments.
- Inventory: stock management and warehousing.
- Purchase: purchase orders and vendor management.
- Project: task and project management.
- Employees: HR and payroll.
Disk layout
The instance has two dedicated EBS gp3 data volumes in addition to the OS root disk:
Mount point Purpose Default size
/var/lib/postgresql PostgreSQL 16 database data 20 GiB
/var/lib/odoo Odoo filestore, sessions, attachments 20 GiB
Verify the layout:
lsblk -o NAME,SIZE,MOUNTPOINTNAME SIZE MOUNTPOINT nvme0n1 8G ├─nvme0n1p1 7G / nvme1n1 20G /var/lib/postgresql nvme2n1 20G /var/lib/odooYou can resize either data volume independently in the AWS console, without touching the OS disk.
Useful management commands
Check the Odoo service log:
sudo tail -f /var/log/odoo/odoo-server.logRestart Odoo after a configuration change:
sudo systemctl restart odoo.serviceAccess the PostgreSQL database directly:
sudo -u postgres psql -d sacEnabling HTTPS with Let's Encrypt
To serve Odoo over HTTPS with a trusted certificate, you need a domain name that resolves to your instance's public IP address.
Install Certbot:
sudo apt-get update && sudo apt-get install -y certbot python3-certbot-nginxObtain a certificate (replace your-domain.example.com with your actual domain):
sudo certbot --nginx -d your-domain.example.comCertbot automatically updates the nginx configuration to serve port 443 and redirect HTTP to HTTPS. After you obtain the certificate, restart nginx:
sudo systemctl restart nginx.serviceCertbot installs a systemd timer that renews the certificate automatically before it expires.
Firewall and security groups
To enable HTTPS traffic, add an inbound rule to your EC2 security group that allows TCP 443 from 0.0.0.0/0.
Port 8069 provides direct access to the Odoo application server if you need it. Once nginx is handling public traffic, you can restrict that port to your own IP.
Screenshots
Terminal showing Odoo 19 version and systemctl status for odoo, postgresql and nginx services all active and running.
The Odoo 19 sign-in page served on port 80 via nginx, ready immediately on first boot.
The Odoo 19 main application dashboard showing the module launcher for CRM, Sales, Accounting, Inventory and more.
Support
SecureAnyCloud provides this image with 24/7 technical support. For help with Odoo deployment, module configuration, upgrades, customisations, performance tuning or PostgreSQL administration, contact support at secureanycloud.com.
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com