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

  1. Open http://your-server-ip:3000 in your browser
  2. Rallly loads directly — no setup wizard needed
  3. Create your first poll by clicking New Poll
  4. Enter a title, add date/time options, and share the generated link
  5. 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:

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:

SettingValue
Schemehttp
Forward hostnamerallly (container name)
Forward port3000
WebsocketsNot 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.

Comments