Services About Us Why Choose Us Our Team Development Workflow Technology Stack Case Studies Portfolio Blog Free Guides Shopify Audit ($499) Estimate Project Contact Us
Back to Insights
Ruby on Rails • Sep 24, 2026 • 5 min read

Building Multi-Tenant SaaS on Rails 8: Kamal 2, SSL & Custom Domains

Building a multi-tenant SaaS on Rails 8 requires database-level isolation via ActiveRecord::Base.connected_to, edge-terminated dynamic SSL provisioning through Kamal 2 proxy extensions, and dynamic rack middleware rou...

TV
TechVinta Team
Specialized in Rails, React, Marketplace & Sharetribe Flex Architecture
Verified Technical Guide
Building Multi-Tenant SaaS on Rails 8: Kamal 2, SSL & Custom Domains

Direct Answer: Building Multi-Tenant SaaS on Rails 8: Kamal 2, SSL & Custom Domains (Sep 2026)

Building a multi-tenant SaaS on Rails 8 requires database-level isolation via ActiveRecord::Base.connected_to, edge-terminated dynamic SSL provisioning through Kamal 2 proxy extensions, and dynamic rack middleware routing. By leveraging Kamal 2's native zero-downtime rolling deploys and Let's Encrypt automated ACME challenges, engineers can deliver enterprise-grade tenant separation at a fraction of traditional Kubernetes complexity.

Architectural Overview: The Rails 8 Multi-Tenant Engine

Modern B2B SaaS applications demand absolute data segregation, lightning-fast custom domain mapping (e.g., tenant.com routing to app.techvinta.com), and seamless SSL lifecycle management. In 2026, the standard stack has evolved past monolithic Heroku add-ons and brittle NGINX sidecars. Instead, modern production architectures leverage native Rails 8 features combined with the container orchestration power of Kamal 2.

At TechVinta, our Principal Solutions Architects design multi-tenant infrastructures that scale from zero to millions of requests without architectural rewrites. When building out your platform, the topology typically relies on three pillars:

  • Database-per-Tenant Isolation: Utilizing Rails 8 multi-database connection management to route tenant requests to dedicated PostgreSQL schemas or independent databases.
  • Kamal 2 Edge Proxy & SSL: Using Kamal-proxy to dynamically handle wildcard routing and automated Let’s Encrypt certificate generation for custom domains.
  • Dynamic Middleware Routing: Custom Rack middleware that resolves inbound requests by host, setting the active tenant context before execution hits the controller layer.

Step 1: Configuring Rails 8 Multi-Database Schema Isolation

Rails 8 provides first-class support for horizontal multi-tenancy. Rather than relying solely on shared-database row-level security (which introduces risk during high-volume background job processing), schema-based or database-per-tenant architectures offer superior compliance and security.

Configure your config/database.yml to support dynamic connection switching:

default: & &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

development:
  <<: *default
  database: techvinta_saas_development

production:
  primary:
    <<: *default
    database: techvinta_saas_production
    username: <%= ENV["DATABASE_USERNAME"] %>
    password: <%= ENV["DATABASE_PASSWORD"] %>
    host: <%= ENV["DATABASE_HOST"] %>

Next, implement a custom Rack middleware to intercept incoming HTTP requests, extract the subdomain or custom domain, and switch the ActiveRecord connection context:

# app/middleware/tenant_elevator.rb
class TenantElevator
  def initialize(app)
    @app = app
  end

  def call(env)
    request = Rack::Request.new(env)
    host = request.host
    
    tenant = Tenant.find_by(subdomain: host.split(".").first) || Tenant.find_by(custom_domain: host)

    if tenant
      ActiveRecord::Base.connected_to(database: tenant.database_key) do
        Current.tenant = tenant
        @app.call(env)
      end
    else
      [404, { "Content-Type" => "text/plain" }, ["Tenant not found"]]
    end
  end
end

Step 2: Automated SSL and Custom Domains with Kamal 2

Kamal 2 introduces advanced edge routing capabilities through its integrated proxy. Managing custom domains used to require complex Certbot cron jobs and manual NGINX reloads. With Kamal 2, SSL termination and dynamic certificate issuance are handled at the proxy layer, communicating directly with Let's Encrypt via ACME protocols.

Configure your config/deploy.yml to expose the required proxy ports and set up persistent volumes for certificate storage:

# config/deploy.yml
service: techvinta-saas
image: techvinta/saas-engine

servers:
  web:
    hosts:
      - 192.168.1.10
    options:
      "restart": "always"

proxy:
  ssl: true
  host: app.techvinta.com
  letsencrypt_email: admin@techvinta.com
  forward_headers: true
  proxy_args:
    - "-v /var/lib/kamal/letsencrypt:/data/letsencrypt"

registry:
  server: ghcr.io
  username: techvinta
  password:
    - KAMAL_REGISTRY_PASSWORD

builder:
  arch: amd64

When a customer adds a custom domain inside your SaaS settings dashboard, your application registers the domain and instructs the Kamal proxy cluster to acquire an on-demand SSL certificate via the internal API hook, ensuring zero manual intervention.

Comparative Analysis: Multi-Tenant Architecture & Implementation

When engineering a scalable B2B SaaS application, founders and CTOs must weigh custom development costs, maintenance overhead, and time-to-market. The table below outlines the financial and technical reality in 2026.

Metric / Feature Custom Rails 8 + Kamal 2 Enterprise Kubernetes (EKS) Traditional PaaS (Heroku / Render)
Initial Setup Cost $8,000 – $15,000 $35,000 – $75,000 $3,000 – $6,000
Monthly Infrastructure $40 – $150 (Dedicated VPS) $600 – $2,500+ $300 – $1,200 (Scales poorly)
Custom Domain SSL Speed Automated (< 30 seconds) Complex Cert-Manager setup Manual add-on limits
Engineering Hourly Rate $35 – $65/hr (TechVinta Tier) $120 – $180/hr (DevOps Specialist) $90 – $150/hr (Generalist)
Time-to-Production 2 – 4 Weeks 3 – 6 Months 1 – 2 Weeks

Partner with TechVinta for Production-Grade SaaS Engineering

Architecting multi-tenant isolation, automated SSL pipelines, and zero-downtime deployments requires deep systems-level expertise. At TechVinta, our elite engineering teams specialize in crafting high-performance Ruby on Rails 8 applications backed by modern Docker and Kamal 2 infrastructures. We offer flexible engagement models with a 4 to 6-hour US timezone overlap, ensuring seamless real-time collaboration, rapid code reviews, and direct Slack/Teams integration. Whether you are migrating off legacy monoliths or building a greenfield B2B SaaS platform, contact TechVinta today to accelerate your roadmap.

Frequently Asked Questions

How does Kamal 2 handle wildcard custom domains for multi-tenant SaaS?

Kamal 2 utilizes an advanced edge proxy layer that dynamically inspects incoming Host headers against a registered tenant database. When a request arrives for a custom domain (e.g., client.com), the proxy routes traffic to the container cluster while automatically handling ACME challenges with Let's Encrypt to provision and renew SSL certificates in the background without restarting application containers.

Is database-per-tenant or schema-per-tenant better in Rails 8?

Rails 8 natively supports both approaches via ActiveRecord::Base.connected_to. Schema-per-tenant (using PostgreSQL schemas within a single database instance) is generally more cost-effective and easier to back up for early-to-mid stage SaaS. Database-per-tenant is recommended if you have enterprise clients requiring strict physical data isolation, compliance certifications (HIPAA/SOC2), or dedicated resource allocation.

How does TechVinta ensure secure background job execution across tenants?

Background processors like Solid Queue (built into Rails 8) or Sidekiq must be tenant-aware. TechVinta engineers implement job-wrapping mechanisms that serialize the tenant identifier (e.g., tenant_id) into the job payload. When the worker picks up the job, our middleware automatically establishes the correct database connection context before executing background tasks, preventing data leaks across tenant boundaries.

⚡ Interactive Sizing Tool

Ruby on Rails 8 Upgrade Sizing & Cost Estimator

Estimate upgrade sprints, budget ranges at our senior US-aligned rate ($45/hr), and annual infrastructure savings with Solid Queue & Kamal 2.

Estimated Timeline
4–6 Weeks
2–3 Agile Sprints
Budget ($45/hr)
$7,200 – $11,500
Fixed-Price Milestones
Annual Cloud & Redis Savings: $4,800 / year
Dropping Redis for Solid Queue + migrating from Heroku to Kamal 2 on Hetzner/AWS bare-metal saves 60–80% monthly hosting overhead.
Zero-Downtime Guarantee: Dual-boot Gemfile strategy ensures your current Rails production app continues shipping features while Rails 8 branch is perfected.
Share this article:
TV

Written by TechVinta Team

We are a full-stack development agency specializing in Ruby on Rails, React.js, Vue.js, Flutter, Shopify, and Sharetribe. We write about web development, DevOps, and building scalable applications.

Keep Reading

TechVinta Assistant

Online - Ready to help

Hi there!

Need help with your project? We're online and ready to assist.

🍪

We use cookies for analytics to improve your experience. See our Cookie Policy.