From 9ca5bcbfacbf0ed5372edf8314038d313fba21a3 Mon Sep 17 00:00:00 2001 From: nmaillat Date: Thu, 15 May 2025 23:16:30 +0200 Subject: [PATCH 1/8] adding stack_management.sh --- README.md | 15 +++++++++++- docker-compose.altenatives.yml | 2 -- docker-compose.datastores.yml | 2 -- docker-compose.limits.yml | 2 -- docker-compose.override.yml | 1 - docker-compose.tools.yml | 2 -- docker-compose.under-phrasea.yml | 2 -- docker-compose.yml | 2 -- stack_management.sh | 42 ++++++++++++++++++++++++++++++++ 9 files changed, 56 insertions(+), 14 deletions(-) create mode 100755 stack_management.sh diff --git a/README.md b/README.md index e72cc4d369..fb9b23d94d 100644 --- a/README.md +++ b/README.md @@ -97,7 +97,8 @@ Get official support : https://www.alchemy.fr/en/rubrique/services/ ## Prerequisites -- docker >=v20.10.24 +- docker >=25.0.5 +- docker compose >= 2.29.0 In the stack Docker, Docker Compose included in this repo starts by default in test mode. All services are launched in a separate container and except "Phraseanet app" and "workers" containers, @@ -197,6 +198,18 @@ export PHRASEANET_APP_PORT=8082 If you are not interested in the development of Phraseanet, you can ignore everything in `.env` after the `DEV Purpose` part. +### stack Management + +To start and stop the stack, use the `stack_management.sh start|stop` script at the project root. +this script work only Linux and MacOS. + +This script performs start and stop operations for the stack, utilizing docker compose with .env and env.local files. + +The `stop` operation is the most critical function of the script, as it ensures a clean shutdown +of the database container before stopping the entire stack. + +This script is useful if you are using the database container within the stack. + ### Using a env.local method for custom .env values It may be easier to deal with a local file to manage our env variables. diff --git a/docker-compose.altenatives.yml b/docker-compose.altenatives.yml index 8d60fcc225..176a82a99c 100644 --- a/docker-compose.altenatives.yml +++ b/docker-compose.altenatives.yml @@ -1,5 +1,3 @@ -version: "3.9" - services: db: diff --git a/docker-compose.datastores.yml b/docker-compose.datastores.yml index 598561126a..a30bf5eecf 100644 --- a/docker-compose.datastores.yml +++ b/docker-compose.datastores.yml @@ -1,5 +1,3 @@ -version: "3.9" - services: db: image: $PHRASEANET_DOCKER_REGISTRY/phraseanet-db:$PHRASEANET_DOCKER_TAG diff --git a/docker-compose.limits.yml b/docker-compose.limits.yml index 98b3265c41..6c2634782b 100644 --- a/docker-compose.limits.yml +++ b/docker-compose.limits.yml @@ -1,5 +1,3 @@ -version: "3.9" - services: gateway: deploy: diff --git a/docker-compose.override.yml b/docker-compose.override.yml index 8ee6014401..71cb605915 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -1,4 +1,3 @@ -version: "3.9" services: gateway: volumes: diff --git a/docker-compose.tools.yml b/docker-compose.tools.yml index c715e2fa46..c1c44a6e88 100644 --- a/docker-compose.tools.yml +++ b/docker-compose.tools.yml @@ -1,5 +1,3 @@ -version: "3.9" - services: mailhog: image: mailhog/mailhog diff --git a/docker-compose.under-phrasea.yml b/docker-compose.under-phrasea.yml index 1c468a33f1..83d31bf7f5 100644 --- a/docker-compose.under-phrasea.yml +++ b/docker-compose.under-phrasea.yml @@ -1,5 +1,3 @@ -version: "3.9" - networks: phrasea: name: ${PHRASEA_NETWORK_NAME} diff --git a/docker-compose.yml b/docker-compose.yml index c9c2202957..6234f5e310 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,3 @@ -version: "3.9" - networks: internal: ipam: diff --git a/stack_management.sh b/stack_management.sh new file mode 100755 index 0000000000..5c510ad9c8 --- /dev/null +++ b/stack_management.sh @@ -0,0 +1,42 @@ +#!/bin/bash + +# Function to detect the appropriate Docker Compose command +detect_docker_compose_command() { + if docker compose version &>/dev/null; then + echo "docker compose" + else + echo "docker-compose" + fi +} + +DOCKER_COMPSE_CMD=$(detect_docker_compose_command) + +# Function to start the Docker stack +start_stack() { + echo "Starting the Docker stack..." + $DOCKER_COMPSE_CMD --env-file .env --env-file env.local up -d +} + +# Function to stop the Docker stack +stop_stack() { + echo "Stopping the MySQL server in the db container..." + $DOCKER_COMPSE_CMD exec db /usr/bin/mysqladmin -uroot -p"$MYSQL_ROOT_PASSWORD" shutdown + + echo "Stopping the Docker stack..." + $DOCKER_COMPSE_CMD --env-file .env --env-file env.local down +} + +# Check the argument passed to the script +case "$1" in + start) + start_stack + ;; + stop) + stop_stack + ;; + *) + echo "Usage: $0 {start|stop}" + exit 1 +esac + +exit 0 From 0bca44dc711b8947019c976718e04a3daaedfadf Mon Sep 17 00:00:00 2001 From: nmaillat Date: Fri, 16 May 2025 17:21:29 +0200 Subject: [PATCH 2/8] compose stack management WIP --- .dockerignore | 1 + README.md | 13 ++- doc/infra/compose/stack_management.md | 72 ++++++++++++ stack_management.sh | 154 +++++++++++++++++++++++++- 4 files changed, 233 insertions(+), 7 deletions(-) create mode 100644 doc/infra/compose/stack_management.md diff --git a/.dockerignore b/.dockerignore index a5d47a969f..068d6cc396 100644 --- a/.dockerignore +++ b/.dockerignore @@ -38,3 +38,4 @@ /www/thumbnails /www/.htaccess npm-debug.log +stack_management.sh diff --git a/README.md b/README.md index fb9b23d94d..31ca09df88 100644 --- a/README.md +++ b/README.md @@ -186,7 +186,7 @@ COMPOSE_PROFILES=app,gateway-classic,db,pma,elasticsearch,redis,redis-session,ra You should review the default env variables defined in `.env` file. -Use `export` method to override these values. +Use `export` method to override these values i.e: ```bash @@ -195,21 +195,28 @@ export INSTALL_ACCOUNT_EMAIL=foo@bar.com export INSTALL_ACCOUNT_PASSWORD=$3cr3t! export PHRASEANET_APP_PORT=8082 ``` + +If you want persit this change you can also save your change in a files named `env.local` or `.env.local` +this files are git ignored and permit a stack customisation without git conflic generation +see more about in stack management section + If you are not interested in the development of Phraseanet, you can ignore everything in `.env` after the `DEV Purpose` part. ### stack Management -To start and stop the stack, use the `stack_management.sh start|stop` script at the project root. +To start and stop the stack, use the `stack_management.sh start|stop|info|check|log` script at the project root. this script work only Linux and MacOS. -This script performs start and stop operations for the stack, utilizing docker compose with .env and env.local files. +This script wrapping standard oprations for the stack, using standard docker compose cmd and take in account `.env` and `env.local | .env.local` files. The `stop` operation is the most critical function of the script, as it ensures a clean shutdown of the database container before stopping the entire stack. This script is useful if you are using the database container within the stack. +Of course before using it you need to chmod this file. + ### Using a env.local method for custom .env values It may be easier to deal with a local file to manage our env variables. diff --git a/doc/infra/compose/stack_management.md b/doc/infra/compose/stack_management.md new file mode 100644 index 0000000000..96088380bd --- /dev/null +++ b/doc/infra/compose/stack_management.md @@ -0,0 +1,72 @@ +Certainly! Here's a README for the script that provides an overview of its functionality, usage, and features: + +--- + +# Docker Stack Management Script + +This script is designed to manage a Docker stack, particularly for Phraseanet applications. It provides functionalities to start, stop, check, and gather information about the Docker stack, including version checks, log viewing, and environment details. + +## Features + +- **Start and Stop the Docker Stack**: Easily start or stop your Docker stack with simple commands. +- **Version Checking**: Verify the compatibility of Docker and Docker Compose versions. +- **Environment Information**: Gather detailed information about the environment, including Phraseanet installation status, version details, and internal URLs. +- **Log Viewing**: View logs for all containers or filter logs for a specific container. +- **Environment Variables**: Load and display environment variables from `.env` and either `env.local` or `.env.local` files. + +## Usage + +### Prerequisites + +- Docker and Docker Compose installed on your system. +- Appropriate permissions to execute Docker commands. +- Environment files (`.env`, `env.local`, or `.env.local`) configured with necessary variables. + +### Commands + +- **Start the Stack**: + ```bash + ./manage_docker.sh start + ``` + +- **Stop the Stack**: + ```bash + ./manage_docker.sh stop + ``` + +- **Check Versions**: + ```bash + ./manage_docker.sh check + ``` + +- **Display Environment Information**: + ```bash + ./manage_docker.sh info + ``` + +- **View Logs**: + - For all containers: + ```bash + ./manage_docker.sh log + ``` + - For a specific container: + ```bash + ./manage_docker.sh log + ``` + +### Environment Variables + +The script uses the following environment variables, which should be defined in your environment files: + +- `PHRASEANET_DOCKER_TAG`: The Docker tag for the Phraseanet image. +- `PHRASEANET_DOCKER_REGISTRY`: The Docker registry for the Phraseanet image. +- `PHRASEANET_HOSTNAME`: The hostname for the Phraseanet instance. +- `PHRASEANET_SCHEME`: The scheme (e.g., `http` or `https`) for the Phraseanet instance. +- `PHRASEANET_APP_PORT`: The port for the Phraseanet application. + +### Notes + +- Ensure that the environment files (`.env`, `env.local`, or `.env.local`) are correctly configured with the necessary variables. +- The script checks for the presence of `config/configuration.yml` to determine if Phraseanet is installed. +- The script constructs the internal URL of the Phraseanet instance using the environment variables `PHRASEANET_HOSTNAME`, `PHRASEANET_SCHEME`, and `PHRASEANET_APP_PORT`. + diff --git a/stack_management.sh b/stack_management.sh index 5c510ad9c8..859855486a 100755 --- a/stack_management.sh +++ b/stack_management.sh @@ -9,21 +9,158 @@ detect_docker_compose_command() { fi } +# Function to determine the environment files to use +get_env_files() { + local env_files=(".env") + for envFile in ".env.local" "env.local"; do + if [ -f "$envFile" ]; then + env_files+=("$envFile") + break + fi + done + echo "${env_files[@]}" +} + +# Function to check Docker and Docker Compose versions and display additional information +check_versions() { + local required_docker_version="25.0.5" + local required_compose_version="2.29.0" + + # Get Docker version + local docker_version=$(docker --version | awk -F'[ ,]' '{print $3}') + if [ "$(printf '%s\n' "$required_docker_version" "$docker_version" | sort -V | head -n1)" != "$required_docker_version" ]; then + echo "Error: Docker version $docker_version is less than the required version $required_docker_version." + exit 1 + fi + + # Get Docker Compose version + local compose_version=$($DOCKER_COMPSE_CMD version --short) + if [ "$(printf '%s\n' "$required_compose_version" "$compose_version" | sort -V | head -n1)" != "$required_compose_version" ]; then + echo "Error: Docker Compose version $compose_version is less than the required version $required_compose_version." + exit 1 + fi + + echo "Docker and Docker Compose versions are compatible." + + # Get uptime of the stack + echo "Stack Uptime:" + $DOCKER_COMPSE_CMD ps | awk 'NR>1 {print $4}' + + # Get internal IP addresses + echo "Internal IP Addresses:" + $DOCKER_COMPSE_CMD exec -T db sh -c 'ip addr show eth0 | grep "inet " | awk "{print \$2}" | cut -d/ -f1' + + # Get container status + echo "Container Status:" + $DOCKER_COMPSE_CMD ps + + # Get resource usage + echo "Resource Usage:" + $DOCKER_COMPSE_CMD top +} + +# Function to display information about the environment +display_info() { + echo "Checking environment information..." + + # Load environment variables + local env_files=($(get_env_files)) + for env_file in "${env_files[@]}"; do + if [ -f "$env_file" ]; then + set -a + source "$env_file" + set +a + fi + done + + # Display Docker tag and registry information + echo "Phraseanet Docker Tag: ${PHRASEANET_DOCKER_TAG:-Not set}" + echo "Phraseanet Docker Registry: ${PHRASEANET_DOCKER_REGISTRY:-Not set}" + + # Construct and display the internal URL of the Phraseanet instance + if [ -n "$PHRASEANET_HOSTNAME" ] && [ -n "$PHRASEANET_SCHEME" ] && [ -n "$PHRASEANET_APP_PORT" ]; then + local internal_url="${PHRASEANET_SCHEME}://${PHRASEANET_HOSTNAME}:${PHRASEANET_APP_PORT}" + echo "Internal URL of Phraseanet Instance: $internal_url" + else + echo "Internal URL of Phraseanet Instance: Cannot be determined (missing environment variables)." + fi + + # Check if Phraseanet is installed by looking for config/configuration.yml + if [ -f "config/configuration.yml" ]; then + echo "Phraseanet is installed: config/configuration.yml found." + + # Get creation date of the configuration file + local creation_date=$(date -r "$(stat -f %B "config/configuration.yml" 2>/dev/null || stat -c %Y "config/configuration.yml" 2>/dev/null)" "+%Y-%m-%d %H:%M:%S" 2>/dev/null || echo "Unknown") + echo "Installation Date: $creation_date" + + # Check for the compiled configuration file and get its last modification date + if [ -f "config/configuration-compiled.php" ]; then + local last_modified_date=$(date -r "$(stat -f %m "config/configuration-compiled.php" 2>/dev/null || stat -c %Y "config/configuration-compiled.php" 2>/dev/null)" "+%Y-%m-%d %H:%M:%S" 2>/dev/null || echo "Unknown") + echo "Last Update Date: $last_modified_date" + else + echo "config/configuration-compiled.php not found." + fi + + # Check if the Phraseanet container is running + if $DOCKER_COMPSE_CMD ps | grep -q "phraseanet.*Up"; then + echo "Phraseanet container is running. Fetching version information..." + + # Extract version from Version.php file + local version_php_file="lib/Alchemy/Phrasea/Core/Version.php" + if [ -f "$version_php_file" ]; then + local version_from_file=$(grep -o "private \$number = '[^']*" "$version_php_file" | sed "s/private \$number = '//;s/'//") + echo "Version from Version.php: $version_from_file" + else + echo "Version.php file not found." + fi + + # Execute the command to get Phraseanet version from console + local version_from_console=$($DOCKER_COMPSE_CMD exec phraseanet sh -c 'bin/console --version | grep -o "KONSOLE KOMMANDER version [^ ]* [^ ]*" | awk "{print \$NF}"') + echo "Version from console: $version_from_console" + + # Compare versions + if [ "$version_from_file" == "$version_from_console" ]; then + echo "Versions match." + else + echo "Versions do not match." + fi + else + echo "Phraseanet container is not running. Cannot fetch version information." + fi + else + echo "Phraseanet is not installed: config/configuration.yml not found." + fi +} + +# Function to display logs +display_logs() { + if [ -n "$1" ]; then + echo "Displaying logs for container: $1" + $DOCKER_COMPSE_CMD logs -f "$1" + else + echo "Displaying logs for all containers" + $DOCKER_COMPSE_CMD logs -f + fi +} + DOCKER_COMPSE_CMD=$(detect_docker_compose_command) # Function to start the Docker stack start_stack() { echo "Starting the Docker stack..." - $DOCKER_COMPSE_CMD --env-file .env --env-file env.local up -d + local env_files=($(get_env_files)) + $DOCKER_COMPSE_CMD "${env_files[@]/#/--env-file=}" up -d } # Function to stop the Docker stack stop_stack() { echo "Stopping the MySQL server in the db container..." - $DOCKER_COMPSE_CMD exec db /usr/bin/mysqladmin -uroot -p"$MYSQL_ROOT_PASSWORD" shutdown + # Execute the mysqladmin command inside the container where the environment variable is defined + $DOCKER_COMPSE_CMD exec db sh -c '/usr/bin/mysqladmin -uroot -p"$MYSQL_ROOT_PASSWORD" shutdown' echo "Stopping the Docker stack..." - $DOCKER_COMPSE_CMD --env-file .env --env-file env.local down + local env_files=($(get_env_files)) + $DOCKER_COMPSE_CMD "${env_files[@]/#/--env-file=}" down } # Check the argument passed to the script @@ -34,8 +171,17 @@ case "$1" in stop) stop_stack ;; + check) + check_versions + ;; + info) + display_info + ;; + log) + display_logs "$2" + ;; *) - echo "Usage: $0 {start|stop}" + echo "Usage: $0 {start|stop|check|info|log [container_name]}" exit 1 esac From b7f10a2288082874f4301bd26c89ea4d3a016ade Mon Sep 17 00:00:00 2001 From: nmaillat Date: Fri, 16 May 2025 17:58:49 +0200 Subject: [PATCH 3/8] Clean output SKIP_CI --- stack_management.sh | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/stack_management.sh b/stack_management.sh index 859855486a..682211e0ea 100755 --- a/stack_management.sh +++ b/stack_management.sh @@ -45,23 +45,28 @@ check_versions() { # Get uptime of the stack echo "Stack Uptime:" $DOCKER_COMPSE_CMD ps | awk 'NR>1 {print $4}' + echo # Get internal IP addresses echo "Internal IP Addresses:" $DOCKER_COMPSE_CMD exec -T db sh -c 'ip addr show eth0 | grep "inet " | awk "{print \$2}" | cut -d/ -f1' + echo # Get container status echo "Container Status:" $DOCKER_COMPSE_CMD ps + echo # Get resource usage echo "Resource Usage:" $DOCKER_COMPSE_CMD top + echo } # Function to display information about the environment display_info() { echo "Checking environment information..." + echo # Load environment variables local env_files=($(get_env_files)) @@ -76,13 +81,16 @@ display_info() { # Display Docker tag and registry information echo "Phraseanet Docker Tag: ${PHRASEANET_DOCKER_TAG:-Not set}" echo "Phraseanet Docker Registry: ${PHRASEANET_DOCKER_REGISTRY:-Not set}" + echo # Construct and display the internal URL of the Phraseanet instance if [ -n "$PHRASEANET_HOSTNAME" ] && [ -n "$PHRASEANET_SCHEME" ] && [ -n "$PHRASEANET_APP_PORT" ]; then local internal_url="${PHRASEANET_SCHEME}://${PHRASEANET_HOSTNAME}:${PHRASEANET_APP_PORT}" echo "Internal URL of Phraseanet Instance: $internal_url" + echo else echo "Internal URL of Phraseanet Instance: Cannot be determined (missing environment variables)." + echo fi # Check if Phraseanet is installed by looking for config/configuration.yml @@ -97,8 +105,11 @@ display_info() { if [ -f "config/configuration-compiled.php" ]; then local last_modified_date=$(date -r "$(stat -f %m "config/configuration-compiled.php" 2>/dev/null || stat -c %Y "config/configuration-compiled.php" 2>/dev/null)" "+%Y-%m-%d %H:%M:%S" 2>/dev/null || echo "Unknown") echo "Last Update Date: $last_modified_date" + echo else - echo "config/configuration-compiled.php not found." + echo "Last Update unknown, config/configuration-compiled.php not found." + echo + fi # Check if the Phraseanet container is running @@ -157,6 +168,7 @@ stop_stack() { echo "Stopping the MySQL server in the db container..." # Execute the mysqladmin command inside the container where the environment variable is defined $DOCKER_COMPSE_CMD exec db sh -c '/usr/bin/mysqladmin -uroot -p"$MYSQL_ROOT_PASSWORD" shutdown' + echo echo "Stopping the Docker stack..." local env_files=($(get_env_files)) From d64d6c8b6dc02edf51dda6003e5170401d5af086 Mon Sep 17 00:00:00 2001 From: nmaillat Date: Fri, 16 May 2025 18:13:58 +0200 Subject: [PATCH 4/8] Adding latest version info --- stack_management.sh | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/stack_management.sh b/stack_management.sh index 682211e0ea..590ffe2c4d 100755 --- a/stack_management.sh +++ b/stack_management.sh @@ -81,7 +81,7 @@ display_info() { # Display Docker tag and registry information echo "Phraseanet Docker Tag: ${PHRASEANET_DOCKER_TAG:-Not set}" echo "Phraseanet Docker Registry: ${PHRASEANET_DOCKER_REGISTRY:-Not set}" - echo + echo # Construct and display the internal URL of the Phraseanet instance if [ -n "$PHRASEANET_HOSTNAME" ] && [ -n "$PHRASEANET_SCHEME" ] && [ -n "$PHRASEANET_APP_PORT" ]; then @@ -109,7 +109,6 @@ display_info() { else echo "Last Update unknown, config/configuration-compiled.php not found." echo - fi # Check if the Phraseanet container is running @@ -141,6 +140,12 @@ display_info() { else echo "Phraseanet is not installed: config/configuration.yml not found." fi + + # Fetch the latest version from GitHub + echo "Fetching the latest Phraseanet version from GitHub..." + local latest_version=$(curl -s https://api.github.com/repos/alchemy-fr/Phraseanet/releases/latest | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/') + echo "Latest Phraseanet Version on GitHub: $latest_version" + echo } # Function to display logs From 47f4e71ecb485557c0b3fbb18ac0da244564a5e1 Mon Sep 17 00:00:00 2001 From: nmaillat Date: Fri, 16 May 2025 18:37:48 +0200 Subject: [PATCH 5/8] Adding latest version info SKIP_CI --- stack_management.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/stack_management.sh b/stack_management.sh index 590ffe2c4d..d42fbc1d21 100755 --- a/stack_management.sh +++ b/stack_management.sh @@ -131,14 +131,18 @@ display_info() { # Compare versions if [ "$version_from_file" == "$version_from_console" ]; then echo "Versions match." + echo else echo "Versions do not match." + echo fi else echo "Phraseanet container is not running. Cannot fetch version information." + echo fi else echo "Phraseanet is not installed: config/configuration.yml not found." + echo fi # Fetch the latest version from GitHub From bfc2dae804f9cd73a06cc541825aa9bb3b5a066b Mon Sep 17 00:00:00 2001 From: nmaillat Date: Sat, 17 May 2025 00:25:56 +0200 Subject: [PATCH 6/8] version from Version.php when stack not running --- stack_management.sh | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/stack_management.sh b/stack_management.sh index d42fbc1d21..28585cc0d8 100755 --- a/stack_management.sh +++ b/stack_management.sh @@ -137,7 +137,15 @@ display_info() { echo fi else - echo "Phraseanet container is not running. Cannot fetch version information." + # Extract version from Version.php file + local version_php_file="lib/Alchemy/Phrasea/Core/Version.php" + if [ -f "$version_php_file" ]; then + local version_from_file=$(grep -o "private \$number = '[^']*" "$version_php_file" | sed "s/private \$number = '//;s/'//") + echo "Version from Version.php: $version_from_file" + else + echo "Version.php file not found." + fi + echo "Phraseanet container is not running. Cannot fetch version information from container." echo fi else From a53ec000097f13cc586907ee89ede3999fc132a5 Mon Sep 17 00:00:00 2001 From: nmaillat Date: Sat, 17 May 2025 00:30:28 +0200 Subject: [PATCH 7/8] update readme --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 31ca09df88..e18b1ba7c7 100644 --- a/README.md +++ b/README.md @@ -197,8 +197,8 @@ export PHRASEANET_APP_PORT=8082 ``` If you want persit this change you can also save your change in a files named `env.local` or `.env.local` -this files are git ignored and permit a stack customisation without git conflic generation -see more about in stack management section +These files are git ignored and permit stack customization without git conflict generation. + If you are not interested in the development of Phraseanet, you can ignore everything in `.env` after the `DEV Purpose` part. @@ -215,7 +215,7 @@ of the database container before stopping the entire stack. This script is useful if you are using the database container within the stack. -Of course before using it you need to chmod this file. +see more here ![stack Management](doc/infra/compose/stack_management.md) ### Using a env.local method for custom .env values From 115e74c38eae954fd52d96d700359ab9c26dce56 Mon Sep 17 00:00:00 2001 From: nmaillat Date: Sat, 17 May 2025 00:35:19 +0200 Subject: [PATCH 8/8] update readme --- doc/infra/compose/stack_management.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/infra/compose/stack_management.md b/doc/infra/compose/stack_management.md index 96088380bd..73e54d6efa 100644 --- a/doc/infra/compose/stack_management.md +++ b/doc/infra/compose/stack_management.md @@ -4,7 +4,7 @@ Certainly! Here's a README for the script that provides an overview of its funct # Docker Stack Management Script -This script is designed to manage a Docker stack, particularly for Phraseanet applications. It provides functionalities to start, stop, check, and gather information about the Docker stack, including version checks, log viewing, and environment details. +This script is an helper designed to manage a Phraseanet Docker compose stack by wrapping docker compose commande. It provides functionalities to start, stop, check, and gather information about the Docker stack, including docker and Phraseanet version checks, log viewing, and environment details. ## Features