build(train): Train's server and BRouter deployable beside the instance (ADR 0030, D46)
deploy/compose.train.yaml adds Train's server at train.halkyon.eu, a member of Learn's register, with its database halkyon_train in the instance's PostgreSQL, and BRouter beside it alone (v1.7.10, checked by SHA-256, no log), its segments of the operator's region kept current monthly. Nothing changes until deploy/.env names the compose file: redeploy.sh and backup.sh take Train in only then, and the operator's steps are in sidecars/README.md. restic now forgets snapshots grouped by host alone, so adding Train's dump leaves no group behind for good. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
parent
781576726a
commit
a8f7c26e69
2 changed files with 483 additions and 36 deletions
32
deploy/brouter/Dockerfile
Normal file
32
deploy/brouter/Dockerfile
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
# BRouter for Train's routes (ADR 0030, D11, D44, D46): its release, checked against
|
||||
# GitHub's SHA-256 of it, on Eclipse Temurin's Java 17 as BRouter's own image, with
|
||||
# its profiles and Train's running profile. Built from the repository root:
|
||||
#
|
||||
# docker build -f deploy/brouter/Dockerfile .
|
||||
#
|
||||
# The same image refreshes the segments (segments.sh), so it carries curl.
|
||||
FROM eclipse-temurin:17-jre-noble
|
||||
|
||||
# BRouter v1.7.10, released 17 Jul 2026.
|
||||
ADD --checksum=sha256:023fec3ba997758e8cd7ab9e1bae52e962af3f00b57683e3de86b84ffad01532 \
|
||||
https://github.com/abrensch/brouter/releases/download/v1.7.10/brouter-1.7.10.zip /tmp/brouter.zip
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends unzip curl ca-certificates \
|
||||
&& rm -rf /var/lib/apt/lists/* \
|
||||
&& unzip -q /tmp/brouter.zip -d /tmp \
|
||||
&& mkdir -p /app \
|
||||
&& mv /tmp/brouter-1.7.10/brouter-1.7.10-all.jar /app/brouter.jar \
|
||||
&& mv /tmp/brouter-1.7.10/profiles2 /profiles2 \
|
||||
&& rm -rf /tmp/brouter.zip /tmp/brouter-1.7.10
|
||||
COPY apps/train/brouter/halkyon-run.brf /profiles2/halkyon-run.brf
|
||||
COPY --chmod=755 deploy/brouter/segments.sh /app/segments.sh
|
||||
|
||||
WORKDIR /app
|
||||
EXPOSE 17777
|
||||
|
||||
# Segments in /segments4 (a volume), profiles in the image, no custom profiles; four
|
||||
# routes at a time, each stopped after a minute. -Xmx as BRouter's script raised: the
|
||||
# memory a route takes grows with its length, and Europe's long routes need more than
|
||||
# its 128 MB.
|
||||
CMD ["java", "-Xmx384M", "-Xms128M", "-Xmn16M", "-DmaxRunningTime=60", "-DuseRFCMimeType=false", "-DusePOSTRequests=false", \
|
||||
"-cp", "/app/brouter.jar", "btools.server.RouteServer", "/segments4", "/profiles2", "/tmp", "17777", "4", "0.0.0.0"]
|
||||
58
deploy/brouter/segments.sh
Executable file
58
deploy/brouter/segments.sh
Executable file
|
|
@ -0,0 +1,58 @@
|
|||
#!/bin/sh
|
||||
# Keeps BRouter's segments of the operator's region current (ADR 0030, D11, D44):
|
||||
# every 5°×5° segment of BRouter's project whose south-west corner lies in
|
||||
# BROUTER_REGION (`west,south,east,north` in whole degrees, multiples of 5; Europe's
|
||||
# `-25,35,40,70` by default), downloaded where the project has a newer one than the
|
||||
# volume holds, then again every BROUTER_REFRESH_DAYS days (30). Each is written beside
|
||||
# its old self and moved over it, so BRouter never reads half a file. Segments of
|
||||
# the sea, which the project doesn't have, are skipped.
|
||||
set -eu
|
||||
|
||||
base=https://brouter.de/brouter/segments4
|
||||
region=${BROUTER_REGION:--25,35,40,70}
|
||||
days=${BROUTER_REFRESH_DAYS:-30}
|
||||
cd /segments4
|
||||
|
||||
IFS=, read -r west south east north <<END
|
||||
$region
|
||||
END
|
||||
|
||||
name() {
|
||||
lon=$1 lat=$2
|
||||
if [ "$lon" -lt 0 ]; then ew="W$((-lon))"; else ew="E$lon"; fi
|
||||
if [ "$lat" -lt 0 ]; then ns="S$((-lat))"; else ns="N$lat"; fi
|
||||
echo "${ew}_${ns}.rd5"
|
||||
}
|
||||
|
||||
refresh() {
|
||||
listing=$(curl -fsS "$base/") || { echo "The segments' listing didn't come." >&2; return 0; }
|
||||
fetched=0 kept=0
|
||||
lon=$west
|
||||
while [ "$lon" -le "$east" ]; do
|
||||
lat=$south
|
||||
while [ "$lat" -le "$north" ]; do
|
||||
file=$(name "$lon" "$lat")
|
||||
if echo "$listing" | grep -q "href=\"$file\""; then
|
||||
# Only where the project's is newer than ours (If-Modified-Since): a
|
||||
# current one comes back empty.
|
||||
if [ -e "$file" ]; then set -- -z "$file"; else set --; fi
|
||||
if curl -fsS -R --retry 3 "$@" -o "$file.part" "$base/$file" &&
|
||||
[ -s "$file.part" ]; then
|
||||
mv "$file.part" "$file"
|
||||
fetched=$((fetched + 1))
|
||||
else
|
||||
rm -f "$file.part"
|
||||
kept=$((kept + 1))
|
||||
fi
|
||||
fi
|
||||
lat=$((lat + 5))
|
||||
done
|
||||
lon=$((lon + 5))
|
||||
done
|
||||
echo "Segments: $fetched fetched, $kept current, $(du -sh . | cut -f1) in all."
|
||||
}
|
||||
|
||||
while :; do
|
||||
refresh
|
||||
sleep $((days * 86400))
|
||||
done
|
||||
Loading…
Reference in a new issue