docker搭建odoo企业管理开源解决方案

搭建erp用于远程协作, 团队协作, 远程办公

有什么用/怎么用

如何安装部署Odoo社区版

​ 部分模块免费的; 安装有2中方式: 源码在操作系统中安装配置 和 Docker安装部署

​ 可升级使用一些收费的功能模块

如何安装Odoo企业版

​ 收费的; 有试用期

https://system0.carlzeng.com:3/web/login

相关内容

社区版Docker安装实现方法

需要准备的目录有:

Odoo ERP的部分

​ odoo-web-data

​ config

​ addons

Odoo 数据库的部分:

​ odoo-db-data

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
version: '3.1'
services:
web:
image: odoo:17.0
depends_on:
- odoodb
ports:
- "8069:8069"
volumes:
- ./odoo-web-data:/var/lib/odoo
#- ./config:/etc/odoo
#- ./addons:/mnt/extra-addons
environment:
- HOST=odoodb
- USER=odoo
- PASSWORD=myodoo20250401
odoodb:
image: postgres:15
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=odoo
- POSTGRES_PASSWORD=myodoo20250401
- PGDATA=/var/lib/postgresql/data/pgdata
volumes:
- ./odoo-db-data:/var/lib/postgresql/data/pgdata

运行命令:

1
2
3
4
5
6
7
cd ~
mkdir odoo
cd odoo
mkdir odoo-web-data && mkdir config && mkdir addons && mkdir odoo-db-data
vi docker-compose.yaml

docker-compose up

访问 http://192.168.6.117:8069

Internal Server Error
The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.

后台显示的错误以及解决办法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
web-1     | 2025-04-01 13:30:10,775 1 ERROR ? odoo.http: Exception during request handling.              
web-1 | Traceback (most recent call last):
web-1 | File "/usr/lib/python3/dist-packages/odoo/http.py", line 2206, in __call__
web-1 | request._post_init()
web-1 | File "/usr/lib/python3/dist-packages/odoo/http.py", line 1391, in _post_init
web-1 | self.session, self.db = self._get_session_and_dbname()
web-1 | File "/usr/lib/python3/dist-packages/odoo/http.py", line 1397, in _get_session_and_dbname
web-1 | session = root.session_store.new()
web-1 | File "/usr/lib/python3/dist-packages/odoo/tools/func.py", line 28, in __get__
web-1 | value = self.fget(obj)
web-1 | File "/usr/lib/python3/dist-packages/odoo/http.py", line 2132, in session_store
web-1 | path = odoo.tools.config.session_dir
web-1 | File "/usr/lib/python3/dist-packages/odoo/tools/config.py", line 766, in session_dir
web-1 | os.makedirs(d, 0o700)
web-1 | File "/usr/lib/python3.10/os.py", line 225, in makedirs
web-1 | mkdir(name, mode)
web-1 | PermissionError: [Errno 13] Permission denied: '/var/lib/odoo/sessions'
web-1 | 2025-04-01 13:30:10,776 1 INFO ? werkzeug: 192.168.6.221 - - [01/Apr/2025 13:30:10] "GET /fav
icon.ico HTTP/1.1" 500 - 0 0.000 0.001
1
2
3
4
5
6
7
#解决办法:

$ sudo chmod -R 777 addons
$ sudo chmod -R 777 config
$ sudo chmod -R 777 odoo-db-data
$ sudo chmod -R 777 odoo-web-data

设置好权限以后, 可以运行访问网页

image-20250401213614590

企业版Odoo安装步骤

下载网盘地址 https://drive.google.com/drive/folders/1VUujb8d9Y1sQ98xA0jk4WZteryn0oOoe

How to install Odoo Enterprise.

1: download and install community edition.
2: download the zip file called addons-18e.zip and put it into /usr/lib/python3/dist-packages
3: extract the file and allow overwrite all
4: restart odoo server & update apps
5: download odoo18_unlimited.zip from the same drive link
6: unzip odoo18_unlimited.zip into your addons directory (try to keep separate from main odoo addons.
7: restart odoo server again and then update apps in odoo
8: activate odoo_unlimited
9: install accounting module
10: activate odoo
11: All done

本小节来源: https://babia.to/threads/odoo-enterprise.37673/page-100

1. download and install community edition

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mkdir odoo18e
cd odoo18e
docker pull odoo:18.0-20241125

#选了半天, 只知道是16版本, 先试试16.9; 在https://hub.docker.com/_/postgres找到的tag
docker pull postgres:16.9





mkdir odoo-web-data && mkdir config && mkdir addons && mkdir odoo-db-data
mkdir dist-packages
vi docker-compose.yaml


$ sudo chmod -R 777 addons
$ sudo chmod -R 777 config && sudo chmod -R 777 odoo-db-data && sudo chmod -R 777 odoo-web-data && sudo chmod -R 777 dist-packages

docker-compose up

docker pull odoo:18.0-20241125

[MARK] 第一步就有问题, 需要安装特定的deb文件

https://drive.google.com/drive/folders/1phzmPK7nQ65WKCqAa_N25OupxKMAfxFF

然后在: 2: download the zip file called addons-18e.zip and put it into /usr/lib/python3/dist-packages

关键就是这个deb文件和docker pull 到的 ce版本不一样!

问题变成: 如何让deb在docker中运行, 在自动解压和覆盖一个addons-18e.zip文件到目录/usr/lib/python3/dist-packages;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
docker exec -it --user root odoo18e-web-1 /bin/bash



find / -name odoo
/usr/bin/odoo
/usr/share/doc/odoo
/usr/share/lintian/overrides/odoo
/usr/lib/python3/dist-packages/point_of_sale/tools/posbox/overwrite_before_init/etc/logrotate.d/odoo
/usr/lib/python3/dist-packages/point_of_sale/tools/posbox/overwrite_after_init/home/pi/odoo
/usr/lib/python3/dist-packages/odoo
/usr/lib/python3/dist-packages/dist-packages2/odoo
/etc/init.d/odoo
/etc/logrotate.d/odoo
/etc/odoo
/mnt/extra-addons/point_of_sale/tools/posbox/overwrite_before_init/etc/logrotate.d/odoo
/mnt/extra-addons/point_of_sale/tools/posbox/overwrite_after_init/home/pi/odoo
/var/log/odoo
/var/lib/odoo



find / -name odoo.conf
/usr/lib/python3/dist-packages/point_of_sale/tools/posbox/configuration/odoo.conf
/etc/odoo/odoo.conf
/mnt/extra-addons/point_of_sale/tools/posbox/configuration/odoo.conf


service odoo restart




然后在解压 6: unzip odoo18_unlimited.zip into your addons directory (try to keep separate from main odoo addons.

7: restart odoo server again and then update apps in odoo

8: activate odoo_unlimited
9: install accounting module
10: activate odoo

这些能用dockerfile来完成吗?

使用docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
version: '3.1'
services:
web1:
image: odoo:17.0
depends_on:
- odoodb2
ports:
- "8070:8069"
volumes:
- ./odoo-web-data:/var/lib/odoo
# - ./config:/etc/odoo
- ./addons:/mnt/extra-addons
- ./dist-packages:/usr/lib/python3/dist-packages
environment:
- HOST=odoodb2
- USER=odoo
- PASSWORD=myodoo20250713
odoodb2:
image: postgres:15
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=odoo
- POSTGRES_PASSWORD=myodoo20250713
- PGDATA=/var/lib/postgresql/data/pgdata2
volumes:
- ./odoo-db-data:/var/lib/postgresql/data/pgdata2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
odoodb-1  | PostgreSQL Database directory appears to contain a database; Skipping initialization
odoodb-1 |
odoodb-1 | 2025-07-13 14:53:40.108 UTC [1] LOG: starting PostgreSQL 15.12 (Debian 15.12-1.pgdg120+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 12.2.0-14) 12.2.0, 64-bit
odoodb-1 | 2025-07-13 14:53:40.108 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
odoodb-1 | 2025-07-13 14:53:40.108 UTC [1] LOG: listening on IPv6 address "::", port 5432
odoodb-1 | 2025-07-13 14:53:40.119 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
odoodb-1 | 2025-07-13 14:53:40.129 UTC [29] LOG: database system was shut down at 2025-07-13 14:53:13 UTC
odoodb-1 | 2025-07-13 14:53:40.138 UTC [1] LOG: database system is ready to accept connections
web-1 | Traceback (most recent call last):
web-1 | File "/usr/local/bin/wait-for-psql.py", line 3, in <module>
web-1 | import psycopg2
web-1 | ModuleNotFoundError: No module named 'psycopg2'
web-1 exited with code 1

把odoo:18.0-20241125 换成了odoo18

故障依旧

把odoo:18 换成能正常使用的 odoo:17

故障依旧, 说明不是odoo包本身的问题.

成功使用18.0-20241125版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
version: '3.1'
services:
web:
image: odoo:18.0-20241125
depends_on:
- odoodb
ports:
- "8070:8069"
volumes:
- ./odoo-web-data:/var/lib/odoo
#- ./config:/etc/odoo
- ./addons:/mnt/extra-addons
#- ./dist-packages:/usr/lib/python3/dist-packages
environment:
- HOST=odoodb
- USER=odoo
- PASSWORD=myodoo20250713
odoodb:
image: postgres:15
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=odoo
- POSTGRES_PASSWORD=myodoo20250713
- PGDATA=/var/lib/postgresql/data/pgdata
volumes:
- ./odoo-db-data:/var/lib/postgresql/data/pgdata

下一步 进一步把配置的目录都逐一映射出来

原因是这个: - ./dist-packages:/usr/lib/python3/dist-packages 一旦添加这个, 就会报错误, 原因是系统里面有内容, 而映射出来的目录是空的. 需要先运行起来以后, 然后把 docker里面的dist-packages内容都复制出来,然后在添加映射.

image-20250714231620552

image-20250714231811031

2: download the zip file called addons-18e.zip and put it into /usr/lib/python3/dist-packages

通过复制出来的方式, 添加addons-18e.zip, 可是…

docker cp 容器Id或name:容器内路径 本地文件夹路径
docker cp containername:/usr/share/nginx/html /volume2/KingchuxingSSD512G/docker/compose/it-tools/html

docker cp b55461b312c7:/usr/lib/python3/dist-packages /root/odoo18e/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
root@debian12:~/odoo18e/dist-packages# ls
Babel-2.10.3.egg-info _distutils_hack
Jinja2-3.1.2.egg-info _ldap.cpython-312-x86_64-linux-gnu.so
MarkupSafe-2.1.5.egg-info _rjsmin.cpython-312-x86_64-linux-gnu.so
OpenSSL _sass.abi3.so
PIL _yaml
PyPDF2 asn1crypto
PyYAML-6.0.1.dist-info asn1crypto-1.5.1.egg-info
Unidecode-1.3.8.egg-info attr
XlsxWriter-3.1.9.egg-info attrs
__pycache__ attrs-23.2.0.dist-info
_cbor2.cpython-312-x86_64-linux-gnu.so babel
_cffi_backend.cpython-312-x86_64-linux-gnu.so

root@debian12:~/odoo18e/dist-packages# cd ..
root@debian12:~/odoo18e# ls
addons config dist-packages docker-compose.yaml odoo-db-data odoo-web-data
root@debian12:~/odoo18e# docker cp b55461b312c7:/usr/lib/python3/dist-packages /root/odoo18e/
invalid symlink "/root/odoo18e/dist-packages/babel/global.dat" -> "../../../../share/python-babel-localedata/global.dat"
root@debian12:~/odoo18e# docker cp b55461b312c7:/usr/lib/python3/dist-packages /root/odoo18e/
invalid symlink "/root/odoo18e/dist-packages/babel/global.dat" -> "../../../../share/python-babel-localedata/global.dat"

有没有其他办法永久性改变docker中的某个特定目录内容?

临时的workaround: 直接复制到docker中去, 每次 重启docker 都要重新去复制进去, 然后解压缩, 覆盖

Steps:

  1. 复制本机addons-18e.zip到debian12的目录中去/root/odoo18e/

    1. scp -P 22226 /Users/carlzeng/Downloads/addons-18e.zip carlzeng@127.0.0.1:/home/carlzeng/addons-18e.zip

    2. 由于权限的缘故, 只能先传输到目录: /home/carlzeng

    3. scp -P 22226 /Users/carlzeng/Downloads/addons-18e.zip carlzeng@127.0.0.1:/home/carlzeng/addons-18e.zip

      carlzeng@127.0.0.1‘s password:

      stalledaddaddaddaddons-18e.zip 14% 55MB 4.6MB/s 01:11 ETA

    4. ssh进入debian12的root, 然后复制到root用户目录/root/odoo18e/

    5. cp /home/carlzeng/addons-18e.zip /root/odoo18e/addons-18e.zip

    6. 解压缩在/root/odoo18e/

      1. unzip addons-18e.zip
      2. 生成出来addons文件夹
  2. 复制debian12中的addons-18e.zip到docker的/usr/lib/python3/dist-packages中去

    1. docker cp /root/odoo18e/addons-18e.zip b55461b312c7:/usr/lib/python3/dist-packages/addons-18e.zip
    2. 成功了, 但是docker中无法运行unzip(没有安装, 且无法安装)
    3. 复制debian12中的addons文件夹(以及下面的所有文件和文件夹)到docker的/usr/lib/python3/dist-packages中去
    4. docker cp /root/odoo18e/addons/ b55461b312c7:/usr/lib/python3/dist-packages/
  3. [忽略]docker exec -it 进入docker的目录进行addons-18e.zip解压缩并覆盖

    1. unzip archive_name.zip`:这将解压缩ZIP文件到当前目录。

    2. tar 无法解压缩.zip文件.

    3. odoo@b55461b312c7:/usr/lib/python3/dist-packages$ apt-get install zip

      E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied)

      E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), are you root?

    4. 如何在docker中解压缩?

docker cp 忽略某个文件

先使用

tar -zcvf archive.tar.gz –exclude=/usr/lib/python3/dist-packages/babel/global.dat /usr/lib/python3/dist-packages

1
2
3
4
5
6
7
8
9
10
11
tar -zcvf archive.tar.gz dist-packages
tar (child): archive.tar.gz: Cannot open: Permission denied
tar (child): Error is not recoverable: exiting now
dist-packages/
dist-packages/num2words-0.5.13.egg-info/
dist-packages/num2words-0.5.13.egg-info/requires.txt
dist-packages/num2words-0.5.13.egg-info/PKG-INFO
tar: archive.tar.gz: Cannot write: Broken pipe
tar: Child returned status 2
tar: Error is not recoverable: exiting now

20250715思路:

可以使用UI工具, 浏览 和 打包整个/dist-packages/文件夹, 然后拿到容器外面来修改

使用类似这样的批量命令复制全部

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/_cbor2.cpython-312-x86_64-linux-gnu.so  /root/odoo18e/dist-packages/ 
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/_cffi_backend.cpython-312-x86_64-linux-gnu.so /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/_ldap.cpython-312-x86_64-linux-gnu.so /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/_rjsmin.cpython-312-x86_64-linux-gnu.so /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/_sass.abi3.so /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/cached_property.py /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/decorator.py /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/distutils-precedence.pth /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/docopt.py /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/ldapurl.py /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/ldif.py /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/png.py /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/polib.py /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pyasn1_modules-0.2.8.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pycairo-1.25.1.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pysassc.py /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/requests_file.py /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/rjsmin.py /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/roman.py /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/sass.py /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/six.py /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/typing_extensions.py /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/zope.event-5.0-nspkg.pth /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/zope.interface-6.1-nspkg.pth

web-1 | ImportError: cannot import name ‘localedata’ from partially initialized module ‘babel’ (most likely due to a circular import) (/usr/lib/python3/dist-packages/babel/init.py)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
名称  /root/odoo18e/dist-packages/ 
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/Babel-2.10.3.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/Jinja2-3.1.2.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/MarkupSafe-2.1.5.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/OpenSSL /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/PIL /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/PyPDF2 /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/PyYAML-6.0.1.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/Unidecode-1.3.8.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/XlsxWriter-3.1.9.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/__pycache__ /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/_distutils_hack /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/_yaml /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/asn1crypto /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/asn1crypto-1.5.1.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/attr /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/attrs /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/attrs-23.2.0.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/babel /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/beautifulsoup4-4.12.3.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/bs4 /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/cached_property-1.5.2.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/cairo /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/cbor2 /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/cbor2-5.6.2.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/certifi /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/certifi-2023.11.17.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/chardet /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/chardet-5.2.0.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/charset_normalizer /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/charset_normalizer-3.3.2.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/cryptography /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/cryptography-41.0.7.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/cryptography.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/dateutil /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/decorator-5.1.1.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/defusedxml /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/defusedxml-0.7.1.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/docopt-0.6.2.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/docutils /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/docutils-0.20.1.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/et_xmlfile /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/et_xmlfile-1.0.1.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/freetype /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/freetype_py-2.4.0.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/freezegun /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/freezegun-1.2.1.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/geoip2 /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/geoip2-2.9.0.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/gevent /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/gevent-24.2.1.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/greenlet /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/greenlet-3.0.3.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/gyp /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/gyp-0.1.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/idna /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/idna-3.6.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/isodate /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/isodate-0.6.1.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/jinja2 /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/ldap /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/libsass-0.22.0.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/lxml /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/lxml-5.2.1.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/lxml_html_clean /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/lxml_html_clean-0.1.1.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/magic /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/markupsafe /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/maxminddb /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/maxminddb-2.5.2.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/num2words /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/num2words-0.5.13.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/odf /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/odfpy-1.4.2.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/odoo /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/odoo-18.0.post20241125.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/ofxparse /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/ofxparse-0.21.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/openpyxl /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/openpyxl-3.1.2.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/passlib /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/passlib-1.7.4.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pdfminer /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pdfminer.six-20221105.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/phonenumbers /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/phonenumbers-8.12.57.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pillow-10.2.0.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pip /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pip-24.0.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pkg_resources /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/platformdirs /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/platformdirs-4.2.0.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/polib-1.1.1.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/psutil /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/psutil-5.9.8.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/psycopg2 /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/psycopg2-2.9.9.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pyOpenSSL-23.2.0.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pyasn1 /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pyasn1-0.4.8.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pyasn1_modules /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pypdf2-2.12.1.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pypng-0.20231004.0.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pyserial-3.5.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/python_dateutil-2.8.2.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/python_ldap-3.4.4.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/python_magic-0.4.27.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/python_slugify-8.0.4.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/python_stdnum-1.19.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pytz /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pytz-2024.1.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/pyusb-1.2.1.post2.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/qrcode /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/qrcode-7.4.2.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/reportlab /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/reportlab-4.1.0.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/requests /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/requests-2.31.0.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/requests_file-1.5.1.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/requests_toolbelt /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/requests_toolbelt-1.0.0.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/rjsmin-1.2.0.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/rlPyCairo /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/rlPyCairo-0.3.0.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/roman-3.3.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/sassutils /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/serial /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/setuptools /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/setuptools-68.1.2.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/six-1.16.0.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/slapdtest /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/slugify /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/soupsieve /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/soupsieve-2.5.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/stdnum /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/typing_extensions-4.10.0.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/unidecode /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/urllib3 /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/urllib3-2.0.7.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/usb /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/vobject /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/vobject-0.9.6.1.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/watchdog /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/watchdog-3.0.0.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/werkzeug /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/werkzeug-3.0.1.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/wheel /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/wheel-0.42.0.dist-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/xlrd /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/xlrd-2.0.1.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/xlsxwriter /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/xlwt /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/xlwt-1.3.0.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/yaml /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/zeep /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/zeep-4.2.1.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/zope /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/zope.event-5.0.egg-info /root/odoo18e/dist-packages/
docker cp 8d0116c1f93d:/usr/lib/python3/dist-packages/zope.interface-6.1.egg-info

image-20250715230700882

复制完成了babel文件夹下面的所有文件, 不包含那些连接文件的2个文件

运行报错:

1
2
3
4
5
6
7
8
9
10
11
12
13
odoodb-1  | 2025-07-15 15:13:35.829 UTC [1] LOG:  database system is ready to accept connections
web-1 | Traceback (most recent call last):
web-1 | File "/usr/bin/odoo", line 5, in <module>
web-1 | import odoo
web-1 | File "/usr/lib/python3/dist-packages/odoo/__init__.py", line 49, in <module>
web-1 | _monkeypatches.patch_all()
web-1 | File "/usr/lib/python3/dist-packages/odoo/_monkeypatches/__init__.py", line 31, in patch_all
web-1 | patch_werkzeug()
web-1 | File "/usr/lib/python3/dist-packages/odoo/_monkeypatches/werkzeug_urls.py", line 1044, in patch_werkzeug
web-1 | from ..tools.json import scriptsafe # noqa: PLC0415
web-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web-1 | ModuleNotFoundError: No module named 'odoo.tools'
web-1 exited with code 1

先把addons-18e.zip unzip到dist-packages目录下, 在看看错误会不会自己消失?

cp -r addons/* dist-packages/

还是依旧报同样上方的错误

0716 检查出来: 原来

docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo /root/odoo18e/dist-packages/

invalid symlink “/root/odoo18e/dist-packages/odoo/addons/point_of_sale/static/src/fonts/Inconsolata.otf” -> “../../../../../../../../../share/fonts/truetype/inconsolata/Inconsolata.otf”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo/cli  /root/odoo18e/dist-packages/odoo/ 
docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo/conf /root/odoo18e/dist-packages/odoo/
docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo/exceptions.py /root/odoo18e/dist-packages/odoo/
docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo/fields.py /root/odoo18e/dist-packages/odoo/
docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo/http.py /root/odoo18e/dist-packages/odoo/
docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo/import_xml.rng /root/odoo18e/dist-packages/odoo/
docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo/loglevels.py /root/odoo18e/dist-packages/odoo/
docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo/models.py /root/odoo18e/dist-packages/odoo/
docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo/modules /root/odoo18e/dist-packages/odoo/
docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo/netsvc.py /root/odoo18e/dist-packages/odoo/
docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo/osv /root/odoo18e/dist-packages/odoo/
docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo/release.py /root/odoo18e/dist-packages/odoo/
docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo/service /root/odoo18e/dist-packages/odoo/
docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo/sql_db.py /root/odoo18e/dist-packages/odoo/
docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo/tests /root/odoo18e/dist-packages/odoo/
docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo/tools /root/odoo18e/dist-packages/odoo/
docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo/upgrade /root/odoo18e/dist-packages/odoo/
docker cp 17c661c4ff14:/usr/lib/python3/dist-packages/odoo/upgrade_code /root/odoo18e/dist-packages/odoo/

终于解决了错误; 错误变了

1
2
3
4
5
6
7
8
9
web-1     |   File "/usr/lib/python3/dist-packages/odoo/_monkeypatches/werkzeug_urls.py", line 1044, in patch_werkzeug
web-1 | from ..tools.json import scriptsafe # noqa: PLC0415
web-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web-1 | File "/usr/lib/python3/dist-packages/odoo/tools/__init__.py", line 8, in <module>
web-1 | from . import pdf
web-1 | File "/usr/lib/python3/dist-packages/odoo/tools/pdf/__init__.py", line 13, in <module>
web-1 | from reportlab.lib import colors
web-1 | ModuleNotFoundError: No module named 'reportlab.lib'
web-1 exited with code 1

image-20250716215307666

docker cp f9f29717401a:/usr/lib/python3/dist-packages/reportlab/graphics /root/odoo18e/dist-packages/reportlab/

docker cp f9f29717401a:/usr/lib/python3/dist-packages/reportlab/lib /root/odoo18e/dist-packages/reportlab/

docker cp f9f29717401a:/usr/lib/python3/dist-packages/reportlab/pdfbase /root/odoo18e/dist-packages/reportlab/

docker cp f9f29717401a:/usr/lib/python3/dist-packages/reportlab/pdfgen /root/odoo18e/dist-packages/reportlab/

docker cp f9f29717401a:/usr/lib/python3/dist-packages/reportlab/platypus /root/odoo18e/dist-packages/reportlab/

docker cp f9f29717401a:/usr/lib/python3/dist-packages/reportlab/rl_config.py /root/odoo18e/dist-packages/reportlab/

docker cp f9f29717401a:/usr/lib/python3/dist-packages/reportlab/rl_settings.py /root/odoo18e/dist-packages/reportlab/

6: unzip odoo18_unlimited.zip into your addons directory (try to keep separate from main odoo addons.

  1. scp -P 22226 /Users/carlzeng/Downloads/odoo18_unlimited.zip carlzeng@127.0.0.1:/home/carlzeng/odoo18_unlimited.zip

    carlzeng@127.0.0.1‘s password:

    odoo18_unlimited.zip 100% 2105 34.0KB/s 00:00

  2. ssh进入debian12的root, 然后复制到root用户目录/root/odoo18e/

  3. cp /home/carlzeng/odoo18_unlimited.zip /root/odoo18e/odoo18_unlimited.zip

  4. 解压缩在/root/odoo18e/

    1. unzip odoo18_unlimited.zip

      Archive: odoo18_unlimited.zip

      creating: odoo_unlimited/

      creating: odoo_unlimited/models/

      inflating: odoo_unlimited/models/update.py

      inflating: odoo_unlimited/models/init.py

      inflating: odoo_unlimited/init.py

      inflating: odoo_unlimited/manifest.py

    2. 生成出来odoo_unlimited文件夹

  5. 把新生成的odoo_unlimited文件夹放到 addons文件夹中去

  6. cp -r odoo_unlimited ./addons/

  7. 核实/编辑docker-compose, 确保 - ./addons:/mnt/extra-addons

如何在UI上更新应用? 刷新

更新应用列表和安装/升级应用。首先,需要激活开发者模式,然后更新应用列表。更新完成后,就可以搜索并安装或升级需要的应用。

8: activate odoo_unlimited

搜索的页面, 默认选择了‘应用’, 这时无法搜索到odoo_unlimited. 需要先删除掉‘应用’这个filter.

9: install accounting module

成功安装, 但是会报JS错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Odoo客户端错误
UncaughtClientError > TypeError

Uncaught Javascript Error > this.titleService.setCounters is not a function

Occured on o.carlzeng.com on 2025-07-16 14:45:02 GMT

TypeError: this.titleService.setCounters is not a function
clearUnreadMessage@https://o.carlzeng.com/web/assets/f5ab0f4/web.assets_web.min.js:15472:658
setup/<@https://o.carlzeng.com/web/assets/f5ab0f4/web.assets_web.min.js:15472:539
trigger@https://o.carlzeng.com/web/assets/f5ab0f4/web.assets_web.min.js:745:63
onFocusChange@https://o.carlzeng.com/web/assets/f5ab0f4/web.assets_web.min.js:10466:168
start/<@https://o.carlzeng.com/web/assets/f5ab0f4/web.assets_web.min.js:10469:97

4: restart odoo server & update apps

无法完成, 因为一重启docker, 上一步复制进去的内容就全部消失, 洗干净了.

根据odoo_18.0.2024-11-25.deb文件制作dockerfile

根据18.0的https://github.com/odoo/docker/blob/b254689862e8a1bbb9624bf86022867544582dd2/18.0/Dockerfile

待测试

Odoo定制单据打印的PDF内容

激活开发者模式后,可在”设置->技术->用户界面->视图”搜索和编辑视图:

image-20250403175105057

可以看到打印模板视图是QWeb视图。QWeb是一个基于XML的模板引擎,用于生成HTML片段和界面。模板命令是写在XML标签内以”t-“开头的属性。

以报价单打印模板为例,可通过“t-field=doc.字段名”输出单据头体信息:

功能定制

odoo产品目录树 父子产品

需求: 比如实现如PS5; PS5更换霍尔摇杆这样的子产品; 或者说产品分类

实现:

  1. 启用: 库存

要设置产品类型,请转到 库存应用程序 ‣ 产品 ‣ 产品,然后从列表中选择所需的产品。

在产品表单的 产品类型 字段中

Product Type

https://system0.carlzeng.com:3/web#action=173&model=product.category&view_type=list&cids=1&menu_id=229

odoo没有父子产品的概念

可以设置系统字段: Category

odoo配置邮件发送

因为收不到邮件, 管理员新建的用户, 无法完成密码设置, 导致新用户无法进入系统

收不到Email的情况下, 如何新建用户?

直接在登录页面注册, 然后管理员到后台修改.

发现: 访问权限 中无法设置权限.

解决办法: 直接在用户设置页面的; 设置(齿轮图标) - 修改密码

销售模块

如何关闭报价单模块

无法关闭, 需关闭整个‘销售’应用模块才行; 而这样做就偏离了预期

如何设置默认视图, 这样一打开就看到 销售订单/订单

或者如何在odoo中自定义页头的菜单; 这样我新建一个菜单, 比如叫做 ‘打开订单列表’ 就时默认的销售订单.

解决办法: 设置菜单, 自定义. Setting - Technical - User Interface - Menu Items

如何直接创建一个销售订单

如何直接创建一个销售订单, 而不是每次都从报价单开始

折中方案: 每次在手机上创建好报价单后, 点击‘Confirm’ 确认, 确定为销售订单.

如何修改销售订单的表单?

想要把 ‘客户参考号’放到主页面Main的部位, 方便手机用户查看 和录入/核实

From View

Odoo Form View Customization Step-by-Step Guide

改了半天把系统改坏了怎么办?

image-20260128223756130

删除了docker17的镜像; 重新让docker-compose从远程拉去镜像,

数据库不动

单单删除镜像是没用的,

1
- ./odoo-web-data:/var/lib/odoo                 

把这个存储在本地的删除掉; 还是不行, 无法恢复到docker刚安装时的默认状态…

把pg数据库备份出来;

image-20260128225511869

重新在一个目录创建容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
version: '3.1'
services:
web:
image: odoo:17.0
depends_on:
- odoodb
ports:
- "8069:8069"
volumes:
- ./config:/etc/odoo
- ./addons:/mnt/extra-addons
environment:
- HOST=odoodb
- USER=odoo
- PASSWORD=myodoo20250401
odoodb:
image: postgres:15
ports:
- "5435:5432"
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=odoo
- POSTGRES_PASSWORD=myodoo20250401
- PGDATA=/var/lib/postgresql/data/pgdata
volumes:
- ./odoo-db-data:/var/lib/postgresql/data/pgdata

image-20260128230432486

Database restore error: Couldn’t restore database

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
services:
odoo:
image: odoo:18.0
container_name: odoo_web
restart: always
depends_on:
- postgres
ports:
- "8069:8069"
volumes:
- ./odoo-web-data:/var/lib/odoo
- ./config:/etc/odoo
- ./addons:/mnt/extra-addons
environment:
- HOST=postgres
- POSTGRES_DB=postgres
- POSTGRES_USER=odoo
- POSTGRES_PASSWORD=odoo20260202

postgres:
image: postgres:15
container_name: odoo_postgres
restart: always
volumes:
- ./odoo-db-data:/var/lib/postgresql/data
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=odoo
- POSTGRES_PASSWORD=odoo20260202
- PGDATA=/var/lib/postgresql/data

如果Permission denied报错

1
| PermissionError: [Errno 13] Permission denied: '/var/lib/odoo/.local' 
1
2
sudo chown -R 101:101 odoo-web-data
sudo chmod -R 775 odoo-web-data

本小结鸣谢: Docker Compose 快速安裝 Odoo

创建Sandbox环境

使用单独的文件目录

1
~/odoo16sandbox
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
mkdir odoo16sandbox && cd odoo16sandbox
mkdir -p {addons,config,data,odoo-db-data,oca-addons,odoo-web-data}

sudo chown -R 101:101 odoo-web-data
sudo chmod -R 775 odoo-web-data

nano docker-compose.yaml


services:
# PostgreSQL 数据库(适配 Odoo 16 的 14 版本)
dbsb1:
image: postgres:14-alpine
container_name: odoo16-db-sb1
environment:
- POSTGRES_USER=odoo
- POSTGRES_PASSWORD=odoo20260202
- POSTGRES_DB=postgres
volumes:
- ./data/postgres:/var/lib/postgresql/data
restart: always

# Odoo 16 CE 主服务(挂载 OCA 会计模块)
odoosb1:
image: odoo:16.0
container_name: odoo16-app-sb1
depends_on:
- dbsb1
ports:
- "8070:8069"
environment:
- HOST=dbsb1
- USER=odoo
- PASSWORD=odoo20260202
# 核心:挂载自定义模块 + OCA 会计模块目录
- ADDONS_PATH=/mnt/addons,/mnt/oca-addons
volumes:
- ./config/odoo.conf:/etc/odoo/odoo.conf
- ./addons:/mnt/addons
- ./oca-addons:/mnt/oca-addons
- ./data/odoo:/var/lib/odoo
restart: always
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
PermissionError: [Errno 13] Permission denied: '/var/lib/odoo/.local' 


sudo chown -R 101:101 odoo-web-data
sudo chmod -R 775 odoo-web-data
$ sudo chmod -R 777 addons
$ sudo chmod -R 777 config
$ sudo chmod -R 777 odoo-db-data

sudo chmod -R 775 odoo-db-data
没有解决

rm -r odoo-web-data/ && mkdir odoo-web-data
没解决
rm -r odoo-db-data/ && mkdir odoo-db-data
没解决

sudo chown -R 100:101 odoo-web-data
没解决
sudo chown -R 100:101 odoo-db-data/
没解决

sudo chmod -R 777 ./data/odoo
解决了!
原来是提示的意思是: Permission denied: '/var/lib/odoo/.local' 对这个目录没有执行权限, 而这个/var/lib/odoo 映射为 ./data/odoo目录了. 只要解决这个目录的权限问题, 报错就解决了

访问和调试sandbox: http://192.168.6.117:8070/

如何增加并开启Add-ons

1
2
3
4
5
6
7
8
9
10
放到 addons 目录下
mv reporting-engine/* ./

rm -rf reporting-engine # 删除空目录



docker exec -it odoo16-app-sb1 bash
pip3 install xlsxwriter reportlab barcode python-barcode

1
docker exec -it odoo16-app-sb1 bash

docker部署的odoo16, 所有的addons都没有添加到odoo系统, 不知道问题出在哪里了?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
odoo.conf

dbfilter = .*



命令方式:
odoo --db-filter=.



调整映射
volumes:
- ./config/odoo.conf:/etc/odoo/odoo.conf
生效了, 问题的关键
生效了, 问题的关键
生效了, 问题的关键

手动新建的模块 custom_footer_js 无法显示/安装

兜底方案:如果仍未解决,可直接将模块复制到 Odoo 默认的 extra-addons 目录(/mnt/extra-addons),该目录默认会被扫描,验证模块本身是否有问题。

1
2
3
添加: 
volumes:
- ./extra-addons:/mnt/extra-addons

The database manager has been disabled by the administrator

通过这个参数调整odoo.conf文件内容: list_db = False

Sample odoo.conf

1
2
3
4
5
6
7
8
9
10
[options]
db_host = dbsb1
db_port = 5432
db_user = odoo
db_password = odoo20260202

addons_path = /mnt/addons,/mnt/oca-addons

dbfilter = .*
list_db = False

odoo database expiration Fix

没有会计/财务模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
version: '3.8'

services:
# PostgreSQL 数据库(适配 Odoo 16 的 14 版本)
db:
image: postgres:14-alpine
container_name: odoo16-db
environment:
- POSTGRES_USER=odoo
- POSTGRES_PASSWORD=odoo20260202
- POSTGRES_DB=postgres
volumes:
- ./data/postgres:/var/lib/postgresql/data
restart: always

# Odoo 16 CE 主服务(挂载 OCA 会计模块)
odoo:
image: odoo:16.0
container_name: odoo16-app
depends_on:
- db
ports:
- "8069:8069"
environment:
- HOST=db
- USER=odoo
- PASSWORD=odoo20260202
# 核心:挂载自定义模块 + OCA 会计模块目录
- ADDONS_PATH=/mnt/addons,/mnt/oca-addons
volumes:
- ./config:/etc/odoo
- ./addons:/mnt/addons
- ./oca-addons:/mnt/oca-addons
- ./data/odoo:/var/lib/odoo
restart: always

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mkdir -p ~/odoo16-oca/{config,addons,oca-addons,data} && cd ~/odoo16-oca
sudo chmod -R 777 ./data
sudo chown -R 1000:1000 ./addons ./oca-addons



cd ./oca-addons
git clone -b 16.0 https://gh-proxy.org/https://github.com/OCA/account-financial-t
ools.git

git clone -b 16.0 https://gh-proxy.org/https://github.com/OCA/account-financial-reporting.git


sudo chown -R 101:101 ./data/odoo
sudo chmod -R 775 ./data/odoo



git clone -b 16.0 https://gh-proxy.org/https://github.com/nguyenthitritue/Odoo-Addons.git

https://github.com/OCA/account-financial-tools/tree/16.0

Next:

https://github.com/bringout/oca-ocb-accounting/tree/16.1

https://github.com/bringout/oca-payment

https://github.com/OCA/account-invoicing/tree/16.0

https://github.com/OCA/maintainer-tools

Altinkaya Free Odoo Addons https://github.com/altinkaya-opensource/odoo-addons

把创建者改成维修单上的负责人 要怎么写规则域表达式

你想要把之前基于「创建人(create_uid)」的权限规则,改成基于维修单上的「负责人」字段来限制用户仅查看自己作为负责人的维修单,核心是修改记录规则的域表达式,将判断字段从 create_uid 换成维修单的负责人字段。

第一步:确认维修单的负责人字段名称

Odoo 官方维修模块(maintenance)中,维修单(maintenance.request)的「负责人」字段默认名称是:

  • 字段技术名:user_id(对应界面上的「负责人」/「Assigned to」)
  • 字段类型:关联到 res.users(用户模型)

第二步:修改记录规则的域表达式

进入之前创建的「维修单:仅查看自己创建的」记录规则(设置 → 技术 → 安全 → 记录规则),将「域」字段的表达式替换为以下内容:

核心域表达式(仅看自己作为负责人的维修单)

[(‘user_id’, ‘=’, user.id)]

  • user_id:维修单上的「负责人」字段技术名;
  • user_id = user.id:仅当维修单的负责人等于当前登录用户时,该记录才可见;
  • 逻辑:用户只能看到自己被分配为负责人的维修单,无论该单据是谁创建的。

进阶场景:兼容「负责人为空」或「多条件」

如果需要补充场景(比如允许用户看到「负责人为空」的维修单,或同时看自己创建 + 自己负责的),可使用以下表达式:

需求场景 域表达式
仅看自己负责的 [('user_id', '=', user.id)]
看自己负责的 + 无负责人的 `[‘ ‘, (‘user_id’, ‘=’, user.id), (‘user_id’, ‘=’, False)]`
看自己创建的 + 自己负责的 `[‘ ‘, (‘create_uid’, ‘=’, user.id), (‘user_id’, ‘=’, user.id)]`

维修单 负责人字段 如何设置为只读

你想要把 Odoo 维修单(maintenance.request)上的「负责人(user_id)」字段设置为只读,核心是通过修改维修单的表单视图,给 user_id 字段添加 readonly="1" 属性;如果需要更灵活的只读规则(比如仅对普通用户只读、管理员可编辑),还可以用权限表达式控制。以下是两种常用方法,按需选择。

方法一:全局只读(所有用户都不能编辑)

适用于「任何用户都不能修改负责人,只能由系统 / 管理员初始化」的场景,纯界面操作即可完成。

步骤 1:进入维修单表单视图编辑页面

  1. 确保已开启开发者模式
  2. 进入 Odoo 「维修」模块 → 「维修单」 → 打开任意一张维修单;
  3. 点击页面右上角「编辑视图:表单」(开发者模式下才会显示)。

步骤 2:修改负责人字段的属性

  1. 在视图编辑界面的「架构」标签页,找到「负责人」对应的字段行(默认字段名是

    1
    user_id

    ),原始代码通常是:

odoo 维修单 单号如何添加日期

  1. 開啟開發者模式
  2. 找到維修單序列設定
    1. 進入 設定 (Settings) > 技術 (Technical) 選單。
      在「序列與識別符」區塊中點擊 序列 (Sequences)。
      在搜尋欄輸入 repair 或 維修,找到名稱為 Repair Order (代碼通常為 repair.order) 的紀錄並點開。
  3. 修改前綴以加入日期
    1. **%(year)s**:當前年份(4 位數,如 2026)。
    2. **%(y)s**:當前年份(2 位數,如 26)。
    3. **%(month)s**:當前月份(01-12)。
    4. **%(day)s**:當前日期(01-31)。

範例配置:
如果您希望單號顯示為 RO/20260206/0001

  • **前綴 (Prefix)**:RO/%(year)s%(month)s%(day)s/
  • **序號長度 (Sequence Size)**:4 (這決定了後面的數字位數)。

1.

灵感来源

Odoo (formerly known as OpenERP) is a suite of open-source business apps.

https://github.com/minhng92/odoo-17-docker-compose

个性化需求沟通 扫客服加V加群: