- Replace `command -v` with `ansible.builtin.stat` for verifying backup tool existence to improve idempotency and error handling
- Update `docker-postgres-dump` condition to `docker-postgres-backup` for consistency
- Correct `docker-volume` condition to `docker-volume-backup` in volume backup tasks
- Add Odoo backup task inclusion in `roles/odoo/tasks/odoo.yml` to integrate with the unified restic backup mechanism
- Standardize variable registration and failure conditions across all backup verification tasks
- Replace `sed`-based hostname extraction with `grep -oE` to accurately isolate numeric suffixes
- Ensure consistent variable quoting in loops and `printf` commands to prevent word splitting
- Update the free hostname check to use anchored `grep` patterns for precise matching
- Fix variable naming in `roles/odoo/files/docker-odoo-init` from `without_demo` to `with_demo` to accurately reflect the intended behavior
- Update the `-w` flag handling to set `with_demo` to `--with-demo` instead of clearing the `without_demo` variable
- Ensure the Odoo initialization command correctly passes the demo flag when the `-w` option is provided
- Add `snippet` to `enabledCssSnippets` in `.obsidian/appearance.json` to activate the custom CSS snippet
- Add `.obsidian/appearance.json` to configure Ubuntu Mono as the default font family
- Remove `.obsidian/appearance.json` and `.obsidian/graph.json` from `.gitignore` to track appearance settings
- Ensure `.vercel` is properly listed in `.gitignore` with a trailing newline
- Revert `roles/postgres/defaults/main.yml` to mount the volume to `/var/lib/postgresql` instead of `/var/lib/postgresql/data`
- Align the volume configuration with the backup and restore scripts which expect the parent directory mount
- Remove unused CSS snippet in `.obsidian/snippets/snippet.css`
- Fix `roles/postgres/defaults/main.yml` and `README.md` to mount the named volume directly to `/var/lib/postgresql/data` instead of the parent directory
- Prevent Docker from creating an anonymous volume that causes data loss during backup and restore operations
- Update `prompt.md` with a detailed explanation of the volume declaration issue and the fix
- Fix `docker-volume-backup` to correctly parse volume names by filtering for `Type == "volume"` and using proper newline separation instead of concatenating names
- Replace fragile manual array conversion with `mapfile` and `IFS` handling for robust volume list processing
- Fix `docker-volume-restore` to prevent word splitting errors by passing the filename via environment variable and using single quotes for the inner shell command
- Update `prompt.md` to reflect the completed task and token usage
- Rename GitHub Actions workflows to `deploy-docs.yml` and `test-project.yml` with specific job names
- Configure `deploy-docs.yml` to trigger only on markdown file changes
- Create `docs/` directory and move `roles.md`, `scripts.md`, and `upgrade-odoo.md` into it
- Add symlinks in `docs/` for `README.md` and `roles/` to maintain root-level access
- Update `.vuepress/config.js` to resolve absolute paths for `dest`, `public`, `temp`, and `cache`
- Update `package.json` scripts to build and dev from the `docs` folder
- Mark the migration task in `prompt.md` as completed with model and token details
- Add `prompt.md` file documenting the task to move Vuepress pages into a `docs` folder
- Remove obsolete prompt files (`prompts/01` through `prompts/23`) as their tasks have been completed
- Consolidate historical task records to maintain a clean repository state
- Change log message in `roles/docker/files/docker-import` from "Importing content" to "Stream content" to accurately describe the streaming tar operation
- Aligns with previous refactoring that eliminated intermediate file transfers
- Add command to remove the temporary PostgreSQL dump file after successful restore
- Add command to remove the temporary filestore tar archive after successful import
- Ensure no residual artifacts remain on the target server post-upgrade
- Replace `USERNAME` and `TARGET_USERNAME` with `USER` and `TARGET_USER` in `bin/upgrade-odoo` to align with existing environment variable conventions
- Update SSH command construction in `upgrade-odoo` to use the standardized user variables
- Refactor `roles/docker/files/docker-export` to stream tar content directly to the destination file, eliminating temporary file creation inside the container
- Refactor `roles/docker/files/docker-import` to stream tar content directly from the source file, removing the need for intermediate file transfer and cleanup
- Update log messages in both scripts to reflect the streaming approach
- Add `postgres_volumes` configuration with legacy mount path `/var/lib/postgresql/data` to 56 existing host vars files for Postgres versions <= 17
- Skip updates for hosts already using Postgres 18+ or those with existing volume configurations
- Update `AGENTS.md` with session info details for the pi harness
- Fix `roles/odoo/README.md` Ansible command to target `inventories/mint_system`
- Create prompt file documenting the volume configuration migration task
- Change PostgreSQL volume mount path from `/var/lib/postgresql/data` to `/var/lib/postgresql` across README files and role defaults
- Upgrade default PostgreSQL Docker image from `postgres:14-alpine` to `postgres:18-alpine`
- Update documentation and configuration defaults in `README.md`, `roles/docker_compose/README.md`, `roles/postgres/README.md`, and `roles/postgres/defaults/main.yml`
- Replace private user room link with public `#ansible-build` room in `.vuepress/config.js`
- Update Matrix badge URL in `README.md` to match the new public room link
- Add "Free disk space" label to the current environment output section
- Add "Free disk space" label to the target environment output section
- Maintain existing output formatting and variable usage
- Introduce `odoo_apps` role to the `plays/odoo.yml` playbook
- Assign the `odoo_apps` tag to the new role for selective execution
- Ensure the role is included after `packages` in the play sequence
- Update `cron` role installation script to fetch from `$repository/cron/` instead of `$repository/postgres/`
- Update `docker` role installation script to fetch from `$repository/docker/` instead of `$repository/docker_volume/`
- Update `firehol` role installation script to fetch from `$repository/firehol/` instead of `$repository/cron/`
- Update `nginx` role installation script to fetch from `$repository/nginx/` instead of the generic `$repository/`
- Ensure all installation scripts target the correct directory structure within the repository for their respective roles
- Disable sourcemaps and compressed size reporting in the Vite bundler to reduce build output size
- Increase Node.js memory limit to 768MB for the build script to prevent out-of-memory errors
- Configure `viteOptions` within `viteBundler` to apply build optimizations globally
- Eliminate explanatory comments regarding record normalization and formatting rules
- Retain the functional logic for normalizing MX and TXT records in the `infomaniak_desired_records` fact
- Clean up the `infomaniak_dns.yml` file to reduce visual noise while preserving the single source of truth for record formatting
- Replace repetitive per-task target formatting logic with a single normalization step
- Introduce `infomaniak_desired_records` fact to store structured objects (key, id, source, type, target, ttl)
- Apply specific formatting rules for MX (priority prefix) and TXT (quote wrapping) records during normalization
- Simplify Create, Update, and Delete tasks to operate on the pre-normalized list
- Remove redundant variable definitions and conditional logic from individual URI tasks
- Ensure consistent key generation across all DNS record operations
- Update VuePress ecosystem packages (bundler-vite, client, plugins, theme, utils) from rc.112/rc.115/rc.24 to rc.134/rc.31
- Upgrade Vue from 3.5.18 to 3.5.42 and Sass from 1.90.0 to 1.104.0
- Update Vite to 8.2.2 and Shiki to 4.4.3
- Refresh `pnpm-lock.yaml` to reflect new dependency tree and resolved versions
- Remove redundant `[task](./task.md)` link in `README.md` as `task help` is sufficient
- Update `.vuepress/config.js` page patterns to explicitly include only `roles/**/*.md`, `README.md`, `roles.md`, `scripts.md`, and `upgrade-odoo.md`
- Remove generic glob patterns and excluded directories to focus the documentation build on core operational guides
- Replace string-based DNS record identification with structured objects containing key, id, source, type, target, and ttl
- Update DNS creation, update, and deletion logic to use the new composite key for matching records
- Refine TTL update logic to only trigger when the desired TTL differs from the existing one
- Remove `open-url-with-delay` calls in favor of `open-url` in `upgrade-odoo` and `task` scripts
- Simplify URL opening logic by removing unnecessary delay arguments
- Add `|| true` to `activate-venv` call to prevent script failure if virtual environment is not available
- Ensure task execution continues even when venv activation is skipped
- Add `--user` flag support to install scripts in `~/.local/bin` instead of `/usr/local/bin`
- Remove `sudo` requirement for script installation and execution
- Fix repository URL from `cron` to `postgres` for script downloads
- Update installation directory logic to handle both system and user contexts
- Create target directory automatically when installing in user mode
- Add section for "Hetzner InRelease repo expired" with problem description, workaround using archive repo, and solution to upgrade distro
- Add section for "Debian InRelease repo expired" with similar workaround and solution steps
- Include specific commands for backing up sources.list, modifying repo URLs, and disabling validity checks
- Update `roles/update/README.md` to assist users encountering apt cache expiration errors
- Rename opsone inventory folders and hosts to follow `clio_odoo_*` scoping pattern
- Merge `clio` and `clio_odoo_*` groups into `inventories/mint_system/hosts.yml`
- Move scoped `host_vars` from opsone to mint_system directory
- Remove `inventories/opsone` folder after successful merge
- Validate merged inventory structure using `ansible-inventory`
- Document the task execution, scope, and worklog in `prompts/22_merge-opsone-inventory.md`
- Add section detailing how to create an admin account using `docker exec`
- Provide the specific `rake admin:create` command and explain the output
- Note that the command returns credentials for accessing the admin panel
- Replace verbose package installation tasks in Ubuntu 18.04 and 22.04 roles with a single `fail` task executing the official bbb-install script
- Update Ubuntu 22.04 script URL to v3.0.x-release and add `-g` flag for Greenlight integration
- Remove `greenlight_container` removal and extensive file cleanup tasks from `roles/cleanup/tasks/bbb_install.yml` as the installation is now handled externally
- Update task names to reflect the shift from manual configuration to script execution
- Rename "Deploy to Kubernetes" step to "Delete existing pods" for clarity
- Add "Wait for pod to be running" step to ensure new pods are ready before proceeding
- Add missing newlines to separate workflow steps
- Add `set_fact` task to initialize `infomaniak_dns_present` to an empty list at the start of `infomaniak_dns.yml`
- Remove redundant `| default([])` filter in the fact accumulation step as the list is now explicitly reset
- Document the fix in `prompts/21_fix-infomaniak-dns-task.md` with context, task details, and worklog
- Change `cp` commands in `task` build-vuepress function to `cp -r` to correctly copy directory contents from roles
- Add `pnpm-workspace.yaml` to project root and update `.gitignore` to track it
- Update README.md to replace Vercel badge with GitHub Actions deploy workflow badge
- Add default values for PORT and TARGET_PORT variables in `bin/upgrade-odoo` script
- Add `.github/workflows/deploy.yml` to automate Kubernetes pod deletion on main branch push
- Change Ansible log path from `/var/log/ansible.log` to `/var/tmp/ansible.log` in `ansible.cfg.template`
- Remove manual log file setup steps from the `task` install function as the log path no longer requires root permissions
- Reorder roles in `plays/setup.yml` to move `iam` to the end and remove `restic_server` and `dozzle`
- Update `roles/docker` to use `ansible.builtin.get_url` for GPG key retrieval, aligning with modern Ansible best practices
- Add troubleshooting documentation for public key verification errors in `roles/docker/README.md`
- Merge `odoo` and `nextcloud` inventories into `mint_system` with scoped host and group variables
- Rename host_vars folders and apply `_odoo`/`_nextcloud` suffixes to hosts for clear separation
- Restructure `mint_system/hosts.yml` to group hosts under `setup`, `odoo`, and `nextcloud` children
- Update playbooks (`all`, `nextcloud`, `odoo`, `setup`) to target specific host groups instead of `all`
- Remove redundant `postgres` and `mariadb` dependencies from `nextcloud` role meta
- Refactor `list-hosts` script to support flattened inventory structures and improved column sorting
- Mark inventory merge task as completed in documentation
- Fix missing variable expansion in the upgrade-production step by adding the `$` prefix to `USE_OPENUPGRADE`
- Add conditional logic to the update step to skip module updates when OpenUpgrade is enabled, preventing unnecessary operations during the upgrade process
- Include the postgres role in the odoo play to ensure database dependencies are met
- Apply the `odoo` tag to the postgres role to enable selective execution via Ansible filtering
- Fix incorrect variable usage in filestore cleanup to remove the target tar file instead of the source
- Insert database duplication step before running OpenUpgrade to ensure the upgrade operates on a dedicated database
- Add `odoo_scripts` tag to the odoo role and its script inclusion task for better Ansible filtering
- Remove explicit postgres dependency from the odoo role metadata to decouple installation steps
- Replace hardcoded SSH flags in rsync commands with dynamic `rsync_server` and `rsync_target_server` variables to properly support jump hosts
- Update filestore export logic to specify output directory explicitly and rename the resulting tar file to match the target container name
- Clean up trailing whitespace in the help output section
- Integrate `docker-odoo-openupgrade` execution path into `upgrade-test` and `upgrade-production` based on `USE_OPENUPGRADE` flag
- Remove separate `openupgrade-test` and `openupgrade-production` commands to streamline the workflow
- Reorganize `upgrade-odoo` help output into "Execute", "Debug", and "Rename" sections
- Rename `restore-database` and `restore-filestore` commands to `replace-database` and `replace-filestore`
- Remove deprecated `restore-database` and `restore-filestore` implementation stubs
- Update `upgrade-odoo.md` to reflect command renaming and the unified execution logic
- Add `browse` and `stop-container` to the help list
- Display OpenUpgrade configuration status in the upgrade configuration summary
- Add `docker-odoo-openupgrade` to the list of available scripts in `install` and `odoo_scripts.yml`
- Update `scripts.md` to include the new script link
- Refine `upgrade-odoo.md` to clarify the distinction between Enterprise and OpenUpgrade execution paths in test mode
- Update the upgrade guide to distinguish between Enterprise and OpenUpgrade workflows
- Add `openupgrade-test` task description for running OpenUpgrade scripts in test mode
- Add `openupgrade-production` task description for running OpenUpgrade scripts in production
- Rename `production` task reference to `upgrade-production` for consistency with Enterprise scripts
- Clarify that Enterprise and OpenUpgrade scripts are now separate execution paths
- Replace manual mode selection with automatic sequential version iteration
- Introduce `-v` flag to specify the Odoo volume for data persistence
- Add logic to calculate intermediate major versions between source and target
- Execute OpenUpgrade steps (image pull, library install, migration) in a loop
- Validate that target version is strictly greater than source version
- Remove `-m` flag and test/production mode distinction
- Update help text and usage examples to reflect new workflow
- Introduce `docker-odoo-openupgrade` script to automate OpenUpgrade processes
- Support multiple version upgrades via command-line arguments (-s, -t)
- Include configuration for container, database, and execution mode (test/production)
- Prepare infrastructure for pulling images and installing openupgradelib
- Relocate the "Requirements" section regarding helper scripts to the beginning of the document
- Remove the redundant "Helper Scripts" section and the list of involved projects
- Maintain the links to docker, odoo, and postgres script documentation
- Consolidate individual odoo sub-roles (packages, apps, repos, enterprise, data) into a single `odoo` role in `plays/odoo.yml`
- Restructure `roles/odoo/tasks/main.yml` to include scripts and data tasks within the main role
- Adjust the condition for including odoo tasks to check if `odoo_configmap` length equals 1
- Change target inventory name from `setup` to `mint_system` in task instructions
- Update all file paths in the merge strategy to reference `inventories/mint_system`
- Remove the final rename step from instructions as the target is now directly `mint_system`
- Adjust expected final folder structure to list `mint_system` instead of `setup`
- Replace all references to `inventories/odoo` and `inventories/setup` with `inventories/mint_system` in README.md
- Update cleanup playbook filename from `cleanup.yml.yml` to `cleanup.yml` in documentation examples
- Extend host configuration lookup in `task` script to search nested children groups if not found in direct children
- Update merge strategy prompt to include moving `odoo` and `nextcloud` group_vars to the new `setup` scope
- Remove `docker` and `docker_hosts` roles from `plays/setup.yml`
- Replace `docker_hosts` role with `docker_network` in setup playbook
- Create task prompt `prompts/19_merge-inventories.md` detailing the merge strategy
- Rename host variables in odoo and nextcloud inventories with service suffixes
- Restructure group variables to separate odoo and nextcloud scopes
- Consolidate inventories into a new `setup` structure before renaming to `mint_system`
- Update `README.md` to reflect new secret generation command and inventory changes
- Change the `when` clause in `roles/odoo/tasks/main.yml`
- Update condition from checking `odoo_configmap` length to checking if `odoo_configmap` is undefined
- Ensure tasks are included only when the configmap is not explicitly set
- Document the "Chain 'FIREHOL_BLACKLIST' does not exist" error
- Document the "No chain/target/match by that name" error
- Add manual command to create the missing `FIREHOL_BLACKLIST` chain
- Ensure file ends with a newline
- Create new `bin/upgrade-odoo` script to manage Odoo version upgrades between environments
- Implement steps for database/filestore dump, restore, and rename operations
- Add support for test and production upgrade modes with module initialization and configuration
- Include troubleshooting commands (logs, shell, psql, env, conf)
- Add `upgrade-odoo` command to the main task script with dynamic help table entry
- Introduce dotenv management commands (`copy`, `create`, `edit`, `list`, `load`, `remove`, `rename`, `restore`, `show`)
- Update navigation menu in `.vuepress/config.js` with "Upgrade Odoo" link
- Create comprehensive `upgrade-odoo.md` documentation covering setup, test run, production run, and recovery
- Update `CHANGELOG.md` with new features and changes
- Configure `dev-vuepress` task to automatically open the browser after starting the server
- Create new prompt `prompts/18_odoo-cloc-script-module-names-only.md`
- Define task to add `-s` flag to `roles/odoo/files/docker-odoo-cloc` script
- Configure output to list only module names when flag is present
- Exclude `odoo/studio` from the filtered output
- Create new prompt `prompts/18_odoo-cloc-script-module-names-only.md`
- Define task to add `-s` flag to `roles/odoo/files/docker-odoo-cloc` script
- Configure output to list only module names when flag is present
- Exclude `odoo/studio` from the filtered output
- Switch Coturn container to `host` network mode to simplify port mapping
- Remove hardcoded `coturn_data_dir` and `turnserver.conf` template
- Pass configuration via environment variables (`STATIC_AUTH_SECRET`, `DETECT_EXTERNAL_IP`, `DETECT_RELAY_IP`) and command-line arguments
- Add `coturn_static_auth_secret` and `coturn_realm` variables to defaults
- Update README with new configuration options and STUN testing instructions
- Add `docker_network` role to `plays/all.yml` playbook
- Update Coturn role to use official `coturn/coturn:4.5.2` image
- Remove hardcoded external IP and domain variables from Coturn configuration
- Disable template-based `turnserver.conf` generation and remove the template file
- Adjust Docker container port mappings to support standard TURN/STUN ports (3478, 5349) and dynamic relay ports (49152-65535)
- Update Coturn README with new configuration defaults and description
- Switch from `searchPlugin` to `slimsearchPlugin` for documentation search
- Implement custom search filtering logic in `client.js` to handle multi-word phrase matching
- Add `Layout.vue` to inject Mint System GmbH branding in the navbar
- Refactor Plausible analytics integration into dedicated `plausibleClient.js` module
- Update navigation links to remove redundant Home and Mint System entries
- Add `pnpm-workspace.yaml` to `.gitignore` and create empty `styles/index.scss`
- Fix HTTP 500 error caused by Infomaniak v2 API requiring MX priority to be embedded in the target string (e.g., "10 mail.server.com") rather than a separate field
- Update matching logic to filter by source, type, and normalized target to correctly handle duplicate MX records (e.g., mxa and mxb)
- Add automatic priority prepending (default 10) for MX records if not already present
- Update `roles/infomaniak/README.md` with MX configuration examples and manual curl update instructions
- Add debug prompt `prompts/17_debug-infomaniak-dns.md` documenting the investigation and root cause analysis
- Added GitHub source links for all scripts listed in scripts.md
- Used consistent format: https://github.com/Mint-System/Ansible-Build/blob/main/roles/<role>/files/<script-name>
- Updated all script entries to include hyperlinks to their source files
- Maintained existing documentation structure while enhancing traceability
- Added completion marker to task prompt file
- Fixed typo in README.md: changed `vault_dns_vercel_token` to `vault_dns_infomaniak_token` for Infomaniak API usage
- Refactored docker-acmesh-renew script to process certificates individually rather than in bulk
- Added overall exit code tracking to ensure script fails if any certificate renewal fails
- Improved container naming by using certificate-specific hostname with wildcard replacement
- Maintained backward compatibility by preserving existing variable names and structure
- Added missing newline at end of file
- Added explicit mkdir -p for /var/lib/odoo/filestore before copying filestore contents
- Quoted "$container" variable in all docker exec commands to prevent shell expansion issues
- Maintained existing restore behavior while improving robustness and safety
- Fixed missing newline at end of file
- Added Function column to list-hosts output table for both inventory types
- Implemented optional [grep] parameter for case-insensitive row filtering
- Fixed set -e bug by adding || true to customer detection grep
- Updated help documentation to reflect new list-hosts signature
- Added task prompt documentation file for this enhancement
- Added -r flag to docker-mysql-restore to replace existing database (drop + recreate)
- Updated docker-mysql-restore to ensure database exists before restoring
- Standardized indentation across all MySQL docker scripts (backup, drop, list, restore)
- Fixed missing newline at end of docker-mysql-restore file
- Updated help documentation to reflect new -r flag and options
- Maintained existing restore behavior for non-replace operations
- Changed default restic_owner from root to admin and restic_group from root to backup
- Added explicit group creation task to ensure restic_group exists before directory creation
- Updated directory permissions from 0750 to 2750 (setgid) with recursive application
- Modified README.md to reflect new default values and document expected group membership
- Maintained backward compatibility by preserving variable names and structure
- Ensured consistent behavior across all restic-related tasks and documentation
- Added optional username parameter to connect-host command for flexible user specification
- Implemented fallback logic to use ansible_user when no override is provided
- Improved variable naming and code structure for better readability
- Maintained backward compatibility by keeping original behavior when no username is specified
- Updated help documentation to reflect the new [host][username] parameter format
- Reverted version from 1.2.0 to 1.1.0 to match actual feature state
- Added missing period to completion message for proper punctuation
- Maintains consistency with previous commit's versioning and messaging style
- Added -f flag to docker-odoo-backup script to explicitly specify archive format (zip/tar)
- Updated restic_odoo_backup.yml to use -f tar flag for consistent tar archive creation
- Improved format validation with clear error messages for invalid formats
- Enhanced script robustness by validating format before proceeding with backup
- Maintained backward compatibility by allowing format override via output file extension
- Updated version to 1.2.0 to reflect new feature addition
- Added .tar archive support to docker-odoo-backup and docker-odoo-restore scripts
- Improved error handling with proper exit codes and stderr output
- Enhanced documentation with clearer help messages and examples
- Fixed container selection to use head instead of tail for consistent behavior
- Standardized variable naming and added explicit format detection
- Improved script robustness with proper quoting and directory handling
- Updated version numbers to reflect feature changes and bug fixes
- Added docker_network role to localhost play with explicit 'docker_network' tag
- This enables targeted execution of network configuration tasks and improves task visibility
- Maintains consistency with existing tagging pattern used for other roles in the play
- Fixed typo in acme_sh README.md: changed "Accme.sh" to "Acme.sh" in description default value
- Added debug echo statement in certbot create script to display certificate issuance options for troubleshooting
- These changes improve documentation accuracy and provide better visibility into certificate creation parameters
- Reverted `docker_log_driver` default from "json-file" back to "local" to match Docker's default behavior
- Updated README.md to reflect the correct default value and maintain documentation consistency
- Added "depends" tag to all OS-specific include tasks for better dependency management and task grouping
- Modified daemon.json template to use variable interpolation for log-driver setting, enabling dynamic configuration
- This change ensures consistent logging behavior across environments while maintaining flexibility for customization
- Moved all role kind classifications from top-level to `galaxy_info.kind` for standardized Ansible Galaxy compatibility
- Updated `bin/visualize-dependencies` script to support both legacy and new `galaxy_info.kind` formats
- Standardized metadata structure across all 108 roles while maintaining backward compatibility
- This change enables better tooling integration and aligns with Ansible Galaxy best practices
- Moved all role kind classifications from top-level to `galaxy_info.kind` for standardized Ansible Galaxy compatibility
- Updated `bin/visualize-dependencies` script to support both legacy and new `galaxy_info.kind` formats
- Standardized metadata structure across all 108 roles while maintaining backward compatibility
- This change enables better tooling integration and aligns with Ansible Galaxy best practices