Self-Hosting ReqPour

Why Self-Host?

ReqPour is open source and can be self-hosted for teams that need full control over their webhook data. Self-hosting is useful when: your security policy requires webhook data to stay within your infrastructure, you need custom modifications, you want unlimited endpoints and requests, or you are working in an air-gapped environment.

For most developers and small teams, the hosted version at reqpour.com is simpler and more cost-effective. Self-hosting requires maintaining your own server, SSL certificates, and database. The hosted Pro plan at $3/month eliminates this operational overhead.

If you decide to self-host, ReqPour is packaged as a Docker container for easy deployment. The stack consists of the API server (Node.js), a PostgreSQL database for request storage, and a Redis instance for WebSocket pub/sub and real-time features.

Docker Deployment

The quickest way to self-host is with Docker Compose:

yaml
# docker-compose.yml
version: '3.8'
services:
  api:
    image: reqpour/api:latest
    ports:
      - "3000:3000"
    environment:
      DATABASE_URL: postgres://reqpour:password@db:5432/reqpour
      REDIS_URL: redis://redis:6379
      JWT_SECRET: your-secret-key-here
      BASE_URL: https://reqpour.yourdomain.com
    depends_on:
      - db
      - redis

db: image: postgres:16 environment: POSTGRES_USER: reqpour POSTGRES_PASSWORD: password POSTGRES_DB: reqpour volumes: - pgdata:/var/lib/postgresql/data

redis: image: redis:7-alpine

volumes: pgdata: ```

Run docker compose up -d and the API server will be available on port 3000. Place a reverse proxy (nginx, Caddy, or Traefik) in front of it for SSL termination and subdomain routing.

Configuration

Configure your self-hosted instance with environment variables:

DATABASE_URL: PostgreSQL connection string. Required. The database stores user accounts, endpoints, and captured requests.

REDIS_URL: Redis connection string. Required. Redis handles WebSocket pub/sub for real-time request forwarding and relay connections.

JWT_SECRET: Secret key for signing JWT tokens. Required. Use a strong, random string. This secures user authentication and API tokens.

BASE_URL: The public URL of your instance (e.g., https://reqpour.yourdomain.com). Required. Used for generating endpoint URLs and email links.

SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASS: Email server configuration for sending verification and notification emails. Optional — if not configured, email features are disabled.

WILDCARD_DOMAIN: The domain used for endpoint subdomains (e.g., reqpour.yourdomain.com). Requires a wildcard DNS record (*.reqpour.yourdomain.com) and a wildcard SSL certificate.

DNS and SSL Setup

ReqPour uses subdomains for endpoint URLs (e.g., abc123.reqpour.yourdomain.com). This requires:

1. A wildcard DNS record: *.reqpour.yourdomain.com -> your-server-ip 2. A wildcard SSL certificate for *.reqpour.yourdomain.com

For SSL, use Let's Encrypt with DNS-01 challenge (required for wildcard certificates). Caddy or Traefik can automate this. Example Caddy configuration:

*.reqpour.yourdomain.com {
  tls {
    dns cloudflare {env.CF_API_TOKEN}
  }
  reverse_proxy api:3000
}

Alternatively, use a non-subdomain URL scheme where endpoints use paths instead of subdomains (reqpour.yourdomain.com/e/abc123). This avoids the wildcard DNS/SSL requirement but changes the endpoint URL format.

Updating and Maintenance

Update your self-hosted instance by pulling the latest Docker image:

bash
docker compose pull
docker compose up -d

Database migrations run automatically on startup. The API server checks the current schema version and applies any pending migrations.

For backups, periodically back up the PostgreSQL database. Request data can be large if you have high traffic — configure request retention to automatically delete old requests and keep database size manageable.

Monitor the server with standard tools: check that the API responds to health check requests at /health, monitor PostgreSQL disk usage and connection count, and watch Redis memory usage. The API server logs to stdout in JSON format for easy integration with log aggregation tools.

Point the CLI at your self-hosted instance using the REQPOUR_API_URL environment variable:

bash
export REQPOUR_API_URL=https://reqpour.yourdomain.com
npx reqpour login
npx reqpour relay --to http://localhost:3000

Get started with ReqPour

Catch, inspect, and relay webhooks to localhost. Free to start, $3/mo for Pro.