From 07f251f1198911ecbba19a1197fcaf8faa91b000 Mon Sep 17 00:00:00 2001 From: SDGDen Date: Thu, 5 Mar 2026 03:50:44 +0100 Subject: [PATCH] updated some docker compose files, main script for setup and added jellyfin configs. dash still nonfunctional. --- deploy.sh | 78 +++++++++++++++++++++-- stacks/browser/compose.yml | 1 + stacks/dashboard/compose.yml | 2 +- stacks/dashboard/www/app (1).sqlite | Bin 0 -> 139264 bytes stacks/npm/data/nginx/proxy_host/13.conf | 2 +- stacks/pihole/compose.yml | 4 +- 6 files changed, 80 insertions(+), 7 deletions(-) create mode 100644 stacks/dashboard/www/app (1).sqlite diff --git a/deploy.sh b/deploy.sh index b562297..924ad25 100644 --- a/deploy.sh +++ b/deploy.sh @@ -108,7 +108,35 @@ replace_in_sqlite_db() { #example usage: replace_in_sqlite_db "database.sqlite" "Europe/Amsterdam" "UTC" +get_country_from_timezone() { + local timezone="$1" + # Extract the region and city from the timezone (e.g., "America/New_York" -> "New_York") + local city=$(echo "$timezone" | cut -d'/' -f2) + + # Use a predefined mapping for common cities (fallback if no better method is found) + # This is a minimal mapping; you can expand it as needed. + local declare -A city_to_country=( + ["New_York"]="United States" + ["Toronto"]="Canada" + ["Amsterdam"]="Netherlands" + ["London"]="United Kingdom" + ["Tokyo"]="Japan" + ["Paris"]="France" + ["Berlin"]="Germany" + ["Sydney"]="Australia" + ["Melbourne"]="Australia" + ) + + # Check if the city exists in the mapping + if [ -n "${city_to_country[$city]}" ]; then + echo "${city_to_country[$city]}" + else + # Fallback: Try to extract country from the timezone file (less reliable) + # This is a placeholder; actual implementation would require parsing timezone files. + echo "Unknown" + fi +} # what this script needs to do: @@ -120,6 +148,17 @@ echo read -rp "Timezone (e.g. Europe/Amsterdam): " timezone < /dev/tty read -rp "Domain (e.g. example.com): " domain < /dev/tty +echo "--------------------------------------------------------" +echo "please double-check your DNS records to ensure they are set. the following dns records need to be set:" +echo "" +echo "|name |type |value " +echo "|@ |A |$publicip " +echo "|* |CNAME |@ " +echo "" +echo "once you've done this, press any key to continue" +read -n 1 -s -r -p "" + + # Public IP (tries multiple services) publicip="$(curl -fsS https://api.ipify.org || curl -fsS https://ifconfig.me || echo "UNKNOWN")" @@ -143,7 +182,7 @@ onlyofficeJWT="$(rand_hex)" # install docker echo "Updating apt and installing prerequisites..." apt update -apt install -y ca-certificates curl +apt install -y ca-certificates curl git openssl curl gawk coreutils grep jq sqlite3 iso-codes echo "Setting up Docker GPG key..." install -m 0755 -d /etc/apt/keyrings @@ -169,7 +208,7 @@ apt install -y \ docker-ce-cli \ containerd.io \ docker-buildx-plugin \ - docker-compose-plugin + docker-compose-plugin echo "Docker installation complete." docker --version @@ -218,7 +257,6 @@ replace_string_recursive "/opt/stacks" "?onlyofficeJWT?" $onlyofficeJWT # install mailcow to /opt/stacks/mailcow so it shows up in dockge -apt install -y git openssl curl gawk coreutils grep jq sqlite3 umask 0022 #cd /opt/stacks #git clone https://github.com/mailcow/mailcow-dockerized mailcow @@ -251,7 +289,7 @@ read -n 1 -s -r -p "" cd /opt/stacks/dozzle docker compose up -d -echo "dozzle has been launched from http://dozzle.$domain, verify it is online" +echo "dozzle has been launched from http://dozzle.$domain, verify it is online, do not worry if the UI gives a time-out error, this is due to docker being busy while this script runs." cd /opt/stacks/convertx docker compose up -d @@ -282,16 +320,47 @@ docker compose up -d echo "vaultwarden has been launched from http://vault.$domain, verify it is online" #bookstack +cd /opt/stacks/bookstack +docker compose up -d +echo "bookstack has been launched from http://docs.$domain, verify it is online (this may take a bit) and log in with email 'admin@admin.com' and password 'password', then reset this account to use $adminemail and your password" #browser +cd /opt/stacks/browser +docker compose up -d +echo "filebrowser has been launched from http://browser.$domain, head to dockge (http://docker.$domain), open the filebrowser stack and check the logs for the initial admin password. make sure to change this in filebrowser's config, then press any key to continue" +read -n 1 -s -r -p "" #jellyfin +cd /opt/stacks/jellyfin +docker compose up -d +metadatacountry=$(get_country_from_timezone "$timezone") + +sleep 15 +echo "running jellyfin configuration" +docker exec -it "jellyfin" \ + sh -c "JFCLI_URI='http://localhost:8096' jfcli wizard \ + --display-language 'EN_US' \ + --admin-username '$adminemail' \ + --admin-password '$adminpass' \ + --metadata-language 'EN' \ + --metadata-country '$metadatacountry' \ + --allow-remote \ + --disallow-upnp \ + --listen-addr '0.0.0.0/0' \ + --listen-port '8096'" + #uptimekuma +# todo: pre-create database, placeholder database, include database. for database preconfig: turn off auth so user can set password afterwards #owncloud +# todo: use OC config commands to install addons and configure onlyoffice #pihole +systemctl restart systemd-resolved +cd /opt/stacks/pihole +docker compose up -d +echo "pihole has been launched from http://dns.$domain, to use pihole as your DNS provider, set your DNS to $localip in your router for DHCP and on your device for any device with a static ip. Currently, the DNS is configured to use the joindns4.eu DNS, which *also* has built-in adblocking." #dashboard replace_in_sqlite_db "/opt/stacks/dashboard/www/app.sqlite" "" $domain @@ -299,6 +368,7 @@ cd /opt/stacks/dashboard docker compose up -d echo "dashboard has been launched from http://dash.$domain, verify it is online, check that its entries work and press any button to continue" read -n 1 -s -r -p "" +#doesnt work yet echo "" diff --git a/stacks/browser/compose.yml b/stacks/browser/compose.yml index 9e72569..29e9ace 100644 --- a/stacks/browser/compose.yml +++ b/stacks/browser/compose.yml @@ -8,6 +8,7 @@ services: - dockge_default volumes: - /opt/stacks:/srv/stacks + - /opt/stacks/jellyfin/media:/srv/media - ./filebrowser.db:/database.db restart: unless-stopped networks: diff --git a/stacks/dashboard/compose.yml b/stacks/dashboard/compose.yml index 20aa681..2116ae0 100644 --- a/stacks/dashboard/compose.yml +++ b/stacks/dashboard/compose.yml @@ -5,7 +5,7 @@ services: environment: - PUID=1000 - PGID=1000 - - TZ=$timezone + - TZ=?timezone? - ALLOW_INTERNAL_REQUESTS=false #optional - APP_NAME=Home volumes: diff --git a/stacks/dashboard/www/app (1).sqlite b/stacks/dashboard/www/app (1).sqlite new file mode 100644 index 0000000000000000000000000000000000000000..32806777ba7c069027bb427864c9e357d3492f3f GIT binary patch literal 139264 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 e