Installation Guide

📦v1.0.0📅2026-03-10🔄Updated 2026-04-28👤Admin Team
administrationinstallationproxy

This guide walks you through deploying the SMS Gateway Proxy platform. The recommended deployment method is Docker Compose, which orchestrates all required services in containers.

Prerequisites

Before you begin, ensure the following requirements are met:

RequirementVersionDetails
Docker20.10+Container runtime
Docker Compose2.x+Multi-container orchestration
Network accessOutbound connectivity to SMSC endpoints on configured ports
License fileValid .lic file provided by the vendor

System Requirements

ResourceMinimumRecommended
CPU2 cores4+ cores
RAM4 GB8+ GB
Disk20 GB50+ GB (depends on journal retention)
OSLinux (x86_64, arm64)Linux x86_64
💡

Disk requirements scale with message volume and journal retention settings. S3/MinIO storage is used for long-term journal export and can offload local disk usage.

Platform Components

The platform consists of four containerized services:

ServiceImageDefault PortPurpose
SMPP Proxysms-sender-proxy8080 (REST), 44044 (gRPC)Core message processing, routing, delivery tracking
MCPnode-red1880Contact policy enforcement and message filtering
Redisredis6379Distributed rate limiting, MCP state storage
Aerospikeaerospike3000Message lifecycle state storage

Application Directory Structure

The proxy application expects the following directory layout on the host. All paths are relative to the application root and must be mounted as persistent volumes into the container.

.
├── config
│   ├── config_local.yaml
│   ├── config_test.yaml
│   ├── dryrunctr
│   └── dryrunctr.tmp
├── journal
│   └── stat
├── license
│   ├── license_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.lic
│   ├── proxy.lic
│   └── registry.json
├── logs
├── smpp_rules
│   ├── routes.ini
│   └── smpp_rules.toml
├── storage
│   ├── sso.db
│   ├── sso.db-shm
│   └── sso.db-wal

Directory Descriptions

DirectoryContentsPersistenceDescription
config/config_local.yaml, config_test.yaml, dryrunctrRequiredMain application configuration files. config_local.yaml defines core behavior (rate limiters, security, MCP filters, monitoring). dryrunctr tracks dry-run counter state
journal/stat/CDR export filesRequiredStatistics and Call Detail Records collected by the statistic exporter before uploading to S3. Data loss on volume loss
license/.lic files, registry.jsonRequiredLicense files issued by the vendor. registry.json maintains license activation state. Without this volume the application will not start
logs/Application log filesRecommendedRuntime log output. Can be replaced by stdout logging, but persistent logs are useful for post-mortem diagnostics
smpp_rules/smpp_rules.toml, routes.iniRequiredSMPP link and pool definitions. smpp_rules.toml is the primary SMPP configuration, routes.ini contains routing rules
storage/sso.db, sso.db-shm, sso.db-walRequiredSQLite database for user authentication (SSO). Contains registered users, credentials, and app_id mappings. Data loss means all users must re-register
⚠️

All directories marked Required must be mounted as persistent volumes. Loss of these volumes results in loss of configuration, license activation, user accounts, or statistics data.


Quick Start

1. Create a project directory

mkdir sms-gateway && cd sms-gateway

2. Prepare the directory structure

Create all required directories and place your configuration and license files:

mkdir -p config journal/stat license logs smpp_rules storage

Copy your files into the appropriate directories:

# Application configuration
cp config_local.yaml config/

# License files (provided by vendor)
cp *.lic license/

# SMPP configuration
cp smpp_rules.toml smpp_rules/

3. Create the SMPP configuration

If you don't have an smpp_rules.toml yet, create smpp_rules/smpp_rules.toml with your SMPP connection parameters:

[links.100]
esme_disabled = false
esme_addr = "smsc.your-provider.com"
esme_port = 2775
esme_systemid = "your_system_id"
esme_password = "your_password"
esme_rate = 100
esme_rate_burst = 100
esme_enquirelink = 15
esme_enquirelink_timeout = 40
esme_resp_timeout = 20

For a complete reference of all configuration parameters, see the Configuration Reference.

4. Create the Docker Compose file

Create docker-compose.yml:

version: "3.8"

services:
  proxy:
    image: sms-sender-proxy:v1.0.0
    ports:
      - "8080:8080"     # REST API
      - "44044:44044"   # gRPC API
    volumes:
      - ./config:/app/config
      - ./journal:/app/journal
      - ./license:/app/license
      - ./logs:/app/logs
      - ./smpp_rules:/app/smpp_rules
      - ./storage:/app/storage
    depends_on:
      - redis
      - aerospike
    restart: unless-stopped

  redis:
    image: redis:latest
    ports:
      - "6379:6379"
    volumes:
      - redis-data:/data
    restart: unless-stopped

  aerospike:
    image: aerospike:ce-6.4.0
    ports:
      - "3000:3000"
    volumes:
      - aerospike-data:/opt/aerospike/data
    restart: unless-stopped

volumes:
  redis-data:
  aerospike-data:

The MCP (Message Control Platform) is deployed separately. See the MCP Deployment Guide for instructions on setting up contact policy filtering.

Volume Mapping Reference

All proxy volumes are bind mounts from the host directory to the container path under /app/:

Host PathContainer PathPurpose
./config/app/configApplication configuration (config_local.yaml)
./journal/app/journalCDR statistics export buffer
./license/app/licenseLicense files and activation registry
./logs/app/logsApplication logs
./smpp_rules/app/smpp_rulesSMPP link/pool configuration (smpp_rules.toml)
./storage/app/storageUser database (sso.db)
redis-data/dataRedis persistence (named volume)
aerospike-data/opt/aerospike/dataAerospike persistence (named volume)

5. Start the services

docker compose up -d

6. Verify the deployment

Check that all services are running:

docker compose ps

Verify the proxy health endpoint:

curl http://localhost:8080/healthy

Expected response:

{ "status": "ok" }

Check Prometheus metrics are available:

curl http://localhost:8080/metrics

Post-Installation Steps

Register the first user

Create an admin user via the REST API:

curl -X POST http://localhost:8080/api/v1/auth/register \
  -H "Content-Type: application/json" \
  -d '{
    "email": "admin@example.com",
    "password": "your-secure-password",
    "app_name": "my-gateway"
  }'

Verify SMPP connectivity

Check the status of configured SMPP links:

curl http://localhost:8080/api/v1/dashboard/smpp-links

Send a test message

Once a user is registered and SMPP links are connected, send a test SMS:

curl -X POST http://localhost:8080/api/v1/sms/send \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN" \
  -d '{
    "esme": 100,
    "source_addr": "TestSender",
    "destination_addr": "380501234567",
    "short_message": "Hello from SMS Gateway!"
  }'

Network Configuration

The proxy requires outbound network access to SMSC endpoints on the ports configured in smpp_rules.toml. Ensure that your firewall rules allow the following:

DirectionPortProtocolPurpose
Inbound8080TCP/HTTPREST API access
Inbound44044TCP/HTTP2gRPC API access
Outboundas configuredTCPSMPP connections to SMSC
Internal6379TCPRedis communication
Internal3000TCPAerospike communication
Internal1880TCPMCP communication (if deployed)
⚠️

In production environments, do not expose Redis and Aerospike ports externally. Keep them accessible only within the Docker network.


Backup and Recovery

Because all application state is stored in the host-mounted directories, backup is straightforward:

# Stop the proxy to ensure consistent state
docker compose stop proxy

# Archive all persistent data
tar czf sms-gateway-backup-$(date +%Y%m%d).tar.gz \
  config/ journal/ license/ logs/ smpp_rules/ storage/

# Restart
docker compose start proxy

Critical directories to back up:

  • license/ — license re-activation may be required if lost
  • storage/ — contains the user database; loss means all users must re-register
  • config/ — all application tuning and behavior settings
  • smpp_rules/ — SMPP connection definitions

Upgrading

To upgrade the platform to a new version:

  1. Pull the new proxy image
  2. Update the image tag in docker-compose.yml
  3. Restart the service:
docker compose pull proxy
docker compose up -d proxy

The proxy supports rolling restarts — active SMPP connections will be re-established automatically after the container starts.

Before upgrading, create a backup of the storage/ and config/ directories. The SSO database schema may be migrated automatically on first start of the new version.


Next Steps