-
released this
2026-06-20 19:20:44 +00:00 | 0 commits to main since this releaseChanged
- Coherent status colors. One rule everywhere: dim keys, white facts (versions, names,
counts, sizes, URLs, dates), green good-states (on/enabled/running/applied/enforcing/key-only),
yellow caution, dim secondary notes only (parentheticals, uptime, commit ref). Removes the cyan
sprinkled on some numbers/URLs and un-dims the Content/Sync values. Refreshed status screenshot.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Coherent status colors. One rule everywhere: dim keys, white facts (versions, names,
-
released this
2026-06-20 18:59:05 +00:00 | 3 commits to main since this releaseValidated end-to-end on a clean Rocky 9 re-provision, which surfaced and fixed several latent bugs
the long-running deployment had been masking, and a full install/status UX overhaul.Fixed
- bcrypt hash corruption: the compose
$-escaping used${h//$/$$}, where$$expands to the
shell PID — corrupting every basic-auth hash and crash-looping the web container. Nowsed-based. - Status Sync box dropped before the first sweep completed: an unguarded
grepunder
set -euo pipefailaborted the render. Status is nowset +e(read-only reporting can't abort). - stderr noise from
firewalld(ALREADY_ENABLED) and compose recreates is captured/suppressed.
Changed
- Unified, high-contrast CLI: install and
statusnow share one visual language — green
numbered[n]stage headers, bright text, indented✓/•rows (no boxes, no red banners, no
[packagemini]prefix).--verbose/PM_VERBOSE=1streams raw tooling output; failures show the
captured output. Timestamps render in RFC 5322 with the operator's timezone offset. - Timezone no longer prompted on every
--all— the host zone is kept automatically (preset
PM_TIMEZONEto change), so a re-run is fully non-interactive.
Added
set-timezone <zone>command (sets host tz +.envTZ, reloads sync for release dates).- Refreshed documentation screenshots (status dashboard +
deploy.sh --allinstall run).
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- bcrypt hash corruption: the compose
-
released this
2026-06-20 15:33:17 +00:00 | 14 commits to main since this releaseSupersedes 0.2.3 (whose release did not publish due to the workflow bug below). Carries the full
supply-chain pinning from 0.2.3 plus the fix.Security
- Supply-chain pinning. Base images by
@sha256digest (python:3.12-slim,caddy:2,
caddy:2-builder,alpine:3); Caddyv2.11.4+ xcaddy modulescaddy-dns/desec@v1.1.0and
mholt/caddy-ratelimit@v0.1.0; Python deps exact +pip --require-hashes; thecaddyimage for
hash-password; lazydockerv0.25.2with SHA-256 verification; release-workflow image + deps.
See DESIGN.md → Supply chain.
Fixed
- Release workflow: the hashed
requirements-dev.txtwas missing pytest 9'spygments
dependency, sopip --require-hashesfailed in CI; addedpygments==2.20.0. Verified in a clean venv.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Supply-chain pinning. Base images by
-
released this
2026-06-20 14:57:59 +00:00 | 17 commits to main since this releaseAdded
- Manual TLS provider (
web.tls.provider: manual) — import your own certificate (internal CA,
wildcard, etc.) instead of ACME/DNS-01. New./src/deploy.sh set-certimports the leaf cert +
key (+ optional intermediate and root CA), assembles the chain (leaf→intermediate→root), verifies
the key matches the cert, and reloads; no token required. Documented indoc/MANUAL-X509-CERT.md. doc/MANAGE.md— day-to-day management guide; referenced from the README.- Docs: web UI +
statusscreenshots; "Status dashboard" section in DESIGN.md.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Manual TLS provider (
-
released this
2026-06-20 11:37:05 +00:00 | 26 commits to main since this releaseFixed
- Release workflow now uses the automatic per-run token (
github.token) instead of a
manually-created secret, checks out into a clean subdir, and surfaces the release-API HTTP
status — so avX.Y.Ztag actually publishes a Forgejo release with the CHANGELOG notes.
Changed
- Install docs: clone the repo directly on the server (
dnf install -y git+git clone)
instead ofscp— enables in-placegit pullupdates and an accurate commit ref instatus.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Release workflow now uses the automatic per-run token (
-
released this
2026-06-20 11:13:27 +00:00 | 28 commits to main since this releaseA large hardening, operability, and polish cycle: the mirror now runs rootless and
self-hardens the host, thedeploy.shstatus/management UX was rebuilt, and the repo
was reorganised intosrc/+config/+doc/.Added
- System hardening (
deploy.sh harden, also during install; opt out with--no-harden):
guarded key-only SSH, fail2ban, hourly automatic security updates with auto-reboot,
Docker-safe sysctl tuning, firewall least-privilege, and enforced filesystem permissions.
Interactive enable/disable/re-apply per measure. Documented indoc/SYSTEM-HARDENING.md. - Web-tier abuse protection: fail2ban
caddy-floodjail (firewall-bans HTTP 429 floods from
the access log) +recidivejail; an optional SSH never-ban whitelist (PM_SSH_WHITELIST). - Security response headers (
web.security_headers):nosniff,X-Frame-Options: DENY,
Referrer-Policy,Serverbanner removed, and HSTS on HTTPS. - Management subcommands:
status,start/stop/restart/down,logs,refresh,
harden,set-fqdn,set-mirror-auth,set-mirror-creds,set-goaccess-creds,
open-goaccess, andclear-config [data](uninstall/reconfigure). - Status dashboard: boxed, colour-coded sections (System, Security, Services, Mirror,
Mirror config, Content, Sync) with live sync progress, "last sweep X ago", blocked-IP count,
effective rate limit, the outbound User-Agent, and the running version + commit ref. - Operator identity (
operator.{name,email}): shown in the page footer and sent in the
outbound User-Agent so MikroTik can contact whoever runs the mirror. - Timezone support (
TZ): release/modified dates render in the operator's timezone in
RFC 5322 format;deploy.shprompts for and sets the host timezone. - Configurable TLS renewal window (
web.tls.renewal_window_ratio). config/env.examplereference; repository-layout and disk-sizing docs in the README.
Changed
- Repository layout:
deploy.sh,sync/,web/,monitor/moved undersrc/;
example config underconfig/; docs underdoc/. Compose build contexts updated. - Containers run rootless (
uid:gid 1000,no-new-privileges); Caddy keeps
NET_BIND_SERVICEto bind 80/443. Host-bound data is owned by1000:1000. - Rate limiting now defaults to all routes at 600 r/m (was feed-only at 60 r/m); tunable.
- Download phase runs with parallel workers (default 2); release dates parsed from CHANGELOG.
- Footer year is dynamic; redundant author link removed in favour of the repo link + version.
Fixed
- Completed architectures now skip all fetches/probes on later sweeps — no more per-sweep
CDN hammering for files MikroTik doesn't offer (steady-state sweep dropped from minutes to seconds). - In-progress versions/architectures and
*.partfiles are hidden until fully mirrored. - fail2ban requires the firewalld backend to actually enforce bans (ordered first, warned otherwise);
re-applying an already-enabled measure now refreshes its config. - Real-time GoAccess board WebSocket fixed end-to-end (path, protocol, public port).
Security
- See Added — host hardening, rootless containers, web-tier abuse protection, and security
headers are the headline of this release. Seedoc/SYSTEM-HARDENING.md.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- System hardening (