自托管 CRM 不只是找一个存放联系人和跟踪商机的地方。更大的问题是 CRM 跑起来之后你还需要什么。
小企业可能从线索、联系人、商机和销售活动开始。之后可能需要报价、开票、库存、采购、会计或其他业务工具。为每个需求单独运行一个应用会让整套系统更难管理。
目前有多个自托管 CRM 平台,Odoo 是其中之一。Odoo 可以先作为 CRM 使用,在需要超出 CRM 的功能时再扩展为更广泛的业务管理平台。
如果你考虑自托管 Odoo,可以在 Linux 服务器上用 Docker 安装,也可以直接从源码安装。
本指南覆盖这两种方式。
我们先用 Docker 和 PostgreSQL 部署 Odoo。之后从源码安装 Odoo,并说明直接在服务器上管理它需要额外做哪些工作。
应该自托管还是选择定制 CRM 服务商?
在 CRM 上投入时间之前,先决定你是想自己托管和管理,还是与专门做定制 CRM 开发的服务商合作。
如果你的主要目标是学习、评估其能力、configure 标准功能并判断它是否适合你的业务,就自托管 CRM。
当你需要 production-ready 的解决方案、大量定制、集成、数据迁移、专门的工作流或持续的技术支持时,就选择 CRM 服务商。
如果选择服务商,在做出购买决定前要仔细评估。不要只根据价格或一场有说服力的演示来选择。要考察他们的 CRM 经验、技术能力、对你业务的理解、以往项目、定制方式、支持、升级能力以及长期总成本。
好的服务商应该先判断你的需求能否通过标准 CRM 功能或 configuration 满足。只有在确实必要时才应建议定制开发。
如果你更愿意自己管理系统,本指南余下部分会说明如何评估并自托管 Odoo,使用 Docker 或源码安装。
在进入安装之前,先简要介绍 Odoo、它的功能、可用版本以及它们之间的区别。这样在开始部署前你能对 Odoo 提供什么有个基本概念。
Odoo 是什么?
Odoo 是一个业务应用平台,除 CRM 外还包含销售、会计、库存、采购、制造、项目管理、网站、营销等业务功能的应用。
Odoo 的各应用共用同一个数据库。这样系统的不同部分可以处理相同的客户、产品、订单、发票和其他业务记录。
例如,销售团队可以在 CRM 中管理商机、创建报价、确认销售,然后继续开票和交付。可用的工作流取决于你安装和 configure 了哪些应用。
因此 Odoo 比传统 CRM 更广泛。你可以只使用需要的应用,之后再添加其他应用。
Odoo 功能
Odoo 为不同业务领域提供应用:
CRM 应用包含线索、商机、销售管道、活动、报价、线索分配、线索评分和销售报表等功能。
你不需要安装所有应用。自托管安装可以从 CRM 和你实际需要的应用开始。
Odoo 社区版与企业版
Odoo 有两个版本:社区版和企业版。
社区版是开源版本,采用 LGPLv3 许可。企业版包含社区版代码以及额外的专有应用和功能。企业版软件受 Odoo 企业版许可约束。
对于计划自托管安装的人来说,主要区别是:
每个版本包含的具体功能会随 Odoo 发行版变化。安装额外模块前,请查阅对应 Odoo 版本的文档。
托管方式与安装方式不同
社区版和企业版是 Odoo 的版本。Docker、源码安装、Odoo Online 和 Odoo.sh 描述的是 Odoo 如何运行或在哪里运行。它们不是独立的 Odoo 版本。
在规划自托管安装时,这个区别很重要。
自托管意味着你要管理 Linux 服务器、Odoo 安装、PostgreSQL 数据库、存储、备份、更新和网络访问。
在自己的服务器上安装 Odoo 有多种方式。本指南覆盖其中两种:
- Docker: Odoo 和 PostgreSQL 在容器中运行。
- 源码安装: Odoo 直接运行在 Linux 环境中,并带有其所需依赖。
本指南余下部分聚焦这两种自托管方式。
方法 1:用 Docker 自托管 Odoo
Docker 让 Odoo 易于运行和维护。你能得到干净的安装、简单的备份以及之后方便的更新路径。
我假设你熟悉基本的 Docker 和 Linux 命令。下面会走一遍真实部署,从空服务器到可用的 Odoo 实例。
前置条件
先检查 Docker 版本:
docker --version
docker compose version
如果两者都显示版本号,就可以继续。如果没有,安装 Docker:
sudo apt update
sudo apt install -y docker.io docker-compose-v2
sudo usermod -aG docker $USER
执行最后一条命令后注销并重新登录。这样你无需 sudo 就能运行 Docker。
步骤 1:创建项目目录
mkdir odoo-docker && cd odoo-docker
mkdir config addons
config 目录存放 Odoo 设置。addons 目录存放自定义模块,如果你之后添加的话。
步骤 2:创建环境文件
Odoo 需要数据库密码。把它存放在 .env 文件中,而不是 compose 文件里。这样密码就不会进入版本控制。
cat > .env << 'EOF'
DB_PASSWORD=change_me_to_a_strong_password
EOF
把密码替换成真实的密码。用密码管理器生成它。
步骤 3:编写 Docker Compose 文件
创建 docker-compose.yml,内容如下:
services:
db:
image: postgres:18
restart: unless-stopped
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=odoo
- POSTGRES_PASSWORD=${DB_PASSWORD}
- PGDATA=/var/lib/postgresql/data/pgdata
volumes:
- odoo-db-data:/var/lib/postgresql/data/pgdata
healthcheck:
test: ["CMD-SHELL", "pg_isready -U odoo"]
interval: 10s
timeout: 5s
retries: 5
odoo:
image: odoo:19.0
restart: unless-stopped
depends_on:
db:
condition: service_healthy
ports:
- "8069:8069"
- "8072:8072"
environment:
- HOST=db
- USER=odoo
- PASSWORD=${DB_PASSWORD}
volumes:
- odoo-web-data:/var/lib/odoo
- ./config:/etc/odoo
- ./addons:/mnt/extra-addons
volumes:
odoo-db-data:
odoo-web-data:
这个文件定义了两个 services::db(PostgreSQL)和 odoo(应用)。它们通过 Docker 内部网络通信。你不需要把数据库端口暴露到外部。
注意: 如果你只想从本地系统访问 Odoo 面板,把这些行:
ports:
- "8069:8069"
- "8072:8072"
改为:
ports:
- "127.0.0.1:8069:8069"
- "127.0.0.1:8072:8072"
步骤 4:添加基本的 Odoo 配置
创建 config/odoo.conf:
nano config/odoo.conf
内容如下:
[options]
addons_path = /mnt/extra-addons
data_dir = /var/lib/odoo
admin_passwd = change_me_master_password
admin_passwd 与数据库密码不同。它保护 Odoo 自身界面中的数据库创建和删除。把它设为一个强且唯一的值。
步骤 5:启动服务栈
docker compose up -d
检查两个容器都在运行:
docker compose ps
你应该看到 db 和 odoo,状态为 Up 或 healthy。
步骤 6:打开 Odoo
在浏览器中访问 http://your-server-ip:8069。如果你就在服务器上,使用 http://localhost:8069。
Odoo 会显示数据库创建界面。填写:
- 主密码(你设置的
admin_passwd) - 数据库名称
- 你的邮箱和密码(这会成为你的管理员登录凭据)
点击 Create Database。
Odoo 会构建你的第一个数据库。这需要一到两分钟。
数据库创建完成后,你会被自动重定向到 Odoo Web 面板。
现在你有一个可用的 Odoo 19 实例运行在 Docker 上,后端是 PostgreSQL 18。
这套部署使用命名卷来保证数据安全,在你添加反向代理之前端口只绑定本地,并把数据库密码与 Odoo 主密码分开。
下一步:用反向代理配置 HTTPS、安排自动备份,并在把真实客户数据放进系统之前测试一次恢复。
如果端口绑定到 127.0.0.1
如果 compose 文件只把端口暴露到 127.0.0.1,Odoo 还无法从服务器外部访问。这是出于安全考虑。
你应该在 Odoo 前面放一个反向代理(nginx 或 Caddy)。代理处理 HTTPS 并把流量转发到端口 8069。在没有 HTTPS 的情况下把 Odoo 直接暴露在公网上不安全。
一个最小的 nginx 站点配置如下:
server {
listen 443 ssl;
server_name crm.example.com;
ssl_certificate /etc/letsencrypt/live/crm.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/crm.example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8069;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /longpolling {
proxy_pass http://127.0.0.1:8072;
}
}
添加反向代理后,在 config/odoo.conf 中加入这一行:
proxy_mode = True
这告诉 Odoo 信任代理头。没有它,Odoo 可能生成错误的链接和重定向循环。
备份
你的数据存放在两个 Docker volumes::odoo-db-data 和 odoo-web-data。两个都要备份,不能只备份一个。数据库保存你的记录。filestore 保存上传的文件和附件。
数据库备份:
docker compose exec db pg_dump -U odoo -d your_database_name > backup.sql
Filestore 备份:
docker run --rm -v odoo-docker_odoo-web-data:/data -v $(pwd):/backup alpine \
tar czf /backup/filestore-backup.tar.gz -C /data .
用 cron 按计划运行这两条命令。至少测试一次恢复流程。从未测试过的备份不是真正的备份。
更新 Odoo
Odoo 为每个大版本提供每日构建。要在同一版本内更新:
docker compose pull
docker compose up -d
这会拉取 Odoo 19 的最新镜像并重启容器。你的数据保留在卷中,所以对次要更新来说是安全的。
大版本升级(例如 19 到 20)需要不同的流程。Odoo 不支持仅通过 Docker 就地做大版本升级。先在数据库副本上测试大版本升级。
方法 2:从源码安装 Odoo
本次安装测试于:
Operating System: Ubuntu 26.04 LTS
RAM: 8 GB
Disk: 30 GB
Odoo: 19.0 Community
Python: 3.14.4
Git: 2.53.0
PostgreSQL: Ubuntu PostgreSQL package
Installation: Odoo source installation
Purpose: Test / learning VM
这用于学习和评估,不是生产部署。
为什么用源码安装?
Odoo 同时提供打包安装和源码安装。
这个虚拟机使用源码安装,因为 Odoo 19 的 .deb 软件包目前文档说明支持 Ubuntu 24.04 LTS(Noble),而这个虚拟机使用 Ubuntu 26.04。
源码安装允许直接从 Git 源码树运行 Odoo,也适合学习、开发、定制以及运行多个 Odoo 版本。
安装 PostgreSQL
更新 Ubuntu:
sudo apt update
sudo apt upgrade -y
安装 PostgreSQL:
sudo apt install -y postgresql postgresql-client
验证:
sudo systemctl is-active postgresql
预期输出:
active
验证 PostgreSQL:
psql -l
你最初应该看到:
postgres
template0
template1
安装 Git 和 Python 依赖
安装所需的开发软件包:
sudo apt install -y \
git \
python3 \
python3-pip \
python3-venv \
python3-dev \
libxml2-dev \
libxslt1-dev \
zlib1g-dev \
libsasl2-dev \
libldap2-dev \
libssl-dev \
libjpeg-dev \
libpq-dev \
libffi-dev \
build-essential
验证 Python:
python3 --version
验证 Git:
git --version
下载 Odoo 19 社区版源码
切换到主目录:
cd ~
克隆 Odoo 19 分支:
git clone --depth 1 --branch 19.0 \
https://github.com/odoo/odoo.git odoo
进入目录:
cd ~/odoo
验证分支:
git branch --show-current
预期:
19.0
创建 Python 虚拟环境
在 Odoo 目录中:
cd ~/odoo
创建虚拟 environment::
python3 -m venv odoo-venv
激活它:
source odoo-venv/bin/activate
验证:
python --version
以及:
which python
Python 路径中应包含:
~/odoo/odoo-venv/bin/python
安装 Odoo Python 依赖
确保虚拟环境已 active:
cd ~/odoo
source odoo-venv/bin/activate
安装依赖:
pip install -r requirements.txt
等待命令成功完成。
创建 PostgreSQL 用户和数据库
创建与当前 Ubuntu 用户对应的 PostgreSQL 角色:
sudo -u postgres createuser -d -R -S $USER
接下来创建数据库:
createdb $USER
验证:
psql -l
你现在应该看到一个以你的 Ubuntu 用户名命名的数据库。
例如:
ostechnix
postgres
template0
template1
启动 Odoo
激活虚拟 environment::
cd ~/odoo
source odoo-venv/bin/activate
启动 Odoo:
./odoo-bin
Odoo 应报告 HTTP 服务运行在端口 8069。
典型输出:
HTTP service (werkzeug) running on ...:8069
Odoo 运行期间保持这个终端打开。
初始化 Odoo 数据库
如果数据库存在但尚未初始化,停止 Odoo:
Ctrl+C
然后初始化 Odoo 基础模块:
cd ~/odoo
source odoo-venv/bin/activate
./odoo-bin -d $USER -i base
等待模块加载完成。
之后就可以通过浏览器访问 Odoo。
从另一台计算机访问 Odoo
查找虚拟机 IP 地址:
hostname -I
例如:
192.168.0.30
在同一网络的另一台计算机上打开:
http://192.168.0.30:8069
把 IP 地址替换为实际的虚拟机地址。
Odoo 默认 HTTP 端口为 8069。
初始登录
本次安装期间创建的测试数据库,初始管理员凭据为:
Username: admin
Password: admin
只要不是一次性的测试环境,就应立即修改管理员密码。
停止 Odoo
可以。由于这是你的测试/学习虚拟机,完成后可以关闭/停止 Odoo。
你的 Odoo 是用 ./odoo-bin 手动启动的,所以:
- 进入正在运行 Odoo 的虚拟机终端。
- 按 Ctrl+C。Odoo 文档确认这会停止服务器。
- 之后你可以关闭终端/SSH 会话。
你的数据会保留在 PostgreSQL 中。 停止 Odoo 服务器不会删除数据库。
下次再用以下命令启动:
cd ~/odoo
source odoo-venv/bin/activate
./odoo-bin
然后用相同的虚拟机 IP 和 :8069 从你的电脑访问。
将 Odoo 配置为系统服务
Odoo 的源码安装直接通过 odoo-bin 运行;我们只是让 systemd 自动管理这个进程。
创建服务文件:
sudo nano /etc/systemd/system/odoo.service
粘贴:
[Unit]
Description=Odoo 19
Requires=postgresql.service
After=network.target postgresql.service
[Service]
Type=simple
User=ostechnix
WorkingDirectory=/home/ostechnix/odoo
ExecStart=/home/ostechnix/odoo/odoo-venv/bin/python /home/ostechnix/odoo/odoo-bin
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
把 ostechnix 替换为你的实际用户名。
按 Ctrl+O → Enter → Ctrl+X 保存并关闭文件。
重新加载 systemd:
sudo systemctl daemon-reload
设置 Odoo 开机自启:
sudo systemctl enable odoo
立即启动 Odoo:
sudo systemctl start odoo
检查它是否在运行:
sudo systemctl status odoo
你要看到:
Active: active (running)
按 q 退出状态界面。
现在测试一下。从你的电脑打开:
http://<VM-IP>:8069
现在无需手动执行 odoo-bin 就能访问 Odoo。
从现在起,你不需要再手动运行:
cd ~/odoo
source odoo-venv/bin/activate
./odoo-bin
Ubuntu 启动时,systemd 会自动启动 Odoo。
你也可以用以下命令控制它:
sudo systemctl start odoo
sudo systemctl stop odoo
sudo systemctl restart odoo
sudo systemctl status odoo
就这样。无需重装、无需激活虚拟环境、无需手动启动 Odoo。
启用开发者模式
开发者模式对学习 Odoo 的技术架构很有用。
在 Odoo URL 后添加:
?debug=1
例如:
http://192.168.0.50:8069/?debug=1
之后界面中应出现开发者/调试图标。
故障排查
Odoo 没有运行
检查:
sudo systemctl status odoo
然后查看最近的日志:
sudo journalctl -u odoo -n 50 --no-pager
实时跟踪日志:
sudo journalctl -u odoo -f
217/USER 错误
示例:
status=217/USER
这通常表示 systemd 服务中的 User= 账户有问题。
本次安装中正确的用户是:
ostechnix
验证:
id ostechnix
服务中必须包含:
User=ostechnix
并且路径必须使用:
/home/ostechnix/odoo
Odoo 网页打不开
检查 Odoo 是否在运行:
sudo systemctl status odoo
检查端口 8069 是否在监听:
sudo ss -ltnp | grep 8069
查找虚拟机 IP:
hostname -I
然后浏览:
http://<VM-IP>:8069
更新源码安装
由于本次安装使用 Git,Odoo 源码可以通过 Git 更新。Odoo 文档描述了使用 git fetch 和 git rebase --autostash 的基于 Git 的源码更新流程。
在更新真实安装之前:
务必先备份数据库。
对于这个学习虚拟机,基本的源码更新流程是:
cd ~/odoo
git fetch
git rebase --autostash
然后重启 Odoo:
sudo systemctl restart odoo
警告: 不要盲目把源码更新应用到包含自定义模块的生产系统。先测试更新。
快速复现摘要
对于全新的 Ubuntu 26.04 测试虚拟机,关键步骤如下:
# Update
sudo apt update
sudo apt upgrade -y
# PostgreSQL
sudo apt install -y postgresql postgresql-client
# System dependencies
sudo apt install -y \
git python3 python3-pip python3-venv python3-dev \
libxml2-dev libxslt1-dev zlib1g-dev \
libsasl2-dev libldap2-dev libssl-dev \
libjpeg-dev libpq-dev libffi-dev \
build-essential
# Odoo source
cd ~
git clone --depth 1 --branch 19.0 \
https://github.com/odoo/odoo.git odoo
# Python environment
cd ~/odoo
python3 -m venv odoo-venv
source odoo-venv/bin/activate
# Python dependencies
pip install -r requirements.txt
# PostgreSQL user/database
sudo -u postgres createuser -d -R -S $USER
createdb $USER
# Start Odoo
./odoo-bin
如果数据库需要初始化:
./odoo-bin -d $USER -i base
然后访问:
http://<VM-IP>:8069
常见问题(FAQ)
问:我可以永久免费运行 Odoo 社区版吗?
答:可以。Odoo 社区版采用 LGPL 许可。没有许可费用,也没有用户数限制。
问:我需要一台性能强劲的服务器吗?
答:不需要。一台 2 GB 内存的小型 VPS 就能为少量用户运行 Odoo。随着团队和数据增长再增加内存。
问:自托管 Odoo 必须用 Docker 吗?
答:不是,但这是最简单的方式。Docker 把 Odoo 和 Postgres 与系统其余部分隔离,让备份和更新更可预测。
问:Odoo 19 需要哪个 PostgreSQL 版本?
答:Odoo 19 支持 PostgreSQL 13 到 17。本指南使用 17,即撰写时最新的稳定版本。
问:Odoo 把上传的文件存在哪里?
答:容器内的 /var/lib/odoo,映射到宿主机上的 odoo-web-data Docker 卷。
资源:




