diff --git a/host/virtual/spec.bu b/host/virtual/spec.bu index 59f9d77..3099cf1 100644 --- a/host/virtual/spec.bu +++ b/host/virtual/spec.bu @@ -212,6 +212,14 @@ storage: inline: | TEST_ENV=foobar + # Feed configuration for RSS2Email. + - path: /etc/coreos-home-server/rss2email/service/feeds/test@localhost/feeds.txt + mode: 0644 + contents: + inline: | + https://feeds.bbci.co.uk/news/world/rss.xml + https://pluralistic.net/feed/ + # Include pre-generated certificates for localhost domain, as we're not using Let's Encrypt in # generating certificates for the virtual host. - path: /etc/ssl/private/localhost/fullchain.pem diff --git a/host/virtual/virtual.env b/host/virtual/virtual.env index 72f0b68..77f6008 100644 --- a/host/virtual/virtual.env +++ b/host/virtual/virtual.env @@ -28,17 +28,13 @@ DOVECOT_DATABASE_USERNAME=dovecot DOVECOT_DATABASE_PASSWORD=password # Configuration for Postfix. -POSTFIX_HOST=localhost -POSTFIX_LOCAL_SMTP_USERNAME=noreply@localhost +POSTFIX_HOST=postfix.localhost +POSTFIX_LOCAL_SMTP_USERNAME=noreply@postfix.localhost POSTFIX_LOCAL_SMTP_PASSWORD=password # Configuration for rspamd. RSPAMD_CONTROLLER_PASSWORD=password -# Configuration for RSS2Email. -RSS2EMAIL_FROM=noreply@localhost -RSS2EMAIL_TO=root@localhost - # Configuration for Rclone. RCLONE_REMOTE_TYPE=local RCLONE_REMOTE_PATH=/data/rclone diff --git a/service/rss2email/Containerfile b/service/rss2email/Containerfile index ece3612..cc2201a 100644 --- a/service/rss2email/Containerfile +++ b/service/rss2email/Containerfile @@ -1,18 +1,15 @@ -FROM docker.io/debian:bullseye-slim@sha256:c6d9e246479d56687c1a579a7a0336956a5ce6f2bc26bd7925b0c7405e81dbff -ARG VERSION=3.14 # renovate: datasource=github-tags depName=rss2email/rss2email extractVersion=^v(?.*)$ +FROM docker.io/golang:1.22-bookworm@sha256:925fe3fa28ba428cf67a7947ae838f8a1523117b40e3e6b5106c378e3f97fa29 AS builder +ARG VERSION=3.2 # renovate: datasource=github-releases depName=skx/rss2email extractVersion=^release-(?.*)$ -RUN apt-get update -y && apt-get install -y --no-install-recommends \ - ca-certificates git gettext gosu \ - python3 python3-setuptools python3-feedparser python3-html2text python3-bs4 +RUN GOBIN=/build/usr/bin go install github.com/skx/rss2email@release-${VERSION} -RUN git clone --branch v${VERSION} --depth 1 https://github.com/rss2email/rss2email /tmp/rss2email && \ - cd /tmp/rss2email && python3 setup.py install && \ - rm -Rf /tmp/rss2email +FROM docker.io/debian:bookworm-slim@sha256:d02c76d82364cedca16ba3ed6f9102406fa9fa8833076a609cabf14270f43dfc +RUN apt-get update -y && apt-get upgrade -y && apt-get install -y --no-install-recommends \ + ca-certificates gettext gosu -RUN addgroup --system --gid 10000 rss2email -RUN adduser --system --uid 10000 --ingroup rss2email --home /var/lib/rss2email rss2email +RUN adduser --system --group --uid 10000 --no-create-home rss2email -COPY container/config /etc/rss2email +COPY --from=builder /build / COPY container/run-rss2email /run-rss2email ENTRYPOINT ["/run-rss2email"] diff --git a/service/rss2email/container/config/rss2email.conf.template b/service/rss2email/container/config/rss2email.conf.template deleted file mode 100644 index d494ca1..0000000 --- a/service/rss2email/container/config/rss2email.conf.template +++ /dev/null @@ -1,36 +0,0 @@ -[DEFAULT] -from = ${RSS2EMAIL_FROM} -to = ${RSS2EMAIL_TO} -user-agent = rss2email/1.0 -use-publisher-email = True -date-header = True -html-mail = True -multipart-html = True -use-css = True -css = - html { - margin: 0 auto; - max-width: 900px; - padding: 1em 0; - } - h1, h2, h3, h4, h5, h6 { - margin: 0.5em 0; - text-decoration: none; - } - img { - max-width: 100%; - } - p, ul, ol { - color: #1d1d1d; - font-family: sans-serif; - line-height: 1.5; - margin-bottom: 1em; - } -email-protocol = smtp -smtp-auth = True -smtp-username = ${RSS2EMAIL_SMTP_USERNAME} -smtp-password = ${RSS2EMAIL_SMTP_PASSWORD} -smtp-server = ${RSS2EMAIL_SMTP_HOST} -smtp-port = ${RSS2EMAIL_SMTP_PORT} -smtp-ssl = False -verbose = info diff --git a/service/rss2email/container/run-rss2email b/service/rss2email/container/run-rss2email index c2dc859..fa3decd 100755 --- a/service/rss2email/container/run-rss2email +++ b/service/rss2email/container/run-rss2email @@ -1,16 +1,19 @@ #!/bin/sh -# Create configuration file from collected templates. -mkdir -p /etc/rss2email -envsubst < /etc/rss2email/rss2email.conf.template > /etc/rss2email/rss2email.conf +set -eu -if test -n "$(ls -A /etc/rss2email/conf.d)"; then - cat /etc/rss2email/conf.d/*.conf >> /etc/rss2email/rss2email.conf -fi +# Common-use variables. +DATA_DIR=/var/lib/rss2email +CONF_DIR=/etc/rss2email/feeds.d -# Correct permissions for data files. -mkdir -p /var/lib/rss2email -chown -R rss2email:rss2email /var/lib/rss2email +# Parse invividual feed configuration directories. +process() { + printf "Processing feeds for %s...\n" "$2" + install -D --owner rss2email --group rss2email --target-directory "$DATA_DIR/feeds/$2/.rss2email" "$1"/* + chown rss2email:rss2email "$DATA_DIR/feeds/$2/.rss2email" + gosu rss2email sh -c "HOME=$DATA_DIR/feeds/$2 rss2email cron -verbose $2" +} -# Run entrypoint under specific user. -gosu rss2email /usr/local/bin/r2e --config /etc/rss2email/rss2email.conf --data /var/lib/rss2email/data.json "$@" +for feed in "$CONF_DIR"/*/feeds.txt; do + process "$(dirname "$feed")" "$(basename "$(dirname "$feed")")" +done diff --git a/service/rss2email/rss2email.env.template b/service/rss2email/rss2email.env.template index 4ac916d..f650a36 100644 --- a/service/rss2email/rss2email.env.template +++ b/service/rss2email/rss2email.env.template @@ -1,9 +1,5 @@ -# Options for RSS-to-Email. -RSS2EMAIL_FROM=${RSS2EMAIL_FROM} -RSS2EMAIL_TO=${RSS2EMAIL_TO} - # Options for SMTP delivery mechanism. -RSS2EMAIL_SMTP_HOST=${POSTFIX_HOST} -RSS2EMAIL_SMTP_PORT=587 -RSS2EMAIL_SMTP_USERNAME=${POSTFIX_LOCAL_SMTP_USERNAME} -RSS2EMAIL_SMTP_PASSWORD=${POSTFIX_LOCAL_SMTP_PASSWORD} +SMTP_HOST=${POSTFIX_HOST} +SMTP_PORT=587 +SMTP_USERNAME=${POSTFIX_LOCAL_SMTP_USERNAME} +SMTP_PASSWORD=${POSTFIX_LOCAL_SMTP_PASSWORD} diff --git a/service/rss2email/service/feeds/README.md b/service/rss2email/service/feeds/README.md new file mode 100644 index 0000000..b4c2330 --- /dev/null +++ b/service/rss2email/service/feeds/README.md @@ -0,0 +1,5 @@ +# Feed Configuration for RSS2Email + +This folder contains feed configuration, each placed under its own folder named after the +destination email address, and each containing (at a minimum) a `feeds.txt` file with the list of +feeds to subscribe to. diff --git a/service/rss2email/systemd/rss2email-subscribe@.service b/service/rss2email/systemd/rss2email-subscribe@.service deleted file mode 100644 index 13e0fe1..0000000 --- a/service/rss2email/systemd/rss2email-subscribe@.service +++ /dev/null @@ -1,14 +0,0 @@ -[Unit] -Description=RSS Feed Subscription for %I - -[Service] -Type=oneshot -RemainAfterExit=true -SyslogIdentifier=%N -ExecStart=/bin/sh -c "V=$(podman volume mount rss2email-feeds) && printf '[feed.%%s]\nurl = %I\n' $(md5sum <<< '%i' | cut -c-32) > $V/%i.conf" -ExecStartPost=/bin/podman volume unmount rss2email-feeds -ExecStop=/bin/sh -c "V=$(podman volume mount rss2email-feeds) && rm -f $V/%i.conf" -ExecStopPost=/bin/podman volume unmount rss2email-feeds - -[Install] -WantedBy=multi-user.target diff --git a/service/rss2email/systemd/rss2email.service b/service/rss2email/systemd/rss2email.service index 181c59a..f21bbfc 100644 --- a/service/rss2email/systemd/rss2email.service +++ b/service/rss2email/systemd/rss2email.service @@ -8,9 +8,9 @@ Type=oneshot SyslogIdentifier=%N ExecStart=/bin/podman run --replace --rm --name %N --net internal \ --env-file %E/coreos-home-server/%N/%N.env \ - --volume %N-feeds:/etc/%N/conf.d:z,ro \ + --volume %E/coreos-home-server/%N/service/feeds:/etc/%N/feeds.d:z,ro \ --volume %N:/var/lib/%N:z \ - localhost/%N:latest run + localhost/%N:latest [Install] WantedBy=multi-user.target