Розгортання системи Odoo за допомогою Docker

Як встановити Odoo для робочого середовища за допомогою Docker

Підготовка сервера

Розглянемо процес підготовки сервера на Ubuntu 22.04 Server для розгортання робочого середовища системи Odoo версії 16.0. Всі налаштування ми проводимо на чистому, щойно створеному сервері.

Налаштування SSH доступу

Виконайте команду у терміналі для встановлення пакета openssh:

sudo apt-get install openssh-server

Далі внесіть зміни у налаштування SSH з метою підвищення безпеки:

sudo nano /etc/ssh/sshd_config
  • змінюємо номер порту зі стандартного 22 на інший у діапазоні від 1000 та вище:

Port 22
  • забороняємо підключення до ssh-сервера використовуючи логін суперкористувача:

PermitRootLogin no
  • забороняємо підключення до ssh-сервера використовуючи паролі (буде дозволено лише по ключах), для цього розкоментуйте цей рядок:

PasswordAuthentication no
  • дозволяємо підключення по ssh лише певним користувачам (додати рядок у самий низ файлу):

AllowUsers user1 user2
  • дозволяємо SSH підключення тільки з певних IP адрес:

AllowUsers = *@123.123.123.123
# Allow access only for IP 123.123.123.123

Генеруємо пару SSH ключів на локальній машині:

ssh-keygen -t rsa -b 4096

Додаємо відкриті ключі для доступу без вводу пароля:

  • На локальній машині, копіюємо ключ у буфер обміну

cat ~/.ssh/id_rsa.pub
odoo ssh public key
  • На сервері, вставляємо з буфера обміну та зберігаємо файл

nano ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys
ssh authorized keys

Після внесення змін перезавантажуємо сервіс SSH командою

sudo /etc/init.d/ssh reload

Відкриваємо новий термінал (не закриваючи поточний) та пробуємо під'єднатися до сервера по SSH. Якщо під'єднатися не вдалося, перевіряємо все ще раз і вносимо необхідні зміни через перший термінал.

Встановлення та налаштування Docker

Виконайте наступні команди для отримання оновлень системи:

sudo apt-get update
sudo apt-get upgrade -y

Наступні команди встановлять docker у вашій системі:

sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
UBUNTU_RLS=$(lsb_release -rs)
if [[ ${UBUNTU_RLS:0:2} -le 21 ]] ; then
   curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
   sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
else
   curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
   echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
fi
sudo apt update
apt-cache policy docker-ce
sudo apt install -y docker-ce docker-compose

Перевіряємо статус встановлення docker:

sudo systemctl status docker

Додаємо поточного користувача у групу docker:

sudo usermod -aG docker $(whoami)

Створимо каталог для docker контейнерів Odoo:

sudo mkdir /opt/docker
sudo chown -R $(whoami): /opt/docker

Створимо структуру каталогів під окремий проєкт, дамо йому назву, наприклад, "test":

mkdir /opt/docker/test
mkdir /opt/docker/test/config
mkdir /opt/docker/test/addons
mkdir /opt/docker/test/addons/custom
mkdir /opt/docker/test/backups
mkdir /opt/docker/test/build
mkdir /opt/docker/test/logs
mkdir /opt/docker/test/geoip

Далі створимо конфігураційний файл для Odoo "odoo.conf":

nano /opt/docker/test/config/odoo.conf

Додамо наступний текст у файл:

[options]
admin_passwd = MASTER_PASS
xmlrpc_port = 8069
db_user = odoo
db_password = odoo
addons_path=
dbfilter = ^%d$
list_db = True
log_db_level = warning
log_handler = :INFO
log_level = debug_rpc
logfile = /mnt/logs/odoo-server.log
logrotate = False
limit_time_cpu = 120
limit_time_real = 180
limit_time_real_cron = 0
max_cron_threads = 2
proxy_mode = True
workers = 3

Генерація надійного майстер-пароля "MASTER_PASS" може бути виконана наступним чином:

python3 -c 'import base64, os; print(base64.b64encode(os.urandom(72)))'

Вставте згенерований пароль у конфігураційний файл у параметр admin_passwd.

Створення конфігураційного файлу "docker-compose"

Тепер створимо конфігураційний файл "docker-compose.yml" командою:

nano /opt/docker/test/docker-compose.yml

Додамо наступний текст у файл:

version: "2"
services:
  web:
    build: ./build
    depends_on:
      - db
    restart: unless-stopped
    ports:
      - "127.0.0.1:18069:8069"
      - "127.0.0.1:18072:8072"
    volumes:
      - odoo-web-data:/var/lib/odoo
      - ./config:/etc/odoo
      - ./addons:/mnt/extra-addons
      - ./backups:/mnt/backups
      - ./logs:/mnt/logs
      - ./geoip:/usr/share/GeoIP/
    # command: -u all -d test
    networks:
      - test
  db:
    image: postgres:12
    restart: unless-stopped
    command: postgres -c "max_connections=300"
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_PASSWORD=odoo
      - POSTGRES_USER=odoo
      - PGDATA=/var/lib/postgresql/data/pgdata
    volumes:
      - odoo-db-data:/var/lib/postgresql/data/pgdata
    logging:
      options:
        max-size: 50m
    networks:
      - test
volumes:
  odoo-web-data:
  odoo-db-data:
networks:
   test:

Створення конфігураційного файлу "Dockerfile"

Спочатку перегляньте ідентифікатор вашого поточного користувача Linux, наступним чином:

sudo grep "^$(whoami):" /etc/passwd | cut -f 3 -d:

Аналогічним чином отримаємо ідентифікатор групи користувача:

sudo grep "^$(whoami):" /etc/passwd | cut -f 4 -d:

Додамо файл для створення Odoo контейнера:

nano /opt/docker/test/build/Dockerfile

Вставимо наступний текст у файл Dockerfile:

FROM odoo:16.0
USER root
RUN usermod -u 1000 odoo
RUN groupmod -g 1000 odoo
RUN mkdir /var/lib/odoo/.local
RUN chown -R 1000:1000 /var/lib/odoo
RUN pip3 install --upgrade pip
# Adding additional python libraries is as follows:
# Python dependency for installing the "auto_backup" module
RUN pip3 install paramiko
# After adding a new line, the container needs to be rebuilt with the command: docker-compose down && docker-compose up -d –-build
USER odoo

Спробуємо запустити контейнер:

cd /opt/docker/test
docker-compose up -d

Почнеться процес завантаження образів та створення контейнера для поточного проєкту. Після завершення цих процесів, docker контейнер буде запущено. Ви можете переглядати лог Odoo використовуючи наступну команду:

tail -f /opt/docker/test/logs/odoo-server.log

Якщо створення контейнера відбулося успішно, зупиніть контейнер командою:

docker-compose down

Налаштування NGINX та Certbot

Дії до початку налаштувань

Перед налаштуванням NGINX конфігурації, потрібно створити домен для системи Odoo, візьмем, як зразок таку назву домену: test.domain.com

Зайдіть у панель керування доменами реєстратора вашого доменного імені та додайте новий запис з типом A для домену (піддомену) і зазначте IP адресу сервера:

odoo docker domain ip address

Встановлення NGINX

Для встановлення NGINX виконайте команду:

sudo apt-get install -y nginx

Встановлення Certbot

Встановлення Certbot виконуємо наступними командами:

sudo apt install snapd -y
sudo snap install certbot --classic

Наступні кроки будуть включати:

  • створення конфігурації NGINX для отримання SSL сертифікату для домену;

  • внесення змін у конфігурацію необхідних для запуску системи Odoo з прив'язкою до доменного імені.

Створення конфігураційного файлу NGINX

Створимо конфігураційний файл NGINX для домену "test.domain.com":

sudo nano /etc/nginx/sites-available/test.domain.com.conf

Спочатку додамо у нього наступний текст, щоб отримати сертифікат SSL:

server {
   listen [::]:80;
   listen 80;
   server_name test.domain.com www.test.domain.com;
 }

Активуємо дану конфігурацію, для цього створимо "сім-лінк" - посилання на файл у каталог "/etc/nginx/sites-enabled":

sudo ln -s /etc/nginx/sites-available/test.domain.com.conf /etc/nginx/sites-enabled/test.domain.com.conf

Протестуємо, що конфігурація коректна:

sudo nginx -t

Перезавантажимо сервіс NGINX, якщо помилок немає:

sudo nginx -s reload

Отримання SSL сертифікату

Далі отримаємо сертифікат для нашого домену "test.domain.com" наступною командою:

sudo certbot -m "admin@domain.com" -d "test.domain.com" --non-interactive --agree-tos --nginx certonly

Результат:

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for test.domain.com

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/test.domain.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/test.domain.com/privkey.pem
This certificate expires on 2023-09-24.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Змінимо налаштування NGINX конфігурації для використання з системою Odoo:

sudo nano /etc/nginx/sites-available/test.domain.com.conf

Використаємо наступні дані у разі якщо ми встановлюємо Odoo версії 16 або вище:

map $http_upgrade $connection_upgrade {
  default upgrade;
  ''      close;
}
#odoo server
upstream odoo_test {
   server 127.0.0.1:18069;
}
upstream odoochat_test {
   server 127.0.0.1:18072;
}

server {
   listen [::]:80;
   listen 80;
   server_name test.domain.com www.test.domain.com;
   return 301 https://test.domain.com;
 }

server {
   listen [::]:443 ssl;
   listen 443 ssl;

   server_name www.test.domain.com;

   ssl_certificate /etc/letsencrypt/live/test.domain.com/fullchain.pem;
   ssl_certificate_key /etc/letsencrypt/live/test.domain.com/privkey.pem;

   return 301 https://test.domain.com;
}

server {
   listen [::]:443 ssl http2;
   listen 443 ssl http2;

   server_name test.domain.com;

   ssl_certificate /etc/letsencrypt/live/test.domain.com/fullchain.pem;
   ssl_certificate_key /etc/letsencrypt/live/test.domain.com/privkey.pem;

   # log
   access_log /var/log/nginx/test.domain.com.access.log;
   error_log /var/log/nginx/test.domain.com.error.log;

   proxy_read_timeout 720s;
   proxy_connect_timeout 720s;
   proxy_send_timeout 720s;

   # Redirect longpoll requests to odoo websocket port
   location /websocket {
      proxy_pass http://odoochat_test;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection $connection_upgrade;
      proxy_set_header X-Forwarded-Host $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header X-Real-IP $remote_addr;
   }

   # Redirect requests to odoo backend server
   location / {
      # Add Headers for odoo proxy mode
      proxy_set_header X-Forwarded-Host $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_redirect off;
      proxy_pass http://odoo_test;
      client_max_body_size 512M;
   }

   location ~* /web/static/ {
      proxy_cache_valid 200 90m;
      proxy_buffering on;
      expires 864000;
      proxy_pass http://odoo_test;
   }

   location ~* /web/database/manager {
      allow 123.123.123.123;
      deny all;
      proxy_pass http://odoo_test;
   }

   location ~* /web/database/selector {
      allow 123.123.123.123;
      deny all;
      proxy_pass http://odoo_test;
   }

   # common gzip
   gzip_types text/css text/scss text/plain text/xml application/xml application/json application/javascript;
   gzip on;
}

Дані для версії Odoo 15 або нижче:

#odoo server
upstream odoo_test {
   server 127.0.0.1:18069;
}
upstream odoochat_test {
   server 127.0.0.1:18072;
}

server {
   listen [::]:80;
   listen 80;
   server_name test.domain.com www.test.domain.com;
   return 301 https://test.domain.com;
 }

server {
   listen [::]:443 ssl;
   listen 443 ssl;

   server_name www.test.domain.com;

   ssl_certificate /etc/letsencrypt/live/test.domain.com/fullchain.pem;
   ssl_certificate_key /etc/letsencrypt/live/test.domain.com/privkey.pem;

   return 301 https://test.domain.com;
}

server {
   listen [::]:443 ssl http2;
   listen 443 ssl http2;

   server_name test.domain.com;

   ssl_certificate /etc/letsencrypt/live/test.domain.com/fullchain.pem;
   ssl_certificate_key /etc/letsencrypt/live/test.domain.com/privkey.pem;

   # log
   access_log /var/log/nginx/test.domain.com.access.log;
   error_log /var/log/nginx/test.domain.com.error.log;

   proxy_read_timeout 720s;
   proxy_connect_timeout 720s;
   proxy_send_timeout 720s;

   # Add Headers for odoo proxy mode
   proxy_set_header X-Forwarded-Host $host;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_set_header X-Forwarded-Proto $scheme;
   proxy_set_header X-Real-IP $remote_addr;

   # Redirect longpoll requests to odoo longpolling port
   location /longpolling {
      proxy_pass http://odoochat_test;
   }

   # Redirect requests to odoo backend server
   location / {
      proxy_redirect off;
      proxy_pass http://odoo_test;
      client_max_body_size 512M;
   }

   location ~* /web/static/ {
      proxy_cache_valid 200 90m;
      proxy_buffering on;
      expires 864000;
      proxy_pass http://odoo_test;
   }

   location ~* /web/database/manager {
      # allow 121.121.121.121;
      # deny all;
      proxy_pass http://odoo_test;
   }

   location ~* /web/database/selector {
      # allow 121.121.121.121;
      # deny all;
      proxy_pass http://odoo_test;
   }

   # common gzip
   gzip_types text/css text/scss text/plain text/xml application/xml application/json application/javascript;
   gzip on;
}

Протестуємо, що конфігурація коректна та перезавантажимо сервіс NGINX, якщо помилок немає:

sudo nginx -t && sudo nginx -s reload

Додавання сторонніх модулів

Для підключення сторонніх модулів перейдіть у каталог "addons" та клонуйте необхідний репозиторій:

cd /opt/docker/test/addons

Для зразка, скопіюємо стандартні теми Odoo для вебсайту наступною командою:

git clone -b 16.0 --single-branch --depth=1 https://github.com/odoo/design-themes

Модулі з темами будуть додані у каталог /opt/docker/test/addons/design-themes, далі потрібно додати цей шлях до конфігураційного файлу Odoo до параметра "addons_path" у наступному вигляді:

nano /opt/docker/test/config/odoo.conf

Додамо шлях до модулів:

addons_path=/mnt/extra-addons/design-themes

Перезавантажимо docker контейнер командами:

cd /opt/docker/test && docker-compose down && docker-compose up -d

Таким саме шляхом додамо інші потрібні нам репозиторії та модулі, наприклад, модуль для резервного копіювання:

cd /opt/docker/test/addons && git clone -b 16.0 --single-branch --depth=1 https://github.com/Yenthe666/auto_backup.git

Додамо шлях до модулів у конфігураційний файл:

addons_path=/mnt/extra-addons/design-themes
    ,/mnt/extra-addons/auto_backup

Створення бази даних

Після підключення додаткових модулів, відкрийте у браузері доменне ім'я проєкту https://test.domain.com

Якщо попередні кроки було успішно виконано, вас буде перенаправлено на сторінку створення нової бази.

odoo docker new database create

Щоб створити базу даних, заповніть поля:

  • Master Password - пароль з конфігураційного файлу Odoo (параметр "admin_passwd").

  • Database Name - обов'язково повинно збігатися з назвою проєкту, в нашому випадку це "test".

  • Email - e-mail адреса або логін адміністратора системи.

  • Password - пароль адміністратора, бажано використовувати складні, довгі паролі. Для генерації складного пароля довжиною 50 символів можна скористатися командою: pwgen -N 1 -s 50 -y

  • Language - основна мова, що буде активована при створенні бази даних.

  • Country - країна, що буде обрана для створеної компанії у системі.

  • Demo data - цю опцію необхідно активувати тільки у разі, якщо ви створюєте базу даних для демонстраційних цілей. Зазвичай для робочих систем цей параметр не активують.

odoo docker new database parameters

Після заповнення всіх необхідних полів, натисніть на "Create database".

Налаштування резервного копіювання

Для автоматичного резервного копіювання бази даних ми використовуємо рішення від Yenthe666 з репозиторію https://github.com/Yenthe666/auto_backup.git

Під'єднайте репозиторій, як розглянуто у розділі Додавання сторонніх модулів, після чого перейдіть у систему та активуйте режим розробника , щоб виконати наступні дії.

odoo docker auto backup

Встановить модуль Database auto-backup / auto_backup і перейдіть у меню Settings - Technical - Back-ups - Configure back-ups.

odoo docker configure backups

Створить нову конфігурацію, натиснувши на "New". Залиште всі значення, що були додані за замовчуванням, окрім параметра Backup Directory, йому потрібно задати наступне значення: /mnt/backups

odoo docker backup path

Наступним кроком активуємо фонове завдання "Backup scheduler" у меню Settings - Technical - Automation - Scheduled Actions.

odoo docker backup cron

Також зазначте час, коли повинно відбуватися резервне копіювання бази даних. За замовчуванням копіювання відбувається одного разу на добу.

odoo docker backup cron run

Для перевірки коректності налаштувань натисніть на "Run Manually". Копія бази даних буде створена та збережена у каталозі /opt/docker/test/backups

в Odoo
2217 23.08.2023
Розгортання системи Odoo за допомогою Docker
Юрій Разумовський

Підприємець, Odoo консультант, учасник спільноти Odoo Україна, член ассоціації OCA, офіційний партнер Odoo (Learning Partner).

Розгортання системи Odoo за допомогою Docker
Yurii Razumovskyi 23 серпня, 2023
Поділитися цією публікацією
День народження Odoo
Дізнайтеся, коли вийшов перший офіційний реліз Odoo