跳到主要内容

VPS:在 Linux 上安装 Odoo(开源 ERP 和 CRM)

本指南是针对以下产品创建的:

(不同供应商的产品可能会有所不同,但主要概念保持不变)

介绍

Odoo 是一个模块化的开源平台,集成了企业资源计划(ERP)和客户关系管理(CRM)功能。它允许企业通过一个系统管理和自动化会计、库存、项目管理和销售等流程。

凭借灵活的扩展,Odoo 可以根据具体需求进行定制,提供一个集成的解决方案来管理公司的各个领域。

img

想自己托管这个服务?我们会一步步带你完成安装和配置,并告诉你所有需要注意的事项。

前提条件

在安装 Odoo 之前,请确保您的托管环境满足以下要求,以保证安装顺利并获得最佳性能。

硬件最低要求推荐配置
CPU1 个 vCPU 核心4 个 vCPU 核心
内存1 GB4 GB
磁盘空间15 GB25 GB

软件要求安装所有必要的依赖,并运行在支持的操作系统上。请确保您的服务器满足以下条件后再继续安装:

依赖项: Docker

操作系统: 支持 Docker 26+ 的最新 Ubuntu/Debian 版本

确保所有依赖已安装且操作系统版本正确,以避免安装 Odoo 时出现兼容性问题。

准备工作

在设置 Odoo 之前,需要先准备系统,包括将操作系统更新到最新版本并安装所有必需的依赖。这些准备工作能确保环境稳定,避免安装过程中或之后出现问题。

更新系统

为了确保系统运行最新的软件和安全补丁,建议先执行系统更新。运行以下命令:

sudo apt update && sudo apt upgrade -y

这会确保系统拥有最新的安全补丁和软件版本,方便后续操作。

安装依赖

更新完成后,就可以安装依赖了。Odoo 将通过多个 Docker 容器部署和运行,因此需要先安装 Docker。运行以下命令:

curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh

关于 Docker 的完整安装流程和使用说明,请参考我们的 Docker 指南。

配置域名

默认情况下,Odoo 通过主机的 80(HTTP)和 443(HTTPS)端口运行。请设置一个域名,并将 DNS 记录指向您的主机。如果域名由我们管理,可以通过 EasyDNS 轻松完成设置。

安装

满足所有要求并完成准备后,就可以开始安装 Odoo 应用。

在使用多个 Docker 项目时,建议建立清晰的目录结构,保持项目相互隔离。常见做法是在用户主目录下创建一个 docker 文件夹,每个域名一个子文件夹。这样可以在同一服务器上托管多个项目,避免配置冲突。

例如,为域名 example.com 准备目录结构:

mkdir -p /docker/example.com
cd /docker/example.com

在项目目录内,建议创建子文件夹,供容器挂载为卷。卷用于服务间共享数据或持久化存储。一个关键的例子是共享的 webroot,nginx 和 certbot 都需要访问它来生成和续期 SSL 证书。可以这样创建结构:

mkdir -p nginx/{conf,ssl,inc} config addons

这样就有了专门的目录存放 nginx 配置、SSL 证书、包含文件,以及 Odoo 的配置和插件。

创建 Docker Compose

在 docker 项目目录下,用 nano compose.yml 创建 compose.yml 文件,写入以下内容:

services:
db:
image: postgres:16
ports:
- "5432:5432"
environment:
- POSTGRES_USER=odoo
- POSTGRES_PASSWORD=odoo
- PGDATA=/var/lib/postgresql/data/pgdata
volumes:
- odoo-db-data:/var/lib/postgresql/data

odoo:
image: odoo:18.0
depends_on:
- db
ports:
- "8069:8069"
volumes:
- odoo-web-data:/var/lib/odoo
- ./config:/etc/odoo
- ./addons:/mnt/extra-addons
command: odoo -d odoo_db -i base --db_user=odoo --db_password=odoo --db_host=db

nginx:
image: nginx:latest
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf:/etc/nginx/conf.d
- ./nginx/inc:/etc/nginx/inc
- ./nginx/ssl:/etc/nginx/ssl
- ./nginx/certbot/www:/var/www/certbot
- ./nginx/certbot/conf:/etc/letsencrypt
depends_on:
- odoo

certbot:
image: certbot/certbot
volumes:
- ./nginx/certbot/www:/var/www/certbot
- ./nginx/certbot/conf:/etc/letsencrypt

volumes:
odoo-db-data:
odoo-web-data:

防火墙

为了让 nginx 和 certbot 正常工作,需要允许防火墙通过 TCP 端口 80(HTTP)和 443(HTTPS)。certbot 依赖端口 80 进行 HTTP 验证,端口 443 用于 HTTPS 加密流量。如果启用了 UFW(简单防火墙),可以用以下命令添加规则:

sudo ufw allow http
sudo ufw allow https

然后用 sudo ufw status 检查规则是否生效。确保没有其他防火墙配置阻止访问这些端口,否则证书生成或 HTTPS 访问可能失败。

Nginx 设置

首先为您的域名创建 nginx 配置文件。在 nginx/conf 目录下新建一个以域名命名的文件。执行 nano nginx/conf/example.com.conf,并写入以下基础配置,替换为您的实际域名:

server {
listen 80;
server_name example.com;

location /.well-known/acme-challenge/ {
root /var/www/certbot;
}

location / {
return 301 https://$host$request_uri;
}
}

此配置允许 certbot 完成 ACME 验证并签发有效的 SSL 证书,同时将所有 HTTP 请求重定向到 HTTPS。

保存后,启动数据库、Odoo 和 nginx 容器:

sudo docker compose up -d db odoo nginx

容器会在后台运行,nginx 会加载新配置,方便下一步 certbot 生成证书。

生成 SSL 证书

运行以下命令用 certbot 生成 SSL 证书。请将 -d 后的域名替换为您的域名,user@mail.com 替换为有效邮箱。

sudo docker compose run --rm certbot certonly --webroot --webroot-path=/var/www/certbot -d example.com --email user@mail.com --agree-tos --no-eff-email

随后生成专用的 DH 参数文件,增强密钥交换安全性:

openssl dhparam -out nginx/ssl/dhparam.pem 2048

接着用 nano nginx/ssl/ssl.conf 创建 ssl.conf 文件,写入以下内容,记得替换 example.com 为您的域名:

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ecdh_curve X25519:prime256v1:secp384r1;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers off;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_dhparam "/etc/nginx/ssl/dhparam.pem";
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
resolver 1.1.1.1 1.0.0.1 valid=300s;

配置

Nginx 配置

编辑之前创建的 nginx 配置文件,替换为以下内容,确保网站只通过 HTTPS 提供服务。

记得将 server_name 指令中的域名替换为您的实际域名,并在 ssl_certificatessl_certificate_key 指令中指定正确的证书路径。

server {
listen 443 ssl;
http2 on;
server_name example.com;

# 引入 Mozilla 的 SSL 设置
include /etc/nginx/ssl/ssl.conf;

# 证书路径(确保与挂载卷匹配)
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

# 安全头部
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;

access_log /var/log/nginx/odoo_access.log;
error_log /var/log/nginx/odoo_error.log;

#Gzip
include /etc/nginx/inc/gzip.conf;

# Odoo 代理设置
location / {
proxy_pass http://odoo:8069;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Host $host;
proxy_redirect off;
proxy_request_buffering off;
# 标准请求推荐超时
proxy_connect_timeout 30s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
send_timeout 60s;
}

# 缓存静态文件
location ~* /web/static/ {
proxy_cache_valid 200 60m;
proxy_buffering on;
expires 864000;
proxy_pass http://odoo:8069;
}

# 长轮询超时延长
location /longpolling {
proxy_pass http://odoo:8069;
proxy_connect_timeout 60s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
send_timeout 300s;
}

location /websocket {
proxy_pass http://odoo:8069;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

server {
listen 80;
server_name example.com;

# 允许 Certbot 访问验证 URL
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}

location / {
return 301 https://$host$request_uri;
}
}

保存 nginx 配置后,重启 nginx 容器以应用新设置:

sudo docker compose restart nginx

重启后 nginx 会加载更新的配置并立即开始使用新参数服务请求。若出现错误,可用 sudo docker compose logs nginx 查看日志排查。确认容器正常运行后,访问网站检查 HTTPS 是否生效,页面是否正常加载。

Odoo 配置选项

你可以为 Odoo 创建专门的配置文件来自定义设置。新建文件 config/odoo.conf,添加所需选项。

文件中可以定义多个实用参数:list_db = False 隐藏登录页的数据库选择,proxy_mode = True 表示 Odoo 运行在反向代理后面,如果想使用自定义插件,可以取消注释 addons_path 并指向之前创建的插件目录。示例配置:

[options]
list_db = False
proxy_mode = True
#addons_path = /mnt/extra-addons

移除 -i base 参数

compose.yml 文件中的 -i base 参数必须移除,否则每次重建 Odoo 容器时都会重新创建数据库。打开 compose 文件,使用 nano compose.yml,将命令改为:

command: odoo -d odoo_db --db_user=odoo --db_password=odoo --db_host=db

访问网站

安装和配置完成,所有服务运行正常后,在浏览器地址栏输入您的域名即可安全访问网站。

img

这会加载新安装的起始页面。初始登录账号为用户名 admin,密码 admin。强烈建议您尽快修改默认密码。

结语及更多资源

恭喜!您已成功在 VPS 上安装并配置了 Odoo。我们还推荐查看以下资源,能为您的服务器配置提供更多帮助和指导:

有没覆盖到的问题?如需更多帮助,欢迎随时联系我们的支持团队,我们每天都在线为你服务!🙂