RabbitMQ Setup
RabbitMQ Setup
Section titled “RabbitMQ Setup”Configure RabbitMQ for Mantis message queuing and deployment orchestration.
Requirements
Section titled “Requirements”| Requirement | Minimum | Recommended |
|---|---|---|
| RabbitMQ | 3.12 | 3.13+ |
| Erlang/OTP | 25 | 26+ |
| Memory | 512 MB | 2+ GB |
| Storage | 5 GB | 20+ GB |
Installation
Section titled “Installation”Ubuntu/Debian
Section titled “Ubuntu/Debian”# Add RabbitMQ signing keycurl -1sLf "https://keys.openpgp.org/vks/v1/by-fingerprint/0A9AF2115F4687BD29803A206B73A36E6026DFCA" | sudo gpg --dearmor -o /usr/share/keyrings/com.rabbitmq.team.gpg
# Add Erlang repositorycurl -1sLf "https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-erlang.E495BB49CC4BBE5B.key" | sudo gpg --dearmor -o /usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg
# Add RabbitMQ repositorycurl -1sLf "https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-server.9F4587F226208342.key" | sudo gpg --dearmor -o /usr/share/keyrings/rabbitmq.9F4587F226208342.gpg
# Add repository sourcessudo tee /etc/apt/sources.list.d/rabbitmq.list <<EOFdeb [signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa1.novemberain.com/rabbitmq/rabbitmq-erlang/deb/ubuntu jammy maindeb [signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa1.novemberain.com/rabbitmq/rabbitmq-server/deb/ubuntu jammy mainEOF
# Installsudo apt updatesudo apt install rabbitmq-server -yRHEL/Rocky/Alma
Section titled “RHEL/Rocky/Alma”# Add repositorycurl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh | sudo bashcurl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash
# Installsudo dnf install rabbitmq-server -yDocker
Section titled “Docker”services: rabbitmq: image: rabbitmq:3.13-management-alpine hostname: rabbitmq environment: RABBITMQ_DEFAULT_USER: mantis RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASSWORD} volumes: - rabbitmq_data:/var/lib/rabbitmq - ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf ports: # Plain AMQP (5672) is intentionally NOT exposed — TLS is mandatory - '5671:5671' # AMQPS (TLS) - '15671:15671' # Management UI (TLS)Initial Configuration
Section titled “Initial Configuration”Enable Plugins
Section titled “Enable Plugins”# Enable management pluginsudo rabbitmq-plugins enable rabbitmq_management
# Enable TLS pluginsudo rabbitmq-plugins enable rabbitmq_auth_mechanism_sslCreate User
Section titled “Create User”# Create mantis usersudo rabbitmqctl add_user mantis 'secure-password'
# Set permissionssudo rabbitmqctl set_permissions -p / mantis ".*" ".*" ".*"
# Set administrator tagsudo rabbitmqctl set_user_tags mantis administrator
# Remove default guest usersudo rabbitmqctl delete_user guestCreate Virtual Host (Optional)
Section titled “Create Virtual Host (Optional)”# Create vhostsudo rabbitmqctl add_vhost mantis
# Set permissionssudo rabbitmqctl set_permissions -p mantis mantis ".*" ".*" ".*"Configuration
Section titled “Configuration”Basic Configuration
Section titled “Basic Configuration”Create /etc/rabbitmq/rabbitmq.conf:
# Listeners# SECURITY: plain AMQP is disabled — TLS (AMQPS, 5671) is mandatorylisteners.tcp = nonelisteners.ssl.default = 5671
# Management (TLS)management.ssl.port = 15671
# Limitschannel_max = 2047heartbeat = 60
# Memoryvm_memory_high_watermark.relative = 0.7vm_memory_high_watermark_paging_ratio = 0.5
# Diskdisk_free_limit.relative = 2.0
# Logginglog.file.level = infolog.console = truelog.console.level = infoAdvanced Configuration
Section titled “Advanced Configuration”Create /etc/rabbitmq/advanced.config for complex settings:
[ {rabbit, [ {tcp_listeners, []}, {ssl_listeners, [5671]}, {num_ssl_acceptors, 10}, {channel_max, 2047}, {heartbeat, 60} ]}, {rabbitmq_management, [ {listener, [{port, 15671}, {ssl, true}]} ]}].Environment Variables
Section titled “Environment Variables”Create /etc/rabbitmq/rabbitmq-env.conf:
NODENAME=rabbit@hostnameNODE_IP_ADDRESS=0.0.0.0RABBITMQ_USE_LONGNAME=trueMemory Management
Section titled “Memory Management”Memory Watermark
Section titled “Memory Watermark”# Absolute limit (recommended for production)vm_memory_high_watermark.absolute = 2GB
# Or relative (percentage of system memory)vm_memory_high_watermark.relative = 0.7
# Paging thresholdvm_memory_high_watermark_paging_ratio = 0.5Memory Alarms
Section titled “Memory Alarms”When memory exceeds watermark:
- Publishers are blocked
- Consumers continue processing
- Messages page to disk
Monitor with:
sudo rabbitmqctl status | grep memoryDisk Management
Section titled “Disk Management”Disk Free Limit
Section titled “Disk Free Limit”# Absolute (recommended)disk_free_limit.absolute = 5GB
# Or relative to RAMdisk_free_limit.relative = 2.0Message Store
Section titled “Message Store”# Message store settingsqueue_index_embed_msgs_below = 4096msg_store_file_size_limit = 16777216High Availability
Section titled “High Availability”Clustering
Section titled “Clustering”On each node:
# Stop appsudo rabbitmqctl stop_app
# Join clustersudo rabbitmqctl join_cluster rabbit@node1
# Start appsudo rabbitmqctl start_app
# Check cluster statussudo rabbitmqctl cluster_statusQueue Durability
Section titled “Queue Durability”Mantis declares durable (classic) queues — they survive broker restarts. The application does not set a quorum queue type. If you want quorum queues for multi-node durability, that is an optional RabbitMQ-side default you can enable yourself (Mantis does not depend on it):
# /etc/rabbitmq/rabbitmq.conf — OPTIONAL operator hardening, not required by Mantisdefault_queue_type = quorumMirrored Queues (Classic)
Section titled “Mirrored Queues (Classic)”For classic queue mirroring:
# Set HA policysudo rabbitmqctl set_policy ha-all "^mantis\." '{"ha-mode":"all","ha-sync-mode":"automatic"}'Start Service
Section titled “Start Service”# Enable and startsudo systemctl enable rabbitmq-serversudo systemctl start rabbitmq-server
# Check statussudo systemctl status rabbitmq-serversudo rabbitmqctl statusMantis Configuration
Section titled “Mantis Configuration”Thorax RabbitMQ Settings
Section titled “Thorax RabbitMQ Settings”[queue]enabled = trueca_cert_path = "/etc/mantis/certs/ca.crt" # mandatory when enabled = true (TLS is required)host = "localhost"port = 5671username = "mantis"password = "password"prefetch_count = 10reconnect_delay_secs = 5With TLS Client Certificates
Section titled “With TLS Client Certificates”[queue]enabled = truehost = "rabbitmq.example.com"port = 5671username = "mantis"password = "password"prefetch_count = 10ca_cert_path = "/etc/mantis/certs/ca.crt"Configuration source
Section titled “Configuration source”Thorax reads RabbitMQ settings — host, port (5671/AMQPS), username, password,
vhost, prefetch_count, and the TLS certificate paths — from the [queue] table of
thorax.toml (shown above). All fields can also be set or overridden via environment
variables using the THORAX__QUEUE__<FIELD> convention, for example:
| Environment variable | TOML field |
|---|---|
THORAX__QUEUE__ENABLED | enabled |
THORAX__QUEUE__HOST | host |
THORAX__QUEUE__PORT | port |
THORAX__QUEUE__USERNAME | username |
THORAX__QUEUE__PASSWORD | password |
THORAX__QUEUE__VHOST | vhost |
THORAX__QUEUE__CA_CERT_PATH | ca_cert_path |
THORAX__QUEUE__CLIENT_CERT_PATH | client_cert_path |
THORAX__QUEUE__CLIENT_KEY_PATH | client_key_path |
THORAX__QUEUE__PREFETCH_COUNT | prefetch_count |
THORAX__QUEUE__PUBLISHER_CONFIRMS | publisher_confirms |
THORAX__QUEUE__FALLBACK_ON_FAILURE | fallback_on_failure |
THORAX__QUEUE__HEALTH_CHECK_INTERVAL_SECS | health_check_interval_secs |
THORAX__QUEUE__RECONNECT_DELAY_SECS | reconnect_delay_secs |
Environment variables take precedence over TOML values, making them useful for secrets
(e.g. THORAX__QUEUE__PASSWORD) and environment-specific overrides in container deployments.
Verification
Section titled “Verification”Check Connection
Section titled “Check Connection”# List connectionssudo rabbitmqctl list_connections name state
# List channelssudo rabbitmqctl list_channels connection name state
# List queuessudo rabbitmqctl list_queues name messages consumersTest from Application
Section titled “Test from Application”# Check Thorax connectiondocker compose logs thorax | grep -i rabbitManagement UI
Section titled “Management UI”Access
Section titled “Access”Open https://localhost:15671 (the management UI is served over TLS)
Default credentials after setup:
- Username: mantis
- Password: (configured password)
Features
Section titled “Features”| Tab | Purpose |
|---|---|
| Overview | Cluster status, message rates |
| Connections | Active connections |
| Channels | Channel details |
| Exchanges | Exchange configuration |
| Queues | Queue status and messages |
| Admin | User and policy management |
Troubleshooting
Section titled “Troubleshooting”Connection Refused
Section titled “Connection Refused”- Check service is running:
systemctl status rabbitmq-server - Verify the AMQPS port is open:
netstat -tlnp | grep 5671 - Check firewall rules
Authentication Failed
Section titled “Authentication Failed”- Verify user exists:
rabbitmqctl list_users - Check password
- Verify permissions:
rabbitmqctl list_permissions
Memory Alarm
Section titled “Memory Alarm”- Check memory usage:
rabbitmqctl status - Consume pending messages
- Increase watermark or add memory
Disk Alarm
Section titled “Disk Alarm”- Check disk usage:
df -h - Clean old data
- Increase disk space
Next Steps
Section titled “Next Steps”- TLS Configuration - Secure connections
- Queue Topology - Queue structure
- Monitoring - RabbitMQ monitoring
