├── .gitignore
├── README.md
├── addons
└── readme.md
├── docker-compose.yml
├── entrypoint.sh
├── etc
├── logrotate
├── odoo.conf
└── requirements.txt
├── run.sh
└── screenshots
├── odoo-15-apps-screenshot.png
├── odoo-15-product-form.png
├── odoo-15-sales-screen.png
└── odoo-15-welcome-screenshot.png
/.gitignore:
--------------------------------------------------------------------------------
1 | postgresql/
2 | etc/odoo-server.log
3 | etc/addons/
4 | etc/sessions/
5 | etc/filestore/
6 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Quick install
2 |
3 | Installing Odoo 15 with one command.
4 |
5 | (Supports multiple Odoo instances on one server)
6 |
7 | Install [docker](https://docs.docker.com/get-docker/) and [docker-compose](https://docs.docker.com/compose/install/) yourself, then run:
8 |
9 | ``` bash
10 | curl -s https://raw.githubusercontent.com/minhng92/odoo-15-docker-compose/master/run.sh | bash -s odoo-one 10015 20015
11 | ```
12 |
13 | to set up first Odoo instance @ `localhost:10015` (default master password: `minhng.info`)
14 |
15 | and
16 |
17 | ``` bash
18 | curl -s https://raw.githubusercontent.com/minhng92/odoo-15-docker-compose/master/run.sh | bash -s odoo-two 11015 21015
19 | ```
20 |
21 | to set up another Odoo instance @ `localhost:11015` (default master password: `minhng.info`)
22 |
23 | Some arguments:
24 | * First argument (**odoo-one**): Odoo deploy folder
25 | * Second argument (**10015**): Odoo port
26 | * Third argument (**20015**): live chat port
27 |
28 | If `curl` is not found, install it:
29 |
30 | ``` bash
31 | $ sudo apt-get install curl
32 | # or
33 | $ sudo yum install curl
34 | ```
35 |
36 | # Usage
37 |
38 | Start the container:
39 | ``` sh
40 | docker-compose up
41 | ```
42 |
43 | * Then open `localhost:10015` to access Odoo 15.0. If you want to start the server with a different port, change **10015** to another value in **docker-compose.yml**:
44 |
45 | ```
46 | ports:
47 | - "10015:8069"
48 | ```
49 |
50 | Run Odoo container in detached mode (be able to close terminal without stopping Odoo):
51 |
52 | ```
53 | docker-compose up -d
54 | ```
55 |
56 | **If you get the permission issue**, change the folder permission to make sure that the container is able to access the directory:
57 |
58 | ``` sh
59 | $ git clone https://github.com/minhng92/odoo-15-docker-compose
60 | $ sudo chmod -R 777 addons
61 | $ sudo chmod -R 777 etc
62 | $ mkdir -p postgresql
63 | $ sudo chmod -R 777 postgresql
64 | ```
65 |
66 | Increase maximum number of files watching from 8192 (default) to **524288**. In order to avoid error when we run multiple Odoo instances. This is an *optional step*. These commands are for Ubuntu user:
67 |
68 | ```
69 | $ if grep -qF "fs.inotify.max_user_watches" /etc/sysctl.conf; then echo $(grep -F "fs.inotify.max_user_watches" /etc/sysctl.conf); else echo "fs.inotify.max_user_watches = 524288" | sudo tee -a /etc/sysctl.conf; fi
70 | $ sudo sysctl -p # apply new config immediately
71 | ```
72 |
73 | # Custom addons
74 |
75 | The **addons/** folder contains custom addons. Just put your custom addons if you have any.
76 |
77 | # Odoo configuration & log
78 |
79 | * To change Odoo configuration, edit file: **etc/odoo.conf**.
80 | * Log file: **etc/odoo-server.log**
81 | * Default database password (**admin_passwd**) is `minhng.info`, please change it @ [etc/odoo.conf#L60](/etc/odoo.conf#L60)
82 |
83 | # Odoo container management
84 |
85 | **Run Odoo**:
86 |
87 | ``` bash
88 | docker-compose up -d
89 | ```
90 |
91 | **Restart Odoo**:
92 |
93 | ``` bash
94 | docker-compose restart
95 | ```
96 |
97 | **Stop Odoo**:
98 |
99 | ``` bash
100 | docker-compose down
101 | ```
102 |
103 | # Live chat
104 |
105 | In [docker-compose.yml#L21](docker-compose.yml#L21), we exposed port **20015** for live-chat on host.
106 |
107 | Configuring **nginx** to activate live chat feature (in production):
108 |
109 | ``` conf
110 | #...
111 | server {
112 | #...
113 | location /longpolling/ {
114 | proxy_pass http://0.0.0.0:20015/longpolling/;
115 | }
116 | #...
117 | }
118 | #...
119 | ```
120 |
121 | # docker-compose.yml
122 |
123 | * odoo:15.0
124 | * postgres:14
125 |
126 | # Odoo 15 screenshots
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
--------------------------------------------------------------------------------
/addons/readme.md:
--------------------------------------------------------------------------------
1 | This file is intentionally left blank.
--------------------------------------------------------------------------------
/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: '2'
2 | services:
3 | db:
4 | image: postgres:14
5 | user: root
6 | environment:
7 | - POSTGRES_USER=odoo
8 | - POSTGRES_PASSWORD=odoo15@2021
9 | - POSTGRES_DB=postgres
10 | restart: always # run as a service
11 | volumes:
12 | - ./postgresql:/var/lib/postgresql/data
13 |
14 | odoo15:
15 | image: odoo:15
16 | user: root
17 | depends_on:
18 | - db
19 | ports:
20 | - "10015:8069"
21 | - "20015:8072" # live chat
22 | tty: true
23 | command: --
24 | environment:
25 | - HOST=db
26 | - USER=odoo
27 | - PASSWORD=odoo15@2021
28 | volumes:
29 | #- /etc/timezone:/etc/timezone:ro
30 | #- /etc/localtime:/etc/localtime:ro
31 | - ./entrypoint.sh:/entrypoint.sh
32 | - ./addons:/mnt/extra-addons
33 | - ./etc:/etc/odoo
34 | restart: always # run as a service
35 |
--------------------------------------------------------------------------------
/entrypoint.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | set -e
4 |
5 | # set the postgres database host, port, user and password according to the environment
6 | # and pass them as arguments to the odoo process if not present in the config file
7 | : ${HOST:=${DB_PORT_5432_TCP_ADDR:='db'}}
8 | : ${PORT:=${DB_PORT_5432_TCP_PORT:=5432}}
9 | : ${USER:=${DB_ENV_POSTGRES_USER:=${POSTGRES_USER:='odoo'}}}
10 | : ${PASSWORD:=${DB_ENV_POSTGRES_PASSWORD:=${POSTGRES_PASSWORD:='odoo15@2021'}}}
11 |
12 | # install python packages
13 | pip3 install pip --upgrade
14 | pip3 install -r /etc/odoo/requirements.txt
15 |
16 | # sed -i 's|raise werkzeug.exceptions.BadRequest(msg)|self.jsonrequest = {}|g' /usr/lib/python3/dist-packages/odoo/http.py
17 |
18 | # Install logrotate if not already installed
19 | if ! dpkg -l | grep -q logrotate; then
20 | apt-get update && apt-get install -y logrotate
21 | fi
22 |
23 | # Copy logrotate config
24 | cp /etc/odoo/logrotate /etc/logrotate.d/odoo
25 |
26 | # Start cron daemon (required for logrotate)
27 | cron
28 |
29 | DB_ARGS=()
30 | function check_config() {
31 | param="$1"
32 | value="$2"
33 | if grep -q -E "^\s*\b${param}\b\s*=" "$ODOO_RC" ; then
34 | value=$(grep -E "^\s*\b${param}\b\s*=" "$ODOO_RC" |cut -d " " -f3|sed 's/["\n\r]//g')
35 | fi;
36 | DB_ARGS+=("--${param}")
37 | DB_ARGS+=("${value}")
38 | }
39 | check_config "db_host" "$HOST"
40 | check_config "db_port" "$PORT"
41 | check_config "db_user" "$USER"
42 | check_config "db_password" "$PASSWORD"
43 |
44 | case "$1" in
45 | -- | odoo)
46 | shift
47 | if [[ "$1" == "scaffold" ]] ; then
48 | exec odoo "$@"
49 | else
50 | wait-for-psql.py ${DB_ARGS[@]} --timeout=30
51 | exec odoo "$@" "${DB_ARGS[@]}"
52 | fi
53 | ;;
54 | -*)
55 | wait-for-psql.py ${DB_ARGS[@]} --timeout=30
56 | exec odoo "$@" "${DB_ARGS[@]}"
57 | ;;
58 | *)
59 | exec "$@"
60 | esac
61 |
62 | exit 1
--------------------------------------------------------------------------------
/etc/logrotate:
--------------------------------------------------------------------------------
1 | /etc/odoo/*.log {
2 | rotate 3
3 | daily
4 | nocompress
5 | missingok
6 | notifempty
7 | copytruncate
8 | }
9 |
--------------------------------------------------------------------------------
/etc/odoo.conf:
--------------------------------------------------------------------------------
1 | [options]
2 | ; ===================
3 | ; | Common options) |
4 | ; ===================
5 | ; ------
6 | ; -c / --config | specify alternate config file
7 | ; ------
8 | ; config =
9 |
10 | ; ------
11 | ; -s / --save | save configuration to ~/.odoorc (or to ~/.openerp_serverrc if it exists)
12 | ; ------
13 | ; save =
14 |
15 | ; ------
16 | ; -i / --init | install one or more modules (comma-separated list, use "all" for all modules), requires -d
17 | ; ------
18 | ; init =
19 |
20 | ; ------
21 | ; -u / --update | update one or more modules (comma-separated list, use "all" for all modules). Requires -d.
22 | ; ------
23 | ; update =
24 |
25 | ; ------
26 | ; --without-demo | disable loading demo data for modules to be installed (comma-separated, use "all" for all modules). Requires -d and -i. Default is %default
27 | ; ------
28 | ; without_demo =
29 |
30 | ; ------
31 | ; -P / --import-partial | Use this for big data importation, if it crashes you will be able to continue at the current state. Provide a filename to store intermediate importation states.
32 | ; ------
33 | ; import_partial =
34 |
35 | ; ------
36 | ; --pidfile | file where the server pid will be stored
37 | ; ------
38 | ; pidfile =
39 |
40 | ; ------
41 | ; --addons-path | type = string | specify additional addons paths (separated by commas).
42 | ; ------
43 | addons_path = /mnt/extra-addons
44 |
45 | ; ------
46 | ; --upgrade-path | type = string | specify an additional upgrade path.
47 | ; ------
48 | ; upgrade_path =
49 |
50 | ; ------
51 | ; --load | Comma-separated list of server-wide modules.
52 | ; ------
53 | ; server_wide_modules = base,web
54 |
55 | ; ------
56 | ; -D / --data-dir | Directory where to store Odoo data
57 | ; ------
58 | data_dir = /etc/odoo
59 |
60 | admin_passwd = minhng.info
61 |
62 | ; ==============================
63 | ; | HTTP Service Configuration |
64 | ; ==============================
65 | ; ------
66 | ; --http-interface | Listen interface address for HTTP services. Keep empty to listen on all interfaces (0.0.0.0)
67 | ; ------
68 | ; http_interface =
69 |
70 | ; ------
71 | ; -p / --http-port | type = int | Listen port for the main HTTP service
72 | ; ------
73 | ; http_port = 8069
74 |
75 | ; ------
76 | ; --longpolling-port | type = int | Listen port for the longpolling HTTP service
77 | ; ------
78 | ; longpolling_port = 8072
79 |
80 | ; ------
81 | ; --no-http | Disable the HTTP and Longpolling services entirely
82 | ; ------
83 | ; http_enable = True
84 |
85 | ; ------
86 | ; --proxy-mode | Activate reverse proxy WSGI wrappers (headers rewriting) Only enable this when running behind a trusted web proxy!
87 | ; ------
88 | ; proxy_mode =
89 |
90 | ; ------
91 | ; --xmlrpc-interface | SUPPRESSHELP
92 | ; ------
93 | ; http_interface =
94 |
95 | ; ------
96 | ; --xmlrpc-port | type = int | SUPPRESSHELP
97 | ; ------
98 | ; http_port =
99 |
100 | ; ------
101 | ; --no-xmlrpc | SUPPRESSHELP
102 | ; ------
103 | ; http_enable =
104 |
105 | ; ===============================
106 | ; | Web interface Configuration |
107 | ; ===============================
108 | ; ------
109 | ; --db-filter | Regular expressions for filtering available databases for Web UI. The expression can use %d (domain) and %h (host) placeholders.
110 | ; ------
111 | ; dbfilter =
112 |
113 | ; =========================
114 | ; | Testing Configuration |
115 | ; =========================
116 | ; ------
117 | ; --test-file | Launch a python test file.
118 | ; ------
119 | ; test_file =
120 |
121 | ; ------
122 | ; --test-enable | Enable unit tests.
123 | ; ------
124 | ; test_enable =
125 |
126 | ; ------
127 | ; --test-tags | Comma-separated list of spec to filter which tests to execute. Enable unit tests if set. A filter spec has the format: [-][tag][/module][:class][.method] The '-' specifies if we want to include or exclude tests matching this spec. The tag will match tags added on a class with a @tagged decorator. By default tag value is 'standard' when not given on include mode. '*' will match all tags. Tag will also match module name (deprecated, use /module) The module, class, and method will respectively match the module name, test class name and test method name. examples: :TestClass.test_func,/test_module,external
128 | ; ------
129 | ; test_tags =
130 |
131 | ; ------
132 | ; --screencasts | Screencasts will go in DIR/{db_name}/screencasts.
133 | ; ------
134 | ; screencasts =
135 |
136 | ; ------
137 | ; --screenshots | Screenshots will go in DIR/{db_name}/screenshots. Defaults to /etc/odoo/odoo_tests.
138 | ; ------
139 | ; screenshots = /etc/odoo/odoo_tests
140 |
141 | ; =========================
142 | ; | Logging Configuration |
143 | ; =========================
144 | ; ------
145 | ; --logfile | file where the server log will be stored
146 | ; ------
147 | logfile = /etc/odoo/odoo-server.log
148 |
149 | ; ------
150 | ; --syslog | Send the log to the syslog server
151 | ; ------
152 | ; syslog =
153 |
154 | ; ------
155 | ; --log-handler | setup a handler at LEVEL for a given PREFIX. An empty PREFIX indicates the root logger. This option can be repeated. Example: "odoo.orm:DEBUG" or "werkzeug:CRITICAL" (default: ":INFO")
156 | ; ------
157 | ; None = :INFO
158 |
159 | ; ------
160 | ; --log-request | shortcut for --log-handler=odoo.http.rpc.request:DEBUG
161 | ; ------
162 | ; log_handler =
163 |
164 | ; ------
165 | ; --log-response | shortcut for --log-handler=odoo.http.rpc.response:DEBUG
166 | ; ------
167 | ; log_handler =
168 |
169 | ; ------
170 | ; --log-web | shortcut for --log-handler=odoo.http:DEBUG
171 | ; ------
172 | ; log_handler =
173 |
174 | ; ------
175 | ; --log-sql | shortcut for --log-handler=odoo.sql_db:DEBUG
176 | ; ------
177 | ; log_handler =
178 |
179 | ; ------
180 | ; --log-db | Logging database
181 | ; ------
182 | ; log_db =
183 |
184 | ; ------
185 | ; --log-db-level | Logging database level
186 | ; ------
187 | ; log_db_level = warning
188 |
189 | ; ------
190 | ; --log-level | type = choice | choices = ['info', 'debug_rpc', 'warn', 'test', 'critical', 'runbot', 'debug_sql', 'error', 'debug', 'debug_rpc_answer', 'notset'] | specify the level of the logging. Accepted values: ['info', 'debug_rpc', 'warn', 'test', 'critical', 'runbot', 'debug_sql', 'error', 'debug', 'debug_rpc_answer', 'notset'].
191 | ; ------
192 | ; log_level = info
193 |
194 | ; ======================
195 | ; | SMTP Configuration |
196 | ; ======================
197 | ; ------
198 | ; --email-from | specify the SMTP email address for sending email
199 | ; ------
200 | ; email_from =
201 |
202 | ; ------
203 | ; --smtp | specify the SMTP server for sending email
204 | ; ------
205 | ; smtp_server = localhost
206 |
207 | ; ------
208 | ; --smtp-port | type = int | specify the SMTP port
209 | ; ------
210 | ; smtp_port = 25
211 |
212 | ; ------
213 | ; --smtp-ssl | if passed, SMTP connections will be encrypted with SSL (STARTTLS)
214 | ; ------
215 | ; smtp_ssl =
216 |
217 | ; ------
218 | ; --smtp-user | specify the SMTP username for sending email
219 | ; ------
220 | ; smtp_user =
221 |
222 | ; ------
223 | ; --smtp-password | specify the SMTP password for sending email
224 | ; ------
225 | ; smtp_password =
226 |
227 | ; ============================
228 | ; | Database related options |
229 | ; ============================
230 | ; ------
231 | ; -d / --database | specify the database name
232 | ; ------
233 | ; db_name =
234 |
235 | ; ------
236 | ; -r / --db_user | specify the database user name
237 | ; ------
238 | ; db_user =
239 |
240 | ; ------
241 | ; -w / --db_password | specify the database password
242 | ; ------
243 | ; db_password =
244 |
245 | ; ------
246 | ; --pg_path | specify the pg executable path
247 | ; ------
248 | ; pg_path =
249 |
250 | ; ------
251 | ; --db_host | specify the database host
252 | ; ------
253 | ; db_host =
254 |
255 | ; ------
256 | ; --db_port | type = int | specify the database port
257 | ; ------
258 | ; db_port =
259 |
260 | ; ------
261 | ; --db_sslmode | type = choice | choices = ['disable', 'allow', 'prefer', 'require', 'verify-ca', 'verify-full'] | specify the database ssl connection mode (see PostgreSQL documentation)
262 | ; ------
263 | ; db_sslmode = prefer
264 |
265 | ; ------
266 | ; --db_maxconn | type = int | specify the maximum number of physical connections to PostgreSQL
267 | ; ------
268 | ; db_maxconn = 64
269 |
270 | ; ------
271 | ; --db-template | specify a custom database template to create a new database
272 | ; ------
273 | ; db_template = template0
274 |
275 | ; ========================
276 | ; | Internationalisation |
277 | ; ========================
278 | ; ------
279 | ; --load-language | specifies the languages for the translations you want to be loaded
280 | ; ------
281 | ; load_language =
282 |
283 | ; ------
284 | ; -l / --language | specify the language of the translation file. Use it with --i18n-export or --i18n-import
285 | ; ------
286 | ; language =
287 |
288 | ; ------
289 | ; --i18n-export | export all sentences to be translated to a CSV file, a PO file or a TGZ archive and exit
290 | ; ------
291 | ; translate_out =
292 |
293 | ; ------
294 | ; --i18n-import | import a CSV or a PO file with translations and exit. The '-l' option is required.
295 | ; ------
296 | ; translate_in =
297 |
298 | ; ------
299 | ; --i18n-overwrite | overwrites existing translation terms on updating a module or importing a CSV or a PO file.
300 | ; ------
301 | ; overwrite_existing_translations =
302 |
303 | ; ------
304 | ; --modules | specify modules to export. Use in combination with --i18n-export
305 | ; ------
306 | ; translate_modules =
307 |
308 | ; ============================
309 | ; | Security-related options |
310 | ; ============================
311 | ; ------
312 | ; --no-database-list | Disable the ability to obtain or view the list of databases. Also disable access to the database manager and selector, so be sure to set a proper --database parameter first
313 | ; ------
314 | ; list_db = True
315 |
316 | ; ====================
317 | ; | Advanced options |
318 | ; ====================
319 | ; ------
320 | ; --dev | type = string | Enable developer mode. Param: List of options separated by comma. Options : all, [pudb|wdb|ipdb|pdb], reload, qweb, werkzeug, xml
321 | ; ------
322 | dev_mode = reload
323 |
324 | ; ------
325 | ; --shell-interface | type = string | Specify a preferred REPL to use in shell mode. Supported REPLs are: [ipython|ptpython|bpython|python]
326 | ; ------
327 | ; shell_interface =
328 |
329 | ; ------
330 | ; --stop-after-init | stop the server after its initialization
331 | ; ------
332 | ; stop_after_init =
333 |
334 | ; ------
335 | ; --osv-memory-count-limit | type = int | Force a limit on the maximum number of records kept in the virtual osv_memory tables. The default is False, which means no count-based limit.
336 | ; ------
337 | ; osv_memory_count_limit =
338 |
339 | ; ------
340 | ; --transient-age-limit | type = float | Time limit (decimal value in hours) records created with a TransientModel (mosly wizard) are kept in the database. Default to 1 hour.
341 | ; ------
342 | ; transient_age_limit = 1.0
343 |
344 | ; ------
345 | ; --osv-memory-age-limit | type = float | Deprecated alias to the transient-age-limit option
346 | ; ------
347 | ; osv_memory_age_limit =
348 |
349 | ; ------
350 | ; --max-cron-threads | type = int | Maximum number of threads processing concurrently cron jobs (default 2).
351 | ; ------
352 | ; max_cron_threads = 2
353 |
354 | ; ------
355 | ; --unaccent | Try to enable the unaccent extension when creating new databases.
356 | ; ------
357 | ; unaccent =
358 |
359 | ; ------
360 | ; --geoip-db | Absolute path to the GeoIP database file.
361 | ; ------
362 | ; geoip_database = /usr/share/GeoIP/GeoLite2-City.mmdb
363 |
364 | ; ===========================
365 | ; | Multiprocessing options |
366 | ; ===========================
367 | ; ------
368 | ; --workers | type = int | Specify the number of workers, 0 disable prefork mode.
369 | ; ------
370 | ; workers =
371 |
372 | ; ------
373 | ; --limit-memory-soft | type = int | Maximum allowed virtual memory per worker (in bytes), when reached the worker be reset after the current request (default 2048MiB).
374 | ; ------
375 | ; limit_memory_soft = 2147483648
376 |
377 | ; ------
378 | ; --limit-memory-hard | type = int | Maximum allowed virtual memory per worker (in bytes), when reached, any memory allocation will fail (default 2560MiB).
379 | ; ------
380 | ; limit_memory_hard = 2684354560
381 |
382 | ; ------
383 | ; --limit-time-cpu | type = int | Maximum allowed CPU time per request (default 60).
384 | ; ------
385 | ; limit_time_cpu = 60
386 |
387 | ; ------
388 | ; --limit-time-real | type = int | Maximum allowed Real time per request (default 120).
389 | ; ------
390 | ; limit_time_real = 120
391 |
392 | ; ------
393 | ; --limit-time-real-cron | type = int | Maximum allowed Real time per cron job. (default: --limit-time-real). Set to 0 for no limit.
394 | ; ------
395 | ; limit_time_real_cron = -1
396 |
397 | ; ------
398 | ; --limit-request | type = int | Maximum number of request to be processed per worker (default 8192).
399 | ; ------
400 | ; limit_request = 8192
401 |
--------------------------------------------------------------------------------
/etc/requirements.txt:
--------------------------------------------------------------------------------
1 | # -----------------------
2 | # | Add Python packages |
3 | # -----------------------
4 | # To install below packages at startup, uncomment this line in "docker-compose.yml" file!
5 | # - ./entrypoint.sh:/entrypoint.sh
6 | # then down the docker container ($ docker-compose down) and up it again ($ docker-compose up -d).
7 | # -----------------------
8 | # paramiko==2.7.2 # for auto_backup module
9 |
--------------------------------------------------------------------------------
/run.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | DESTINATION=$1
3 | PORT=$2
4 | CHAT=$3
5 |
6 | # Clone Odoo directory
7 | git clone --depth=1 https://github.com/minhng92/odoo-15-docker-compose $DESTINATION
8 | rm -rf $DESTINATION/.git
9 |
10 | # Create PostgreSQL directory
11 | mkdir -p $DESTINATION/postgresql
12 |
13 | # Change ownership to current user and set restrictive permissions for security
14 | sudo chown -R $USER:$USER $DESTINATION
15 | sudo chmod -R 700 $DESTINATION # Only the user has access
16 |
17 | # Check if running on macOS
18 | if [[ "$OSTYPE" == "darwin"* ]]; then
19 | echo "Running on macOS. Skipping inotify configuration."
20 | else
21 | # System configuration
22 | if grep -qF "fs.inotify.max_user_watches" /etc/sysctl.conf; then
23 | echo $(grep -F "fs.inotify.max_user_watches" /etc/sysctl.conf)
24 | else
25 | echo "fs.inotify.max_user_watches = 524288" | sudo tee -a /etc/sysctl.conf
26 | fi
27 | sudo sysctl -p
28 | fi
29 |
30 | # Set ports in docker-compose.yml
31 | # Update docker-compose configuration
32 | if [[ "$OSTYPE" == "darwin"* ]]; then
33 | # macOS sed syntax
34 | sed -i '' 's/10015/'$PORT'/g' $DESTINATION/docker-compose.yml
35 | sed -i '' 's/20015/'$CHAT'/g' $DESTINATION/docker-compose.yml
36 | else
37 | # Linux sed syntax
38 | sed -i 's/10015/'$PORT'/g' $DESTINATION/docker-compose.yml
39 | sed -i 's/20015/'$CHAT'/g' $DESTINATION/docker-compose.yml
40 | fi
41 |
42 | # Set file and directory permissions after installation
43 | find $DESTINATION -type f -exec chmod 644 {} \;
44 | find $DESTINATION -type d -exec chmod 755 {} \;
45 |
46 | chmod +x $DESTINATION/entrypoint.sh
47 |
48 | # Run Odoo
49 | if ! is_present="$(type -p "docker-compose")" || [[ -z $is_present ]]; then
50 | docker compose -f $DESTINATION/docker-compose.yml up -d
51 | else
52 | docker-compose -f $DESTINATION/docker-compose.yml up -d
53 | fi
54 |
55 | echo "Odoo started at http://localhost:$PORT | Master Password: minhng.info | Live chat port: $CHAT"
--------------------------------------------------------------------------------
/screenshots/odoo-15-apps-screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/minhng92/odoo-15-docker-compose/c3596d8beee91007284715b29e425c6134900e31/screenshots/odoo-15-apps-screenshot.png
--------------------------------------------------------------------------------
/screenshots/odoo-15-product-form.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/minhng92/odoo-15-docker-compose/c3596d8beee91007284715b29e425c6134900e31/screenshots/odoo-15-product-form.png
--------------------------------------------------------------------------------
/screenshots/odoo-15-sales-screen.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/minhng92/odoo-15-docker-compose/c3596d8beee91007284715b29e425c6134900e31/screenshots/odoo-15-sales-screen.png
--------------------------------------------------------------------------------
/screenshots/odoo-15-welcome-screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/minhng92/odoo-15-docker-compose/c3596d8beee91007284715b29e425c6134900e31/screenshots/odoo-15-welcome-screenshot.png
--------------------------------------------------------------------------------