From 10b18020bec3027166b495c45334c7de30df1e9d Mon Sep 17 00:00:00 2001 From: Igor Pecovnik Date: Mon, 2 Dec 2024 17:25:27 +0100 Subject: [PATCH] Software title: Homepage --- tools/include/images/MAN009.png | Bin 0 -> 31649 bytes tools/include/markdown/MAN009-footer.md | 19 +++++ tools/include/markdown/MAN009-header.md | 1 + tools/json/config.software.json | 20 ++++++ tools/modules/runtime/config.runtime.sh | 1 + tools/modules/software/install_homepage.sh | 77 +++++++++++++++++++++ 6 files changed, 118 insertions(+) create mode 100644 tools/include/images/MAN009.png create mode 100644 tools/include/markdown/MAN009-footer.md create mode 100644 tools/include/markdown/MAN009-header.md create mode 100644 tools/modules/software/install_homepage.sh diff --git a/tools/include/images/MAN009.png b/tools/include/images/MAN009.png new file mode 100644 index 0000000000000000000000000000000000000000..87bcd0a7772d96fcd95040f2964f74f569e49023 GIT binary patch literal 31649 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 b10Kbi|GjXZXvfp$Em$w<8tas5JKg;sZD(cY literal 0 HcmV?d00001 diff --git a/tools/include/markdown/MAN009-footer.md b/tools/include/markdown/MAN009-footer.md new file mode 100644 index 000000000..872905748 --- /dev/null +++ b/tools/include/markdown/MAN009-footer.md @@ -0,0 +1,19 @@ +=== "Access to the web interface" + + The web interface is accessible via port **3000**: + + - URL: `https://:3000` + - Username/Password: none + + Configuration: Please reffer to official manual https://gethomepage.dev/configs/ + +=== "Directories" + + - Install directory: `/armbian/homepage` + - Site configuration directory: `/armbian/homepage/config` + +=== "View logs" + + ```sh + docker logs -f homepage + ``` diff --git a/tools/include/markdown/MAN009-header.md b/tools/include/markdown/MAN009-header.md new file mode 100644 index 000000000..63c1a7f74 --- /dev/null +++ b/tools/include/markdown/MAN009-header.md @@ -0,0 +1 @@ +A modern, fully static, fast, secure fully proxied, highly customizable application dashboard with integrations for over 100 services and translations into multiple languages. Easily configured via YAML files or through docker label discovery. diff --git a/tools/json/config.software.json b/tools/json/config.software.json index a28cb4e7b..834dcb9f7 100644 --- a/tools/json/config.software.json +++ b/tools/json/config.software.json @@ -1187,6 +1187,26 @@ "status": "Stable", "author": "@Tearran", "condition": "" + }, + { + "id": "MAN009", + "description": "Install Homepage", + "command": [ + "module_homepage install" + ], + "status": "Stable", + "author": "@igorpecovnik", + "condition": "! module_homepage status" + }, + { + "id": "MAN010", + "description": "Remove Homepage", + "command": [ + "module_homepage remove" + ], + "status": "Stable", + "author": "@igorpecovnik", + "condition": "module_homepage status" } ] } diff --git a/tools/modules/runtime/config.runtime.sh b/tools/modules/runtime/config.runtime.sh index abb413967..df9cb8bdd 100644 --- a/tools/modules/runtime/config.runtime.sh +++ b/tools/modules/runtime/config.runtime.sh @@ -105,6 +105,7 @@ update_sub_submenu_data "Software" "Media" "MED026" "http://$LOCALIPADD:${module update_sub_submenu_data "Software" "Containers" "CON006" "http://$LOCALIPADD:${module_options["module_portainer,port"]}" update_sub_submenu_data "Software" "HomeAutomation" "HA004" "http://$LOCALIPADD:${module_options["module_haos,port"]}" update_sub_submenu_data "Software" "Monitoring" "MON004" "http://$LOCALIPADD:${module_options["module_netdata,port"]}" +update_sub_submenu_data "Software" "Management" "MAN010" "http://$LOCALIPADD:${module_options["module_homepage,port"]}" update_sub_submenu_data "Software" "Downloaders" "DOW002" "http://$LOCALIPADD:${module_options["module_qbittorrent,port"]}" update_sub_submenu_data "Software" "Downloaders" "DOW004" "http://$LOCALIPADD:${module_options["module_deluge,port"]}" update_sub_submenu_data "Software" "Downloaders" "DOW006" "http://$LOCALIPADD:${module_options["module_transmission,port"]}" diff --git a/tools/modules/software/install_homepage.sh b/tools/modules/software/install_homepage.sh new file mode 100644 index 000000000..185a21732 --- /dev/null +++ b/tools/modules/software/install_homepage.sh @@ -0,0 +1,77 @@ +module_options+=( + ["module_homepage,author"]="@armbian" + ["module_homepage,feature"]="module_homepage" + ["module_homepage,desc"]="Install homepage container" + ["module_homepage,example"]="install remove status help" + ["module_homepage,port"]="3000" + ["module_homepage,status"]="Active" + ["module_homepage,arch"]="" +) +# +# Module homepage +# +function module_homepage () { + local title="homepage" + local condition=$(which "$title" 2>/dev/null) + + if check_if_installed docker-ce; then + local container=$(docker container ls -a | mawk '/homepage?( |$)/{print $1}') + local image=$(docker image ls -a | mawk '/homepage?( |$)/{print $3}') + fi + + local commands + IFS=' ' read -r -a commands <<< "${module_options["module_homepage,example"]}" + + HOMEPAGE_BASE="${SOFTWARE_FOLDER}/homepage" + + case "$1" in + "${commands[0]}") + check_if_installed docker-ce || install_docker + [[ -d "$HOMEPAGE_BASE" ]] || mkdir -p "$HOMEPAGE_BASE" || { echo "Couldn't create storage directory: $HOMEPAGE_BASE"; exit 1; } + docker run -d \ + --name homepage \ + -e PUID=1000 \ + -e PGID=1000 \ + -p 3000:3000 \ + -v "${HOMEPAGE_BASE}/config:/app/config" \ + -v /var/run/docker.sock:/var/run/docker.sock:ro \ + --restart unless-stopped \ + ghcr.io/gethomepage/homepage:latest + for i in $(seq 1 20); do + if docker inspect -f '{{ index .Config.Labels "build_version" }}' homepage >/dev/null 2>&1 ; then + break + else + sleep 3 + fi + if [ $i -eq 20 ] ; then + echo -e "\nTimed out waiting for ${title} to start, consult your container logs for more info (\`docker logs homepage\`)" + exit 1 + fi + done + ;; + "${commands[1]}") + [[ "${container}" ]] && docker container rm -f "$container" >/dev/null + [[ "${image}" ]] && docker image rm "$image" >/dev/null + [[ -n "${HOMEPAGE_BASE}" && "${HOMEPAGE_BASE}" != "/" ]] && rm -rf "${HOMEPAGE_BASE}" + ;; + "${commands[2]}") + if [[ "${container}" && "${image}" ]]; then + return 0 + else + return 1 + fi + ;; + "${commands[3]}") + echo -e "\nUsage: ${module_options["module_homepage,feature"]} " + echo -e "Commands: ${module_options["module_homepage,example"]}" + echo "Available commands:" + echo -e "\tinstall\t- Install $title." + echo -e "\tstatus\t- Installation status $title." + echo -e "\tremove\t- Remove $title." + echo + ;; + *) + ${module_options["module_homepage,feature"]} ${commands[3]} + ;; + esac +}