From 2d89475f0b9648e5efcf827d3e01356ee84b5465 Mon Sep 17 00:00:00 2001 From: Joe Carstairs Date: Thu, 18 Jun 2026 19:59:58 +0100 Subject: renames capsule -> gemini --- README.md | 2 +- capsule.Dockerfile | 38 ---------- capsule/.editorconfig | 2 - capsule/.gitignore | 8 --- capsule/Makefile | 34 --------- capsule/build_loglog.bash | 131 ---------------------------------- capsule/build_longlog.bash | 38 ---------- capsule/build_microlog.bash | 38 ---------- capsule/comitium-data/feeds.txt | 16 ----- capsule/comitium-data/header.gmi | 4 -- capsule/content/feed.gmi | 1 - capsule/content/images | 1 - capsule/content/index.gmi | 17 ----- capsule/content/logs/index.gmi | 8 --- capsule/content/logs/longlog | 1 - capsule/content/subscriptions.gmi | 1 - capsule/microlog | 1 - capsule/run.sh | 5 -- capsule/templates/loglog-header.gmi | 6 -- capsule/templates/longlog-header.gmi | 3 - capsule/templates/microlog-header.gmi | 3 - compose.yml | 6 +- gemini.Dockerfile | 38 ++++++++++ gemini/.editorconfig | 2 + gemini/.gitignore | 8 +++ gemini/Makefile | 34 +++++++++ gemini/build_loglog.bash | 131 ++++++++++++++++++++++++++++++++++ gemini/build_longlog.bash | 38 ++++++++++ gemini/build_microlog.bash | 38 ++++++++++ gemini/comitium-data/feeds.txt | 16 +++++ gemini/comitium-data/header.gmi | 4 ++ gemini/content/feed.gmi | 1 + gemini/content/images | 1 + gemini/content/index.gmi | 17 +++++ gemini/content/logs/index.gmi | 8 +++ gemini/content/logs/longlog | 1 + gemini/content/subscriptions.gmi | 1 + gemini/microlog | 1 + gemini/run.sh | 5 ++ gemini/templates/loglog-header.gmi | 6 ++ gemini/templates/longlog-header.gmi | 3 + gemini/templates/microlog-header.gmi | 3 + 42 files changed, 360 insertions(+), 360 deletions(-) delete mode 100644 capsule.Dockerfile delete mode 100644 capsule/.editorconfig delete mode 100644 capsule/.gitignore delete mode 100644 capsule/Makefile delete mode 100755 capsule/build_loglog.bash delete mode 100755 capsule/build_longlog.bash delete mode 100755 capsule/build_microlog.bash delete mode 100644 capsule/comitium-data/feeds.txt delete mode 100644 capsule/comitium-data/header.gmi delete mode 120000 capsule/content/feed.gmi delete mode 120000 capsule/content/images delete mode 100644 capsule/content/index.gmi delete mode 100644 capsule/content/logs/index.gmi delete mode 120000 capsule/content/logs/longlog delete mode 120000 capsule/content/subscriptions.gmi delete mode 120000 capsule/microlog delete mode 100755 capsule/run.sh delete mode 100644 capsule/templates/loglog-header.gmi delete mode 100644 capsule/templates/longlog-header.gmi delete mode 100644 capsule/templates/microlog-header.gmi create mode 100644 gemini.Dockerfile create mode 100644 gemini/.editorconfig create mode 100644 gemini/.gitignore create mode 100644 gemini/Makefile create mode 100755 gemini/build_loglog.bash create mode 100755 gemini/build_longlog.bash create mode 100755 gemini/build_microlog.bash create mode 100644 gemini/comitium-data/feeds.txt create mode 100644 gemini/comitium-data/header.gmi create mode 120000 gemini/content/feed.gmi create mode 120000 gemini/content/images create mode 100644 gemini/content/index.gmi create mode 100644 gemini/content/logs/index.gmi create mode 120000 gemini/content/logs/longlog create mode 120000 gemini/content/subscriptions.gmi create mode 120000 gemini/microlog create mode 100755 gemini/run.sh create mode 100644 gemini/templates/loglog-header.gmi create mode 100644 gemini/templates/longlog-header.gmi create mode 100644 gemini/templates/microlog-header.gmi diff --git a/README.md b/README.md index dad39c1..bbee836 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Structure: ``` / -├── capsule My Gemini capsule +├── gemini My Gemini capsule ├── smtp A local SMTP server └── http My Website ``` diff --git a/capsule.Dockerfile b/capsule.Dockerfile deleted file mode 100644 index e959d35..0000000 --- a/capsule.Dockerfile +++ /dev/null @@ -1,38 +0,0 @@ -FROM alpine:3.23 AS agate -RUN apk --update --no-cache add rust cargo \ - && wget -O - https://github.com/mbrubeck/agate/archive/refs/tags/v3.3.20.tar.gz | tar -xz \ - && cargo install --path agate-3.3.20/ \ - && apk del rust cargo \ - && rm -rf agate-3.3.20 agate-target - -FROM alpine:3.23 AS comitium -RUN apk --no-cache add make go scdoc -RUN wget -O - https://git.sr.ht/~nytpu/comitium/archive/v1.8.2.tar.gz | tar -xz \ - && make --directory=comitium-v1.8.2 \ - && mv comitium-v1.8.2/build/comitium /usr/local/bin/comitium \ - && apk del make go scdoc \ - && rm -rf comitium-v1.8.2 - -FROM alpine:3.23 AS final -RUN mkdir -p /var/app/content -WORKDIR /var/app -COPY capsule/.certificates .certificates -RUN crontab -l > crontab.tmp \ - && echo "0 */6 * * * /usr/local/bin/comitium refresh --data /var/app/comitium-data" >> crontab.tmp \ - && crontab crontab.tmp \ - && rm crontab.tmp - -# bash is needed to run the build scripts -# busybox-openrc provides rc-service, which runs crond -# gcc is a dependency for agate -# make is needed to run the Makefile -RUN apk --no-cache add bash busybox-openrc gcc make -RUN rc-update add crond -COPY --from=agate /root/.cargo/bin/agate /usr/local/bin/agate -COPY --from=comitium /usr/local/bin/comitium /usr/local/bin/comitium - -COPY capsule . -COPY common /var/common -RUN make - -CMD ./run.sh diff --git a/capsule/.editorconfig b/capsule/.editorconfig deleted file mode 100644 index 22357a2..0000000 --- a/capsule/.editorconfig +++ /dev/null @@ -1,2 +0,0 @@ -[*] -max_line_length = 99999 diff --git a/capsule/.gitignore b/capsule/.gitignore deleted file mode 100644 index 398c8d1..0000000 --- a/capsule/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -.certificates -content/logs/microlog.gmi -content/logs/longlog.gmi -content/logs/loglog.gmi -tmp-build-loglog-* -comitium-data/feed.gmi -comitium-data/subscriptions.gmi -comitium-data/comitium.json diff --git a/capsule/Makefile b/capsule/Makefile deleted file mode 100644 index eee7273..0000000 --- a/capsule/Makefile +++ /dev/null @@ -1,34 +0,0 @@ -COMITIUM_DATA := comitium-data -TEMPLATES_DIR := templates -MICROLOG_HEADER := $(TEMPLATES_DIR)/microlog-header.gmi -LONGLOG_HEADER := $(TEMPLATES_DIR)/longlog-header.gmi -LOGLOG_HEADER := $(TEMPLATES_DIR)/loglog-header.gmi -MICROLOG_ENTRIES := $(wildcard microlog/*) -LONGLOG_ENTRIES := $(wildcard content/logs/longlog/*) -LOGLOG_TARGET := content/logs/loglog.gmi -FEED_TARGET := $(COMITIUM_DATA)/subscriptions.json $(COMITIUM_DATA)/feed.gmi $(COMITIUM_DATA)/subscriptions.gmi -FEED_OUTPUTS := $(FEED_TARGET) $(COMITIUM_DATA)/subscriptions.json $(COMITIUM_DATA)/feed.gmi $(COMITIUM_DATA)/subscriptions.gmi -MICROLOG_TARGET := content/logs/microlog.gmi -MICROLOG_OUTPUTS := $(MICROLOG_TARGET) $(wildcard content/logs/microlog/*) -LONGLOG_TARGET := content/logs/longlog.gmi - -.DELETE_ON_ERROR: -all: $(MICROLOG_TARGET) $(MICROLOG_OUTPUTS) $(LONGLOG_TARGET) $(LOGLOG_TARGET) $(FEED_OUTPUTS) - -$(MICROLOG_TARGET): $(wildcard microlog/*) $(MICROLOG_HEADER) - bash ./build_microlog.bash - -$(LONGLOG_TARGET): $(LONGLOG_ENTRIES) $(LONGLOG_HEADER) - bash ./build_longlog.bash - -$(LOGLOG_TARGET): $(MICROLOG_TARGET) $(LONGLOG_TARGET) $(LOGLOG_HEADER) - bash ./build_loglog.bash - -$(FEED_TARGET): $(COMITIUM_DATA)/feeds.txt - rm -f $(COMITIUM_DATA)/comitium.json - while read feed; do \ - comitium add --data "$(COMITIUM_DATA)" $$feed; \ - done <$(COMITIUM_DATA)/feeds.txt - -clean: - rm -rf $(MICROLOG_OUTPUTS) $(LONGLOG_TARGET) $(LOGLOG_TARGET) $(FEED_OUTPUTS) diff --git a/capsule/build_loglog.bash b/capsule/build_loglog.bash deleted file mode 100755 index 247da74..0000000 --- a/capsule/build_loglog.bash +++ /dev/null @@ -1,131 +0,0 @@ -#!/bin/bash - -TMP="tmp-build-loglog-$(date +%s%N)" -LOGLOG="content/logs/loglog.gmi" -LOGLOG_HEADER="templates/loglog-header.gmi" - -new_filename() -{ - DATE="$1" - mkdir -p "$TMP/$DATE" - N=0 - while [[ -f "$TMP/$DATE/$N" ]]; do - N=$(( N + 1 )) - done - echo "$TMP/$DATE/$N" -} - -read_log_to_tmp() -{ - LOGPATH="$1" - LOG="$(echo $LOGPATH | sed "s/.*\///g" | sed "s/\.gmi//g")" - CURRENT_POST_HEADING="" - CURRENT_POST_FILENAME="" - while read line; do - if [[ -z "$CURRENT_POST_FILENAME" ]]; then - if [[ "$line" =~ (\#+)\ *([0-9]{4}-[0-9]{2}-[0-9]{2})(\.[0-9]+)?\ * ]]; then - CURRENT_POST_HEADING="${BASH_REMATCH[1]}" - DATE="${BASH_REMATCH[2]}" - CURRENT_POST_FILENAME="$(new_filename $DATE)" - elif [[ "$line" =~ \=\>\ +([^\ ]+)\ +([0-9]{4}-[0-9]{2}-[0-9]{2})(\.[0-9]+)?\ +(.*) ]]; then - HREF="${BASH_REMATCH[1]}" - DATE="${BASH_REMATCH[2]}" - NAME="${BASH_REMATCH[3]}" - FILENAME="$(new_filename $DATE)" - echo " -=> $HREF $DATE $NAME - -From my $LOG. - -=> /logs/$LOG.gmi My $LOG" \ - >> "$FILENAME" - fi - else - if [[ "$line" =~ (\#+)\ *([0-9]{4}-[0-9]{2}-[0-9]{2})\ * ]]; then - echo "From my $LOG. - -=> /logs/$LOG.gmi My $LOG" \ - >> "$CURRENT_POST_FILENAME" - CURRENT_POST_HEADING="${BASH_REMATCH[1]}" - DATE="${BASH_REMATCH[2]}" - CURRENT_POST_FILENAME="$(new_filename $DATE)" - elif [[ "$line" =~ \#.* ]] && ! [[ "$line" =~ ${CURRENT_POST_HEADING}\#.* ]]; then - echo "From my $LOG. - -=> /logs/$LOG.gmi My $LOG" \ - >> "$CURRENT_POST_FILENAME" - CURRENT_POST_HEADING="" - DATE="" - CURRENT_POST_FILENAME="" - else - echo "$line" >> "$CURRENT_POST_FILENAME" - fi - fi - done <$LOGPATH -} - -trim_entries() -{ - ENTRY_DIR="$1" - for entry in $ENTRY_DIR/*; do - while [[ -z "$(head -n 1 "$entry")" && "$(wc -l "$entry" | cut -c1)" -ne 0 ]]; do - tail -n +2 "$entry" | tee "$entry" 1>/dev/null - done - while [[ -z "$(tail -n 1 "$entry")" && "$(wc -l "$entry" | cut -c1)" -ne 0 ]]; do - head -n -1 "$entry" | tee "$entry" 1>/dev/null - done - if [[ -z "$(cat "$entry")" ]]; then - echo "Removing entry $entry: $(cat $entry)" - rm "$entry" - fi - done - if [[ "$(ls "$ENTRY_DIR" | wc -l)" -eq 0 ]]; then - rmdir "$ENTRY_DIR" - fi -} - -append_entries_for_date() -{ - DATE_DIR="$1" - DATE="$(echo "$DATE_DIR" | sed "s/.*\///g")" - echo "## $DATE -" >> "$LOGLOG" - ENTRY_COUNT="$(ls $DATE_DIR | wc -l)" - LAST_ENTRY="$(ls $DATE_DIR | tail -n 1)" - for entry in $DATE_DIR/*; do - cat "$entry" >> "$LOGLOG" - echo "" >> "$LOGLOG" - if [[ "$ENTRY_COUNT" -gt 1 && "$entry" != "$DATE_DIR/$LAST_ENTRY" ]]; then - echo \ ------------------------------------------------------------------------- >> "$LOGLOG" - echo "" >> "$LOGLOG" - fi - done -} - -echo "Cleaning existing loglog..." -rm -f "$LOGLOG" - -echo "Reading logs to temporary files..." -for log in content/logs/*log.gmi; do - read_log_to_tmp "$log" -done - -echo "Trimming entries in temporary files..." -for date in $TMP/*; do - trim_entries "$date" -done - -echo "Copying loglog header..." -cp "$LOGLOG_HEADER" "$LOGLOG" - -echo "Appending entries to loglog..." -dates=($TMP/*) -for ((i=${#dates[@]}-1; i>=0; i--)); do - append_entries_for_date "${dates[i]}" -done - -echo "Cleaning up temporary files..." -rm -rf "$TMP" - -echo "Done." diff --git a/capsule/build_longlog.bash b/capsule/build_longlog.bash deleted file mode 100755 index d23acfa..0000000 --- a/capsule/build_longlog.bash +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash - -LONGLOG="content/logs/longlog.gmi" -LONGLOG_HEADER="templates/longlog-header.gmi" -LONGLOG_SRC_DIR="content/logs/longlog" -HR="-----------------------------------------------------------------------" - -trim_longlog_tail() -{ - while [[ -z "$(tail -n 1 "$LONGLOG")" && "$(wc -l "$LONGLOG" | cut -c1)" -ne 0 ]]; do - head -n -1 "$LONGLOG" | tee "$LONGLOG" 1>/dev/null - done -} - -echo "Cleaning existing longlog..." -rm -f "$LONGLOG" - -echo "Copying longlog header..." -cp "$LONGLOG_HEADER" "$LONGLOG" -trim_longlog_tail -echo "" >> "$LONGLOG" - -echo "Appending entries to longlog..." -posts=(${LONGLOG_SRC_DIR}/*) -for ((i=${#posts[@]}-1; i>=0; i--)); do - post="${posts[i]}" - if [[ "$post" =~ ${LONGLOG_SRC_DIR}/([0-9]{4}-[0-9]{2}-[0-9]{2}(\.[0-9]+)?)\.gmi ]]; then - date="${BASH_REMATCH[1]}" - suffix="${BASH_REMATCH[2]}" - title="$(head -n 1 "${posts[i]}" | sed "s/^\#\+ *//")" - echo "=> /logs/longlog/${date}${suffix}.gmi ${date} ${title}" >> "$LONGLOG" - else - echo "Error: $post does not match format YYYY-MM-DD(.n). Aborting..." - exit 1 - fi -done - -echo "Done." diff --git a/capsule/build_microlog.bash b/capsule/build_microlog.bash deleted file mode 100755 index b3c37dc..0000000 --- a/capsule/build_microlog.bash +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash - -MICROLOG="content/logs/microlog.gmi" -MICROLOG_HEADER="templates/microlog-header.gmi" -MICROLOG_SRC_DIR="microlog" -HR="-----------------------------------------------------------------------" - -trim_microlog_tail() -{ - while [[ -z "$(tail -n 1 "$MICROLOG")" && "$(wc -l "$MICROLOG" | cut -c1)" -ne 0 ]]; do - head -n -1 "$MICROLOG" | tee "$MICROLOG" 1>/dev/null - done -} - -echo "Cleaning existing microlog..." -rm -f "$MICROLOG" - -echo "Copying microlog header..." -cp $MICROLOG_HEADER $MICROLOG -trim_microlog_tail - -echo "Appending entries to microlog..." -posts=(${MICROLOG_SRC_DIR}/*) -for ((i=${#posts[@]}-1; i>=0; i--)); do - if [[ "${posts[i]}" =~ ${MICROLOG_SRC_DIR}/([0-9]{4}-[0-9]{2}-[0-9]{2}(\.[0-9]+)?)\.gmi ]]; then - date="${BASH_REMATCH[1]}" - echo "" >> "$MICROLOG" - echo "## ${date}" >> "$MICROLOG" - echo "" >> "$MICROLOG" - cat "${posts[i]}" >> "$MICROLOG" - trim_microlog_tail - else - echo "Error: ${posts[i]} does not match format YYYY-MM-DD(.n). Aborting..." - exit 1 - fi -done - -echo "Done." diff --git a/capsule/comitium-data/feeds.txt b/capsule/comitium-data/feeds.txt deleted file mode 100644 index 6b5fff2..0000000 --- a/capsule/comitium-data/feeds.txt +++ /dev/null @@ -1,16 +0,0 @@ -gemini://joeac.net/logs/loglog.gmi -gemini://joeac.net/logs/microlog.gmi --watch -gemini://idiomdrottning.org:1965/sub -gemini://spool-five.com:1965/gemlog/index.gmi -gemini://jsreed5.org:1965/feeds/log.xml -https://free-our-feeds.ghost.io/rss -https://www.inkandswitch.com/index.xml -https://euhwc.co.uk/feed/ -https://www.youtube.com/feeds/videos.xml?channel_id=UCVfwlh9XpX2Y_tQfjeln9QA -https://www.youtube.com/feeds/videos.xml?channel_id=UCfJxmjbygyA5KEdzzZv6Pbw -gemini://eph.smol.pub/posts -https://mwgmac.github.io --watch -https://dieterhelm.co.uk/feed/ -https://extinctionrebellion.uk/feed/ -https://pluralistic.net/feed/ -https://podcasts.files.bbci.co.uk/p0gg4k6r.rss "Radical with Amol Rajan" diff --git a/capsule/comitium-data/header.gmi b/capsule/comitium-data/header.gmi deleted file mode 100644 index b7609bb..0000000 --- a/capsule/comitium-data/header.gmi +++ /dev/null @@ -1,4 +0,0 @@ -# joeac's feed aggregator - -Hi! I'm Joe Carstairs, and you've found my feed aggregator. This is a list of -some stuff I think I might read. diff --git a/capsule/content/feed.gmi b/capsule/content/feed.gmi deleted file mode 120000 index c05592d..0000000 --- a/capsule/content/feed.gmi +++ /dev/null @@ -1 +0,0 @@ -../comitium-data/feed.gmi \ No newline at end of file diff --git a/capsule/content/images b/capsule/content/images deleted file mode 120000 index ccc7a5b..0000000 --- a/capsule/content/images +++ /dev/null @@ -1 +0,0 @@ -../../common/images/ \ No newline at end of file diff --git a/capsule/content/index.gmi b/capsule/content/index.gmi deleted file mode 100644 index 88b7303..0000000 --- a/capsule/content/index.gmi +++ /dev/null @@ -1,17 +0,0 @@ -# joeac's capsule - -Hi! I'm Joe Carstairs, and you've found my capsule, gemini://joeac.net. - -=> /logs/longlog.gmi My longlog (for long posts) -=> /logs/microlog.gmi My microlog (for short posts) -=> /logs/loglog.gmi My loglog (all my posts forgathered) -=> /logs/index.gmi An index of all my logs (don't visit this page) -=> /feed.gmi My feed aggregator - -Here are some other ways to 'engage' with me on the so-called 'Internet': - -=> https://joeac.net Web -=> https://www.linkedin.com/in/joe-carstairs-0aa936277/ LinkedIn -=> https://www.facebook.com/joe.carstairs.5 Facebook -=> https://git.joeac.net My own Gitea instance -=> https://github.com/joeacarstairs GitHub diff --git a/capsule/content/logs/index.gmi b/capsule/content/logs/index.gmi deleted file mode 100644 index e9109a8..0000000 --- a/capsule/content/logs/index.gmi +++ /dev/null @@ -1,8 +0,0 @@ -# joeac's logs - -I told you not to visit this page! There's nothing here you can't get on my homepage. I hope you're disappointed. - -=> / My homepage (way cooler than this page) -=> /logs/longlog.gmi My longlog (for long posts) -=> /logs/microlog.gmi My microlog (for short posts) -=> /logs/loglog.gmi My loglog (all my posts forgathered) diff --git a/capsule/content/logs/longlog b/capsule/content/logs/longlog deleted file mode 120000 index f04f5e4..0000000 --- a/capsule/content/logs/longlog +++ /dev/null @@ -1 +0,0 @@ -../../../common/longlog/ \ No newline at end of file diff --git a/capsule/content/subscriptions.gmi b/capsule/content/subscriptions.gmi deleted file mode 120000 index 0935ecb..0000000 --- a/capsule/content/subscriptions.gmi +++ /dev/null @@ -1 +0,0 @@ -../comitium-data/subscriptions.gmi \ No newline at end of file diff --git a/capsule/microlog b/capsule/microlog deleted file mode 120000 index 5fcc383..0000000 --- a/capsule/microlog +++ /dev/null @@ -1 +0,0 @@ -../common/microlog/ \ No newline at end of file diff --git a/capsule/run.sh b/capsule/run.sh deleted file mode 100755 index 7535975..0000000 --- a/capsule/run.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh - -make && \ - ( ( sleep 5; comitium refresh --data comitium-data/ ) & ) \ - && agate --content content/ --addr [::]:1965 --addr 0.0.0.0:1965 --lang en-GB diff --git a/capsule/templates/loglog-header.gmi b/capsule/templates/loglog-header.gmi deleted file mode 100644 index 59bf60a..0000000 --- a/capsule/templates/loglog-header.gmi +++ /dev/null @@ -1,6 +0,0 @@ -# joeac's loglog - -Hi! I'm Joe Carstairs, and you've found my loglog; my log of logs; all my posts of every description, all gathered into one place. If you're really that interested in my posts, I would encourage you to strongly consider the benefits of touching grass. - -You should be aware that my build script seems to muck up the dates. Everything seems to be 2 months and 2 days off? I haven't got round to debugging and fixing this yet. Any theories, let me know. - diff --git a/capsule/templates/longlog-header.gmi b/capsule/templates/longlog-header.gmi deleted file mode 100644 index 6e82e48..0000000 --- a/capsule/templates/longlog-header.gmi +++ /dev/null @@ -1,3 +0,0 @@ -# joeac's longlog - -Hi! I'm Joe Carstairs, and you've found my longlog. Sometimes, I write a long or long-ish post, and I put it here. diff --git a/capsule/templates/microlog-header.gmi b/capsule/templates/microlog-header.gmi deleted file mode 100644 index 761e61a..0000000 --- a/capsule/templates/microlog-header.gmi +++ /dev/null @@ -1,3 +0,0 @@ -# joeac's microlog - -Hi! I'm Joe Carstairs, and you've found my microlog. Sometimes, when I think something, I put the thought here. I'm not sure why you'd want to read this, to be honest. I'd recommend turning the computer off and going for a walk instead. diff --git a/compose.yml b/compose.yml index 25c4928..6de4e61 100644 --- a/compose.yml +++ b/compose.yml @@ -1,9 +1,9 @@ services: - capsule: - image: git.joeac.net/joeac/joeac.net-capsule + gemini: + image: git.joeac.net/joeac/joeac.net-gemini build: context: . - dockerfile: capsule.Dockerfile + dockerfile: gemini.Dockerfile ports: - "1965:1965" diff --git a/gemini.Dockerfile b/gemini.Dockerfile new file mode 100644 index 0000000..7cd4cad --- /dev/null +++ b/gemini.Dockerfile @@ -0,0 +1,38 @@ +FROM alpine:3.23 AS agate +RUN apk --update --no-cache add rust cargo \ + && wget -O - https://github.com/mbrubeck/agate/archive/refs/tags/v3.3.20.tar.gz | tar -xz \ + && cargo install --path agate-3.3.20/ \ + && apk del rust cargo \ + && rm -rf agate-3.3.20 agate-target + +FROM alpine:3.23 AS comitium +RUN apk --no-cache add make go scdoc +RUN wget -O - https://git.sr.ht/~nytpu/comitium/archive/v1.8.2.tar.gz | tar -xz \ + && make --directory=comitium-v1.8.2 \ + && mv comitium-v1.8.2/build/comitium /usr/local/bin/comitium \ + && apk del make go scdoc \ + && rm -rf comitium-v1.8.2 + +FROM alpine:3.23 AS final +RUN mkdir -p /var/app/content +WORKDIR /var/app +COPY gemini/.certificates .certificates +RUN crontab -l > crontab.tmp \ + && echo "0 */6 * * * /usr/local/bin/comitium refresh --data /var/app/comitium-data" >> crontab.tmp \ + && crontab crontab.tmp \ + && rm crontab.tmp + +# bash is needed to run the build scripts +# busybox-openrc provides rc-service, which runs crond +# gcc is a dependency for agate +# make is needed to run the Makefile +RUN apk --no-cache add bash busybox-openrc gcc make +RUN rc-update add crond +COPY --from=agate /root/.cargo/bin/agate /usr/local/bin/agate +COPY --from=comitium /usr/local/bin/comitium /usr/local/bin/comitium + +COPY gemini . +COPY common /var/common +RUN make + +CMD ./run.sh diff --git a/gemini/.editorconfig b/gemini/.editorconfig new file mode 100644 index 0000000..22357a2 --- /dev/null +++ b/gemini/.editorconfig @@ -0,0 +1,2 @@ +[*] +max_line_length = 99999 diff --git a/gemini/.gitignore b/gemini/.gitignore new file mode 100644 index 0000000..398c8d1 --- /dev/null +++ b/gemini/.gitignore @@ -0,0 +1,8 @@ +.certificates +content/logs/microlog.gmi +content/logs/longlog.gmi +content/logs/loglog.gmi +tmp-build-loglog-* +comitium-data/feed.gmi +comitium-data/subscriptions.gmi +comitium-data/comitium.json diff --git a/gemini/Makefile b/gemini/Makefile new file mode 100644 index 0000000..eee7273 --- /dev/null +++ b/gemini/Makefile @@ -0,0 +1,34 @@ +COMITIUM_DATA := comitium-data +TEMPLATES_DIR := templates +MICROLOG_HEADER := $(TEMPLATES_DIR)/microlog-header.gmi +LONGLOG_HEADER := $(TEMPLATES_DIR)/longlog-header.gmi +LOGLOG_HEADER := $(TEMPLATES_DIR)/loglog-header.gmi +MICROLOG_ENTRIES := $(wildcard microlog/*) +LONGLOG_ENTRIES := $(wildcard content/logs/longlog/*) +LOGLOG_TARGET := content/logs/loglog.gmi +FEED_TARGET := $(COMITIUM_DATA)/subscriptions.json $(COMITIUM_DATA)/feed.gmi $(COMITIUM_DATA)/subscriptions.gmi +FEED_OUTPUTS := $(FEED_TARGET) $(COMITIUM_DATA)/subscriptions.json $(COMITIUM_DATA)/feed.gmi $(COMITIUM_DATA)/subscriptions.gmi +MICROLOG_TARGET := content/logs/microlog.gmi +MICROLOG_OUTPUTS := $(MICROLOG_TARGET) $(wildcard content/logs/microlog/*) +LONGLOG_TARGET := content/logs/longlog.gmi + +.DELETE_ON_ERROR: +all: $(MICROLOG_TARGET) $(MICROLOG_OUTPUTS) $(LONGLOG_TARGET) $(LOGLOG_TARGET) $(FEED_OUTPUTS) + +$(MICROLOG_TARGET): $(wildcard microlog/*) $(MICROLOG_HEADER) + bash ./build_microlog.bash + +$(LONGLOG_TARGET): $(LONGLOG_ENTRIES) $(LONGLOG_HEADER) + bash ./build_longlog.bash + +$(LOGLOG_TARGET): $(MICROLOG_TARGET) $(LONGLOG_TARGET) $(LOGLOG_HEADER) + bash ./build_loglog.bash + +$(FEED_TARGET): $(COMITIUM_DATA)/feeds.txt + rm -f $(COMITIUM_DATA)/comitium.json + while read feed; do \ + comitium add --data "$(COMITIUM_DATA)" $$feed; \ + done <$(COMITIUM_DATA)/feeds.txt + +clean: + rm -rf $(MICROLOG_OUTPUTS) $(LONGLOG_TARGET) $(LOGLOG_TARGET) $(FEED_OUTPUTS) diff --git a/gemini/build_loglog.bash b/gemini/build_loglog.bash new file mode 100755 index 0000000..247da74 --- /dev/null +++ b/gemini/build_loglog.bash @@ -0,0 +1,131 @@ +#!/bin/bash + +TMP="tmp-build-loglog-$(date +%s%N)" +LOGLOG="content/logs/loglog.gmi" +LOGLOG_HEADER="templates/loglog-header.gmi" + +new_filename() +{ + DATE="$1" + mkdir -p "$TMP/$DATE" + N=0 + while [[ -f "$TMP/$DATE/$N" ]]; do + N=$(( N + 1 )) + done + echo "$TMP/$DATE/$N" +} + +read_log_to_tmp() +{ + LOGPATH="$1" + LOG="$(echo $LOGPATH | sed "s/.*\///g" | sed "s/\.gmi//g")" + CURRENT_POST_HEADING="" + CURRENT_POST_FILENAME="" + while read line; do + if [[ -z "$CURRENT_POST_FILENAME" ]]; then + if [[ "$line" =~ (\#+)\ *([0-9]{4}-[0-9]{2}-[0-9]{2})(\.[0-9]+)?\ * ]]; then + CURRENT_POST_HEADING="${BASH_REMATCH[1]}" + DATE="${BASH_REMATCH[2]}" + CURRENT_POST_FILENAME="$(new_filename $DATE)" + elif [[ "$line" =~ \=\>\ +([^\ ]+)\ +([0-9]{4}-[0-9]{2}-[0-9]{2})(\.[0-9]+)?\ +(.*) ]]; then + HREF="${BASH_REMATCH[1]}" + DATE="${BASH_REMATCH[2]}" + NAME="${BASH_REMATCH[3]}" + FILENAME="$(new_filename $DATE)" + echo " +=> $HREF $DATE $NAME + +From my $LOG. + +=> /logs/$LOG.gmi My $LOG" \ + >> "$FILENAME" + fi + else + if [[ "$line" =~ (\#+)\ *([0-9]{4}-[0-9]{2}-[0-9]{2})\ * ]]; then + echo "From my $LOG. + +=> /logs/$LOG.gmi My $LOG" \ + >> "$CURRENT_POST_FILENAME" + CURRENT_POST_HEADING="${BASH_REMATCH[1]}" + DATE="${BASH_REMATCH[2]}" + CURRENT_POST_FILENAME="$(new_filename $DATE)" + elif [[ "$line" =~ \#.* ]] && ! [[ "$line" =~ ${CURRENT_POST_HEADING}\#.* ]]; then + echo "From my $LOG. + +=> /logs/$LOG.gmi My $LOG" \ + >> "$CURRENT_POST_FILENAME" + CURRENT_POST_HEADING="" + DATE="" + CURRENT_POST_FILENAME="" + else + echo "$line" >> "$CURRENT_POST_FILENAME" + fi + fi + done <$LOGPATH +} + +trim_entries() +{ + ENTRY_DIR="$1" + for entry in $ENTRY_DIR/*; do + while [[ -z "$(head -n 1 "$entry")" && "$(wc -l "$entry" | cut -c1)" -ne 0 ]]; do + tail -n +2 "$entry" | tee "$entry" 1>/dev/null + done + while [[ -z "$(tail -n 1 "$entry")" && "$(wc -l "$entry" | cut -c1)" -ne 0 ]]; do + head -n -1 "$entry" | tee "$entry" 1>/dev/null + done + if [[ -z "$(cat "$entry")" ]]; then + echo "Removing entry $entry: $(cat $entry)" + rm "$entry" + fi + done + if [[ "$(ls "$ENTRY_DIR" | wc -l)" -eq 0 ]]; then + rmdir "$ENTRY_DIR" + fi +} + +append_entries_for_date() +{ + DATE_DIR="$1" + DATE="$(echo "$DATE_DIR" | sed "s/.*\///g")" + echo "## $DATE +" >> "$LOGLOG" + ENTRY_COUNT="$(ls $DATE_DIR | wc -l)" + LAST_ENTRY="$(ls $DATE_DIR | tail -n 1)" + for entry in $DATE_DIR/*; do + cat "$entry" >> "$LOGLOG" + echo "" >> "$LOGLOG" + if [[ "$ENTRY_COUNT" -gt 1 && "$entry" != "$DATE_DIR/$LAST_ENTRY" ]]; then + echo \ +------------------------------------------------------------------------ >> "$LOGLOG" + echo "" >> "$LOGLOG" + fi + done +} + +echo "Cleaning existing loglog..." +rm -f "$LOGLOG" + +echo "Reading logs to temporary files..." +for log in content/logs/*log.gmi; do + read_log_to_tmp "$log" +done + +echo "Trimming entries in temporary files..." +for date in $TMP/*; do + trim_entries "$date" +done + +echo "Copying loglog header..." +cp "$LOGLOG_HEADER" "$LOGLOG" + +echo "Appending entries to loglog..." +dates=($TMP/*) +for ((i=${#dates[@]}-1; i>=0; i--)); do + append_entries_for_date "${dates[i]}" +done + +echo "Cleaning up temporary files..." +rm -rf "$TMP" + +echo "Done." diff --git a/gemini/build_longlog.bash b/gemini/build_longlog.bash new file mode 100755 index 0000000..d23acfa --- /dev/null +++ b/gemini/build_longlog.bash @@ -0,0 +1,38 @@ +#!/bin/bash + +LONGLOG="content/logs/longlog.gmi" +LONGLOG_HEADER="templates/longlog-header.gmi" +LONGLOG_SRC_DIR="content/logs/longlog" +HR="-----------------------------------------------------------------------" + +trim_longlog_tail() +{ + while [[ -z "$(tail -n 1 "$LONGLOG")" && "$(wc -l "$LONGLOG" | cut -c1)" -ne 0 ]]; do + head -n -1 "$LONGLOG" | tee "$LONGLOG" 1>/dev/null + done +} + +echo "Cleaning existing longlog..." +rm -f "$LONGLOG" + +echo "Copying longlog header..." +cp "$LONGLOG_HEADER" "$LONGLOG" +trim_longlog_tail +echo "" >> "$LONGLOG" + +echo "Appending entries to longlog..." +posts=(${LONGLOG_SRC_DIR}/*) +for ((i=${#posts[@]}-1; i>=0; i--)); do + post="${posts[i]}" + if [[ "$post" =~ ${LONGLOG_SRC_DIR}/([0-9]{4}-[0-9]{2}-[0-9]{2}(\.[0-9]+)?)\.gmi ]]; then + date="${BASH_REMATCH[1]}" + suffix="${BASH_REMATCH[2]}" + title="$(head -n 1 "${posts[i]}" | sed "s/^\#\+ *//")" + echo "=> /logs/longlog/${date}${suffix}.gmi ${date} ${title}" >> "$LONGLOG" + else + echo "Error: $post does not match format YYYY-MM-DD(.n). Aborting..." + exit 1 + fi +done + +echo "Done." diff --git a/gemini/build_microlog.bash b/gemini/build_microlog.bash new file mode 100755 index 0000000..b3c37dc --- /dev/null +++ b/gemini/build_microlog.bash @@ -0,0 +1,38 @@ +#!/bin/bash + +MICROLOG="content/logs/microlog.gmi" +MICROLOG_HEADER="templates/microlog-header.gmi" +MICROLOG_SRC_DIR="microlog" +HR="-----------------------------------------------------------------------" + +trim_microlog_tail() +{ + while [[ -z "$(tail -n 1 "$MICROLOG")" && "$(wc -l "$MICROLOG" | cut -c1)" -ne 0 ]]; do + head -n -1 "$MICROLOG" | tee "$MICROLOG" 1>/dev/null + done +} + +echo "Cleaning existing microlog..." +rm -f "$MICROLOG" + +echo "Copying microlog header..." +cp $MICROLOG_HEADER $MICROLOG +trim_microlog_tail + +echo "Appending entries to microlog..." +posts=(${MICROLOG_SRC_DIR}/*) +for ((i=${#posts[@]}-1; i>=0; i--)); do + if [[ "${posts[i]}" =~ ${MICROLOG_SRC_DIR}/([0-9]{4}-[0-9]{2}-[0-9]{2}(\.[0-9]+)?)\.gmi ]]; then + date="${BASH_REMATCH[1]}" + echo "" >> "$MICROLOG" + echo "## ${date}" >> "$MICROLOG" + echo "" >> "$MICROLOG" + cat "${posts[i]}" >> "$MICROLOG" + trim_microlog_tail + else + echo "Error: ${posts[i]} does not match format YYYY-MM-DD(.n). Aborting..." + exit 1 + fi +done + +echo "Done." diff --git a/gemini/comitium-data/feeds.txt b/gemini/comitium-data/feeds.txt new file mode 100644 index 0000000..6b5fff2 --- /dev/null +++ b/gemini/comitium-data/feeds.txt @@ -0,0 +1,16 @@ +gemini://joeac.net/logs/loglog.gmi +gemini://joeac.net/logs/microlog.gmi --watch +gemini://idiomdrottning.org:1965/sub +gemini://spool-five.com:1965/gemlog/index.gmi +gemini://jsreed5.org:1965/feeds/log.xml +https://free-our-feeds.ghost.io/rss +https://www.inkandswitch.com/index.xml +https://euhwc.co.uk/feed/ +https://www.youtube.com/feeds/videos.xml?channel_id=UCVfwlh9XpX2Y_tQfjeln9QA +https://www.youtube.com/feeds/videos.xml?channel_id=UCfJxmjbygyA5KEdzzZv6Pbw +gemini://eph.smol.pub/posts +https://mwgmac.github.io --watch +https://dieterhelm.co.uk/feed/ +https://extinctionrebellion.uk/feed/ +https://pluralistic.net/feed/ +https://podcasts.files.bbci.co.uk/p0gg4k6r.rss "Radical with Amol Rajan" diff --git a/gemini/comitium-data/header.gmi b/gemini/comitium-data/header.gmi new file mode 100644 index 0000000..b7609bb --- /dev/null +++ b/gemini/comitium-data/header.gmi @@ -0,0 +1,4 @@ +# joeac's feed aggregator + +Hi! I'm Joe Carstairs, and you've found my feed aggregator. This is a list of +some stuff I think I might read. diff --git a/gemini/content/feed.gmi b/gemini/content/feed.gmi new file mode 120000 index 0000000..c05592d --- /dev/null +++ b/gemini/content/feed.gmi @@ -0,0 +1 @@ +../comitium-data/feed.gmi \ No newline at end of file diff --git a/gemini/content/images b/gemini/content/images new file mode 120000 index 0000000..ccc7a5b --- /dev/null +++ b/gemini/content/images @@ -0,0 +1 @@ +../../common/images/ \ No newline at end of file diff --git a/gemini/content/index.gmi b/gemini/content/index.gmi new file mode 100644 index 0000000..88b7303 --- /dev/null +++ b/gemini/content/index.gmi @@ -0,0 +1,17 @@ +# joeac's capsule + +Hi! I'm Joe Carstairs, and you've found my capsule, gemini://joeac.net. + +=> /logs/longlog.gmi My longlog (for long posts) +=> /logs/microlog.gmi My microlog (for short posts) +=> /logs/loglog.gmi My loglog (all my posts forgathered) +=> /logs/index.gmi An index of all my logs (don't visit this page) +=> /feed.gmi My feed aggregator + +Here are some other ways to 'engage' with me on the so-called 'Internet': + +=> https://joeac.net Web +=> https://www.linkedin.com/in/joe-carstairs-0aa936277/ LinkedIn +=> https://www.facebook.com/joe.carstairs.5 Facebook +=> https://git.joeac.net My own Gitea instance +=> https://github.com/joeacarstairs GitHub diff --git a/gemini/content/logs/index.gmi b/gemini/content/logs/index.gmi new file mode 100644 index 0000000..e9109a8 --- /dev/null +++ b/gemini/content/logs/index.gmi @@ -0,0 +1,8 @@ +# joeac's logs + +I told you not to visit this page! There's nothing here you can't get on my homepage. I hope you're disappointed. + +=> / My homepage (way cooler than this page) +=> /logs/longlog.gmi My longlog (for long posts) +=> /logs/microlog.gmi My microlog (for short posts) +=> /logs/loglog.gmi My loglog (all my posts forgathered) diff --git a/gemini/content/logs/longlog b/gemini/content/logs/longlog new file mode 120000 index 0000000..f04f5e4 --- /dev/null +++ b/gemini/content/logs/longlog @@ -0,0 +1 @@ +../../../common/longlog/ \ No newline at end of file diff --git a/gemini/content/subscriptions.gmi b/gemini/content/subscriptions.gmi new file mode 120000 index 0000000..0935ecb --- /dev/null +++ b/gemini/content/subscriptions.gmi @@ -0,0 +1 @@ +../comitium-data/subscriptions.gmi \ No newline at end of file diff --git a/gemini/microlog b/gemini/microlog new file mode 120000 index 0000000..5fcc383 --- /dev/null +++ b/gemini/microlog @@ -0,0 +1 @@ +../common/microlog/ \ No newline at end of file diff --git a/gemini/run.sh b/gemini/run.sh new file mode 100755 index 0000000..7535975 --- /dev/null +++ b/gemini/run.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +make && \ + ( ( sleep 5; comitium refresh --data comitium-data/ ) & ) \ + && agate --content content/ --addr [::]:1965 --addr 0.0.0.0:1965 --lang en-GB diff --git a/gemini/templates/loglog-header.gmi b/gemini/templates/loglog-header.gmi new file mode 100644 index 0000000..59bf60a --- /dev/null +++ b/gemini/templates/loglog-header.gmi @@ -0,0 +1,6 @@ +# joeac's loglog + +Hi! I'm Joe Carstairs, and you've found my loglog; my log of logs; all my posts of every description, all gathered into one place. If you're really that interested in my posts, I would encourage you to strongly consider the benefits of touching grass. + +You should be aware that my build script seems to muck up the dates. Everything seems to be 2 months and 2 days off? I haven't got round to debugging and fixing this yet. Any theories, let me know. + diff --git a/gemini/templates/longlog-header.gmi b/gemini/templates/longlog-header.gmi new file mode 100644 index 0000000..6e82e48 --- /dev/null +++ b/gemini/templates/longlog-header.gmi @@ -0,0 +1,3 @@ +# joeac's longlog + +Hi! I'm Joe Carstairs, and you've found my longlog. Sometimes, I write a long or long-ish post, and I put it here. diff --git a/gemini/templates/microlog-header.gmi b/gemini/templates/microlog-header.gmi new file mode 100644 index 0000000..761e61a --- /dev/null +++ b/gemini/templates/microlog-header.gmi @@ -0,0 +1,3 @@ +# joeac's microlog + +Hi! I'm Joe Carstairs, and you've found my microlog. Sometimes, when I think something, I put the thought here. I'm not sure why you'd want to read this, to be honest. I'd recommend turning the computer off and going for a walk instead. -- cgit v1.2.3