Odoo service тохируулах (NGINX, Apache, LetsEncrypt (acme.sh), systemd)

Дусал нэвтэрхий толь-с

Ерөнхий тайлбар

Odoo сервис продакшн орчинд тохируулахдаа Nginx юмуу Apache сервер proxy ашиглан, мөн төлбөргүй SSL тохируулах талаар. Энэ зааврын хувьд Ubuntu үйлдлийн системд зориулсан ба бусад Линкус системд зарим зүйл нь өөр байж магадгүй юм. Nginx, Apache 2 серверийн аль нэгийг нь сонгон суулгасан байгаа байх. Тиймээс тохиргоон дээр аль нэгийг нь сонгож хийгээд нөгөөг нь алгасаж тохируулаарай.

SSL тохируулах

Энэ удаад бид Let's Encrypt free SSL-ийн acme.sh shell script-ээр тохиргоо хийнэ. Project on github: https://github.com/acmesh-official/get.acme.sh (certbot гээд өргөн ашиглагддаг python багажаар тохиргоо хийж бас болно)

Аль аль нь нээлттэй эхийн хэрэгсэл ба зөвхөн online серверт тохируулах боломжтой.

Төлбөртэй SSL худалдан авч тохируулах тохиолдолд прокси серверийн тохиргоо дээрээ замыг зааж өгөхөд л болох тул доорхыг алгасахад болно.

Төлбөргүй SSL нь 90 хоногийн хугацаатай ба бид автомтаар сунгагдаж явахаар тохируулна. Ингэхийн тулд сервер баталгаажуулалтын тохиргоог эхлээд зөв хийж өгөх шаардлагатай. DNS зэрэг өөр олон тохируулах арга байдаг ч энэ удаад хамгийн хялбар, өргөн ашиглагддаг вэб серверийн тохиргооны дагуу тохируулна. Доорх Nginx, Apache2 аль нэгийг сонгон тохируулаарай.

Nginx сервер дэх тохиргоо

   /etc/nginx/conf-available/acme-challenge.conf 

Доорх агуулгыг хийж хадгална:

location ^~ /.well-known/acme-challenge/ {
    default_type "text/plain";
    root         /var/www/html;
    break;
}
location = /.well-known/acme-challenge/ {
    return 404;
}

Доорх тушаалаар идэвхжүүлнэ:

ln -s /etc/nginx/conf-available/acme-challenge.conf /etc/nginx/conf-enabled/acme-challenge.conf

эсвэл

Apache сервер дэх тохиргоо

Доорх файлыг үүсгэн:

   /etc/apache2/conf-available/acme-challenge.conf 

Доорх агуулгыг хийж хадгална:

Alias /.well-known/acme-challenge/ /var/www/html/.well-known/acme-challenge/
<Directory "/var/www/html/.well-known/acme-challenge/">
    Options None
    AllowOverride None
    ForceType text/plain
    RedirectMatch 404 "^(?!/\.well-known/acme-challenge/[\w-]{43}$)"
</Directory>

Доорх тушаалаар идэвхжүүлнэ:

a2enconf acme-challenge

Ингээд acme.sh-ээ суулгана:

acme.sh Install from git

1. Прожектыг хуулбарлан аваад доорх байдлаар ажиллуулна:

git clone https://github.com/acmesh-official/acme.sh.git
cd ./acme.sh
./acme.sh --install -m my@example.com

Дээрхийг суулгахдаа root эрхээр ажиллуулахгүй байх нь дээр.

Ингээд суулгахад доорх 3 үйлдлийг суулгагч хийдэг:

1. acme.sh хэрэглэгчийн home dir ($HOME) дотор дараах хавтсыг үүсгэдэг: ~/.acme.sh/. Цаашид үүсгэх сертификатууд энэ хавтсанд байршина. 2. Дараах байдлаар тушаалын alias үүсгэдэг: acme.sh=~/.acme.sh/acme.sh. 3. Cron job доорх байдлаар үүсгэдэг:

0 0 * * * "/home/user/.acme.sh"/acme.sh --cron --home "/home/user/.acme.sh" > /dev/null

crontab -l тушаалаар шалгана. Ямар нэгэн байдлаар үүсээгүй тохиолдолд crontab -e гэж байгаад дээрх байдлаар гараар тохируулж өгч болно. Гараар үүсгэх тохиолдолд /home/user/ гэсний оронд өөрийн home хавтсаа тохируулна.

Мөн зөв ажилаж байгаа эсэхийг дараах байдлаар ажиллуулж мэдээлэл харж шалгаж болно:

root@v1:~# acme.sh -h

Мөн доорх тушаалаар автоматаар шинэчлэгдэж байхаар тохируулчихвал амар:

acme.sh --upgrade --auto-upgrade

acme.sh Just issue certificate

Ингээд доорх тушаалаар сертификат үүсгэнэ. Nginx юмуу Apache тохиргоог автоматаар хийх тушаал байдаг ч бид энэ удаад гараараа тохируулна.

acme.sh --issue -d example.com -d www.example.com -w /var/www/html

example.com гэсний оронд домэйн нэрээ оруулна.

Ингээд ~/.acme.sh/example.com/ хавтсанд сертификатууд үүснэ.

Энэ нь 60 хоног тутамд автоматаар шинэчлэгдэнэ.

Энэ арга таарахгүй өөр жишээнүүд судлах бол дараах хаягаар үзэж болно: https://github.com/acmesh-official/acme.sh/wiki/How-to-issue-a-cert

Odoo-гийн веб сервер прокси SSL-тэй тохируулах

Аль нэг өөрийн сонгосон серверээр тохиргоогоо хийгээрэй.

Nginx тохиргоо

/etc/nginx/sites-available/example.com.conf

upstream odoo {
 server 127.0.0.1:8069;
}
upstream odoochat {
 server 127.0.0.1:8072;
}

# http -> https
server {
   listen 80;
   server_name example.com www.example.com;
   location /.well-known/acme-challenge/ {
     alias /var/www/html/.well-known/acme-challenge/;
   }
   rewrite ^(.*) https://$host$1 permanent;
}

# https
server {
 listen 443 ssl;
 server_name example.com www.example.com;
 proxy_read_timeout 28800s;
 proxy_connect_timeout 800s;
 proxy_send_timeout 28800s;

 # 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;

 # SSL parameters
 ssl_certificate /home/user/.acme.sh/example.com/fullchain.cer;
 ssl_certificate_key /home/user/.acme.sh/example.com/example.com.key;
 ssl_session_timeout 240m;
 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
 ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
 ssl_prefer_server_ciphers on;

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

 # Redirect requests to odoo backend server
 location / {
   proxy_redirect off;
   proxy_pass http://odoo;
 }
 location /longpolling {
     proxy_pass http://odoochat;
 }

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

Дээрх тохиргоонд example.com, /home/user, 8069, 8072 гэсэн утгуудыг шаардлагатайг нь зохих утгуудаар бүгдийг нь хайж солиорой.

Ингээд доорх тушаалаар идэвхжүүлнэ:

ln -s /etc/nginx/sites-available/example.com.conf  /etc/nginx/sites-enabled/example.com.conf 

Хийсэн тохиргоогоо дараах тушаалаар шалгана:

nginx -t

Ингээд асуудалгүй бол Nginx сервер доорх тушаалаар дахин ачааллаж тохиргоог идэвхжүүлнэ.

sudo systemctl restart nginx


Apache тохиргоо

Эхлээд http -г https рүү үсэргэх тохиргоог хийнэ. Мөн SSL нь баталгаажуулалтын тохиргоог ч доорх байдлаар энд тохируулж өгч болно:

/etc/apache2/sites-available/example.com.conf

<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com

DocumentRoot "/var/www/html"

RewriteEngine on
RewriteCond %{REQUEST_URI} ^/\.well-known/acme-challenge/
RewriteRule ^ - [END]

Alias /.well-known/acme-challenge/ /var/www/html/.well-known/acme-challenge/
  <Directory "/var/www/html/.well-known/acme-challenge/">
      Options None
      AllowOverride None
      ForceType text/plain
      RedirectMatch 404 "^(?!/\.well-known/acme-challenge/[\w-]{43}$)"
  </Directory>

ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>

RewriteCond %{SERVER_NAME} =example.com [OR]
RewriteCond %{SERVER_NAME} =www.example.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

<IfModule mod_ssl.c>
AcceptFilter http none
AcceptFilter https none

<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com erp.example.com

DocumentRoot "/var/www/html"

RewriteEngine on
RewriteCond %{REQUEST_URI} ^/\.well-known/acme-challenge/
RewriteRule ^ - [END]

ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>

#LogLevel debug
Customlog /var/log/apache2/example.com-access.log combined 
ErrorLog /var/log/apache2/example.com-error.log

ProxyTimeout 86400
ProxyPreserveHost On
RequestHeader set X-Forwarded-Proto "https"
Header set X-Forwarded-Port "443"
Header always add Strict-Transport-Security "max-age=15768000"

SSLSessionCacheTimeout 28800

ProxyIOBufferSize 819200

ProxyPass /longpolling/ http://localhost:8072/longpolling/
ProxyPassReverse /longpolling/ http://localhost:8072/longpolling/

ProxyPass / http://localhost:8069/ connectiontimeout=300 timeout=28800 keepalive=On ttl=28800 retry=300 acquire=30000 responsefieldsize=819200
ProxyPassReverse / http://localhost:8069/

Include /etc/letsencrypt/options-ssl-apache.conf
SSLUseStapling          on
SSLStaplingResponderTimeout 30
SSLStaplingReturnResponderErrors off

SSLCertificateFile /home/user/.acme.sh/example.com/fullchain.cer
SSLCertificateKeyFile /home/user/.acme.sh/example.com/example.com.key


# GZIP compression for text files: HTML, CSS, JS, Text, XML, fonts
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
AddOutputFilterByType DEFLATE application/x-font
AddOutputFilterByType DEFLATE application/x-font-opentype
AddOutputFilterByType DEFLATE application/x-font-otf
AddOutputFilterByType DEFLATE application/x-font-truetype
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE font/opentype
AddOutputFilterByType DEFLATE font/otf
AddOutputFilterByType DEFLATE font/ttf
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE image/x-icon
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/xml
</IfModule>

</VirtualHost>
# Set the location of the SSL OCSP Stapling Cache
SSLStaplingCache shmcb:/tmp/stapling_cache(128000)
</IfModule>

Дээрх тохиргоонд example.com, /home/user, 8069, 8072 гэсэн утгуудыг шаардлагатайг нь зохих утгуудаар бүгдийг нь хайж солиорой. SSLStapling тохиргоо алдаа заасан тохиолдолд Apache SSL модулийн тохиргоонд идэвхжүүлж тохируулаарай.

Ингээд доорх тушаалаар идэвхжүүлнэ:

a2ensite example.com

Хийсэн тохиргоогоо дараах тушаалаар шалгана:

apache2ctl configtest

Ингээд Syntax OK гэж гарч асуудалгүй бол Apache сервер дахин ачааллаж тохиргоог идэвхжүүлнэ.

sudo systemctl restart apache2

Odoo суулгаж бэлдэх

Нэг сервер дээр олон орчин ажиллуулах зэрэгт тохиромжтой байдаг тул анхнаасаа хийсвэр орчин тохируулж бэлдэх нь дээр. Доорх зааврын дагуу үүсгээрэй:

Python хийсвэр орчин (Virtual Environment) тохируулах

Ингээд /home/username/odoo/ хавтсанд Odoo-ийн соорс кодоо хуулж бэлдэнэ. Мэдээж өөр хавтсанд ч тохируулж болох ба тэгсэн тохиолдолд доорх зааврууд дээр тэр хавтасны замаа зааж өгөөрэй.

Харин pip install -r requirements.txt тушаалаа ажиллуулахдаа хийсвэр орчноо идэвхжүүлсэн байх хэрэгтэй.

Odoo суулгах дэлгэрэнгүй зааврыг энд бичихгүй ба доорх хаягнаас харах боломжтой. Мөн доорх хаяг дээрх зүйлсээс зарим зүйлс өөр ба давхацсан байж магадгүй: Ubuntu сервер дээр Odoo суулгах

Мөн odoo-server файл байхгүй байгаа тохиолдолд setup хавтасны odoo файлыг odoo-server болгон үндэсн хавтсанд хуулаарай.

odoo-server.conf файлд доорх тохиргоонуудыг доорх байдлаар нэмж тохируулж өгвөл зүгээр. Ялангуяа доод хэсгийн утгууд нь чухал шаардлагатай юм:

Утгуудыг нь шаардлагатай бол өөрөө нэмж тохируулаарай.

[options]

...

db_maxconn = 100
limit_time_cpu = 28800
limit_time_real = 28800
max_cron_threads = 1
limit_time_real_cron = -1
list_db = False
log_level = info

debug_mode = False
dev_mode = False
logfile = /home/username/odoo/log/odoo-server.log
db_sslmode = prefer
http_enable = True
http_port = 8069
longpolling_port = 8072
proxy_mode = True
workers = 8
proxy=True

Мөн тохиргоонд Logrotate=True зэргээр Odoo системийн өөрийнх нь log rotation ашиглахаас илүү системийн Logrotate ашиглахаар тохируулахыг санал болгодог.

Жишээ нь:

/etc/logrotate.d/odoo-server файлд доорх байдлаар тохируулна.

/home/username/odoo/log/odoo-server.log {
    weekly
    rotate 4
    compress
    delaycompress
    missingok
}

Тэгээд доорх тушаалаар идэвхжүүлнэ.

systemctl restart logrotate.service

Systemd сервис тохируулах

$USER/.config/systemd/user/odoo-server.service файл үүсгэн доорх агуулгыг оруулна.

(Эсвэл системийн сервис хэлбэрээр /etc/systemd/system/ хавтсанд үүсгэж болно. Тэгсэн тохиолдолд сервис удирдахад заавал sudo шаардлагатай болно.)

[Unit]
Description=OdooServer
Requires=postgresql.service
After=network.target postgresql.service

[Service]
Type=simple
SyslogIdentifier=odoo-server
#User=username
#Group=username
ExecStart=/home/user/virtualenvs/odoo1env/bin/python /home/username/odoo/odoo-server --pidfile=/home/username/odoo/odoo-server.pid -c /home/username/odoo/odoo-server.conf
StandardOutput=journal+console

[Install]
WantedBy=default.target
#WantedBy=multi-user.target

ExecStart утгыг өөрчилж тохируулах шаардлагатай.

Жишээлбэл /home/user/virtualenvs/odoo1env/bin/python гэсний оронд virtual env тохируулсан замаа зааж өгнө. (Хэрэв хийсвэр орчин тохируулаагүй бол /usr/bin/python3.7 гэх мэт системийн үндсэн замыг ч зааж өгч болно.) /home/username/odoo/ хавтсанд odoo-гийн кодоо хуулах юмуу эсвэл үүний оронд хуулсан замаа зааж өгч тохируулна.

(Системийн сервис хэлбэрээр тохируулж буй үед коммэнт аут хийсэн мөрүүдийг идэвхжүүлэх ба User, Group утгуудыг тохируулж өгнө. )

Ингээд доорх тушаалуудаар идэвхжүүлж удирдана. Доод талын 4 тушаал бол цаашид тогтмол ашиглагдана.

systemctl --user daemon-reload
systemctl --user enable odoo-server.service

systemctl --user start odoo-server.service
systemctl --user stop odoo-server.service
systemctl --user restart odoo-server.service
systemctl --user status odoo-server.service

Дээрх odoo-server гэсний оронд сервистээ өөр нэр сонгож бас болно.

Monit суулгаж тохируулах

Мөн үүн дээр нэмээд monit суулгаж тохируулж өгвөл зүгээр.

Зааварчилгаа: Monit сервис тохируулах

Тохируулахдаа доорх байдлаар нэмж өгнө:

Жишээ тохиргоо: /etc/monit/conf.d/odoo-server.conf файл үүсгэн доорх тохиргоог хийнэ.

check process odoo-server with pidfile /home/username/odoo/odoo-server.pid
start program "/bin/systemctl start odoo-server" as uid userid and gid userid with timeout 120 seconds
stop program "/bin/systemctl stop odoo-server" as uid userid and gid userid

userid гэсний оронд өөрийн хэрэглэгчийн user name-ийг тохируулж өгнө.


Зарим холбогдолтой линкүүд