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-ийг тохируулж өгнө.