entrypoint.sh
#!/bin/bash
set -e
# Strip quotes from env vars if present
STREAM_WIDTH="${STREAM_WIDTH//\"/}"
STREAM_HEIGHT="${STREAM_HEIGHT//\"/}"
DISPLAY="${DISPLAY//\"/}"
# Use defaults
STREAM_WIDTH="${STREAM_WIDTH:-1280}"
STREAM_HEIGHT="${STREAM_HEIGHT:-720}"
DISPLAY="${DISPLAY:-:99}"
# Start D-Bus
mkdir -p /run/dbus
dbus-daemon --system --fork 2>/dev/null || true
# Start PulseAudio in system mode with anonymous auth on a specific socket
# This bypasses the "Access denied" issues for root user in Docker
pulseaudio -D --system --disallow-exit --disallow-module-loading=0 --exit-idle-time=-1 -L "module-native-protocol-unix auth-anonymous=1 socket=/tmp/pulseaudio.socket"
# Set PulseAudio server environment variable for all clients (pactl, ffmpeg, chrome)
export PULSE_SERVER=unix:/tmp/pulseaudio.socket
# Wait for PulseAudio to be ready
echo "Waiting for PulseAudio..."
for i in {1..10}; do
if pactl info >/dev/null 2>&1; then
break
fi
sleep 1
done
# Load null sink to capture audio from
pactl load-module module-null-sink sink_name=SpeakerOutput sink_properties=device.description="Speaker_Output"
pactl set-default-sink SpeakerOutput
pactl set-default-source SpeakerOutput.monitor
# Start Xvfb with proper syntax
Xvfb ${DISPLAY} -screen 0 ${STREAM_WIDTH}x${STREAM_HEIGHT}x24 &
sleep 2
echo "==================================="
echo "Theatre Bot Starting..."
echo "Display: ${DISPLAY}"
echo "Resolution: ${STREAM_WIDTH}x${STREAM_HEIGHT}"
echo "==================================="
# Run the bot
exec npm run start