- Shell 60.9%
- Makefile 22.5%
- Dockerfile 16.6%
GitHub Actions workflow builds and pushes to Docker Hub and GHCR on every push to main and on manual trigger (workflow_dispatch with optional version override). Tags: latest, version, sha-<commit>. Update README to document pre-built image install flow so users can skip the local Docker build step entirely. |
||
|---|---|---|
| .github/workflows | ||
| .dockerignore | ||
| .gitignore | ||
| CLAUDE.md | ||
| CloudronManifest.json | ||
| Dockerfile | ||
| logo.png | ||
| Makefile | ||
| nginx.conf | ||
| README.md | ||
| start.sh | ||
FeedLand for Cloudron
Cloudron app package for FeedLand — Dave Winer's social feed reading environment.
FeedLand brings social features to RSS. Subscribe to feeds, see what others are reading, discover new content together, and share interesting items with a community of readers.
Prerequisites
- A Cloudron instance
- The Cloudron CLI installed locally
Install
Pre-built images are published to Docker Hub and GitHub Container Registry on every push to main. No local Docker build required.
# 1. Login to your Cloudron
cloudron login my.cloudron.example
# 2. Install using the pre-built image
cloudron install --image rmdes/feedland-cloudron:latest --location feedland.example.com
On first install, Cloudron will:
- Provision a MySQL database
- Configure SMTP for outbound email
- Set up HTTPS with automatic certificates
- Import the FeedLand database schema
Once installed, open https://feedland.example.com and create your first account.
Update
cloudron update --image rmdes/feedland-cloudron:latest --app feedland.example.com
Or pin to a specific version:
cloudron update --image rmdes/feedland-cloudron:1.0.0 --app feedland.example.com
Available Image Tags
Images are available from both registries:
rmdes/feedland-cloudron(Docker Hub)ghcr.io/rmdes/feedland-cloudron(GitHub Container Registry)
| Tag | Description |
|---|---|
latest |
Most recent build from main |
1.0.0 |
Version from CloudronManifest.json |
sha-abc1234 |
Pinned to a specific git commit |
Building Locally
If you prefer to build from source:
# Requires Docker installed locally
cloudron build --local --no-cache
cloudron install --location feedland.example.com
What Cloudron Handles
If you're coming from the Docker Compose setup, here's what Cloudron replaces:
| Docker Compose | Cloudron |
|---|---|
| MySQL container + passwords | mysql addon — managed, backed up, credentials rotated |
| SMTP placeholder config | sendmail addon — outbound email, configured automatically |
| Caddy reverse proxy + HTTPS | Cloudron reverse proxy — automatic TLS, domain management |
FEEDLAND_DOMAIN env var |
CLOUDRON_APP_DOMAIN — always correct, even after domain changes |
| Docker volumes | localstorage addon — persistent /app/data, included in backups |
docker-compose.yml (5 services) |
Single container with managed addons |
Configuration
Automatic
These are provided by Cloudron on every startup — no manual configuration needed:
- Database — host, port, username, password, database name
- Email — SMTP server, port, credentials, sender address
- Domain — app domain, origin URL, WebSocket URL
Customizable Settings
To change FeedLand settings, edit /app/data/env.sh inside the container:
# Open a shell in the container
cloudron exec --app feedland.example.com
# Edit the settings file
vi /app/data/env.sh
Available settings:
# Allow/disallow new user registration (default: true)
export FEEDLAND_ENABLE_NEW_USERS=true
# Product name shown in UI and emails (default: FeedLand)
export FEEDLAND_PRODUCT_NAME="FeedLand"
# Email confirmation expiry in seconds (default: 86400 = 24 hours)
export FEEDLAND_CONFIRMATION_EXPIRES=86400
# Home page source URL
export FEEDLAND_HOME_PAGE_SOURCE="http://scripting.com/code/feedland/home/index.html"
After editing, restart the app:
cloudron restart --app feedland.example.com
Creating Your First User
- Open your FeedLand instance in a browser
- Click to create a new account
- FeedLand sends a confirmation email
If Email Isn't Working
If Cloudron's email delivery isn't configured yet, you can confirm users manually:
# Open a shell in the container
cloudron exec --app feedland.example.com
# Find the confirmation code
mysql -h "$CLOUDRON_MYSQL_HOST" -P "$CLOUDRON_MYSQL_PORT" \
-u "$CLOUDRON_MYSQL_USERNAME" -p"$CLOUDRON_MYSQL_PASSWORD" \
"$CLOUDRON_MYSQL_DATABASE" \
-e "SELECT * FROM pendingConfirmations\G"
Then visit https://feedland.example.com/userconfirms?emailConfirmCode=THE_CODE_FROM_ABOVE in your browser.
Architecture
Internet -> Cloudron proxy (HTTPS) -> nginx (:8000) -> FeedLand HTTP (:1452)
-> FeedLand WebSocket (:1462)
nginx listens on port 8000 and routes traffic based on the WebSocket Upgrade header:
- WebSocket upgrade requests go to FeedLand's WebSocket server on port 1462
- All other HTTP requests go to FeedLand's HTTP server on port 1452
File Layout
| Path | Purpose | Backed up? |
|---|---|---|
/app/code/ |
FeedLand application | No (rebuilt on update) |
/app/code/config.json |
Symlink to /run/config.json |
No (regenerated on startup) |
/app/code/privateFiles |
Symlink to /app/data/privateFiles |
Yes |
/app/data/privateFiles/ |
Session tokens, user data | Yes |
/app/data/env.sh |
Your custom settings | Yes |
/app/data/.db_initialized |
First-run marker | Yes |
Maintenance
# View logs
cloudron logs -f --app feedland.example.com
# Open a shell
cloudron exec --app feedland.example.com
# Restart
cloudron restart --app feedland.example.com
Database Schema Changes
The database schema is only imported on first install. If a FeedLand update requires schema changes, you can re-import:
cloudron exec --app feedland.example.com
# Remove the initialization marker
rm /app/data/.db_initialized
# Exit and restart — schema will be re-imported
exit
cloudron restart --app feedland.example.com
Makefile Shortcuts
If you clone this repo for development, the Makefile provides shortcuts:
make build # Build Docker image (no cache)
make build-cached # Build Docker image (with cache)
make install # Build and install (first time)
make deploy APP=feedland.example.com # Build and update existing install
make update APP=feedland.example.com # Update without rebuild
make logs APP=feedland.example.com # Stream logs
make shell APP=feedland.example.com # Open a shell
make restart APP=feedland.example.com # Restart the app
Links
- FeedLand — the project
- FeedLand Install Guide — upstream documentation
- Cloudron Docs — Cloudron platform documentation
- Cloudron Packaging Guide — how Cloudron apps work