From cbd373fbac32bdc9ec5ebfaed75c9aa050d9ca80 Mon Sep 17 00:00:00 2001 From: Nick Sweeting Date: Sat, 1 Aug 2026 19:32:50 -0700 Subject: [PATCH] Persist Docker persona profiles in collection data --- bin/validate_docker_uid_gid.sh | 40 +++++++++++++++++++++++++++++++++- docker-compose.yml | 2 ++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/bin/validate_docker_uid_gid.sh b/bin/validate_docker_uid_gid.sh index fe531dd7..8676258f 100755 --- a/bin/validate_docker_uid_gid.sh +++ b/bin/validate_docker_uid_gid.sh @@ -6,6 +6,7 @@ IMAGE="${IMAGE:-archivebox/archivebox:dev}" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" ENTRYPOINT_PATH="${ENTRYPOINT_PATH:-$REPO_DIR/bin/docker_entrypoint.sh}" +COMPOSE_PATH="${COMPOSE_PATH:-$REPO_DIR/docker-compose.yml}" RUN_ID="${RUN_ID:-${EPOCHSECONDS:-0}-$$}" VALIDATION_ROOT="${VALIDATION_ROOT:-$REPO_DIR/tmp/docker-uid-gid-validation/$RUN_ID}" KEEP_VALIDATION_ROOT="${KEEP_VALIDATION_ROOT:-0}" @@ -78,7 +79,8 @@ if [[ -n "$REMOTE_HOST" && "$LOCAL_ONLY" != "1" ]]; then "$SSH_BINARY" "$REMOTE_HOST" "mkdir -p '$remote_dir'" "$SSH_BINARY" "$REMOTE_HOST" "cat > '$remote_dir/$script_name'" < "$0" "$SSH_BINARY" "$REMOTE_HOST" "cat > '$remote_dir/$entrypoint_name'" < "$ENTRYPOINT_PATH" - "$SSH_BINARY" "$REMOTE_HOST" "cd '$remote_dir' && IMAGE='$IMAGE' ENTRYPOINT_PATH='$remote_dir/$entrypoint_name' bash './$script_name' --local-only --entrypoint '$remote_dir/$entrypoint_name' --workdir '$remote_dir/work'" + "$SSH_BINARY" "$REMOTE_HOST" "cat > '$remote_dir/docker-compose.yml'" < "$COMPOSE_PATH" + "$SSH_BINARY" "$REMOTE_HOST" "cd '$remote_dir' && IMAGE='$IMAGE' ENTRYPOINT_PATH='$remote_dir/$entrypoint_name' COMPOSE_PATH='$remote_dir/docker-compose.yml' bash './$script_name' --local-only --entrypoint '$remote_dir/$entrypoint_name' --workdir '$remote_dir/work'" exit $? fi @@ -421,6 +423,40 @@ run_mount_case() { VALIDATION_ROOT="$previous_root" } +run_compose_personas_case() { + total=$((total + 1)) + local case_dir="$VALIDATION_ROOT/compose-personas-persist" + local log_file="$case_dir/output.log" + local status + mkdir -p "$case_dir/data" + + set +e + # shellcheck disable=SC2016 + ARCHIVEBOX_IMAGE="$IMAGE" "$DOCKER_BINARY" compose \ + --project-directory "$case_dir" \ + -f "$COMPOSE_PATH" \ + run --rm -T archivebox sh -c \ + 'printf "ABX_UID=%s\nABX_GID=%s\n" "$(id -u)" "$(id -g)"; archivebox init; printf persisted > "$PERSONAS_DIR/Default/chrome_profile/persisted"; echo ABX_OK' \ + >"$log_file" 2>&1 + status=$? + "$DOCKER_BINARY" compose --project-directory "$case_dir" -f "$COMPOSE_PATH" down --volumes --remove-orphans >/dev/null 2>&1 + set -e + + if [[ "$status" == "0" ]] \ + && grep -q '^ABX_UID=911$' "$log_file" \ + && grep -q '^ABX_GID=911$' "$log_file" \ + && grep -q '^ABX_OK$' "$log_file" \ + && [[ -f "$case_dir/data/personas/Default/chrome_profile/persisted" ]] \ + && [[ "$(< "$case_dir/data/personas/Default/chrome_profile/persisted")" == persisted ]]; then + passed=$((passed + 1)) + log "PASS compose persists persona data outside the inherited anonymous volume" + else + failed=$((failed + 1)) + log "FAIL compose persists persona data outside the inherited anonymous volume (status=$status log=$log_file)" + sed -n '1,160p' "$log_file" + fi +} + log "Running UID/GID validation on ${HOSTNAME:-unknown-host} using image=$IMAGE entrypoint=$ENTRYPOINT_PATH root=$VALIDATION_ROOT platform=${DOCKER_PLATFORM:-native}" run_case "root-owned empty data auto-detect default" \ @@ -471,6 +507,8 @@ run_case "root-owned ArchiveBox.conf only is repaired" \ "chown 911:911 /case/data && chmod 755 /case/data && touch /case/data/ArchiveBox.conf /case/data/index.sqlite3 && chown 0:0 /case/data/ArchiveBox.conf /case/data/index.sqlite3" \ "-" "-" pass 911 911 "$default_cmd" config-files-repaired +run_compose_personas_case + run_mount_case "NFS" "${NFS_TEST_DIR:-}" run_mount_case "SMB" "${SMB_TEST_DIR:-}" diff --git a/docker-compose.yml b/docker-compose.yml index 62d91264..604be4ed 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -17,6 +17,8 @@ services: - 8000:8000 volumes: - ./data:/data + # Override abx-dl's nested VOLUME so profiles persist across containers. + - ./data/personas:/data/personas environment: # - ADMIN_USERNAME=admin # creates an admin user on first run with the given user/pass combo # - ADMIN_PASSWORD=SomeSecretPassword