Matthew Meszaros 89e5533dd0 feat(worker): add one-command VPS installer with IP-derived identity
scripts/install-worker.sh is a single bash script any Debian/Ubuntu/RHEL/
Fedora/Arch/Alpine VPS can curl|sh to add a worker to the fleet.

Identity is bound to the VPS's public IPv4 via UUIDv5 (URL namespace):

  same IP  → same worker  (reputation persists across reinstalls)
  new IP   → new worker   (fresh identity, no inherited reputation)

The installer detects the public IP via api.ipify.org / ifconfig.me /
checkip.amazonaws.com, derives the deterministic UUID, installs Docker if
missing, writes /etc/warmbly/worker.env (0600) and /etc/warmbly/worker.id,
installs a systemd unit that runs the worker container with --hostname
<uuid>, and starts the service.

Supports --install/--update/--uninstall/--purge/--status, --env-file for
non-interactive config, --ip override, --image override, and a full set
of per-credential flags.

Worker reads its UUID from os.Hostname() at startup, so the systemd
hostname value becomes the worker identity — no separate registration
step needed.
2026-05-18 13:08:16 +00:00
2026-02-14 05:49:49 +01:00
2026-02-14 05:49:49 +01:00
2026-01-30 04:29:07 +01:00
2026-01-17 09:19:43 +00:00

Warmbly

Email warmup and cold email platform.

Overview

Warmbly is a microservices-based platform for email warmup and cold outreach. It supports Gmail (via API) and IMAP/SMTP providers, with real-time event streaming, distributed workers, and comprehensive tracking.

Architecture

The Frontend (React) connects to three backend services: the Backend API (Go, :8080), Realtime (Elixir/Phoenix, :4000), and Tracking (Rust, :3000).

All three services publish events to Kafka (with Avro/Schema Registry). The Realtime service also uses Google Pub/Sub for cross-node message fanout.

Downstream from Kafka, the Consumer (Go) processes tracking events and the Worker (Go, 1 per machine) handles email operations. Both read/write to PostgreSQL, Redis, and Cassandra (DataStax Astra).

Tech Stack

Component Technology
Backend API Go 1.25, Gin
Consumer Go, Kafka consumer
Worker Go, distributed (1 per machine)
Tracking Rust, Axum
Realtime Elixir 1.18, Phoenix Channels
Message Queue Confluent Kafka with Avro/Schema Registry
Primary Database PostgreSQL 16 (AWS RDS)
Time-series DataStax Astra (Cassandra)
Cache Redis 7
Object Storage AWS S3
Pub/Sub Google Cloud Pub/Sub
Task Queue Google Cloud Tasks

Services

Service Port Description
Backend 8080 REST API, authentication, business logic
Tracking 3000 Pixel tracking and click tracking
Realtime 4000 WebSocket gateway for real-time events
Consumer - Kafka event consumer, processes tracking events
Worker - Distributed worker for email operations

Quick Start (Development)

Prerequisites

  • Docker and Docker Compose
  • Go 1.25+ (for local development)
  • Rust (for tracking service)
  • Elixir 1.18+ (for realtime service)

Start with Docker Compose

cd deploy/docker

# Start infrastructure only (database, redis, kafka)
docker-compose up -d postgres redis kafka schema-registry

# Start all services
docker-compose up

Service URLs (Local)

Project Structure

  • cmd/ — Service entrypoints: backend/, consumer/, worker/
  • internal/ — Core Go code:
    • api/ — HTTP handlers
    • app/ — Application services (auth, email, campaign, etc.)
    • config/ — Configuration loading (env vars + AWS Secrets Manager)
    • events/ — Kafka event schemas
    • infrastructure/ — Database, cache, and queue clients
    • models/ — Domain models
    • notify/ — Email notification service and templates
    • pkg/ — Internal packages (emsg, crypto, etc.)
    • repository/ — Data access layer
  • tracking/ — Rust tracking service (Axum)
  • realtime/ — Elixir WebSocket service (Phoenix Channels)
  • web/ — React frontend
  • deploy/ — Docker Compose, Dockerfiles, Kubernetes manifests
  • resources/ — Technical documentation

Documentation

Building

# Go services (from root)
go build -o bin/backend ./cmd/backend
go build -o bin/consumer ./cmd/consumer
go build -o bin/worker ./cmd/worker

# Tracking service
cd tracking && cargo build --release

# Realtime service
cd realtime && mix deps.get && mix release

CI/CD Pipeline

Warmbly uses GitHub Actions for CI/builds and GitOps for deployments.

PRs trigger CI (tests, linting, security scan). Merging to main builds and pushes Docker images. Tagging a release (v*.*.*) triggers a production deploy via ArgoCD.

Workflow Trigger Purpose
ci.yml PR/Push Tests, linting, security scan
build-push.yml Push to main Build & push Docker images
release.yml Tag v*.*.* Build release images (triggers prod deploy)

License

Licensed under the Apache License 2.0.

Copyright 2026 Mindroot Ltd

Full license: LICENSE

Languages
Go 41.3%
TypeScript 36.5%
Swift 9.9%
Astro 9.3%
Elixir 0.9%
Other 2%