Deploying Ech0
Introduction
Ech0 is a next-generation open-source, self-hosted, lightweight federated publishing platform designed for individuals. It provides a clean, distraction-free environment for sharing thoughts, writings, and links with ultra-low resource consumption and full data sovereignty.
Key Features
- 🌐 Federated Social Network: ActivityPub protocol support for connecting with the Fediverse
- ✍️ Distraction-Free Writing: Clean online Markdown editor with rich plugin support and live preview
- ☁️ Ultra-Lightweight: Memory usage under 15MB, Docker image under 40MB
- 📦 Data Sovereignty: All content stored locally in SQLite database with RSS feed support
- 🔐 Secure Backup System: Web, TUI, and CLI modes for one-click export and automatic backups
- ♻️ Zero-Downtime Recovery: Online snapshot restore without service interruption
- 🚀 Instant Deployment: From installation to usage with just one command
- 🎨 Modern UI: Built with Vue.js 3 and responsive design
- 🔒 Privacy First: No ads, tracking, subscriptions, or external service dependencies
Tech Stack
- Backend: Go 1.25.3+ with Gin web framework
- Frontend: Vue.js 3 with TypeScript
- Database: SQLite 3 for atomic single-file storage
- Port: Default port 6277
- Image: sn0wl1n/ech0:latest (~40MB)
Use Cases
- Personal Microblogging: Share thoughts, notes, and links like a personal social network
- Federated Content: Connect with others through ActivityPub protocol
- Markdown Publishing: Write and publish formatted content with live preview
- RSS Feed Generation: Automatic RSS feeds for your published content
- Private Social Network: Self-hosted alternative to traditional social platforms
- Knowledge Sharing: Lightweight platform for sharing ideas and insights
Why Deploy Ech0 on Klutch.sh?
- Instant Deployment: Deploy from GitHub in minutes with automatic Docker detection
- Persistent Storage: Built-in volume management for SQLite database and backups
- Global Accessibility: Deploy globally with automatic HTTPS on custom domains
- Zero Configuration: No complex setup—just push your Dockerfile and deploy
- Cost-Effective: Pay only for what you use with transparent pricing
- Automatic Backups: Volume snapshots ensure your data is always protected
- Scalable Resources: Adjust compute resources as your platform grows
- ActivityPub Ready: Public domain support for federation with the Fediverse
Prerequisites
Before deploying Ech0, ensure you have:
- A Klutch.sh account
- A GitHub account for repository hosting
- Basic understanding of Docker and environment variables
- (Optional) A custom domain for ActivityPub federation
Preparing Your Ech0 Repository
Option 1: Use Official Docker Image
Create a simple Dockerfile that uses the official Ech0 image:
FROM sn0wl1n/ech0:latest
# Expose Ech0 portEXPOSE 6277
# Data and backup volumes will be mounted at runtimeVOLUME ["/app/data", "/app/backup"]
# The image already has the correct CMDOption 2: Build from Source (Advanced)
If you want to customize Ech0, you can build from source:
# Build stage - FrontendFROM node:24-alpine AS frontend-builder
WORKDIR /app/webCOPY web/package.json web/pnpm-lock.yaml ./RUN npm install -g pnpm && pnpm install
COPY web/ ./RUN pnpm build
# Build stage - BackendFROM golang:1.25-alpine AS backend-builder
# Install build dependenciesRUN apk add --no-cache gcc g++ musl-dev sqlite-dev
WORKDIR /app
# Copy Go modules first for better cachingCOPY go.mod go.sum ./RUN go mod download
# Copy source codeCOPY . .
# Copy built frontendCOPY --from=frontend-builder /app/web/dist ./web/dist
# Build the application with CGO for SQLiteENV CGO_ENABLED=1RUN go build -ldflags="-s -w" -o ech0 main.go
# Runtime stageFROM alpine:latest
# Install runtime dependenciesRUN apk add --no-cache ca-certificates tzdata sqlite-libs
WORKDIR /app
# Copy binary from builderCOPY --from=backend-builder /app/ech0 .
# Create directories for data and backupsRUN mkdir -p /app/data /app/backup
# Expose Ech0 portEXPOSE 6277
# Health checkHEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD wget --no-verbose --tries=1 --spider http://localhost:6277/api/health || exit 1
# Run Ech0CMD ["./ech0"]Creating a .dockerignore File
Optimize your build with a .dockerignore file:
# Dependenciesnode_modules/vendor/
# Build outputsweb/dist/*.exe*.test*.out
# Development files.git/.github/.vscode/*.md.env.env.local
# Data directoriesdata/backup/tmp/
# OS files.DS_StoreThumbs.dbEnvironment Variables Configuration
Create a .env.example file for reference:
# Server ConfigurationPORT=6277
# JWT Secret (REQUIRED - Change this!)JWT_SECRET=your-super-secret-jwt-key-change-this
# Server Address (Required for ActivityPub federation)SERVER_ADDRESS=https://yourdomain.com
# Optional: Meting API for music card featureMETING_API=https://api.example.com/meting
# Optional: Twikoo Comment APITWIKOO_API=https://twikoo.yourdomain.com
# Optional: S3 Storage ConfigurationS3_ENABLED=falseS3_ENDPOINT=s3.amazonaws.comS3_BUCKET=ech0-mediaS3_ACCESS_KEY=your-access-keyS3_SECRET_KEY=your-secret-keyS3_REGION=us-east-1
# Optional: Database backup scheduleBACKUP_ENABLED=trueBACKUP_INTERVAL=24hDeploying Ech0 on Klutch.sh
-
Push your Ech0 repository to GitHub:
Terminal window git initgit add .git commit -m "Initial Ech0 deployment"git branch -M maingit remote add origin https://github.com/yourusername/ech0.gitgit push -u origin main - Log into your Klutch.sh dashboard.
- Navigate to the **Apps** section and click **"Create App"**.
-
Configure your Ech0 deployment:
- App Name:
ech0(or your preferred name) - Repository: Select your Ech0 GitHub repository
- Branch:
main(or your deployment branch) - Traffic Type: HTTP (for web application)
- Internal Port:
6277(Ech0’s default port) - Region: Choose your preferred deployment region
- Compute: Start with Shared CPU (1 vCPU, 512MB RAM is sufficient)
- Instances:
1(increase for high-availability)
- App Name:
-
Add environment variables in the **Environment Variables** section:
Required:
JWT_SECRET=your-super-secret-jwt-key-please-change-thisRecommended (for ActivityPub):
SERVER_ADDRESS=https://your-app-name.klutch.shOptional:
METING_API=https://meting-api.example.comTWIKOO_API=https://twikoo.yourdomain.comBACKUP_ENABLED=trueBACKUP_INTERVAL=24h -
Configure **Persistent Volumes** for data persistence:
Primary Volume (Database):
- Mount Path:
/app/data - Size:
1 GB(adjust based on expected content volume)
Backup Volume (Optional but Recommended):
- Mount Path:
/app/backup - Size:
2 GB(should be larger than data volume)
- Mount Path:
- Click **"Create"** to deploy. Klutch.sh will: - Build your Docker image - Provision persistent volumes - Deploy your Ech0 instance - Generate a unique URL: `https://your-app-name.klutch.sh`
- Wait for the deployment to complete (typically 2-4 minutes).
- Access your Ech0 instance at the provided URL.
- **First-time setup**: Register an account. The first registered user automatically becomes the administrator with publishing permissions.
Configuration & Customization
JWT Security
The JWT_SECRET environment variable is critical for authentication security:
# Generate a secure random secretJWT_SECRET=$(openssl rand -hex 32)Important: Never use the default value "Hello Echos" in production. Update this in your Klutch.sh environment variables.
ActivityPub Federation Setup
To join the Fediverse and enable federation:
- **Bind a custom domain** to your Klutch.sh app (required for ActivityPub)
-
**Set the SERVER_ADDRESS** environment variable to your domain:
Terminal window SERVER_ADDRESS=https://yourdomain.com - **Restart your app** to apply changes
- **Verify federation** by visiting `https://yourdomain.com/.well-known/webfinger` in your browser
- **Add Connect accounts** from other Fediverse instances in Ech0's settings panel
RSS Feed Access
Ech0 automatically generates RSS feeds for your content:
# User feedhttps://your-app-name.klutch.sh/rss/user/@username
# All public contenthttps://your-app-name.klutch.sh/rss/publicSubscribe to these URLs in your favorite RSS reader (Feedly, NewsBlur, etc.).
Comment System Integration
Ech0 supports Twikoo for comments:
- Deploy a Twikoo backend (see Twikoo documentation)
-
Add the `TWIKOO_API` environment variable:
Terminal window TWIKOO_API=https://twikoo.yourdomain.com - Comments will automatically appear on posts
S3 Storage for Media
For external media storage, configure S3-compatible storage:
S3_ENABLED=trueS3_ENDPOINT=s3.amazonaws.comS3_BUCKET=ech0-mediaS3_ACCESS_KEY=AKIAIOSFODNN7EXAMPLES3_SECRET_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEYS3_REGION=us-east-1Note: Ensure your S3 bucket has public read access for uploaded media.
Music Card Feature
To enable music card sharing, set up a Meting API:
METING_API=https://meting-api.example.comIf not set, Ech0 uses the default API hosted on Vercel.
Custom Domains
To use your own domain with Ech0:
- Navigate to your app in the Klutch.sh dashboard
- Go to **Settings** → **Domains**
- Click **"Add Domain"** and enter your domain (e.g., `ech0.yourdomain.com`)
-
Add the provided CNAME record to your DNS provider:
Type: CNAMEName: ech0Value: your-app-name.klutch.sh
- Wait for DNS propagation (5-30 minutes)
- Update `SERVER_ADDRESS` environment variable to your custom domain
- Klutch.sh will automatically provision SSL/TLS certificates
Data Management & Backups
Manual Backup
Create a manual backup through Ech0’s web interface:
- Log in as administrator
- Navigate to **Settings** → **Data Management**
- Click **"Create Snapshot"** to generate a backup
- Download the snapshot file from the backup list
Automatic Backups
Enable automatic backups with environment variables:
BACKUP_ENABLED=trueBACKUP_INTERVAL=24h # Daily backupsBackups are stored in /app/backup directory (your mounted volume).
Restore from Backup
To restore from a backup snapshot:
Web Interface (Zero-Downtime):
- Go to **Settings** → **Data Management**
- Click **"Restore Snapshot"**
- Select your backup file
- Confirm restoration
- If data doesn't appear immediately, restart the container
Manual Restoration:
- Stop your Ech0 app in Klutch.sh dashboard
- Access your volume through Klutch.sh file browser
- Replace files in `/app/data` with your backup
- Restart your app
Volume Snapshots
Leverage Klutch.sh’s volume snapshot feature:
- Navigate to **Volumes** in your Klutch.sh dashboard
- Select your Ech0 data volume
- Click **"Create Snapshot"** for point-in-time backups
- Restore from snapshots if needed
User Management & Permissions
Administrator Setup
The first registered user becomes the system administrator with full permissions:
- Publish content (posts, images, links)
- Manage system settings
- Assign permissions to other users
- Access data management features
- Configure federation settings
Granting Publishing Permissions
By default, only administrators can publish content. To grant permissions:
- Log in as administrator
- Navigate to **Settings** → **User Management**
- Select a user
- Toggle **"Publishing Permissions"**
- Save changes
Note: Ech0 intentionally keeps permissions simple (Admin vs Non-Admin) to maintain a lightweight architecture. Be cautious when assigning administrator privileges.
Publishing Content
Writing Posts
- Click the **"New Post"** button
- Use the Markdown editor with live preview
- Add text, images, or extended content (music/video cards)
- Click **"Publish"** when ready
Content Guidelines
Ech0 works best with focused content:
Recommended:
- Short-form text posts
- Text + images
- Text + extended content (music/video)
- Single images with captions
Not Recommended:
- Dense posts combining text + images + extended content
- Long-form articles (use external platforms and link instead)
- Multiple extended content items in one post
Markdown Features
Ech0 supports rich Markdown formatting:
# Headers (H1-H6)**Bold** and *Italic* text[Links](https://example.com)
- Bullet lists1. Numbered lists
> Blockquotes
`Inline code` and
```code blocks```
Tables, task lists, and more...Media Uploads
Upload images directly through the editor:
- Drag and drop images
- Click the image button to browse files
- Paste images from clipboard
- Automatic image processing and optimization
If S3 storage is configured, media is uploaded to S3. Otherwise, it’s stored locally in your SQLite database.
Production Best Practices
Security Hardening
-
**Strong JWT Secret**: Never use default values
Terminal window # Generate secure secretopenssl rand -base64 32 - **HTTPS Enforcement**: Always use custom domains with SSL/TLS certificates (automatic with Klutch.sh)
-
**Environment Variables**: Never commit secrets to Git
Terminal window # Use .gitignore.env.env.local.env.production - **User Permissions**: Be selective about administrator access
- **Public Access**: Consider whether your instance should be publicly accessible or behind authentication
Performance Optimization
-
**Compute Resources**: Monitor memory usage (should stay under 50MB for typical usage)
Terminal window # Recommended starting resourcesCPU: Shared (1 vCPU)Memory: 512MB RAM -
**Volume Size Planning**:
Data Volume: Start with 1GB, grow as neededBackup Volume: 2x data volume size
- **Image Optimization**: Enable S3 storage for better performance with many media files
- **Caching**: Ech0 includes built-in caching for optimal response times
- **Database Maintenance**: SQLite is self-maintaining, but consider periodic vacuum operations for large databases
Monitoring & Health Checks
Ech0 provides health check endpoints:
# Health check endpointcurl https://your-app-name.klutch.sh/api/health
# Expected response{ "status": "healthy", "timestamp": "2025-01-15T10:30:00Z", "database": "connected", "uptime": "72h30m"}Monitor these metrics:
- Response time (should be < 100ms for most requests)
- Memory usage (< 50MB typical)
- Volume usage (check data and backup volumes)
- Federation connectivity (if using ActivityPub)
Backup Strategy
Implement a comprehensive backup strategy:
Daily Automated Backups:
BACKUP_ENABLED=trueBACKUP_INTERVAL=24hWeekly Manual Backups:
- Export full snapshots through web interface
- Store off-site (download to local machine)
Volume Snapshots:
- Create Klutch.sh volume snapshots before major changes
- Keep at least 3 rolling snapshots
Disaster Recovery:
- Test restore procedures quarterly
- Document recovery steps
- Keep SQLite database backup accessible
Scaling Considerations
Ech0 is designed for personal use with minimal scaling needs:
Vertical Scaling:
- Increase compute resources if experiencing performance issues
- Typical installations rarely need more than 512MB RAM
Volume Expansion:
- Expand data volume as content grows (easy through Klutch.sh dashboard)
- Monitor volume usage and expand before reaching 80% capacity
Multi-Instance (Advanced):
- Ech0 uses SQLite, which doesn’t support multi-instance write operations
- For high-availability, consider read-replicas with custom setup
- Not recommended unless you have advanced database replication experience
Updates & Maintenance
Keep your Ech0 instance updated:
- **Check for updates** at the Ech0 releases page
-
**Create a backup** before updating:
Terminal window # Through web interfaceSettings → Data Management → Create Snapshot -
**Update your Dockerfile** if using official image:
FROM sn0wl1n/ech0:v3.0.4 # Pin specific version
-
**Rebuild and redeploy** on Klutch.sh:
Terminal window git add Dockerfilegit commit -m "Update Ech0 to v3.0.4"git push origin main - **Verify functionality** after update
Troubleshooting
App Won’t Start
Symptoms: Container fails to start or crashes immediately
Solutions:
- Check logs in Klutch.sh dashboard under **Logs** tab
-
Verify environment variables are set correctly:
Terminal window # Required variableJWT_SECRET=your-secret-key -
Ensure volumes are properly mounted:
/app/data → Data volume/app/backup → Backup volume
- Check port configuration (internal port must be 6277)
Cannot Access Ech0
Symptoms: URL returns 502 or 503 errors
Solutions:
- Verify app is running in Klutch.sh dashboard
-
Check health endpoint:
Terminal window curl https://your-app-name.klutch.sh/api/health - Ensure traffic type is set to **HTTP** (not TCP)
- Wait 2-3 minutes after deployment for services to initialize
- Check for firewall or network restrictions
Database Corruption
Symptoms: Data not loading, SQLite errors in logs
Solutions:
- Stop the application
-
Restore from latest backup:
Terminal window # Through Klutch.sh volume browserNavigate to /app/backupCopy latest backup to /app/data -
If no backup available, try SQLite recovery:
Terminal window # Access volume through Klutch.shsqlite3 /app/data/ech0.db ".recover" > recovered.sql - Restart application
Publishing Fails
Symptoms: “Contact Administrator” error when trying to publish
Solutions:
-
Verify user has publishing permissions:
Settings → User Management → Check user permissions
- Ensure you're logged in as administrator (first registered user)
-
Check disk space in data volume:
Terminal window # In Klutch.sh dashboardVolumes → Check usage percentage - Review logs for specific error messages
ActivityPub Federation Not Working
Symptoms: Cannot connect with other instances, federation errors
Solutions:
-
Verify custom domain is properly configured:
Terminal window # Must use custom domain (not .klutch.sh)SERVER_ADDRESS=https://yourdomain.com -
Check DNS propagation:
Terminal window dig yourdomain.com CNAME - Verify SSL certificate is active (automatic with Klutch.sh)
-
Test WebFinger endpoint:
Terminal window curl https://yourdomain.com/.well-known/webfinger - Restart app after setting `SERVER_ADDRESS`
Connects Not Displaying
Symptoms: Some federated connections don’t show up
Solutions:
- This is normal behavior - Ech0 fetches instance info on-demand
- Unreachable or offline instances are automatically filtered out
-
Check if remote instances are online:
Terminal window curl https://remote-instance.com/api/health - Try removing and re-adding the connection
High Memory Usage
Symptoms: Memory usage exceeds 100MB
Solutions:
-
This is unusual for Ech0 - check for issues:
Terminal window # Review logs for memory leaks - Verify no large media files in local storage (use S3 instead)
- Restart the application to clear memory
-
Increase compute resources if consistently high:
Upgrade to: 1 vCPU, 1GB RAM
Backup/Restore Issues
Symptoms: Cannot create or restore backups
Solutions:
-
Verify backup volume is mounted and has space:
Mount Path: /app/backupAvailable Space: Check in Volumes dashboard
- Check write permissions on backup volume
-
Manual backup as alternative:
Terminal window # Download database directlyNavigate to Volumes → Download /app/data/ech0.db - If restore doesn't show new data, manually restart container
S3 Media Upload Failures
Symptoms: Images fail to upload with S3 enabled
Solutions:
-
Verify S3 credentials are correct:
Terminal window S3_ACCESS_KEY=AKIAIOSFODNN7EXAMPLES3_SECRET_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY - Ensure bucket has public read access
-
Check endpoint format (no http:// or https:// prefix):
Terminal window S3_ENDPOINT=s3.amazonaws.com # CorrectS3_ENDPOINT=https://s3.amazonaws.com # Wrong -
Verify bucket region matches configuration:
Terminal window S3_REGION=us-east-1 - Test S3 connection with AWS CLI or SDK
RSS Feed Not Working
Symptoms: RSS URL returns 404 or empty feed
Solutions:
-
Verify correct RSS URL format:
https://your-app-name.klutch.sh/rss/user/@usernamehttps://your-app-name.klutch.sh/rss/public
- Ensure posts are published (not drafts)
- Check if content visibility is set to public
- Test URL in browser before adding to RSS reader
Additional Resources
- Official Ech0 Website & Documentation
- Ech0 GitHub Repository
- Ech0 Release Notes & Updates
- Ech0 Community Discussions
- Report Issues & Bugs
- Ech0 Hub - Discover Instances
- Live Demo Instance
- ActivityPub Protocol Documentation
- Twikoo Comment System
- Markdown Guide
Related Klutch.sh Guides
- Custom Domains - Configure your own domain for ActivityPub
- Persistent Volumes - Understanding volume management
- Monitoring & Logs - Monitor your Ech0 instance
- Environment Variables - Managing secrets securely
Congratulations! You’ve successfully deployed Ech0 on Klutch.sh. You now have a lightweight, self-hosted federated publishing platform ready to share your thoughts with the world. Remember to configure your JWT secret, set up backups, and enjoy distraction-free writing! 🚀