AdGuardHome-Alpine LXC (#1181)

* Alpine AdGuardHome LXC

* fixed update part

* removed debug URL for 2nd script

* Get rid of wget on Alpine Linux

Now we can curl everything, one package less on installation :)

Get rid of Midnight Commander package, I never used it in any LXC, I guess that is from debugging there right?

* reverted back to wget as tteck recommends

* Check AdGuard WebUI Setup is done

this is needed if anyone runs the updatescript without having run the setup in the webui before.

This will lead to an error in on the cp command for the backup.

Made a check around that :)

* added update menu + recommendations

* cp -rf makes it more simple

thank you @tteck
pull/1185/head
nicedevil007 2 years ago committed by GitHub
parent e943987ea2
commit 93bd5487a8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 486
      ct/alpine-adguard-v5.sh
  2. 123
      install/alpine-adguard-v5-install.sh

@ -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______ __________/ /
/ /| |/ __ / __ / / / / __ / ___/ __ /
/ ___ / /_/ / /_/ / /_/ / /_/ / / / /_/ /
/_/ |_\__,_/\__, /\__,_/\__,_/_/ \__,_/
/____/
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"
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
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 && [[ ! -f /opt/AdGuardHome ]]; then
msg_error "No ${APP} Installation Found!"
fi
if ! command -v pveversion >/dev/null 2>&1; then
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 -- 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"

@ -0,0 +1,123 @@
#!/bin/sh
# Copyright (c) 2021-2023 tteck
# Author: tteck (tteckster)
# License: MIT
# https://github.com/tteck/Proxmox/raw/main/LICENSE
if [ "$VERBOSE" = "yes" ]; then set -x; STD=""; else STD="silent"; fi
silent() { "$@" > /dev/null 2>&1; }
if [ "$DISABLEIPV6" == "yes" ]; then
$STD sysctl net.ipv6.conf.all.disable_ipv6=1
$STD sysctl net.ipv6.conf.default.disable_ipv6=1
echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.d/99-sysctl.conf
echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.d/99-sysctl.conf
$STD sysctl -p /etc/sysctl.d/99-sysctl.conf
fi
YW=$(echo "\033[33m")
RD=$(echo "\033[01;31m")
BL=$(echo "\033[36m")
GN=$(echo "\033[1;92m")
CL=$(echo "\033[m")
RETRY_NUM=10
RETRY_EVERY=3
i=$RETRY_NUM
CM="${GN}${CL}"
CROSS="${RD}${CL}"
BFR="\\r\\033[K"
HOLD="-"
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}"
}
msg_info "Setting up Container OS "
while [ $i -gt 0 ]; do
if [ "$(ip addr show | grep 'inet ' | grep -v '127.0.0.1' | awk '{print $2}' | cut -d'/' -f1)" != "" ]; then
break
fi
echo 1>&2 -en "${CROSS}${RD} No Network! "
sleep $RETRY_EVERY
i=$((i-1))
done
if [ "$(ip addr show | grep 'inet ' | grep -v '127.0.0.1' | awk '{print $2}' | cut -d'/' -f1)" = "" ]; then
echo 1>&2 -e "\n${CROSS}${RD} No Network After $RETRY_NUM Tries${CL}"
echo -e " 🖧 Check Network Settings"
exit 1
fi
cat <<EOF >/etc/apk/repositories
https://dl-cdn.alpinelinux.org/alpine/latest-stable/main
https://dl-cdn.alpinelinux.org/alpine/latest-stable/community
EOF
msg_ok "Set up Container OS"
msg_ok "Network Connected: ${BL}$(ip addr show | grep 'inet ' | awk '{print $2}' | cut -d'/' -f1 | tail -n1)${CL}"
set +e
trap - ERR
if ping -c 1 -W 1 1.1.1.1 &> /dev/null; then msg_ok "Internet Connected"; else
msg_error "Internet NOT Connected"
read -r -p "Would you like to continue anyway? <y/N> " prompt
if echo "$prompt" | grep -Ei "^(y|yes)$" > /dev/null; then
echo -e " ${RD}Expect Issues Without Internet${CL}"
else
echo -e " 🖧 Check Network Settings"
exit 1
fi
fi
RESOLVEDIP=$(getent hosts github.com | awk '{ print $1 }')
if [[ -z "$RESOLVEDIP" ]]; then msg_error "DNS Lookup Failure"; else msg_ok "DNS Resolved github.com to ${BL}$RESOLVEDIP${CL}"; fi
set -e
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
msg_info "Updating Container OS"
$STD apk update
$STD apk upgrade
msg_ok "Updated Container OS"
msg_info "Installing Dependencies"
$STD apk add wget
$STD apk add bash
$STD apk add curl
$STD apk add nano
$STD apk add mc
$STD apk add openssh
msg_ok "Installed Dependencies"
msg_info "Installing AdguardHome"
VER=$(curl --silent -qI https://github.com/AdguardTeam/AdGuardHome/releases/latest | awk -F '/' '/^location/ {print substr($NF, 1, length($NF)-1)}');
$STD wget -q "https://github.com/AdguardTeam/AdGuardHome/releases/download/$VER/AdGuardHome_linux_amd64.tar.gz"
$STD tar -xvf AdGuardHome_linux_amd64.tar.gz >/dev/null 2>&1
$STD mv AdGuardHome /opt
$STD rm AdGuardHome_linux_amd64.tar.gz
$STD chmod +x /opt/AdGuardHome/AdGuardHome
$STD /opt/AdGuardHome/AdGuardHome -s install
$STD /opt/AdGuardHome/AdGuardHome -s start
$STD msg_ok "Installed AdguardHome"
echo -e "$APPLICATION LXC provided by https://tteck.github.io/Proxmox/\n" > /etc/motd
if [[ "${SSH_ROOT}" == "yes" ]]; then
$STD rc-update add sshd
$STD /etc/init.d/sshd start
fi
Loading…
Cancel
Save