A production-ready, containerized deployment of Rowt - the self-hosted deep linking solution.
π For complete Rowt documentation and features, see the Original Rowt README
This fork provides a complete Docker-based deployment solution with Traefik integration for secure, production-ready hosting.
- π― Custom Shortcodes: Create memorable custom shortcodes for your links! Specify your own 1-12 character shortcodes using letters, numbers, hyphens, and underscores. Perfect for branded links like
yourdomain.com/promo2024
oryourdomain.com/signup
. Auto-generation still works when no custom shortcode is provided.
- π― Custom Shortcodes: Create memorable custom shortcodes (1-12 chars) or use auto-generated 12-character UIDs. Perfect for branded links and easy sharing! Learn more β
- π Parameterized Links: Create dynamic links with URL parameters - one template for thousands of variations! Perfect for multi-merchant platforms, user-specific redirects, and campaign tracking. Learn more β
- π± Deep Link Management: iOS/Android app scheme handling with web fallbacks
- π Analytics Tracking: Built-in interaction logging with device/country detection
- π JWT Authentication: Secure API access with refresh tokens and blacklisting
- β‘ Rate Limiting: Built-in abuse prevention (30 req/min default)
- π§Ή Auto Cleanup: Scheduled data retention and token management
- π³ Production Ready: Docker deployment with Traefik integration
- Docker & Docker Compose
- Existing Traefik reverse proxy (with Let's Encrypt)
- Domain name (e.g.,
rowt.yourdomain.com
)
git clone <this-repo>
cd rowt
cp .env.example .env
Edit .env
with your settings:
# Domain Configuration
DOMAIN=rowt.yourdomain.com
TRAEFIK_NETWORK=traefik
# Database (PostgreSQL recommended)
ROWT_DATABASE_URL=postgresql://rowt_user:rowt_password@postgres:5432/rowt_db
# Security (IMPORTANT: Change these!)
ROWT_JWT_SECRET=your-secure-32-character-secret-here
[email protected]
ROWT_ADMIN_PASSWORD=your-secure-password
# Single-tenant mode (recommended)
ROWT_TENANT_MODE=single-tenant
# Using the deployment script
./deploy.sh --with-traefik
# Or manually
docker-compose up -d
# Using the deployment script (port 3000)
./deploy.sh --standalone
# Using the deployment script (custom port)
./deploy.sh --standalone --port 8080
# Or manually
ROWT_PORT=3000 docker-compose -f docker-compose.yml -f docker-compose.standalone.yml up -d
REM With Traefik
deploy.bat --with-traefik
REM Standalone
deploy.bat --standalone --port 3000
Access your application:
- With Traefik:
https://rowt.yourdomain.com
(or your configured domain) - No ports exposed - Standalone:
http://localhost:3000
(or your configured port) - Only app port exposed
Security Note: Production deployments with Traefik expose no external ports for better security. Database and internal services are only accessible within the Docker network.
This deployment assumes you have Traefik already running. The configuration includes:
- Automatic HTTPS via Let's Encrypt
- HTTP to HTTPS redirect
- Security headers
- External Traefik network connection
Variable | Description | Example |
---|---|---|
DOMAIN |
Your domain name | rowt.yourdomain.com |
TRAEFIK_NETWORK |
Traefik network name | traefik |
ROWT_TENANT_MODE |
Single or multi-tenant | single-tenant |
ROWT_JWT_SECRET |
JWT signing secret | 32-char-random-string |
ROWT_ADMIN_EMAIL |
Admin email | [email protected] |
ROWT_ADMIN_PASSWORD |
Admin password | secure-password |
PostgreSQL (Recommended for Production):
ROWT_DATABASE_URL=postgresql://user:pass@postgres:5432/rowt_db
ROWT_DB_TYPE=postgres
ROWT_DB_SSL=false
SQLite (Development/Small Scale):
ROWT_DATABASE_URL=sqlite:database.sqlite
ROWT_DB_TYPE=sqlite
rowt/
βββ docker-compose.yml # Main deployment configuration
βββ docker-compose.override.yml # Development overrides
βββ Dockerfile # Multi-stage production build
βββ .env.example # Environment template
βββ init-db.sql # Database initialization
βββ start.sh / start.bat # Deployment scripts
βββ DEPLOYMENT.md # Detailed deployment guide
βββ ORIGINAL_README.md # Original Rowt documentation
βββ src/ # Rowt server source code
Linux/macOS:
./start.sh setup # Initial setup
./start.sh start # Start services
./start.sh logs # View logs
./start.sh backup # Backup database
./start.sh stop # Stop services
Windows:
start.bat setup # Initial setup
start.bat start # Start services
start.bat logs # View logs
start.bat backup # Backup database
start.bat stop # Stop services
# Start services
docker-compose up -d
# View logs
docker-compose logs -f rowt-server
# Stop services
docker-compose down
# Rebuild and restart
docker-compose down
docker-compose up -d --build
# Database backup
docker-compose exec postgres pg_dump -U rowt_user rowt_db > backup.sql
- Non-root container execution
- Multi-stage Docker build for minimal attack surface
- Automatic HTTPS via Traefik + Let's Encrypt
- Security headers configured
- HTTP to HTTPS redirect enforced
- Rate limiting built-in
- JWT-based authentication
- Health endpoint:
https://yourdomain.com/health
- Docker health checks configured
- Traefik dashboard integration
- Structured logging available
# Pull latest changes
git pull origin main
# Rebuild and restart
./deploy.sh --build
# Or manually
docker-compose down
docker-compose build --no-cache
docker-compose up -d
# Verify update
curl https://yourdomain.com/health
If you encounter this error during deployment:
failed to compute cache key: "/.env.example": not found
Solution: Make sure .env.example
exists and is not excluded by .dockerignore
:
# Check if file exists
ls -la .env.example
# If missing, recreate it
git checkout .env.example
# Rebuild
docker-compose build --no-cache
If you get port conflicts during deployment:
For PostgreSQL port 5432 conflict:
# This is fixed in production - no database ports are exposed
# If using development mode, stop conflicting services:
sudo systemctl stop postgresql # Linux
brew services stop postgresql # Mac
For application port conflicts in standalone mode:
# Use a different port
./deploy.sh --standalone --port 8080
# Or find what's using the port
netstat -tulpn | grep :3000 # Linux/Mac
netstat -an | findstr :3000 # Windows
Recommended: Use Traefik mode for production (no port conflicts):
./deploy.sh --with-traefik
- Deployment Guide - Comprehensive deployment instructions
- Original Rowt README - Complete Rowt documentation
- Rowt Official Docs - Official documentation
This fork adds:
- β Parameterized Links Create dynamic links with URL parameters
- β Production-ready Dockerfile with multi-stage build
- β Traefik integration with automatic HTTPS
- β Docker Compose setup with PostgreSQL
- β Security hardening and best practices
- β Health checks and monitoring
- β Deployment scripts for easy management
- β Comprehensive documentation
This is a deployment-focused fork. For Rowt core features and issues:
- Core Rowt Issues: Rowt-Deeplinks/create-rowt-server
- Deployment Issues: Create issues in this repository
Same as original Rowt project. See ORIGINAL_README.md for details.
π Original Rowt Project | π Rowt Documentation | π Deployment Guide