diff --git a/docker-compose.yaml b/docker-compose.yaml index bae645fe..72e92098 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,3 +1,4 @@ +# Copy docker/example.env to .env and set MAIL_DOMAIN before starting. services: chatmail: build: diff --git a/docker/cm_ini_to_env.py b/docker/cm_ini_to_env.py deleted file mode 100755 index fcb2c576..00000000 --- a/docker/cm_ini_to_env.py +++ /dev/null @@ -1,84 +0,0 @@ -#!/usr/bin/env python3 -"""Convert a chatmail.ini to a Docker .env file. - -Usage: python docker/cm_ini_to_env.py [chatmail.ini] [.env] - -Reads the ini file, extracts all non-default key=value pairs, -and writes them as UPPER_CASE env vars suitable for docker-compose. -""" - -import configparser -import sys -from pathlib import Path - -# Keys that only make sense for bare-metal deploys or are handled -# separately by the Docker setup and should not appear in .env. -SKIP_KEYS = set() - -# Keys that exist in .env but have a different name than the ini key. -# ini_key -> env_key -RENAMES = {} - - -def read_ini(path): - """Return dict of key=value from [params] section.""" - cp = configparser.ConfigParser() - cp.read(path) - if not cp.has_section("params"): - sys.exit(f"Error: {path} has no [params] section") - return dict(cp.items("params")) - - -def read_defaults(): - """Return dict of default values from the ini template.""" - template = Path(__file__).resolve().parent.parent / "chatmaild/src/chatmaild/ini/chatmail.ini.f" - if not template.exists(): - return {} - cp = configparser.ConfigParser() - cp.read(template) - if not cp.has_section("params"): - return {} - defaults = {} - for key, value in cp.items("params"): - # Template placeholders like {mail_domain} aren't real defaults. - if "{" not in value: - defaults[key] = value - return defaults - - -def ini_to_env(ini_path, only_non_default=True): - """Yield (ENV_KEY, value) pairs from an ini file.""" - params = read_ini(ini_path) - defaults = read_defaults() if only_non_default else {} - - for key, value in sorted(params.items()): - if key in SKIP_KEYS: - continue - if only_non_default and key in defaults and value.strip() == defaults[key].strip(): - continue - env_key = RENAMES.get(key, key.upper()) - yield env_key, value.strip() - - -def main(): - ini_path = sys.argv[1] if len(sys.argv) > 1 else "chatmail.ini" - env_path = sys.argv[2] if len(sys.argv) > 2 else None - - if not Path(ini_path).exists(): - sys.exit(f"Error: {ini_path} not found") - - lines = [] - for env_key, value in ini_to_env(ini_path): - lines.append(f'{env_key}="{value}"') - - output = "\n".join(lines) + "\n" - - if env_path: - Path(env_path).write_text(output) - print(f"Wrote {len(lines)} variables to {env_path}") - else: - print(output, end="") - - -if __name__ == "__main__": - main() diff --git a/docker/files/setup_chatmail_docker.sh b/docker/files/setup_chatmail_docker.sh index 398873a6..d863a836 100755 --- a/docker/files/setup_chatmail_docker.sh +++ b/docker/files/setup_chatmail_docker.sh @@ -53,7 +53,7 @@ mkdir -p "$(dirname "$CHATMAIL_INI")" $CMDEPLOY init --config "$CHATMAIL_INI" $MAIL_DOMAIN || true export CMDEPLOY_STAGES="${CMDEPLOY_STAGES:-configure,activate}" -$CMDEPLOY run --ssh-host @docker +$CMDEPLOY run --config "$CHATMAIL_INI" --ssh-host @docker echo "ForwardToConsole=yes" >> /etc/systemd/journald.conf systemctl restart systemd-journald diff --git a/docker/files/update_ini.sh b/docker/files/update_ini.sh deleted file mode 100644 index c5d65661..00000000 --- a/docker/files/update_ini.sh +++ /dev/null @@ -1,79 +0,0 @@ -#!/bin/bash -set -eo pipefail - -INI_FILE="${INI_FILE:-chatmail.ini}" - -if [ ! -f "$INI_FILE" ]; then - echo "Error: file $INI_FILE not found." >&2 - exit 1 -fi - -TMP_FILE="$(mktemp)" - -convert_to_bytes() { - local value="$1" - if [[ "$value" =~ ^([0-9]+)([KkMmGgTt])$ ]]; then - local num="${BASH_REMATCH[1]}" - local unit="${BASH_REMATCH[2]}" - case "$unit" in - [Kk]) echo $((num * 1024)) ;; - [Mm]) echo $((num * 1024 * 1024)) ;; - [Gg]) echo $((num * 1024 * 1024 * 1024)) ;; - [Tt]) echo $((num * 1024 * 1024 * 1024 * 1024)) ;; - esac - elif [[ "$value" =~ ^[0-9]+$ ]]; then - echo "$value" - else - echo "Error: incorrect size format: $value." >&2 - return 1 - fi -} - -process_specific_params() { - local key=$1 - local value=$2 - local destination_file=$3 - - if [[ "$key" == "max_message_size" ]]; then - converted=$(convert_to_bytes "$value") || exit 1 - if grep -q -e "## .* = .* bytes" "$destination_file"; then - sed "s|## .* = .* bytes|## $value = $converted bytes|g" "$destination_file"; - else - echo "## $value = $converted bytes" >> "$destination_file" - fi - echo "$key = $converted" >> "$destination_file" - else - echo "$key = $value" >> "$destination_file" - fi -} - -while IFS= read -r line; do - if [[ "$line" =~ ^[[:space:]]*#.* || "$line" =~ ^[[:space:]]*$ ]]; then - echo "$line" >> "$TMP_FILE" - continue - fi - - if [[ "$line" =~ ^([a-z0-9_]+)[[:space:]]*=[[:space:]]*(.*)$ ]]; then - key="${BASH_REMATCH[1]}" - current_value="${BASH_REMATCH[2]}" - env_var_name=$(echo "$key" | tr 'a-z' 'A-Z') - env_value="${!env_var_name}" - - if [[ -n "$env_value" ]]; then - process_specific_params "$key" "$env_value" "$TMP_FILE" - else - echo "$line" >> "$TMP_FILE" - fi - else - echo "$line" >> "$TMP_FILE" - fi -done < "$INI_FILE" - -PERMS=$(stat -c %a "$INI_FILE") -OWNER=$(stat -c %u "$INI_FILE") -GROUP=$(stat -c %g "$INI_FILE") - -chmod "$PERMS" "$TMP_FILE" -chown "$OWNER":"$GROUP" "$TMP_FILE" - -mv "$TMP_FILE" "$INI_FILE"