Self-Hosting Rallly with Docker Compose
What Is Rallly?
Rallly (three L’s) is a self-hosted scheduling and polling tool — a direct replacement for Doodle. Create a poll with date/time options, share the link, and participants vote on their availability. No account required for participants. It’s built with Next.js and stores everything in PostgreSQL. Clean UI, fast, and privacy-respecting.
Official site: https://rallly.co
Prerequisites
- A Linux server (Ubuntu 22.04+ recommended)
- Docker and Docker Compose installed (guide)
- 512 MB of free RAM
- SMTP credentials for email notifications (Rallly needs to send poll invitations)
- A domain name (optional but recommended for sharing poll links)
Docker Compose Configuration
Create a docker-compose.yml file:
services:
rallly-db:
image: postgres:16-alpine
container_name: rallly-db
restart: unless-stopped
environment:
POSTGRES_DB: rallly
POSTGRES_USER: rallly
POSTGRES_PASSWORD: change-this-db-password # CHANGE THIS
volumes:
- rallly-db:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U rallly"]
interval: 10s
timeout: 5s
retries: 5
rallly:
image: lukevella/rallly:v4.7.4
container_name: rallly
restart: unless-stopped
depends_on:
rallly-db:
condition: service_healthy
ports:
- "3000:3000"
environment:
# Required
DATABASE_URL: postgres://rallly:change-this-db-password@rallly-db:5432/rallly # Match DB password above
SECRET_PASSWORD: change-this-to-a-32-char-secret # CHANGE THIS — minimum 32 characters
NEXT_PUBLIC_BASE_URL: http://localhost:3000 # Set to your domain (e.g., https://rallly.example.com)
SUPPORT_EMAIL: [email protected] # Contact email shown to users
# SMTP — required for email notifications
SMTP_HOST: smtp.example.com # Your SMTP server
SMTP_PORT: "587" # Usually 587 (STARTTLS) or 465 (SSL)
SMTP_USER: your-smtp-username # SMTP username
SMTP_PWD: your-smtp-password # SMTP password
SMTP_SECURE: "true" # true for TLS/SSL
NOREPLY_EMAIL: [email protected] # Sender address for notifications
# Optional
ALLOWED_EMAILS: "" # Restrict registration (e.g., "*@example.com")
volumes:
rallly-db:
Generate the SECRET_PASSWORD (minimum 32 characters):
openssl rand -base64 32
Create a .env file to keep secrets out of the Compose file:
# .env
DB_PASSWORD=your-strong-database-password
SECRET_PASSWORD=your-32-char-secret-from-openssl
SMTP_HOST=smtp.example.com
SMTP_PORT=587
SMTP_USER=your-smtp-user
SMTP_PWD=your-smtp-password
Start the stack:
docker compose up -d
Database migrations run automatically on first start. The app is ready in ~15 seconds.
Initial Setup
- Open
http://your-server-ip:3000in your browser - Rallly loads directly — no setup wizard needed
- Create your first poll by clicking New Poll
- Enter a title, add date/time options, and share the generated link
- Participants click the link and vote on their availability without creating an account
To register an admin account, click Login and follow the registration flow. The first user has no restrictions. Subsequent registrations can be limited using the ALLOWED_EMAILS environment variable.
Configuration
SMTP is required. Rallly sends poll invitations, reminders, and comment notifications via email. Without SMTP configured, participants won’t receive email invitations (they can still vote via the direct link).
Access control: Set ALLOWED_EMAILS to restrict who can create polls. Examples:
*@yourcompany.com— only your company’s email domain[email protected],[email protected]— specific people only- Empty string — anyone can register
Base URL: Set NEXT_PUBLIC_BASE_URL to your public domain. This URL appears in poll invitation emails and share links. Use HTTPS in production.
Reverse Proxy
Rallly serves HTTP on port 3000. Put it behind a reverse proxy for HTTPS:
| Setting | Value |
|---|---|
| Scheme | http |
| Forward hostname | rallly (container name) |
| Forward port | 3000 |
| Websockets | Not needed |
Remember to update NEXT_PUBLIC_BASE_URL to match your public HTTPS URL after setting up the proxy.
For detailed reverse proxy setup: Reverse Proxy Setup
Backup
Rallly stores all data in PostgreSQL. Back up the database:
docker exec rallly-db pg_dump -U rallly rallly > rallly-backup-$(date +%Y%m%d).sql
Restore from backup:
cat rallly-backup-20260224.sql | docker exec -i rallly-db psql -U rallly rallly
The rallly-db named volume contains the database data. Include this volume in your backup strategy.
For backup strategies: Backup Strategy
Troubleshooting
Emails not sending
Symptom: Poll invitations and notifications don’t arrive.
Fix: Check your SMTP configuration. Run docker logs rallly and look for SMTP errors. Common issues: wrong port (use 587 for STARTTLS, 465 for SSL), incorrect credentials, or your SMTP provider blocking the “from” address. Test with a known-working SMTP service like SendGrid or Mailgun first.
Database connection error on startup
Symptom: Rallly exits with “Connection refused” or “ECONNREFUSED.”
Fix: Ensure the DATABASE_URL host matches the database service name in your Compose file (rallly-db). The database password in DATABASE_URL must match POSTGRES_PASSWORD. Wait for the health check — Rallly’s depends_on: condition: service_healthy ensures the DB is ready before the app starts.
”Invalid SECRET_PASSWORD” error
Symptom: Rallly refuses to start, logs mention secret password.
Fix: SECRET_PASSWORD must be at least 32 characters. Generate one with openssl rand -base64 32. Don’t change this value after initial setup — it encrypts session data. Changing it invalidates all existing sessions.
Resource Requirements
- RAM: 150–200 MB idle, 300–500 MB under load (including PostgreSQL)
- CPU: Low — single core sufficient for hundreds of concurrent polls
- Disk: 500 MB for the application, database grows ~1–5 MB per 100 polls
Rallly is extremely lightweight. It runs comfortably on the smallest VPS tier or alongside other services on a home server.
Verdict
Rallly is the best self-hosted Doodle replacement available. The UI is clean and modern, participants don’t need accounts to vote, and the Docker setup takes under 5 minutes. The only dependency is PostgreSQL and an SMTP server for email notifications. If you schedule group meetings or events and want to stop using Doodle, this is the answer. For more complex scheduling needs — appointment booking with calendar integration, payment processing, or public booking pages — look at Cal.com instead.
Related
Get self-hosting tips in your inbox
Get the Docker Compose configs, hardware picks, and setup shortcuts we don't put in articles. Weekly. No spam.
Comments