Deb 包部署 Odoo 18
本指南介绍如何通过官方 Debian 包在 Ubuntu 服务器上部署 Odoo 18。相比 Docker,Deb 部署更贴近传统运维方式,适合需要深度定制系统环境或长期稳定运行的场景。
方案概述
- Odoo:通过官方 deb 包安装,作为系统服务运行。
- PostgreSQL:通过 apt 安装在同一台服务器。
- 代码:自定义模块放在
/opt/odoo/myinstance/addons/,并在配置文件中指定。 - 服务:使用 systemd 管理 Odoo 进程,支持开机自启。
环境要求
- Ubuntu 22.04 LTS(Odoo 18 官方 deb 包推荐环境)。
- 至少 2 核 CPU、4 GB 内存、40 GB 磁盘。
- 拥有 sudo 权限的普通用户。
- 建议关闭或正确配置系统默认的 Odoo 服务,避免端口冲突。
1. 安装 PostgreSQL
sudo apt-get update
sudo apt-get install -y postgresql postgresql-contrib
sudo systemctl enable --now postgresql
创建 odoo 数据库用户:
sudo -u postgres createuser -s odoo
sudo -u postgres psql -c "ALTER USER odoo WITH PASSWORD '你的强密码';"
2. 安装 Odoo 18
从 Odoo 官方 nightly 仓库安装:
wget -q -O - https://nightly.odoo.com/odoo.key | sudo gpg --dearmor -o /usr/share/keyrings/odoo-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/odoo-archive-keyring.gpg] https://nightly.odoo.com/18.0/nightly/deb/ ./" | sudo tee /etc/apt/sources.list.d/odoo.list
sudo apt-get update
sudo apt-get install -y odoo
安装完成后,系统默认会启动一个名为 odoo 的服务,占用 8069 端口。如果你要部署多实例,建议先停止并禁用默认服务:
sudo systemctl stop odoo
sudo systemctl disable odoo
3. 准备实例目录与代码
创建项目目录:
sudo mkdir -p /opt/odoo/myinstance/addons
sudo mkdir -p /opt/odoo/myinstance/config
sudo mkdir -p /var/log/odoo
sudo chown -R odoo:odoo /opt/odoo/myinstance
sudo chown -R odoo:odoo /var/log/odoo
克隆 Odoo 源码和自定义模块:
cd /opt/odoo/myinstance
sudo -u odoo git clone -b 18.0 --depth 1 https://github.com/odoo/odoo.git ./addons/odoo-core
sudo -u odoo git clone https://你的仓库地址 ./addons/my-custom-module
4. 创建 odoo.conf
创建 /opt/odoo/myinstance/config/odoo.conf:
[options]
admin_passwd = 你的强密码
db_host = localhost
db_port = 5432
db_user = odoo
db_password = 你的强密码
db_name = myinstance
db_filter = ^myinstance$
addons_path = /opt/odoo/myinstance/addons/odoo-core/addons,/opt/odoo/myinstance/addons
logfile = /var/log/odoo/myinstance.log
proxy_mode = True
workers = 4
limit_memory_soft = 0
limit_memory_hard = 0
设置权限:
sudo chown -R odoo:odoo /opt/odoo/myinstance/config
5. 创建 systemd 服务
创建 /etc/systemd/system/odoo-myinstance.service:
[Unit]
Description=Odoo 18 - myinstance
After=network.target postgresql.service
[Service]
Type=simple
User=odoo
Group=odoo
ExecStart=/usr/bin/odoo --config /opt/odoo/myinstance/config/odoo.conf
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
启动并启用:
sudo systemctl daemon-reload
sudo systemctl enable --now odoo-myinstance
6. 验证启动
sudo systemctl status odoo-myinstance
sudo tail -f /var/log/odoo/myinstance.log
访问 http://服务器IP:8069,Odoo 会自动创建数据库并进入登录页。
7. 从备份恢复数据库(可选)
如果你有一个 Odoo 备份 zip,可以先用命令行恢复:
sudo -u odoo odoo shell --config /opt/odoo/myinstance/config/odoo.conf -d myinstance --no-http
更常见的方式是临时开启数据库管理器:在 odoo.conf 中注释 db_name 和 db_filter,设置 list_db = True,重启服务后通过 Manage Databases → Restore 上传 zip。
或者使用 curl 调用 Restore API:
curl -X POST \
-F "master_pwd=你的强密码" \
-F "backup_file=@/path/to/backup.zip" \
-F "copy=true" \
-F "name=myinstance" \
http://localhost:8069/web/database/restore
恢复后若遇到 base_registry_signaling 序列冲突,执行:
sudo -u postgres psql -d myinstance -c "DROP SEQUENCE IF EXISTS base_registry_signaling;"
8. 配置 nginx 反向代理(可选)
创建 /etc/nginx/sites-available/myinstance:
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://127.0.0.1:8069;
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;
}
location /longpolling {
proxy_pass http://127.0.0.1:8072;
}
}
启用站点:
sudo ln -s /etc/nginx/sites-available/myinstance /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
常见问题
默认 odoo 服务占用 8069 端口
sudo systemctl stop odoo
sudo systemctl disable odoo
字体警告 Can't find .pfb for face 'Courier'
sudo apt-get install -y gsfonts fonts-dejavu
sudo systemctl restart odoo-myinstance
数据库恢复后登录密码不对
通过 odoo shell 重置指定用户密码:
echo "env['res.users'].search([('login','=','admin')]).write({'password':'新密码'});env.cr.commit()" | \
sudo -u odoo odoo shell --config /opt/odoo/myinstance/config/odoo.conf -d myinstance --no-http
权限问题导致 Odoo 无法写日志
sudo chown -R odoo:odoo /var/log/odoo
sudo chmod 755 /var/log/odoo