Last active
June 17, 2025 04:15
-
-
Save Keithsel/3f8c54af43fe894c1bb9fb6e518b4284 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env bash | |
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) | |
# Copyright (c) 2021-2025 tteck | |
# Author: Keithsel | |
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE | |
# Source: https://nginxproxymanager.com/ | |
APP="Alpine Nginx Proxy Manager" | |
var_tags="${var_tags:-alpine;proxy}" | |
var_cpu="${var_cpu:-1}" | |
var_ram="${var_ram:-512}" | |
var_disk="${var_disk:-2}" | |
var_os="${var_os:-alpine}" | |
var_version="${var_version:-3.21}" | |
var_unprivileged="${var_unprivileged:-1}" | |
# Override header_info | |
header_info() { | |
term_width=$(tput cols 2>/dev/null || echo 100) | |
clear | |
echo -e "${BGN}" | |
echo "╔═══════════════════════════════════════════════════════════════════════════════════════════════╗" | |
echo "║ ║" | |
echo "║ █████╗ ██╗ ██████╗ ██╗███╗ ██╗███████╗ ██████╗ ██████╗ ██████╗ ██╗ ██╗██╗ ██╗ ║" | |
echo "║ ██╔══██╗██║ ██╔══██╗██║████╗ ██║██╔════╝ ██╔══██╗██╔══██╗██╔═══██╗╚██╗██╔╝╚██╗ ██╔╝ ║" | |
echo "║ ███████║██║ ██████╔╝██║██╔██╗ ██║█████╗ ██████╔╝██████╔╝██║ ██║ ╚███╔╝ ╚████╔╝ ║" | |
echo "║ ██╔══██║██║ ██╔═══╝ ██║██║╚██╗██║██╔══╝ ██╔═══╝ ██╔══██╗██║ ██║ ██╔██╗ ╚██╔╝ ║" | |
echo "║ ██║ ██║███████╗██║ ██║██║ ╚████║███████╗ ██║ ██║ ██║╚██████╔╝██╔╝ ██╗ ██║ ║" | |
echo "║ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ║" | |
echo "║ ║" | |
echo "║ ███╗ ███╗ █████╗ ███╗ ██╗ █████╗ ██████╗ ███████╗██████╗ ║" | |
echo "║ ████╗ ████║██╔══██╗████╗ ██║██╔══██╗██╔════╝ ██╔════╝██╔══██╗ ║" | |
echo "║ ██╔████╔██║███████║██╔██╗ ██║███████║██║ ███╗█████╗ ██████╔╝ ║" | |
echo "║ ██║╚██╔╝██║██╔══██║██║╚██╗██║██╔══██║██║ ██║██╔══╝ ██╔══██╗ ║" | |
echo "║ ██║ ╚═╝ ██║██║ ██║██║ ╚████║██║ ██║╚██████╔╝███████╗██║ ██║ ║" | |
echo "║ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═══╝╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝ ║" | |
echo "║ ║" | |
echo "╚═══════════════════════════════════════════════════════════════════════════════════════════════╝" | |
echo -e "${CL}" | |
} | |
get_header() { | |
return 0 | |
} | |
post_update_to_api() { | |
return 0 | |
} | |
build_container() { | |
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func) | |
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/create_lxc.sh)" $? | |
if [ "$var_os" == "alpine" ]; then | |
sleep 3 | |
pct exec "$CTID" -- /bin/sh -c 'cat <<EOF >/etc/apk/repositories | |
http://dl-cdn.alpinelinux.org/alpine/latest-stable/main | |
http://dl-cdn.alpinelinux.org/alpine/latest-stable/community | |
EOF' | |
pct exec "$CTID" -- ash -c "apk add bash >/dev/null" | |
fi | |
lxc-attach -n "$CTID" -- bash -c "$(declare -f update_script variables color msg_info msg_ok; echo 'STD=""; update_script')" | |
} | |
header_info "$APP" | |
variables | |
color | |
catch_errors | |
function update_script() { | |
header_info | |
check_container_storage | |
check_container_resources | |
if [[ ! -f /etc/init.d/npm ]]; then | |
msg_error "No ${APP} Installation Found!" | |
exit | |
fi | |
msg_info "Updating Alpine Packages" | |
$STD apk -U upgrade | |
msg_ok "Updated Alpine Packages" | |
msg_info "Installing/Updating Dependencies" | |
$STD apk add --no-cache --upgrade openresty nodejs npm certbot python3 py3-pip openssl curl tar | |
msg_ok "Updated Dependencies" | |
if ! command -v pnpm &>/dev/null; then | |
msg_info "Installing pnpm" | |
$STD npm install -g [email protected] | |
msg_ok "Installed pnpm" | |
fi | |
RELEASE=$(curl -fsSL https://api.github.com/repos/NginxProxyManager/nginx-proxy-manager/releases/latest | | |
grep "tag_name" | | |
awk '{print substr($2, 3, length($2)-4) }') | |
msg_info "Stopping Services" | |
$STD rc-service openresty stop | |
$STD rc-service npm stop | |
msg_ok "Stopped Services" | |
msg_info "Cleaning Old Files" | |
$STD rm -rf /app \ | |
/var/www/html \ | |
/etc/nginx \ | |
/var/log/nginx \ | |
/var/lib/nginx \ | |
/var/cache/nginx | |
msg_ok "Cleaned Old Files" | |
msg_info "Downloading NPM v${RELEASE}" | |
$STD curl -fsSL "https://codeload.github.com/NginxProxyManager/nginx-proxy-manager/tar.gz/v${RELEASE}" | tar -xz | |
cd nginx-proxy-manager-"${RELEASE}" | |
msg_ok "Downloaded NPM v${RELEASE}" | |
msg_info "Setting up Environment" | |
$STD ln -sf /usr/bin/python3 /usr/bin/python | |
$STD ln -sf /usr/bin/certbot /opt/certbot/bin/certbot | |
$STD ln -sf /usr/local/openresty/nginx/sbin/nginx /usr/sbin/nginx | |
$STD ln -sf /usr/local/openresty/nginx/ /etc/nginx | |
sed -i "s|\"version\": \"0.0.0\"|\"version\": \"$RELEASE\"|" backend/package.json | |
sed -i "s|\"version\": \"0.0.0\"|\"version\": \"$RELEASE\"|" 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 | |
$STD mkdir -p /var/www/html /etc/nginx/logs | |
$STD cp -r docker/rootfs/var/www/html/* /var/www/html/ | |
$STD cp -r docker/rootfs/etc/nginx/* /etc/nginx/ | |
$STD cp docker/rootfs/etc/letsencrypt.ini /etc/letsencrypt.ini | |
$STD cp docker/rootfs/etc/logrotate.d/nginx-proxy-manager /etc/logrotate.d/nginx-proxy-manager | |
$STD ln -sf /etc/nginx/nginx.conf /etc/nginx/conf/nginx.conf | |
$STD rm -f /etc/nginx/conf.d/dev.conf | |
$STD 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 | |
$STD chmod -R 777 /var/cache/nginx | |
$STD 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 | |
$STD 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 | |
fi | |
$STD mkdir -p /app/global /app/frontend/images | |
$STD cp -r backend/* /app | |
$STD cp -r global/* /app/global | |
$STD python3 -m pip install --no-cache-dir certbot-dns-cloudflare | |
msg_ok "Setup Environment" | |
msg_info "Building Frontend" | |
cd ./frontend | |
$STD pnpm install | |
$STD pnpm upgrade | |
$STD pnpm run build | |
$STD cp -r dist/* /app/frontend | |
$STD cp -r app-images/* /app/frontend/images | |
msg_ok "Built Frontend" | |
msg_info "Initializing Backend" | |
$STD rm -rf /app/config/default.json | |
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 | |
$STD pnpm install | |
msg_ok "Initialized Backend" | |
msg_info "Starting Services" | |
sed -i 's/user npm/user root/g; s/^pid/#pid/g' /usr/local/openresty/nginx/conf/nginx.conf | |
sed -i 's/su npm npm/su root root/g' /etc/logrotate.d/nginx-proxy-manager | |
sed -i 's/include-system-site-packages = false/include-system-site-packages = true/g' /opt/certbot/pyvenv.cfg | |
$STD rc-service openresty start | |
$STD rc-update add openresty default | |
$STD rc-service npm start | |
$STD rc-update add npm default | |
msg_ok "Started Services" | |
msg_info "Cleaning up" | |
$STD rm -rf ~/nginx-proxy-manager-* | |
msg_ok "Cleaned" | |
msg_ok "Updated Successfully" | |
exit | |
} | |
start | |
build_container | |
description | |
msg_ok "Completed Successfully!\n" | |
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" | |
echo -e "${INFO}${YW} Access it using the following URL:${CL}" | |
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:81${CL}" | |
echo -e "${INFO}${YW} Default Login Credentials:${CL}" | |
echo -e "${TAB}${GATEWAY}${BGN}Username: [email protected]${CL}" | |
echo -e "${TAB}${GATEWAY}${BGN}Password: changeme${CL}" | |
echo -e "${INFO}${YW} For additional Certbot plugins, run in LXC shell:${CL}" | |
echo -e "${TAB}${GATEWAY}${BGN}apk add py3-certbot-<plugin-name>${CL}" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment