From 22a4d0264ac587cbe1ad22c26d48abe5ede7cfd1 Mon Sep 17 00:00:00 2001 From: "allen.yan" Date: Mon, 2 Jun 2025 10:17:50 +0800 Subject: [PATCH] =?UTF-8?q?Laravel=20=E7=AC=AC=E4=B8=80=E7=89=88=20?= =?UTF-8?q?=E6=B8=AC=E8=A9=A6=2020250602?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 0 -> 6148 bytes .env.example | 18 ++++-- .gitignore | 2 + Dockerfile | 28 ++++---- docker-compose.yaml => docker-compose.yml | 61 +++++++++--------- docker/entrypoint.sh | 30 ++++----- docker/mariadb/my.cnf | 2 + .../nginx/default.conf.template | 4 +- docker/supervisord.conf | 17 +++-- restart.sh | 30 +++++++++ start.sh | 37 +++++++++++ status.sh | 19 ++++++ stop.sh | 41 ++++++++++++ 13 files changed, 215 insertions(+), 74 deletions(-) create mode 100644 .DS_Store rename docker-compose.yaml => docker-compose.yml (54%) create mode 100644 docker/mariadb/my.cnf rename default.conf.template => docker/nginx/default.conf.template (86%) create mode 100755 restart.sh create mode 100755 start.sh create mode 100644 status.sh create mode 100755 stop.sh diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..12d85ec555ce84efdd82dc78e11a331f2acafe91 GIT binary patch literal 6148 zcmeHK%SyvQ6rE|KO({Ya3SADkE!Y=|xCycTfDv7&)PxipOf#iP?V=R2)*tdq{2uR} znTW-@6|wii%(>5*%z?~l-IVu|j-5Wy{lZ?o5jBt@n!$gK)znR!y z2mE%6jakknEcyEV;WUY}yxo51m8!L~TeE9+!@l>&a^dGeKF_>hc8k`Plu20XL3kaH z7DH$MT&8&tr=yuFh@%mt+}*@!Bp05Xr%|SAeI2mtc75nHm&@)+rzLv*-l`>*r`>i- z^n1svRoy-~JUY7^J|&Y>zGy-@@U3LeU<=_`4&ox+R)a8t;nPD6=bNP7TYIg7omCm@Uk$Pf)7+7bZs!a#a{|oqKHa_y# zOUNPyh=G5`0JjGIz=K7Zv-R8Z@T?Wk9-yIMUV#b-=xdh%FmNAfs-TVw)FIC`SZKsi T(67n?=^~&Ap^g~%1qMC> .env } +update_env_var "APP_NAME" "$APP_NAME" update_env_var "APP_URL" "$APP_URL" -update_env_var "L5_SWAGGER_CONST_HOST" "$APP_URL" update_env_var "DB_HOST" "$DB_HOST" update_env_var "DB_PORT" "$DB_PORT" update_env_var "DB_DATABASE" "$DB_DATABASE" @@ -55,9 +54,4 @@ echo "Installing npm packages..." echo "Building front-end assets..." npm run build -echo "Adding schedule:run to crontab..." -crontab -l 2>/dev/null | grep -q 'schedule:run' || \ - (echo "* * * * * cd /var/www/html && php artisan schedule:run >> /dev/null 2>&1" | crontab -) - -echo "Starting supervisord..." -exec supervisord -n \ No newline at end of file +exec "$@" \ No newline at end of file diff --git a/docker/mariadb/my.cnf b/docker/mariadb/my.cnf new file mode 100644 index 0000000..f978700 --- /dev/null +++ b/docker/mariadb/my.cnf @@ -0,0 +1,2 @@ +[mysqld] +log_error = /var/log/mysql/error.log \ No newline at end of file diff --git a/default.conf.template b/docker/nginx/default.conf.template similarity index 86% rename from default.conf.template rename to docker/nginx/default.conf.template index a177c7e..0887457 100644 --- a/default.conf.template +++ b/docker/nginx/default.conf.template @@ -1,6 +1,6 @@ server { - listen 80 default_server; - server_name {}; + listen ${NGINX_PORT}; + server_name ${NGINX_HOST}; # ✅ 加上分號 root /var/www/html/public; index index.php index.html; diff --git a/docker/supervisord.conf b/docker/supervisord.conf index d17211e..081b789 100644 --- a/docker/supervisord.conf +++ b/docker/supervisord.conf @@ -1,11 +1,15 @@ [supervisord] nodaemon=true +logfile=/var/www/logs/supervisord.log ; 設定 log 儲存位置 +pidfile=/var/www/logs/supervisord.pid ; 設定 pid 儲存位置 [program:php-fpm] command=docker-php-entrypoint php-fpm autostart=true autorestart=true priority=1 +stdout_logfile=/var/www/logs/php-fpm.log +stderr_logfile=/var/www/logs/php-fpm.err.log [program:queue-worker] directory=/var/www/html @@ -13,11 +17,14 @@ command=php artisan queue:work --daemon --timeout=3600 --tries=1 --queue=default autostart=true autorestart=true priority=2 -stdout_logfile=/var/www/html/storage/logs/queue.log -stderr_logfile=/var/www/html/storage/logs/queue_error.log +stdout_logfile=/var/www/logs/queue.log +stderr_logfile=/var/www/logs/queue_error.log -[program:schedule-run] -command=cron -f +[program:scheduler] +directory=/var/www/html +command=sh -c "while true; do php artisan schedule:run; sleep 60; done" autostart=true autorestart=true -priority=3 \ No newline at end of file +priority=3 +stdout_logfile=/var/www/logs/schedule.log +stderr_logfile=/var/www/logs/schedule_error.log diff --git a/restart.sh b/restart.sh new file mode 100755 index 0000000..8f91e22 --- /dev/null +++ b/restart.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +WIPE=false +if [ "$1" == "--wipe" ]; then + WIPE=true +fi + +# 載入 .env 中的變數 +if [ -f .env ]; then + export $(grep -v '^#' .env | xargs) + echo "📦 .env 載入完成" +else + echo "❌ 沒有找到 .env,無法載入環境變數" + exit 1 +fi + +# 使用 .env 中的 APP_NAME 作為 project name +PROJECT_NAME="${APP_NAME:-ktvproject}" + +echo "♻️ 正在重新啟動 $PROJECT_NAME 所有服務..." + +# 先停服務 +echo "🔻 執行 stop.sh..." +./stop.sh $([ "$WIPE" == "true" ] && echo "--wipe") + +# 再啟動服務 +echo "🔺 執行 start.sh..." +./start.sh + +echo "✅ $PROJECT_NAME 已完成重啟!" \ No newline at end of file diff --git a/start.sh b/start.sh new file mode 100755 index 0000000..d97b405 --- /dev/null +++ b/start.sh @@ -0,0 +1,37 @@ +#!/bin/bash +WIPE=false +if [ "$1" == "--wipe" ]; then + WIPE=true +fi + +# 載入 .env 中的變數 +if [ -f .env ]; then + export $(grep -v '^#' .env | xargs) + echo "📦 .env 載入完成" +else + echo "❌ 沒有找到 .env,無法載入環境變數" + exit 1 +fi + +# 使用 .env 中的 APP_NAME 作為 project name +PROJECT_NAME="${APP_NAME}" +NETWORK_NAME="${APP_NAME}_network" + +# 檢查並建立 network(如果不存在) +if ! docker network ls --format '{{.Name}}' | grep -wq "$NETWORK_NAME"; then + echo "🔌 建立 Docker 網路 $NETWORK_NAME ..." + docker network create $NETWORK_NAME +else + echo "🔌 Docker 網路 $NETWORK_NAME 已存在" +fi + +# 組合額外參數(如果有需要清除 volume 與 image) +EXTRA_FLAGS="up -d" +if [ "$WIPE" == "true" ]; then + EXTRA_FLAGS="up -d --build" +fi + +echo "🚀 Starting APP services..." +docker compose -p $PROJECT_NAME -f docker-compose.yml $EXTRA_FLAGS + +echo "✅ All services for $PROJECT_NAME are up and running!" \ No newline at end of file diff --git a/status.sh b/status.sh new file mode 100644 index 0000000..f6bfc07 --- /dev/null +++ b/status.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +# 載入 .env 中的變數 +if [ -f .env ]; then + export $(grep -v '^#' .env | xargs) + echo "📦 .env 載入完成" +else + echo "❌ 沒有找到 .env,無法載入環境變數" + exit 1 +fi + +# 使用 .env 中的 APP_NAME 作為 project name +PROJECT_NAME="${APP_NAME:-ktvproject}" + +echo "📊 目前 $PROJECT_NAME 相關容器狀態:" +docker ps --filter "name=${PROJECT_NAME}_" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" + +echo "🔍 目前網路狀態(含 app_network):" +docker network inspect app_network --format '{{json .Containers}}' | jq \ No newline at end of file diff --git a/stop.sh b/stop.sh new file mode 100755 index 0000000..df082ea --- /dev/null +++ b/stop.sh @@ -0,0 +1,41 @@ +#!/bin/bash +WIPE=false +if [ "$1" == "--wipe" ]; then + WIPE=true +fi + +# 載入 .env 中的變數 +if [ -f .env ]; then + export $(grep -v '^#' .env | xargs) + echo "📦 .env 載入完成" +else + echo "❌ 沒有找到 .env,無法載入環境變數" + exit 1 +fi + +# 使用 .env 中的 APP_NAME 作為 project name +PROJECT_NAME="${APP_NAME}" +NETWORK_NAME="${APP_NAME}_network" + + +# 組合額外參數(如果有需要清除 volume 與 image) +EXTRA_FLAGS="" +if [ "$WIPE" == "true" ]; then + EXTRA_FLAGS="-v --rmi all" + # 檢查並建立 network(如果不存在) + if ! docker network ls --format '{{.Name}}' | grep -wq "$NETWORK_NAME"; then + echo "🔌 Docker 網路 $NETWORK_NAME 不存在" + else + docker network rm $NETWORK_NAME + echo "🔌 Docker 網路 $NETWORK_NAME 已刪除" + fi +fi + +echo "🛑 Stopping APP services..." +docker compose -p "$PROJECT_NAME" -f docker-compose.app.yml down $EXTRA_FLAGS + +if [ "$WIPE" == "true" ]; then + echo "🧹 所有資料(volumes, image)已清除!" +else + echo "✅ 所有服務 $PROJECT_NAME 已成功關閉。" +fi