From 664596721e2bc9f3a83e7acc1830a58cb5870650 Mon Sep 17 00:00:00 2001 From: uetam3 Date: Sat, 10 Jan 2026 01:20:34 +0100 Subject: [PATCH] init --- Dockerfile | 11 ++++++++++ README.md | 12 +++++++++++ docker-compose.yml | 14 +++++++++++++ warm.sh | 52 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 89 insertions(+) create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 docker-compose.yml create mode 100755 warm.sh diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..4e0828c --- /dev/null +++ b/Dockerfile @@ -0,0 +1,11 @@ +# Dockerfile +FROM alpine:latest + +RUN apk add --no-cache curl bash dcron + +WORKDIR /app + +COPY warm.sh /app/warm.sh +RUN chmod +x /app/warm.sh + +CMD ["sh", "/app/warm.sh"] \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..1943a31 --- /dev/null +++ b/README.md @@ -0,0 +1,12 @@ +To use you must generate file list: example for astro.build + +``` +cd dist && \ + ( \ + find . -name "*.html" \ + | sed 's|^\./||' \ + | sed 's|index.html$||' \ + && \ + find _astro -type f \ + ) | sort -u > files-list.txt +``` \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..e5fde6f --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,14 @@ +version: "3.9" + +services: + cache-warmer: + build: + context: ./ + dockerfile: Dockerfile + environment: + BASE_URL: "https://example.net" + FILE_LIST: "/files-list.txt" + CRON_EXPR: "0 */12 * * *" + USER_AGENT: "Mozilla/5.0" + ACCEPT_ENCODING: "br,gzip" + restart: always diff --git a/warm.sh b/warm.sh new file mode 100755 index 0000000..c0af854 --- /dev/null +++ b/warm.sh @@ -0,0 +1,52 @@ +#!/bin/bash +set -e + +BASE_URL="${BASE_URL:?BASE_URL env not set}" +FILE_LIST="${FILE_LIST:?FILE_LIST env not set}" +CRON_EXPR="${CRON_EXPR:-0 */12 * * *}" +USER_AGENT="${USER_AGENT:-Mozilla/5.0}" +ACCEPT_ENCODING="${ACCEPT_ENCODING:-br,gzip}" + +echo "$(date) - Starting cache warmer for $BASE_URL$FILE_LIST" +echo "Cron schedule: $CRON_EXPR" + +cat << EOF > /app/warm_files.sh +#!/bin/sh +set -e + +BASE_URL="$BASE_URL" +FILE_LIST="$FILE_LIST" +USER_AGENT="$USER_AGENT" +ACCEPT_ENCODING="$ACCEPT_ENCODING" + +echo "\$(date) - Fetching file list from \$BASE_URL\$FILE_LIST" + +# WAŻNE: --compressed automatycznie dekompresuje odpowiedź +FILES=\$(curl -s --compressed -A "\$USER_AGENT" "\$BASE_URL\$FILE_LIST") + +if [ -z "\$FILES" ]; then + echo "\$(date) - File list empty" + exit 1 +fi + +echo "\$FILES" | while read -r url; do + if [ -n "\$url" ]; then + echo "\$(date) - Warming \$BASE_URL/\$url" + curl -s -o /dev/null -A "\$USER_AGENT" -H "Accept-Encoding: \$ACCEPT_ENCODING" "\$BASE_URL/\$url" + fi +done + +echo "\$(date) - Warming completed" +EOF + +chmod +x /app/warm_files.sh +touch /var/log/cron.log + +echo "$(date) - Running initial warming..." +/app/warm_files.sh + +echo "$CRON_EXPR /app/warm_files.sh >> /var/log/cron.log 2>&1" > /etc/crontabs/root + +echo "$(date) - Starting crond..." +crond -f -l 2 & +tail -f /var/log/cron.log \ No newline at end of file