Laravel 第一版 測試 20250602
This commit is contained in:
parent
5bc1e90ec0
commit
22a4d0264a
18
.env.example
18
.env.example
@ -1,15 +1,19 @@
|
|||||||
# Project
|
# Project
|
||||||
PROJECT_NAME=ktvcentral
|
APP_NAME=ktvcentral
|
||||||
APP_DOMAIN=ktvcentral.test
|
APP_DOMAIN=ktvcentral.test
|
||||||
|
APP_PORT=80
|
||||||
APP_URL=https://ktvcentral.test
|
APP_URL=https://ktvcentral.test
|
||||||
LETSENCRYPT_EMAIL=you@example.com
|
|
||||||
|
|
||||||
# Git
|
|
||||||
GIT_REPO_URL=http://47.251.18.130:3000/Leecheng/KTVCentral.git
|
|
||||||
|
|
||||||
# Database
|
# Database
|
||||||
DB_HOST=mariadb
|
DB_HOST=mariadb
|
||||||
DB_PORT=3306
|
DB_PORT=3306
|
||||||
DB_DATABASE=Karaoke-Kingpin
|
DB_DATABASE=KaraokeKingpin
|
||||||
DB_USERNAME=Karaoke-Kingpin
|
DB_USERNAME=KaraokeKingpin
|
||||||
DB_PASSWORD=ESM7yTPMnavFmbBH
|
DB_PASSWORD=ESM7yTPMnavFmbBH
|
||||||
|
|
||||||
|
# Redis
|
||||||
|
REDIS_HOST=redis
|
||||||
|
REDIS_PORT=6379
|
||||||
|
QUEUE_CONNECTION=redis
|
||||||
|
CACHE_DRIVER=redis
|
||||||
|
SESSION_DRIVER=redis
|
2
.gitignore
vendored
2
.gitignore
vendored
@ -4,6 +4,8 @@ docker-compose.override.yml
|
|||||||
# 忽略建置產出的 volume、掛載資料
|
# 忽略建置產出的 volume、掛載資料
|
||||||
data/
|
data/
|
||||||
html/
|
html/
|
||||||
|
log/
|
||||||
|
logs/
|
||||||
*.sqlite
|
*.sqlite
|
||||||
|
|
||||||
# 忽略環境變數備份
|
# 忽略環境變數備份
|
||||||
|
28
Dockerfile
28
Dockerfile
@ -3,20 +3,26 @@ FROM php:8.3-fpm
|
|||||||
RUN apt-get update && apt-get install -y \
|
RUN apt-get update && apt-get install -y \
|
||||||
git unzip zip curl libpng-dev libjpeg62-turbo-dev libfreetype6-dev \
|
git unzip zip curl libpng-dev libjpeg62-turbo-dev libfreetype6-dev \
|
||||||
libonig-dev libxml2-dev libzip-dev libpq-dev libicu-dev libxslt-dev \
|
libonig-dev libxml2-dev libzip-dev libpq-dev libicu-dev libxslt-dev \
|
||||||
libsqlite3-dev sqlite3 cron supervisor && \
|
libsqlite3-dev sqlite3 cron supervisor bash nano \
|
||||||
curl -fsSL https://deb.nodesource.com/setup_22.x | bash - && \
|
default-mysql-client \
|
||||||
apt-get install -y nodejs && \
|
&& curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \
|
||||||
npm install -g npm && \
|
&& apt-get install -y nodejs \
|
||||||
docker-php-ext-configure gd --with-freetype --with-jpeg && \
|
&& npm install -g npm \
|
||||||
docker-php-ext-install gd pdo_mysql zip bcmath intl xsl pcntl sockets
|
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
|
||||||
|
&& docker-php-ext-install gd pdo_mysql zip bcmath intl xsl pcntl sockets
|
||||||
|
|
||||||
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
|
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
|
||||||
|
|
||||||
WORKDIR /var/www
|
COPY ./data/KTVCentral/ /var/www/html/
|
||||||
|
|
||||||
|
RUN chown -R www-data:www-data /var/www/html
|
||||||
|
|
||||||
|
|
||||||
|
WORKDIR /var/www/html
|
||||||
|
|
||||||
COPY ./docker/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
|
COPY ./docker/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
|
||||||
COPY ./docker/entrypoint.sh /usr/local/bin/entrypoint.sh
|
COPY ./docker/entrypoint.sh /entrypoint.sh
|
||||||
RUN chmod +x /usr/local/bin/entrypoint.sh
|
RUN chmod +x /entrypoint.sh
|
||||||
|
ENTRYPOINT ["/entrypoint.sh"]
|
||||||
|
|
||||||
CMD ["/usr/local/bin/entrypoint.sh"]
|
CMD ["supervisord", "-n", "-c", "/etc/supervisor/conf.d/supervisord.conf"]
|
@ -1,18 +1,34 @@
|
|||||||
services:
|
services:
|
||||||
|
mariadb:
|
||||||
|
image: mariadb:10.6
|
||||||
|
container_name: ${APP_NAME}_db
|
||||||
|
restart: always
|
||||||
|
environment:
|
||||||
|
MYSQL_ROOT_PASSWORD: root
|
||||||
|
MYSQL_DATABASE: ${DB_DATABASE}
|
||||||
|
MYSQL_USER: ${DB_USERNAME}
|
||||||
|
MYSQL_PASSWORD: ${DB_PASSWORD}
|
||||||
|
volumes:
|
||||||
|
- ./data/db:/var/lib/mysql
|
||||||
|
- ./data/logs/mysql:/var/log/mysql
|
||||||
|
- ./docker/mariadb/my.cnf:/etc/mysql/conf.d/custom.cnf
|
||||||
|
ports:
|
||||||
|
- "3306:3306"
|
||||||
|
networks:
|
||||||
|
- app_network
|
||||||
app:
|
app:
|
||||||
build:
|
build:
|
||||||
context: .
|
context: .
|
||||||
dockerfile: Dockerfile
|
dockerfile: Dockerfile
|
||||||
container_name: ${PROJECT_NAME}_app
|
container_name: ${APP_NAME}_app
|
||||||
volumes:
|
volumes:
|
||||||
- ./data:/var/www
|
- ./data/KTVCentral:/var/www/html
|
||||||
|
- ./data/logs:/var/www/logs
|
||||||
|
- ./docker/supervisord.conf:/etc/supervisor/conf.d/supervisord.conf
|
||||||
depends_on:
|
depends_on:
|
||||||
- mariadb
|
- mariadb
|
||||||
environment:
|
environment:
|
||||||
VIRTUAL_HOST: ${APP_DOMAIN}
|
APP_NAME: ${APP_NAME}
|
||||||
LETSENCRYPT_HOST: ${APP_DOMAIN}
|
|
||||||
LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL}
|
|
||||||
GIT_REPO_URL: ${GIT_REPO_URL}
|
|
||||||
APP_URL: ${APP_URL}
|
APP_URL: ${APP_URL}
|
||||||
DB_HOST: ${DB_HOST}
|
DB_HOST: ${DB_HOST}
|
||||||
DB_PORT: ${DB_PORT}
|
DB_PORT: ${DB_PORT}
|
||||||
@ -21,39 +37,22 @@ services:
|
|||||||
DB_PASSWORD: ${DB_PASSWORD}
|
DB_PASSWORD: ${DB_PASSWORD}
|
||||||
networks:
|
networks:
|
||||||
- app_network
|
- app_network
|
||||||
|
|
||||||
mariadb:
|
|
||||||
image: mariadb:10.6
|
|
||||||
container_name: ${PROJECT_NAME}_db
|
|
||||||
restart: always
|
|
||||||
environment:
|
|
||||||
MYSQL_ROOT_PASSWORD: root
|
|
||||||
MYSQL_DATABASE: ${DB_DATABASE}
|
|
||||||
MYSQL_USER: ${DB_USERNAME}
|
|
||||||
MYSQL_PASSWORD: ${DB_PASSWORD}
|
|
||||||
volumes:
|
|
||||||
- dbdata:/var/lib/mysql
|
|
||||||
ports:
|
|
||||||
- "3306:3306"
|
|
||||||
networks:
|
|
||||||
- app_network
|
|
||||||
|
|
||||||
nginx:
|
nginx:
|
||||||
image: nginx:stable-alpine
|
image: nginx:stable-alpine
|
||||||
container_name: ${PROJECT_NAME}_nginx
|
container_name: ${APP_NAME}_nginx
|
||||||
ports:
|
ports:
|
||||||
- "80:80"
|
- "80:80"
|
||||||
volumes:
|
volumes:
|
||||||
- ./data:/var/www
|
- ./data/KTVCentral/public:/var/www/html/public
|
||||||
- ./default.conf:/etc/nginx/conf.d/default.conf
|
- ./docker/nginx/:/etc/nginx/templates
|
||||||
|
- ./data/logs/nginx/:/var/log/nginx
|
||||||
depends_on:
|
depends_on:
|
||||||
- app
|
- app
|
||||||
|
environment:
|
||||||
|
NGINX_HOST: ${APP_DOMAIN}
|
||||||
|
NGINX_PORT: ${APP_PORT}
|
||||||
networks:
|
networks:
|
||||||
- app_network
|
- app_network
|
||||||
|
|
||||||
volumes:
|
|
||||||
dbdata:
|
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
app_network:
|
app_network:
|
||||||
name: app_network
|
name: ${APP_NAME}_network
|
@ -1,21 +1,20 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
cd /var/www
|
cd /var/www/html
|
||||||
|
|
||||||
APP_URL="${APP_URL%/}"
|
APP_URL="${APP_URL%/}"
|
||||||
|
|
||||||
|
|
||||||
if [ ! -d "html" ]; then
|
# if [ ! -d "html" ]; then
|
||||||
if [ -n "$GIT_REPO_URL" ]; then
|
# if [ -n "$GIT_REPO_URL" ]; then
|
||||||
echo "Cloning project from ${GIT_REPO_URL}..."
|
# echo "Cloning project from ${GIT_REPO_URL}..."
|
||||||
git clone "$GIT_REPO_URL" html
|
# git clone "$GIT_REPO_URL" html
|
||||||
else
|
# else
|
||||||
echo "GIT_REPO_URL not set. Skipping clone."
|
# echo "GIT_REPO_URL not set. Skipping clone."
|
||||||
exit 1
|
# exit 1
|
||||||
fi
|
# fi
|
||||||
fi
|
#fi
|
||||||
|
|
||||||
cd html
|
|
||||||
|
|
||||||
echo "Running composer install..."
|
echo "Running composer install..."
|
||||||
composer install --no-interaction --prefer-dist
|
composer install --no-interaction --prefer-dist
|
||||||
@ -35,8 +34,8 @@ update_env_var() {
|
|||||||
echo "${key}=${value}" >> .env
|
echo "${key}=${value}" >> .env
|
||||||
}
|
}
|
||||||
|
|
||||||
|
update_env_var "APP_NAME" "$APP_NAME"
|
||||||
update_env_var "APP_URL" "$APP_URL"
|
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_HOST" "$DB_HOST"
|
||||||
update_env_var "DB_PORT" "$DB_PORT"
|
update_env_var "DB_PORT" "$DB_PORT"
|
||||||
update_env_var "DB_DATABASE" "$DB_DATABASE"
|
update_env_var "DB_DATABASE" "$DB_DATABASE"
|
||||||
@ -55,9 +54,4 @@ echo "Installing npm packages..."
|
|||||||
echo "Building front-end assets..."
|
echo "Building front-end assets..."
|
||||||
npm run build
|
npm run build
|
||||||
|
|
||||||
echo "Adding schedule:run to crontab..."
|
exec "$@"
|
||||||
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
|
|
2
docker/mariadb/my.cnf
Normal file
2
docker/mariadb/my.cnf
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
[mysqld]
|
||||||
|
log_error = /var/log/mysql/error.log
|
@ -1,6 +1,6 @@
|
|||||||
server {
|
server {
|
||||||
listen 80 default_server;
|
listen ${NGINX_PORT};
|
||||||
server_name {};
|
server_name ${NGINX_HOST}; # ✅ 加上分號
|
||||||
|
|
||||||
root /var/www/html/public;
|
root /var/www/html/public;
|
||||||
index index.php index.html;
|
index index.php index.html;
|
@ -1,11 +1,15 @@
|
|||||||
[supervisord]
|
[supervisord]
|
||||||
nodaemon=true
|
nodaemon=true
|
||||||
|
logfile=/var/www/logs/supervisord.log ; 設定 log 儲存位置
|
||||||
|
pidfile=/var/www/logs/supervisord.pid ; 設定 pid 儲存位置
|
||||||
|
|
||||||
[program:php-fpm]
|
[program:php-fpm]
|
||||||
command=docker-php-entrypoint php-fpm
|
command=docker-php-entrypoint php-fpm
|
||||||
autostart=true
|
autostart=true
|
||||||
autorestart=true
|
autorestart=true
|
||||||
priority=1
|
priority=1
|
||||||
|
stdout_logfile=/var/www/logs/php-fpm.log
|
||||||
|
stderr_logfile=/var/www/logs/php-fpm.err.log
|
||||||
|
|
||||||
[program:queue-worker]
|
[program:queue-worker]
|
||||||
directory=/var/www/html
|
directory=/var/www/html
|
||||||
@ -13,11 +17,14 @@ command=php artisan queue:work --daemon --timeout=3600 --tries=1 --queue=default
|
|||||||
autostart=true
|
autostart=true
|
||||||
autorestart=true
|
autorestart=true
|
||||||
priority=2
|
priority=2
|
||||||
stdout_logfile=/var/www/html/storage/logs/queue.log
|
stdout_logfile=/var/www/logs/queue.log
|
||||||
stderr_logfile=/var/www/html/storage/logs/queue_error.log
|
stderr_logfile=/var/www/logs/queue_error.log
|
||||||
|
|
||||||
[program:schedule-run]
|
[program:scheduler]
|
||||||
command=cron -f
|
directory=/var/www/html
|
||||||
|
command=sh -c "while true; do php artisan schedule:run; sleep 60; done"
|
||||||
autostart=true
|
autostart=true
|
||||||
autorestart=true
|
autorestart=true
|
||||||
priority=3
|
priority=3
|
||||||
|
stdout_logfile=/var/www/logs/schedule.log
|
||||||
|
stderr_logfile=/var/www/logs/schedule_error.log
|
||||||
|
30
restart.sh
Executable file
30
restart.sh
Executable file
@ -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 已完成重啟!"
|
37
start.sh
Executable file
37
start.sh
Executable file
@ -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!"
|
19
status.sh
Normal file
19
status.sh
Normal file
@ -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
|
41
stop.sh
Executable file
41
stop.sh
Executable file
@ -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
|
Reference in New Issue
Block a user