From ce64ab6e1bc92965804356e6ad627cac5294ede2 Mon Sep 17 00:00:00 2001 From: Igor Date: Thu, 5 Dec 2024 00:21:50 +0100 Subject: [PATCH] Software title: NextCloud, Owncloud and Syncthing (#301) * Software title: NextCloud and Syncthing * Add Ownloud * Fixes --- tools/include/images/MED015.png | Bin 0 -> 13497 bytes tools/include/images/MED020.png | Bin 0 -> 10024 bytes tools/include/images/MED927.png | Bin 0 -> 7634 bytes tools/include/markdown/MED015-footer.md | 18 ++++ tools/include/markdown/MED015-header.md | 1 + tools/include/markdown/MED020-footer.md | 18 ++++ tools/include/markdown/MED020-header.md | 3 + tools/include/markdown/MED027-footer.md | 18 ++++ tools/include/markdown/MED027-header.md | 1 + tools/json/config.software.json | 91 +++++++++++++++++++- tools/modules/runtime/config.runtime.sh | 3 + tools/modules/software/install_nextcloud.sh | 84 ++++++++++++++++++ tools/modules/software/install_owncloud.sh | 82 ++++++++++++++++++ tools/modules/software/install_syncthing.sh | 89 +++++++++++++++++++ 14 files changed, 407 insertions(+), 1 deletion(-) create mode 100644 tools/include/images/MED015.png create mode 100644 tools/include/images/MED020.png create mode 100644 tools/include/images/MED927.png create mode 100644 tools/include/markdown/MED015-footer.md create mode 100644 tools/include/markdown/MED015-header.md create mode 100644 tools/include/markdown/MED020-footer.md create mode 100644 tools/include/markdown/MED020-header.md create mode 100644 tools/include/markdown/MED027-footer.md create mode 100644 tools/include/markdown/MED027-header.md create mode 100644 tools/modules/software/install_nextcloud.sh create mode 100644 tools/modules/software/install_owncloud.sh create mode 100644 tools/modules/software/install_syncthing.sh diff --git a/tools/include/images/MED015.png b/tools/include/images/MED015.png new file mode 100644 index 0000000000000000000000000000000000000000..2080feb7c3a92c29c28ef3a6f45273f706f0b75e GIT binary patch literal 13497 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 MDkoAUr0f5G0HzZ`ZvX%Q literal 0 HcmV?d00001 diff --git a/tools/include/images/MED020.png b/tools/include/images/MED020.png new file mode 100644 index 0000000000000000000000000000000000000000..c7e123087e13d9e7a7f5de86c6b7f1fa1a0af7b3 GIT binary patch literal 10024 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 literal 0 HcmV?d00001 diff --git a/tools/include/images/MED927.png b/tools/include/images/MED927.png new file mode 100644 index 0000000000000000000000000000000000000000..a35f54f0a211cd5160dab96061eef2d7937b6a4b GIT binary patch literal 7634 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:8884` + - Username/Password: There is none, but it is highly suggested setting a password for this container. To do this go to Actions -> Settings -> set user/password for the webUI. + +=== "Directories" + + - Install directory: `/armbian/syncthing` + - Site configuration directory: `/armbian/syncthing/config` + - Data directory: `/armbian/syncthing/data1` `/armbian/syncthing/data2` + +=== "View logs" + + ```sh + docker logs -f syncthing + ``` diff --git a/tools/include/markdown/MED015-header.md b/tools/include/markdown/MED015-header.md new file mode 100644 index 000000000..b3fdf358d --- /dev/null +++ b/tools/include/markdown/MED015-header.md @@ -0,0 +1 @@ +Syncthing replaces proprietary sync and cloud services with something open, trustworthy and decentralized. Your data is your data alone and you deserve to choose where it is stored, if it is shared with some third party and how it's transmitted over the Internet. diff --git a/tools/include/markdown/MED020-footer.md b/tools/include/markdown/MED020-footer.md new file mode 100644 index 000000000..bedce4f85 --- /dev/null +++ b/tools/include/markdown/MED020-footer.md @@ -0,0 +1,18 @@ +=== "Access to the web interface" + + The web interface is accessible via port **443**: + + - URL: `https://:443` + - Username/Password: admin / generate at first web interface login + +=== "Directories" + + - Install directory: `/armbian/nextcloud` + - Site configuration directory: `/armbian/nextcloud/config` + - Data directory: `/armbian/nextcloud/data` + +=== "View logs" + + ```sh + docker logs -f nextcloud + ``` diff --git a/tools/include/markdown/MED020-header.md b/tools/include/markdown/MED020-header.md new file mode 100644 index 000000000..2665d461e --- /dev/null +++ b/tools/include/markdown/MED020-header.md @@ -0,0 +1,3 @@ +Nextcloud gives you access to all your files wherever you are. +
+Where are your photos and documents? With Nextcloud you pick a server of your choice, at home, in a data center or at a provider. And that is where your files will be. Nextcloud runs on that server, protecting your data and giving you access from your desktop or mobile devices. Through Nextcloud you also access, sync and share your existing data on that FTP drive at the office, a Dropbox or a NAS you have at home. diff --git a/tools/include/markdown/MED027-footer.md b/tools/include/markdown/MED027-footer.md new file mode 100644 index 000000000..4e833bb5a --- /dev/null +++ b/tools/include/markdown/MED027-footer.md @@ -0,0 +1,18 @@ +=== "Access to the web interface" + + The web interface is accessible via port **7787**: + + - URL: `http://:7787` + - Username/Password: admin / admin + +=== "Directories" + + - Install directory: `/armbian/owncloud` + - Site configuration directory: `/armbian/owncloud/config` + - Data directory: `/armbian/owncloud/data` + +=== "View logs" + + ```sh + docker logs -f owncloud + ``` diff --git a/tools/include/markdown/MED027-header.md b/tools/include/markdown/MED027-header.md new file mode 100644 index 000000000..7b4060ae2 --- /dev/null +++ b/tools/include/markdown/MED027-header.md @@ -0,0 +1 @@ +ownCloud is a free and open-source software project for content collaboration and sharing and syncing of files in distributed and federated enterprise scenarios. diff --git a/tools/json/config.software.json b/tools/json/config.software.json index 335aae7cf..a28cb4e7b 100644 --- a/tools/json/config.software.json +++ b/tools/json/config.software.json @@ -970,8 +970,97 @@ "status": "Stable", "author": "@igorpecovnik", "condition": "! module_stirling status && [[ -d \"${SOFTWARE_FOLDER}/stirling\" ]]" + }, + { + "id": "MED015", + "description": "Syncthing Install", + "command": [ + "module_syncthing install" + ], + "status": "Stable", + "author": "@igorpecovnik", + "condition": "! module_syncthing status" + }, + { + "id": "MED016", + "description": "Syncthing Remove", + "command": [ + "module_syncthing remove" + ], + "status": "Stable", + "author": "@igorpecovnik", + "condition": "module_syncthing status" + }, + { + "id": "MED017", + "description": "Syncthing Purge data folder", + "command": [ + "module_syncthing purge" + ], + "status": "Stable", + "author": "@igorpecovnik", + "condition": "! module_syncthing status && [[ -d \"${SOFTWARE_FOLDER}/syncthing\" ]]" + }, + { + "id": "MED020", + "description": "Nextcloud Install", + "command": [ + "module_nextcloud install" + ], + "status": "Stable", + "author": "@igorpecovnik", + "condition": "! module_nextcloud status" + }, + { + "id": "MED021", + "description": "Nextcloud Remove", + "command": [ + "module_nextcloud remove" + ], + "status": "Stable", + "author": "@igorpecovnik", + "condition": "module_nextcloud status" + }, + { + "id": "MED022", + "description": "Nextcloud Purge data folder", + "command": [ + "module_nextcloud purge" + ], + "status": "Stable", + "author": "@igorpecovnik", + "condition": "! module_nextcloud status && [[ -d \"${SOFTWARE_FOLDER}/nextcloud\" ]]" + }, + { + "id": "MED025", + "description": "Owncloud Install", + "command": [ + "module_owncloud install" + ], + "status": "Stable", + "author": "@igorpecovnik", + "condition": "! module_owncloud status" + }, + { + "id": "MED026", + "description": "Owncloud Remove", + "command": [ + "module_owncloud remove" + ], + "status": "Stable", + "author": "@igorpecovnik", + "condition": "module_owncloud status" + }, + { + "id": "MED027", + "description": "Owncloud Purge data folder", + "command": [ + "module_owncloud purge" + ], + "status": "Stable", + "author": "@igorpecovnik", + "condition": "! module_owncloud status && [[ -d \"${SOFTWARE_FOLDER}/owncloud\" ]]" } - ] }, { diff --git a/tools/modules/runtime/config.runtime.sh b/tools/modules/runtime/config.runtime.sh index 3cd755d0d..d5fb48d3c 100644 --- a/tools/modules/runtime/config.runtime.sh +++ b/tools/modules/runtime/config.runtime.sh @@ -97,6 +97,9 @@ fi update_sub_submenu_data "Software" "Database" "DAT002" "Server: $LOCALIPADD" update_sub_submenu_data "Software" "Database" "DAT006" "http://$LOCALIPADD:${module_options["module_phpmyadmin,port"]}" update_sub_submenu_data "Software" "Media" "MED006" "http://$LOCALIPADD:${module_options["module_stirling,port"]}" +update_sub_submenu_data "Software" "Media" "MED016" "http://$LOCALIPADD:${module_options["module_syncthing,port"]}" +update_sub_submenu_data "Software" "Media" "MED021" "https://$LOCALIPADD:${module_options["module_nextcloud,port"]}" +update_sub_submenu_data "Software" "Media" "MED026" "http://$LOCALIPADD:${module_options["module_owncloud,port"]}" 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"]}" diff --git a/tools/modules/software/install_nextcloud.sh b/tools/modules/software/install_nextcloud.sh new file mode 100644 index 000000000..cde430bdd --- /dev/null +++ b/tools/modules/software/install_nextcloud.sh @@ -0,0 +1,84 @@ +module_options+=( + ["module_nextcloud,author"]="" + ["module_nextcloud,maintainer"]="@igorpecovnik" + ["module_nextcloud,testers"]="@igorpecovnik" + ["module_nextcloud,feature"]="module_nextcloud" + ["module_nextcloud,desc"]="Install nextcloud container" + ["module_nextcloud,example"]="install remove purge status help" + ["module_nextcloud,port"]="443" + ["module_nextcloud,status"]="Active" + ["module_nextcloud,arch"]="x86-64,arm64" +) +# +# Module nextcloud +# +function module_nextcloud () { + local title="nextcloud" + local condition=$(which "$title" 2>/dev/null) + + if check_if_installed docker-ce; then + local container=$(docker container ls -a | mawk '/nextcloud?( |$)/{print $1}') + local image=$(docker image ls -a | mawk '/nextcloud?( |$)/{print $3}') + fi + + local commands + IFS=' ' read -r -a commands <<< "${module_options["module_nextcloud,example"]}" + + NEXTCLOUD_BASE="${SOFTWARE_FOLDER}/nextcloud" + + case "$1" in + "${commands[0]}") + check_if_installed docker-ce || install_docker + [[ -d "$NEXTCLOUD_BASE" ]] || mkdir -p "$NEXTCLOUD_BASE" || { echo "Couldn't create storage directory: $NEXTCLOUD_BASE"; exit 1; } + docker run -d \ + --name=nextcloud \ + -e PUID=1000 \ + -e PGID=1000 \ + -e TZ="$(cat /etc/timezone)" \ + -p 443:443 \ + -v "${NEXTCLOUD_BASE}/config:/config" \ + -v "${NEXTCLOUD_BASE}/data:/data" \ + --restart unless-stopped \ + lscr.io/linuxserver/nextcloud:latest + for i in $(seq 1 20); do + if docker inspect -f '{{ index .Config.Labels "build_version" }}' nextcloud >/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 nextcloud\`)" + exit 1 + fi + done + ;; + "${commands[1]}") + [[ "${container}" ]] && docker container rm -f "$container" >/dev/null + [[ "${image}" ]] && docker image rm "$image" >/dev/null + ;; + "${commands[2]}") + [[ -n "${NEXTCLOUD_BASE}" && "${NEXTCLOUD_BASE}" != "/" ]] && rm -rf "${NEXTCLOUD_BASE}" + ;; + "${commands[3]}") + if [[ "${container}" && "${image}" ]]; then + return 0 + else + return 1 + fi + ;; + "${commands[4]}") + echo -e "\nUsage: ${module_options["module_nextcloud,feature"]} " + echo -e "Commands: ${module_options["module_nextcloud,example"]}" + echo "Available commands:" + echo -e "\tinstall\t- Install $title." + echo -e "\tremove\t- Remove $title." + echo -e "\tpurge\t- Purge $title data folder." + echo -e "\tstatus\t- Installation status $title." + + echo + ;; + *) + ${module_options["module_nextcloud,feature"]} ${commands[4]} + ;; + esac +} diff --git a/tools/modules/software/install_owncloud.sh b/tools/modules/software/install_owncloud.sh new file mode 100644 index 000000000..6a294c8ec --- /dev/null +++ b/tools/modules/software/install_owncloud.sh @@ -0,0 +1,82 @@ +module_options+=( + ["module_owncloud,author"]="@armbian" + ["module_owncloud,feature"]="module_owncloud" + ["module_owncloud,desc"]="Install owncloud container" + ["module_owncloud,example"]="install remove purge status help" + ["module_owncloud,port"]="7787" + ["module_owncloud,status"]="Active" + ["module_owncloud,arch"]="x86-64,arm64" +) +# +# Module owncloud +# +function module_owncloud () { + local title="owncloud" + local condition=$(which "$title" 2>/dev/null) + + if check_if_installed docker-ce; then + local container=$(docker container ls -a | mawk '/owncloud?( |$)/{print $1}') + local image=$(docker image ls -a | mawk '/owncloud/{print $3}') + fi + + local commands + IFS=' ' read -r -a commands <<< "${module_options["module_owncloud,example"]}" + + OWNCLOUD_BASE="${SOFTWARE_FOLDER}/owncloud" + + case "$1" in + "${commands[0]}") + check_if_installed docker-ce || install_docker + [[ -d "$OWNCLOUD_BASE" ]] || mkdir -p "$OWNCLOUD_BASE" || { echo "Couldn't create storage directory: $OWNCLOUD_BASE"; exit 1; } + docker run -d \ + --name=owncloud \ + -e PUID=1000 \ + -e PGID=1000 \ + -e TZ="$(cat /etc/timezone)" \ + -e "OWNCLOUD_TRUSTED_DOMAINS=${LOCALIPADD}" \ + -p 7787:8080 \ + -v "${OWNCLOUD_BASE}/config:/config" \ + -v "${OWNCLOUD_BASE}/data:/mnt/data" \ + --restart unless-stopped \ + owncloud/server + for i in $(seq 1 20); do + if docker inspect -f '{{ index .Config.Labels "build_version" }}' owncloud >/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 owncloud\`)" + exit 1 + fi + done + ;; + "${commands[1]}") + [[ "${container}" ]] && docker container rm -f "$container" >/dev/null + [[ "${image}" ]] && docker image rm "$image" >/dev/null + ;; + "${commands[2]}") + [[ -n "${OWNCLOUD_BASE}" && "${OWNCLOUD_BASE}" != "/" ]] && rm -rf "${OWNCLOUD_BASE}" + ;; + "${commands[3]}") + if [[ "${container}" && "${image}" ]]; then + return 0 + else + return 1 + fi + ;; + "${commands[4]}") + echo -e "\nUsage: ${module_options["module_owncloud,feature"]} " + echo -e "Commands: ${module_options["module_owncloud,example"]}" + echo "Available commands:" + echo -e "\tinstall\t- Install $title." + echo -e "\tremove\t- Remove $title." + echo -e "\tpurge\t- Purge $title data folder." + echo -e "\tstatus\t- Installation status $title." + echo + ;; + *) + ${module_options["module_owncloud,feature"]} ${commands[4]} + ;; + esac +} diff --git a/tools/modules/software/install_syncthing.sh b/tools/modules/software/install_syncthing.sh new file mode 100644 index 000000000..10d16823a --- /dev/null +++ b/tools/modules/software/install_syncthing.sh @@ -0,0 +1,89 @@ +module_options+=( + ["module_syncthing,author"]="" + ["module_syncthing,maintainer"]="@igorpecovnik" + ["module_syncthing,testers"]="@igorpecovnik" + ["module_syncthing,feature"]="module_syncthing" + ["module_syncthing,desc"]="Install syncthing container" + ["module_syncthing,example"]="install remove purge status help" + ["module_syncthing,port"]="8884" + ["module_syncthing,status"]="Active" + ["module_syncthing,arch"]="x86-64,arm64" +) +# +# Module syncthing +# +function module_syncthing () { + local title="syncthing" + local condition=$(which "$title" 2>/dev/null) + + if check_if_installed docker-ce; then + local container=$(docker container ls -a | mawk '/syncthing?( |$)/{print $1}') + local image=$(docker image ls -a | mawk '/syncthing?( |$)/{print $3}') + fi + + local commands + IFS=' ' read -r -a commands <<< "${module_options["module_syncthing,example"]}" + + SYNCTHING_BASE="${SOFTWARE_FOLDER}/syncthing" + + case "$1" in + "${commands[0]}") + check_if_installed docker-ce || install_docker + [[ -d "$SYNCTHING_BASE" ]] || mkdir -p "$SYNCTHING_BASE" || { echo "Couldn't create storage directory: $SYNCTHING_BASE"; exit 1; } + docker run -d \ + --name=syncthing \ + --hostname=syncthing `#optional` \ + -e PUID=1000 \ + -e PGID=1000 \ + -e TZ="$(cat /etc/timezone)" \ + -p 8884:8384 \ + -p 22000:22000/tcp \ + -p 22000:22000/udp \ + -p 21027:21027/udp \ + -v "${SYNCTHING_BASE}/config:/config" \ + -v "${SYNCTHING_BASE}/data1:/data1" \ + -v "${SYNCTHING_BASE}/data2:/data2" \ + --restart unless-stopped \ + lscr.io/linuxserver/syncthing:latest + for i in $(seq 1 20); do + if docker inspect -f '{{ index .Config.Labels "build_version" }}' syncthing >/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 syncthing\`)" + exit 1 + fi + done + ;; + "${commands[1]}") + [[ "${container}" ]] && docker container rm -f "$container" >/dev/null + [[ "${image}" ]] && docker image rm "$image" >/dev/null + ;; + "${commands[2]}") + [[ -n "${SYNCTHING_BASE}" && "${SYNCTHING_BASE}" != "/" ]] && rm -rf "${SYNCTHING_BASE}" + ;; + "${commands[3]}") + if [[ "${container}" && "${image}" ]]; then + return 0 + else + return 1 + fi + ;; + "${commands[4]}") + echo -e "\nUsage: ${module_options["module_syncthing,feature"]} " + echo -e "Commands: ${module_options["module_syncthing,example"]}" + echo "Available commands:" + echo -e "\tinstall\t- Install $title." + echo -e "\tremove\t- Remove $title." + echo -e "\tpurge\t- Purge $title data folder." + echo -e "\tstatus\t- Installation status $title." + + echo + ;; + *) + ${module_options["module_syncthing,feature"]} ${commands[4]} + ;; + esac +}