From db8c385587f4e5f2ea714a561bc02b77989c0bae Mon Sep 17 00:00:00 2001 From: m3tam3re Date: Thu, 13 Mar 2025 13:43:50 +0100 Subject: [PATCH] +custom services --- justfiles/scripts/add-custom-service.sh | 68 +++++++++++++++++++++++++ justfiles/scripts/docker-disk.sh | 3 ++ justfiles/scripts/docker-restart.sh | 11 ++++ justfiles/scripts/logs.sh | 34 +++++++++++++ justfiles/scripts/status.sh | 3 ++ justfiles/scripts/update-containers.sh | 40 +++++++++++++++ services/caddy/hosts/baserow.nix | 13 +++++ services/caddy/hosts/n8n.nix | 13 +++++ services/caddy/hosts/portainer.nix | 14 +++++ 9 files changed, 199 insertions(+) create mode 100755 justfiles/scripts/add-custom-service.sh create mode 100755 justfiles/scripts/docker-disk.sh create mode 100755 justfiles/scripts/docker-restart.sh create mode 100755 justfiles/scripts/logs.sh create mode 100755 justfiles/scripts/status.sh create mode 100755 justfiles/scripts/update-containers.sh create mode 100644 services/caddy/hosts/baserow.nix create mode 100644 services/caddy/hosts/n8n.nix create mode 100644 services/caddy/hosts/portainer.nix diff --git a/justfiles/scripts/add-custom-service.sh b/justfiles/scripts/add-custom-service.sh new file mode 100755 index 0000000..c711e8d --- /dev/null +++ b/justfiles/scripts/add-custom-service.sh @@ -0,0 +1,68 @@ +#!/usr/bin/env bash +set -euo pipefail + +gum style \ + --foreground 212 \ + --bold \ + --border normal \ + --align center \ + --width 50 \ + --margin "1 2" \ + "šŸ”§ Add Custom Service" + +SERVICE_NAME="$(gum input --placeholder "Enter service name" --prompt "Service Name: ")" +[[ -z "${SERVICE_NAME}" ]] && { gum style --foreground 1 "āš ļø Service name cannot be empty"; exit 1; } + +SUBDOMAIN="$(gum input --placeholder "Enter subdomain" --prompt "Subdomain: ")" +[[ -z "${SUBDOMAIN}" ]] && { gum style --foreground 1 "āš ļø Subdomain cannot be empty"; exit 1; } + +PORT="$(gum input --placeholder "Enter port number" --prompt "Port: ")" +[[ ! "${PORT}" =~ ^[0-9]+$ ]] && { gum style --foreground 1 "āš ļø Port must be a number"; exit 1; } + +gum confirm "Is ${SUBDOMAIN} the correct domain?" || { gum style --foreground 1 "āŒ Operation cancelled"; exit 0; } + +CONFIG_DIR="/etc/nixos/current-systemconfig" +SERVICES_DIR="${CONFIG_DIR}/custom-services" + +# Create directories if they don't exist +mkdir -p "${SERVICES_DIR}" + +FILE_PATH="${SERVICES_DIR}/${SERVICE_NAME}.nix" + +cat > "${FILE_PATH}" << EOF +{ + ${SUBDOMAIN} = { + extraConfig = '' + reverse_proxy localhost:${PORT} + header { + Strict-Transport-Security "max-age=31536000; includeSubDomains" + X-Content-Type-Options "nosniff" + X-Frame-Options "DENY" + Referrer-Policy "strict-origin-when-cross-origin" + } + ''; + }; +} +EOF + +if [[ $? -eq 0 ]]; then + gum style --foreground 212 "āœ… Service file created successfully at ${FILE_PATH}" + + # Initialize Git repo if it doesn't exist + if [[ ! -d "${CONFIG_DIR}/.git" ]]; then + cd "${CONFIG_DIR}" + gum spin --spinner dot --title "Initializing Git repository..." -- git init + fi + + gum spin --spinner dot --title "Adding all files..." -- git add . + gum spin --spinner dot --title "Creating initial commit..." -- git commit -m "Initial commit" + # NixOS rebuild + cd "${CONFIG_DIR}" + gum spin --spinner dot --title "Rebuilding NixOS..." -- \ + nixos-rebuild switch --flake .#nixos + + gum style --foreground 212 "āœ… Service deployed successfully!" +else + gum style --foreground 1 "āŒ Failed to create service file" + exit 1 +fi diff --git a/justfiles/scripts/docker-disk.sh b/justfiles/scripts/docker-disk.sh new file mode 100755 index 0000000..e229559 --- /dev/null +++ b/justfiles/scripts/docker-disk.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +gum style --foreground 212 --bold --border normal --align center --width 50 --margin "1 2" "šŸ’¾ Docker Disk Usage" +docker system df | gum table diff --git a/justfiles/scripts/docker-restart.sh b/justfiles/scripts/docker-restart.sh new file mode 100755 index 0000000..0202089 --- /dev/null +++ b/justfiles/scripts/docker-restart.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +containers=($(docker ps --format "{{.Names}}")) +if [ ${#containers[@]} -eq 0 ]; then + gum style --foreground 1 "āš ļø No running containers found" + exit 1 +fi +container=$(printf "%s\n" "${containers[@]}" | gum choose --header "Select a container to restart:" --cursor.foreground 212) +if [ -n "$container" ]; then + gum spin --spinner dot --title "Restarting $container..." -- systemctl restart docker-$container + gum style --foreground 212 "āœ… Container $container restarted successfully!" +fi diff --git a/justfiles/scripts/logs.sh b/justfiles/scripts/logs.sh new file mode 100755 index 0000000..0dddd09 --- /dev/null +++ b/justfiles/scripts/logs.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env bash +gum style --foreground 212 --bold --border normal --align center --width 50 --margin "1 2" "šŸ“ Docker Logs Viewer" + +# Get running container names +containers=($(docker ps --format "{{.Names}}")) + +if [ ${#containers[@]} -eq 0 ]; then + gum style --foreground 1 "āš ļø No running containers found" + exit 1 +fi + +# Select container using gum choose +container=$(printf "%s\n" "${containers[@]}" | gum choose --header "Select a container:" --cursor.foreground 212) + +if [ -z "$container" ]; then + exit 0 +fi + +# Select number of lines using gum choose +lines=$(gum choose --header "Select number of log lines:" --cursor.foreground 212 \ + "5 lines" "10 lines" "25 lines" "50 lines" "100 lines" "200 lines") + +if [ -z "$lines" ]; then + exit 0 +fi + +# Extract number from selection +lines=${lines%% *} + +# Show spinner while fetching logs +gum spin --spinner dot --title "Fetching logs..." -- sleep 1 + +# Show logs +docker logs "$container" 2>&1 | tail -n "$lines" | gum pager diff --git a/justfiles/scripts/status.sh b/justfiles/scripts/status.sh new file mode 100755 index 0000000..ca34d84 --- /dev/null +++ b/justfiles/scripts/status.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +gum style --foreground 212 --bold --border normal --align center --width 50 --margin "1 2" "šŸ“Š Running Containers" +docker ps --format "table {{.Names}}\t{{.Status}}" | gum table diff --git a/justfiles/scripts/update-containers.sh b/justfiles/scripts/update-containers.sh new file mode 100755 index 0000000..5ecd494 --- /dev/null +++ b/justfiles/scripts/update-containers.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash +set -e # Exit on error +CONTAINERS=($(docker ps --format "{{.Names}}")) + +echo "Will update these containers:" +printf '%s\n' "${CONTAINERS[@]}" | gum table && \ +gum confirm "Continue?" || exit 0 + +# First collect all image information +declare -A CONTAINER_IMAGES +echo "Collecting image information..." +for container in "${CONTAINERS[@]}"; do + FULL_IMAGE=$(docker inspect "$container" --format '{{.Config.Image}}') + CONTAINER_IMAGES[$container]=$(echo "$FULL_IMAGE" | sed 's/@sha256.*$//') + echo "$container -> ${CONTAINER_IMAGES[$container]}" +done + +echo "Stopping containers..." && \ +for container in "${CONTAINERS[@]}"; do + echo "Stopping $container..." + sudo systemctl stop "docker-$container.service" +done + +echo "Pulling new images..." && \ +for container in "${CONTAINERS[@]}"; do + IMAGE="${CONTAINER_IMAGES[$container]}" + echo -e "\nšŸ“„ Pulling $IMAGE for $container..." | gum style --foreground 99 + if ! docker pull "$IMAGE" --quiet=false; then + echo "āŒ Failed to pull $IMAGE" | gum style --foreground 196 + exit 1 + fi + echo "------------------------" +done + +echo "Starting containers..." && \ +for container in "${CONTAINERS[@]}"; do + echo "Starting $container..." + sudo systemctl start "docker-$container.service" +done && \ +gum style --foreground 212 "āœ… Containers updated successfully!" diff --git a/services/caddy/hosts/baserow.nix b/services/caddy/hosts/baserow.nix new file mode 100644 index 0000000..b955471 --- /dev/null +++ b/services/caddy/hosts/baserow.nix @@ -0,0 +1,13 @@ +{jsonConfig, ...}: { + ${jsonConfig.domains.baserow} = { + extraConfig = '' + reverse_proxy localhost:3000 + header { + Strict-Transport-Security "max-age=31536000; includeSubDomains" + X-Content-Type-Options "nosniff" + X-Frame-Options "DENY" + Referrer-Policy "strict-origin-when-cross-origin" + } + ''; + }; +} diff --git a/services/caddy/hosts/n8n.nix b/services/caddy/hosts/n8n.nix new file mode 100644 index 0000000..f6b9cfe --- /dev/null +++ b/services/caddy/hosts/n8n.nix @@ -0,0 +1,13 @@ +{jsonConfig, ...}: { + ${jsonConfig.domains.n8n} = { + extraConfig = '' + reverse_proxy localhost:5678 + header { + Strict-Transport-Security "max-age=31536000; includeSubDomains" + X-Content-Type-Options "nosniff" + X-Frame-Options "DENY" + Referrer-Policy "strict-origin-when-cross-origin" + } + ''; + }; +} diff --git a/services/caddy/hosts/portainer.nix b/services/caddy/hosts/portainer.nix new file mode 100644 index 0000000..60a0bc0 --- /dev/null +++ b/services/caddy/hosts/portainer.nix @@ -0,0 +1,14 @@ +{jsonConfig, ...}: { + ${jsonConfig.domains.portainer} = { + extraConfig = '' + reverse_proxy localhost:9000 + header { + # Security headers + Strict-Transport-Security "max-age=31536000; includeSubDomains" + X-Content-Type-Options "nosniff" + X-Frame-Options "DENY" + Referrer-Policy "strict-origin-when-cross-origin" + } + ''; + }; +}