[Laravel] docker 中安裝supervisor 來守護 horizon

SkyChoy
15 分鐘閱讀

沒什麼教學成份,純個人記錄

docker exec -it <php-docker-name> sh

如果你docker是Ubuntu / Debian

apt-get install -y supervisor

如果是 Alpine Linux

apk add --no-cache supervisor

安裝好之後做設定

mkdir -p /var/log/supervisor
mkdir -p /etc/supervisor.d
cat > /etc/supervisor.d/horizon.ini << 'EOF'
[program:horizon]
process_name=%(program_name)s
command=php /www/domain.com/artisan horizon
directory=/www/domain.com/
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
redirect_stderr=true
stdout_logfile=/var/log/supervisor/horizon.log
stopwaitsecs=3600
EOF

commanddirectory 這兩行填上自己的docker 中 Laravel folder 位置

//reload
supervisorctl reread
supervisorctl update
//start Horizon
supervisorctl start horizon
//check status
supervisorctl status

前往 https://{Laravel_app_domain}/horizon/dashboard

這樣就能查看了horizon狀況,見到Active 就成功了

進階:Docker 容器持久化 docker-compose + Supervisor + Horizon

# 進入應用程式目錄(根據實際路徑調整)
cd /opt/1panel/apps/php8/laravelcom

# 建立目錄
mkdir -p supervisor
mkdir -p scripts

# 建立 Supervisor 設定檔
cat > supervisor/horizon.ini << 'EOF'
[program:horizon]
process_name=%(program_name)s
command=php /www/domain.com/artisan horizon
directory=/www/domain.com
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
redirect_stderr=true
stdout_logfile=/var/log/supervisor/horizon.log
stopwaitsecs=3600
EOF

# 建立啟動腳本
cat > scripts/start.sh << 'EOF'
#!/bin/sh
set -e

echo "Installing supervisor..."
apk add --no-cache supervisor

echo "Creating directories..."
mkdir -p /var/log/supervisor
mkdir -p /etc/supervisor.d

echo "Copying supervisor config..."
cp /opt/supervisor/horizon.ini /etc/supervisor.d/horizon.ini

echo "Starting supervisord in background..."
supervisord -c /etc/supervisord.conf

echo "Waiting for supervisor to start..."
sleep 2

echo "Supervisor started, now starting PHP-FPM..."
exec php-fpm -F
EOF

# 設定執行權限
chmod +x scripts/start.sh

# 驗證檔案
ls -la supervisor/
ls -la scripts/
cat supervisor/horizon.ini
cat scripts/start.sh

使用docker-compose.yml

networks:
    1panel-network:
        external: true
services:
    deiva888com:
        container_name: ${CONTAINER_NAME}
        deploy:
            resources:
                limits:
                    cpus: ${CPUS}
                    memory: ${MEMORY_LIMIT}
        image: ${IMAGE_NAME}
        labels:
            createdBy: Apps    
        networks:
            - 1panel-network
        ports:
            - 127.0.0.1:${PANEL_APP_PORT_HTTP}:9000
        restart: always
        volumes:
            - ${PANEL_WEBSITE_DIR}:/www/
            - ./conf/php.ini:/usr/local/etc/php/php.ini
            - ./conf/php-fpm.conf:/usr/local/etc/php-fpm.d/www.conf
            - ./log:/var/log/php
            - ./composer:/tmp/composer
            - ./extensions:/php/extensions
            - ./supervisor:/opt/supervisor
            - ./scripts/start.sh:/start.sh
        entrypoint: ["/start.sh"]

關鍵新增的內容:

- ./supervisor:/opt/supervisor

- ./scripts/start.sh:/start.sh

entrypoint: ["/start.sh"]

日常管理指令

# 查看 Horizon 狀態
docker exec -it docker_name supervisorctl status

# 重新啟動 Horizon
docker exec -it docker_name supervisorctl restart horizon

# 查看 Horizon 即時記錄
docker exec -it docker_name supervisorctl tail -f horizon

# 或者查看記錄檔日常管理指令
```bash
docker exec -it docker_name cat /var/log/supervisor/horizon.log
/opt/1panel/apps/php8/project_name/
├── supervisor/
│   └── horizon.ini          # Supervisor 設定(持久化)
├── scripts/
│   └── start.sh            # 容器啟動腳本(持久化)
├── conf/
│   ├── php.ini
│   └── php-fpm.conf
└── docker-compose.yml      # Docker Compose 設定

儲存這份文件,以後部署其他Project也可以參考!