Running Zammad on FreeBSD 14.2 with a Startup Script

Here’s a message for the Zammad Community about the FreeBSD 14.2 startup script for Zammad , which is close to an rc.d script .

Running Zammad on FreeBSD 14.2 with a Startup Script

Hey everyone,

I’ve put together a startup script to run Zammad on FreeBSD 14.2, designed to work similarly to an rc.d script.

This script starts, stops, and restarts Zammad services , including:

:white_check_mark: Thin Web Server (Zammad UI)

:white_check_mark: WebSocket Server (Real-time updates)

:white_check_mark: Background Worker (Processes jobs)

The script properly handles PID files and ensures a clean stop and restart.

:scroll: The Script: zammad.sh

Save this as /usr/local/bin/zammad.sh or anywhere you prefer.

#!/bin/sh

ZAMMAD_DIR="/usr/local/opt/zammad/zammad"
PID_DIR="$ZAMMAD_DIR/tmp/pids"
WEB_PID_FILE="$PID_DIR/zammad-web.pid"
WS_PID_FILE="$PID_DIR/websocket.pid"
WORKER_PID_FILE="$PID_DIR/background-worker.pid"

start() {
    echo "Starting Zammad services..."

    # Start Thin Web Server
    su -l zammad -c "thin start -u zammad -g zammad -c $ZAMMAD_DIR -e production -R config.ru -P $WEB_PID_FILE -t 30 -w 30 -l log/zammad-web.log --max-conns 1024 --max-persistent-conns 512 -s 1 --threaded -d --tag zammad-web"

    # Start WebSocket Server
    su -l zammad -c "cd $ZAMMAD_DIR && RAILS_ENV=production script/websocket-server.rb start -d -v"
    echo $! > "$WS_PID_FILE"

    # Start Background Worker
    su -l zammad -c "nohup sh -c 'cd $ZAMMAD_DIR && RAILS_ENV=production script/background-worker.rb start' > /dev/null 2>&1 & echo \$! > $WORKER_PID_FILE"

    echo "Zammad services started."
}

stop() {
    echo "Stopping Zammad services..."

    # Stop Thin Web Server
    su -l zammad -c "thin stop -c $ZAMMAD_DIR -e production -P $PID_DIR/zammad-web.3000.pid"
    echo "Zammad web server stopped."

    # Stop WebSocket Server
    if [ -f "$WS_PID_FILE" ]; then
        kill "$(cat $WS_PID_FILE)" 2>/dev/null
        rm -f "$WS_PID_FILE"
        echo "WebSocket server stopped."
    else
        echo "WebSocket server not running."
    fi

    # Stop Background Worker
    if [ -f "$WORKER_PID_FILE" ]; then
        kill "$(cat $WORKER_PID_FILE)" 2>/dev/null
        rm -f "$WORKER_PID_FILE"
        echo "Background worker stopped."
    else
        echo "Background worker not running."
    fi

    echo "Zammad services stopped."
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        sleep 2
        start
        ;;
    *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
        ;;
esac

:wrench: Example Usage

sudo sh zammad.sh start

:pushpin: Example Output

Starting Zammad services...
2025-03-04 17:48:31 +0100 Starting server on 0.0.0.0:3000 ...
Starting websocket server on 0.0.0.0:6042 (secure: false, pidfile: /usr/local/opt/zammad/zammad-6.4.1/tmp/pids/websocket.pid)
Zammad services started.

:pushpin: PIDs Created

/usr/local/opt/zammad/zammad/tmp/pids/zammad-web.3000.pid   # Thin webserver
/usr/local/opt/zammad/zammad/tmp/pids/websocket.pid         # WebSocket
/usr/local/opt/zammad/zammad/tmp/pids/background-worker.pid # Background worker

:pushpin: Next Steps

This script is very close to an rc.d script for FreeBSD! The next step would be to properly integrate it into the FreeBSD service framework.

Let me know if you have any suggestions or improvements!

1 Like