odoo-devops-tools 1.23.2__tar.gz → 1.23.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: odoo-devops-tools
3
- Version: 1.23.2
3
+ Version: 1.23.4
4
4
  Summary: Build reproducible Odoo workspaces from a single project definition.
5
5
  Author: Roman Lacko
6
6
  License-Expression: MIT
@@ -123,14 +123,21 @@ Create a new workspace:
123
123
  odoo-compose --init ./odoo19
124
124
  ```
125
125
 
126
- Start the Docker Compose environment:
126
+ This creates `./odoo19/odoo-project.ini` with this initial content:
127
+
128
+ ```ini
129
+ [odoo]
130
+ version = 19.0
131
+ ```
132
+
133
+ Then start the Docker Compose environment:
127
134
 
128
135
  ```bash
129
136
  cd ./odoo19
130
- docker compose up -d
137
+ docker compose up -d --build
131
138
  ```
132
139
 
133
- Initialize the Odoo database:
140
+ Optionally initialize the Odoo database from the command line instead of through the web interface:
134
141
 
135
142
  ```bash
136
143
  docker compose run --rm odoo -- -c /etc/odoo/odoo.conf -d odoo \
@@ -141,15 +148,6 @@ docker compose run --rm odoo -- -c /etc/odoo/odoo.conf -d odoo \
141
148
 
142
149
  Docker Compose runs both Odoo and PostgreSQL. Odoo is available at http://localhost:8069.
143
150
 
144
- The Docker workflow uses the following `odoo-project.ini` configuration:
145
-
146
- ```ini
147
- [odoo]
148
- version = 19.0
149
- ```
150
-
151
- Edit this file when you want to add extra addons, change configuration values, pin repositories, or adjust Python dependency handling.
152
-
153
151
  ### 1.1. Adding extra addons
154
152
 
155
153
  To extend Odoo with additional functionality, add extra addons through `[addons.<name>]` sections in `odoo-project.ini`.
@@ -179,7 +177,7 @@ Sync the configured addon repositories and refresh the generated Docker workflow
179
177
 
180
178
  ```bash
181
179
  odoo-compose --sync-addons
182
- docker compose up --build -d
180
+ docker compose up -d --build
183
181
  ```
184
182
 
185
183
  The addon repositories are cloned into `ROOT/odoo-addons/oca-web/` and `ROOT/odoo-addons/oca-helpdesk/` and bind-mounted into the Odoo container.
@@ -195,10 +193,10 @@ docker compose run --rm odoo -- -c /etc/odoo/odoo.conf -d odoo \
195
193
  --stop-after-init
196
194
  ```
197
195
 
198
- For subsequent addon updates, run `click-odoo-update` inside the Odoo container:
196
+ For subsequent addon updates, use the generated Docker update helper:
199
197
 
200
198
  ```bash
201
- docker compose exec odoo click-odoo-update -c /etc/odoo/odoo.conf -d odoo
199
+ ./docker/local/scripts/update.sh
202
200
  ```
203
201
 
204
202
  ### 1.2. Running Odoo from workspace source
@@ -223,19 +221,21 @@ Sync the Odoo source and generate the Docker artifacts:
223
221
 
224
222
  ```bash
225
223
  odoo-compose --sync-all
226
- docker compose up --build -d
224
+ docker compose up -d --build
227
225
  ```
228
226
 
229
227
  The resolved Odoo source is bind-mounted read-only at `/opt/odoo`. The Odoo Python source from the base image is removed while its installed dependencies remain available.
230
228
 
231
- ### 1.3. Backup and restore
229
+ ### 1.3. Script reference
232
230
 
233
- The Docker workflow generates platform-specific helpers under `ROOT/docker/local/scripts/` for backing up and restoring the PostgreSQL database and Odoo filestore independently. Unix-like systems generate `.sh` helpers; Windows generates the corresponding `.bat` helpers.
231
+ The Docker workflow generates platform-specific helper scripts under `ROOT/docker/local/scripts/`. Unix-like systems generate `.sh` helpers; Windows generates the corresponding `.bat` helpers.
234
232
 
235
233
  On Unix-like systems:
236
234
 
237
235
  ```text
238
236
  docker/local/scripts/
237
+ ├── shell.sh
238
+ ├── update.sh
239
239
  ├── backup-db.sh
240
240
  ├── restore-db.sh
241
241
  ├── neutralize-db.sh
@@ -246,15 +246,41 @@ docker/local/scripts/
246
246
  └── restore-filestore-restic.sh
247
247
  ```
248
248
 
249
- On Windows the same helper names are generated with the `.bat` extension instead. The helpers stream backup data directly between the Docker containers and files on the host. No backup directory is mounted into the containers, and no intermediate backup file is created inside a container. The examples below use the Unix `.sh` form.
249
+ The examples below use the Unix `.sh` form.
250
250
 
251
- The default database name is taken from `[config].db_name` when configured, otherwise it is `odoo`. Override it for any command with `ODOO_DB_NAME`:
251
+ #### 1.3.1. shell
252
+
253
+ Opens an Odoo shell for the configured database:
252
254
 
253
255
  ```bash
254
- ODOO_DB_NAME=odoo_test ./docker/local/scripts/backup-db.sh
256
+ ./docker/local/scripts/shell.sh
257
+ ```
258
+
259
+ The default database name is taken from `[config].db_name` when configured, otherwise it is `odoo`. Override it with `ODOO_DB_NAME`:
260
+
261
+ ```bash
262
+ ODOO_DB_NAME=odoo_test ./docker/local/scripts/shell.sh
263
+ ```
264
+
265
+ Any extra arguments are passed through to the underlying Odoo shell command.
266
+
267
+ #### 1.3.2. update
268
+
269
+ Updates installed addons using `click-odoo-update`:
270
+
271
+ ```bash
272
+ ./docker/local/scripts/update.sh
255
273
  ```
256
274
 
257
- #### 1.3.1. Database backup
275
+ The default database name follows the same `ODOO_DB_NAME` convention as the shell and database helpers.
276
+
277
+ Any extra arguments are passed through to `click-odoo-update`:
278
+
279
+ ```bash
280
+ ./docker/local/scripts/update.sh --update-all
281
+ ```
282
+
283
+ #### 1.3.3. Database backup
258
284
 
259
285
  Create a PostgreSQL custom-format dump under `ROOT/odoo-backups/`:
260
286
 
@@ -274,7 +300,13 @@ Pass an output path explicitly when needed:
274
300
  ./docker/local/scripts/backup-db.sh ./odoo-backups/pre-upgrade.dump
275
301
  ```
276
302
 
277
- #### 1.3.2. Database restore
303
+ The default database name is taken from `[config].db_name` when configured, otherwise it is `odoo`. Override it for any command with `ODOO_DB_NAME`:
304
+
305
+ ```bash
306
+ ODOO_DB_NAME=odoo_test ./docker/local/scripts/backup-db.sh
307
+ ```
308
+
309
+ #### 1.3.4. Database restore
278
310
 
279
311
  Restore a database dump with `pg_restore`:
280
312
 
@@ -311,7 +343,7 @@ To restore the same dump into another database without replacing the default dat
311
343
  ODOO_DB_NAME=odoo_restore ./docker/local/scripts/restore-db.sh ./odoo-backups/pre-upgrade.dump
312
344
  ```
313
345
 
314
- #### 1.3.3. Database neutralization
346
+ #### 1.3.5. Database neutralization
315
347
 
316
348
  For development or test databases restored from production, run the generated neutralization helper explicitly:
317
349
 
@@ -341,7 +373,7 @@ docker compose up -d odoo
341
373
 
342
374
  `--copy` / `--move` and neutralization serve different purposes: copy/move controls restored database identity, while neutralization controls production side effects.
343
375
 
344
- #### 1.3.4. Filestore backup
376
+ #### 1.3.6. Filestore backup
345
377
 
346
378
  Create a compressed tar archive of the selected database filestore:
347
379
 
@@ -372,7 +404,7 @@ docker compose stop odoo
372
404
  docker compose up -d odoo
373
405
  ```
374
406
 
375
- #### 1.3.5. Filestore restore
407
+ #### 1.3.7. Filestore restore
376
408
 
377
409
  Restore a filestore archive:
378
410
 
@@ -396,20 +428,10 @@ ODOO_DB_NAME=odoo_restore ./docker/local/scripts/restore-filestore.sh ./odoo-bac
396
428
 
397
429
  Database and filestore backups are intentionally separate. This allows either part to be restored independently while still making it possible to create matching database and filestore backups when both are needed.
398
430
 
399
- #### 1.3.6. Restic filestore backup
431
+ #### 1.3.8. Restic filestore backup
400
432
 
401
433
  The generated Docker image also includes `restic`. Restic is an additional option intended especially for large filestores where incremental snapshots and deduplication are useful.
402
434
 
403
- The Docker workflow generates platform-specific restic helpers: `.sh` on Unix-like systems and `.bat` on Windows.
404
-
405
- ```text
406
- docker/local/scripts/restic.sh
407
- docker/local/scripts/backup-filestore-restic.sh
408
- docker/local/scripts/restore-filestore-restic.sh
409
- ```
410
-
411
- The corresponding Windows helpers use the same names with the `.bat` extension. The `restic` helper runs the `restic` binary from the generated Odoo image against the same `odoo-data` volume. The restic cache is kept under `/var/lib/odoo/.cache/restic`, outside the filestore directory, so it persists between one-off containers without being included in filestore backups.
412
-
413
435
  Set `RESTIC_REPOSITORY` and either `RESTIC_PASSWORD_FILE` or `RESTIC_PASSWORD` before using the helpers. For a local repository on the Docker host, use an absolute path. The wrapper automatically bind-mounts the repository into the one-off container; Windows drive paths such as `C:\backups\odoo` are supported by `restic.bat`:
414
436
 
415
437
  ```bash
@@ -444,7 +466,7 @@ List or inspect snapshots through the generic wrapper:
444
466
  ./docker/local/scripts/restic.sh check
445
467
  ```
446
468
 
447
- #### 1.3.7. Restic filestore restore
469
+ #### 1.3.9. Restic filestore restore
448
470
 
449
471
  Restore the latest matching filestore snapshot:
450
472
 
@@ -524,16 +546,7 @@ odoo-compose --init ./odoo19 --sync-all --create-venv \
524
546
  > **Note**
525
547
  > Make sure PostgreSQL is running at the configured host and the configured database user exists.
526
548
 
527
- Start Odoo with the generated script:
528
-
529
- ```bash
530
- cd ./odoo19
531
- ./odoo-scripts/run.sh
532
- ```
533
-
534
- Odoo starts with the generated configuration from `./odoo-configs/odoo-server.conf` and is available at http://localhost:8069.
535
-
536
- The native workflow uses the following `odoo-project.ini` configuration, with PostgreSQL connection settings added to `[config]`:
549
+ This creates `./odoo19/odoo-project.ini` with this initial content:
537
550
 
538
551
  ```ini
539
552
  [odoo]
@@ -546,7 +559,14 @@ db_user = odoo
546
559
  db_password = odoo
547
560
  ```
548
561
 
549
- Edit this file when you want to add extra addons, change configuration values, pin repositories, or adjust Python dependency handling.
562
+ Then start Odoo with the generated script:
563
+
564
+ ```bash
565
+ cd ./odoo19
566
+ ./odoo-scripts/run.sh
567
+ ```
568
+
569
+ Odoo starts with the generated configuration from `./odoo-configs/odoo-server.conf` and is available at http://localhost:8069.
550
570
 
551
571
  ### 2.1. Adding extra addons
552
572
 
@@ -95,14 +95,21 @@ Create a new workspace:
95
95
  odoo-compose --init ./odoo19
96
96
  ```
97
97
 
98
- Start the Docker Compose environment:
98
+ This creates `./odoo19/odoo-project.ini` with this initial content:
99
+
100
+ ```ini
101
+ [odoo]
102
+ version = 19.0
103
+ ```
104
+
105
+ Then start the Docker Compose environment:
99
106
 
100
107
  ```bash
101
108
  cd ./odoo19
102
- docker compose up -d
109
+ docker compose up -d --build
103
110
  ```
104
111
 
105
- Initialize the Odoo database:
112
+ Optionally initialize the Odoo database from the command line instead of through the web interface:
106
113
 
107
114
  ```bash
108
115
  docker compose run --rm odoo -- -c /etc/odoo/odoo.conf -d odoo \
@@ -113,15 +120,6 @@ docker compose run --rm odoo -- -c /etc/odoo/odoo.conf -d odoo \
113
120
 
114
121
  Docker Compose runs both Odoo and PostgreSQL. Odoo is available at http://localhost:8069.
115
122
 
116
- The Docker workflow uses the following `odoo-project.ini` configuration:
117
-
118
- ```ini
119
- [odoo]
120
- version = 19.0
121
- ```
122
-
123
- Edit this file when you want to add extra addons, change configuration values, pin repositories, or adjust Python dependency handling.
124
-
125
123
  ### 1.1. Adding extra addons
126
124
 
127
125
  To extend Odoo with additional functionality, add extra addons through `[addons.<name>]` sections in `odoo-project.ini`.
@@ -151,7 +149,7 @@ Sync the configured addon repositories and refresh the generated Docker workflow
151
149
 
152
150
  ```bash
153
151
  odoo-compose --sync-addons
154
- docker compose up --build -d
152
+ docker compose up -d --build
155
153
  ```
156
154
 
157
155
  The addon repositories are cloned into `ROOT/odoo-addons/oca-web/` and `ROOT/odoo-addons/oca-helpdesk/` and bind-mounted into the Odoo container.
@@ -167,10 +165,10 @@ docker compose run --rm odoo -- -c /etc/odoo/odoo.conf -d odoo \
167
165
  --stop-after-init
168
166
  ```
169
167
 
170
- For subsequent addon updates, run `click-odoo-update` inside the Odoo container:
168
+ For subsequent addon updates, use the generated Docker update helper:
171
169
 
172
170
  ```bash
173
- docker compose exec odoo click-odoo-update -c /etc/odoo/odoo.conf -d odoo
171
+ ./docker/local/scripts/update.sh
174
172
  ```
175
173
 
176
174
  ### 1.2. Running Odoo from workspace source
@@ -195,19 +193,21 @@ Sync the Odoo source and generate the Docker artifacts:
195
193
 
196
194
  ```bash
197
195
  odoo-compose --sync-all
198
- docker compose up --build -d
196
+ docker compose up -d --build
199
197
  ```
200
198
 
201
199
  The resolved Odoo source is bind-mounted read-only at `/opt/odoo`. The Odoo Python source from the base image is removed while its installed dependencies remain available.
202
200
 
203
- ### 1.3. Backup and restore
201
+ ### 1.3. Script reference
204
202
 
205
- The Docker workflow generates platform-specific helpers under `ROOT/docker/local/scripts/` for backing up and restoring the PostgreSQL database and Odoo filestore independently. Unix-like systems generate `.sh` helpers; Windows generates the corresponding `.bat` helpers.
203
+ The Docker workflow generates platform-specific helper scripts under `ROOT/docker/local/scripts/`. Unix-like systems generate `.sh` helpers; Windows generates the corresponding `.bat` helpers.
206
204
 
207
205
  On Unix-like systems:
208
206
 
209
207
  ```text
210
208
  docker/local/scripts/
209
+ ├── shell.sh
210
+ ├── update.sh
211
211
  ├── backup-db.sh
212
212
  ├── restore-db.sh
213
213
  ├── neutralize-db.sh
@@ -218,15 +218,41 @@ docker/local/scripts/
218
218
  └── restore-filestore-restic.sh
219
219
  ```
220
220
 
221
- On Windows the same helper names are generated with the `.bat` extension instead. The helpers stream backup data directly between the Docker containers and files on the host. No backup directory is mounted into the containers, and no intermediate backup file is created inside a container. The examples below use the Unix `.sh` form.
221
+ The examples below use the Unix `.sh` form.
222
222
 
223
- The default database name is taken from `[config].db_name` when configured, otherwise it is `odoo`. Override it for any command with `ODOO_DB_NAME`:
223
+ #### 1.3.1. shell
224
+
225
+ Opens an Odoo shell for the configured database:
224
226
 
225
227
  ```bash
226
- ODOO_DB_NAME=odoo_test ./docker/local/scripts/backup-db.sh
228
+ ./docker/local/scripts/shell.sh
229
+ ```
230
+
231
+ The default database name is taken from `[config].db_name` when configured, otherwise it is `odoo`. Override it with `ODOO_DB_NAME`:
232
+
233
+ ```bash
234
+ ODOO_DB_NAME=odoo_test ./docker/local/scripts/shell.sh
235
+ ```
236
+
237
+ Any extra arguments are passed through to the underlying Odoo shell command.
238
+
239
+ #### 1.3.2. update
240
+
241
+ Updates installed addons using `click-odoo-update`:
242
+
243
+ ```bash
244
+ ./docker/local/scripts/update.sh
227
245
  ```
228
246
 
229
- #### 1.3.1. Database backup
247
+ The default database name follows the same `ODOO_DB_NAME` convention as the shell and database helpers.
248
+
249
+ Any extra arguments are passed through to `click-odoo-update`:
250
+
251
+ ```bash
252
+ ./docker/local/scripts/update.sh --update-all
253
+ ```
254
+
255
+ #### 1.3.3. Database backup
230
256
 
231
257
  Create a PostgreSQL custom-format dump under `ROOT/odoo-backups/`:
232
258
 
@@ -246,7 +272,13 @@ Pass an output path explicitly when needed:
246
272
  ./docker/local/scripts/backup-db.sh ./odoo-backups/pre-upgrade.dump
247
273
  ```
248
274
 
249
- #### 1.3.2. Database restore
275
+ The default database name is taken from `[config].db_name` when configured, otherwise it is `odoo`. Override it for any command with `ODOO_DB_NAME`:
276
+
277
+ ```bash
278
+ ODOO_DB_NAME=odoo_test ./docker/local/scripts/backup-db.sh
279
+ ```
280
+
281
+ #### 1.3.4. Database restore
250
282
 
251
283
  Restore a database dump with `pg_restore`:
252
284
 
@@ -283,7 +315,7 @@ To restore the same dump into another database without replacing the default dat
283
315
  ODOO_DB_NAME=odoo_restore ./docker/local/scripts/restore-db.sh ./odoo-backups/pre-upgrade.dump
284
316
  ```
285
317
 
286
- #### 1.3.3. Database neutralization
318
+ #### 1.3.5. Database neutralization
287
319
 
288
320
  For development or test databases restored from production, run the generated neutralization helper explicitly:
289
321
 
@@ -313,7 +345,7 @@ docker compose up -d odoo
313
345
 
314
346
  `--copy` / `--move` and neutralization serve different purposes: copy/move controls restored database identity, while neutralization controls production side effects.
315
347
 
316
- #### 1.3.4. Filestore backup
348
+ #### 1.3.6. Filestore backup
317
349
 
318
350
  Create a compressed tar archive of the selected database filestore:
319
351
 
@@ -344,7 +376,7 @@ docker compose stop odoo
344
376
  docker compose up -d odoo
345
377
  ```
346
378
 
347
- #### 1.3.5. Filestore restore
379
+ #### 1.3.7. Filestore restore
348
380
 
349
381
  Restore a filestore archive:
350
382
 
@@ -368,20 +400,10 @@ ODOO_DB_NAME=odoo_restore ./docker/local/scripts/restore-filestore.sh ./odoo-bac
368
400
 
369
401
  Database and filestore backups are intentionally separate. This allows either part to be restored independently while still making it possible to create matching database and filestore backups when both are needed.
370
402
 
371
- #### 1.3.6. Restic filestore backup
403
+ #### 1.3.8. Restic filestore backup
372
404
 
373
405
  The generated Docker image also includes `restic`. Restic is an additional option intended especially for large filestores where incremental snapshots and deduplication are useful.
374
406
 
375
- The Docker workflow generates platform-specific restic helpers: `.sh` on Unix-like systems and `.bat` on Windows.
376
-
377
- ```text
378
- docker/local/scripts/restic.sh
379
- docker/local/scripts/backup-filestore-restic.sh
380
- docker/local/scripts/restore-filestore-restic.sh
381
- ```
382
-
383
- The corresponding Windows helpers use the same names with the `.bat` extension. The `restic` helper runs the `restic` binary from the generated Odoo image against the same `odoo-data` volume. The restic cache is kept under `/var/lib/odoo/.cache/restic`, outside the filestore directory, so it persists between one-off containers without being included in filestore backups.
384
-
385
407
  Set `RESTIC_REPOSITORY` and either `RESTIC_PASSWORD_FILE` or `RESTIC_PASSWORD` before using the helpers. For a local repository on the Docker host, use an absolute path. The wrapper automatically bind-mounts the repository into the one-off container; Windows drive paths such as `C:\backups\odoo` are supported by `restic.bat`:
386
408
 
387
409
  ```bash
@@ -416,7 +438,7 @@ List or inspect snapshots through the generic wrapper:
416
438
  ./docker/local/scripts/restic.sh check
417
439
  ```
418
440
 
419
- #### 1.3.7. Restic filestore restore
441
+ #### 1.3.9. Restic filestore restore
420
442
 
421
443
  Restore the latest matching filestore snapshot:
422
444
 
@@ -496,16 +518,7 @@ odoo-compose --init ./odoo19 --sync-all --create-venv \
496
518
  > **Note**
497
519
  > Make sure PostgreSQL is running at the configured host and the configured database user exists.
498
520
 
499
- Start Odoo with the generated script:
500
-
501
- ```bash
502
- cd ./odoo19
503
- ./odoo-scripts/run.sh
504
- ```
505
-
506
- Odoo starts with the generated configuration from `./odoo-configs/odoo-server.conf` and is available at http://localhost:8069.
507
-
508
- The native workflow uses the following `odoo-project.ini` configuration, with PostgreSQL connection settings added to `[config]`:
521
+ This creates `./odoo19/odoo-project.ini` with this initial content:
509
522
 
510
523
  ```ini
511
524
  [odoo]
@@ -518,7 +531,14 @@ db_user = odoo
518
531
  db_password = odoo
519
532
  ```
520
533
 
521
- Edit this file when you want to add extra addons, change configuration values, pin repositories, or adjust Python dependency handling.
534
+ Then start Odoo with the generated script:
535
+
536
+ ```bash
537
+ cd ./odoo19
538
+ ./odoo-scripts/run.sh
539
+ ```
540
+
541
+ Odoo starts with the generated configuration from `./odoo-configs/odoo-server.conf` and is available at http://localhost:8069.
522
542
 
523
543
  ### 2.1. Adding extra addons
524
544
 
@@ -0,0 +1 @@
1
+ __version__ = "1.23.4"
@@ -3125,6 +3125,52 @@ echo "INFO: Database restore completed: ${{DB_NAME}}"
3125
3125
  return _write_docker_local_script(layout, "restore-db", content)
3126
3126
 
3127
3127
 
3128
+ def write_docker_shell_sh(layout: Layout, cfg: ProjectConfig) -> Path:
3129
+ default_db_name = shlex.quote(_docker_default_db_name(cfg))
3130
+ content = fr"""#!/usr/bin/env bash
3131
+ set -euo pipefail
3132
+
3133
+ SCRIPT_DIR="$(cd "$(dirname "${{BASH_SOURCE[0]}}")" && pwd)"
3134
+ ROOT_DIR="$(cd "${{SCRIPT_DIR}}/../../.." && pwd)"
3135
+ DEFAULT_DB_NAME={default_db_name}
3136
+ DB_NAME="${{ODOO_DB_NAME:-${{DEFAULT_DB_NAME}}}}"
3137
+
3138
+ cd "${{ROOT_DIR}}"
3139
+
3140
+ echo "INFO: Opening Odoo shell for database '${{DB_NAME}}'."
3141
+ exec docker compose run --rm --no-deps \
3142
+ --entrypoint odoo odoo \
3143
+ shell \
3144
+ -c /etc/odoo/odoo.conf \
3145
+ -d "${{DB_NAME}}" \
3146
+ "$@"
3147
+ """
3148
+ return _write_docker_local_script(layout, "shell", content)
3149
+
3150
+
3151
+ def write_docker_update_sh(layout: Layout, cfg: ProjectConfig) -> Path:
3152
+ default_db_name = shlex.quote(_docker_default_db_name(cfg))
3153
+ content = fr"""#!/usr/bin/env bash
3154
+ set -euo pipefail
3155
+
3156
+ SCRIPT_DIR="$(cd "$(dirname "${{BASH_SOURCE[0]}}")" && pwd)"
3157
+ ROOT_DIR="$(cd "${{SCRIPT_DIR}}/../../.." && pwd)"
3158
+ DEFAULT_DB_NAME={default_db_name}
3159
+ DB_NAME="${{ODOO_DB_NAME:-${{DEFAULT_DB_NAME}}}}"
3160
+
3161
+ cd "${{ROOT_DIR}}"
3162
+
3163
+ echo "INFO: Updating Odoo addons for database '${{DB_NAME}}'. Passing through any extra arguments."
3164
+ exec docker compose run --rm --no-deps -T \
3165
+ --entrypoint click-odoo-update odoo \
3166
+ -c /etc/odoo/odoo.conf \
3167
+ -d "${{DB_NAME}}" \
3168
+ --log-level debug \
3169
+ "$@"
3170
+ """
3171
+ return _write_docker_local_script(layout, "update", content)
3172
+
3173
+
3128
3174
  def write_docker_neutralize_db_sh(layout: Layout, cfg: ProjectConfig) -> Path:
3129
3175
  default_db_name = shlex.quote(_docker_default_db_name(cfg))
3130
3176
  odoo_major_version = _parse_odoo_version(cfg.odoo.version)
@@ -3617,6 +3663,54 @@ exit /b 2
3617
3663
  return _write_docker_local_script(layout, "restore-db", content, ext="bat")
3618
3664
 
3619
3665
 
3666
+ def write_docker_shell_bat(layout: Layout, cfg: ProjectConfig) -> Path:
3667
+ default_db_name = _docker_default_db_name(cfg).replace("%", "%%")
3668
+ content = rf"""@echo off
3669
+ setlocal
3670
+
3671
+ set "SCRIPT_DIR=%~dp0"
3672
+ if "%SCRIPT_DIR:~-1%"=="\" set "SCRIPT_DIR=%SCRIPT_DIR:~0,-1%"
3673
+ for %%I in ("%SCRIPT_DIR%\..\..\..") do set "ROOT_DIR=%%~fI"
3674
+ set "DEFAULT_DB_NAME={default_db_name}"
3675
+ if defined ODOO_DB_NAME (
3676
+ set "DB_NAME=%ODOO_DB_NAME%"
3677
+ ) else (
3678
+ set "DB_NAME=%DEFAULT_DB_NAME%"
3679
+ )
3680
+
3681
+ cd /d "%ROOT_DIR%" || exit /b 1
3682
+
3683
+ echo INFO: Opening Odoo shell for database '%DB_NAME%'.
3684
+ docker compose run --rm --no-deps --entrypoint odoo odoo shell -c /etc/odoo/odoo.conf -d "%DB_NAME%" %*
3685
+ exit /b %ERRORLEVEL%
3686
+ """
3687
+ return _write_docker_local_script(layout, "shell", content, ext="bat")
3688
+
3689
+
3690
+ def write_docker_update_bat(layout: Layout, cfg: ProjectConfig) -> Path:
3691
+ default_db_name = _docker_default_db_name(cfg).replace("%", "%%")
3692
+ content = rf"""@echo off
3693
+ setlocal
3694
+
3695
+ set "SCRIPT_DIR=%~dp0"
3696
+ if "%SCRIPT_DIR:~-1%"=="\" set "SCRIPT_DIR=%SCRIPT_DIR:~0,-1%"
3697
+ for %%I in ("%SCRIPT_DIR%\..\..\..") do set "ROOT_DIR=%%~fI"
3698
+ set "DEFAULT_DB_NAME={default_db_name}"
3699
+ if defined ODOO_DB_NAME (
3700
+ set "DB_NAME=%ODOO_DB_NAME%"
3701
+ ) else (
3702
+ set "DB_NAME=%DEFAULT_DB_NAME%"
3703
+ )
3704
+
3705
+ cd /d "%ROOT_DIR%" || exit /b 1
3706
+
3707
+ echo INFO: Updating Odoo addons for database '%DB_NAME%'. Passing through any extra arguments.
3708
+ docker compose run --rm --no-deps -T --entrypoint click-odoo-update odoo -c /etc/odoo/odoo.conf -d "%DB_NAME%" --log-level debug %*
3709
+ exit /b %ERRORLEVEL%
3710
+ """
3711
+ return _write_docker_local_script(layout, "update", content, ext="bat")
3712
+
3713
+
3620
3714
  def write_docker_neutralize_db_bat(layout: Layout, cfg: ProjectConfig) -> Path:
3621
3715
  default_db_name = _docker_default_db_name(cfg).replace("%", "%%")
3622
3716
  odoo_major_version = _parse_odoo_version(cfg.odoo.version)
@@ -4027,6 +4121,8 @@ exit /b 2
4027
4121
  def write_docker_local_scripts(layout: Layout, cfg: ProjectConfig) -> dict[str, Path]:
4028
4122
  if sys.platform.startswith("win"):
4029
4123
  return {
4124
+ "shell": write_docker_shell_bat(layout, cfg),
4125
+ "update": write_docker_update_bat(layout, cfg),
4030
4126
  "backup_db": write_docker_backup_db_bat(layout, cfg),
4031
4127
  "restore_db": write_docker_restore_db_bat(layout, cfg),
4032
4128
  "neutralize_db": write_docker_neutralize_db_bat(layout, cfg),
@@ -4038,6 +4134,8 @@ def write_docker_local_scripts(layout: Layout, cfg: ProjectConfig) -> dict[str,
4038
4134
  }
4039
4135
 
4040
4136
  return {
4137
+ "shell": write_docker_shell_sh(layout, cfg),
4138
+ "update": write_docker_update_sh(layout, cfg),
4041
4139
  "backup_db": write_docker_backup_db_sh(layout, cfg),
4042
4140
  "restore_db": write_docker_restore_db_sh(layout, cfg),
4043
4141
  "neutralize_db": write_docker_neutralize_db_sh(layout, cfg),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: odoo-devops-tools
3
- Version: 1.23.2
3
+ Version: 1.23.4
4
4
  Summary: Build reproducible Odoo workspaces from a single project definition.
5
5
  Author: Roman Lacko
6
6
  License-Expression: MIT
@@ -123,14 +123,21 @@ Create a new workspace:
123
123
  odoo-compose --init ./odoo19
124
124
  ```
125
125
 
126
- Start the Docker Compose environment:
126
+ This creates `./odoo19/odoo-project.ini` with this initial content:
127
+
128
+ ```ini
129
+ [odoo]
130
+ version = 19.0
131
+ ```
132
+
133
+ Then start the Docker Compose environment:
127
134
 
128
135
  ```bash
129
136
  cd ./odoo19
130
- docker compose up -d
137
+ docker compose up -d --build
131
138
  ```
132
139
 
133
- Initialize the Odoo database:
140
+ Optionally initialize the Odoo database from the command line instead of through the web interface:
134
141
 
135
142
  ```bash
136
143
  docker compose run --rm odoo -- -c /etc/odoo/odoo.conf -d odoo \
@@ -141,15 +148,6 @@ docker compose run --rm odoo -- -c /etc/odoo/odoo.conf -d odoo \
141
148
 
142
149
  Docker Compose runs both Odoo and PostgreSQL. Odoo is available at http://localhost:8069.
143
150
 
144
- The Docker workflow uses the following `odoo-project.ini` configuration:
145
-
146
- ```ini
147
- [odoo]
148
- version = 19.0
149
- ```
150
-
151
- Edit this file when you want to add extra addons, change configuration values, pin repositories, or adjust Python dependency handling.
152
-
153
151
  ### 1.1. Adding extra addons
154
152
 
155
153
  To extend Odoo with additional functionality, add extra addons through `[addons.<name>]` sections in `odoo-project.ini`.
@@ -179,7 +177,7 @@ Sync the configured addon repositories and refresh the generated Docker workflow
179
177
 
180
178
  ```bash
181
179
  odoo-compose --sync-addons
182
- docker compose up --build -d
180
+ docker compose up -d --build
183
181
  ```
184
182
 
185
183
  The addon repositories are cloned into `ROOT/odoo-addons/oca-web/` and `ROOT/odoo-addons/oca-helpdesk/` and bind-mounted into the Odoo container.
@@ -195,10 +193,10 @@ docker compose run --rm odoo -- -c /etc/odoo/odoo.conf -d odoo \
195
193
  --stop-after-init
196
194
  ```
197
195
 
198
- For subsequent addon updates, run `click-odoo-update` inside the Odoo container:
196
+ For subsequent addon updates, use the generated Docker update helper:
199
197
 
200
198
  ```bash
201
- docker compose exec odoo click-odoo-update -c /etc/odoo/odoo.conf -d odoo
199
+ ./docker/local/scripts/update.sh
202
200
  ```
203
201
 
204
202
  ### 1.2. Running Odoo from workspace source
@@ -223,19 +221,21 @@ Sync the Odoo source and generate the Docker artifacts:
223
221
 
224
222
  ```bash
225
223
  odoo-compose --sync-all
226
- docker compose up --build -d
224
+ docker compose up -d --build
227
225
  ```
228
226
 
229
227
  The resolved Odoo source is bind-mounted read-only at `/opt/odoo`. The Odoo Python source from the base image is removed while its installed dependencies remain available.
230
228
 
231
- ### 1.3. Backup and restore
229
+ ### 1.3. Script reference
232
230
 
233
- The Docker workflow generates platform-specific helpers under `ROOT/docker/local/scripts/` for backing up and restoring the PostgreSQL database and Odoo filestore independently. Unix-like systems generate `.sh` helpers; Windows generates the corresponding `.bat` helpers.
231
+ The Docker workflow generates platform-specific helper scripts under `ROOT/docker/local/scripts/`. Unix-like systems generate `.sh` helpers; Windows generates the corresponding `.bat` helpers.
234
232
 
235
233
  On Unix-like systems:
236
234
 
237
235
  ```text
238
236
  docker/local/scripts/
237
+ ├── shell.sh
238
+ ├── update.sh
239
239
  ├── backup-db.sh
240
240
  ├── restore-db.sh
241
241
  ├── neutralize-db.sh
@@ -246,15 +246,41 @@ docker/local/scripts/
246
246
  └── restore-filestore-restic.sh
247
247
  ```
248
248
 
249
- On Windows the same helper names are generated with the `.bat` extension instead. The helpers stream backup data directly between the Docker containers and files on the host. No backup directory is mounted into the containers, and no intermediate backup file is created inside a container. The examples below use the Unix `.sh` form.
249
+ The examples below use the Unix `.sh` form.
250
250
 
251
- The default database name is taken from `[config].db_name` when configured, otherwise it is `odoo`. Override it for any command with `ODOO_DB_NAME`:
251
+ #### 1.3.1. shell
252
+
253
+ Opens an Odoo shell for the configured database:
252
254
 
253
255
  ```bash
254
- ODOO_DB_NAME=odoo_test ./docker/local/scripts/backup-db.sh
256
+ ./docker/local/scripts/shell.sh
257
+ ```
258
+
259
+ The default database name is taken from `[config].db_name` when configured, otherwise it is `odoo`. Override it with `ODOO_DB_NAME`:
260
+
261
+ ```bash
262
+ ODOO_DB_NAME=odoo_test ./docker/local/scripts/shell.sh
263
+ ```
264
+
265
+ Any extra arguments are passed through to the underlying Odoo shell command.
266
+
267
+ #### 1.3.2. update
268
+
269
+ Updates installed addons using `click-odoo-update`:
270
+
271
+ ```bash
272
+ ./docker/local/scripts/update.sh
255
273
  ```
256
274
 
257
- #### 1.3.1. Database backup
275
+ The default database name follows the same `ODOO_DB_NAME` convention as the shell and database helpers.
276
+
277
+ Any extra arguments are passed through to `click-odoo-update`:
278
+
279
+ ```bash
280
+ ./docker/local/scripts/update.sh --update-all
281
+ ```
282
+
283
+ #### 1.3.3. Database backup
258
284
 
259
285
  Create a PostgreSQL custom-format dump under `ROOT/odoo-backups/`:
260
286
 
@@ -274,7 +300,13 @@ Pass an output path explicitly when needed:
274
300
  ./docker/local/scripts/backup-db.sh ./odoo-backups/pre-upgrade.dump
275
301
  ```
276
302
 
277
- #### 1.3.2. Database restore
303
+ The default database name is taken from `[config].db_name` when configured, otherwise it is `odoo`. Override it for any command with `ODOO_DB_NAME`:
304
+
305
+ ```bash
306
+ ODOO_DB_NAME=odoo_test ./docker/local/scripts/backup-db.sh
307
+ ```
308
+
309
+ #### 1.3.4. Database restore
278
310
 
279
311
  Restore a database dump with `pg_restore`:
280
312
 
@@ -311,7 +343,7 @@ To restore the same dump into another database without replacing the default dat
311
343
  ODOO_DB_NAME=odoo_restore ./docker/local/scripts/restore-db.sh ./odoo-backups/pre-upgrade.dump
312
344
  ```
313
345
 
314
- #### 1.3.3. Database neutralization
346
+ #### 1.3.5. Database neutralization
315
347
 
316
348
  For development or test databases restored from production, run the generated neutralization helper explicitly:
317
349
 
@@ -341,7 +373,7 @@ docker compose up -d odoo
341
373
 
342
374
  `--copy` / `--move` and neutralization serve different purposes: copy/move controls restored database identity, while neutralization controls production side effects.
343
375
 
344
- #### 1.3.4. Filestore backup
376
+ #### 1.3.6. Filestore backup
345
377
 
346
378
  Create a compressed tar archive of the selected database filestore:
347
379
 
@@ -372,7 +404,7 @@ docker compose stop odoo
372
404
  docker compose up -d odoo
373
405
  ```
374
406
 
375
- #### 1.3.5. Filestore restore
407
+ #### 1.3.7. Filestore restore
376
408
 
377
409
  Restore a filestore archive:
378
410
 
@@ -396,20 +428,10 @@ ODOO_DB_NAME=odoo_restore ./docker/local/scripts/restore-filestore.sh ./odoo-bac
396
428
 
397
429
  Database and filestore backups are intentionally separate. This allows either part to be restored independently while still making it possible to create matching database and filestore backups when both are needed.
398
430
 
399
- #### 1.3.6. Restic filestore backup
431
+ #### 1.3.8. Restic filestore backup
400
432
 
401
433
  The generated Docker image also includes `restic`. Restic is an additional option intended especially for large filestores where incremental snapshots and deduplication are useful.
402
434
 
403
- The Docker workflow generates platform-specific restic helpers: `.sh` on Unix-like systems and `.bat` on Windows.
404
-
405
- ```text
406
- docker/local/scripts/restic.sh
407
- docker/local/scripts/backup-filestore-restic.sh
408
- docker/local/scripts/restore-filestore-restic.sh
409
- ```
410
-
411
- The corresponding Windows helpers use the same names with the `.bat` extension. The `restic` helper runs the `restic` binary from the generated Odoo image against the same `odoo-data` volume. The restic cache is kept under `/var/lib/odoo/.cache/restic`, outside the filestore directory, so it persists between one-off containers without being included in filestore backups.
412
-
413
435
  Set `RESTIC_REPOSITORY` and either `RESTIC_PASSWORD_FILE` or `RESTIC_PASSWORD` before using the helpers. For a local repository on the Docker host, use an absolute path. The wrapper automatically bind-mounts the repository into the one-off container; Windows drive paths such as `C:\backups\odoo` are supported by `restic.bat`:
414
436
 
415
437
  ```bash
@@ -444,7 +466,7 @@ List or inspect snapshots through the generic wrapper:
444
466
  ./docker/local/scripts/restic.sh check
445
467
  ```
446
468
 
447
- #### 1.3.7. Restic filestore restore
469
+ #### 1.3.9. Restic filestore restore
448
470
 
449
471
  Restore the latest matching filestore snapshot:
450
472
 
@@ -524,16 +546,7 @@ odoo-compose --init ./odoo19 --sync-all --create-venv \
524
546
  > **Note**
525
547
  > Make sure PostgreSQL is running at the configured host and the configured database user exists.
526
548
 
527
- Start Odoo with the generated script:
528
-
529
- ```bash
530
- cd ./odoo19
531
- ./odoo-scripts/run.sh
532
- ```
533
-
534
- Odoo starts with the generated configuration from `./odoo-configs/odoo-server.conf` and is available at http://localhost:8069.
535
-
536
- The native workflow uses the following `odoo-project.ini` configuration, with PostgreSQL connection settings added to `[config]`:
549
+ This creates `./odoo19/odoo-project.ini` with this initial content:
537
550
 
538
551
  ```ini
539
552
  [odoo]
@@ -546,7 +559,14 @@ db_user = odoo
546
559
  db_password = odoo
547
560
  ```
548
561
 
549
- Edit this file when you want to add extra addons, change configuration values, pin repositories, or adjust Python dependency handling.
562
+ Then start Odoo with the generated script:
563
+
564
+ ```bash
565
+ cd ./odoo19
566
+ ./odoo-scripts/run.sh
567
+ ```
568
+
569
+ Odoo starts with the generated configuration from `./odoo-configs/odoo-server.conf` and is available at http://localhost:8069.
550
570
 
551
571
  ### 2.1. Adding extra addons
552
572
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "odoo-devops-tools"
7
- version = "1.23.2"
7
+ version = "1.23.4"
8
8
  description = "Build reproducible Odoo workspaces from a single project definition."
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -1 +0,0 @@
1
- __version__ = "1.23.2"