Підготовка сервера
Розглянемо процес підготовки сервера на 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
На сервері, вставляємо з буфера обміну та зберігаємо файл
nano ~/.ssh/authorized_keys && chmod 600 ~/.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:
1000
Аналогічним чином отримаємо ідентифікатор групи користувача:
sudo grep "^$(whoami):" /etc/passwd | cut -f 4 -d:
1000
Додамо файл для створення 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 адресу сервера:
test
.
Встановлення 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
Якщо попередні кроки було успішно виконано, вас буде перенаправлено на сторінку створення нової бази.
Щоб створити базу даних, заповніть поля:
Master Password - пароль з конфігураційного файлу Odoo (параметр "admin_passwd").
Database Name - обов'язково повинно збігатися з назвою проєкту, в нашому випадку це "test".
Email - e-mail адреса або логін адміністратора системи.
Password - пароль адміністратора, бажано використовувати складні, довгі паролі. Для генерації складного пароля довжиною 50 символів можна скористатися командою:
pwgen -N 1 -s 50 -y
Language - основна мова, що буде активована при створенні бази даних.
Country - країна, що буде обрана для створеної компанії у системі.
Demo data - цю опцію необхідно активувати тільки у разі, якщо ви створюєте базу даних для демонстраційних цілей. Зазвичай для робочих систем цей параметр не активують.
Після заповнення всіх необхідних полів, натисніть на "Create database".
Налаштування резервного копіювання
Для автоматичного резервного копіювання бази даних ми використовуємо рішення від Yenthe666 з репозиторію https://github.com/Yenthe666/auto_backup.git
Під'єднайте репозиторій, як розглянуто у розділі Додавання сторонніх модулів, після чого перейдіть у систему та активуйте режим розробника , щоб виконати наступні дії.
Встановить модуль Database auto-backup / auto_backup
і перейдіть у меню Settings - Technical - Back-ups - Configure back-ups.
Створить нову конфігурацію, натиснувши на "New". Залиште всі значення, що були додані за замовчуванням, окрім параметра Backup Directory, йому потрібно задати наступне значення: /mnt/backups
Наступним кроком активуємо фонове завдання "Backup scheduler" у меню Settings - Technical - Automation - Scheduled Actions.
Також зазначте час, коли повинно відбуватися резервне копіювання бази даних. За замовчуванням копіювання відбувається одного разу на добу.
Для перевірки коректності налаштувань натисніть на "Run Manually". Копія бази даних буде створена та збережена у каталозі /opt/docker/test/backups