Install and use Odoo on Ubuntu for business management
Odoo brings customer relationships, quotations, sales orders, purchasing, inventory, invoicing and reporting into one browser-based ERP. Installing Odoo on Ubuntu gives a business a controlled server that can run on an office computer, a local mini PC or a cloud virtual machine, while employees continue working through Chrome, Firefox or Edge.
Odoo Community provides a practical foundation for CRM, stock control, purchases and basic invoicing. Odoo Enterprise includes additional accounting, studio and business-intelligence features. The available applications depend on the selected edition, so decide which one the organisation needs before configuring the system.
A small Australian team will normally need at least four CPU cores, 8 GB of RAM and reliable SSD storage. The database and uploaded files must remain separate from temporary Docker storage, and the database needs regular off-site backups. This guide installs both components on Ubuntu, connects them through a private Docker network and prepares Odoo for Australian business operations.
Choose the right Odoo edition and deployment
Docker is the most straightforward option for many small businesses because it keeps Odoo, PostgreSQL and their dependencies isolated from the rest of Ubuntu. The containers start automatically after a reboot, while named volumes preserve the database and Odoo filestore. Updates can also be controlled by changing the image version.
A native installation is another possibility, but it requires careful management of Python dependencies, PostgreSQL, system libraries and the Odoo source tree. It suits administrators who already maintain Python applications or have internal deployment standards that prohibit containers. For a first Ubuntu deployment, Docker usually creates fewer dependency conflicts.
Plan the installation around the company’s existing infrastructure rather than only the initial server. A business with staff working from different locations may place Odoo on a local server connected to an NBN connection, or use a reputable Australian cloud provider. Whichever option is chosen, document how users will connect, where backups will be stored and who will be responsible for applying security updates.
Prepare Ubuntu for the Odoo server
Ubuntu Server 24.04 LTS is a suitable base for a new installation. Ubuntu Desktop also works if the machine must provide a local graphical interface, although a headless server consumes fewer resources. Begin by updating the operating system and installing Docker:
sudo apt update
sudo apt full-upgrade -y
sudo apt install -y docker.io openssl
sudo systemctl enable --now docker
sudo usermod -aG docker "$USER"
Log out and back in so the new group membership takes effect. The newgrp docker command can start a shell with the required permissions, although opening a fresh login is more predictable. Confirm the installation with docker --version, then run docker run --rm hello-world to check that Docker can download and execute an image.
Create a dedicated operating-system user for administration if the server will be shared with other tasks. Keep SSH access restricted to known addresses where possible, and make sure password-based remote login is disabled after key-based access has been tested. The Odoo web service can remain bound to the Ubuntu server’s local interface during setup, preventing direct exposure to the public internet.
Start Odoo with persistent services
The PostgreSQL database and Odoo application should use separate Docker volumes. Create a protected environment file containing randomly generated passwords:
mkdir -p "$HOME/odoo"
cd "$HOME/odoo"
umask 077
DB_PASSWORD=$(openssl rand -hex 24)
ADMIN_PASSWORD=$(openssl rand -hex 16)
printf 'POSTGRES_USER=odoo\nPOSTGRES_PASSWORD=%s\nPOSTGRES_DB=odoo\nUSER=odoo\nPASSWORD=%s\nADMIN_PASS=%s\n' \
"$DB_PASSWORD" "$DB_PASSWORD" "$ADMIN_PASSWORD" > odoo.env
The restrictive file mode means only the owning user can read the credentials. Store the environment file securely, but do not send it through email or include it in a public repository. Now create the private network, PostgreSQL container and Odoo container:
docker network create odoo-net
docker run -d --name odoo-db --restart unless-stopped \
--network odoo-net \
--env-file "$HOME/odoo/odoo.env" \
-v odoo-db:/var/lib/postgresql/data \
postgres:16
docker run -d --name odoo --restart unless-stopped \
--network odoo-net \
-p 127.0.0.1:8069:8069 \
--env-file "$HOME/odoo/odoo.env" \
-v odoo-data:/var/lib/odoo \
odoo:latest
Check both containers with docker ps and inspect startup messages with docker logs --tail 50 odoo. Open http://localhost:8069 in a browser on the Ubuntu machine. Use the master password stored as ADMIN_PASS in odoo.env, create the first database and enter a strong administrator password that differs from every database credential.
The initial database setup should use English and the relevant Australian localisation. After confirming that the correct applications are installed, replace odoo:latest with a specific supported Odoo release for production. Pinning a tested version prevents an automatic image change from introducing an unexpected upgrade during a busy trading period.
Configure Odoo for an Australian business
In company settings, enter the registered business name, Australian Business Number if applicable, postal address, support contacts and bank details. Set the main currency to Australian dollars and choose the correct Australian time zone. Individual users can then adjust their own time zones; this is useful when a coordinator in Perth needs a clear deadline for a colleague in Sydney.
Install and configure the Australian accounting localisation if it is not already enabled. Establish the fiscal year, chart of accounts, bank accounts and opening balances before processing live transactions. Review the standard GST rate of 10 percent, but do not apply it indiscriminately to every invoice. GST-free sales, input-taxed purchases, exempt items and mixed supplies can require different treatment, so an Australian tax adviser should confirm the configuration.
GST reporting, invoice numbering and payment terms should reflect the company’s accounting process. Test a taxable sale, a GST-free sale and a purchase before going live, then compare the totals with the expected journal entries. Payroll deserves a separate validation exercise because award classifications, superannuation and Single Touch Payroll reporting may require an Australian-aware module or provider alongside review by a payroll specialist.
Use Odoo for everyday business management
A typical customer workflow begins with a lead in CRM. The salesperson converts it into a quotation, obtains approval and creates a sales order. Odoo can then generate a delivery, reduce the stock level, produce the invoice and record the customer payment. Australian customers can receive accurate tax, ABN and business details on each document without duplicate data entry.
Purchasing follows a similar path. Record the supplier, raise a purchase order, receive the goods into the chosen warehouse location and enter the supplier bill. Three-way matching can compare the order, delivery and bill before payment is approved. For products bought or sold in units such as boxes, cartons or kilograms, define the relevant units of measure carefully so stock reports remain understandable.
Inventory requires accurate products, customers, suppliers, tax categories and warehouse locations. Add serial numbers or lot tracking only where the business needs it, since these features add work to every stock movement. Review dashboards for overdue bills, unpaid invoices, low-stock products and orders awaiting delivery, but test every operational report before using it for a purchasing decision.
Create role-based accounts for sales, warehouse staff, finance employees and managers. Ordinary users should not receive administrative access merely because they need the daily interface. A practical access review can reveal employees who can see records outside their branch or supplier, particularly when staff work across multiple locations.
Secure access, protect data and maintain Ubuntu
Keep the Odoo port bound to 127.0.0.1 until HTTPS is configured. For personal administration, an SSH tunnel can provide direct access without publishing port 8069:
ssh -L 8069:127.0.0.1:8069 ubuntu@server-address
The local browser then connects through http://localhost:8069. For a team, place Odoo behind an Nginx or Caddy reverse proxy with a domain and a valid TLS certificate. Administrators who need a graphical server console can follow the remote Ubuntu desktop guide for xrdp and Remmina, while limiting that access to trusted administrators.
Create scheduled backups of both the PostgreSQL database and the Odoo filestore, which contains attachments such as invoices and product images. A basic backup can be produced with:
STAMP=$(date +%Y%m%d-%H%M)
docker exec odoo-db pg_dump -U odoo -d odoo -Fc > "$HOME/odoo-db-$STAMP.dump"
docker run --rm -v odoo-data:/data:ro -v "$HOME":/backup \
alpine tar czf "/backup/odoo-filestore-$STAMP.tar.gz" -C /data .
Copy encrypted backups to storage outside the Ubuntu host and test a restoration periodically. Monitor free disk space, container restarts and the growth of the database and filestore. Apply Ubuntu security updates on a planned schedule, and review Odoo upgrades separately because application modules may require migration steps.
Run a controlled first business cycle
Use a clean test database or an isolated test company so imported sample records do not distort reporting. Load the real chart of accounts, product catalogue, customer and supplier details, tax settings, warehouse locations and opening stock. Limit the trial group to employees who can confirm which business rules matter, such as approval limits, delivery methods and invoice numbering.
Run one transaction through the complete lifecycle. A purchase order can become a received delivery, a supplier bill and a payment, while a quotation can become a confirmed order, delivery, customer invoice and receipt. Compare stock movements, customer balances, supplier balances and tax totals with the source documents. Fix any duplicate products, missing tax codes or approval problems while the test data can still be removed safely.
Repeat the trial with a second user account and a non-administrator role to verify that permissions work as intended. Record the restore procedure, hostname, image versions and owner of each maintenance task, then schedule the first database backup before live trading begins. The next concrete step is to enter one genuine sales order, one supplier bill and its matching stock movement in the test company, then reconcile the customer, purchase and inventory reports.