mirror of
https://github.com/tteck/Proxmox.git
synced 2025-02-15 06:09:15 +01:00
When running certain scripts, sometimes an 'm' character is wrongly output to the terminal. This PR fixes all instances of this happening. I've also made 'RD' (red) consistent with 'GN' (green) by removing the leading 0, and my editor has kindly removed all trailing spaces from files.
262 lines
7.5 KiB
Bash
262 lines
7.5 KiB
Bash
#!/usr/bin/env bash
|
|
YW=`echo "\033[33m"`
|
|
RD=`echo "\033[1;31m"`
|
|
BL=`echo "\033[36m"`
|
|
GN=`echo "\033[1;92m"`
|
|
CL=`echo "\033[0m"`
|
|
RETRY_NUM=10
|
|
RETRY_EVERY=3
|
|
NUM=$RETRY_NUM
|
|
CM="${GN}✓${CL}"
|
|
CROSS="${RD}✗${CL}"
|
|
BFR="\\r\\033[K"
|
|
HOLD="-"
|
|
set -o errexit
|
|
set -o errtrace
|
|
set -o nounset
|
|
set -o pipefail
|
|
shopt -s expand_aliases
|
|
alias die='EXIT=$? LINE=$LINENO error_exit'
|
|
trap die ERR
|
|
|
|
function error_exit() {
|
|
trap - ERR
|
|
local reason="Unknown failure occurred."
|
|
local msg="${1:-$reason}"
|
|
local flag="${RD}‼ ERROR ${CL}$EXIT@$LINE"
|
|
echo -e "$flag $msg" 1>&2
|
|
exit $EXIT
|
|
}
|
|
|
|
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 "
|
|
sed -i "/$LANG/ s/\(^# \)//" /etc/locale.gen
|
|
locale-gen >/dev/null
|
|
while [ "$(hostname -I)" = "" ]; do
|
|
1>&2 echo -en "${CROSS}${RD} No Network! "
|
|
sleep $RETRY_EVERY
|
|
((NUM--))
|
|
if [ $NUM -eq 0 ]
|
|
then
|
|
1>&2 echo -e "${CROSS}${RD} No Network After $RETRY_NUM Tries${CL}"
|
|
exit 1
|
|
fi
|
|
done
|
|
msg_ok "Set up Container OS"
|
|
msg_ok "Network Connected: ${BL}$(hostname -I)"
|
|
|
|
if nc -zw1 8.8.8.8 443; then msg_ok "Internet Connected"; else msg_error "Internet NOT Connected"; exit 1; fi;
|
|
RESOLVEDIP=$(nslookup "github.com" | awk -F':' '/^Address: / { matched = 1 } matched { print $2}' | xargs)
|
|
if [[ -z "$RESOLVEDIP" ]]; then msg_error "DNS Lookup Failure"; else msg_ok "DNS Resolved github.com to $RESOLVEDIP"; fi;
|
|
|
|
msg_info "Updating Container OS"
|
|
apt-get update &>/dev/null
|
|
apt-get -y upgrade &>/dev/null
|
|
msg_ok "Updated Container OS"
|
|
|
|
msg_info "Installing Dependencies"
|
|
apt-get update &>/dev/null
|
|
apt-get -y install \
|
|
sudo \
|
|
curl \
|
|
gnupg \
|
|
make \
|
|
g++ \
|
|
gcc \
|
|
ca-certificates \
|
|
apache2-utils \
|
|
logrotate \
|
|
build-essential \
|
|
python3-dev \
|
|
git \
|
|
lsb-release &>/dev/null
|
|
msg_ok "Installed Dependencies"
|
|
|
|
msg_info "Installing Python"
|
|
apt-get install -y -q --no-install-recommends python3 python3-pip python3-venv &>/dev/null
|
|
pip3 install --upgrade setuptools &>/dev/null
|
|
pip3 install --upgrade pip &>/dev/null
|
|
python3 -m venv /opt/certbot/ &>/dev/null
|
|
if [ "$(getconf LONG_BIT)" = "32" ]; then
|
|
python3 -m pip install --no-cache-dir -U cryptography==3.3.2 &>/dev/null
|
|
fi
|
|
python3 -m pip install --no-cache-dir cffi certbot &>/dev/null
|
|
msg_ok "Installed Python"
|
|
|
|
msg_info "Installing Openresty"
|
|
wget -q -O - https://openresty.org/package/pubkey.gpg | apt-key add - &>/dev/null
|
|
codename=`grep -Po 'VERSION="[0-9]+ \(\K[^)]+' /etc/os-release` &>/dev/null
|
|
echo "deb http://openresty.org/package/debian $codename openresty" | tee /etc/apt/sources.list.d/openresty.list &>/dev/null
|
|
apt-get -y update &>/dev/null
|
|
apt-get -y install --no-install-recommends openresty &>/dev/null
|
|
msg_ok "Installed Openresty"
|
|
|
|
msg_info "Setting up Node.js Repository"
|
|
curl -fsSL https://deb.nodesource.com/setup_16.x | bash - &>/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 Yarn"
|
|
npm install --global yarn &>/dev/null
|
|
msg_ok "Installed Yarn"
|
|
|
|
RELEASE=$(curl -s https://api.github.com/repos/NginxProxyManager/nginx-proxy-manager/releases/latest \
|
|
| grep "tag_name" \
|
|
| awk '{print substr($2, 3, length($2)-4) }') \
|
|
|
|
msg_info "Downloading Nginx Proxy Manager v${RELEASE}"
|
|
wget -q https://codeload.github.com/NginxProxyManager/nginx-proxy-manager/tar.gz/v${RELEASE} -O - | tar -xz &>/dev/null
|
|
cd ./nginx-proxy-manager-${RELEASE}
|
|
msg_ok "Downloaded Nginx Proxy Manager v${RELEASE}"
|
|
|
|
msg_info "Setting up Enviroment"
|
|
ln -sf /usr/bin/python3 /usr/bin/python
|
|
ln -sf /usr/bin/certbot /opt/certbot/bin/certbot
|
|
ln -sf /usr/local/openresty/nginx/sbin/nginx /usr/sbin/nginx
|
|
ln -sf /usr/local/openresty/nginx/ /etc/nginx
|
|
|
|
sed -i "s+0.0.0+${RELEASE}+g" backend/package.json
|
|
sed -i "s+0.0.0+${RELEASE}+g" frontend/package.json
|
|
|
|
sed -i 's+^daemon+#daemon+g' docker/rootfs/etc/nginx/nginx.conf
|
|
NGINX_CONFS=$(find "$(pwd)" -type f -name "*.conf")
|
|
for NGINX_CONF in $NGINX_CONFS; do
|
|
sed -i 's+include conf.d+include /etc/nginx/conf.d+g' "$NGINX_CONF"
|
|
done
|
|
|
|
mkdir -p /var/www/html /etc/nginx/logs
|
|
cp -r docker/rootfs/var/www/html/* /var/www/html/
|
|
cp -r docker/rootfs/etc/nginx/* /etc/nginx/
|
|
cp docker/rootfs/etc/letsencrypt.ini /etc/letsencrypt.ini
|
|
cp docker/rootfs/etc/logrotate.d/nginx-proxy-manager /etc/logrotate.d/nginx-proxy-manager
|
|
ln -sf /etc/nginx/nginx.conf /etc/nginx/conf/nginx.conf
|
|
rm -f /etc/nginx/conf.d/dev.conf
|
|
|
|
mkdir -p /tmp/nginx/body \
|
|
/run/nginx \
|
|
/data/nginx \
|
|
/data/custom_ssl \
|
|
/data/logs \
|
|
/data/access \
|
|
/data/nginx/default_host \
|
|
/data/nginx/default_www \
|
|
/data/nginx/proxy_host \
|
|
/data/nginx/redirection_host \
|
|
/data/nginx/stream \
|
|
/data/nginx/dead_host \
|
|
/data/nginx/temp \
|
|
/var/lib/nginx/cache/public \
|
|
/var/lib/nginx/cache/private \
|
|
/var/cache/nginx/proxy_temp
|
|
|
|
chmod -R 777 /var/cache/nginx
|
|
chown root /tmp/nginx
|
|
|
|
echo resolver "$(awk 'BEGIN{ORS=" "} $1=="nameserver" {print ($2 ~ ":")? "["$2"]": $2}' /etc/resolv.conf);" > /etc/nginx/conf.d/include/resolvers.conf
|
|
|
|
if [ ! -f /data/nginx/dummycert.pem ] || [ ! -f /data/nginx/dummykey.pem ]; then
|
|
echo -en "${GN} Generating dummy SSL Certificate... "
|
|
openssl req -new -newkey rsa:2048 -days 3650 -nodes -x509 -subj "/O=Nginx Proxy Manager/OU=Dummy Certificate/CN=localhost" -keyout /data/nginx/dummykey.pem -out /data/nginx/dummycert.pem &>/dev/null
|
|
fi
|
|
|
|
mkdir -p /app/global /app/frontend/images
|
|
cp -r backend/* /app
|
|
cp -r global/* /app/global
|
|
msg_ok "Set up Enviroment"
|
|
|
|
msg_info "Building Frontend"
|
|
cd ./frontend
|
|
export NODE_ENV=development
|
|
yarn install --network-timeout=30000 &>/dev/null
|
|
yarn build &>/dev/null
|
|
cp -r dist/* /app/frontend
|
|
cp -r app-images/* /app/frontend/images
|
|
msg_ok "Built Frontend"
|
|
|
|
msg_info "Initializing Backend"
|
|
rm -rf /app/config/default.json &>/dev/null
|
|
if [ ! -f /app/config/production.json ]; then
|
|
cat << 'EOF' > /app/config/production.json
|
|
{
|
|
"database": {
|
|
"engine": "knex-native",
|
|
"knex": {
|
|
"client": "sqlite3",
|
|
"connection": {
|
|
"filename": "/data/database.sqlite"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
EOF
|
|
fi
|
|
cd /app
|
|
export NODE_ENV=development
|
|
yarn install --network-timeout=30000 &>/dev/null
|
|
msg_ok "Initialized Backend"
|
|
|
|
msg_info "Creating Service"
|
|
cat << 'EOF' > /lib/systemd/system/npm.service
|
|
[Unit]
|
|
Description=Nginx Proxy Manager
|
|
After=network.target
|
|
Wants=openresty.service
|
|
|
|
[Service]
|
|
Type=simple
|
|
Environment=NODE_ENV=production
|
|
ExecStartPre=-mkdir -p /tmp/nginx/body /data/letsencrypt-acme-challenge
|
|
ExecStart=/usr/bin/node index.js --abort_on_uncaught_exception --max_old_space_size=250
|
|
WorkingDirectory=/app
|
|
Restart=on-failure
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
EOF
|
|
msg_ok "Created Service"
|
|
|
|
PASS=$(grep -w "root" /etc/shadow | cut -b6);
|
|
if [[ $PASS != $ ]]; then
|
|
msg_info "Customizing Container"
|
|
rm /etc/motd
|
|
rm /etc/update-motd.d/10-uname
|
|
touch ~/.hushlogin
|
|
GETTY_OVERRIDE="/etc/systemd/system/container-getty@1.service.d/override.conf"
|
|
mkdir -p $(dirname $GETTY_OVERRIDE)
|
|
cat << EOF > $GETTY_OVERRIDE
|
|
[Service]
|
|
ExecStart=
|
|
ExecStart=-/sbin/agetty --autologin root --noclear --keep-baud tty%I 115200,38400,9600 \$TERM
|
|
EOF
|
|
systemctl daemon-reload
|
|
systemctl restart $(basename $(dirname $GETTY_OVERRIDE) | sed 's/\.d//')
|
|
msg_ok "Customized Container"
|
|
fi
|
|
|
|
msg_info "Starting Services"
|
|
systemctl enable npm &>/dev/null
|
|
systemctl start openresty
|
|
systemctl start npm
|
|
msg_ok "Started Services"
|
|
|
|
msg_info "Cleaning up"
|
|
apt-get autoremove >/dev/null
|
|
apt-get autoclean >/dev/null
|
|
msg_ok "Cleaned"
|