This guide covers all the necessary steps required to migrate Odoo from one server to another (Ubuntu).
Odoo Migration
The example below assumes that you are migrating a live version from the production server to a development server.
NOTE: The production instance is consistently named. For example, Odoo 11 instance will be named odoo11-live (linux user, /opt directory, configuration file, systemctl file, filestore, DB name, DB user).
We will migrate the Odoo 11 instance named odoo11-live to a development server, where the name will be odoo11-dev. You should change the version number depending on the Odoo version that you're migrating.
Backup Your Odoo Instance
The steps in this section should be executed on the production server (where an active Odoo instance is running) as the root user.
Stop Odoo:
[email protected]:~# service odoo11-live stop
Ensure Odoo is not running
[email protected]:~# ps awxf | grep odo
4458 pts/1 S+ 0:00 \_ grep --color=auto odo
Backup the Database
Confirm the name of the database to backup:
[email protected]:~# grep db_name /etc/odoo11-live.conf
db_name = odoo11-live
Now, check if the database exists in PostgreSQL.
Switch to the user postgresql and enter PostgreSQL shell:
[email protected]:~# su - postgres
[email protected]:~$ psql
psql (9.5.12)
Type "help" for help.
List all the databases and confirm that the odoo11-live database exists in the Name column:
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-------------+-------------+----------+-------------+-------------+-----------------------
acuto | acuto | UTF8 | en_US.UTF-8 | en_US.UTF-8 | acuto=CTc/acuto
odoo11-live | odoo11-live | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
odoo11live | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =Tc/postgres +
||||| postgres=CTc/postgres+
||||| odoo11=CTc/postgres
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
||||| postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
||||| postgres=CTc/postgres
(7 rows)
Leave the PostgreSQL shell:
postgres=# \q
Backup the database into a file and logout from the postgresql user.
[email protected]:~$ pg_dump -O odoo11-live | gzip > 20201010-odoo11-live.sql.gz
[email protected]:~$ logout
Note: The -O (or --no-owner) parameter will make sure that there is no owner on the dumped database.
Note: put the today's timestamp at the beginning of a filename.
Move the database backup file to /root
[email protected]:~# mv /var/lib/postgresql/20201010-odoo11-live.sql.gz .
Note: change postgresql to pgsql if you encounter an error.
Backup the Odoo Application
Go to the /opt directory and create an archive from the Odoo application directory (odoo11-live)
[email protected]:~# cd /opt
[email protected]:/opt# tar czf /root/20180430-odoo11-live.tar.gz odoo11-live
Check if Odoo Instance Has a Virtual Environment for Python
[email protected]:~# cat /etc/systemd/system/odoo-live.service | grep Exec
ExecStart=/opt/odoo11-live/odoo11-venv/bin/python3 /opt/odoo11-live/server/odoo-bin -co /etc/odoo11-live.conf
The first path after ExecStart is the Python executable path. If there is venv in the path, then Odoo is using a virtual environment and you don't need to do anything.
If an Odoo Instance doesn't have a virtual environment, the path will look similar to this: /usr/bin/python3. If that's the case, proceed to the next step. Otherwise ignore it.
Get a List of Installed Python Packages
This step is only necessary if your Odoo Instance does not have its own virtual environment for Python.
Save a list of installed python packages on the system into a requirements.txt file and put it in the /root directory.
[email protected]:~# pip3 freeze > /root/requirements.txt
Start Odoo Again
[email protected]:~# service odoo11-live start
Migrating the Odoo Instance
The steps from this section should be executed on the development server (where a development Odoo instance should be running) as the root user.
NOTE: The development instance is consistently named. For example, Odoo 11 instance will be named odoo11-dev (linux user, /opt directory, configuration file, systemctl file, filestore, DB name, DB user, Apache).
Get the Odoo Backups from the Production Server
[email protected]:~# cd /opt
[email protected]:/opt# scp [email protected]:20201010* .
20201010-odoo11-live.sql.gz
20201010-odoo11-live.tar.gz
Note: change host to the hostname (or IP address) of your production server. Change 20201010 to your actual timestamp.
Copy the config file and rename it to odoo11-dev.conf
[email protected]:/opt# scp [email protected]:/etc/odoo11-live.conf /etc/odoo11-dev.conf
Extract the Odoo Application Directory & Rename It
[email protected]:/opt# tar xf 20201010-odoo11-live.tar.gz
[email protected]:/opt# mv odoo11-live odoo11-dev
Note: change 20201010 to your actual timestamp.
Rename the Odoo filestore
The Odoo filestore must match the name of the Odoo database.
[email protected]:/opt# cd odoo11-dev/.local/share/Odoo/filestore/
[email protected]:/opt/odoo11-dev/.local/share/Odoo/filestore# mv odoo11-live odoo11-dev
[email protected]:/opt/odoo11-dev/.local/share/Odoo/filestore# cd /opt
Create the Log Directory
[email protected]:/opt# mkdir /var/log/odoo11-dev
Create a Linux User for Odoo
Create a linux user named odoo11-dev and make it the owner of the application directory and the log file.
[email protected]:/opt# adduser odoo11-dev --home /opt/odoo11-dev
[email protected]:/opt# chown -R odoo11-dev:odoo11-dev odoo11-dev
[email protected]:/opt# chown odoo11-dev:odoo11-dev /var/log/odoo11-dev
Install PostgreSQL
[email protected]:/opt# apt update
[email protected]:/opt# apt upgrade
[email protected]:/opt# apt install postgresql -y
Create the database user odoo11-dev and the database odoo11-dev.
[email protected]:/opt# su - postgres
[email protected]:~$ createuser -d odoo11-dev
[email protected]:~$ logout
[email protected]:/opt# su - odoo11-dev
[email protected]:~$ createdb odoo11-dev
Import the production Odoo database into the odoo11-dev database
[email protected]:~$ gunzip -c /opt/20201010-odoo11-live.sql.gz | psql odoo11-dev
[email protected]:~$ logout
Install System Packages
[email protected]:/opt# sudo apt-get install python3 python3-pip python3-suds wget git bzr gdebi-core libxml2-dev libxslt1-dev zlib1g-dev libsasl2-dev libldap2-dev libssl-dev -y
Install additional node packages:
[email protected]:/opt# sudo apt-get install node-clean-css node-less git -y
Install Python 3.6
The default Python version will not work with Odoo 13. We need to install the 3.6 version, along with all the needed tools.
Add a remote repository with Python 3.6
[email protected]:/opt# sudo add-apt-repository ppa:deadsnakes/ppa
Install Python 3.6
[email protected]:/opt# sudo apt install python3.6 python3.6-dev python3.6-venv
If your production Odoo instance did not have a virtual environment, proceed to the next step. Otherwise ignore it.
Create a Virtual Environment and Install Python Packages
Create a virtual environment in the odoo11-dev directory.
[email protected]:/opt# cd /opt/odoo11-dev && python3 -m venv odoo11-venv
Activate the virtual environment:
[email protected]:/opt# source odoo13-venv/bin/activate
Copy the requirements.txt file from the production server.
(odoo11-venv) [email protected]:/opt# scp [email protected]:requirements.txt .
The library and module details are stored in the requirements.txt file. Use it to install all of the modules at once:
(odoo11-venv) [email protected]:/opt# pip3 install -r requirements.txt
Deactivate the virtual environment:
(odoo11-venv) [email protected]:/opt# deactivate
Install wkhtmltopdf
Download the package
[email protected]:/opt# sudo wget https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.5/wkhtmltox_0.12.5-1.bionic_amd64.deb
Additional packages are required for Wkhtmltopdf to run. Install them with the following commands:
[email protected]:/opt# sudo apt-get install libjpeg-turbo8 libjpeg-turbo8 libxrender1 xfonts-75dpi xfonts-base -y
[email protected]:/opt# sudo apt-get install fontconfig
Note: there may be an error during this step. It's normal. The next command will fix it.
[email protected]:/opt# sudo apt-get install -f
Install the package:
[email protected]:/opt# sudo dpkg -i wkhtmltox_0.12.5-1.bionic_amd64.deb
Edit the Configuration File
Change all instances of the odoo11-live string to odoo11-dev in the configuration file.
[email protected]:/opt# cat /etc/odoo11-dev.conf | sed 's/odoo11-live/odoo11-dev/g' > /etc/odoo11-dev.conf
The configuration file will look similar to this:
Sample
[options]
admin_passwd = snip
db_host = localhost
db_port = 5432
db_user = odoo11-dev
db_password = odoo
db_name = odoo11-dev
addons_path = /opt/odoo11-dev/server/addons,/opt/odoo11-dev/custom_addons
logfile = /var/log/odoo11-dev/odoo11-dev.log
xmlrpc_port = 8089
data_dir = /opt/odoo11-dev/.local/share/Odoo/
Note: make sure that the db_user, db_name, logfile, data_dir, and addons_path correspond to the correct names and paths (especially addons!)
Create a Systemctl Service File
Copy the systemctl service file from the production server:
[email protected]:~# scp [email protected]:/etc/systemd/system/odoo11-live.service .
Change all instances of the odoo11-live string to odoo11-dev in the systemd service file, then put the file in the correct directory.
[email protected]:~# cat odoo11-live.service | sed 's/odoo11-live/odoo11-dev/g' > odoo11-dev.service
[email protected]:~# mv odoo11-dev.service /etc/systemd/system/
The file should look like this:
[Unit]
Description=odoo11-dev
After=odoo11-dev.target
[Service]
Type=simple
SyslogIdentifier=odoo11-dev
PermissionsStartOnly=true
User=odoo11-dev
Group=odoo11-dev
ExecStart=/opt/odoo11-dev/odoo11-venv/bin/python3 /opt/odoo11-dev/server/odoo-bin -c /etc/odoo11-dev.conf
StandardOutput=journal+console
[Install]
WantedBy=multi-user.target
Note: make sure that the User, Group are set to odoo11-dev.
Note: Make sure that ExecStart has the correct parameters (python path, Odoo executable, and config)
Execute Odoo and Monitor the Log
[email protected]:~# su - odoo11-dev
[email protected]:~$ /opt/odoo11-dev/odoo11-venv/bin/python3 /opt/odoo11-dev/server/odoo-bin -c /etc/odoo11-dev.conf
If all is well, stop the process and logout from the odoo11-dev user.
[email protected]:~$ logout
Start Odoo With Systemctl
[email protected]:~# systemctl daemon-reload
[email protected]:~# service odoo11-dev start
[email protected]:~# service odoo11-dev status
* odoo11-dev.service - odoo11-dev
Loaded: loaded (/etc/systemd/system/odoo11-dev.service; disabled; vendor preset: enabled)
Active: active (running) since Mon 2018-04-30 10:36:49 UTC; 3s ago
<snip>
If all is well, enable the Odoo service so that it starts at system boot:
[email protected]:/etc/systemd/system# systemctl enable odoo11-dev.service
Created symlink from /etc/systemd/system/multi-user.target.wants/odoo11-dev.service to /lib/systemd/system/odoo11-dev.service.
Install Apache
[email protected]:~# apt install apache2 -y
[email protected]:~# a2enmod proxy_http
[email protected]:~# a2enmod ssl
[email protected]:~# a2enmod rewrite
Enable proxy-http and ssl
[email protected]:~# a2enmod proxy_http
[email protected]:~# a2enmod ssl
[email protected]:~# a2enmod rewrite
Prepare LetsEncrypt for SSL
[email protected]:~# apt install software-properties-common -y
[email protected]:~# add-apt-repository ppa:certbot/certbot
[email protected]:~# apt update
[email protected]:~# apt install python-certbot-apache -y
[email protected]:~# certbot --apache certonly
Note: Provide customer's email address - domain owner
Apache Virtual Host Configuration
Create the site in /etc/apache2/sites-available/odoo11-dev.conf
[email protected]:~# nano /etc/apache2/sites-available/odoo11-dev.conf
Paste the following configuration into the file.
Note that the configuration was created for outsourceitsupport.com. Search and replace all instances of outsourceitsupport.com with whatever hostname is being used for the migrated Odoo instance.
<VirtualHost *:80>
DocumentRoot /var/www/html
ServerName outsourceitsupport.com
RewriteEngine on
RewriteCond %{SERVER_NAME} =outsourceitsupport.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
ErrorLog ${APACHE_LOG_DIR}/outsourceitsupport.com.error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/outsourceitsupport.com.access.log combined
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost *:443>
DocumentRoot /var/www/html
ServerName outsourceitsupport.com
ProxyPass / http://localhost:8089/ retry=0
ProxyPassReverse / http://localhost:8089/ retry=0
SSLCertificateFile /etc/letsencrypt/live/outsourceitsupport.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/outsourceitsupport.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
ErrorLog ${APACHE_LOG_DIR}/outsourceitsupport.com-ssl.error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/outsourceitsupport.com-ssl.access.log combined
</VirtualHost>
</IfModule>
Enable the Configuration File and Reload Apache
[email protected]:/etc/apache2/sites-available# ln -s /etc/apache2/sites-available/odoo11-dev.conf /etc/apache2/sites-enabled/
[email protected]:/etc/apache2/sites-available# service apache2 reload