diff --git a/ct/docker.sh b/ct/docker.sh index 0ef27e8bc..1d0a3f447 100644 --- a/ct/docker.sh +++ b/ct/docker.sh @@ -37,20 +37,9 @@ function update_script() { fi if docker ps -a --format '{{.Image}}' | grep -q '^portainer/portainer-ce:latest$'; then - msg_info "Updating Portainer" - $STD docker pull portainer/portainer-ce:latest - $STD docker stop portainer - $STD docker rm portainer - $STD docker volume create portainer_data >/dev/null 2>&1 - $STD docker run -d \ - -p 8000:8000 \ - -p 9443:9443 \ - --name=portainer \ - --restart=always \ - -v /var/run/docker.sock:/var/run/docker.sock \ - -v portainer_data:/data \ - portainer/portainer-ce:latest - msg_ok "Updated Portainer" + msg_warn "Portainer is now managed by a dedicated addon script and is no longer updated here." + echo -e "${TAB}Update/migrate it with:" + echo -e "${TAB}${TAB}${GN}bash -c \"\$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/portainer.sh)\"${CL}" fi if docker ps -a --format '{{.Names}}' | grep -q '^portainer_agent$'; then @@ -77,5 +66,5 @@ description msg_ok "Completed successfully!\n" echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" -echo -e "${INFO}${YW} If you installed Portainer, access it at the following URL:${CL}" -echo -e "${GATEWAY}${BGN}https://${IP}:9443${CL}" +echo -e "${INFO}${YW} Portainer is available as a separate addon. Install it with:${CL}" +echo -e "${GATEWAY}${BGN}bash -c \"\$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/portainer.sh)\"${CL}" diff --git a/install/alpine-docker-install.sh b/install/alpine-docker-install.sh index a827671c2..91a07a770 100644 --- a/install/alpine-docker-install.sh +++ b/install/alpine-docker-install.sh @@ -26,23 +26,21 @@ msg_ok "Installed Docker" get_latest_release() { curl -fsSL https://api.github.com/repos/"$1"/releases/latest | grep '"tag_name":' | cut -d'"' -f4 } -PORTAINER_LATEST_VERSION=$(get_latest_release "portainer/portainer") DOCKER_COMPOSE_LATEST_VERSION=$(get_latest_release "docker/compose") PORTAINER_AGENT_LATEST_VERSION=$(get_latest_release "portainer/agent") -read -r -p "${TAB3}Would you like to add Portainer? " prompt +read -r -p "${TAB3}Would you like to add Docker Compose? " prompt if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then - msg_info "Installing Portainer $PORTAINER_LATEST_VERSION" - docker volume create portainer_data >/dev/null - $STD docker run -d \ - -p 8000:8000 \ - -p 9443:9443 \ - --name=portainer \ - --restart=always \ - -v /var/run/docker.sock:/var/run/docker.sock \ - -v portainer_data:/data \ - portainer/portainer-ce:latest - msg_ok "Installed Portainer $PORTAINER_LATEST_VERSION" + msg_info "Installing Docker Compose $DOCKER_COMPOSE_LATEST_VERSION" + DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker} + mkdir -p "$DOCKER_CONFIG"/cli-plugins + curl -fsSL https://github.com/docker/compose/releases/download/"$DOCKER_COMPOSE_LATEST_VERSION"/docker-compose-linux-$(arch_resolve "x86_64" "aarch64") -o ~/.docker/cli-plugins/docker-compose + chmod +x "$DOCKER_CONFIG"/cli-plugins/docker-compose + msg_ok "Installed Docker Compose $DOCKER_COMPOSE_LATEST_VERSION" +fi + +if prompt_confirm "${TAB3}Would you like to install Portainer (UI) via the community-scripts addon?" "n" 60; then + bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/portainer.sh)" <<<"y" else read -r -p "${TAB3}Would you like to add the Portainer Agent? " prompt if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then @@ -57,21 +55,12 @@ else msg_ok "Installed Portainer Agent $PORTAINER_AGENT_LATEST_VERSION" fi fi -read -r -p "${TAB3}Would you like to add Docker Compose? " prompt -if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then - msg_info "Installing Docker Compose $DOCKER_COMPOSE_LATEST_VERSION" - DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker} - mkdir -p "$DOCKER_CONFIG"/cli-plugins - curl -fsSL https://github.com/docker/compose/releases/download/"$DOCKER_COMPOSE_LATEST_VERSION"/docker-compose-linux-$(arch_resolve "x86_64" "aarch64") -o ~/.docker/cli-plugins/docker-compose - chmod +x "$DOCKER_CONFIG"/cli-plugins/docker-compose - msg_ok "Installed Docker Compose $DOCKER_COMPOSE_LATEST_VERSION" -fi read -r -p "${TAB3}Would you like to expose the Docker TCP socket? " prompt if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then msg_info "Exposing Docker TCP socket" $STD mkdir -p /etc/docker - $STD echo '{ "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"] }' > /etc/docker/daemon.json + $STD echo '{ "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"] }' >/etc/docker/daemon.json $STD rc-service docker restart msg_ok "Exposed Docker TCP socket at tcp://+:2375" fi diff --git a/install/docker-install.sh b/install/docker-install.sh index 5ed717b2f..904a65938 100644 --- a/install/docker-install.sh +++ b/install/docker-install.sh @@ -15,11 +15,11 @@ update_os PORTAINER_AGENT_LATEST_VERSION=$(get_latest_github_release "portainer/agent") -read -r -p "${TAB3}Would you like to add Portainer (UI)? " prompt -if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then - DOCKER_PORTAINER="true" setup_docker +setup_docker + +if prompt_confirm "${TAB3}Would you like to install Portainer (UI) via the community-scripts addon?" "n" 60; then + bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/portainer.sh)" <<<"y" else - setup_docker read -r -p "${TAB3}Would you like to install the Portainer Agent (for remote management)? " prompt_agent if [[ ${prompt_agent,,} =~ ^(y|yes)$ ]]; then msg_info "Installing Portainer Agent $PORTAINER_AGENT_LATEST_VERSION" diff --git a/install/homeassistant-install.sh b/install/homeassistant-install.sh index 3534f2222..0e3e2d085 100644 --- a/install/homeassistant-install.sh +++ b/install/homeassistant-install.sh @@ -32,7 +32,8 @@ get_latest_release() { CORE_LATEST_VERSION=$(get_latest_release "home-assistant/core") -DOCKER_PORTAINER="true" setup_docker +setup_docker +bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/portainer.sh)" <<<"y" msg_info "Pulling Home Assistant $CORE_LATEST_VERSION Image" $STD docker pull ghcr.io/home-assistant/home-assistant:stable diff --git a/misc/tools.func b/misc/tools.func index 07c09f435..d4175bfec 100644 --- a/misc/tools.func +++ b/misc/tools.func @@ -4599,20 +4599,17 @@ setup_composer() { # - By default uses distro repository (docker.io) for stability # - Optionally uses official Docker repository for latest features # - Detects and migrates old Docker installations -# - Optional: Installs/Updates Portainer CE # - Updates running containers interactively # - Cleans up legacy repository files # # Usage: # setup_docker # Uses official Docker repo (recommended) # USE_DOCKER_REPO=false setup_docker # Uses distro docker.io package -# DOCKER_PORTAINER="true" setup_docker # DOCKER_LOG_DRIVER="json-file" setup_docker # # Variables: # USE_DOCKER_REPO - Set to "false" to use distro docker.io package # (default: true, uses official Docker repository) -# DOCKER_PORTAINER - Install Portainer CE (optional, "true" to enable) # DOCKER_LOG_DRIVER - Log driver (optional, default: "journald") # DOCKER_SKIP_UPDATES - Skip container update check (optional, "true" to skip) # @@ -4623,7 +4620,7 @@ setup_composer() { # - Interactive per-container update prompt (Y/N, 60 s auto-no) # - Compose-managed containers: full restart via docker compose # - Standalone containers: image pull only, no destructive stop/rm -# - Portainer installation and update support +# - Portainer is no longer managed here; use tools/addon/portainer.sh # - Set DOCKER_NONINTERACTIVE=1 to skip interactive prompts (CI/unattended) # ------------------------------------------------------------------------------ _docker_is_noninteractive() { @@ -4632,7 +4629,6 @@ _docker_is_noninteractive() { setup_docker() { local docker_installed=false - local portainer_installed=false local USE_DOCKER_REPO="${USE_DOCKER_REPO:-true}" # Check if Docker is already installed @@ -4642,12 +4638,6 @@ setup_docker() { msg_info "Docker $DOCKER_CURRENT_VERSION detected" fi - # Check if Portainer is running - if docker ps --format '{{.Names}}' 2>/dev/null | grep -q '^portainer$'; then - portainer_installed=true - msg_info "Portainer container detected" - fi - # Scenario 1: Use distro repository (opt-out via USE_DOCKER_REPO=false) if [[ "$USE_DOCKER_REPO" != "true" && "$USE_DOCKER_REPO" != "TRUE" && "$USE_DOCKER_REPO" != "1" ]]; then @@ -4761,54 +4751,6 @@ EOF systemctl enable -q --now docker fi - # Portainer Management (common for both modes) - if [[ "${DOCKER_PORTAINER:-}" == "true" ]]; then - if [ "$portainer_installed" = true ]; then - msg_info "Checking for Portainer updates" - PORTAINER_CURRENT=$(docker inspect portainer --format='{{.Config.Image}}' 2>/dev/null | cut -d':' -f2) - PORTAINER_LATEST=$(curl -fsSL https://registry.hub.docker.com/v2/repositories/portainer/portainer-ce/tags?page_size=100 | grep -oP '"name":"\K[0-9]+\.[0-9]+\.[0-9]+"' | head -1 | tr -d '"') - - if [ "$PORTAINER_CURRENT" != "$PORTAINER_LATEST" ]; then - if _docker_is_noninteractive; then - msg_info "Skipping Portainer update prompt (non-interactive)" - else - read -r -p "${TAB3}Update Portainer $PORTAINER_CURRENT → $PORTAINER_LATEST? " prompt - if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then - msg_info "Updating Portainer" - docker stop portainer - docker rm portainer - docker pull portainer/portainer-ce:latest - docker run -d \ - -p 9000:9000 \ - -p 9443:9443 \ - --name=portainer \ - --restart=always \ - -v /var/run/docker.sock:/var/run/docker.sock \ - -v portainer_data:/data \ - portainer/portainer-ce:latest - msg_ok "Updated Portainer to $PORTAINER_LATEST" - fi - fi - else - msg_ok "Portainer is up-to-date ($PORTAINER_CURRENT)" - fi - else - msg_info "Installing Portainer" - docker volume create portainer_data - docker run -d \ - -p 9000:9000 \ - -p 9443:9443 \ - --name=portainer \ - --restart=always \ - -v /var/run/docker.sock:/var/run/docker.sock \ - -v portainer_data:/data \ - portainer/portainer-ce:latest - - LOCAL_IP=$(hostname -I | awk '{print $1}') - msg_ok "Installed Portainer (http://${LOCAL_IP}:9000)" - fi - fi - # Container Update Check # - Skipped entirely when running unattended / non-interactive # - Compose-managed containers: offered via Y/N → docker compose pull + up -d @@ -4824,7 +4766,7 @@ EOF name=$(echo "$line" | awk '{print $1}') image=$(echo "$line" | awk '{print $2}') - # Portainer containers are handled by the dedicated block above + # Portainer is managed by its own addon script, not this generic loop [[ "$name" == "portainer" || "$name" == "portainer_agent" ]] && continue current_digest=$(docker inspect "$name" --format='{{.Image}}' 2>/dev/null | cut -d':' -f2 | cut -c1-12)