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