From 95ad02c9ef8c3b8bafdf9a9e0a1e4e57340a080d Mon Sep 17 00:00:00 2001 From: "push-app-to-main[bot]" <203845782+push-app-to-main[bot]@users.noreply.github.com> Date: Wed, 14 Jan 2026 17:55:51 +0100 Subject: [PATCH] Kutt (#10812) * Add kutt (ct) * Fix success message formatting in kutt.sh --------- Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com> Co-authored-by: CanbiZ (MickLesk) <47820557+MickLesk@users.noreply.github.com> --- ct/headers/kutt | 6 +++ ct/kutt.sh | 74 +++++++++++++++++++++++++++++++++ frontend/public/json/kutt.json | 40 ++++++++++++++++++ install/kutt-install.sh | 75 ++++++++++++++++++++++++++++++++++ 4 files changed, 195 insertions(+) create mode 100644 ct/headers/kutt create mode 100644 ct/kutt.sh create mode 100644 frontend/public/json/kutt.json create mode 100644 install/kutt-install.sh diff --git a/ct/headers/kutt b/ct/headers/kutt new file mode 100644 index 000000000..a132aed6f --- /dev/null +++ b/ct/headers/kutt @@ -0,0 +1,6 @@ + __ __ __ __ + / //_/_ __/ /_/ /_ + / ,< / / / / __/ __/ + / /| / /_/ / /_/ /_ +/_/ |_\__,_/\__/\__/ + diff --git a/ct/kutt.sh b/ct/kutt.sh new file mode 100644 index 000000000..1177b994a --- /dev/null +++ b/ct/kutt.sh @@ -0,0 +1,74 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2026 community-scripts ORG +# Author: tomfrenzel +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/thedevs-network/kutt + +APP="Kutt" +var_tags="${var_tags:-sharing}" +var_cpu="${var_cpu:-1}" +var_ram="${var_ram:-1024}" +var_disk="${var_disk:-2}" +var_os="${var_os:-debian}" +var_version="${var_version:-13}" +var_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d /opt/kutt ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + if check_for_gh_release "kutt" "thedevs-network/kutt"; then + msg_info "Stopping services" + systemctl stop kutt + msg_ok "Stopped services" + + msg_info "Backing up data" + mkdir -p /opt/kutt-backup + [ -d /opt/kutt/custom ] && cp -r /opt/kutt/custom /opt/kutt-backup/ + [ -d /opt/kutt/db ] && cp -r /opt/kutt/db /opt/kutt-backup/ + cp /opt/kutt/.env /opt/kutt-backup/ + msg_ok "Backed up data" + + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "kutt" "thedevs-network/kutt" "tarball" "latest" + + msg_info "Restoring data" + [ -d /opt/kutt-backup/custom ] && cp -r /opt/kutt-backup/custom /opt/kutt/ + [ -d /opt/kutt-backup/db ] && cp -r /opt/kutt-backup/db /opt/kutt/ + [ -f /opt/kutt-backup/.env ] && cp /opt/kutt-backup/.env /opt/kutt/ + rm -rf /opt/kutt-backup + msg_ok "Restored data" + + msg_info "Configuring Kutt" + cd /opt/kutt + $STD npm install + $STD npm run migrate + msg_ok "Configured Kutt" + + msg_info "Starting services" + systemctl start kutt + msg_ok "Started services" + msg_ok "Updated successfully!" + fi + exit +} + +start +build_container +description + +msg_ok "Completed successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW} Access it using the following URL:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}https://${IP} or https://${CL}" diff --git a/frontend/public/json/kutt.json b/frontend/public/json/kutt.json new file mode 100644 index 000000000..1200e34ae --- /dev/null +++ b/frontend/public/json/kutt.json @@ -0,0 +1,40 @@ +{ + "name": "Kutt", + "slug": "kutt", + "categories": [ + 21 + ], + "date_created": "2025-12-14", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 443, + "documentation": "https://github.com/thedevs-network/kutt/", + "config_path": "/opt/kutt/.env", + "website": "https://kutt.it", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/kutt.webp", + "description": "Kutt is a modern URL shortener with support for custom domains. Create and edit links, view statistics, manage users, and more.", + "install_methods": [ + { + "type": "default", + "script": "ct/kutt.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 2, + "os": "Debian", + "version": "13" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Kutt needs so be served with an SSL certificate for its login to work. During install, you will be prompted to choose if you want to have Caddy installed for SSL termination or if you want to use your own reverse proxy (in that case point your reverse porxy to port 3000).", + "type": "info" + } + ] +} diff --git a/install/kutt-install.sh b/install/kutt-install.sh new file mode 100644 index 000000000..70380b302 --- /dev/null +++ b/install/kutt-install.sh @@ -0,0 +1,75 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: tomfrenzel +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/thedevs-network/kutt + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +echo "${TAB3}How would you like to handle SSL termination?" +echo "${TAB3}[i]-Internal (self-signed SSL Certificate) [e]-External (use your own reverse proxy)" +read -rp "${TAB3}Enter your choice (default: i): " ssl_choice +ssl_choice=${ssl_choice:-i} +case "${ssl_choice,,}" in +i) + import_local_ip + DEFAULT_HOST="$LOCAL_IP" + + msg_info "Configuring Caddy" + $STD apt install -y caddy + cat </etc/caddy/Caddyfile +$LOCAL_IP { + reverse_proxy localhost:3000 +} +EOF + systemctl restart caddy + msg_ok "Configured Caddy" + ;; +e) + read -r -p "${TAB3}Enter the hostname you want to use for Kutt (eg. kutt.example.com): " custom_host + if [[ "$custom_host" ]]; then + DEFAULT_HOST="$custom_host" + fi + ;; +esac + +NODE_VERSION="22" setup_nodejs +fetch_and_deploy_gh_release "kutt" "thedevs-network/kutt" "tarball" + +msg_info "Configuring Kutt" +cd /opt/kutt +cp .example.env ".env" +sed -i "s|JWT_SECRET=|JWT_SECRET=$(openssl rand -base64 32)|g" ".env" +sed -i "s|DEFAULT_DOMAIN=.*|DEFAULT_DOMAIN=$DEFAULT_HOST|g" ".env" +$STD npm install +$STD npm run migrate +msg_ok "Configured Kutt" + +msg_info "Creating Services" +cat </etc/systemd/system/kutt.service +[Unit] +Description=Kutt server +After=network-online.target + +[Service] +Type=simple +WorkingDirectory=/opt/kutt +ExecStart=/usr/bin/npm start +Restart=always + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now kutt +msg_ok "Created Services" + +motd_ssh +customize +cleanup_lxc