# Rallly - Időpont szavazás (Doodle alternatíva) # Domain: ${SUBDOMAIN}.${DOMAIN} # Database: postgres # RAM: ~50M (mem_limit: 256M) | Pi-compatible: Yes # # Environment variables: # DOMAIN - Your domain (e.g., demo-felhom.eu) # SECRET_PASSWORD - Titkosítási kulcs (auto-generated) # DB_PASSWORD - Adatbázis jelszó (auto-generated) services: rallly: image: lukevella/rallly:3.11.2 container_name: rallly restart: unless-stopped depends_on: rallly-postgres: condition: service_healthy environment: - TZ=Europe/Budapest - DATABASE_URL=postgresql://rallly:${DB_PASSWORD}@rallly-postgres:5432/rallly - SECRET_PASSWORD=${SECRET_PASSWORD} - NEXT_PUBLIC_BASE_URL=https://${SUBDOMAIN}.${DOMAIN} # App-email (managed relay). Injected by the controller only when app-email is on (global + # per-app); empty SMTP_HOST keeps Rallly mail disabled. Rallly (Nodemailer) reads these at send # time. SMTP_SECURE=false → STARTTLS to the shim; SMTP_REJECT_UNAUTHORIZED=false accepts the # shim's self-signed cert (v4 flag; v3.x accepts self-signed by default). See .felhom.yml smtp_mapping. - SMTP_HOST=${SMTP_HOST:-} - SMTP_PORT=${SMTP_PORT:-587} - SMTP_SECURE=${SMTP_SECURE:-false} - SMTP_REJECT_UNAUTHORIZED=${SMTP_REJECT_UNAUTHORIZED:-true} # NOREPLY_EMAIL + SUPPORT_EMAIL are REQUIRED by Rallly at boot (it refuses to start without valid # emails), independent of whether mail can actually send. Default them to valid addresses so Rallly # boots with app-email OFF; the relay overrides NOREPLY_EMAIL to rallly@felhom.eu when ON. - NOREPLY_EMAIL=${NOREPLY_EMAIL:-noreply@${DOMAIN}} - NOREPLY_EMAIL_NAME=${NOREPLY_EMAIL_NAME:-Felhom} - SUPPORT_EMAIL=${SUPPORT_EMAIL:-noreply@${DOMAIN}} networks: - traefik-public - rallly-internal deploy: resources: limits: memory: 256M # The rallly image has NO wget/curl — the old wget healthcheck always failed (exit 127), marking the # container unhealthy, which made Traefik refuse to publish a route to it. Use Node (always present). # rallly's "/" returns 307 → /login, so accept any status < 500. healthcheck: test: ["CMD", "node", "-e", "require('http').get('http://127.0.0.1:3000',r=>process.exit(r.statusCode<500?0:1)).on('error',()=>process.exit(1))"] interval: 30s timeout: 5s retries: 3 start_period: 30s labels: - "traefik.enable=true" - "traefik.http.routers.rallly.rule=Host(`${SUBDOMAIN}.${DOMAIN}`)" - "traefik.http.routers.rallly.entrypoints=websecure" - "traefik.http.routers.rallly.tls=true" - "traefik.http.routers.rallly.tls.certresolver=letsencrypt" - "traefik.http.services.rallly.loadbalancer.server.port=3000" rallly-postgres: image: postgres:16-alpine container_name: rallly-postgres restart: unless-stopped environment: - POSTGRES_USER=rallly - POSTGRES_PASSWORD=${DB_PASSWORD} - POSTGRES_DB=rallly - TZ=Europe/Budapest volumes: - rallly_postgres_data:/var/lib/postgresql/data networks: - rallly-internal deploy: resources: limits: memory: 256M healthcheck: test: ["CMD-SHELL", "pg_isready -U rallly -d rallly"] interval: 10s timeout: 5s retries: 5 start_period: 20s volumes: rallly_postgres_data: networks: traefik-public: external: true rallly-internal: