Laravel 第一版

This commit is contained in:
allen.yan 2025-05-29 11:23:06 +08:00
parent 63e1f3174a
commit 022785d19e
7 changed files with 254 additions and 0 deletions

19
.env Normal file
View File

@ -0,0 +1,19 @@
# Project
PROJECT_NAME=ktvcentral
APP_DOMAIN=https://ktvcentral.test
LETSENCRYPT_EMAIL=you@example.com
# Git
GIT_REPO_URL=http://47.251.18.130:3000/Leecheng/KTVCentral.git
# Database
DB_DATABASE=Karaoke-Kingpin
DB_USERNAME=Karaoke-Kingpin
DB_PASSWORD=ESM7yTPMnavFmbBH
# Redis
REDIS_HOST=redis
REDIS_PORT=6379
QUEUE_CONNECTION=redis
CACHE_DRIVER=redis
SESSION_DRIVER=redis

19
.env.example Normal file
View File

@ -0,0 +1,19 @@
# Project
PROJECT_NAME=ktvcentral
APP_DOMAIN=https://ktvcentral.test
LETSENCRYPT_EMAIL=you@example.com
# Git
GIT_REPO_URL=http://47.251.18.130:3000/Leecheng/KTVCentral.git
# Database
DB_DATABASE=Karaoke-Kingpin
DB_USERNAME=Karaoke-Kingpin
DB_PASSWORD=ESM7yTPMnavFmbBH
# Redis
REDIS_HOST=redis
REDIS_PORT=6379
QUEUE_CONNECTION=redis
CACHE_DRIVER=redis
SESSION_DRIVER=redis

22
Dockerfile Normal file
View File

@ -0,0 +1,22 @@
FROM php:8.3-fpm
RUN apt-get update && apt-get install -y \
git unzip zip curl libpng-dev libjpeg62-turbo-dev libfreetype6-dev \
libonig-dev libxml2-dev libzip-dev libpq-dev libicu-dev libxslt-dev \
libsqlite3-dev sqlite3 cron supervisor && \
curl -fsSL https://deb.nodesource.com/setup_22.x | bash - && \
apt-get install -y nodejs && \
npm install -g npm && \
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
WORKDIR /var/www
COPY ./docker/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
COPY ./docker/entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh
CMD ["/usr/local/bin/entrypoint.sh"]

View File

@ -0,0 +1,20 @@
services:
letsencrypt:
image: jrcs/letsencrypt-nginx-proxy-companion
container_name: ${PROJECT_NAME}_letsencrypt
environment:
NGINX_PROXY_CONTAINER: ${PROJECT_NAME}_nginx_proxy
DEFAULT_EMAIL: ${LETSENCRYPT_EMAIL}
volumes_from:
- nginx-proxy
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./certs:/etc/nginx/certs:rw
- ./vhost.d:/etc/nginx/vhost.d
- ./html:/usr/share/nginx/html
networks:
- nginx_proxy
networks:
nginx_proxy:
external: true

77
docker-compose.yaml Normal file
View File

@ -0,0 +1,77 @@
services:
app:
build:
context: .
dockerfile: Dockerfile
container_name: ${PROJECT_NAME}_app
volumes:
- ./data:/var/www
depends_on:
- mariadb
environment:
VIRTUAL_HOST: ${APP_DOMAIN}
LETSENCRYPT_HOST: ${APP_DOMAIN}
LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL}
networks:
- nginx_proxy
expose:
- "80"
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:
- nginx_proxy
redis:
image: redis:alpine
container_name: ${PROJECT_NAME}_redis
ports:
- "6379:6379"
restart: unless-stopped
volumes:
- redisdata:/data
networks:
- nginx_proxy
redisinsight:
image: redislabs/redisinsight:latest
container_name: ${PROJECT_NAME}_redisinsight
ports:
- "8001:8001"
networks:
- nginx_proxy
depends_on:
- redis
nginx-proxy:
image: jwilder/nginx-proxy
container_name: ${PROJECT_NAME}_nginx_proxy
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- ./certs:/etc/nginx/certs
- ./vhost.d:/etc/nginx/vhost.d
- ./html:/usr/share/nginx/html
networks:
- nginx_proxy
volumes:
dbdata:
redisdata:
networks:
nginx_proxy:
name: nginx_proxy

74
docker/entrypoint.sh Normal file
View File

@ -0,0 +1,74 @@
#!/bin/bash
cd /var/www
# Remove trailing slash from APP_DOMAIN if exists
APP_DOMAIN="${APP_DOMAIN%/}"
# 預設 Redis 設定
: "${REDIS_HOST:=redis}"
: "${REDIS_PORT:=6379}"
# Clone 專案(只有第一次)
if [ ! -d "html" ]; then
echo "🔧 Cloning project from ${GIT_REPO_URL}..."
git clone "$GIT_REPO_URL" html
fi
cd html
# Composer install
echo "📦 Running composer install..."
composer install --no-interaction --prefer-dist
# 複製 .env
if [ ! -f ".env" ]; then
echo "⚙️ Copying .env.example to .env"
cp .env.example .env
fi
# 更新 .env 設定
echo "🛠 Updating .env configurations..."
update_env_var() {
local key=$1
local value=$2
grep -q "^${key}=" .env && \
sed -i "s|^${key}=.*|${key}=${value}|" .env || \
echo "${key}=${value}" >> .env
}
update_env_var "APP_URL" "$APP_DOMAIN"
update_env_var "L5_SWAGGER_CONST_HOST" "$APP_DOMAIN"
update_env_var "DB_DATABASE" "$DB_DATABASE"
update_env_var "DB_USERNAME" "$DB_USERNAME"
update_env_var "DB_PASSWORD" "$DB_PASSWORD"
update_env_var "REDIS_HOST" "$REDIS_HOST"
update_env_var "REDIS_PORT" "$REDIS_PORT"
update_env_var "QUEUE_CONNECTION" "$QUEUE_CONNECTION"
update_env_var "CACHE_DRIVER" "$CACHE_DRIVER"
update_env_var "SESSION_DRIVER" "$SESSION_DRIVER"
# Laravel 初始化
echo "🔑 Generating Laravel app key..."
php artisan key:generate
echo "🧱 Running migrations..."
php artisan config:clear && cache:clear
php artisan migrate --force
# 安裝 Node 套件與建構前端
echo "🌐 Installing npm packages..."
[ ! -d "node_modules" ] && npm install
echo "🛠 Building front-end assets..."
npm run build
# 加入 Laravel Schedule 到 crontab避免重複
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 -)
# 啟動 supervisord同時啟動 queue + cron + php-fpm
echo "🚀 Starting supervisord..."
exec supervisord -n

23
docker/supervisord.conf Normal file
View File

@ -0,0 +1,23 @@
[supervisord]
nodaemon=true
[program:php-fpm]
command=docker-php-entrypoint php-fpm
autostart=true
autorestart=true
priority=1
[program:queue-worker]
directory=/var/www/html
command=php artisan queue:work redis --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
[program:schedule-run]
command=cron -f
autostart=true
autorestart=true
priority=3