mirror of https://github.com/tteck/Proxmox.git
Compare commits
No commits in common. "33cc2d9c992133edd402a128031e0b2774338fd5" and "92596e895583b475d1724ee5550bd01e6bc92693" have entirely different histories.
33cc2d9c99
...
92596e8955
|
@ -2,15 +2,6 @@
|
||||||
# Change Log
|
# Change Log
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
## 2023-03-22
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- **The latest iteration of the scripts**
|
|
||||||
- Going forward, versioning will no longer be utilized in order to avoid breaking web-links in blogs and YouTube videos.
|
|
||||||
- The scripts have been made more legible as the repetitive code has been moved to function files, making it simpler to share among the scripts and hopefully easier to maintain. This also makes it simpler to contribute to the project.
|
|
||||||
- When a container is created with privileged mode enabled, the USB passthrough feature is automatically activated.
|
|
||||||
|
|
||||||
## 2023-03-18
|
## 2023-03-18
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
|
@ -0,0 +1,444 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
___ __ __
|
||||||
|
/ | ____/ /___ ___v5______ __________/ /
|
||||||
|
/ /| |/ __ / __ / / / / __ / ___/ __ /
|
||||||
|
/ ___ / /_/ / /_/ / /_/ / /_/ / / / /_/ /
|
||||||
|
/_/ |_\__,_/\__, /\__,_/\__,_/_/ \__,_/
|
||||||
|
/____/
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="Adguard"
|
||||||
|
var_disk="2"
|
||||||
|
var_cpu="1"
|
||||||
|
var_ram="512"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Stopping AdguardHome"
|
||||||
|
systemctl stop AdGuardHome
|
||||||
|
msg_ok "Stopped AdguardHome"
|
||||||
|
|
||||||
|
msg_info "Updating AdguardHome"
|
||||||
|
wget -qL https://static.adguard.com/adguardhome/release/AdGuardHome_linux_amd64.tar.gz
|
||||||
|
tar -xvf AdGuardHome_linux_amd64.tar.gz &>/dev/null
|
||||||
|
mkdir -p adguard-backup
|
||||||
|
cp -r /opt/AdGuardHome/AdGuardHome.yaml /opt/AdGuardHome/data adguard-backup/
|
||||||
|
cp AdGuardHome/AdGuardHome /opt/AdGuardHome/AdGuardHome
|
||||||
|
cp -r adguard-backup/* /opt/AdGuardHome/
|
||||||
|
msg_ok "Updated AdguardHome"
|
||||||
|
|
||||||
|
msg_info "Starting AdguardHome"
|
||||||
|
systemctl start AdGuardHome
|
||||||
|
msg_ok "Started AdguardHome"
|
||||||
|
|
||||||
|
msg_info "Cleaning Up"
|
||||||
|
rm -rf AdGuardHome_linux_amd64.tar.gz AdGuardHome adguard-backup
|
||||||
|
msg_ok "Cleaned"
|
||||||
|
msg_ok "Update Successfull"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1 && [[ ! -d /opt/AdGuardHome ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} Setup should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP}:3000${CL} \n"
|
|
@ -1,87 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
___ __ __
|
|
||||||
/ | ____/ /___ ___ ______ __________/ /
|
|
||||||
/ /| |/ __ / __ / / / / __ / ___/ __ /
|
|
||||||
/ ___ / /_/ / /_/ / /_/ / /_/ / / / /_/ /
|
|
||||||
/_/ |_\__,_/\__, /\__,_/\__,_/_/ \__,_/
|
|
||||||
/____/
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="Adguard"
|
|
||||||
var_disk="2"
|
|
||||||
var_cpu="1"
|
|
||||||
var_ram="512"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -d /opt/AdGuardHome ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Stopping AdguardHome"
|
|
||||||
systemctl stop AdGuardHome
|
|
||||||
msg_ok "Stopped AdguardHome"
|
|
||||||
|
|
||||||
msg_info "Updating AdguardHome"
|
|
||||||
wget -qL https://static.adguard.com/adguardhome/release/AdGuardHome_linux_amd64.tar.gz
|
|
||||||
tar -xvf AdGuardHome_linux_amd64.tar.gz &>/dev/null
|
|
||||||
mkdir -p adguard-backup
|
|
||||||
cp -r /opt/AdGuardHome/AdGuardHome.yaml /opt/AdGuardHome/data adguard-backup/
|
|
||||||
cp AdGuardHome/AdGuardHome /opt/AdGuardHome/AdGuardHome
|
|
||||||
cp -r adguard-backup/* /opt/AdGuardHome/
|
|
||||||
msg_ok "Updated AdguardHome"
|
|
||||||
|
|
||||||
msg_info "Starting AdguardHome"
|
|
||||||
systemctl start AdGuardHome
|
|
||||||
msg_ok "Started AdguardHome"
|
|
||||||
|
|
||||||
msg_info "Cleaning Up"
|
|
||||||
rm -rf AdGuardHome_linux_amd64.tar.gz AdGuardHome adguard-backup
|
|
||||||
msg_ok "Cleaned"
|
|
||||||
msg_ok "Update Successfull"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} Setup should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP}:3000${CL} \n"
|
|
|
@ -0,0 +1,486 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
___ __ __
|
||||||
|
/ | ____/ /___ ___v5______ __________/ /
|
||||||
|
/ /| |/ __ / __ / / / / __ / ___/ __ /
|
||||||
|
/ ___ / /_/ / /_/ / /_/ / /_/ / / / /_/ /
|
||||||
|
/_/ |_\__,_/\__, /\__,_/\__,_/_/ \__,_/
|
||||||
|
/____/ Alpine
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="Alpine-AdGuard"
|
||||||
|
var_disk="0.3"
|
||||||
|
var_cpu="1"
|
||||||
|
var_ram="256"
|
||||||
|
var_os="alpine"
|
||||||
|
var_version="3.17"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}alpine${CL}"
|
||||||
|
PW="-password alpine"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
normal=$(echo "\033[m")
|
||||||
|
menu=$(echo "\033[36m")
|
||||||
|
number=$(echo "\033[33m")
|
||||||
|
fgred=$(echo "\033[31m")
|
||||||
|
printf "\n${menu}*********************************************${normal}\n"
|
||||||
|
printf "${menu}**${number} 1)${normal} Update LXC OS \n"
|
||||||
|
printf "${menu}**${number} 2)${normal} Update AdGuardHome\n"
|
||||||
|
printf "${menu}*********************************************${normal}\n"
|
||||||
|
printf "Please choose an option from the menu, or ${fgred}x${normal} to exit."
|
||||||
|
read opt
|
||||||
|
|
||||||
|
while [ "$opt" != "" ]; do
|
||||||
|
case $opt in
|
||||||
|
1)
|
||||||
|
clear
|
||||||
|
echo -e "${fgred}Update LXC OS${normal}"
|
||||||
|
msg_info "Updating LXC OS"
|
||||||
|
apk update &>/dev/null
|
||||||
|
apk upgrade &>/dev/null
|
||||||
|
msg_ok "Update Successfull"
|
||||||
|
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
2)
|
||||||
|
clear
|
||||||
|
echo -e "${fgred}Update AdGuardHome${normal}"
|
||||||
|
msg_info "Stopping AdguardHome"
|
||||||
|
/opt/AdGuardHome/AdGuardHome -s stop &>/dev/null
|
||||||
|
msg_ok "Stopped AdguardHome"
|
||||||
|
|
||||||
|
VER=$(curl -sqI https://github.com/AdguardTeam/AdGuardHome/releases/latest | awk -F '/' '/^location/ {print substr($NF, 1, length($NF)-1)}');
|
||||||
|
msg_info "Updating AdguardHome to $VER"
|
||||||
|
wget -q "https://github.com/AdguardTeam/AdGuardHome/releases/download/$VER/AdGuardHome_linux_amd64.tar.gz"
|
||||||
|
tar -xvf AdGuardHome_linux_amd64.tar.gz &>/dev/null
|
||||||
|
mkdir -p adguard-backup
|
||||||
|
cp -rf /opt/AdGuardHome/AdGuardHome.yaml /opt/AdGuardHome/data adguard-backup/
|
||||||
|
cp AdGuardHome/AdGuardHome /opt/AdGuardHome/AdGuardHome
|
||||||
|
cp -r adguard-backup/* /opt/AdGuardHome/
|
||||||
|
msg_ok "Updated AdguardHome"
|
||||||
|
|
||||||
|
msg_info "Starting AdguardHome"
|
||||||
|
/opt/AdGuardHome/AdGuardHome -s start &>/dev/null
|
||||||
|
msg_ok "Started AdguardHome"
|
||||||
|
|
||||||
|
msg_info "Cleaning Up"
|
||||||
|
rm -rf AdGuardHome_linux_amd64.tar.gz AdGuardHome adguard-backup
|
||||||
|
msg_ok "Cleaned"
|
||||||
|
msg_ok "Update Successfull"
|
||||||
|
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
x)
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
\n)
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
clear
|
||||||
|
echo -e "Please choose an option from the menu"
|
||||||
|
update_script
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if [[ ! -d /opt/AdGuardHome ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
else
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- ash -c "$(wget -qO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP}:3000${CL} \n"
|
|
@ -1,87 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/alpine.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
___ __ __
|
|
||||||
/ | ____/ /___ ___ ______ __________/ /
|
|
||||||
/ /| |/ __ / __ / / / / __ / ___/ __ /
|
|
||||||
/ ___ / /_/ / /_/ / /_/ / /_/ / / / /_/ /
|
|
||||||
/_/ |_\__,_/\__, /\__,_/\__,_/_/ \__,_/
|
|
||||||
/____/ Alpine
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="Alpine-AdGuard"
|
|
||||||
var_disk="0.3"
|
|
||||||
var_cpu="1"
|
|
||||||
var_ram="256"
|
|
||||||
var_os="alpine"
|
|
||||||
var_version="3.17"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW="-password alpine"
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
while true; do
|
|
||||||
CHOICE=$(
|
|
||||||
whiptail --title "SUPPORT" --menu "Select option" 11 58 2 \
|
|
||||||
"1" "Update LXC OS" \
|
|
||||||
"2" "Manually Update AdGuardHome" 3>&2 2>&1 1>&3
|
|
||||||
)
|
|
||||||
exit_status=$?
|
|
||||||
if [ $exit_status == 1 ]; then
|
|
||||||
clear
|
|
||||||
exit-script
|
|
||||||
fi
|
|
||||||
header_info
|
|
||||||
case $CHOICE in
|
|
||||||
1)
|
|
||||||
apk update && apk upgrade
|
|
||||||
exit
|
|
||||||
;;
|
|
||||||
2)
|
|
||||||
header_info
|
|
||||||
echo "In the process of creating a method to update"
|
|
||||||
exit
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP}:3000${CL} \n"
|
|
|
@ -0,0 +1,465 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
____ __
|
||||||
|
/ __ \____ _____/ /_v5__ _____
|
||||||
|
/ / / / __ \/ ___/ //_/ _ \/ ___/
|
||||||
|
/ /_/ / /_/ / /__/ ,< / __/ /
|
||||||
|
/_____/\____/\___/_/|_|\___/_/
|
||||||
|
Alpine
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="Alpine-Docker"
|
||||||
|
var_disk="2"
|
||||||
|
var_cpu="1"
|
||||||
|
var_ram="1024"
|
||||||
|
var_os="alpine"
|
||||||
|
var_version="3.17"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}alpine${CL}"
|
||||||
|
PW="-password alpine"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" On \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
normal=$(echo "\033[m")
|
||||||
|
menu=$(echo "\033[36m")
|
||||||
|
number=$(echo "\033[33m")
|
||||||
|
fgred=$(echo "\033[31m")
|
||||||
|
printf "\n${menu}*********************************************${normal}\n"
|
||||||
|
printf "${menu}**${number} 1)${normal} Update ${APP} \n"
|
||||||
|
printf "\n${menu}*********************************************${normal}\n"
|
||||||
|
printf "Please choose an option from the menu, or ${fgred}x${normal} to exit."
|
||||||
|
read opt
|
||||||
|
|
||||||
|
while [ "$opt" != "" ]; do
|
||||||
|
case $opt in
|
||||||
|
1)
|
||||||
|
clear
|
||||||
|
echo -e "${fgred}Update ${APP}${normal}"
|
||||||
|
apk update &>/dev/null
|
||||||
|
apk upgrade &>/dev/null
|
||||||
|
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
x)
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
\n)
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
clear
|
||||||
|
echo -e "Please choose an option from the menu"
|
||||||
|
update_script
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if [[ ! -d /etc/docker ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
else
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
LXC_CONFIG=/etc/pve/lxc/${CTID}.conf
|
||||||
|
cat <<EOF >>$LXC_CONFIG
|
||||||
|
lxc.cgroup2.devices.allow: a
|
||||||
|
lxc.cap.drop:
|
||||||
|
EOF
|
||||||
|
if [ "$CT_TYPE" == "0" ]; then
|
||||||
|
LXC_CONFIG=/etc/pve/lxc/${CTID}.conf
|
||||||
|
cat <<EOF >>$LXC_CONFIG
|
||||||
|
lxc.cgroup2.devices.allow: a
|
||||||
|
lxc.cap.drop:
|
||||||
|
lxc.cgroup2.devices.allow: c 188:* rwm
|
||||||
|
lxc.cgroup2.devices.allow: c 189:* rwm
|
||||||
|
lxc.mount.entry: /dev/serial/by-id dev/serial/by-id none bind,optional,create=dir
|
||||||
|
lxc.mount.entry: /dev/ttyUSB0 dev/ttyUSB0 none bind,optional,create=file
|
||||||
|
lxc.mount.entry: /dev/ttyUSB1 dev/ttyUSB1 none bind,optional,create=file
|
||||||
|
lxc.mount.entry: /dev/ttyACM0 dev/ttyACM0 none bind,optional,create=file
|
||||||
|
lxc.mount.entry: /dev/ttyACM1 dev/ttyACM1 none bind,optional,create=file
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- ash -c "$(wget -qO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
|
@ -1,77 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/alpine.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
____ __
|
|
||||||
/ __ \____ _____/ /_ __ _____
|
|
||||||
/ / / / __ \/ ___/ //_/ _ \/ ___/
|
|
||||||
/ /_/ / /_/ / /__/ ,< / __/ /
|
|
||||||
/_____/\____/\___/_/|_|\___/_/
|
|
||||||
Alpine
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="Alpine-Docker"
|
|
||||||
var_disk="2"
|
|
||||||
var_cpu="1"
|
|
||||||
var_ram="1024"
|
|
||||||
var_os="alpine"
|
|
||||||
var_version="3.17"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW="-password alpine"
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
while true; do
|
|
||||||
CHOICE=$(
|
|
||||||
whiptail --title "SUPPORT" --menu "Select option" 11 58 1 \
|
|
||||||
"1" "Check for Docker Updates" 3>&2 2>&1 1>&3
|
|
||||||
)
|
|
||||||
exit_status=$?
|
|
||||||
if [ $exit_status == 1 ]; then
|
|
||||||
clear
|
|
||||||
exit-script
|
|
||||||
fi
|
|
||||||
header_info
|
|
||||||
case $CHOICE in
|
|
||||||
1)
|
|
||||||
apk update && apk upgrade
|
|
||||||
exit
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
|
@ -0,0 +1,482 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
______ ____
|
||||||
|
/ ____/________ _/ __/___ _____v5____ _
|
||||||
|
/ / __/ ___/ __ / /_/ __ / __ \/ __ /
|
||||||
|
/ /_/ / / / /_/ / __/ /_/ / / / / /_/ /
|
||||||
|
\____/_/ \__,_/_/ \__,_/_/ /_/\__,_/
|
||||||
|
Alpine
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="Alpine-Grafana"
|
||||||
|
var_disk="0.5"
|
||||||
|
var_cpu="1"
|
||||||
|
var_ram="256"
|
||||||
|
var_os="alpine"
|
||||||
|
var_version="3.17"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}alpine${CL}"
|
||||||
|
PW="-password alpine"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
normal=$(echo "\033[m")
|
||||||
|
menu=$(echo "\033[36m")
|
||||||
|
number=$(echo "\033[33m")
|
||||||
|
fgred=$(echo "\033[31m")
|
||||||
|
LXCIP=$(ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
printf "\n${menu}*********************************************${normal}\n"
|
||||||
|
printf "${menu}**${number} 1)${normal} Update LXC OS + Grafana \n"
|
||||||
|
printf "${menu}**${number} 2)${normal} Allow 0.0.0.0 for listening \n"
|
||||||
|
printf "${menu}**${number} 3)${normal} Allow only ${LXCIP} for listening \n"
|
||||||
|
printf "${menu}*********************************************${normal}\n"
|
||||||
|
printf "Please choose an option from the menu, or ${fgred}x${normal} to exit."
|
||||||
|
read opt
|
||||||
|
|
||||||
|
while [ "$opt" != "" ]; do
|
||||||
|
case $opt in
|
||||||
|
1)
|
||||||
|
clear
|
||||||
|
echo -e "${fgred}Update LXC OS${normal}"
|
||||||
|
msg_info "Updating LXC OS + Grafana"
|
||||||
|
apk update &>/dev/null
|
||||||
|
apk upgrade &>/dev/null
|
||||||
|
msg_ok "Update Successfull"
|
||||||
|
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
2)
|
||||||
|
clear
|
||||||
|
echo -e "${fgred}Updating Grafana Config with IP: ${LXCIP}${normal}"
|
||||||
|
msg_info "Stopping Grafana"
|
||||||
|
service grafana stop &>/dev/null
|
||||||
|
sed -i -e "s/cfg:server.http_addr=.*/cfg:server.http_addr=0.0.0.0/g" /etc/conf.d/grafana
|
||||||
|
msg_ok "Restarted Grafana"
|
||||||
|
service grafana start &>/dev/null
|
||||||
|
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
3)
|
||||||
|
clear
|
||||||
|
echo -e "${fgred}Updating Grafana Config with host IP: ${LXCIP}${normal}"
|
||||||
|
msg_info "Stopping Grafana"
|
||||||
|
service grafana stop &>/dev/null
|
||||||
|
sed -i -e "s/cfg:server.http_addr=.*/cfg:server.http_addr=$LXCIP/g" /etc/conf.d/grafana
|
||||||
|
msg_ok "Restarted Grafana"
|
||||||
|
service grafana start &>/dev/null
|
||||||
|
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
x)
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
\n)
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
clear
|
||||||
|
echo -e "Please choose an option from the menu"
|
||||||
|
update_script
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if [[ ! -f /etc/conf.d/grafana ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
else
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- ash -c "$(wget -qO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP}:3000${CL} \n"
|
|
@ -1,94 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/alpine.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
______ ____
|
|
||||||
/ ____/________ _/ __/___ _____ ____ _
|
|
||||||
/ / __/ ___/ __ / /_/ __ / __ \/ __ /
|
|
||||||
/ /_/ / / / /_/ / __/ /_/ / / / / /_/ /
|
|
||||||
\____/_/ \__,_/_/ \__,_/_/ /_/\__,_/
|
|
||||||
Alpine
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="Alpine-Grafana"
|
|
||||||
var_disk="0.5"
|
|
||||||
var_cpu="1"
|
|
||||||
var_ram="256"
|
|
||||||
var_os="alpine"
|
|
||||||
var_version="3.17"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW="-password alpine"
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
LXCIP=$(ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
|
||||||
while true; do
|
|
||||||
CHOICE=$(
|
|
||||||
whiptail --title "SUPPORT" --menu "Select option" --cancel-button Exit-Script 11 58 3 \
|
|
||||||
"1" "Check for Grafana Updates" \
|
|
||||||
"2" "Allow 0.0.0.0 for listening" \
|
|
||||||
"3" "Allow only ${LXCIP} for listening" 3>&2 2>&1 1>&3
|
|
||||||
)
|
|
||||||
exit_status=$?
|
|
||||||
if [ $exit_status == 1 ]; then
|
|
||||||
clear
|
|
||||||
exit-script
|
|
||||||
fi
|
|
||||||
header_info
|
|
||||||
case $CHOICE in
|
|
||||||
1)
|
|
||||||
apk update && apk upgrade
|
|
||||||
exit
|
|
||||||
;;
|
|
||||||
2)
|
|
||||||
sed -i -e "s/cfg:server.http_addr=.*/cfg:server.http_addr=0.0.0.0/g" /etc/conf.d/grafana
|
|
||||||
service grafana restart
|
|
||||||
exit
|
|
||||||
;;
|
|
||||||
3)
|
|
||||||
sed -i -e "s/cfg:server.http_addr=.*/cfg:server.http_addr=$LXCIP/g" /etc/conf.d/grafana
|
|
||||||
service grafana restart
|
|
||||||
exit
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP}:3000${CL} \n"
|
|
|
@ -0,0 +1,419 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
___ v5 __ _
|
||||||
|
/ | / /___ (_)___ ___
|
||||||
|
/ /| | / / __ \/ / __ \/ _ \
|
||||||
|
/ ___ |/ / /_/ / / / / / __/
|
||||||
|
/_/ |_/_/ .___/_/_/ /_/\___/
|
||||||
|
/_/
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="Alpine"
|
||||||
|
var_disk="0.1"
|
||||||
|
var_cpu="1"
|
||||||
|
var_ram="512"
|
||||||
|
var_os="alpine"
|
||||||
|
var_version="3.17"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}alpine${CL}"
|
||||||
|
PW="-password alpine"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Updating ${APP} LXC"
|
||||||
|
apk update &>/dev/null
|
||||||
|
apk upgrade &>/dev/null
|
||||||
|
msg_ok "Update Successfull"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} ${var_version} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
|
@ -0,0 +1,456 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
_ __ ____ __
|
||||||
|
| | / /___ ___ __/ / /__ ______ __________/ /__v5____
|
||||||
|
| | / / __ `/ / / / / __/ | /| / / __ `/ ___/ __ / _ \/ __ \
|
||||||
|
| |/ / /_/ / /_/ / / /_ | |/ |/ / /_/ / / / /_/ / __/ / / /
|
||||||
|
|___/\__,_/\__,_/_/\__/ |__/|__/\__,_/_/ \__,_/\___/_/ /_/
|
||||||
|
Alpine
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="Alpine-Vaultwarden"
|
||||||
|
var_disk="0.3"
|
||||||
|
var_cpu="1"
|
||||||
|
var_ram="256"
|
||||||
|
var_os="alpine"
|
||||||
|
var_version="3.17"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}alpine${CL}"
|
||||||
|
PW="-password alpine"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
normal=$(echo "\033[m")
|
||||||
|
menu=$(echo "\033[36m")
|
||||||
|
number=$(echo "\033[33m")
|
||||||
|
fgred=$(echo "\033[31m")
|
||||||
|
printf "\n${menu}*********************************************${normal}\n"
|
||||||
|
printf "${menu}**${number} 1)${normal} Update Vaultwarden \n"
|
||||||
|
printf "${menu}**${number} 2)${normal} View Admin Token\n"
|
||||||
|
printf "\n${menu}*********************************************${normal}\n"
|
||||||
|
printf "Please choose an option from the menu, or ${fgred}x${normal} to exit."
|
||||||
|
read opt
|
||||||
|
|
||||||
|
while [ "$opt" != "" ]; do
|
||||||
|
case $opt in
|
||||||
|
1)
|
||||||
|
clear
|
||||||
|
echo -e "${fgred}Update Vaultwarden${normal}"
|
||||||
|
apk update &>/dev/null
|
||||||
|
apk upgrade &>/dev/null
|
||||||
|
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
2)
|
||||||
|
clear
|
||||||
|
echo -e "${fgred}View the Admin Token${normal}"
|
||||||
|
cat /etc/conf.d/vaultwarden | grep "ADMIN_TOKEN" | awk '{print substr($2, 7) }'
|
||||||
|
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
x)
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
\n)
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
clear
|
||||||
|
echo -e "Please choose an option from the menu"
|
||||||
|
update_script
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if [[ ! -f /etc/conf.d/vaultwarden ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
else
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- ash -c "$(wget -qO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP}:8000${CL} \n"
|
|
@ -1,87 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/alpine.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
_ __ ____ __
|
|
||||||
| | / /___ ___ __/ / /__ ______ __________/ /__ ____
|
|
||||||
| | / / __ `/ / / / / __/ | /| / / __ `/ ___/ __ / _ \/ __ \
|
|
||||||
| |/ / /_/ / /_/ / / /_ | |/ |/ / /_/ / / / /_/ / __/ / / /
|
|
||||||
|___/\__,_/\__,_/_/\__/ |__/|__/\__,_/_/ \__,_/\___/_/ /_/
|
|
||||||
Alpine
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="Alpine-Vaultwarden"
|
|
||||||
var_disk="0.3"
|
|
||||||
var_cpu="1"
|
|
||||||
var_ram="256"
|
|
||||||
var_os="alpine"
|
|
||||||
var_version="3.17"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW="-password alpine"
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
while true; do
|
|
||||||
CHOICE=$(
|
|
||||||
whiptail --title "SUPPORT" --menu "Select option" 11 58 2 \
|
|
||||||
"1" "Update VaultWarden" \
|
|
||||||
"2" "Show Admin Token" 3>&2 2>&1 1>&3
|
|
||||||
)
|
|
||||||
exit_status=$?
|
|
||||||
if [ $exit_status == 1 ]; then
|
|
||||||
clear
|
|
||||||
exit-script
|
|
||||||
fi
|
|
||||||
header_info
|
|
||||||
case $CHOICE in
|
|
||||||
1)
|
|
||||||
apk update && apk upgrade
|
|
||||||
exit
|
|
||||||
;;
|
|
||||||
2)
|
|
||||||
whiptail --title "ADMIN TOKEN" --msgbox "$(cat /etc/conf.d/vaultwarden | grep ADMIN_TOKEN | awk '{print substr($2, 13) }')" 7 68
|
|
||||||
clear
|
|
||||||
exit
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP}:8000${CL} \n"
|
|
|
@ -0,0 +1,460 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
_____ _ __ ___ __ _______ ____________
|
||||||
|
/__ / (_)___ _/ /_ ___v5___ |__ \ / |/ / __ \/_ __/_ __/
|
||||||
|
/ / / / __ / __ \/ _ \/ _ \__/ // /|_/ / / / / / / / /
|
||||||
|
/ /__/ / /_/ / /_/ / __/ __/ __// / / / /_/ / / / / /
|
||||||
|
/____/_/\__, /_.___/\___/\___/____/_/ /_/\___\_\/_/ /_/
|
||||||
|
/____/ Alpine
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="Alpine-Zigbee2MQTT"
|
||||||
|
var_disk="0.3"
|
||||||
|
var_cpu="1"
|
||||||
|
var_ram="256"
|
||||||
|
var_os="alpine"
|
||||||
|
var_version="3.17"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Privileged${CL}"
|
||||||
|
CT_TYPE="0"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}alpine${CL}"
|
||||||
|
PW="-password alpine"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" OFF \
|
||||||
|
"0" "Privileged" ON \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
normal=$(echo "\033[m")
|
||||||
|
menu=$(echo "\033[36m")
|
||||||
|
number=$(echo "\033[33m")
|
||||||
|
fgred=$(echo "\033[31m")
|
||||||
|
printf "\n${menu}*********************************************${normal}\n"
|
||||||
|
printf "${menu}**${number} 1)${normal} Update ${APP} \n"
|
||||||
|
printf "\n${menu}*********************************************${normal}\n"
|
||||||
|
printf "Please choose an option from the menu, or ${fgred}x${normal} to exit."
|
||||||
|
read opt
|
||||||
|
|
||||||
|
while [ "$opt" != "" ]; do
|
||||||
|
case $opt in
|
||||||
|
1)
|
||||||
|
clear
|
||||||
|
echo -e "${fgred}Update ${APP}${normal}"
|
||||||
|
apk update &>/dev/null
|
||||||
|
apk upgrade &>/dev/null
|
||||||
|
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
x)
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
\n)
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
clear
|
||||||
|
echo -e "Please choose an option from the menu"
|
||||||
|
update_script
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if [[ ! -f /etc/zigbee2mqtt/configuration.yaml ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
else
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
if [ "$CT_TYPE" == "0" ]; then
|
||||||
|
LXC_CONFIG=/etc/pve/lxc/${CTID}.conf
|
||||||
|
cat <<EOF >>$LXC_CONFIG
|
||||||
|
lxc.cgroup2.devices.allow: a
|
||||||
|
lxc.cap.drop:
|
||||||
|
lxc.cgroup2.devices.allow: c 188:* rwm
|
||||||
|
lxc.cgroup2.devices.allow: c 189:* rwm
|
||||||
|
lxc.mount.entry: /dev/serial/by-id dev/serial/by-id none bind,optional,create=dir
|
||||||
|
lxc.mount.entry: /dev/ttyUSB0 dev/ttyUSB0 none bind,optional,create=file
|
||||||
|
lxc.mount.entry: /dev/ttyUSB1 dev/ttyUSB1 none bind,optional,create=file
|
||||||
|
lxc.mount.entry: /dev/ttyACM0 dev/ttyACM0 none bind,optional,create=file
|
||||||
|
lxc.mount.entry: /dev/ttyACM1 dev/ttyACM1 none bind,optional,create=file
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- ash -c "$(wget -qO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
|
@ -1,79 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/alpine.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
_____ _ __ ___ __ _______ ____________
|
|
||||||
/__ / (_)___ _/ /_ ___ ___ |__ \ / |/ / __ \/_ __/_ __/
|
|
||||||
/ / / / __ / __ \/ _ \/ _ \__/ // /|_/ / / / / / / / /
|
|
||||||
/ /__/ / /_/ / /_/ / __/ __/ __// / / / /_/ / / / / /
|
|
||||||
/____/_/\__, /_.___/\___/\___/____/_/ /_/\___\_\/_/ /_/
|
|
||||||
/____/ Alpine
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="Alpine-Zigbee2MQTT"
|
|
||||||
var_disk="0.3"
|
|
||||||
var_cpu="1"
|
|
||||||
var_ram="256"
|
|
||||||
var_os="alpine"
|
|
||||||
var_version="3.17"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW="-password alpine"
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
while true; do
|
|
||||||
CHOICE=$(
|
|
||||||
whiptail --title "SUPPORT" --menu "Select option" 11 58 1 \
|
|
||||||
"1" "Check for Zigbee2MQTT Updates" 3>&2 2>&1 1>&3
|
|
||||||
)
|
|
||||||
exit_status=$?
|
|
||||||
if [ $exit_status == 1 ]; then
|
|
||||||
clear
|
|
||||||
exit-script
|
|
||||||
fi
|
|
||||||
header_info
|
|
||||||
case $CHOICE in
|
|
||||||
1)
|
|
||||||
apk update && apk upgrade
|
|
||||||
exit
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
70
ct/alpine.sh
70
ct/alpine.sh
|
@ -1,70 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/alpine.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
___ __ _
|
|
||||||
/ | / /___ (_)___ ___
|
|
||||||
/ /| | / / __ \/ / __ \/ _ \
|
|
||||||
/ ___ |/ / /_/ / / / / / __/
|
|
||||||
/_/ |_/_/ .___/_/_/ /_/\___/
|
|
||||||
/_/
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="Alpine"
|
|
||||||
var_disk="0.1"
|
|
||||||
var_cpu="1"
|
|
||||||
var_ram="512"
|
|
||||||
var_os="alpine"
|
|
||||||
var_version="3.17"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW="-password alpine"
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
UPD=$(whiptail --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 1 \
|
|
||||||
"1" "Check for Alpine Updates" ON \
|
|
||||||
3>&1 1>&2 2>&3)
|
|
||||||
|
|
||||||
header_info
|
|
||||||
if [ "$UPD" == "1" ]; then
|
|
||||||
apk update && apk upgrade
|
|
||||||
exit;
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
|
@ -8,8 +8,9 @@
|
||||||
function header_info {
|
function header_info {
|
||||||
clear
|
clear
|
||||||
cat <<"EOF"
|
cat <<"EOF"
|
||||||
|
|
||||||
___ __ __ _
|
___ __ __ _
|
||||||
/ | __________/ /_ / / (_)___ __ ___ __
|
/ | __________/ /_ v5 / / (_)___ __ ___ __
|
||||||
/ /| | / ___/ ___/ __ \ / / / / __ \/ / / / |/_/
|
/ /| | / ___/ ___/ __ \ / / / / __ \/ / / / |/_/
|
||||||
/ ___ |/ / / /__/ / / / / /___/ / / / / /_/ /> <
|
/ ___ |/ / / /__/ / / / / /___/ / / / / /_/ /> <
|
||||||
/_/ |_/_/ \___/_/ /_/ /_____/_/_/ /_/\__,_/_/|_|
|
/_/ |_/_/ \___/_/ /_/ /_____/_/_/ /_/\__,_/_/|_|
|
|
@ -0,0 +1,421 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
___ __ __ __ ______
|
||||||
|
____ ___ ______/ (_)___v5/ /_ ____ ____ / /_______/ /_ ___ / / __/
|
||||||
|
/ __ `/ / / / __ / / __ \/ __ \/ __ \/ __ \/ //_/ ___/ __ \/ _ \/ / /_
|
||||||
|
/ /_/ / /_/ / /_/ / / /_/ / /_/ / /_/ / /_/ / ,< (__ ) / / / __/ / __/
|
||||||
|
\__,_/\__,_/\__,_/_/\____/_.___/\____/\____/_/|_/____/_/ /_/\___/_/_/
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="audiobookshelf"
|
||||||
|
var_disk="4"
|
||||||
|
var_cpu="2"
|
||||||
|
var_ram="2048"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Privileged${CL}"
|
||||||
|
CT_TYPE="0"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" OFF \
|
||||||
|
"0" "Privileged" ON \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Updating $APP LXC"
|
||||||
|
apt-get update &>/dev/null
|
||||||
|
apt-get -y upgrade &>/dev/null
|
||||||
|
msg_ok "Updated $APP LXC"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP}:13378${CL} \n"
|
|
@ -1,69 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
___ __ __ __ ______
|
|
||||||
____ ___ ______/ (_)___ / /_ ____ ____ / /_______/ /_ ___ / / __/
|
|
||||||
/ __ `/ / / / __ / / __ \/ __ \/ __ \/ __ \/ //_/ ___/ __ \/ _ \/ / /_
|
|
||||||
/ /_/ / /_/ / /_/ / / /_/ / /_/ / /_/ / /_/ / ,< (__ ) / / / __/ / __/
|
|
||||||
\__,_/\__,_/\__,_/_/\____/_.___/\____/\____/_/|_/____/_/ /_/\___/_/_/
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="audiobookshelf"
|
|
||||||
var_disk="4"
|
|
||||||
var_cpu="2"
|
|
||||||
var_ram="2048"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -d /var ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Updating $APP LXC"
|
|
||||||
apt-get update &>/dev/null
|
|
||||||
apt-get -y upgrade &>/dev/null
|
|
||||||
msg_ok "Updated $APP LXC"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP}:13378${CL} \n"
|
|
|
@ -0,0 +1,437 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
___ __ __
|
||||||
|
/ | __ __/ /_____ / /_v5__________
|
||||||
|
/ /| |/ / / / __/ __ \/ __ \/ ___/ ___/
|
||||||
|
/ ___ / /_/ / /_/ /_/ / /_/ / / / /
|
||||||
|
/_/ |_\__,_/\__/\____/_.___/_/ /_/
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="Autobrr"
|
||||||
|
var_disk="8"
|
||||||
|
var_cpu="2"
|
||||||
|
var_ram="2048"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Stopping ${APP} LXC"
|
||||||
|
systemctl stop autobrr.service
|
||||||
|
msg_ok "Stopped ${APP} LXC"
|
||||||
|
|
||||||
|
msg_info "Updating ${APP} LXC"
|
||||||
|
rm -rf /usr/local/bin/*
|
||||||
|
wget -q $(curl -s https://api.github.com/repos/autobrr/autobrr/releases/latest | grep download | grep linux_x86_64 | cut -d\" -f4)
|
||||||
|
tar -C /usr/local/bin -xzf autobrr*.tar.gz
|
||||||
|
rm -rf autobrr*.tar.gz
|
||||||
|
msg_ok "Updated ${APP} LXC"
|
||||||
|
|
||||||
|
msg_info "Starting ${APP} LXC"
|
||||||
|
systemctl start autobrr.service
|
||||||
|
msg_ok "Started ${APP} LXC"
|
||||||
|
msg_ok "Update Successfull"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1 && [[ ! -f /root/.config/autobrr/config.toml ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP}:7474${CL} \n"
|
|
@ -1,80 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
___ __ __
|
|
||||||
/ | __ __/ /_____ / /_ __________
|
|
||||||
/ /| |/ / / / __/ __ \/ __ \/ ___/ ___/
|
|
||||||
/ ___ / /_/ / /_/ /_/ / /_/ / / / /
|
|
||||||
/_/ |_\__,_/\__/\____/_.___/_/ /_/
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="Autobrr"
|
|
||||||
var_disk="8"
|
|
||||||
var_cpu="2"
|
|
||||||
var_ram="2048"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -f /root/.config/autobrr/config.toml ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Stopping ${APP} LXC"
|
|
||||||
systemctl stop autobrr.service
|
|
||||||
msg_ok "Stopped ${APP} LXC"
|
|
||||||
|
|
||||||
msg_info "Updating ${APP} LXC"
|
|
||||||
rm -rf /usr/local/bin/*
|
|
||||||
wget -q $(curl -s https://api.github.com/repos/autobrr/autobrr/releases/latest | grep download | grep linux_x86_64 | cut -d\" -f4)
|
|
||||||
tar -C /usr/local/bin -xzf autobrr*.tar.gz
|
|
||||||
rm -rf autobrr*.tar.gz
|
|
||||||
msg_ok "Updated ${APP} LXC"
|
|
||||||
|
|
||||||
msg_info "Starting ${APP} LXC"
|
|
||||||
systemctl start autobrr.service
|
|
||||||
msg_ok "Started ${APP} LXC"
|
|
||||||
msg_ok "Update Successfull"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP}:7474${CL} \n"
|
|
|
@ -0,0 +1,425 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
____ __ __
|
||||||
|
/ __ )/ /___v5_____/ /____ __
|
||||||
|
/ __ / / __ \/ ___/ //_/ / / /
|
||||||
|
/ /_/ / / /_/ / /__/ ,< / /_/ /
|
||||||
|
/_____/_/\____/\___/_/|_|\__, /
|
||||||
|
/____/
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="Blocky"
|
||||||
|
var_disk="2"
|
||||||
|
var_cpu="1"
|
||||||
|
var_ram="512"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Updating ${APP} LXC"
|
||||||
|
apt-get update &>/dev/null
|
||||||
|
apt-get -y upgrade &>/dev/null
|
||||||
|
msg_ok "Updated ${APP} LXC"
|
||||||
|
msg_ok "Update Successfull"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1 && [[ ! -d /opt/blocky ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
67
ct/blocky.sh
67
ct/blocky.sh
|
@ -1,67 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
____ __ __
|
|
||||||
/ __ )/ /___ _____/ /____ __
|
|
||||||
/ __ / / __ \/ ___/ //_/ / / /
|
|
||||||
/ /_/ / / /_/ / /__/ ,< / /_/ /
|
|
||||||
/_____/_/\____/\___/_/|_|\__, /
|
|
||||||
/____/
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="Blocky"
|
|
||||||
var_disk="2"
|
|
||||||
var_cpu="1"
|
|
||||||
var_ram="512"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -d /var ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Updating $APP LXC"
|
|
||||||
apt-get update &>/dev/null
|
|
||||||
apt-get -y upgrade &>/dev/null
|
|
||||||
msg_ok "Updated $APP LXC"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
|
@ -0,0 +1,453 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
______ ____ _____
|
||||||
|
/ ____/___ __v5______ _/ __ \/ ___/
|
||||||
|
/ / / __ `/ ___/ __ `/ / / /\__ \
|
||||||
|
/ /___/ /_/ (__ ) /_/ / /_/ /___/ /
|
||||||
|
\____/\__,_/____/\__,_/\____//____/
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="CasaOS"
|
||||||
|
var_disk="8"
|
||||||
|
var_cpu="2"
|
||||||
|
var_ram="2048"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Fuse Overlayfs (ZFS): ${BGN}No${CL}"
|
||||||
|
FUSE="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "FUSE OVERLAYFS" --yesno "(ZFS) Enable Fuse Overlayfs?" 10 58); then
|
||||||
|
FUSE="yes"
|
||||||
|
else
|
||||||
|
FUSE="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Fuse Overlayfs (ZFS): ${BGN}$FUSE${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Updating ${APP} LXC"
|
||||||
|
apt-get update &>/dev/null
|
||||||
|
apt-get -y upgrade &>/dev/null
|
||||||
|
msg_ok "Updated ${APP} LXC"
|
||||||
|
msg_ok "Update Successfull"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1 && [[ ! -d /etc/docker ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$FUSE" == "yes" ]; then
|
||||||
|
FEATURES="fuse=1,keyctl=1,nesting=1"
|
||||||
|
else
|
||||||
|
FEATURES="keyctl=1,nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export ST=$FUSE
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
LXC_CONFIG=/etc/pve/lxc/${CTID}.conf
|
||||||
|
cat <<EOF >>$LXC_CONFIG
|
||||||
|
lxc.cgroup2.devices.allow: a
|
||||||
|
lxc.cap.drop:
|
||||||
|
EOF
|
||||||
|
if [ "$CT_TYPE" == "0" ]; then
|
||||||
|
cat <<EOF >>$LXC_CONFIG
|
||||||
|
lxc.cgroup2.devices.allow: c 188:* rwm
|
||||||
|
lxc.cgroup2.devices.allow: c 189:* rwm
|
||||||
|
lxc.mount.entry: /dev/serial/by-id dev/serial/by-id none bind,optional,create=dir
|
||||||
|
lxc.mount.entry: /dev/ttyUSB0 dev/ttyUSB0 none bind,optional,create=file
|
||||||
|
lxc.mount.entry: /dev/ttyUSB1 dev/ttyUSB1 none bind,optional,create=file
|
||||||
|
lxc.mount.entry: /dev/ttyACM0 dev/ttyACM0 none bind,optional,create=file
|
||||||
|
lxc.mount.entry: /dev/ttyACM1 dev/ttyACM1 none bind,optional,create=file
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} Setup should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP} ${CL} \n"
|
70
ct/casaos.sh
70
ct/casaos.sh
|
@ -1,70 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/docker.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
______ ____ _____
|
|
||||||
/ ____/___ __________ _/ __ \/ ___/
|
|
||||||
/ / / __ `/ ___/ __ `/ / / /\__ \
|
|
||||||
/ /___/ /_/ (__ ) /_/ / /_/ /___/ /
|
|
||||||
\____/\__,_/____/\__,_/\____//____/
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="CasaOS"
|
|
||||||
var_disk="8"
|
|
||||||
var_cpu="2"
|
|
||||||
var_ram="2048"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
FUSE="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -d /var ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Updating ${APP} LXC"
|
|
||||||
apt-get update &>/dev/null
|
|
||||||
apt-get -y upgrade &>/dev/null
|
|
||||||
msg_ok "Updated ${APP} LXC"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} Setup should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP} ${CL} \n"
|
|
|
@ -0,0 +1,426 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
________ ____ __ __ _
|
||||||
|
/ ____/ /_v5____ _____ ____ ____ / __ \___ / /____ _____/ /_(_)___ ____
|
||||||
|
/ / / __ \/ __ `/ __ \/ __ `/ _ \ / / / / _ \/ __/ _ \/ ___/ __/ / __ \/ __ \
|
||||||
|
/ /___/ / / / /_/ / / / / /_/ / __/ / /_/ / __/ /_/ __/ /__/ /_/ / /_/ / / / /
|
||||||
|
\____/_/ /_/\__,_/_/ /_/\__, /\___/ /_____/\___/\__/\___/\___/\__/_/\____/_/ /_/
|
||||||
|
/____/
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="Change Detection"
|
||||||
|
var_disk="2"
|
||||||
|
var_cpu="1"
|
||||||
|
var_ram="512"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Updating ${APP} LXC"
|
||||||
|
pip3 install changedetection.io --upgrade &>/dev/null
|
||||||
|
msg_ok "Updated ${APP} LXC"
|
||||||
|
msg_ok "Update Successfull"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1 && [[ ! -f /etc/systemd/system/changedetection.service ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP}:5000${CL} \n"
|
|
@ -1,69 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
________ ____ __ __ _
|
|
||||||
/ ____/ /_ ____ _____ ____ ____ / __ \___ / /____ _____/ /_(_)___ ____
|
|
||||||
/ / / __ \/ __ `/ __ \/ __ `/ _ \ / / / / _ \/ __/ _ \/ ___/ __/ / __ \/ __ \
|
|
||||||
/ /___/ / / / /_/ / / / / /_/ / __/ / /_/ / __/ /_/ __/ /__/ /_/ / /_/ / / / /
|
|
||||||
\____/_/ /_/\__,_/_/ /_/\__, /\___/ /_____/\___/\__/\___/\___/\__/_/\____/_/ /_/
|
|
||||||
/____/
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="Change Detection"
|
|
||||||
var_disk="2"
|
|
||||||
var_cpu="1"
|
|
||||||
var_ram="512"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -f /etc/systemd/system/changedetection.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Updating ${APP} LXC"
|
|
||||||
pip3 install changedetection.io --upgrade &>/dev/null
|
|
||||||
msg_ok "Updated ${APP} LXC"
|
|
||||||
msg_ok "Update Successfull"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP}:5000${CL} \n"
|
|
|
@ -0,0 +1,468 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
______ _ __
|
||||||
|
/ ____/________v5____ (_)____/ /__
|
||||||
|
/ / / ___/ __ \/ __ \/ / ___/ / _ \
|
||||||
|
/ /___/ / / /_/ / / / / / /__/ / __/
|
||||||
|
\____/_/ \____/_/ /_/_/\___/_/\___/
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="Cronicle"
|
||||||
|
var_disk="2"
|
||||||
|
var_cpu="1"
|
||||||
|
var_ram="512"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
hostname="$(hostname)"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
SERVER="y"
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
UPD=$(whiptail --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 2 \
|
||||||
|
"1" "Update ${APP}" ON \
|
||||||
|
"2" "Install ${APP} Worker" OFF \
|
||||||
|
3>&1 1>&2 2>&3)
|
||||||
|
|
||||||
|
header_info
|
||||||
|
if [ "$UPD" == "1" ]; then
|
||||||
|
if [[ ! -d /opt/cronicle ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!";
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
msg_info "Updating ${APP}"
|
||||||
|
/opt/cronicle/bin/control.sh upgrade &>/dev/null
|
||||||
|
msg_ok "Updated ${APP}"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
if [ "$UPD" == "2" ]; then
|
||||||
|
LATEST=$(curl -sL https://api.github.com/repos/jhuckaby/Cronicle/releases/latest | grep '"tag_name":' | cut -d'"' -f4)
|
||||||
|
IP=$(hostname -I | awk '{print $1}')
|
||||||
|
msg_info "Installing Dependencies"
|
||||||
|
|
||||||
|
apt-get install -y git &>/dev/null
|
||||||
|
apt-get install -y make &>/dev/null
|
||||||
|
apt-get install -y g++ &>/dev/null
|
||||||
|
apt-get install -y gcc &>/dev/null
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
msg_info "Setting up Node.js Repository"
|
||||||
|
bash <(curl -fsSL https://deb.nodesource.com/setup_16.x) &>/dev/null
|
||||||
|
msg_ok "Set up Node.js Repository"
|
||||||
|
|
||||||
|
msg_info "Installing Node.js"
|
||||||
|
apt-get install -y nodejs &>/dev/null
|
||||||
|
msg_ok "Installed Node.js"
|
||||||
|
|
||||||
|
msg_info "Installing Cronicle Worker"
|
||||||
|
mkdir -p /opt/cronicle
|
||||||
|
cd /opt/cronicle
|
||||||
|
tar zxvf <(curl -fsSL https://github.com/jhuckaby/Cronicle/archive/${LATEST}.tar.gz) --strip-components 1 &>/dev/null
|
||||||
|
npm install &>/dev/null
|
||||||
|
node bin/build.js dist &>/dev/null
|
||||||
|
sed -i "s/localhost:3012/${IP}:3012/g" /opt/cronicle/conf/config.json
|
||||||
|
/opt/cronicle/bin/control.sh start &>/dev/null
|
||||||
|
cp /opt/cronicle/bin/cronicled.init /etc/init.d/cronicled &>/dev/null
|
||||||
|
chmod 775 /etc/init.d/cronicled
|
||||||
|
update-rc.d cronicled defaults &>/dev/null
|
||||||
|
msg_ok "Installed Cronicle Worker on $hostname"
|
||||||
|
echo -e "\n Add Masters secret key to /opt/cronicle/conf/config.json \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export SERV=$SERVER
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} Primary should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP}:3012${CL} admin|admin \n"
|
108
ct/cronicle.sh
108
ct/cronicle.sh
|
@ -1,108 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
______ _ __
|
|
||||||
/ ____/________ ____ (_)____/ /__
|
|
||||||
/ / / ___/ __ \/ __ \/ / ___/ / _ \
|
|
||||||
/ /___/ / / /_/ / / / / / /__/ / __/
|
|
||||||
\____/_/ \____/_/ /_/_/\___/_/\___/
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="Cronicle"
|
|
||||||
var_disk="2"
|
|
||||||
var_cpu="1"
|
|
||||||
var_ram="512"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
if [[ ! -d /opt/cronicle ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
UPD=$(whiptail --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 2 \
|
|
||||||
"1" "Update ${APP}" ON \
|
|
||||||
"2" "Install ${APP} Worker" OFF \
|
|
||||||
3>&1 1>&2 2>&3)
|
|
||||||
|
|
||||||
header_info
|
|
||||||
msg_info "Updating ${APP}"
|
|
||||||
/opt/cronicle/bin/control.sh upgrade &>/dev/null
|
|
||||||
msg_ok "Updated ${APP}"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
if [ "$UPD" == "2" ]; then
|
|
||||||
LATEST=$(curl -sL https://api.github.com/repos/jhuckaby/Cronicle/releases/latest | grep '"tag_name":' | cut -d'"' -f4)
|
|
||||||
IP=$(hostname -I | awk '{print $1}')
|
|
||||||
msg_info "Installing Dependencies"
|
|
||||||
|
|
||||||
apt-get install -y git &>/dev/null
|
|
||||||
apt-get install -y make &>/dev/null
|
|
||||||
apt-get install -y g++ &>/dev/null
|
|
||||||
apt-get install -y gcc &>/dev/null
|
|
||||||
msg_ok "Installed Dependencies"
|
|
||||||
|
|
||||||
msg_info "Setting up Node.js Repository"
|
|
||||||
bash <(curl -fsSL https://deb.nodesource.com/setup_16.x) &>/dev/null
|
|
||||||
msg_ok "Set up Node.js Repository"
|
|
||||||
|
|
||||||
msg_info "Installing Node.js"
|
|
||||||
apt-get install -y nodejs &>/dev/null
|
|
||||||
msg_ok "Installed Node.js"
|
|
||||||
|
|
||||||
msg_info "Installing Cronicle Worker"
|
|
||||||
mkdir -p /opt/cronicle
|
|
||||||
cd /opt/cronicle
|
|
||||||
tar zxvf <(curl -fsSL https://github.com/jhuckaby/Cronicle/archive/${LATEST}.tar.gz) --strip-components 1 &>/dev/null
|
|
||||||
npm install &>/dev/null
|
|
||||||
node bin/build.js dist &>/dev/null
|
|
||||||
sed -i "s/localhost:3012/${IP}:3012/g" /opt/cronicle/conf/config.json
|
|
||||||
/opt/cronicle/bin/control.sh start &>/dev/null
|
|
||||||
cp /opt/cronicle/bin/cronicled.init /etc/init.d/cronicled &>/dev/null
|
|
||||||
chmod 775 /etc/init.d/cronicled
|
|
||||||
update-rc.d cronicled defaults &>/dev/null
|
|
||||||
msg_ok "Installed Cronicle Worker on $hostname"
|
|
||||||
echo -e "\n Add Masters secret key to /opt/cronicle/conf/config.json \n"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} Primary should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP}:3012${CL} admin|admin \n"
|
|
|
@ -0,0 +1,427 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
____ _____
|
||||||
|
/ __ \____ ____ ____ ___ ____ ____ / ___/__v5______ _____
|
||||||
|
/ / / / __ / _ \/ __ __ \/ __ \/ __ \ \__ \/ / / / __ \/ ___/
|
||||||
|
/ /_/ / /_/ / __/ / / / / / /_/ / / / / ___/ / /_/ / / / / /__
|
||||||
|
/_____/\__,_/\___/_/ /_/ /_/\____/_/ /_/ /____/\__, /_/ /_/\___/
|
||||||
|
/____/
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="Daemon Sync"
|
||||||
|
var_disk="8"
|
||||||
|
var_cpu="1"
|
||||||
|
var_ram="512"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Updating ${APP} LXC"
|
||||||
|
apt-get update &>/dev/null
|
||||||
|
apt-get -y upgrade &>/dev/null
|
||||||
|
msg_ok "Updated ${APP} LXC"
|
||||||
|
msg_ok "Update Successfull"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1 && [[ ! -d /etc/daemonsync ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP}:8084${CL} \n"
|
|
@ -1,69 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
____ _____
|
|
||||||
/ __ \____ ____ ____ ___ ____ ____ / ___/__ ______ _____
|
|
||||||
/ / / / __ / _ \/ __ __ \/ __ \/ __ \ \__ \/ / / / __ \/ ___/
|
|
||||||
/ /_/ / /_/ / __/ / / / / / /_/ / / / / ___/ / /_/ / / / / /__
|
|
||||||
/_____/\__,_/\___/_/ /_/ /_/\____/_/ /_/ /____/\__, /_/ /_/\___/
|
|
||||||
/____/
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="Daemon Sync"
|
|
||||||
var_disk="8"
|
|
||||||
var_cpu="1"
|
|
||||||
var_ram="512"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -d /var ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Updating $APP LXC"
|
|
||||||
apt-get update &>/dev/null
|
|
||||||
apt-get -y upgrade &>/dev/null
|
|
||||||
msg_ok "Updated $APP LXC"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP}:8084${CL} \n"
|
|
|
@ -0,0 +1,452 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
____ __
|
||||||
|
/ __ \____ ______/ /_ __ __
|
||||||
|
/ / / / __ / ___/ __ \/ / / /
|
||||||
|
/ /_/ / /_/ (__ ) / / / /_/ /
|
||||||
|
/_____/\__,_/____/_/ /_/\__, /
|
||||||
|
v5 /____/
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="Dashy"
|
||||||
|
var_disk="6"
|
||||||
|
var_cpu="2"
|
||||||
|
var_ram="2048"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Stopping ${APP}"
|
||||||
|
systemctl stop dashy
|
||||||
|
msg_ok "Stopped ${APP}"
|
||||||
|
|
||||||
|
msg_info "Backing up conf.yml"
|
||||||
|
cd ~
|
||||||
|
cp -R /dashy/public/conf.yml conf.yml
|
||||||
|
msg_ok "Backed up conf.yml"
|
||||||
|
|
||||||
|
msg_info "Updating Dashy"
|
||||||
|
cd /dashy
|
||||||
|
git merge &>/dev/null
|
||||||
|
git pull origin master &>/dev/null
|
||||||
|
yarn &>/dev/null
|
||||||
|
yarn build &>/dev/null
|
||||||
|
msg_ok "Updated Dashy"
|
||||||
|
|
||||||
|
msg_info "Restoring conf.yml"
|
||||||
|
cd ~
|
||||||
|
cp -R conf.yml /dashy/public
|
||||||
|
msg_ok "Restored conf.yml"
|
||||||
|
|
||||||
|
msg_info "Cleaning"
|
||||||
|
rm -rf conf.yml
|
||||||
|
msg_ok "Cleaned"
|
||||||
|
|
||||||
|
msg_info "Starting Dashy"
|
||||||
|
systemctl start dashy
|
||||||
|
msg_ok "Started Dashy"
|
||||||
|
msg_ok "Update Successfull"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1 && [[ ! -f /etc/systemd/system/dashy.service ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP}:4000${CL} \n"
|
95
ct/dashy.sh
95
ct/dashy.sh
|
@ -1,95 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
____ __
|
|
||||||
/ __ \____ ______/ /_ __ __
|
|
||||||
/ / / / __ / ___/ __ \/ / / /
|
|
||||||
/ /_/ / /_/ (__ ) / / / /_/ /
|
|
||||||
/_____/\__,_/____/_/ /_/\__, /
|
|
||||||
/____/
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="Dashy"
|
|
||||||
var_disk="6"
|
|
||||||
var_cpu="2"
|
|
||||||
var_ram="2048"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -d /dashy/public/ ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Stopping ${APP}"
|
|
||||||
systemctl stop dashy
|
|
||||||
msg_ok "Stopped ${APP}"
|
|
||||||
|
|
||||||
msg_info "Backing up conf.yml"
|
|
||||||
cd ~
|
|
||||||
cp -R /dashy/public/conf.yml conf.yml
|
|
||||||
msg_ok "Backed up conf.yml"
|
|
||||||
|
|
||||||
msg_info "Updating Dashy"
|
|
||||||
cd /dashy
|
|
||||||
git merge &>/dev/null
|
|
||||||
git pull origin master &>/dev/null
|
|
||||||
yarn &>/dev/null
|
|
||||||
yarn build &>/dev/null
|
|
||||||
msg_ok "Updated Dashy"
|
|
||||||
|
|
||||||
msg_info "Restoring conf.yml"
|
|
||||||
cd ~
|
|
||||||
cp -R conf.yml /dashy/public
|
|
||||||
msg_ok "Restored conf.yml"
|
|
||||||
|
|
||||||
msg_info "Cleaning"
|
|
||||||
rm -rf conf.yml
|
|
||||||
msg_ok "Cleaned"
|
|
||||||
|
|
||||||
msg_info "Starting Dashy"
|
|
||||||
systemctl start dashy
|
|
||||||
msg_ok "Started Dashy"
|
|
||||||
msg_ok "Update Successfull"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP}:4000${CL} \n"
|
|
|
@ -0,0 +1,419 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
____ __ _
|
||||||
|
/ __ \___v5/ /_ (_)___ _____
|
||||||
|
/ / / / _ \/ __ \/ / __ `/ __ \
|
||||||
|
/ /_/ / __/ /_/ / / /_/ / / / /
|
||||||
|
/_____/\___/_.___/_/\__,_/_/ /_/
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="Debian"
|
||||||
|
var_disk="2"
|
||||||
|
var_cpu="1"
|
||||||
|
var_ram="512"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Updating $APP LXC"
|
||||||
|
apt-get update &>/dev/null
|
||||||
|
apt-get -y upgrade &>/dev/null
|
||||||
|
msg_ok "Updated $APP LXC"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} ${var_version} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
67
ct/debian.sh
67
ct/debian.sh
|
@ -1,67 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
____ __ _
|
|
||||||
/ __ \___ / /_ (_)___ _____
|
|
||||||
/ / / / _ \/ __ \/ / __ `/ __ \
|
|
||||||
/ /_/ / __/ /_/ / / /_/ / / / /
|
|
||||||
/_____/\___/_.___/_/\__,_/_/ /_/
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="Debian"
|
|
||||||
var_disk="2"
|
|
||||||
var_cpu="1"
|
|
||||||
var_ram="512"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -d /var ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Updating $APP LXC"
|
|
||||||
apt-get update &>/dev/null
|
|
||||||
apt-get -y upgrade &>/dev/null
|
|
||||||
msg_ok "Updated $APP LXC"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
|
@ -0,0 +1,442 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
__ __________ _ _______
|
||||||
|
____/ /v5 / ____/ __ \/ | / /__ /
|
||||||
|
/ __ / _ \/ / / / / / |/ / / /
|
||||||
|
/ /_/ / __/ /___/ /_/ / /| / / /__
|
||||||
|
\__,_/\___/\____/\____/_/ |_/ /____/
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="deCONZ"
|
||||||
|
var_disk="4"
|
||||||
|
var_cpu="2"
|
||||||
|
var_ram="1024"
|
||||||
|
var_os="ubuntu"
|
||||||
|
var_version="20.04"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using ${var_os} Version: ${BGN}${var_version}${CL}"
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Privileged${CL}"
|
||||||
|
CT_TYPE="0"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Updating ${APP} LXC"
|
||||||
|
apt-get update &>/dev/null
|
||||||
|
apt-get -y upgrade &>/dev/null
|
||||||
|
msg_ok "Updated ${APP} LXC"
|
||||||
|
msg_ok "Update Successfull"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1 && [[ ! -f /etc/apt/sources.list.d/deconz.list ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
if [ "$CT_TYPE" == "0" ]; then
|
||||||
|
LXC_CONFIG=/etc/pve/lxc/${CTID}.conf
|
||||||
|
cat <<EOF >>$LXC_CONFIG
|
||||||
|
lxc.cgroup2.devices.allow: a
|
||||||
|
lxc.cap.drop:
|
||||||
|
lxc.cgroup2.devices.allow: c 188:* rwm
|
||||||
|
lxc.cgroup2.devices.allow: c 189:* rwm
|
||||||
|
lxc.mount.entry: /dev/serial/by-id dev/serial/by-id none bind,optional,create=dir
|
||||||
|
lxc.mount.entry: /dev/ttyUSB0 dev/ttyUSB0 none bind,optional,create=file
|
||||||
|
lxc.mount.entry: /dev/ttyUSB1 dev/ttyUSB1 none bind,optional,create=file
|
||||||
|
lxc.mount.entry: /dev/ttyACM0 dev/ttyACM0 none bind,optional,create=file
|
||||||
|
lxc.mount.entry: /dev/ttyACM1 dev/ttyACM1 none bind,optional,create=file
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP}${CL}\n"
|
69
ct/deconz.sh
69
ct/deconz.sh
|
@ -1,69 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/ubuntu.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
__ __________ _ _______
|
|
||||||
____/ /__ / ____/ __ \/ | / /__ /
|
|
||||||
/ __ / _ \/ / / / / / |/ / / /
|
|
||||||
/ /_/ / __/ /___/ /_/ / /| / / /__
|
|
||||||
\__,_/\___/\____/\____/_/ |_/ /____/
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="deCONZ"
|
|
||||||
var_disk="4"
|
|
||||||
var_cpu="2"
|
|
||||||
var_ram="1024"
|
|
||||||
var_os="ubuntu"
|
|
||||||
var_version="20.04"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="0"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -f /etc/apt/sources.list.d/deconz.list ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Updating $APP LXC"
|
|
||||||
apt-get update &>/dev/null
|
|
||||||
apt-get -y upgrade &>/dev/null
|
|
||||||
msg_ok "Updated $APP LXC"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP}${CL}\n"
|
|
|
@ -0,0 +1,427 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
____ __
|
||||||
|
/ __ \___ / /_v5______ ____
|
||||||
|
/ / / / _ \/ / / / / __ `/ _ \
|
||||||
|
/ /_/ / __/ / /_/ / /_/ / __/
|
||||||
|
/_____/\___/_/\__,_/\__, /\___/
|
||||||
|
/____/
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="Deluge"
|
||||||
|
var_disk="4"
|
||||||
|
var_cpu="2"
|
||||||
|
var_ram="2048"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Updating $APP LXC"
|
||||||
|
apt-get update &>/dev/null
|
||||||
|
pip3 install deluge[all] --upgrade
|
||||||
|
msg_ok "Updated $APP LXC"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1 && [[ ! -f /etc/systemd/system/deluged.service ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP}:8112${CL} \n"
|
70
ct/deluge.sh
70
ct/deluge.sh
|
@ -1,70 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
____ __
|
|
||||||
/ __ \___ / /_ ______ ____
|
|
||||||
/ / / / _ \/ / / / / __ `/ _ \
|
|
||||||
/ /_/ / __/ / /_/ / /_/ / __/
|
|
||||||
/_____/\___/_/\__,_/\__, /\___/
|
|
||||||
/____/
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="Deluge"
|
|
||||||
var_disk="4"
|
|
||||||
var_cpu="2"
|
|
||||||
var_ram="2048"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -f /etc/systemd/system/deluged.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Updating $APP LXC"
|
|
||||||
apt-get update &>/dev/null
|
|
||||||
pip3 install deluge[all] --upgrade
|
|
||||||
msg_ok "Updated $APP LXC"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP}:8112${CL} \n"
|
|
|
@ -0,0 +1,419 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
____
|
||||||
|
/ __ \___ _ ____ ______v5____
|
||||||
|
/ / / / _ \ | / / / / / __ `/ __ \
|
||||||
|
/ /_/ / __/ |/ / /_/ / /_/ / / / /
|
||||||
|
/_____/\___/|___/\__,_/\__,_/_/ /_/
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="Devuan"
|
||||||
|
var_disk="2"
|
||||||
|
var_cpu="1"
|
||||||
|
var_ram="512"
|
||||||
|
var_os="devuan"
|
||||||
|
var_version="4.0"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$NSAPP${CL}"
|
||||||
|
PW="-password $NSAPP"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Updating $APP LXC"
|
||||||
|
apt-get update &>/dev/null
|
||||||
|
apt-get -y upgrade &>/dev/null
|
||||||
|
msg_ok "Updated $APP LXC"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} ${var_version} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
67
ct/devuan.sh
67
ct/devuan.sh
|
@ -1,67 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
____
|
|
||||||
/ __ \___ _ ____ ______ ____
|
|
||||||
/ / / / _ \ | / / / / / __ `/ __ \
|
|
||||||
/ /_/ / __/ |/ / /_/ / /_/ / / / /
|
|
||||||
/_____/\___/|___/\__,_/\__,_/_/ /_/
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="Devuan"
|
|
||||||
var_disk="2"
|
|
||||||
var_cpu="1"
|
|
||||||
var_ram="512"
|
|
||||||
var_os="devuan"
|
|
||||||
var_version="4.0"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -d /var ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Updating $APP LXC"
|
|
||||||
apt-get update &>/dev/null
|
|
||||||
apt-get -y upgrade &>/dev/null
|
|
||||||
msg_ok "Updated $APP LXC"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
|
@ -0,0 +1,446 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
____ __
|
||||||
|
/ __ \____ _____/ /_v5__ _____
|
||||||
|
/ / / / __ \/ ___/ //_/ _ \/ ___/
|
||||||
|
/ /_/ / /_/ / /__/ ,< / __/ /
|
||||||
|
/_____/\____/\___/_/|_|\___/_/
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="Docker"
|
||||||
|
var_disk="4"
|
||||||
|
var_cpu="2"
|
||||||
|
var_ram="2048"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Fuse Overlayfs (ZFS): ${BGN}No${CL}"
|
||||||
|
FUSE="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "FUSE OVERLAYFS" --yesno "(ZFS) Enable Fuse Overlayfs?" 10 58); then
|
||||||
|
FUSE="yes"
|
||||||
|
else
|
||||||
|
FUSE="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Fuse Overlayfs (ZFS): ${BGN}$FUSE${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Updating ${APP} LXC"
|
||||||
|
apt-get update &>/dev/null
|
||||||
|
apt-get -y upgrade &>/dev/null
|
||||||
|
msg_ok "Updated ${APP} LXC"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$FUSE" == "yes" ]; then
|
||||||
|
FEATURES="fuse=1,keyctl=1,nesting=1"
|
||||||
|
else
|
||||||
|
FEATURES="keyctl=1,nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export ST=$FUSE
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
LXC_CONFIG=/etc/pve/lxc/${CTID}.conf
|
||||||
|
cat <<EOF >>$LXC_CONFIG
|
||||||
|
lxc.cgroup2.devices.allow: a
|
||||||
|
lxc.cap.drop:
|
||||||
|
EOF
|
||||||
|
if [ "$CT_TYPE" == "0" ]; then
|
||||||
|
LXC_CONFIG=/etc/pve/lxc/${CTID}.conf
|
||||||
|
cat <<EOF >>$LXC_CONFIG
|
||||||
|
lxc.cgroup2.devices.allow: c 188:* rwm
|
||||||
|
lxc.cgroup2.devices.allow: c 189:* rwm
|
||||||
|
lxc.mount.entry: /dev/serial/by-id dev/serial/by-id none bind,optional,create=dir
|
||||||
|
lxc.mount.entry: /dev/ttyUSB0 dev/ttyUSB0 none bind,optional,create=file
|
||||||
|
lxc.mount.entry: /dev/ttyUSB1 dev/ttyUSB1 none bind,optional,create=file
|
||||||
|
lxc.mount.entry: /dev/ttyACM0 dev/ttyACM0 none bind,optional,create=file
|
||||||
|
lxc.mount.entry: /dev/ttyACM1 dev/ttyACM1 none bind,optional,create=file
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
68
ct/docker.sh
68
ct/docker.sh
|
@ -1,68 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/docker.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
____ __
|
|
||||||
/ __ \____ _____/ /_ __ _____
|
|
||||||
/ / / / __ \/ ___/ //_/ _ \/ ___/
|
|
||||||
/ /_/ / /_/ / /__/ ,< / __/ /
|
|
||||||
/_____/\____/\___/_/|_|\___/_/
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="Docker"
|
|
||||||
var_disk="4"
|
|
||||||
var_cpu="2"
|
|
||||||
var_ram="2048"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
FUSE="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -d /var ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Updating ${APP} LXC"
|
|
||||||
apt-get update &>/dev/null
|
|
||||||
apt-get -y upgrade &>/dev/null
|
|
||||||
msg_ok "Updated ${APP} LXC"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
|
@ -0,0 +1,460 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
______ __
|
||||||
|
/ ____/___ v5_ / /_ __ __
|
||||||
|
/ __/ / __ __ \/ __ \/ / / /
|
||||||
|
/ /___/ / / / / / /_/ / /_/ /
|
||||||
|
/_____/_/ /_/ /_/_.___/\__, /
|
||||||
|
/____/
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="Emby"
|
||||||
|
var_disk="8"
|
||||||
|
var_cpu="2"
|
||||||
|
var_ram="2048"
|
||||||
|
var_os="ubuntu"
|
||||||
|
var_version="20.04"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using ${var_os} Version: ${BGN}${var_version}${CL}"
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Privileged${CL}"
|
||||||
|
CT_TYPE="0"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if var_version=$(whiptail --title "UBUNTU VERSION" --radiolist "Choose Version" 10 58 4 \
|
||||||
|
"18.04" "Bionic" OFF \
|
||||||
|
"20.04" "Focal" ON \
|
||||||
|
"22.04" "Jammy" OFF \
|
||||||
|
"22.10" "Kinetic" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Ubuntu Version: ${BGN}$var_version${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" OFF \
|
||||||
|
"0" "Privileged" ON \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
LATEST=$(curl -sL https://api.github.com/repos/MediaBrowser/Emby.Releases/releases/latest | grep '"tag_name":' | cut -d'"' -f4)
|
||||||
|
msg_info "Stopping ${APP}"
|
||||||
|
systemctl stop emby-server
|
||||||
|
msg_ok "Stopped ${APP}"
|
||||||
|
|
||||||
|
msg_info "Updating ${APP}"
|
||||||
|
wget https://github.com/MediaBrowser/Emby.Releases/releases/download/${LATEST}/emby-server-deb_${LATEST}_amd64.deb &>/dev/null
|
||||||
|
dpkg -i emby-server-deb_${LATEST}_amd64.deb &>/dev/null
|
||||||
|
rm emby-server-deb_${LATEST}_amd64.deb
|
||||||
|
msg_ok "Updated ${APP}"
|
||||||
|
|
||||||
|
msg_info "Starting ${APP}"
|
||||||
|
systemctl start emby-server
|
||||||
|
msg_ok "Started ${APP}"
|
||||||
|
msg_ok "Update Successfull"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1 && [[ ! -d /opt/emby-server ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
if [ "$CT_TYPE" == "0" ]; then
|
||||||
|
LXC_CONFIG=/etc/pve/lxc/${CTID}.conf
|
||||||
|
LXC_CONFIG=/etc/pve/lxc/${CTID}.conf
|
||||||
|
cat <<EOF >>$LXC_CONFIG
|
||||||
|
lxc.cgroup2.devices.allow: c 226:0 rwm
|
||||||
|
lxc.cgroup2.devices.allow: c 226:128 rwm
|
||||||
|
lxc.cgroup2.devices.allow: c 29:0 rwm
|
||||||
|
lxc.mount.entry: /dev/fb0 dev/fb0 none bind,optional,create=file
|
||||||
|
lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir
|
||||||
|
lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP}:8096${CL}\n"
|
80
ct/emby.sh
80
ct/emby.sh
|
@ -1,80 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/ubuntu.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
______ __
|
|
||||||
/ ____/___ ___ / /_ __ __
|
|
||||||
/ __/ / __ __ \/ __ \/ / / /
|
|
||||||
/ /___/ / / / / / /_/ / /_/ /
|
|
||||||
/_____/_/ /_/ /_/_.___/\__, /
|
|
||||||
/____/
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="Emby"
|
|
||||||
var_disk="8"
|
|
||||||
var_cpu="2"
|
|
||||||
var_ram="2048"
|
|
||||||
var_os="ubuntu"
|
|
||||||
var_version="20.04"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="0"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -d /opt/emby-server ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
LATEST=$(curl -sL https://api.github.com/repos/MediaBrowser/Emby.Releases/releases/latest | grep '"tag_name":' | cut -d'"' -f4)
|
|
||||||
msg_info "Stopping ${APP}"
|
|
||||||
systemctl stop emby-server
|
|
||||||
msg_ok "Stopped ${APP}"
|
|
||||||
|
|
||||||
msg_info "Updating ${APP}"
|
|
||||||
wget https://github.com/MediaBrowser/Emby.Releases/releases/download/${LATEST}/emby-server-deb_${LATEST}_amd64.deb &>/dev/null
|
|
||||||
dpkg -i emby-server-deb_${LATEST}_amd64.deb &>/dev/null
|
|
||||||
rm emby-server-deb_${LATEST}_amd64.deb
|
|
||||||
msg_ok "Updated ${APP}"
|
|
||||||
|
|
||||||
msg_info "Starting ${APP}"
|
|
||||||
systemctl start emby-server
|
|
||||||
msg_ok "Started ${APP}"
|
|
||||||
msg_ok "Update Successfull"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP}:8096${CL}\n"
|
|
|
@ -0,0 +1,421 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
________ _______v5 _ __
|
||||||
|
/ ____/ |/ / __ \ | |/ /
|
||||||
|
/ __/ / /|_/ / / / / | /
|
||||||
|
/ /___/ / / / /_/ / / |
|
||||||
|
/_____/_/ /_/\___\_\/_/|_|
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="EMQX"
|
||||||
|
var_disk="4"
|
||||||
|
var_cpu="2"
|
||||||
|
var_ram="1024"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Updating ${APP} LXC"
|
||||||
|
apt-get update &>/dev/null
|
||||||
|
apt-get -y upgrade &>/dev/null
|
||||||
|
msg_ok "Updated ${APP} LXC"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} Setup should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP}:18083${CL} \n"
|
69
ct/emqx.sh
69
ct/emqx.sh
|
@ -1,69 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
________ _______ _ __
|
|
||||||
/ ____/ |/ / __ \ | |/ /
|
|
||||||
/ __/ / /|_/ / / / / | /
|
|
||||||
/ /___/ / / / /_/ / / |
|
|
||||||
/_____/_/ /_/\___\_\/_/|_|
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="EMQX"
|
|
||||||
var_disk="4"
|
|
||||||
var_cpu="2"
|
|
||||||
var_ram="1024"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -d /var ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Updating $APP LXC"
|
|
||||||
apt-get update &>/dev/null
|
|
||||||
apt-get -y upgrade &>/dev/null
|
|
||||||
msg_ok "Updated $APP LXC"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} Setup should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP}:18083${CL} \n"
|
|
|
@ -0,0 +1,434 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
___________ ____ __ __
|
||||||
|
/ ____/ ___// __ \/ / / /___v5____ ___ ___
|
||||||
|
/ __/ \__ \/ /_/ / /_/ / __ \/ __ `__ \/ _ \
|
||||||
|
/ /___ ___/ / ____/ __ / /_/ / / / / / / __/
|
||||||
|
/_____//____/_/ /_/ /_/\____/_/ /_/ /_/\___/
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="ESPHome"
|
||||||
|
var_disk="4"
|
||||||
|
var_cpu="2"
|
||||||
|
var_ram="1024"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Stopping ESPHome"
|
||||||
|
systemctl stop esphomeDashboard
|
||||||
|
msg_ok "Stopped ESPHome"
|
||||||
|
|
||||||
|
msg_info "Updating ESPHome"
|
||||||
|
pip3 install esphome --upgrade &>/dev/null
|
||||||
|
msg_ok "Updated ESPHome"
|
||||||
|
|
||||||
|
msg_info "Starting ESPHome"
|
||||||
|
systemctl start esphomeDashboard
|
||||||
|
msg_ok "Started ESPHome"
|
||||||
|
msg_ok "Update Successfull"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1 && [[ ! -f /usr/local/bin/esphome ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP}:6052${CL} \n"
|
|
@ -1,77 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
___________ ____ __ __
|
|
||||||
/ ____/ ___// __ \/ / / /___ ____ ___ ___
|
|
||||||
/ __/ \__ \/ /_/ / /_/ / __ \/ __ `__ \/ _ \
|
|
||||||
/ /___ ___/ / ____/ __ / /_/ / / / / / / __/
|
|
||||||
/_____//____/_/ /_/ /_/\____/_/ /_/ /_/\___/
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="ESPHome"
|
|
||||||
var_disk="4"
|
|
||||||
var_cpu="2"
|
|
||||||
var_ram="1024"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -f /usr/local/bin/esphome ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Stopping ESPHome"
|
|
||||||
systemctl stop esphomeDashboard
|
|
||||||
msg_ok "Stopped ESPHome"
|
|
||||||
|
|
||||||
msg_info "Updating ESPHome"
|
|
||||||
pip3 install esphome --upgrade &>/dev/null
|
|
||||||
msg_ok "Updated ESPHome"
|
|
||||||
|
|
||||||
msg_info "Starting ESPHome"
|
|
||||||
systemctl start esphomeDashboard
|
|
||||||
msg_ok "Started ESPHome"
|
|
||||||
msg_ok "Update Successfull"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP}:6052${CL} \n"
|
|
|
@ -0,0 +1,421 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
___ __
|
||||||
|
____ _____ |__ \ _____/ /__v5__
|
||||||
|
/ __ `/ __ \__/ // ___/ __/ ___/
|
||||||
|
/ /_/ / /_/ / __// / / /_/ /__
|
||||||
|
\__, /\____/____/_/ \__/\___/
|
||||||
|
/____/
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="go2rtc"
|
||||||
|
var_disk="4"
|
||||||
|
var_cpu="2"
|
||||||
|
var_ram="2048"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Updating $APP LXC"
|
||||||
|
apt-get update &>/dev/null
|
||||||
|
apt-get -y upgrade &>/dev/null
|
||||||
|
msg_ok "Updated $APP LXC"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP}:1984${CL} \n"
|
70
ct/go2rtc.sh
70
ct/go2rtc.sh
|
@ -1,70 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
___ __
|
|
||||||
____ _____ |__ \ _____/ /______
|
|
||||||
/ __ `/ __ \__/ // ___/ __/ ___/
|
|
||||||
/ /_/ / /_/ / __// / / /_/ /__
|
|
||||||
\__, /\____/____/_/ \__/\___/
|
|
||||||
/____/
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="go2rtc"
|
|
||||||
var_disk="4"
|
|
||||||
var_cpu="2"
|
|
||||||
var_ram="2048"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -d /var ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Updating $APP LXC"
|
|
||||||
apt-get update &>/dev/null
|
|
||||||
apt-get -y upgrade &>/dev/null
|
|
||||||
msg_ok "Updated $APP LXC"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP}:1984${CL} \n"
|
|
|
@ -0,0 +1,427 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
______ ____
|
||||||
|
/ ____/________ _/ __/___ _____v5____ _
|
||||||
|
/ / __/ ___/ __ / /_/ __ / __ \/ __ /
|
||||||
|
/ /_/ / / / /_/ / __/ /_/ / / / / /_/ /
|
||||||
|
\____/_/ \__,_/_/ \__,_/_/ /_/\__,_/
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="Grafana"
|
||||||
|
var_disk="2"
|
||||||
|
var_cpu="1"
|
||||||
|
var_ram="512"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Updating ${APP} LXC"
|
||||||
|
apt-get update &>/dev/null
|
||||||
|
apt-get -y upgrade &>/dev/null
|
||||||
|
msg_ok "Updated ${APP} LXC"
|
||||||
|
msg_ok "Update Successfull"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1 && [[ ! -f /etc/apt/sources.list.d/grafana.list ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP}:3000${CL} \n"
|
|
@ -1,70 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
______ ____
|
|
||||||
/ ____/________ _/ __/___ _____ ____ _
|
|
||||||
/ / __/ ___/ __ / /_/ __ / __ \/ __ /
|
|
||||||
/ /_/ / / / /_/ / __/ /_/ / / / / /_/ /
|
|
||||||
\____/_/ \__,_/_/ \__,_/_/ /_/\__,_/
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="Grafana"
|
|
||||||
var_disk="2"
|
|
||||||
var_cpu="1"
|
|
||||||
var_ram="512"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -d /var ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Updating ${APP} LXC"
|
|
||||||
apt-get update &>/dev/null
|
|
||||||
apt-get -y upgrade &>/dev/null
|
|
||||||
msg_ok "Updated ${APP} LXC"
|
|
||||||
msg_ok "Update Successfull"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP}:3000${CL} \n"
|
|
|
@ -0,0 +1,426 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
____ __________ _______ __
|
||||||
|
/ __ / ___/ __ \/ ___/ / / /
|
||||||
|
/ /_/ / / / /_/ / /__/ /_/ /
|
||||||
|
\__, /_/ v5\____/\___/\__, /
|
||||||
|
/____/ /____/
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="grocy"
|
||||||
|
var_disk="2"
|
||||||
|
var_cpu="1"
|
||||||
|
var_ram="512"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Updating ${APP}"
|
||||||
|
bash /var/www/html/update.sh
|
||||||
|
msg_ok "Updated ${APP}"
|
||||||
|
msg_ok "Update Successfull"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1 && [[ ! -f /etc/apache2/sites-available/grocy.conf ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP}${CL} \n"
|
69
ct/grocy.sh
69
ct/grocy.sh
|
@ -1,69 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
____ __________ _______ __
|
|
||||||
/ __ / ___/ __ \/ ___/ / / /
|
|
||||||
/ /_/ / / / /_/ / /__/ /_/ /
|
|
||||||
\__, /_/ \____/\___/\__, /
|
|
||||||
/____/ /____/
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="grocy"
|
|
||||||
var_disk="2"
|
|
||||||
var_cpu="1"
|
|
||||||
var_ram="512"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -f /etc/apache2/sites-available/grocy.conf ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Updating ${APP}"
|
|
||||||
bash /var/www/html/update.sh
|
|
||||||
msg_ok "Updated ${APP}"
|
|
||||||
msg_ok "Update Successfull"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP}${CL} \n"
|
|
|
@ -0,0 +1,506 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
_ _ _ _ ___ _ _ _
|
||||||
|
/\ /\___(_)_ __ ___ __| | __ _| | | / \__ _ ___| |__ | |__ ___ __ _ _ __ __| |
|
||||||
|
/ /_/ / _ \ | '_ ` _ \ / _` |/ _` | | | / /\ / _` / __| '_ \| '_ \ / _ \ / _` | '__/ _` |
|
||||||
|
/ __ / __/ | | | | | | (_| | (_| | | |v5/ /_// (_| \__ \ | | | |_) | (_) | (_| | | | (_| |
|
||||||
|
\/ /_/ \___|_|_| |_| |_|\__,_|\__,_|_|_| /___,' \__,_|___/_| |_|_.__/ \___/ \__,_|_| \__,_|
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="Heimdall Dashboard"
|
||||||
|
var_disk="2"
|
||||||
|
var_cpu="1"
|
||||||
|
var_ram="512"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Stopping ${APP}"
|
||||||
|
systemctl disable heimdall.service &>/dev/null
|
||||||
|
systemctl stop heimdall
|
||||||
|
sleep 1
|
||||||
|
msg_ok "Stopped ${APP}"
|
||||||
|
|
||||||
|
msg_info "Backing up Data"
|
||||||
|
if [ -d "/opt/Heimdall-2.4.6" ]; then
|
||||||
|
cp -R /opt/Heimdall-2.4.6/database database-backup
|
||||||
|
cp -R /opt/Heimdall-2.4.6/public public-backup
|
||||||
|
elif [[ -d "/opt/Heimdall-2.4.7b" ]]; then
|
||||||
|
cp -R /opt/Heimdall-2.4.7b/database database-backup
|
||||||
|
cp -R /opt/Heimdall-2.4.7b/public public-backup
|
||||||
|
elif [[ -d "/opt/Heimdall-2.4.8" ]]; then
|
||||||
|
cp -R /opt/Heimdall-2.4.8/database database-backup
|
||||||
|
cp -R /opt/Heimdall-2.4.8/public public-backup
|
||||||
|
else
|
||||||
|
cp -R /opt/Heimdall/database database-backup
|
||||||
|
cp -R /opt/Heimdall/public public-backup
|
||||||
|
fi
|
||||||
|
sleep 1
|
||||||
|
msg_ok "Backed up Data"
|
||||||
|
|
||||||
|
RELEASE=$(curl -sX GET "https://api.github.com/repos/linuxserver/Heimdall/releases/latest" | awk '/tag_name/{print $4;exit}' FS='[""]')
|
||||||
|
msg_info "Updating Heimdall Dashboard to ${RELEASE}"
|
||||||
|
curl --silent -o ${RELEASE}.tar.gz -L "https://github.com/linuxserver/Heimdall/archive/${RELEASE}.tar.gz" &>/dev/null
|
||||||
|
tar xvzf ${RELEASE}.tar.gz &>/dev/null
|
||||||
|
VER=$(curl -s https://api.github.com/repos/linuxserver/Heimdall/releases/latest |
|
||||||
|
grep "tag_name" |
|
||||||
|
awk '{print substr($2, 3, length($2)-4) }')
|
||||||
|
|
||||||
|
if [ ! -d "/opt/Heimdall" ]; then
|
||||||
|
mv Heimdall-${VER} /opt/Heimdall
|
||||||
|
else
|
||||||
|
cp -R Heimdall-${VER}/* /opt/Heimdall
|
||||||
|
fi
|
||||||
|
|
||||||
|
service_path="/etc/systemd/system/heimdall.service"
|
||||||
|
echo "[Unit]
|
||||||
|
Description=Heimdall
|
||||||
|
After=network.target
|
||||||
|
[Service]
|
||||||
|
Restart=always
|
||||||
|
RestartSec=5
|
||||||
|
Type=simple
|
||||||
|
User=root
|
||||||
|
WorkingDirectory=/opt/Heimdall
|
||||||
|
ExecStart="/usr/bin/php" artisan serve --port 7990 --host 0.0.0.0
|
||||||
|
TimeoutStopSec=30
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target" >$service_path
|
||||||
|
msg_ok "Updated Heimdall Dashboard to ${RELEASE}"
|
||||||
|
|
||||||
|
msg_info "Restoring Data"
|
||||||
|
cp -R database-backup/* /opt/Heimdall/database
|
||||||
|
cp -R public-backup/* /opt/Heimdall/public
|
||||||
|
sleep 1
|
||||||
|
msg_ok "Restored Data"
|
||||||
|
|
||||||
|
msg_info "Cleanup"
|
||||||
|
if [ -d "/opt/Heimdall-2.4.6" ]; then
|
||||||
|
rm -rf /opt/Heimdall-2.4.6
|
||||||
|
rm -rf /opt/v2.4.6.tar.gz
|
||||||
|
elif [[ -d "/opt/Heimdall-2.4.7b" ]]; then
|
||||||
|
rm -rf /opt/Heimdall-2.4.7b
|
||||||
|
rm -rf /opt/v2.4.7b.tar.gz
|
||||||
|
elif [[ -d "/opt/Heimdall-2.4.8" ]]; then
|
||||||
|
rm -rf /opt/Heimdall-2.4.8
|
||||||
|
rm -rf /opt/v2.4.8.tar.gz
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -rf ${RELEASE}.tar.gz
|
||||||
|
rm -rf Heimdall-${VER}
|
||||||
|
rm -rf public-backup
|
||||||
|
rm -rf database-backup
|
||||||
|
rm -rf Heimdall
|
||||||
|
sleep 1
|
||||||
|
msg_ok "Cleaned"
|
||||||
|
|
||||||
|
msg_info "Starting ${APP}"
|
||||||
|
systemctl enable --now heimdall.service &>/dev/null
|
||||||
|
sleep 2
|
||||||
|
msg_ok "Started ${APP}"
|
||||||
|
msg_ok "Update Successfull"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1 && [[ ! -d /opt/Heimdall ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP}:7990${CL} \n"
|
|
@ -1,149 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
_ _ _ _ ___ _ _ _
|
|
||||||
/\ /\___(_)_ __ ___ __| | __ _| | | / \__ _ ___| |__ | |__ ___ __ _ _ __ __| |
|
|
||||||
/ /_/ / _ \ | '_ ` _ \ / _` |/ _` | | | / /\ / _` / __| '_ \| '_ \ / _ \ / _` | '__/ _` |
|
|
||||||
/ __ / __/ | | | | | | (_| | (_| | | | / /_// (_| \__ \ | | | |_) | (_) | (_| | | | (_| |
|
|
||||||
\/ /_/ \___|_|_| |_| |_|\__,_|\__,_|_|_| /___,' \__,_|___/_| |_|_.__/ \___/ \__,_|_| \__,_|
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="Heimdall Dashboard"
|
|
||||||
var_disk="2"
|
|
||||||
var_cpu="1"
|
|
||||||
var_ram="512"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -d /opt/Heimdall ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Stopping ${APP}"
|
|
||||||
systemctl disable heimdall.service &>/dev/null
|
|
||||||
systemctl stop heimdall
|
|
||||||
sleep 1
|
|
||||||
msg_ok "Stopped ${APP}"
|
|
||||||
|
|
||||||
msg_info "Backing up Data"
|
|
||||||
if [ -d "/opt/Heimdall-2.4.6" ]; then
|
|
||||||
cp -R /opt/Heimdall-2.4.6/database database-backup
|
|
||||||
cp -R /opt/Heimdall-2.4.6/public public-backup
|
|
||||||
elif [[ -d "/opt/Heimdall-2.4.7b" ]]; then
|
|
||||||
cp -R /opt/Heimdall-2.4.7b/database database-backup
|
|
||||||
cp -R /opt/Heimdall-2.4.7b/public public-backup
|
|
||||||
elif [[ -d "/opt/Heimdall-2.4.8" ]]; then
|
|
||||||
cp -R /opt/Heimdall-2.4.8/database database-backup
|
|
||||||
cp -R /opt/Heimdall-2.4.8/public public-backup
|
|
||||||
else
|
|
||||||
cp -R /opt/Heimdall/database database-backup
|
|
||||||
cp -R /opt/Heimdall/public public-backup
|
|
||||||
fi
|
|
||||||
sleep 1
|
|
||||||
msg_ok "Backed up Data"
|
|
||||||
|
|
||||||
RELEASE=$(curl -sX GET "https://api.github.com/repos/linuxserver/Heimdall/releases/latest" | awk '/tag_name/{print $4;exit}' FS='[""]')
|
|
||||||
msg_info "Updating Heimdall Dashboard to ${RELEASE}"
|
|
||||||
curl --silent -o ${RELEASE}.tar.gz -L "https://github.com/linuxserver/Heimdall/archive/${RELEASE}.tar.gz" &>/dev/null
|
|
||||||
tar xvzf ${RELEASE}.tar.gz &>/dev/null
|
|
||||||
VER=$(curl -s https://api.github.com/repos/linuxserver/Heimdall/releases/latest |
|
|
||||||
grep "tag_name" |
|
|
||||||
awk '{print substr($2, 3, length($2)-4) }')
|
|
||||||
|
|
||||||
if [ ! -d "/opt/Heimdall" ]; then
|
|
||||||
mv Heimdall-${VER} /opt/Heimdall
|
|
||||||
else
|
|
||||||
cp -R Heimdall-${VER}/* /opt/Heimdall
|
|
||||||
fi
|
|
||||||
|
|
||||||
service_path="/etc/systemd/system/heimdall.service"
|
|
||||||
echo "[Unit]
|
|
||||||
Description=Heimdall
|
|
||||||
After=network.target
|
|
||||||
[Service]
|
|
||||||
Restart=always
|
|
||||||
RestartSec=5
|
|
||||||
Type=simple
|
|
||||||
User=root
|
|
||||||
WorkingDirectory=/opt/Heimdall
|
|
||||||
ExecStart="/usr/bin/php" artisan serve --port 7990 --host 0.0.0.0
|
|
||||||
TimeoutStopSec=30
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target" >$service_path
|
|
||||||
msg_ok "Updated Heimdall Dashboard to ${RELEASE}"
|
|
||||||
|
|
||||||
msg_info "Restoring Data"
|
|
||||||
cp -R database-backup/* /opt/Heimdall/database
|
|
||||||
cp -R public-backup/* /opt/Heimdall/public
|
|
||||||
sleep 1
|
|
||||||
msg_ok "Restored Data"
|
|
||||||
|
|
||||||
msg_info "Cleanup"
|
|
||||||
if [ -d "/opt/Heimdall-2.4.6" ]; then
|
|
||||||
rm -rf /opt/Heimdall-2.4.6
|
|
||||||
rm -rf /opt/v2.4.6.tar.gz
|
|
||||||
elif [[ -d "/opt/Heimdall-2.4.7b" ]]; then
|
|
||||||
rm -rf /opt/Heimdall-2.4.7b
|
|
||||||
rm -rf /opt/v2.4.7b.tar.gz
|
|
||||||
elif [[ -d "/opt/Heimdall-2.4.8" ]]; then
|
|
||||||
rm -rf /opt/Heimdall-2.4.8
|
|
||||||
rm -rf /opt/v2.4.8.tar.gz
|
|
||||||
fi
|
|
||||||
|
|
||||||
rm -rf ${RELEASE}.tar.gz
|
|
||||||
rm -rf Heimdall-${VER}
|
|
||||||
rm -rf public-backup
|
|
||||||
rm -rf database-backup
|
|
||||||
rm -rf Heimdall
|
|
||||||
sleep 1
|
|
||||||
msg_ok "Cleaned"
|
|
||||||
|
|
||||||
msg_info "Starting ${APP}"
|
|
||||||
systemctl enable --now heimdall.service &>/dev/null
|
|
||||||
sleep 2
|
|
||||||
msg_ok "Started ${APP}"
|
|
||||||
msg_ok "Update Successfull"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP}:7990${CL} \n"
|
|
|
@ -0,0 +1,586 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
_ _ _ _ ___
|
||||||
|
/\ /\___ _ __ ___ ___ /_\ ___ ___(_)___| |_ __ _ _ __ | |_ / __\___v5_ __ ___
|
||||||
|
/ /_/ / _ \| '_ ` _ \ / _ \ //_\\/ __/ __| / __| __/ _` | '_ \| __| / / / _ \| '__/ _ \
|
||||||
|
/ __ / (_) | | | | | | __/ / _ \__ \__ \ \__ \ || (_| | | | | |_ / /__| (_) | | | __/
|
||||||
|
\/ /_/ \___/|_| |_| |_|\___| \_/ \_/___/___/_|___/\__\__,_|_| |_|\__| \____/\___/|_| \___|
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="Home Assistant-Core"
|
||||||
|
var_disk="8"
|
||||||
|
var_cpu="2"
|
||||||
|
var_ram="1024"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
STABLE=$(curl -s https://raw.githubusercontent.com/home-assistant/version/master/stable.json | grep "default" | awk '{print substr($2, 2, length($2)-3) }')
|
||||||
|
BETA=$(curl -s https://raw.githubusercontent.com/home-assistant/version/master/beta.json | grep "default" | awk '{print substr($2, 2, length($2)-3) }')
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
PY=$(ls /srv/homeassistant/lib/)
|
||||||
|
IP=$(hostname -I | awk '{print $1}')
|
||||||
|
UPD=$(whiptail --title "UPDATE" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 4 \
|
||||||
|
"1" "Update Core" ON \
|
||||||
|
"2" "Install HACS" OFF \
|
||||||
|
"3" "Install FileBrowser" OFF \
|
||||||
|
"4" "Install/Update AppDaemon" OFF \
|
||||||
|
3>&1 1>&2 2>&3)
|
||||||
|
header_info
|
||||||
|
if [ "$UPD" == "1" ]; then
|
||||||
|
if (whiptail --defaultno --title "SELECT BRANCH" --yesno "Use Beta Branch?" 10 58); then
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${GN}Updating to Version ${BETA}${CL}"
|
||||||
|
BR="--pre "
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${GN}Updating to Version ${STABLE}${CL}"
|
||||||
|
BR=""
|
||||||
|
fi
|
||||||
|
if [[ "$PY" == "python3.9" ]]; then echo -e "⚠️ Python 3.9 is deprecated and will be removed in Home Assistant 2023.2"; fi
|
||||||
|
|
||||||
|
msg_info "Stopping Home Assistant"
|
||||||
|
systemctl stop homeassistant
|
||||||
|
msg_ok "Stopped Home Assistant"
|
||||||
|
|
||||||
|
msg_info "Updating Home Assistant"
|
||||||
|
source /srv/homeassistant/bin/activate
|
||||||
|
pip install ${BR}--upgrade homeassistant &>/dev/null
|
||||||
|
msg_ok "Updated Home Assistant"
|
||||||
|
|
||||||
|
msg_info "Starting Home Assistant"
|
||||||
|
systemctl start homeassistant
|
||||||
|
sleep 2
|
||||||
|
msg_ok "Started Home Assistant"
|
||||||
|
msg_ok "Update Successful"
|
||||||
|
echo -e "\n Go to http://${IP}:8123 \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
if [ "$UPD" == "2" ]; then
|
||||||
|
msg_info "Installing Home Assistant Comunity Store (HACS)"
|
||||||
|
apt update &>/dev/null
|
||||||
|
apt install unzip &>/dev/null
|
||||||
|
cd .homeassistant
|
||||||
|
bash <(curl -fsSL https://get.hacs.xyz) &>/dev/null
|
||||||
|
msg_ok "Installed Home Assistant Comunity Store (HACS)"
|
||||||
|
echo -e "\n Reboot Home Assistant and clear browser cache then Add HACS integration.\n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
if [ "$UPD" == "3" ]; then
|
||||||
|
msg_info "Installing FileBrowser"
|
||||||
|
curl -fsSL https://raw.githubusercontent.com/filebrowser/get/master/get.sh | bash &>/dev/null
|
||||||
|
filebrowser config init -a '0.0.0.0' &>/dev/null
|
||||||
|
filebrowser config set -a '0.0.0.0' &>/dev/null
|
||||||
|
filebrowser users add admin changeme --perm.admin &>/dev/null
|
||||||
|
msg_ok "Installed FileBrowser"
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
service_path="/etc/systemd/system/filebrowser.service"
|
||||||
|
echo "[Unit]
|
||||||
|
Description=Filebrowser
|
||||||
|
After=network-online.target
|
||||||
|
[Service]
|
||||||
|
User=root
|
||||||
|
WorkingDirectory=/root/
|
||||||
|
ExecStart=/usr/local/bin/filebrowser -r /root/.homeassistant
|
||||||
|
[Install]
|
||||||
|
WantedBy=default.target" >$service_path
|
||||||
|
|
||||||
|
systemctl enable --now filebrowser.service &>/dev/null
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "FileBrowser should be reachable by going to the following URL.
|
||||||
|
${BL}http://$IP:8080${CL} admin|changeme\n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
if [ "$UPD" == "4" ]; then
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
if [[ ! -d /srv/appdaemon ]]; then
|
||||||
|
msg_info "Installing AppDaemon"
|
||||||
|
mkdir /srv/appdaemon
|
||||||
|
cd /srv/appdaemon
|
||||||
|
python3 -m venv .
|
||||||
|
source bin/activate
|
||||||
|
pip install appdaemon &>/dev/null
|
||||||
|
mkdir -p /root/.homeassistant/appdaemon/apps
|
||||||
|
cat > /root/.homeassistant/appdaemon/appdaemon.yaml << EOF
|
||||||
|
# Sample appdaemon.yml file
|
||||||
|
# For configuration, please visit: https://appdaemon.readthedocs.io/en/latest/CONFIGURE.html
|
||||||
|
appdaemon:
|
||||||
|
time_zone: CET
|
||||||
|
latitude: 51.725
|
||||||
|
longitude: 14.3434
|
||||||
|
elevation: 0
|
||||||
|
plugins:
|
||||||
|
HASS:
|
||||||
|
type: hass
|
||||||
|
ha_url: <home_assistant_base_url>
|
||||||
|
token: <some_long_lived_access_token>
|
||||||
|
http:
|
||||||
|
url: http://127.0.0.1:5050
|
||||||
|
admin:
|
||||||
|
api:
|
||||||
|
EOF
|
||||||
|
msg_ok "Installed AppDaemon"
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
cat > /etc/systemd/system/appdaemon.service << EOF
|
||||||
|
[Unit]
|
||||||
|
Description=AppDaemon
|
||||||
|
After=homeassistant.service
|
||||||
|
Requires=homeassistant.service
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
WorkingDirectory=/root/.homeassistant/appdaemon
|
||||||
|
ExecStart=/srv/appdaemon/bin/appdaemon -c "/root/.homeassistant/appdaemon"
|
||||||
|
RestartForceExitStatus=100
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable --now appdaemon &>/dev/null
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "AppDaemon should be reachable by going to the following URL.
|
||||||
|
${BL}http://$IP:5050${CL}\n"
|
||||||
|
exit
|
||||||
|
else
|
||||||
|
msg_info "Upgrading AppDaemon"
|
||||||
|
msg_info "Stopping AppDaemon"
|
||||||
|
systemctl stop appdaemon
|
||||||
|
msg_ok "Stopped AppDaemon"
|
||||||
|
|
||||||
|
msg_info "Updating AppDaemon"
|
||||||
|
source /srv/appdaemon/bin/activate
|
||||||
|
pip install --upgrade appdaemon &>/dev/null
|
||||||
|
msg_ok "Updated AppDaemon"
|
||||||
|
|
||||||
|
msg_info "Starting AppDaemon"
|
||||||
|
systemctl start appdaemon
|
||||||
|
sleep 2
|
||||||
|
msg_ok "Started AppDaemon"
|
||||||
|
msg_ok "Update Successful"
|
||||||
|
echo -e "\n Go to http://${IP}:5050 \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1 && [[ ! -d /srv/homeassistant ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
if [ "$CT_TYPE" == "0" ]; then
|
||||||
|
LXC_CONFIG=/etc/pve/lxc/${CTID}.conf
|
||||||
|
cat <<EOF >>$LXC_CONFIG
|
||||||
|
lxc.cgroup2.devices.allow: a
|
||||||
|
lxc.cap.drop:
|
||||||
|
lxc.cgroup2.devices.allow: c 188:* rwm
|
||||||
|
lxc.cgroup2.devices.allow: c 189:* rwm
|
||||||
|
lxc.mount.entry: /dev/serial/by-id dev/serial/by-id none bind,optional,create=dir
|
||||||
|
lxc.mount.entry: /dev/ttyUSB0 dev/ttyUSB0 none bind,optional,create=file
|
||||||
|
lxc.mount.entry: /dev/ttyUSB1 dev/ttyUSB1 none bind,optional,create=file
|
||||||
|
lxc.mount.entry: /dev/ttyACM0 dev/ttyACM0 none bind,optional,create=file
|
||||||
|
lxc.mount.entry: /dev/ttyACM1 dev/ttyACM1 none bind,optional,create=file
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP}:8123${CL}"
|
|
@ -1,216 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
_ _ _ _ ___
|
|
||||||
/\ /\___ _ __ ___ ___ /_\ ___ ___(_)___| |_ __ _ _ __ | |_ / __\___ _ __ ___
|
|
||||||
/ /_/ / _ \| '_ ` _ \ / _ \ //_\\/ __/ __| / __| __/ _` | '_ \| __| / / / _ \| '__/ _ \
|
|
||||||
/ __ / (_) | | | | | | __/ / _ \__ \__ \ \__ \ || (_| | | | | |_ / /__| (_) | | | __/
|
|
||||||
\/ /_/ \___/|_| |_| |_|\___| \_/ \_/___/___/_|___/\__\__,_|_| |_|\__| \____/\___/|_| \___|
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="Home Assistant-Core"
|
|
||||||
var_disk="8"
|
|
||||||
var_cpu="2"
|
|
||||||
var_ram="1024"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
if [[ ! -d /srv/homeassistant ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
PY=$(ls /srv/homeassistant/lib/)
|
|
||||||
IP=$(hostname -I | awk '{print $1}')
|
|
||||||
UPD=$(whiptail --title "UPDATE" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 4 \
|
|
||||||
"1" "Update Core" ON \
|
|
||||||
"2" "Install HACS" OFF \
|
|
||||||
"3" "Install FileBrowser" OFF \
|
|
||||||
"4" "Install/Update AppDaemon" OFF \
|
|
||||||
3>&1 1>&2 2>&3)
|
|
||||||
header_info
|
|
||||||
if [ "$UPD" == "1" ]; then
|
|
||||||
if (whiptail --defaultno --title "SELECT BRANCH" --yesno "Use Beta Branch?" 10 58); then
|
|
||||||
clear
|
|
||||||
header_info
|
|
||||||
echo -e "${GN}Updating to Version ${BETA}${CL}"
|
|
||||||
BR="--pre "
|
|
||||||
else
|
|
||||||
clear
|
|
||||||
header_info
|
|
||||||
echo -e "${GN}Updating to Version ${STABLE}${CL}"
|
|
||||||
BR=""
|
|
||||||
fi
|
|
||||||
if [[ "$PY" == "python3.9" ]]; then echo -e "⚠️ Python 3.9 is deprecated and will be removed in Home Assistant 2023.2"; fi
|
|
||||||
|
|
||||||
msg_info "Stopping Home Assistant"
|
|
||||||
systemctl stop homeassistant
|
|
||||||
msg_ok "Stopped Home Assistant"
|
|
||||||
|
|
||||||
msg_info "Updating Home Assistant"
|
|
||||||
source /srv/homeassistant/bin/activate
|
|
||||||
pip install ${BR}--upgrade homeassistant &>/dev/null
|
|
||||||
msg_ok "Updated Home Assistant"
|
|
||||||
|
|
||||||
msg_info "Starting Home Assistant"
|
|
||||||
systemctl start homeassistant
|
|
||||||
sleep 2
|
|
||||||
msg_ok "Started Home Assistant"
|
|
||||||
msg_ok "Update Successful"
|
|
||||||
echo -e "\n Go to http://${IP}:8123 \n"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
if [ "$UPD" == "2" ]; then
|
|
||||||
msg_info "Installing Home Assistant Comunity Store (HACS)"
|
|
||||||
apt update &>/dev/null
|
|
||||||
apt install unzip &>/dev/null
|
|
||||||
cd .homeassistant
|
|
||||||
bash <(curl -fsSL https://get.hacs.xyz) &>/dev/null
|
|
||||||
msg_ok "Installed Home Assistant Comunity Store (HACS)"
|
|
||||||
echo -e "\n Reboot Home Assistant and clear browser cache then Add HACS integration.\n"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
if [ "$UPD" == "3" ]; then
|
|
||||||
msg_info "Installing FileBrowser"
|
|
||||||
curl -fsSL https://raw.githubusercontent.com/filebrowser/get/master/get.sh | bash &>/dev/null
|
|
||||||
filebrowser config init -a '0.0.0.0' &>/dev/null
|
|
||||||
filebrowser config set -a '0.0.0.0' &>/dev/null
|
|
||||||
filebrowser users add admin changeme --perm.admin &>/dev/null
|
|
||||||
msg_ok "Installed FileBrowser"
|
|
||||||
|
|
||||||
msg_info "Creating Service"
|
|
||||||
service_path="/etc/systemd/system/filebrowser.service"
|
|
||||||
echo "[Unit]
|
|
||||||
Description=Filebrowser
|
|
||||||
After=network-online.target
|
|
||||||
[Service]
|
|
||||||
User=root
|
|
||||||
WorkingDirectory=/root/
|
|
||||||
ExecStart=/usr/local/bin/filebrowser -r /root/.homeassistant
|
|
||||||
[Install]
|
|
||||||
WantedBy=default.target" >$service_path
|
|
||||||
|
|
||||||
systemctl enable --now filebrowser.service &>/dev/null
|
|
||||||
msg_ok "Created Service"
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "FileBrowser should be reachable by going to the following URL.
|
|
||||||
${BL}http://$IP:8080${CL} admin|changeme\n"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
if [ "$UPD" == "4" ]; then
|
|
||||||
clear
|
|
||||||
header_info
|
|
||||||
if [[ ! -d /srv/appdaemon ]]; then
|
|
||||||
msg_info "Installing AppDaemon"
|
|
||||||
mkdir /srv/appdaemon
|
|
||||||
cd /srv/appdaemon
|
|
||||||
python3 -m venv .
|
|
||||||
source bin/activate
|
|
||||||
pip install appdaemon &>/dev/null
|
|
||||||
mkdir -p /root/.homeassistant/appdaemon/apps
|
|
||||||
cat >/root/.homeassistant/appdaemon/appdaemon.yaml <<EOF
|
|
||||||
# Sample appdaemon.yml file
|
|
||||||
# For configuration, please visit: https://appdaemon.readthedocs.io/en/latest/CONFIGURE.html
|
|
||||||
appdaemon:
|
|
||||||
time_zone: CET
|
|
||||||
latitude: 51.725
|
|
||||||
longitude: 14.3434
|
|
||||||
elevation: 0
|
|
||||||
plugins:
|
|
||||||
HASS:
|
|
||||||
type: hass
|
|
||||||
ha_url: <home_assistant_base_url>
|
|
||||||
token: <some_long_lived_access_token>
|
|
||||||
http:
|
|
||||||
url: http://127.0.0.1:5050
|
|
||||||
admin:
|
|
||||||
api:
|
|
||||||
EOF
|
|
||||||
msg_ok "Installed AppDaemon"
|
|
||||||
|
|
||||||
msg_info "Creating Service"
|
|
||||||
cat >/etc/systemd/system/appdaemon.service <<EOF
|
|
||||||
[Unit]
|
|
||||||
Description=AppDaemon
|
|
||||||
After=homeassistant.service
|
|
||||||
Requires=homeassistant.service
|
|
||||||
[Service]
|
|
||||||
Type=simple
|
|
||||||
WorkingDirectory=/root/.homeassistant/appdaemon
|
|
||||||
ExecStart=/srv/appdaemon/bin/appdaemon -c "/root/.homeassistant/appdaemon"
|
|
||||||
RestartForceExitStatus=100
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
EOF
|
|
||||||
systemctl enable --now appdaemon &>/dev/null
|
|
||||||
msg_ok "Created Service"
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "AppDaemon should be reachable by going to the following URL.
|
|
||||||
${BL}http://$IP:5050${CL}\n"
|
|
||||||
exit
|
|
||||||
else
|
|
||||||
msg_info "Upgrading AppDaemon"
|
|
||||||
msg_info "Stopping AppDaemon"
|
|
||||||
systemctl stop appdaemon
|
|
||||||
msg_ok "Stopped AppDaemon"
|
|
||||||
|
|
||||||
msg_info "Updating AppDaemon"
|
|
||||||
source /srv/appdaemon/bin/activate
|
|
||||||
pip install --upgrade appdaemon &>/dev/null
|
|
||||||
msg_ok "Updated AppDaemon"
|
|
||||||
|
|
||||||
msg_info "Starting AppDaemon"
|
|
||||||
systemctl start appdaemon
|
|
||||||
sleep 2
|
|
||||||
msg_ok "Started AppDaemon"
|
|
||||||
msg_ok "Update Successful"
|
|
||||||
echo -e "\n Go to http://${IP}:5050 \n"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP}:8123${CL}"
|
|
|
@ -0,0 +1,520 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
__ __ ___ _ __ __
|
||||||
|
/ / / /___v5____ ___ ___ / | __________(_)____/ /_____ _____ / /_
|
||||||
|
/ /_/ / __ \/ __ __ \/ _ \ / /| | / ___/ ___/ / ___/ __/ __ / __ \/ __/
|
||||||
|
/ __ / /_/ / / / / / / __/ / ___ |(__ |__ ) (__ ) /_/ /_/ / / / / /_
|
||||||
|
/_/ /_/\____/_/ /_/ /_/\___/ /_/ |_/____/____/_/____/\__/\__,_/_/ /_/\__/
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="Home Assistant"
|
||||||
|
var_disk="16"
|
||||||
|
var_cpu="2"
|
||||||
|
var_ram="2048"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Fuse Overlayfs (ZFS): ${BGN}No${CL}"
|
||||||
|
FUSE="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "FUSE OVERLAYFS" --yesno "(ZFS) Enable Fuse Overlayfs?" 10 58); then
|
||||||
|
FUSE="yes"
|
||||||
|
else
|
||||||
|
FUSE="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Fuse Overlayfs (ZFS): ${BGN}$FUSE${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
UPD=$(whiptail --title "UPDATE" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 4 \
|
||||||
|
"1" "Update ALL Containers" ON \
|
||||||
|
"2" "Remove ALL Unused Images" OFF \
|
||||||
|
"3" "Install HACS" OFF \
|
||||||
|
"4" "Install FileBrowser" OFF \
|
||||||
|
3>&1 1>&2 2>&3)
|
||||||
|
header_info
|
||||||
|
if [ "$UPD" == "1" ]; then
|
||||||
|
msg_info "Updating All Containers"
|
||||||
|
CONTAINER_LIST="${1:-$(docker ps -q)}"
|
||||||
|
for container in ${CONTAINER_LIST}; do
|
||||||
|
CONTAINER_IMAGE="$(docker inspect --format "{{.Config.Image}}" --type container ${container})"
|
||||||
|
RUNNING_IMAGE="$(docker inspect --format "{{.Image}}" --type container "${container}")"
|
||||||
|
docker pull "${CONTAINER_IMAGE}"
|
||||||
|
LATEST_IMAGE="$(docker inspect --format "{{.Id}}" --type image "${CONTAINER_IMAGE}")"
|
||||||
|
if [[ "${RUNNING_IMAGE}" != "${LATEST_IMAGE}" ]]; then
|
||||||
|
echo "Updating ${container} image ${CONTAINER_IMAGE}"
|
||||||
|
DOCKER_COMMAND="$(runlike "${container}")"
|
||||||
|
docker rm --force "${container}"
|
||||||
|
eval ${DOCKER_COMMAND}
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
msg_ok "Updated All Containers"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
if [ "$UPD" == "2" ]; then
|
||||||
|
msg_info "Removing ALL Unused Images"
|
||||||
|
docker image prune -af
|
||||||
|
msg_ok "Removed ALL Unused Images"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
if [ "$UPD" == "3" ]; then
|
||||||
|
msg_info "Installing Home Assistant Comunity Store (HACS)"
|
||||||
|
apt update &>/dev/null
|
||||||
|
apt install unzip &>/dev/null
|
||||||
|
cd /var/lib/docker/volumes/hass_config/_data
|
||||||
|
bash <(curl -fsSL https://get.hacs.xyz) &>/dev/null
|
||||||
|
msg_ok "Installed Home Assistant Comunity Store (HACS)"
|
||||||
|
echo -e "\n Reboot Home Assistant and clear browser cache then Add HACS integration.\n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
if [ "$UPD" == "4" ]; then
|
||||||
|
IP=$(hostname -I | awk '{print $1}')
|
||||||
|
msg_info "Installing FileBrowser"
|
||||||
|
curl -fsSL https://raw.githubusercontent.com/filebrowser/get/master/get.sh | bash &>/dev/null
|
||||||
|
filebrowser config init -a '0.0.0.0' &>/dev/null
|
||||||
|
filebrowser config set -a '0.0.0.0' &>/dev/null
|
||||||
|
filebrowser users add admin changeme --perm.admin &>/dev/null
|
||||||
|
msg_ok "Installed FileBrowser"
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
service_path="/etc/systemd/system/filebrowser.service"
|
||||||
|
echo "[Unit]
|
||||||
|
Description=Filebrowser
|
||||||
|
After=network-online.target
|
||||||
|
[Service]
|
||||||
|
User=root
|
||||||
|
WorkingDirectory=/root/
|
||||||
|
ExecStart=/usr/local/bin/filebrowser -r /
|
||||||
|
[Install]
|
||||||
|
WantedBy=default.target" >$service_path
|
||||||
|
|
||||||
|
systemctl enable --now filebrowser.service &>/dev/null
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "FileBrowser should be reachable by going to the following URL.
|
||||||
|
${BL}http://$IP:8080${CL} admin|changeme\n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1 && [[ ! -d /var/lib/docker/volumes/hass_config/_data
|
||||||
|
]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$FUSE" == "yes" ]; then
|
||||||
|
FEATURES="fuse=1,keyctl=1,nesting=1"
|
||||||
|
else
|
||||||
|
FEATURES="keyctl=1,nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export ST=$FUSE
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
LXC_CONFIG=/etc/pve/lxc/${CTID}.conf
|
||||||
|
cat <<EOF >>$LXC_CONFIG
|
||||||
|
lxc.cgroup2.devices.allow: a
|
||||||
|
lxc.cap.drop:
|
||||||
|
EOF
|
||||||
|
if [ "$CT_TYPE" == "0" ]; then
|
||||||
|
LXC_CONFIG=/etc/pve/lxc/${CTID}.conf
|
||||||
|
cat <<EOF >>$LXC_CONFIG
|
||||||
|
lxc.cgroup2.devices.allow: c 188:* rwm
|
||||||
|
lxc.cgroup2.devices.allow: c 189:* rwm
|
||||||
|
lxc.mount.entry: /dev/serial/by-id dev/serial/by-id none bind,optional,create=dir
|
||||||
|
lxc.mount.entry: /dev/ttyUSB0 dev/ttyUSB0 none bind,optional,create=file
|
||||||
|
lxc.mount.entry: /dev/ttyUSB1 dev/ttyUSB1 none bind,optional,create=file
|
||||||
|
lxc.mount.entry: /dev/ttyACM0 dev/ttyACM0 none bind,optional,create=file
|
||||||
|
lxc.mount.entry: /dev/ttyACM1 dev/ttyACM1 none bind,optional,create=file
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP}:8123${CL}
|
||||||
|
Portainer should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP}:9000${CL}\n"
|
|
@ -1,138 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
__ __ ___ _ __ __
|
|
||||||
/ / / /___ ____ ___ ___ / | __________(_)____/ /_____ _____ / /_
|
|
||||||
/ /_/ / __ \/ __ __ \/ _ \ / /| | / ___/ ___/ / ___/ __/ __ / __ \/ __/
|
|
||||||
/ __ / /_/ / / / / / / __/ / ___ |(__ |__ ) (__ ) /_/ /_/ / / / / /_
|
|
||||||
/_/ /_/\____/_/ /_/ /_/\___/ /_/ |_/____/____/_/____/\__/\__,_/_/ /_/\__/
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="Home Assistant"
|
|
||||||
var_disk="16"
|
|
||||||
var_cpu="2"
|
|
||||||
var_ram="2048"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
if [[ ! -d /var/lib/docker/volumes/hass_config/_data ]]; then
|
|
||||||
msg_error "No ${APP} Installation Found!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
UPD=$(whiptail --title "UPDATE" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 4 \
|
|
||||||
"1" "Update ALL Containers" ON \
|
|
||||||
"2" "Remove ALL Unused Images" OFF \
|
|
||||||
"3" "Install HACS" OFF \
|
|
||||||
"4" "Install FileBrowser" OFF \
|
|
||||||
3>&1 1>&2 2>&3)
|
|
||||||
header_info
|
|
||||||
if [ "$UPD" == "1" ]; then
|
|
||||||
msg_info "Updating All Containers"
|
|
||||||
CONTAINER_LIST="${1:-$(docker ps -q)}"
|
|
||||||
for container in ${CONTAINER_LIST}; do
|
|
||||||
CONTAINER_IMAGE="$(docker inspect --format "{{.Config.Image}}" --type container ${container})"
|
|
||||||
RUNNING_IMAGE="$(docker inspect --format "{{.Image}}" --type container "${container}")"
|
|
||||||
docker pull "${CONTAINER_IMAGE}"
|
|
||||||
LATEST_IMAGE="$(docker inspect --format "{{.Id}}" --type image "${CONTAINER_IMAGE}")"
|
|
||||||
if [[ "${RUNNING_IMAGE}" != "${LATEST_IMAGE}" ]]; then
|
|
||||||
echo "Updating ${container} image ${CONTAINER_IMAGE}"
|
|
||||||
DOCKER_COMMAND="$(runlike "${container}")"
|
|
||||||
docker rm --force "${container}"
|
|
||||||
eval ${DOCKER_COMMAND}
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
msg_ok "Updated All Containers"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
if [ "$UPD" == "2" ]; then
|
|
||||||
msg_info "Removing ALL Unused Images"
|
|
||||||
docker image prune -af
|
|
||||||
msg_ok "Removed ALL Unused Images"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
if [ "$UPD" == "3" ]; then
|
|
||||||
msg_info "Installing Home Assistant Comunity Store (HACS)"
|
|
||||||
apt update &>/dev/null
|
|
||||||
apt install unzip &>/dev/null
|
|
||||||
cd /var/lib/docker/volumes/hass_config/_data
|
|
||||||
bash <(curl -fsSL https://get.hacs.xyz) &>/dev/null
|
|
||||||
msg_ok "Installed Home Assistant Comunity Store (HACS)"
|
|
||||||
echo -e "\n Reboot Home Assistant and clear browser cache then Add HACS integration.\n"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
if [ "$UPD" == "4" ]; then
|
|
||||||
IP=$(hostname -I | awk '{print $1}')
|
|
||||||
msg_info "Installing FileBrowser"
|
|
||||||
curl -fsSL https://raw.githubusercontent.com/filebrowser/get/master/get.sh | bash &>/dev/null
|
|
||||||
filebrowser config init -a '0.0.0.0' &>/dev/null
|
|
||||||
filebrowser config set -a '0.0.0.0' &>/dev/null
|
|
||||||
filebrowser users add admin changeme --perm.admin &>/dev/null
|
|
||||||
msg_ok "Installed FileBrowser"
|
|
||||||
|
|
||||||
msg_info "Creating Service"
|
|
||||||
service_path="/etc/systemd/system/filebrowser.service"
|
|
||||||
echo "[Unit]
|
|
||||||
Description=Filebrowser
|
|
||||||
After=network-online.target
|
|
||||||
[Service]
|
|
||||||
User=root
|
|
||||||
WorkingDirectory=/root/
|
|
||||||
ExecStart=/usr/local/bin/filebrowser -r /
|
|
||||||
[Install]
|
|
||||||
WantedBy=default.target" >$service_path
|
|
||||||
|
|
||||||
systemctl enable --now filebrowser.service &>/dev/null
|
|
||||||
msg_ok "Created Service"
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "FileBrowser should be reachable by going to the following URL.
|
|
||||||
${BL}http://$IP:8080${CL} admin|changeme\n"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP}:8123${CL}
|
|
||||||
Portainer should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP}:9000${CL}\n"
|
|
|
@ -0,0 +1,427 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
__ ______ __ _____________ ____ ________ ____________
|
||||||
|
/ / / / __ \/ |/ / ____/ __ )/ __ \/ _/ __ \/ ____/ ____/
|
||||||
|
/ /_/ / / / / /|_/ / __/ / __ / /_/ // // / / / / __/ __/
|
||||||
|
/ __ / /_/ / / / / /___/ /_/ / _, _// // /_/ / /_/ / /___
|
||||||
|
/_/ /_/\____/_/v5/_/_____/_____/_/ |_/___/_____/\____/_____/
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="Homebridge"
|
||||||
|
var_disk="4"
|
||||||
|
var_cpu="1"
|
||||||
|
var_ram="1024"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Updating ${APP} LXC"
|
||||||
|
apt-get update &>/dev/null
|
||||||
|
apt-get -y upgrade &>/dev/null
|
||||||
|
msg_ok "Updated ${APP} LXC"
|
||||||
|
msg_ok "Update Successfull"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1 && [[ ! -f /etc/systemd/system/homebridge.service ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP}:8581${CL} \n"
|
|
@ -1,70 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
__ ______ __ _____________ ____ ________ ____________
|
|
||||||
/ / / / __ \/ |/ / ____/ __ )/ __ \/ _/ __ \/ ____/ ____/
|
|
||||||
/ /_/ / / / / /|_/ / __/ / __ / /_/ // // / / / / __/ __/
|
|
||||||
/ __ / /_/ / / / / /___/ /_/ / _, _// // /_/ / /_/ / /___
|
|
||||||
/_/ /_/\____/_/ /_/_____/_____/_/ |_/___/_____/\____/_____/
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="Homebridge"
|
|
||||||
var_disk="4"
|
|
||||||
var_cpu="1"
|
|
||||||
var_ram="1024"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -d /var ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Updating ${APP} LXC"
|
|
||||||
apt-get update &>/dev/null
|
|
||||||
apt-get -y upgrade &>/dev/null
|
|
||||||
msg_ok "Updated ${APP} LXC"
|
|
||||||
msg_ok "Update Successfull"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP}:8581${CL} \n"
|
|
|
@ -0,0 +1,433 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
__ __
|
||||||
|
/ / / /___ ____ ___ ___ ____ ____ _____ ____
|
||||||
|
/ /_/ / __ \/ __ `__ \/ _ \/ __ \/ __ `/ __ `/ _ \
|
||||||
|
/ __ / /_/ / / / / / / __/ /_/ / /_/ / /_/ / __/
|
||||||
|
/_/ /_/\____/_/ /_/ /_/\___/ .___/\__,_/\__, /\___/
|
||||||
|
/_/ v5 /____/
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="Homepage"
|
||||||
|
var_disk="3"
|
||||||
|
var_cpu="2"
|
||||||
|
var_ram="1024"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Updating ${APP}"
|
||||||
|
if ! command -v pnpm >/dev/null 2>&1; then
|
||||||
|
npm install -g pnpm &>/dev/null
|
||||||
|
fi
|
||||||
|
cd /opt/homepage
|
||||||
|
systemctl stop homepage
|
||||||
|
git pull --force &>/dev/null
|
||||||
|
pnpm install &>/dev/null
|
||||||
|
pnpm build &>/dev/null
|
||||||
|
systemctl start homepage
|
||||||
|
msg_ok "Update Successfull"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1 && [[ ! -f /etc/systemd/system/homepage.service ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} Setup should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP}:3000${CL} \n"
|
|
@ -1,76 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
__ __
|
|
||||||
/ / / /___ ____ ___ ___ ____ ____ _____ ____
|
|
||||||
/ /_/ / __ \/ __ `__ \/ _ \/ __ \/ __ `/ __ `/ _ \
|
|
||||||
/ __ / /_/ / / / / / / __/ /_/ / /_/ / /_/ / __/
|
|
||||||
/_/ /_/\____/_/ /_/ /_/\___/ .___/\__,_/\__, /\___/
|
|
||||||
/_/ /____/
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="Homepage"
|
|
||||||
var_disk="3"
|
|
||||||
var_cpu="2"
|
|
||||||
var_ram="1024"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -d /opt/homepage ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Updating ${APP}"
|
|
||||||
if ! command -v pnpm >/dev/null 2>&1; then
|
|
||||||
npm install -g pnpm &>/dev/null
|
|
||||||
fi
|
|
||||||
cd /opt/homepage
|
|
||||||
systemctl stop homepage
|
|
||||||
git pull --force &>/dev/null
|
|
||||||
pnpm install &>/dev/null
|
|
||||||
pnpm build &>/dev/null
|
|
||||||
systemctl start homepage
|
|
||||||
msg_ok "Update Successfull"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} Setup should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP}:3000${CL} \n"
|
|
|
@ -0,0 +1,450 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
__ __
|
||||||
|
/ / / /___ ____ ___v5___ _____
|
||||||
|
/ /_/ / __ \/ __ `__ \/ _ \/ ___/
|
||||||
|
/ __ / /_/ / / / / / / __/ /
|
||||||
|
/_/ /_/\____/_/ /_/ /_/\___/_/
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="Homer"
|
||||||
|
var_disk="2"
|
||||||
|
var_cpu="1"
|
||||||
|
var_ram="512"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Stopping ${APP}"
|
||||||
|
systemctl stop homer
|
||||||
|
msg_ok "Stopped ${APP}"
|
||||||
|
|
||||||
|
msg_info "Backing up config.yml"
|
||||||
|
cd ~
|
||||||
|
cp -R /opt/homer/assets/config.yml config.yml
|
||||||
|
msg_ok "Backed up config.yml"
|
||||||
|
|
||||||
|
msg_info "Updating ${APP}"
|
||||||
|
rm -rf /opt/homer/*
|
||||||
|
cd /opt/homer
|
||||||
|
wget -q https://github.com/bastienwirtz/homer/releases/latest/download/homer.zip
|
||||||
|
unzip homer.zip &>/dev/null
|
||||||
|
msg_ok "Updated ${APP}"
|
||||||
|
msg_info "Restoring conf.yml"
|
||||||
|
cd ~
|
||||||
|
cp -R config.yml /opt/homer/assets
|
||||||
|
msg_ok "Restored conf.yml"
|
||||||
|
|
||||||
|
msg_info "Cleaning"
|
||||||
|
rm -rf config.yml /opt/homer/homer.zip
|
||||||
|
msg_ok "Cleaned"
|
||||||
|
|
||||||
|
msg_info "Starting ${APP}"
|
||||||
|
systemctl start homer
|
||||||
|
msg_ok "Started ${APP}"
|
||||||
|
msg_ok "Update Successfull"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1 && [[ ! -d /opt/homer ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP}:8010${CL} \n"
|
93
ct/homer.sh
93
ct/homer.sh
|
@ -1,93 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
__ __
|
|
||||||
/ / / /___ ____ ___ ___ _____
|
|
||||||
/ /_/ / __ \/ __ `__ \/ _ \/ ___/
|
|
||||||
/ __ / /_/ / / / / / / __/ /
|
|
||||||
/_/ /_/\____/_/ /_/ /_/\___/_/
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="Homer"
|
|
||||||
var_disk="2"
|
|
||||||
var_cpu="1"
|
|
||||||
var_ram="512"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -d /opt/homer ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Stopping ${APP}"
|
|
||||||
systemctl stop homer
|
|
||||||
msg_ok "Stopped ${APP}"
|
|
||||||
|
|
||||||
msg_info "Backing up config.yml"
|
|
||||||
cd ~
|
|
||||||
cp -R /opt/homer/assets/config.yml config.yml
|
|
||||||
msg_ok "Backed up config.yml"
|
|
||||||
|
|
||||||
msg_info "Updating ${APP}"
|
|
||||||
rm -rf /opt/homer/*
|
|
||||||
cd /opt/homer
|
|
||||||
wget -q https://github.com/bastienwirtz/homer/releases/latest/download/homer.zip
|
|
||||||
unzip homer.zip &>/dev/null
|
|
||||||
msg_ok "Updated ${APP}"
|
|
||||||
msg_info "Restoring conf.yml"
|
|
||||||
cd ~
|
|
||||||
cp -R config.yml /opt/homer/assets
|
|
||||||
msg_ok "Restored conf.yml"
|
|
||||||
|
|
||||||
msg_info "Cleaning"
|
|
||||||
rm -rf config.yml /opt/homer/homer.zip
|
|
||||||
msg_ok "Cleaned"
|
|
||||||
|
|
||||||
msg_info "Starting ${APP}"
|
|
||||||
systemctl start homer
|
|
||||||
msg_ok "Started ${APP}"
|
|
||||||
msg_ok "Update Successfull"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP}:8010${CL} \n"
|
|
|
@ -0,0 +1,441 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
__ __ _
|
||||||
|
/ / / /_ ______v5___ _____(_)___ ____
|
||||||
|
/ /_/ / / / / __ \/ _ \/ ___/ / __ \/ __ \
|
||||||
|
/ __ / /_/ / /_/ / __/ / / / /_/ / / / /
|
||||||
|
/_/ /_/\__, / .___/\___/_/ /_/\____/_/ /_/
|
||||||
|
/____/_/
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="Hyperion"
|
||||||
|
var_disk="2"
|
||||||
|
var_cpu="1"
|
||||||
|
var_ram="512"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Privileged${CL}"
|
||||||
|
CT_TYPE="0"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Updating ${APP} LXC"
|
||||||
|
apt-get update &>/dev/null
|
||||||
|
apt-get install -y hyperion &>/dev/null
|
||||||
|
msg_ok "Updated ${APP} LXC"
|
||||||
|
msg_ok "Update Successfull"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1 && [[ ! -f /etc/apt/sources.list.d/hyperion.list ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
if [ "$CT_TYPE" == "0" ]; then
|
||||||
|
LXC_CONFIG=/etc/pve/lxc/${CTID}.conf
|
||||||
|
cat <<EOF >>$LXC_CONFIG
|
||||||
|
lxc.cgroup2.devices.allow: a
|
||||||
|
lxc.cap.drop:
|
||||||
|
lxc.cgroup2.devices.allow: c 188:* rwm
|
||||||
|
lxc.cgroup2.devices.allow: c 189:* rwm
|
||||||
|
lxc.mount.entry: /dev/serial/by-id dev/serial/by-id none bind,optional,create=dir
|
||||||
|
lxc.mount.entry: /dev/ttyUSB0 dev/ttyUSB0 none bind,optional,create=file
|
||||||
|
lxc.mount.entry: /dev/ttyUSB1 dev/ttyUSB1 none bind,optional,create=file
|
||||||
|
lxc.mount.entry: /dev/ttyACM0 dev/ttyACM0 none bind,optional,create=file
|
||||||
|
lxc.mount.entry: /dev/ttyACM1 dev/ttyACM1 none bind,optional,create=file
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP}:8090${CL} \n"
|
|
@ -1,71 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
__ __ _
|
|
||||||
/ / / /_ ______ ___ _____(_)___ ____
|
|
||||||
/ /_/ / / / / __ \/ _ \/ ___/ / __ \/ __ \
|
|
||||||
/ __ / /_/ / /_/ / __/ / / / /_/ / / / /
|
|
||||||
/_/ /_/\__, / .___/\___/_/ /_/\____/_/ /_/
|
|
||||||
/____/_/
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="Hyperion"
|
|
||||||
var_disk="2"
|
|
||||||
var_cpu="1"
|
|
||||||
var_ram="512"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -f /etc/apt/sources.list.d/hyperion.list ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Updating ${APP} LXC"
|
|
||||||
apt-get update &>/dev/null
|
|
||||||
apt-get install -y hyperion &>/dev/null
|
|
||||||
msg_ok "Updated ${APP} LXC"
|
|
||||||
msg_ok "Update Successfull"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP}:8090${CL} \n"
|
|
|
@ -0,0 +1,425 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
____ ______ ____ ____
|
||||||
|
/ _/_v5 / __/ /_ ___ __/ __ \/ __ )
|
||||||
|
/ // __ \/ /_/ / / / / |/_/ / / / __ |
|
||||||
|
_/ // / / / __/ / /_/ /> </ /_/ / /_/ /
|
||||||
|
/___/_/ /_/_/ /_/\__,_/_/|_/_____/_____/
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="InfluxDB"
|
||||||
|
var_disk="8"
|
||||||
|
var_cpu="2"
|
||||||
|
var_ram="2048"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Updating ${APP} LXC"
|
||||||
|
apt-get update &>/dev/null
|
||||||
|
apt-get -y upgrade &>/dev/null
|
||||||
|
msg_ok "Updated ${APP} LXC"
|
||||||
|
msg_ok "Update Successfull"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1 && [[ ! -f /etc/apt/sources.list.d/influxdb.list ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
|
@ -1,68 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
____ ______ ____ ____
|
|
||||||
/ _/___ / __/ /_ ___ __/ __ \/ __ )
|
|
||||||
/ // __ \/ /_/ / / / / |/_/ / / / __ |
|
|
||||||
_/ // / / / __/ / /_/ /> </ /_/ / /_/ /
|
|
||||||
/___/_/ /_/_/ /_/\__,_/_/|_/_____/_____/
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="InfluxDB"
|
|
||||||
var_disk="8"
|
|
||||||
var_cpu="2"
|
|
||||||
var_ram="2048"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -f /etc/apt/sources.list.d/influxdb.list ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Updating ${APP} LXC"
|
|
||||||
apt-get update &>/dev/null
|
|
||||||
apt-get -y upgrade &>/dev/null
|
|
||||||
msg_ok "Updated ${APP} LXC"
|
|
||||||
msg_ok "Update Successfull"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
|
@ -0,0 +1,427 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
_ ____ __
|
||||||
|
(_)___ / __ )_________ / /_____ _____
|
||||||
|
/ / __ \/ __ / ___/ __ \/ //_/ _ \/ ___/
|
||||||
|
/ / /_/ / /_/ / / / /_/ / ,< / __/ /
|
||||||
|
/_/\____/_____/_/ v5\____/_/|_|\___/_/
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="ioBroker"
|
||||||
|
var_disk="8"
|
||||||
|
var_cpu="2"
|
||||||
|
var_ram="2048"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Updating ${APP} LXC"
|
||||||
|
apt-get update &>/dev/null
|
||||||
|
apt-get -y upgrade &>/dev/null
|
||||||
|
msg_ok "Updated ${APP} LXC"
|
||||||
|
msg_ok "Update Successfull"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1 && [[ ! -d /opt/iobroker ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP}:8081${CL} \n"
|
|
@ -1,70 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
_ ____ __
|
|
||||||
(_)___ / __ )_________ / /_____ _____
|
|
||||||
/ / __ \/ __ / ___/ __ \/ //_/ _ \/ ___/
|
|
||||||
/ / /_/ / /_/ / / / /_/ / ,< / __/ /
|
|
||||||
/_/\____/_____/_/ \____/_/|_|\___/_/
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="ioBroker"
|
|
||||||
var_disk="8"
|
|
||||||
var_cpu="2"
|
|
||||||
var_ram="2048"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -d /opt/iobroker ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Updating ${APP} LXC"
|
|
||||||
apt-get update &>/dev/null
|
|
||||||
apt-get -y upgrade &>/dev/null
|
|
||||||
msg_ok "Updated ${APP} LXC"
|
|
||||||
msg_ok "Update Successfull"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP}:8081${CL} \n"
|
|
|
@ -0,0 +1,425 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
__ __ __ __
|
||||||
|
/ /___ ______/ /_____v5/ /_/ /_
|
||||||
|
__ / / __ `/ ___/ //_/ _ \/ __/ __/
|
||||||
|
/ /_/ / /_/ / /__/ ,< / __/ /_/ /_
|
||||||
|
\____/\__,_/\___/_/|_|\___/\__/\__/
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="Jackett"
|
||||||
|
var_disk="2"
|
||||||
|
var_cpu="1"
|
||||||
|
var_ram="512"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Updating ${APP} LXC"
|
||||||
|
apt-get update &>/dev/null
|
||||||
|
apt-get -y upgrade &>/dev/null
|
||||||
|
msg_ok "Updated ${APP} LXC"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1 && [[ ! -f /etc/systemd/system/jackett.service ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP}:9117${CL}\n"
|
|
@ -1,69 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
__ __ __ __
|
|
||||||
/ /___ ______/ /_____ / /_/ /_
|
|
||||||
__ / / __ `/ ___/ //_/ _ \/ __/ __/
|
|
||||||
/ /_/ / /_/ / /__/ ,< / __/ /_/ /_
|
|
||||||
\____/\__,_/\___/_/|_|\___/\__/\__/
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="Jackett"
|
|
||||||
var_disk="2"
|
|
||||||
var_cpu="1"
|
|
||||||
var_ram="512"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -f /etc/systemd/system/jackett.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Updating ${APP} LXC"
|
|
||||||
apt-get update &>/dev/null
|
|
||||||
apt-get -y upgrade &>/dev/null
|
|
||||||
msg_ok "Updated ${APP} LXC"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP}:9117${CL}\n"
|
|
|
@ -0,0 +1,450 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
__ ____ _____
|
||||||
|
/ /__ / / /_v5__/ __(_)___
|
||||||
|
__ / / _ \/ / / / / / /_/ / __ \
|
||||||
|
/ /_/ / __/ / / /_/ / __/ / / / /
|
||||||
|
\____/\___/_/_/\__, /_/ /_/_/ /_/
|
||||||
|
/____/
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="Jellyfin"
|
||||||
|
var_disk="8"
|
||||||
|
var_cpu="2"
|
||||||
|
var_ram="2048"
|
||||||
|
var_os="ubuntu"
|
||||||
|
var_version="20.04"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using ${var_os} Version: ${BGN}${var_version}${CL}"
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Privileged${CL}"
|
||||||
|
CT_TYPE="0"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if var_version=$(whiptail --title "UBUNTU VERSION" --radiolist "Choose Version" 10 58 4 \
|
||||||
|
"18.04" "Bionic" OFF \
|
||||||
|
"20.04" "Focal" ON \
|
||||||
|
"22.04" "Jammy" OFF \
|
||||||
|
"22.10" "Kinetic" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Ubuntu Version: ${BGN}$var_version${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" OFF \
|
||||||
|
"0" "Privileged" ON \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Updating ${APP} LXC"
|
||||||
|
apt-get update &>/dev/null
|
||||||
|
apt-get -y upgrade &>/dev/null
|
||||||
|
msg_ok "Updated ${APP} LXC"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1 && [[ ! -d /usr/lib/jellyfin ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
if [ "$CT_TYPE" == "0" ]; then
|
||||||
|
LXC_CONFIG=/etc/pve/lxc/${CTID}.conf
|
||||||
|
LXC_CONFIG=/etc/pve/lxc/${CTID}.conf
|
||||||
|
cat <<EOF >>$LXC_CONFIG
|
||||||
|
lxc.cgroup2.devices.allow: c 226:0 rwm
|
||||||
|
lxc.cgroup2.devices.allow: c 226:128 rwm
|
||||||
|
lxc.cgroup2.devices.allow: c 29:0 rwm
|
||||||
|
lxc.mount.entry: /dev/fb0 dev/fb0 none bind,optional,create=file
|
||||||
|
lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir
|
||||||
|
lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP}:8096${CL}\n"
|
|
@ -1,70 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/ubuntu.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
__ ____ _____
|
|
||||||
/ /__ / / /_ __/ __(_)___
|
|
||||||
__ / / _ \/ / / / / / /_/ / __ \
|
|
||||||
/ /_/ / __/ / / /_/ / __/ / / / /
|
|
||||||
\____/\___/_/_/\__, /_/ /_/_/ /_/
|
|
||||||
/____/
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="Jellyfin"
|
|
||||||
var_disk="8"
|
|
||||||
var_cpu="2"
|
|
||||||
var_ram="2048"
|
|
||||||
var_os="ubuntu"
|
|
||||||
var_version="20.04"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="0"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -d /usr/lib/jellyfin ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Updating ${APP} LXC"
|
|
||||||
apt-get update &>/dev/null
|
|
||||||
apt-get -y upgrade &>/dev/null
|
|
||||||
msg_ok "Updated ${APP} LXC"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP}:8096${CL}\n"
|
|
|
@ -0,0 +1,425 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
__ ____ __ __ __ __
|
||||||
|
/ /__/ __ \_____ / //_/_ __/ /_ ___v5_________ ___ / /____ _____
|
||||||
|
/ //_/ / / / ___/ / ,< / / / / __ \/ _ \/ ___/ __ \/ _ \/ __/ _ \/ ___/
|
||||||
|
/ ,< / /_/ (__ ) / /| / /_/ / /_/ / __/ / / / / / __/ /_/ __(__ )
|
||||||
|
/_/|_|\____/____/ /_/ |_\__,_/_.___/\___/_/ /_/ /_/\___/\__/\___/____/
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="k0s"
|
||||||
|
var_disk="4"
|
||||||
|
var_cpu="2"
|
||||||
|
var_ram="2048"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Updating ${APP} LXC"
|
||||||
|
apt-get update &>/dev/null
|
||||||
|
apt-get -y upgrade &>/dev/null
|
||||||
|
msg_ok "Updated ${APP} LXC"
|
||||||
|
msg_ok "Update Successfull"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1 && [[ ! -f /etc/k0s/k0s.yaml ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
68
ct/k0s.sh
68
ct/k0s.sh
|
@ -1,68 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
__ ____ __ __ __ __
|
|
||||||
/ /__/ __ \_____ / //_/_ __/ /_ ___ _________ ___ / /____ _____
|
|
||||||
/ //_/ / / / ___/ / ,< / / / / __ \/ _ \/ ___/ __ \/ _ \/ __/ _ \/ ___/
|
|
||||||
/ ,< / /_/ (__ ) / /| / /_/ / /_/ / __/ / / / / / __/ /_/ __(__ )
|
|
||||||
/_/|_|\____/____/ /_/ |_\__,_/_.___/\___/_/ /_/ /_/\___/\__/\___/____/
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="k0s"
|
|
||||||
var_disk="4"
|
|
||||||
var_cpu="2"
|
|
||||||
var_ram="2048"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -f /etc/k0s/k0s.yaml ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Updating ${APP} LXC"
|
|
||||||
apt-get update &>/dev/null
|
|
||||||
apt-get -y upgrade &>/dev/null
|
|
||||||
msg_ok "Updated ${APP} LXC"
|
|
||||||
msg_ok "Update Successfull"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
|
@ -0,0 +1,426 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
__ __ _ __
|
||||||
|
/ //_/___ __ v5__(_) /_____ _
|
||||||
|
/ ,< / __ `/ | / / / __/ __ `/
|
||||||
|
/ /| / /_/ /| |/ / / /_/ /_/ /
|
||||||
|
/_/ |_\__,_/ |___/_/\__/\__,_/
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="Kavita"
|
||||||
|
var_disk="8"
|
||||||
|
var_cpu="2"
|
||||||
|
var_ram="2048"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Updating $APP LXC"
|
||||||
|
apt-get update &>/dev/null
|
||||||
|
apt-get -y upgrade &>/dev/null
|
||||||
|
msg_ok "Updated $APP LXC"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1 && [[ ! -d /opt/Kavita ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP}:5000${CL} \n"
|
69
ct/kavita.sh
69
ct/kavita.sh
|
@ -1,69 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
__ __ _ __
|
|
||||||
/ //_/___ __ __(_) /_____ _
|
|
||||||
/ ,< / __ `/ | / / / __/ __ `/
|
|
||||||
/ /| / /_/ /| |/ / / /_/ /_/ /
|
|
||||||
/_/ |_\__,_/ |___/_/\__/\__,_/
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="Kavita"
|
|
||||||
var_disk="8"
|
|
||||||
var_cpu="2"
|
|
||||||
var_ram="2048"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -d /opt/Kavita ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Updating $APP LXC"
|
|
||||||
apt-get update &>/dev/null
|
|
||||||
apt-get -y upgrade &>/dev/null
|
|
||||||
msg_ok "Updated $APP LXC"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP}:5000${CL} \n"
|
|
|
@ -0,0 +1,428 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
__ __ __ __
|
||||||
|
/ //_/__v5__ _______/ /___ ____ _/ /__
|
||||||
|
/ ,< / _ \/ / / / ___/ / __ \/ __ / //_/
|
||||||
|
/ /| / __/ /_/ / /__/ / /_/ / /_/ / ,<
|
||||||
|
/_/ |_\___/\__, /\___/_/\____/\__,_/_/|_|
|
||||||
|
/____/
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="Keycloak"
|
||||||
|
var_disk="4"
|
||||||
|
var_cpu="2"
|
||||||
|
var_ram="2048"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Updating ${APP} LXC"
|
||||||
|
apt-get update &>/dev/null
|
||||||
|
apt-get -y upgrade &>/dev/null
|
||||||
|
msg_ok "Updated ${APP} LXC"
|
||||||
|
msg_ok "Update Successfull"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1 && [[ ! -f /etc/systemd/system/keycloak.service ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP}:8080${CL} \n"
|
|
@ -1,71 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
__ __ __ __
|
|
||||||
/ //_/__ __ _______/ /___ ____ _/ /__
|
|
||||||
/ ,< / _ \/ / / / ___/ / __ \/ __ / //_/
|
|
||||||
/ /| / __/ /_/ / /__/ / /_/ / /_/ / ,<
|
|
||||||
/_/ |_\___/\__, /\___/_/\____/\__,_/_/|_|
|
|
||||||
/____/
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="Keycloak"
|
|
||||||
var_disk="4"
|
|
||||||
var_cpu="2"
|
|
||||||
var_ram="2048"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -f /etc/systemd/system/keycloak.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Updating ${APP} LXC"
|
|
||||||
apt-get update &>/dev/null
|
|
||||||
apt-get -y upgrade &>/dev/null
|
|
||||||
msg_ok "Updated ${APP} LXC"
|
|
||||||
msg_ok "Update Successfull"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP}:8080${CL} \n"
|
|
|
@ -0,0 +1,426 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
__ _ __
|
||||||
|
/ / (_)___/ /___v5__________
|
||||||
|
/ / / / __ / __ `/ ___/ ___/
|
||||||
|
/ /___/ / /_/ / /_/ / / / /
|
||||||
|
/_____/_/\__,_/\__,_/_/ /_/
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="Lidarr"
|
||||||
|
var_disk="4"
|
||||||
|
var_cpu="2"
|
||||||
|
var_ram="1024"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Updating $APP LXC"
|
||||||
|
apt-get update &>/dev/null
|
||||||
|
apt-get -y upgrade &>/dev/null
|
||||||
|
msg_ok "Updated $APP LXC"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1 && [[ ! -d /var/lib/lidarr/ ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP}:8686${CL} \n"
|
69
ct/lidarr.sh
69
ct/lidarr.sh
|
@ -1,69 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
__ _ __
|
|
||||||
/ / (_)___/ /___ __________
|
|
||||||
/ / / / __ / __ `/ ___/ ___/
|
|
||||||
/ /___/ / /_/ / /_/ / / / /
|
|
||||||
/_____/_/\__,_/\__,_/_/ /_/
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="Lidarr"
|
|
||||||
var_disk="4"
|
|
||||||
var_cpu="2"
|
|
||||||
var_ram="1024"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -d /var/lib/lidarr/ ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Updating $APP LXC"
|
|
||||||
apt-get update &>/dev/null
|
|
||||||
apt-get -y upgrade &>/dev/null
|
|
||||||
msg_ok "Updated $APP LXC"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP}:8686${CL} \n"
|
|
|
@ -0,0 +1,429 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
__ ___ _ __ ____
|
||||||
|
/ |/ /___ _____ _(_)____/ |/ (_)_____________ _____
|
||||||
|
/ /|_/ / __ / __ / / ___/ /|_/ / / ___/ ___/ __ \/ ___/
|
||||||
|
/ / / / /_/ / /_/ / / /__/ / / / / / / / / /_/ / /
|
||||||
|
/_/ /_/\__,_/\__, /_/\___/_/ /_/_/_/ /_/ \____/_/
|
||||||
|
/____/ v5
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="MagicMirror"
|
||||||
|
var_disk="3"
|
||||||
|
var_cpu="1"
|
||||||
|
var_ram="512"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Updating ${APP} LXC"
|
||||||
|
cd /opt/magicmirror
|
||||||
|
git pull &>/dev/null
|
||||||
|
npm install --only=prod --omit=dev &>/dev/null
|
||||||
|
msg_ok "Updated ${APP} LXC"
|
||||||
|
msg_ok "Update Successfull"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1 && [[ ! -d /opt/magicmirror ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP}:8080${CL} \n"
|
|
@ -1,72 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
__ ___ _ __ ____
|
|
||||||
/ |/ /___ _____ _(_)____/ |/ (_)_____________ _____
|
|
||||||
/ /|_/ / __ / __ / / ___/ /|_/ / / ___/ ___/ __ \/ ___/
|
|
||||||
/ / / / /_/ / /_/ / / /__/ / / / / / / / / /_/ / /
|
|
||||||
/_/ /_/\__,_/\__, /_/\___/_/ /_/_/_/ /_/ \____/_/
|
|
||||||
/____/
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="MagicMirror"
|
|
||||||
var_disk="3"
|
|
||||||
var_cpu="1"
|
|
||||||
var_ram="512"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -d /opt/magicmirror ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Updating ${APP} LXC"
|
|
||||||
cd /opt/magicmirror
|
|
||||||
git pull &>/dev/null
|
|
||||||
npm install --only=prod --omit=dev &>/dev/null
|
|
||||||
msg_ok "Updated ${APP} LXC"
|
|
||||||
msg_ok "Update Successfull"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP}:8080${CL} \n"
|
|
|
@ -0,0 +1,425 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
__ ___ _ ____ ____
|
||||||
|
/ |/ /___ ______(_)___ _/ __ \/ __ )
|
||||||
|
/ /|_/ / __ / ___/ / __ / / / / __ |
|
||||||
|
/ / / / /_/ / / / / /_/ / /_/ / /_/ /
|
||||||
|
/_/ /_/\__,_/_/v5/_/\__,_/_____/_____/
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="MariaDB"
|
||||||
|
var_disk="4"
|
||||||
|
var_cpu="1"
|
||||||
|
var_ram="1024"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Updating ${APP} LXC"
|
||||||
|
apt-get update &>/dev/null
|
||||||
|
apt-get -y upgrade &>/dev/null
|
||||||
|
msg_ok "Updated ${APP} LXC"
|
||||||
|
msg_ok "Update Successfull"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1 && [[ ! -f /etc/apt/sources.list.d/mariadb.list ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
|
@ -1,68 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
__ ___ _ ____ ____
|
|
||||||
/ |/ /___ ______(_)___ _/ __ \/ __ )
|
|
||||||
/ /|_/ / __ / ___/ / __ / / / / __ |
|
|
||||||
/ / / / /_/ / / / / /_/ / /_/ / /_/ /
|
|
||||||
/_/ /_/\__,_/_/ /_/\__,_/_____/_____/
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="MariaDB"
|
|
||||||
var_disk="4"
|
|
||||||
var_cpu="1"
|
|
||||||
var_ram="1024"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -f /etc/apt/sources.list.d/mariadb.list ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Updating ${APP} LXC"
|
|
||||||
apt-get update &>/dev/null
|
|
||||||
apt-get -y upgrade &>/dev/null
|
|
||||||
msg_ok "Updated ${APP} LXC"
|
|
||||||
msg_ok "Update Successfull"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
|
@ -0,0 +1,427 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
__ ___ __ ______ __ __
|
||||||
|
/ |/ /__ _____/ /_ / ____/__ ____ / /__________ _/ /
|
||||||
|
/ /|_/ / _ \/ ___/ __ \/ / / _ \/ __ \/ __/ ___/ __ / /
|
||||||
|
/ / / / __(__ ) / / / /___/ __/ / / / /_/ / / /_/ / /
|
||||||
|
/_/ /_/\___/____/_/ /_/\____/\___/_/ /_/\__/_/ v5\__,_/_/
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="MeshCentral"
|
||||||
|
var_disk="2"
|
||||||
|
var_cpu="1"
|
||||||
|
var_ram="512"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Updating ${APP} LXC"
|
||||||
|
apt-get update &>/dev/null
|
||||||
|
apt-get -y upgrade &>/dev/null
|
||||||
|
msg_ok "Updated ${APP} LXC"
|
||||||
|
msg_ok "Update Successfull"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1 && [[ ! -d /opt/meshcentral ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP}${CL} \n"
|
|
@ -1,70 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
__ ___ __ ______ __ __
|
|
||||||
/ |/ /__ _____/ /_ / ____/__ ____ / /__________ _/ /
|
|
||||||
/ /|_/ / _ \/ ___/ __ \/ / / _ \/ __ \/ __/ ___/ __ / /
|
|
||||||
/ / / / __(__ ) / / / /___/ __/ / / / /_/ / / /_/ / /
|
|
||||||
/_/ /_/\___/____/_/ /_/\____/\___/_/ /_/\__/_/ \__,_/_/
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="MeshCentral"
|
|
||||||
var_disk="2"
|
|
||||||
var_cpu="1"
|
|
||||||
var_ram="512"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -d /opt/meshcentral ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Updating ${APP} LXC"
|
|
||||||
apt-get update &>/dev/null
|
|
||||||
apt-get -y upgrade &>/dev/null
|
|
||||||
msg_ok "Updated ${APP} LXC"
|
|
||||||
msg_ok "Update Successfull"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP}${CL} \n"
|
|
|
@ -0,0 +1,426 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
__ ___ __ _
|
||||||
|
/ |/ /___ / /_(_)___ ____v5___ __ _____
|
||||||
|
/ /|_/ / __ \/ __/ / __ \/ __ \/ _ \/ / / / _ \
|
||||||
|
/ / / / /_/ / /_/ / /_/ / / / / __/ /_/ / __/
|
||||||
|
/_/ /_/\____/\__/_/\____/_/ /_/\___/\__, /\___/
|
||||||
|
/____/
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="Motioneye"
|
||||||
|
var_disk="8"
|
||||||
|
var_cpu="2"
|
||||||
|
var_ram="2048"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Updating ${APP} LXC"
|
||||||
|
pip install motioneye --upgrade &>/dev/null
|
||||||
|
msg_ok "Updated ${APP} LXC"
|
||||||
|
msg_ok "Update Successfull"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1 && [[ ! -f /etc/systemd/system/motioneye.service ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP}:8765${CL} \n"
|
|
@ -1,69 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
__ ___ __ _
|
|
||||||
/ |/ /___ / /_(_)___ ____ ___ __ _____
|
|
||||||
/ /|_/ / __ \/ __/ / __ \/ __ \/ _ \/ / / / _ \
|
|
||||||
/ / / / /_/ / /_/ / /_/ / / / / __/ /_/ / __/
|
|
||||||
/_/ /_/\____/\__/_/\____/_/ /_/\___/\__, /\___/
|
|
||||||
/____/
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="Motioneye"
|
|
||||||
var_disk="8"
|
|
||||||
var_cpu="2"
|
|
||||||
var_ram="2048"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -f /etc/systemd/system/motioneye.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Updating ${APP} LXC"
|
|
||||||
pip install motioneye --upgrade &>/dev/null
|
|
||||||
msg_ok "Updated ${APP} LXC"
|
|
||||||
msg_ok "Update Successfull"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP}:8765${CL} \n"
|
|
|
@ -0,0 +1,424 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
__ ___ ____ _ ____________
|
||||||
|
/ |/ /___v5_____/ __ \__ __(_)_ __/_ __/___
|
||||||
|
/ /|_/ / __ \/ ___/ / / / / / / / / / / / / __ \
|
||||||
|
/ / / / /_/ (__ ) /_/ / /_/ / / / / / / / /_/ /
|
||||||
|
/_/ /_/\____/____/\___\_\__,_/_/ /_/ /_/ \____/
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="MQTT"
|
||||||
|
var_disk="2"
|
||||||
|
var_cpu="1"
|
||||||
|
var_ram="512"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Updating ${APP} LXC"
|
||||||
|
apt-get update &>/dev/null
|
||||||
|
apt-get -y upgrade &>/dev/null
|
||||||
|
msg_ok "Updated ${APP} LXC"
|
||||||
|
msg_ok "Update Successfull"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1 && [[ ! -f /etc/apt/sources.list.d/mosquitto-bullseye.list ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
68
ct/mqtt.sh
68
ct/mqtt.sh
|
@ -1,68 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
__ ___ ____ _ ____________
|
|
||||||
/ |/ /___ _____/ __ \__ __(_)_ __/_ __/___
|
|
||||||
/ /|_/ / __ \/ ___/ / / / / / / / / / / / / __ \
|
|
||||||
/ / / / /_/ (__ ) /_/ / /_/ / / / / / / / /_/ /
|
|
||||||
/_/ /_/\____/____/\___\_\__,_/_/ /_/ /_/ \____/
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="MQTT"
|
|
||||||
var_disk="2"
|
|
||||||
var_cpu="1"
|
|
||||||
var_ram="512"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -f /etc/apt/sources.list.d/mosquitto-bullseye.list ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Updating ${APP} LXC"
|
|
||||||
apt-get update &>/dev/null
|
|
||||||
apt-get -y upgrade &>/dev/null
|
|
||||||
msg_ok "Updated ${APP} LXC"
|
|
||||||
msg_ok "Update Successfull"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
|
@ -0,0 +1,427 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
___
|
||||||
|
/ _ \
|
||||||
|
_ __ | (_) |_v5_
|
||||||
|
| _ \ > _ <| _ \
|
||||||
|
| | | | (_) | | | |
|
||||||
|
|_| |_|\___/|_| |_|
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="n8n"
|
||||||
|
var_disk="3"
|
||||||
|
var_cpu="2"
|
||||||
|
var_ram="2048"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Updating ${APP} LXC"
|
||||||
|
npm update -g n8n &>/dev/null
|
||||||
|
msg_ok "Updated ${APP} LXC"
|
||||||
|
msg_ok "Update Successfull"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1 && [[ ! -f /etc/systemd/system/n8n.service ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP}:5678${CL} \n"
|
70
ct/n8n.sh
70
ct/n8n.sh
|
@ -1,70 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
___
|
|
||||||
/ _ \
|
|
||||||
_ __ | (_) |____
|
|
||||||
| _ \ > _ <| _ \
|
|
||||||
| | | | (_) | | | |
|
|
||||||
|_| |_|\___/|_| |_|
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="n8n"
|
|
||||||
var_disk="3"
|
|
||||||
var_cpu="2"
|
|
||||||
var_ram="2048"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -f /etc/systemd/system/n8n.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Updating ${APP} LXC"
|
|
||||||
npm update -g n8n &>/dev/null
|
|
||||||
msg_ok "Updated ${APP} LXC"
|
|
||||||
msg_ok "Update Successfull"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP}:5678${CL} \n"
|
|
|
@ -0,0 +1,437 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
_ __ _ __
|
||||||
|
/ | / /___ __ v5__(_)___/ /________ ____ ___ ___
|
||||||
|
/ |/ / __ / | / / / __ / ___/ __ \/ __ __ \/ _ \
|
||||||
|
/ /| / /_/ /| |/ / / /_/ / / / /_/ / / / / / / __/
|
||||||
|
/_/ |_/\__,_/ |___/_/\__,_/_/ \____/_/ /_/ /_/\___/
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="Navidrome"
|
||||||
|
var_disk="4"
|
||||||
|
var_cpu="2"
|
||||||
|
var_ram="1024"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}"
|
||||||
|
CT_TYPE="1"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
RELEASE=$(curl -s https://api.github.com/repos/navidrome/navidrome/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
||||||
|
msg_info "Stopping ${APP}"
|
||||||
|
systemctl stop navidrome.service
|
||||||
|
msg_ok "Stopped Navidrome"
|
||||||
|
|
||||||
|
msg_info "Updating to v${RELEASE}"
|
||||||
|
wget https://github.com/navidrome/navidrome/releases/download/v${RELEASE}/navidrome_${RELEASE}_Linux_x86_64.tar.gz -O Navidrome.tar.gz &>/dev/null
|
||||||
|
tar -xvzf Navidrome.tar.gz -C /opt/navidrome/ &>/dev/null
|
||||||
|
msg_ok "Updated ${APP}"
|
||||||
|
rm Navidrome.tar.gz
|
||||||
|
|
||||||
|
msg_info "${GN} Starting ${APP}"
|
||||||
|
systemctl start navidrome.service
|
||||||
|
msg_ok "Started ${APP}"
|
||||||
|
msg_ok "Update Successfull"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1 && [[ ! -d /opt/navidrome ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} should be reachable by going to the following URL.
|
||||||
|
${BL}http://${IP}:4533${CL} \n"
|
|
@ -1,80 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
_ __ _ __
|
|
||||||
/ | / /___ __ __(_)___/ /________ ____ ___ ___
|
|
||||||
/ |/ / __ / | / / / __ / ___/ __ \/ __ __ \/ _ \
|
|
||||||
/ /| / /_/ /| |/ / / /_/ / / / /_/ / / / / / / __/
|
|
||||||
/_/ |_/\__,_/ |___/_/\__,_/_/ \____/_/ /_/ /_/\___/
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="Navidrome"
|
|
||||||
var_disk="4"
|
|
||||||
var_cpu="2"
|
|
||||||
var_ram="1024"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -d /opt/navidrome ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
RELEASE=$(curl -s https://api.github.com/repos/navidrome/navidrome/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
|
||||||
msg_info "Stopping ${APP}"
|
|
||||||
systemctl stop navidrome.service
|
|
||||||
msg_ok "Stopped Navidrome"
|
|
||||||
|
|
||||||
msg_info "Updating to v${RELEASE}"
|
|
||||||
wget https://github.com/navidrome/navidrome/releases/download/v${RELEASE}/navidrome_${RELEASE}_Linux_x86_64.tar.gz -O Navidrome.tar.gz &>/dev/null
|
|
||||||
tar -xvzf Navidrome.tar.gz -C /opt/navidrome/ &>/dev/null
|
|
||||||
msg_ok "Updated ${APP}"
|
|
||||||
rm Navidrome.tar.gz
|
|
||||||
|
|
||||||
msg_info "${GN} Starting ${APP}"
|
|
||||||
systemctl start navidrome.service
|
|
||||||
msg_ok "Started ${APP}"
|
|
||||||
msg_ok "Update Successfull"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} should be reachable by going to the following URL.
|
|
||||||
${BL}http://${IP}:4533${CL} \n"
|
|
|
@ -0,0 +1,427 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2023 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT
|
||||||
|
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
||||||
|
|
||||||
|
function header_info {
|
||||||
|
clear
|
||||||
|
cat <<"EOF"
|
||||||
|
|
||||||
|
_ __ __ ________ ______ _
|
||||||
|
/ | / /__ _ __/ /_/ ____/ /___ __v5______/ / __ \(_)
|
||||||
|
/ |/ / _ \| |/_/ __/ / / / __ \/ / / / __ / /_/ / /
|
||||||
|
/ /| / __/> </ /_/ /___/ / /_/ / /_/ / /_/ / ____/ /
|
||||||
|
/_/ |_/\___/_/|_|\__/\____/_/\____/\__,_/\__,_/_/ /_/
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
header_info
|
||||||
|
echo -e "Loading..."
|
||||||
|
APP="NextCloudPi"
|
||||||
|
var_disk="8"
|
||||||
|
var_cpu="2"
|
||||||
|
var_ram="2048"
|
||||||
|
var_os="debian"
|
||||||
|
var_version="11"
|
||||||
|
NSAPP=$(echo ${APP,,} | tr -d ' ')
|
||||||
|
var_install="${NSAPP}-v5-install"
|
||||||
|
timezone=$(cat /etc/timezone)
|
||||||
|
INTEGER='^[0-9]+([.][0-9]+)?$'
|
||||||
|
YW=$(echo "\033[33m")
|
||||||
|
BL=$(echo "\033[36m")
|
||||||
|
RD=$(echo "\033[01;31m")
|
||||||
|
BGN=$(echo "\033[4;92m")
|
||||||
|
GN=$(echo "\033[1;92m")
|
||||||
|
DGN=$(echo "\033[32m")
|
||||||
|
CL=$(echo "\033[m")
|
||||||
|
BFR="\\r\\033[K"
|
||||||
|
HOLD="-"
|
||||||
|
CM="${GN}✓${CL}"
|
||||||
|
CROSS="${RD}✗${CL}"
|
||||||
|
set -Eeuo pipefail
|
||||||
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
||||||
|
function error_handler() {
|
||||||
|
local exit_code="$?"
|
||||||
|
local line_number="$1"
|
||||||
|
local command="$2"
|
||||||
|
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||||
|
echo -e "\n$error_message\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -ne " ${HOLD} ${YW}${msg}..."
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function PVE_CHECK() {
|
||||||
|
if [ $(pveversion | grep -c "pve-manager/7\.[0-9]") -eq 0 ]; then
|
||||||
|
echo -e "${CROSS} This version of Proxmox Virtual Environment is not supported"
|
||||||
|
echo -e "Requires PVE Version 7.0 or higher"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function ARCH_CHECK() {
|
||||||
|
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
|
||||||
|
echo -e "\n ${CROSS} This script will not work with PiMox! \n"
|
||||||
|
echo -e "Exiting..."
|
||||||
|
sleep 2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function default_settings() {
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}Privileged${CL}"
|
||||||
|
CT_TYPE="0"
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}"
|
||||||
|
PW=""
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}"
|
||||||
|
CT_ID=$NEXTID
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
|
||||||
|
HN=$NSAPP
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}"
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}"
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}"
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}"
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}"
|
||||||
|
NET=dhcp
|
||||||
|
echo -e "${DGN}Using Gateway Address: ${BGN}Default${CL}"
|
||||||
|
GATE=""
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}"
|
||||||
|
DISABLEIP6="no"
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
|
||||||
|
MTU=""
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}"
|
||||||
|
SD=""
|
||||||
|
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}"
|
||||||
|
NS=""
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}"
|
||||||
|
MAC=""
|
||||||
|
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}"
|
||||||
|
VLAN=""
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
|
||||||
|
SSH="no"
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
|
||||||
|
VERB="no"
|
||||||
|
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exit-script() {
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
function advanced_settings() {
|
||||||
|
if CT_TYPE=$(whiptail --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
|
||||||
|
"1" "Unprivileged" ON \
|
||||||
|
"0" "Privileged" OFF \
|
||||||
|
3>&1 1>&2 2>&3); then
|
||||||
|
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if PW1=$(whiptail --inputbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD(leave blank for automatic login)" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $PW1 ]; then
|
||||||
|
PW1="Automatic Login"
|
||||||
|
PW=" "
|
||||||
|
else
|
||||||
|
PW="-password $PW1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_ID=$(whiptail --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_ID" ]; then
|
||||||
|
CT_ID="$NEXTID"
|
||||||
|
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CT_NAME=$(whiptail --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CT_NAME" ]; then
|
||||||
|
HN="$NSAPP"
|
||||||
|
else
|
||||||
|
HN=$(echo ${CT_NAME,,} | tr -d ' ')
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if DISK_SIZE=$(whiptail --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$DISK_SIZE" ]; then
|
||||||
|
DISK_SIZE="$var_disk"
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
else
|
||||||
|
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
|
||||||
|
echo -e "${RD}⚠ DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$CORE_COUNT" ]; then
|
||||||
|
CORE_COUNT="$var_cpu"
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$RAM_SIZE" ]; then
|
||||||
|
RAM_SIZE="$var_ram"
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z "$BRG" ]; then
|
||||||
|
BRG="vmbr0"
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NET=$(whiptail --inputbox "Set a Static IPv4 CIDR Address(/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NET ]; then
|
||||||
|
NET="dhcp"
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
else
|
||||||
|
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
if GATE1=$(whiptail --inputbox "Set a Gateway IP (mandatory if Static IP was used)" 8 58 --title "GATEWAY IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $GATE1 ]; then
|
||||||
|
GATE1="Default"
|
||||||
|
GATE=""
|
||||||
|
else
|
||||||
|
GATE=",gw=$GATE1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
|
||||||
|
DISABLEIP6="yes"
|
||||||
|
else
|
||||||
|
DISABLEIP6="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
|
||||||
|
|
||||||
|
if MTU1=$(whiptail --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MTU1 ]; then
|
||||||
|
MTU1="Default"
|
||||||
|
MTU=""
|
||||||
|
else
|
||||||
|
MTU=",mtu=$MTU1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if SD=$(whiptail --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $SD ]; then
|
||||||
|
SX=Host
|
||||||
|
SD=""
|
||||||
|
else
|
||||||
|
SX=$SD
|
||||||
|
SD="-searchdomain=$SD"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if NX=$(whiptail --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $NX ]; then
|
||||||
|
NX=Host
|
||||||
|
NS=""
|
||||||
|
else
|
||||||
|
NS="-nameserver=$NX"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if MAC1=$(whiptail --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $MAC1 ]; then
|
||||||
|
MAC1="Default"
|
||||||
|
MAC=""
|
||||||
|
else
|
||||||
|
MAC=",hwaddr=$MAC1"
|
||||||
|
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
|
||||||
|
if [ -z $VLAN1 ]; then
|
||||||
|
VLAN1="Default"
|
||||||
|
VLAN=""
|
||||||
|
else
|
||||||
|
VLAN=",tag=$VLAN1"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
|
||||||
|
else
|
||||||
|
exit-script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
|
||||||
|
SSH="yes"
|
||||||
|
else
|
||||||
|
SSH="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
|
||||||
|
|
||||||
|
if (whiptail --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
|
||||||
|
VERB="yes"
|
||||||
|
else
|
||||||
|
VERB="no"
|
||||||
|
fi
|
||||||
|
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
|
||||||
|
|
||||||
|
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
|
||||||
|
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
|
||||||
|
else
|
||||||
|
clear
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_script() {
|
||||||
|
ARCH_CHECK
|
||||||
|
PVE_CHECK
|
||||||
|
NEXTID=$(pvesh get /cluster/nextid)
|
||||||
|
header_info
|
||||||
|
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
|
||||||
|
header_info
|
||||||
|
echo -e "${BL}Using Default Settings${CL}"
|
||||||
|
default_settings
|
||||||
|
else
|
||||||
|
header_info
|
||||||
|
echo -e "${RD}Using Advanced Settings${CL}"
|
||||||
|
advanced_settings
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
msg_info "Updating ${APP} LXC"
|
||||||
|
apt-get update &>/dev/null
|
||||||
|
apt-get -y upgrade &>/dev/null
|
||||||
|
msg_ok "Updated ${APP} LXC"
|
||||||
|
msg_ok "Update Successfull"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
if command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
install_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1 && [[ ! -f /lib/systemd/system/nextcloud-domain.service ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pveversion >/dev/null 2>&1; then
|
||||||
|
if ! (whiptail --title "${APP} LXC UPDATE" --yesno "This will update ${APP} LXC. Proceed?" 10 58); then
|
||||||
|
clear
|
||||||
|
echo -e "⚠ User exited script \n"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
update_script
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VERB" == "yes" ]; then set -x; fi
|
||||||
|
if [ "$CT_TYPE" == "1" ]; then
|
||||||
|
FEATURES="nesting=1,keyctl=1"
|
||||||
|
else
|
||||||
|
FEATURES="nesting=1"
|
||||||
|
fi
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
pushd $TEMP_DIR >/dev/null
|
||||||
|
export tz=$timezone
|
||||||
|
export DISABLEIPV6=$DISABLEIP6
|
||||||
|
export APPLICATION=$APP
|
||||||
|
export VERBOSE=$VERB
|
||||||
|
export SSH_ROOT=${SSH}
|
||||||
|
export CTID=$CT_ID
|
||||||
|
export PCT_OSTYPE=$var_os
|
||||||
|
export PCT_OSVERSION=$var_version
|
||||||
|
export PCT_DISK_SIZE=$DISK_SIZE
|
||||||
|
export PCT_OPTIONS="
|
||||||
|
-features $FEATURES
|
||||||
|
-hostname $HN
|
||||||
|
$SD
|
||||||
|
$NS
|
||||||
|
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
|
||||||
|
-onboot 1
|
||||||
|
-cores $CORE_COUNT
|
||||||
|
-memory $RAM_SIZE
|
||||||
|
-unprivileged $CT_TYPE
|
||||||
|
$PW
|
||||||
|
"
|
||||||
|
bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit
|
||||||
|
msg_info "Starting LXC Container"
|
||||||
|
pct start $CTID
|
||||||
|
msg_ok "Started LXC Container"
|
||||||
|
lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/install/$var_install.sh)" || exit
|
||||||
|
IP=$(pct exec $CTID ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
|
||||||
|
pct set $CTID -description "# ${APP} LXC
|
||||||
|
### https://tteck.github.io/Proxmox/
|
||||||
|
<a href='https://ko-fi.com/D1D7EP4GF'><img src='https://img.shields.io/badge/☕-Buy me a coffee-red' /></a>"
|
||||||
|
msg_ok "Completed Successfully!\n"
|
||||||
|
echo -e "${APP} Setup should be reachable by going to the following URL.
|
||||||
|
${BL}https://${IP}/${CL} \n"
|
|
@ -1,70 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/debian.func)
|
|
||||||
# Copyright (c) 2021-2023 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT
|
|
||||||
# https://github.com/tteck/Proxmox/raw/main/LICENSE
|
|
||||||
|
|
||||||
function header_info {
|
|
||||||
clear
|
|
||||||
cat <<"EOF"
|
|
||||||
_ __ __ ________ ______ _
|
|
||||||
/ | / /__ _ __/ /_/ ____/ /___ __ ______/ / __ \(_)
|
|
||||||
/ |/ / _ \| |/_/ __/ / / / __ \/ / / / __ / /_/ / /
|
|
||||||
/ /| / __/> </ /_/ /___/ / /_/ / /_/ / /_/ / ____/ /
|
|
||||||
/_/ |_/\___/_/|_|\__/\____/_/\____/\__,_/\__,_/_/ /_/
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
header_info
|
|
||||||
echo -e "Loading..."
|
|
||||||
APP="NextCloudPi"
|
|
||||||
var_disk="8"
|
|
||||||
var_cpu="2"
|
|
||||||
var_ram="2048"
|
|
||||||
var_os="debian"
|
|
||||||
var_version="11"
|
|
||||||
variables
|
|
||||||
color
|
|
||||||
catch_errors
|
|
||||||
|
|
||||||
function default_settings() {
|
|
||||||
CT_TYPE="1"
|
|
||||||
PW=""
|
|
||||||
CT_ID=$NEXTID
|
|
||||||
HN=$NSAPP
|
|
||||||
DISK_SIZE="$var_disk"
|
|
||||||
CORE_COUNT="$var_cpu"
|
|
||||||
RAM_SIZE="$var_ram"
|
|
||||||
BRG="vmbr0"
|
|
||||||
NET=dhcp
|
|
||||||
GATE=""
|
|
||||||
DISABLEIP6="no"
|
|
||||||
MTU=""
|
|
||||||
SD=""
|
|
||||||
NS=""
|
|
||||||
MAC=""
|
|
||||||
VLAN=""
|
|
||||||
SSH="no"
|
|
||||||
VERB="no"
|
|
||||||
echo_default
|
|
||||||
}
|
|
||||||
|
|
||||||
function update_script() {
|
|
||||||
header_info
|
|
||||||
if [[ ! -f /lib/systemd/system/nextcloud-domain.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
|
|
||||||
msg_info "Updating ${APP} LXC"
|
|
||||||
apt-get update &>/dev/null
|
|
||||||
apt-get -y upgrade &>/dev/null
|
|
||||||
msg_ok "Updated ${APP} LXC"
|
|
||||||
msg_ok "Update Successfull"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
start
|
|
||||||
build_container
|
|
||||||
description
|
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n"
|
|
||||||
echo -e "${APP} Setup should be reachable by going to the following URL.
|
|
||||||
${BL}https://${IP}/${CL} \n"
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue