Odoo 19 首次登录自动创建数据库方案
——安装后访问即可自动生成 Demo 数据库的完整解决方案
在 Odoo 19 的默认行为中,首次访问系统会停留在数据库选择页(/web/database/selector)。管理员需要手动点击“Create Database”创建一个新的数据库,或从已有库中选择进行登录。
然而在一些场景中,这种默认行为并不符合需求,例如:
- SaaS 模式希望用户首次访问即可获得一个自动创建的试用数据库;
- 内部环境希望 Odoo 安装好即可直接进入系统,无需人工创建数据库;
- Demo/演示环境需要固定生成一个 demo 库并自动跳转进去;
- 自动化部署场景中希望 zero-touch(零操作)体验。
本文将从 原理、实现方式、配置方法、增强方案 四个层面,完整介绍如何在 Odoo 19 中实现“首次访问自动创建数据库” 的能力。
一、Odoo 19 的默认数据库创建行为
Odoo 19 安装后默认启用 dbfilter 机制:
- 未指定数据库时,会进入数据库管理页面。
- 用户需要手动输入数据库名称、管理员邮箱、密码等内容来完成初始化。
这种方式对新手并不友好,也不适用于自动化部署。
二、需求分析:自动创建 Demo 数据库的逻辑
目标行为如下:
- 首次访问 Odoo 入口 /
-
系统检测:
- 是否已经存在 demo 数据库?
- 如果不存在 → 自动创建
- 如果存在 → 自动跳转进入
- 用户无需点击任何按钮即可直接进入后台界面。
自动创建的 Demo 数据库可包含:
- 指定名称(如:demo_db)
- 自动安装选定模块(sales、crm、inventory 等)
- 自动设置管理员密码
- 根据需求注入初始数据
三、实现方案(适用于 Odoo 19)
为了在首次访问时自动创建数据库,我们可以采用以下“三层方案”,你可任选其一或多方案组合。
方案一:使用 --init 参数 + 指定默认数据库(最简单)
适用于 Docker 或命令行部署方式。
1. 启动参数写法
在 odoo.conf 或启动命令中加入:
db_name = demo_db
第一次启动时,如果数据库不存在,Odoo 会自动尝试创建一个同名数据库。
搭配自动安装模块:
init = base,website,sale,crm
2. Docker Compose 示例
command: >
odoo --db_host=db --db_user=odoo --db_password=odoo
--db_name=demo_db
--init=base,website,sale,crm
3. 特点
- 简单稳定
- 不需要开发
- 但不支持高级逻辑(例如首次访问检测、跳转控制等)
方案二:通过反向代理强制路径跳转(zero-touch 体验)
让用户访问 / 时直接跳转到自动创建数据库的 URL。
Nginx 示例:
location / {
return 302 /web?db=demo_db;
}
如果 Odoo 配置中启用了自动创建数据库(方案一),此方式可做到真正意义上的:
安装 → 启动 → 浏览器访问 → 自动进入后台
方案三(推荐):开发一个自动初始化模块(Auto DB Creator)
这是最灵活、可扩展、最符合生产环境 SaaS/自用需求的方案。
核心思路
编写自定义模块,在用户首次访问 Odoo 路由时执行以下逻辑:
- 调用 Odoo API 检查 demo_db 是否存在
- 如果不存在 → 调用 Odoo 的内部服务自动创建
- 创建完成后自动重定向 /web?db=demo_db
- 管理员初始密码从配置或环境变量读取
- 可自动安装一组模块
- 可自动导入 demo 数据
代码设计结构
auto_db_creator/
├── __manifest__.py
├── controllers/
│ └── main.py
└── data/
└── auto_init.xml
controller(核心判断逻辑)
from odoo import http
from odoo.http import request
class AutoDBCreator(http.Controller):
@http.route('/', type='http', auth='none')
def auto_create_db(self, **kwargs):
db_list = http.db_list()
target_db = 'demo_db'
if target_db not in db_list:
# 自动创建数据库
request.env['ir.http'].sudo()._create_database(
target_db,
admin_password='admin',
demo=True,
lang='zh_CN'
)
# 自动跳转进入系统
return http.redirect_with_hash('/web?db=%s' % target_db)
特点
- 可自动安装模块
- 控制复杂逻辑(首次访问才触发)
- 可用于 SaaS 平台批量创建示例数据库
- 扩展能力强,可加入审计、初始化数据、二级跳转等功能
四、进阶:自动生成多个数据库(可用于 SaaS)
如果你需要根据子域名或 URL 自动创建数据库,可以结合 Odoo 自带的 dbfilter:
dbfilter = ^%h$
示例:
访问:
abc.myodoo.com
系统自动创建并加载:
abc
结合本文的自动创建模块即可实现 动态数据库创建。
五、部署建议
为了减少维护成本,推荐方式如下:
-
-
Docker + 配置文件方式
→ 自动指定 db_name + 安装模块
-
Docker + 配置文件方式
-
自定义自动创建模块
→ 控制初始化行为、跳转、数据模板
-
自定义自动创建模块
-
反向代理跳转
→ 让用户无感进入数据库
-
反向代理跳转
三者组合可实现最佳体验。
六、典型使用场景
| 场景 | 推荐方案 |
|---|---|
| 官方 Demo 演示 | 方案一 + 方案二 |
| 内部 ERP 自动部署 | 方案一 |
| SaaS 自动创建多租户 | 方案三(模块) |
| 零交互安装体验 | 方案一 + 反向代理跳转 |
