mempool/production/nginx-cache-warmer-ssr

223 lines
4.7 KiB
Bash
Executable file

#!/usr/bin/env zsh
delay=0.15
hostname=$(hostname)
#services_host=""
protocol="https"
base_domain="mempool.space"
list_refresh_interval=60
dry_run=0
if [[ "$1" == "--dry-run" ]]; then
dry_run=1
hostname="${2:-mempool.space}"
services_host="${3:-}"
protocol="http"
delay=0
fi
typeset -a custom_domains
typeset -a subdomain_names
last_refresh=0
warm()
{
local host_header="$2"
if [[ -n "$host_header" ]]; then
echo "${protocol}://${hostname}$1 (Host: $host_header)"
[[ $dry_run -eq 0 ]] && curl -o /dev/null -s -H "Host: $host_header" "${protocol}://${hostname}$1"
else
echo "${protocol}://$1"
[[ $dry_run -eq 0 ]] && curl -o /dev/null -s "${protocol}://$1"
fi
}
warmSip()
{
local host_header="$2"
if [[ -n "$host_header" ]]; then
echo "${protocol}://${hostname}$1 (Host: $host_header)"
[[ $dry_run -eq 0 ]] && curl -o /dev/null -s -H "Host: $host_header" -H 'User-Agent: Googlebot' "${protocol}://${hostname}$1"
else
echo "${protocol}://$1"
[[ $dry_run -eq 0 ]] && curl -o /dev/null -s -H 'User-Agent: Googlebot' "${protocol}://$1"
fi
}
warmUnfurl()
{
local host_header="$2"
if [[ -n "$host_header" ]]; then
echo "${protocol}://${hostname}$1 (Host: $host_header)"
[[ $dry_run -eq 0 ]] && curl -o /dev/null -s -H "Host: $host_header" -H 'User-Agent: Twitterbot' "${protocol}://${hostname}$1"
else
echo "${protocol}://$1"
[[ $dry_run -eq 0 ]] && curl -o /dev/null -s -H 'User-Agent: Twitterbot' "${protocol}://$1"
fi
}
sipURLs=(
'/'
'/mining'
'/lightning'
'/graphs'
'/docs'
'/docs/faq'
'/docs/api/rest'
'/about'
)
unfurlURLs=(
'/'
'/mining'
'/lightning'
)
staticImageTypes=(
'header'
'footer'
'unfurl'
'android_chrome_512'
'android_chrome_192'
'apple_touch'
'favicon_32'
'favicon_16'
'favicon'
'mstile'
'site.webmanifest'
'browserconfig.xml'
)
refresh_dynamic_endpoints()
{
echo "refreshing dynamic endpoint lists..."
custom_domains=()
subdomain_names=()
local api_host="${services_host:-$hostname}"
local dashboard_list
dashboard_list=$(curl -sSL "${protocol}://${api_host}/api/v1/internal/enterprise/dashboard/list" 2>/dev/null)
if [[ -n "$dashboard_list" && "$dashboard_list" != "null" ]]; then
local dashboards
dashboards=($(jq -r '.[]' <<< "$dashboard_list" 2>/dev/null))
for dashboard in $dashboards; do
local config
config=$(curl -sSL "${protocol}://${api_host}/api/v1/internal/enterprise/dashboard/${dashboard}" 2>/dev/null)
if [[ -n "$config" && "$config" != "null" ]]; then
local domains
domains=($(jq -r '.domains[]' <<< "$config" 2>/dev/null))
for domain in $domains; do
if [[ "$domain" != *.* ]]; then
domain="${domain}.${base_domain}"
fi
custom_domains+=("$domain")
done
fi
done
fi
local subdomains
subdomains=$(curl -sSL "${protocol}://${api_host}/api/v1/internal/enterprise/subdomains" 2>/dev/null)
if [[ -n "$subdomains" && "$subdomains" != "null" ]]; then
local names
names=($(jq -r '.[].name' <<< "$subdomains" 2>/dev/null))
for name in $names; do
local is_custom=0
for cd in $custom_domains; do
if [[ "$cd" == "$name" || "$cd" == "${name}.${base_domain}" ]]; then
is_custom=1
break
fi
done
if [[ $is_custom -eq 0 ]]; then
subdomain_names+=("$name")
fi
done
fi
echo "found ${#custom_domains[@]} custom dashboard domains and ${#subdomain_names[@]} subdomains"
last_refresh=$(date +%s)
}
if [[ $dry_run -eq 0 ]]; then
echo "waiting for mempool backend and SSR daemon to start..."
sleep 60
fi
refresh_dynamic_endpoints
while true
do
echo "starting SSR warm cache cycle..."
current_time=$(date +%s)
if (( current_time - last_refresh >= list_refresh_interval )); then
refresh_dynamic_endpoints
fi
for url in $sipURLs
do
warmSip "${hostname}${url}"
sleep $delay
done
for url in $unfurlURLs
do
warmUnfurl "${hostname}${url}"
sleep $delay
done
for domain in $custom_domains
do
warm "/" "$domain"
sleep $delay
for url in $sipURLs
do
warmSip "$url" "$domain"
sleep $delay
done
for url in $unfurlURLs
do
warmUnfurl "$url" "$domain"
sleep $delay
done
done
for name in $subdomain_names
do
local subdomain_host="${name}.${base_domain}"
warm "/" "$subdomain_host"
sleep $delay
for url in $sipURLs
do
warmSip "$url" "$subdomain_host"
sleep $delay
done
for url in $unfurlURLs
do
warmUnfurl "$url" "$subdomain_host"
sleep $delay
done
done
for domain in $custom_domains
do
for imageType in $staticImageTypes
do
warm "/ssr/static/${imageType}" "$domain"
sleep $delay
done
done
for name in $subdomain_names
do
local subdomain_host="${name}.${base_domain}"
for imageType in $staticImageTypes
do
warm "/ssr/static/${imageType}" "$subdomain_host"
sleep $delay
done
done
[[ $dry_run -eq 1 ]] && break
sleep 1
done