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:
Thin Web Server (Zammad UI)
WebSocket Server (Real-time updates)
Background Worker (Processes jobs)
The script properly handles PID files and ensures a clean stop and restart.
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
Example Usage
sudo sh zammad.sh start
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.
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
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!