من روی یک سرور یک سرویس ادوو دارم که ظاهرا داره 3 ...
創建於:2025年9月3日
使用 GPT-5 Thinking 回答 Chat01
創建於:2025年9月3日
使用 GPT-5 Thinking 回答 Chat01
من روی یک سرور یک سرویس ادوو دارم که ظاهرا داره 3 تا url رو هندل میکنه
و با استفاده از nginx زیر داره به سه تا دیتابیس وصل میشه
چجوری اینکار انجام میشه
upstream odoo {
server 127.0.0.1:8069;
}
upstream odoochat {
server 127.0.0.1:8072;
}
map connection_upgrade {
default upgrade;
'' close;
}
server {
server_name erp.zhaxon.ir;
textaccess_log /var/log/nginx/odoo.access.log; error_log /var/log/nginx/odoo.error.log; proxy_read_timeout 720s; proxy_connect_timeout 720s; proxy_send_timeout 720s;
textproxy_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;
textlocation / { proxy_redirect off; proxy_pass http://odoo; proxy_set_header X-Odoo-dbfilter erp; } location /websocket { proxy_pass http://odoochat; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header X-Forwarded-Host $http_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; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"; proxy_cookie_flags session_id samesite=lax secure; # requires nginx 1.19.8 }
textgzip_types text/css text/less text/plain text/xml application/xml application/json application/javascript; gzip on; client_body_in_file_only clean; client_body_buffer_size 32K; client_max_body_size 50M; sendfile on; send_timeout 600s; keepalive_timeout 300; listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/dev.zhaxon.ir/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/dev.zhaxon.ir/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
#####################################test
server {
server_name test.zhaxon.ir;
textaccess_log /var/log/nginx/odoo.access.log; error_log /var/log/nginx/odoo.error.log; proxy_read_timeout 720s; proxy_connect_timeout 720s; proxy_send_timeout 720s;
textproxy_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;
textlocation / { proxy_redirect off; proxy_pass http://odoo; proxy_set_header X-Odoo-dbfilter test; } location /websocket { proxy_pass http://odoochat; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header X-Forwarded-Host $http_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; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"; proxy_cookie_flags session_id samesite=lax secure; # requires nginx 1.19.8 }
textgzip_types text/css text/less text/plain text/xml application/xml application/json application/javascript; gzip on; client_body_in_file_only clean; client_body_buffer_size 32K; client_max_body_size 50M; sendfile on; send_timeout 600s; keepalive_timeout 300; listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/dev.zhaxon.ir/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/dev.zhaxon.ir/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
#####################################dev
server {
server_name dev.zhaxon.ir;
textaccess_log /var/log/nginx/odoo.access.log; error_log /var/log/nginx/odoo.error.log; proxy_read_timeout 720s; proxy_connect_timeout 720s; proxy_send_timeout 720s;
textproxy_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;
textlocation / { proxy_redirect off; proxy_pass http://odoo; proxy_set_header X-Odoo-dbfilter dev; } location /websocket { proxy_pass http://odoochat; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header X-Forwarded-Host $http_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; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"; proxy_cookie_flags session_id samesite=lax secure; # requires nginx 1.19.8 }
textgzip_types text/css text/less text/plain text/xml application/xml application/json application/javascript; gzip on; client_body_in_file_only clean; client_body_buffer_size 32K; client_max_body_size 50M; sendfile on; send_timeout 600s; keepalive_timeout 300; listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/dev.zhaxon.ir/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/dev.zhaxon.ir/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if (host = dev.zhaxon.ir) {
return 301 https://host$request_uri;
} # managed by Certbot
textlisten 80; server_name dev.zhaxon.ir; return 404; # managed by Certbot
}
server {
if (host = erp.zhaxon.ir) {
return 301 https://host$request_uri;
} # managed by Certbot
textlisten 80; server_name erp.zhaxon.ir; return 404; # managed by Certbot
}
server {
if (host = test.zhaxon.ir) {
return 301 https://host$request_uri;
} # managed by Certbot
textlisten 80; server_name test.zhaxon.ir; return 404; # managed by Certbot
/var/lib/odoo/.local/share/Odoo/filestore# ls
dev erp test
خیلی خلاصه: شما یک Odoo واحد دارید که پشتِ Nginx نشسته و با «فیلتر دیتابیس» (dbfilter) برای هر دامنه، دیتابیس مشخصی را سرو میکند. در هر سروربلاک Nginx با هدر X-Odoo-dbfilter میگویید کدام DB انتخاب شود، و Odoo همان را باز میکند. مسیرهای filestore/dev, filestore/erp, filestore/test هم نشان میدهد که سه دیتابیس با همین نامها دارید.
server {} برای یک دامنه، این خط هست:
یعنی هر چیزی که به erp.zhaxon.ir بیاید، Odoo فقط دیتابیسnginxproxy_set_header X-Odoo-dbfilter erp; # یا test / dev
erp را در نظر میگیرد.dbfilter بر اساس hostname دیتابیس را انتخاب کند (مثلاً dbfilter = ^%d$). اگر بخواهید فیلتر را از طریق هدر بدهید، معمولاً ماژول dbfilter_from_header (OCA) را بهصورت server-wide لود میکنند تا Odoo هدر X-Odoo-dbfilter را قبول کند. (Odoo, Odoo Community Association (OCA), PyPI)server_name erp.zhaxon.ir → هدر X-Odoo-dbfilter erpserver_name test.zhaxon.ir → هدر X-Odoo-dbfilter testserver_name dev.zhaxon.ir → هدر X-Odoo-dbfilter devlocation /websocket به upstream 127.0.0.1:8072 میرود و هدرهای Upgrade/Connection را ست میکند تا چت/نوتیفیکیشنها کار کنند. (Odoo)/etc/odoo/odoo.conf (نمونهی مینیمال):
ini[options] proxy_mode = True ; اگر از هدر استفاده میکنید: server_wide_modules = web,base,dbfilter_from_header ; اگر نخواستید از هدر استفاده کنید و بر اساس سابدامین بخواهید: ; dbfilter = ^%d$ ; (یا اگر هر سه DB مشخصند، سختگیرانهتر:) ; dbfilter = ^(erp|test|dev)$ list_db = False ; برای live chat/notifications gevent_port = 8072 workers = 2
dbfilter در هستهی Odoo بر اساس host عمل میکند (%d= اولین سابدامین، %h = کل hostname). اگر با هدر کار میکنید، معمولاً به ماژول OCA نیاز است تا Odoo مقدار X-Odoo-dbfilter را اعمال کند. (Odoo, Odoo Community Association (OCA))تا اپلیکیشن URL پایه را درست تشخیص دهد (بهویژه اگر از لینکهای مطلق استفاده میشود).nginxproxy_set_header Host $host;
list_db = False بماند.nginxlocation ~ ^/web/database { deny all; }
dbfilter را طوری بگذارید که فقط همان DB را پوشش دهد (مثل ^(erp|test|dev)$). (Odoo)dev.zhaxon.ir استفاده شده. اگر این گواهی SAN یا Wildcard نیست که erp.zhaxon.ir و test.zhaxon.ir را هم پوشش بدهد، برای هر دامنه گواهی بگیرید یا ازWildcard استفاده کنید.gevent_port = 8072 و workers ≥ 2 ست است و بلاک /websocket درست به 8072 میرود. (Odoo)میتوانید کلاً هدر X-Odoo-dbfilter را بردارید و در Odoo بگذارید:
inidbfilter = ^%d$ ; یعنی سابدامین، نام دیتابیس است list_db = False
در این حالت:
erp.zhaxon.ir → دیتابیس erptest.zhaxon.ir → دیتابیس testdev.zhaxon.ir → دیتابیس devاگر دوست دارید، میتونم همین حالا یک نسخهی تمیزتر از فایل Nginx و odoo.conf مناسب سناریوی شما آماده کنم.