Skip to main content

Configuration Management

These commands help validate, inspect, and manipulate Rspamd configuration files.

configtest

Validate configuration syntax and load ability.

Purpose

Test that configuration files are syntactically correct and can be loaded without errors.

Common Scenarios

Basic Validation

# Test default configuration
rspamadm configtest

# Test specific config file
rspamadm configtest -c /path/to/rspamd.conf

Exit codes:

  • 0 - Configuration is valid
  • 1 - Configuration has errors

Quiet Mode

# Only show errors (for scripts)
rspamadm configtest -q

# Use in scripts
if rspamadm configtest -q; then
systemctl restart rspamd
else
echo "Configuration errors detected"
exit 1
fi

Strict Mode

# Stop on any error (even warnings)
rspamadm configtest -s

Skip Jinja Templates

# Don't process Jinja templates
rspamadm configtest -T

Options

-q, --quiet             Suppress output
-c, --config <file> Config file to test
-s, --strict Stop on any error
-T, --skip-template Don't apply Jinja templates

Use Cases

Pre-Restart Validation

#!/bin/bash
# Safe Rspamd restart

echo "Validating configuration..."
if rspamadm configtest; then
echo "Configuration valid, restarting..."
systemctl restart rspamd
sleep 2

# Verify it started
if systemctl is-active rspamd >/dev/null; then
echo "Rspamd restarted successfully"
else
echo "Rspamd failed to start, check logs"
systemctl status rspamd
exit 1
fi
else
echo "Configuration errors detected, not restarting"
exit 1
fi

Continuous Integration

# .gitlab-ci.yml
test-config:
script:
- rspamadm configtest -c rspamd.conf -s
only:
- merge_requests

configdump

Display effective configuration.

Purpose

Show the final merged configuration after processing all includes and overrides.

Common Scenarios

Dump Full Configuration

# Show complete effective config
rspamadm configdump | less

# JSON format (pretty printed)
rspamadm configdump -j | jq '.' | less

# Compact JSON
rspamadm configdump -C

# Show as UCL
rspamadm configdump

Dump Specific Module

# Show specific module config
rspamadm configdump dkim_signing

# Show classifier config
rspamadm configdump classifier

# Show worker config
rspamadm configdump worker-normal

Show Help Comments

# Include help text for options
rspamadm configdump -h

# Show saved comments
rspamadm configdump -s

Show Modules State

# Show only module states (enabled/disabled)
rspamadm configdump -m

Show Symbol Groups

# Show symbol group configuration
rspamadm configdump -g

Options

-j, --json              JSON output (pretty)
-C, --compact Compact JSON
-c, --config <file> Config file
-h, --show-help Show help comments
-s, --show-comments Show saved comments
-m, --modules-state Show modules state only
-g, --groups Show symbols groups only
-T, --skip-template Don't apply Jinja templates

Use Cases

Debug Configuration Merging

# Check what's actually being used
rspamadm configdump redis

# Compare with what you expect
diff <(rspamadm configdump redis) expected-redis.conf

Document Current Configuration

# Export current config for documentation
rspamadm configdump -j > current-config-$(date +%Y%m%d).json

# With comments
rspamadm configdump -h -s > documented-config.txt

Verify Module Status

# Check which modules are enabled
rspamadm configdump -m | grep -v "^#"

# List disabled modules
rspamadm configdump -m | grep "enabled = false"

Extract Specific Settings

# Get Redis configuration
rspamadm configdump redis -j | jq '.redis'

# Get all DKIM selectors
rspamadm configdump dkim_signing -j | jq '.dkim_signing.domain'

confighelp

Show documentation for configuration options.

Purpose

Display help text and available options for configuration elements.

Common Scenarios

List All Options

# Show all configuration options
rspamadm confighelp | less

Show Module Options

# Show options for specific module
rspamadm confighelp dkim_signing

# Show worker options
rspamadm confighelp worker

# Show classifier options
rspamadm confighelp classifier

Show Specific Option

# Show details about specific option
rspamadm confighelp dkim_signing.selector

# Show nested option
rspamadm confighelp surbl.rule

# Show worker-specific option
rspamadm confighelp worker-controller.password

Use Cases

Find Available Options

# What can I configure in this module?
rspamadm confighelp multimap | grep "^\s*[a-z]"

# Show all Redis options
rspamadm confighelp redis

Configuration Writing

# While editing config, check available options
vim /etc/rspamd/local.d/dkim_signing.conf

# In another terminal:
rspamadm confighelp dkim_signing

configgraph

Visualize configuration include hierarchy.

Purpose

Generate a graph showing how configuration files include each other.

Common Scenarios

Generate Graph

# Generate Graphviz DOT format
rspamadm configgraph > config-graph.dot

# Convert to image
dot -Tpng config-graph.dot -o config-graph.png

# Convert to SVG
dot -Tsvg config-graph.dot -o config-graph.svg

# Interactive view (if you have xdot)
rspamadm configgraph | xdot -

Use Cases

Document Configuration Structure

#!/bin/bash
# Generate configuration documentation

DATE=$(date +%Y-%m-%d)
OUTPUT="/var/www/docs/rspamd"

# Generate graph
rspamadm configgraph | \
dot -Tsvg -o "$OUTPUT/config-includes-$DATE.svg"

# Generate HTML page
cat > "$OUTPUT/index.html" << EOF
<html>
<head><title>Rspamd Configuration Structure</title></head>
<body>
<h1>Configuration Include Hierarchy ($DATE)</h1>
<img src="config-includes-$DATE.svg" alt="Config Graph">
</body>
</html>
EOF

Debug Circular Includes

# Find circular includes
rspamadm configgraph | grep -i "cycle"

configwizard

Interactive configuration setup wizard.

Purpose

Guided configuration for Rspamd daemon with interactive prompts.

Common Scenarios

Run Setup Wizard

# Start interactive wizard
rspamadm configwizard

The wizard will guide you through:

  • Redis configuration
  • Controller password
  • DKIM setup
  • Logging options
  • Workers configuration

Use Cases

Initial Setup

# After fresh install
rspamadm configwizard

# Follow prompts to configure basic settings

Quick Configuration

When you need to quickly set up a new instance with standard settings.


template

Apply Jinja templates to files.

Purpose

Process files with Jinja template syntax, useful for generating configuration from templates.

Common Scenarios

Process Template

# Apply template to file
rspamadm template config.template > config.conf

# Process multiple files
rspamadm template template1 template2 template3

With Custom Variables

# Load variables from file (name=value format)
rspamadm template -e vars.env config.template > config.conf

# Load variables from Lua file
rspamadm template -l vars.lua config.template > config.conf

Save with Suffix

# Process and save with suffix
rspamadm template -s .conf config.template

# Creates: config.template.conf

In-Place Replacement

# Replace original file
rspamadm template -i config.template

Without Rspamd Variables

# Don't add internal Rspamd variables
rspamadm template -n config.template

Options

-n, --no-vars               Don't add Rspamd variables
-e, --env <file> Load environment from file (name=value)
-l, --lua-env <file> Load environment from Lua file
-s, --suffix <suffix> Save with suffix
-i, --inplace Replace original file

Use Cases

Configuration Generation

# vars.env
REDIS_HOST=redis.example.com
REDIS_PORT=6379
CLICKHOUSE_HOST=clickhouse.example.com

# redis.template
redis {
servers = "{{ REDIS_HOST }}:{{ REDIS_PORT }}";
}
# Generate config
rspamadm template -e vars.env redis.template > redis.conf

Multi-Environment Deployment

#!/bin/bash
# Generate configs for different environments

for env in dev staging prod; do
echo "Generating config for $env..."

rspamadm template \
-e "vars-$env.env" \
-s "-$env.conf" \
config.template
done

Dynamic Configuration

-- vars.lua
return {
redis_host = "redis.local",
redis_port = 6379,
debug_enabled = true,
workers = 4
}
rspamadm template -l vars.lua rspamd.template > rspamd.conf

Practical Examples

Complete Configuration Validation Pipeline

#!/bin/bash
# Validate and deploy configuration

CONFIG_DIR="/etc/rspamd"
BACKUP_DIR="/var/backups/rspamd/config"
DATE=$(date +%Y%m%d-%H%M%S)

# 1. Backup current config
echo "=== Backing up current configuration ==="
mkdir -p "$BACKUP_DIR"
tar czf "$BACKUP_DIR/config-$DATE.tar.gz" "$CONFIG_DIR"

# 2. Test syntax
echo "=== Testing configuration syntax ==="
if ! rspamadm configtest -s; then
echo "ERROR: Configuration validation failed"
exit 1
fi

# 3. Compare with previous
echo "=== Checking for changes ==="
CURRENT=$(rspamadm configdump -C)
PREVIOUS=$(cat /tmp/last-config.json 2>/dev/null || echo "{}")

if [ "$CURRENT" != "$PREVIOUS" ]; then
echo "Configuration changes detected"
echo "$CURRENT" | jq '.' > /tmp/config-changes.json
fi

# 4. Document current state
echo "=== Documenting configuration ==="
rspamadm configdump -j > "$BACKUP_DIR/config-dump-$DATE.json"
rspamadm configdump -m > "$BACKUP_DIR/modules-state-$DATE.txt"
rspamadm configdump -g > "$BACKUP_DIR/symbol-groups-$DATE.txt"

# 5. Generate graph
echo "=== Generating configuration graph ==="
rspamadm configgraph | dot -Tpng -o "$BACKUP_DIR/config-graph-$DATE.png"

# 6. Restart if needed
if systemctl is-active rspamd >/dev/null; then
echo "=== Restarting Rspamd ==="
systemctl restart rspamd
sleep 2

if ! systemctl is-active rspamd >/dev/null; then
echo "ERROR: Rspamd failed to start!"
echo "Restoring backup..."
systemctl stop rspamd
rm -rf "$CONFIG_DIR"/*
tar xzf "$BACKUP_DIR/config-$DATE.tar.gz" -C /
systemctl start rspamd
exit 1
fi
fi

# 7. Save for next comparison
echo "$CURRENT" > /tmp/last-config.json

echo "=== Configuration deployed successfully ==="

Configuration Template System

#!/bin/bash
# Template-based configuration management

TEMPLATE_DIR="/etc/rspamd/templates"
ENV_DIR="/etc/rspamd/environments"
OUTPUT_DIR="/etc/rspamd"

ENVIRONMENT=${1:-production}

if [ ! -f "$ENV_DIR/$ENVIRONMENT.env" ]; then
echo "Environment $ENVIRONMENT not found"
exit 1
fi

echo "Generating configuration for $ENVIRONMENT environment..."

# Process all templates
for template in "$TEMPLATE_DIR"/*.template; do
basename=$(basename "$template" .template)
output="$OUTPUT_DIR/$basename.conf"

echo "Processing $basename..."

rspamadm template \
-e "$ENV_DIR/$ENVIRONMENT.env" \
"$template" > "$output"

if [ $? -ne 0 ]; then
echo "Error processing $template"
exit 1
fi
done

# Validate
echo "Validating generated configuration..."
if rspamadm configtest -s; then
echo "Configuration valid"
else
echo "Configuration invalid, rolling back"
exit 1
fi

Configuration Audit Script

#!/bin/bash
# Audit Rspamd configuration

REPORT_FILE="/var/log/rspamd/config-audit-$(date +%Y%m%d).txt"

{
echo "Rspamd Configuration Audit"
echo "=========================="
echo "Date: $(date)"
echo

echo "=== Configuration Validity ==="
if rspamadm configtest -q; then
echo "✓ Configuration is valid"
else
echo "✗ Configuration has errors:"
rspamadm configtest
fi
echo

echo "=== Module Status ==="
rspamadm configdump -m | grep -E "(module|enabled)"
echo

echo "=== Enabled Workers ==="
rspamadm configdump worker | grep -E "type.*worker"
echo

echo "=== Redis Configuration ==="
rspamadm configdump redis -j | jq -r '.redis | {servers, password: "***"}'
echo

echo "=== DKIM Domains ==="
rspamadm configdump dkim_signing -j | jq -r '.dkim_signing.domain | keys[]' 2>/dev/null || echo "None configured"
echo

echo "=== Symbol Groups ==="
rspamadm configdump -g | grep "group =" | wc -l
echo "total groups"
echo

} | tee "$REPORT_FILE"

echo "Report saved to $REPORT_FILE"

Tips and Best Practices

Configuration Testing

  1. Always test before restart - Use configtest before restarting Rspamd
  2. Use strict mode - -s flag catches more issues
  3. Test in CI/CD - Validate configs in your deployment pipeline
  4. Automated testing - Script configuration validation
  5. Keep backups - Backup config before changes

Configuration Inspection

  1. Use configdump to debug - See actual merged configuration
  2. Check module states - Verify modules are enabled as expected
  3. Document with graphs - Generate configuration diagrams
  4. Export regularly - Keep dumps of known-good configurations
  5. Compare environments - Diff configs between environments

Template Usage

  1. Version templates - Keep templates in version control
  2. Environment-specific vars - Separate environment variables
  3. Validate after templating - Always run configtest
  4. Use descriptive variables - Make templates readable
  5. Document variables - Explain what each variable does

Best Practices

  1. Modular configuration - Use local.d/ and override.d/
  2. Comment your changes - Explain why, not what
  3. Test incrementally - Small changes, test frequently
  4. Keep defaults - Don't override unless necessary
  5. Use confighelp - Check available options before guessing