"Odoo service тохируулах (NGINX, Apache, LetsEncrypt (acme.sh), systemd)"-ны өөр хувилбарууд
228-р мөр: | 228-р мөр: | ||
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent] | RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent] | ||
</VirtualHost> | </VirtualHost> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
<IfModule mod_ssl.c> | <IfModule mod_ssl.c> | ||
AcceptFilter http none | AcceptFilter http none | ||
322-р мөр: | 316-р мөр: | ||
<pre> | <pre> | ||
a2ensite example.com | a2ensite example.com | ||
− | |||
</pre> | </pre> | ||
21:34, 10 Нэгдүгээр сар 2023-ий байдлаарх засвар
Гарчиг
Ерөнхий тайлбар
Odoo сервис продакшн орчинд тохируулахдаа Nginx юмуу Apache сервер proxy ашиглан, мөн төлбөргүй SSL тохируулах талаар. Энэ зааврын хувьд Ubuntu үйлдлийн системд зориулсан ба бусад Линкус системд зарим зүйл нь өөр байж магадгүй юм. Nginx, Apache 2 серверийн аль нэгийг нь сонгон суулгасан байгаа байх. Тиймээс тохиргоон дээр аль нэгийг нь сонгож хийгээд нөгөөг нь алгасаж тохируулаарай.
SSL тохируулах
Энэ удаад бид Let's Encrypt free SSL-ийн certbot гээд өргөн ашиглагддаг python багажаар тохиргоо хийж болох ч энэ удаад бид acme.sh shell script-ээр тохиргоо хийнэ. Project on github: https://github.com/acmesh-official/get.acme.sh
Аль аль нь нээлттэй эхийн хэрэгсэл ба зөвхөн online серверт тохируулах боломжтой.
Төлбөртэй SSL худалдан авч тохируулах тохиолдолд прокси серверийн тохиргоо дээрээ замыг зааж өгөхөд л болох тул доорхыг алгасахад болно.
Төлбөргүй SSL нь 90 хоногийн хугацаатай ба бид автомтаар сунгагдаж явахаар тохируулна. Ингэхийн тулд сервер баталгаажуулалтын тохиргоог эхлээд зөв хийж өгөх шаардлагатай. DNS зэрэг өөр олон тохируулах арга байдаг ч энэ удаад хамгийн хялбар, өргөн ашиглагддаг вэб серверийн тохиргооны дагуу тохируулна. Доорх Nginx, Apache2 аль нэгийг сонгон тохируулаарай.
Nginx сервер дэх тохиргоо
/etc/nginx/conf-enabled/acme-challenge.conf
Доорх агуулгыг хийж хадгална:
location ^~ /.well-known/acme-challenge/ { default_type "text/plain"; root /var/www/html; break; } location = /.well-known/acme-challenge/ { return 404; }
эсвэл
Apache сервер дэх тохиргоо
Доорх файлыг үүсгэн:
/etc/apache2/conf-enabled/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>
Ингээд 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
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
Веб сервер прокси тохируулах
Аль нэг өөрийн сонгосон серверээр тохиргоогоо хийгээрэй.
Nginx тохиргоо
/etc/nginx/sites-available/example.com.conf
upstream odoo { server 127.0.0.1:8060; } 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, 8060, 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:8060/ connectiontimeout=300 timeout=28800 keepalive=On ttl=28800 retry=300 acquire=30000 responsefieldsize=819200 ProxyPassReverse / http://localhost:8060/ 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, 8060, 8072 гэсэн утгуудыг шаардлагатайг нь зохих утгуудаар бүгдийг нь хайж солиорой. SSLStapling тохиргоо алдаа заасан тохиолдолд Apache SSL модулийн тохиргоонд идэвхжүүлж тохируулаарай.
Ингээд доорх тушаалаар идэвхжүүлнэ:
a2ensite example.com
Хийсэн тохиргоогоо дараах тушаалаар шалгана:
apache2ctl configtest
Ингээд Syntax OK гэж гарч асуудалгүй бол Apache сервер дахин ачааллаж тохиргоог идэвхжүүлнэ.
sudo systemctl restart apache2
Odoo суулгаж бэлдэх
Нэг сервер дээр олон орчин ажиллуулах зэрэгт тохиромжтой байдаг тул анхнаасаа хийсвэр орчин тохируулж бэлдэх нь дээр. Доорх зааврын дагуу үүсгээрэй:
[[1]]
Ингээд /home/username/odoo/ хавтсанд Odoo-ийн соорс кодоо хуулж бэлдэнэ. Мэдээж өөр хавтсанд ч тохируулж болох ба тэгсэн тохиолдолд доорх зааврууд дээр тэр хавтасны замаа зааж өгөөрэй.
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 гэсний оронд сервистээ өөр нэр сонгож бас болно.