Skip to content

FreshRSS Syncloud app#1

Open
cyberb wants to merge 26 commits into
masterfrom
wip
Open

FreshRSS Syncloud app#1
cyberb wants to merge 26 commits into
masterfrom
wip

Conversation

@cyberb

@cyberb cyberb commented Jul 13, 2026

Copy link
Copy Markdown
Member

Packages FreshRSS 1.29.1 as a Syncloud snap, following the 2026 porting guide (owncast/paperless/games shape).

What's here

  • snap.yaml at root, modern shape (php-fpm / nginx / cron daemons + cli hooks)
  • php/ — PHP-FPM 8.3 runtime bundled from the official image via Docker export, launched through an ld-linux loader wrapper so it runs on both bookworm and buster
  • nginx/ — bundled nginx serving FreshRSS over the platform unix socket, fastcgi to php-fpm
  • cli/ — Go + Cobra installer hooks (install/configure/refresh/backup-restore), CGO_ENABLED=0
  • SQLite storage under FreshRSS DATA_PATH pointed at the Syncloud storage dir
  • Auth: FreshRSS built-in form login; an admin user is provisioned at install (password at <storage>/admin.password)
  • cron daemon refreshing feeds every 15 min
  • test/ — pytest integration tests
  • .drone.jsonnet — amd64 pipeline, nginx tested on bookworm+buster, store-publisher publish

Notes

  • FreshRSS's native OIDC relies on Apache mod_auth_openidc, incompatible with nginx+php-fpm, so platform SSO is left as a future enhancement.
  • Driving CI to green on the wip branch.

cyberb added 8 commits July 13, 2026 18:24
Package FreshRSS (1.29.1) as a Syncloud snap: bundled php-fpm + nginx via
ld-linux loader wrappers, SQLite storage under DATA_PATH, Go/Cobra installer
hooks, form auth with a provisioned admin user, and a feed-refresh cron daemon.
Integration tests + Drone CI (amd64, bookworm/buster).
Avoids fragile dind in CI; build PHP-FPM + extensions directly in the
php:8.3-fpm-bookworm step and bundle via cp, mirroring the wordpress app.
Make freshrss.sh self-contained so provisioning does not rely on sudo env passthrough.
nginx access_log and php-fpm error_log opening /dev/stdout / /dev/stderr as
files fails with ENXIO under systemd, crash-looping both daemons. Use syslog
to /dev/log (journald ingests it), mirroring owncast/wordpress.
@cyberb

cyberb commented Jul 13, 2026

Copy link
Copy Markdown
Member Author

✅ CI is fully green on wip — Drone build #15 (commit ace22cb) passed every step: php/nginx/cli builds, nginx tests on bookworm+buster, package, integration test bookworm (real snap install + smoke test on the platform), and artifact upload.

Fix history to green: executable bits on scripts → drop requests pin (syncloud-lib conflict) → syncloud-lib==367 (drops the stale selenium import) → pre-create FreshRSS data subdirs (cache/users/favicons/tokens) → log to syslog/journald instead of /dev/stdout|stderr (which crash-loops under systemd).

cyberb added 5 commits July 13, 2026 23:10
Auth: delegate to the platform. nginx gates access via Authelia authrequest and
passes Remote-User to php-fpm (auth_type=http_auth); FreshRSS auto-provisions the
account (http_auth_auto_register via config.custom.php). No local users/passwords.
FreshRSS token APIs under /api/ bypass the SSO gate.

CI: 3 archs (amd64/arm64/arm); per-distro binary smoke tests (nginx/php/cli on
bookworm+buster); pytest device test on both distros; Playwright UI (amd64) logging
in via SSO. No version step (package.sh writes it); no inline commands (ci-test.sh,
freshrss/build.sh); refresh.hold on platform services.

cron: replace shell loop with a Go service (pihole gravity pattern).
…rtion

FreshRSS <title> is the configured app title ('Syncloud'), not 'FreshRSS';
#stream visibility already proves the reader loaded. Keep screenshot filenames
as their short labels (reader/landing/auth/config) instead of Playwright's long
test-results dir name.
@cyberb

cyberb commented Jul 14, 2026

Copy link
Copy Markdown
Member Author

✅ Fully green (build #25) on amd64 + arm64: per-distro binary tests (nginx/php/cli on bookworm+buster), pytest device tests on both distros, and Playwright UI (login + settings) via Syncloud SSO.

Auth reworked to delegate to the platform — Authelia authrequest gates access and passes Remote-User to php-fpm (auth_type=http_auth + http_auth_auto_register); no local users/passwords. cron is a Go service; version folded into package.sh; all steps script-based. armhf temporarily disabled (runner down).

cyberb added 9 commits July 14, 2026 17:40
…alize path; re-enable armhf

Cron pointed at a non-existent cli/actualize-script.php; the actualize entrypoint is
app/actualize_script.php. The feed test now triggers actualize over ssh after login and
asserts a rendered article (#stream .flux). armhf runner is back, so re-enable build('arm').
…ia UI #actualize button, not ssh

Real users fetch feeds via the header refresh button (or the background cron), so the
feed test clicks #actualize instead of ssh-ing an actualize script. env() helper throws
on any missing PLAYWRIGHT_* var instead of falling back to a hardcoded default.
…-user.custom.php, opml.xml)

Ship them as reviewable files copied into DATA_PATH at install instead of Go string
literals. Drop dead getOrCreateUuid/uuid (leftover from form-auth).
…pty system

Users add feeds via the FreshRSS UI (+ button → paste URL → submit), which fetches
entries immediately. Drop the shipped example opml.xml; the test now exercises that real
flow and reads the resulting articles.
…n mgmt), not unread-stream articles

The main stream is unread-only, so freshly-imported articles don't appear there; the
correct, retry-safe signal that add-via-UI worked is the feed listed in subscription
management ('Release notes from FreshRSS').
…ion box

FreshRSS displays the feed as 'FreshRSS releases' (not the atom <title> 'Release notes
from FreshRSS'); assert a feed link containing FreshRSS inside .box, excluding the header logo.
@cyberb

cyberb commented Jul 15, 2026

Copy link
Copy Markdown
Member Author

✅ Fully green on amd64, arm64, and armhf (build #43).

Since the last summary: Syncloud SSO via Authelia Remote-User header (http_auth + auto-register, no local users/passwords); Go cron feed-refresh service; 3-arch CI with per-distro nginx/php/cli binary tests (bookworm+buster) and device tests on both distros; Playwright UI (login, settings, and add-a-feed-via-UI on an empty system). No seeded feed — users add their own through the FreshRSS UI.

cyberb added 4 commits July 15, 2026 07:35
… read it

Navigate to /i/?state=3 (STATE_ALL) to list the fetched articles, then click a
summary to expand an article into .flux_content — the real read flow.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant