From 610c88debc492e92d13bfd9a768ceb43ee3f18ce Mon Sep 17 00:00:00 2001 From: Victor Phan Date: Wed, 14 Jan 2026 14:51:03 +0700 Subject: [PATCH] =?UTF-8?q?x=C3=A2y=20d=E1=BB=B1ng=20docker?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .dockerignore | 28 +++ .env | 23 +- .env.backup.20260114_125203 | 65 +++++ .env.backup.20260114_140612 | 60 +++++ .env.docker | 60 +++++ DOCKER_README.md | 310 ++++++++++++++++++++++++ Dockerfile | 60 +++++ HUONG_DAN_DOCKER.md | 163 +++++++++++++ bootstrap/cache/.gitignore | 0 docker-compose.yml | 90 +++++++ docker-setup.sh | 99 ++++++++ docker-stop.sh | 11 + docker/mysql/my.cnf | 13 + docker/nginx/default.conf | 45 ++++ docker/supervisor/supervisord.conf | 19 ++ public/storage | 2 +- storage/app/.gitignore | 0 storage/app/public/.gitignore | 0 storage/framework/.gitignore | 0 storage/framework/cache/.gitignore | 0 storage/framework/cache/data/.gitignore | 0 storage/framework/sessions/.gitignore | 0 storage/framework/testing/.gitignore | 0 storage/framework/views/.gitignore | 0 storage/logs/.gitignore | 0 25 files changed, 1033 insertions(+), 15 deletions(-) create mode 100644 .dockerignore create mode 100644 .env.backup.20260114_125203 create mode 100644 .env.backup.20260114_140612 create mode 100644 .env.docker create mode 100644 DOCKER_README.md create mode 100644 Dockerfile create mode 100644 HUONG_DAN_DOCKER.md mode change 100644 => 100755 bootstrap/cache/.gitignore create mode 100644 docker-compose.yml create mode 100755 docker-setup.sh create mode 100755 docker-stop.sh create mode 100644 docker/mysql/my.cnf create mode 100644 docker/nginx/default.conf create mode 100644 docker/supervisor/supervisord.conf mode change 100644 => 100755 storage/app/.gitignore mode change 100644 => 100755 storage/app/public/.gitignore mode change 100644 => 100755 storage/framework/.gitignore mode change 100644 => 100755 storage/framework/cache/.gitignore mode change 100644 => 100755 storage/framework/cache/data/.gitignore mode change 100644 => 100755 storage/framework/sessions/.gitignore mode change 100644 => 100755 storage/framework/testing/.gitignore mode change 100644 => 100755 storage/framework/views/.gitignore mode change 100644 => 100755 storage/logs/.gitignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..df3f249 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,28 @@ +node_modules/ +npm-debug.log +yarn-error.log +vendor/ +.git +.gitignore +.gitattributes +.env +.env.* +!.env.docker +.DS_Store +Thumbs.db +*.log +storage/logs/* +storage/framework/cache/* +storage/framework/sessions/* +storage/framework/views/* +bootstrap/cache/* +.phpunit.result.cache +coverage/ +*.sql +*.csv +*.backup +.idea/ +.vscode/ +*.swp +*.swo +*~ diff --git a/.env b/.env index c9fad78..15d87af 100644 --- a/.env +++ b/.env @@ -1,30 +1,32 @@ -APP_NAME=Laravel +APP_NAME=LuckyWheel APP_ENV=local APP_KEY=base64:BR0ZC/fPxHWU2+eytLLj9pYdxn5QhyDm1sS+qeaA1OU= APP_DEBUG=true -APP_URL=http://localhost +APP_URL=http://localhost:8080 LOG_CHANNEL=stack LOG_DEPRECATIONS_CHANNEL=null LOG_LEVEL=debug +# Database Configuration for Docker DB_CONNECTION=mysql -DB_HOST=127.0.0.1 +DB_HOST=db DB_PORT=3306 DB_DATABASE=luckywheel DB_USERNAME=laravel DB_PASSWORD=laravel123 BROADCAST_DRIVER=log -CACHE_DRIVER=file +CACHE_DRIVER=redis FILESYSTEM_DISK=local QUEUE_CONNECTION=sync -SESSION_DRIVER=file +SESSION_DRIVER=redis SESSION_LIFETIME=120 MEMCACHED_HOST=127.0.0.1 -REDIS_HOST=127.0.0.1 +# Redis Configuration for Docker +REDIS_HOST=redis REDIS_PASSWORD=null REDIS_PORT=6379 @@ -48,7 +50,7 @@ PUSHER_APP_KEY= PUSHER_APP_SECRET= PUSHER_HOST= PUSHER_PORT=443 -PUSHER_SCHEME=https +PUSHER_SCHEME=http PUSHER_APP_CLUSTER=mt1 VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}" @@ -56,10 +58,3 @@ VITE_PUSHER_HOST="${PUSHER_HOST}" VITE_PUSHER_PORT="${PUSHER_PORT}" VITE_PUSHER_SCHEME="${PUSHER_SCHEME}" VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" - -BROADCAST_DRIVER=pusher - -PUSHER_APP_ID=1909415 -PUSHER_APP_KEY=242f238ba1f5a0a20de3 -PUSHER_APP_SECRET=5afc35e0dddb385d586f -PUSHER_APP_CLUSTER=ap1 diff --git a/.env.backup.20260114_125203 b/.env.backup.20260114_125203 new file mode 100644 index 0000000..c9fad78 --- /dev/null +++ b/.env.backup.20260114_125203 @@ -0,0 +1,65 @@ +APP_NAME=Laravel +APP_ENV=local +APP_KEY=base64:BR0ZC/fPxHWU2+eytLLj9pYdxn5QhyDm1sS+qeaA1OU= +APP_DEBUG=true +APP_URL=http://localhost + +LOG_CHANNEL=stack +LOG_DEPRECATIONS_CHANNEL=null +LOG_LEVEL=debug + +DB_CONNECTION=mysql +DB_HOST=127.0.0.1 +DB_PORT=3306 +DB_DATABASE=luckywheel +DB_USERNAME=laravel +DB_PASSWORD=laravel123 + +BROADCAST_DRIVER=log +CACHE_DRIVER=file +FILESYSTEM_DISK=local +QUEUE_CONNECTION=sync +SESSION_DRIVER=file +SESSION_LIFETIME=120 + +MEMCACHED_HOST=127.0.0.1 + +REDIS_HOST=127.0.0.1 +REDIS_PASSWORD=null +REDIS_PORT=6379 + +MAIL_MAILER=smtp +MAIL_HOST=mailpit +MAIL_PORT=1025 +MAIL_USERNAME=null +MAIL_PASSWORD=null +MAIL_ENCRYPTION=null +MAIL_FROM_ADDRESS="hello@example.com" +MAIL_FROM_NAME="${APP_NAME}" + +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_DEFAULT_REGION=us-east-1 +AWS_BUCKET= +AWS_USE_PATH_STYLE_ENDPOINT=false + +PUSHER_APP_ID= +PUSHER_APP_KEY= +PUSHER_APP_SECRET= +PUSHER_HOST= +PUSHER_PORT=443 +PUSHER_SCHEME=https +PUSHER_APP_CLUSTER=mt1 + +VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}" +VITE_PUSHER_HOST="${PUSHER_HOST}" +VITE_PUSHER_PORT="${PUSHER_PORT}" +VITE_PUSHER_SCHEME="${PUSHER_SCHEME}" +VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" + +BROADCAST_DRIVER=pusher + +PUSHER_APP_ID=1909415 +PUSHER_APP_KEY=242f238ba1f5a0a20de3 +PUSHER_APP_SECRET=5afc35e0dddb385d586f +PUSHER_APP_CLUSTER=ap1 diff --git a/.env.backup.20260114_140612 b/.env.backup.20260114_140612 new file mode 100644 index 0000000..15d87af --- /dev/null +++ b/.env.backup.20260114_140612 @@ -0,0 +1,60 @@ +APP_NAME=LuckyWheel +APP_ENV=local +APP_KEY=base64:BR0ZC/fPxHWU2+eytLLj9pYdxn5QhyDm1sS+qeaA1OU= +APP_DEBUG=true +APP_URL=http://localhost:8080 + +LOG_CHANNEL=stack +LOG_DEPRECATIONS_CHANNEL=null +LOG_LEVEL=debug + +# Database Configuration for Docker +DB_CONNECTION=mysql +DB_HOST=db +DB_PORT=3306 +DB_DATABASE=luckywheel +DB_USERNAME=laravel +DB_PASSWORD=laravel123 + +BROADCAST_DRIVER=log +CACHE_DRIVER=redis +FILESYSTEM_DISK=local +QUEUE_CONNECTION=sync +SESSION_DRIVER=redis +SESSION_LIFETIME=120 + +MEMCACHED_HOST=127.0.0.1 + +# Redis Configuration for Docker +REDIS_HOST=redis +REDIS_PASSWORD=null +REDIS_PORT=6379 + +MAIL_MAILER=smtp +MAIL_HOST=mailpit +MAIL_PORT=1025 +MAIL_USERNAME=null +MAIL_PASSWORD=null +MAIL_ENCRYPTION=null +MAIL_FROM_ADDRESS="hello@example.com" +MAIL_FROM_NAME="${APP_NAME}" + +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_DEFAULT_REGION=us-east-1 +AWS_BUCKET= +AWS_USE_PATH_STYLE_ENDPOINT=false + +PUSHER_APP_ID= +PUSHER_APP_KEY= +PUSHER_APP_SECRET= +PUSHER_HOST= +PUSHER_PORT=443 +PUSHER_SCHEME=http +PUSHER_APP_CLUSTER=mt1 + +VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}" +VITE_PUSHER_HOST="${PUSHER_HOST}" +VITE_PUSHER_PORT="${PUSHER_PORT}" +VITE_PUSHER_SCHEME="${PUSHER_SCHEME}" +VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" diff --git a/.env.docker b/.env.docker new file mode 100644 index 0000000..15d87af --- /dev/null +++ b/.env.docker @@ -0,0 +1,60 @@ +APP_NAME=LuckyWheel +APP_ENV=local +APP_KEY=base64:BR0ZC/fPxHWU2+eytLLj9pYdxn5QhyDm1sS+qeaA1OU= +APP_DEBUG=true +APP_URL=http://localhost:8080 + +LOG_CHANNEL=stack +LOG_DEPRECATIONS_CHANNEL=null +LOG_LEVEL=debug + +# Database Configuration for Docker +DB_CONNECTION=mysql +DB_HOST=db +DB_PORT=3306 +DB_DATABASE=luckywheel +DB_USERNAME=laravel +DB_PASSWORD=laravel123 + +BROADCAST_DRIVER=log +CACHE_DRIVER=redis +FILESYSTEM_DISK=local +QUEUE_CONNECTION=sync +SESSION_DRIVER=redis +SESSION_LIFETIME=120 + +MEMCACHED_HOST=127.0.0.1 + +# Redis Configuration for Docker +REDIS_HOST=redis +REDIS_PASSWORD=null +REDIS_PORT=6379 + +MAIL_MAILER=smtp +MAIL_HOST=mailpit +MAIL_PORT=1025 +MAIL_USERNAME=null +MAIL_PASSWORD=null +MAIL_ENCRYPTION=null +MAIL_FROM_ADDRESS="hello@example.com" +MAIL_FROM_NAME="${APP_NAME}" + +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_DEFAULT_REGION=us-east-1 +AWS_BUCKET= +AWS_USE_PATH_STYLE_ENDPOINT=false + +PUSHER_APP_ID= +PUSHER_APP_KEY= +PUSHER_APP_SECRET= +PUSHER_HOST= +PUSHER_PORT=443 +PUSHER_SCHEME=http +PUSHER_APP_CLUSTER=mt1 + +VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}" +VITE_PUSHER_HOST="${PUSHER_HOST}" +VITE_PUSHER_PORT="${PUSHER_PORT}" +VITE_PUSHER_SCHEME="${PUSHER_SCHEME}" +VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" diff --git a/DOCKER_README.md b/DOCKER_README.md new file mode 100644 index 0000000..f707f7a --- /dev/null +++ b/DOCKER_README.md @@ -0,0 +1,310 @@ +# 🐳 HƯỚNG DẪN SỬ DỤNG DOCKER CHO DỰ ÁN LUCKY WHEEL + +## 📋 Yêu Cầu Hệ Thống + +- Docker version 20.10 trở lên +- Docker Compose version 2.0 trở lên +- Ít nhất 4GB RAM +- 10GB dung lượng ổ cứng trống + +## 🚀 Cài Đặt Docker (Nếu chưa có) + +### Ubuntu/Debian: +```bash +# Cài đặt Docker +curl -fsSL https://get.docker.com -o get-docker.sh +sudo sh get-docker.sh + +# Thêm user vào group docker +sudo usermod -aG docker $USER + +# Docker Compose V2 đã được tích hợp sẵn trong Docker +# Kiểm tra: docker compose version + +# Logout và login lại để áp dụng thay đổi +``` + +## 🎯 Khởi Động Dự Án + +### Cách 1: Sử dụng script tự động (Khuyến nghị) +```bash +./docker-setup.sh +``` + +Script này sẽ tự động: +- ✅ Tạo file .env từ .env.docker +- ✅ Build Docker images +- ✅ Khởi động containers +- ✅ Chạy migrations +- ✅ Seed dữ liệu +- ✅ Cấu hình storage link +- ✅ Optimize ứng dụng + +### Cách 2: Thủ công +```bash +# 1. Sao chép file .env +cp .env.docker .env + +# 2. Build và khởi động containers +docker compose up -d --build + +# 3. Chờ MySQL khởi động (30 giây) +sleep 30 + +# 4. Chạy migrations +docker compose exec app php artisan migrate --force + +# 5. Seed dữ liệu +docker compose exec app php artisan db:seed --class=DanhSachGiaiThuongSeeder --force + +# 6. Tạo symbolic link +docker compose exec app php artisan storage:link + +# 7. Clear và cache +docker compose exec app php artisan config:cache +docker compose exec app php artisan route:cache +docker compose exec app php artisan view:cache +``` + +## 🌐 Truy Cập Ứng Dụng + +| Dịch vụ | URL | Thông tin đăng nhập | +|---------|-----|---------------------| +| **Laravel App** | http://localhost:8080 | - | +| **PHPMyAdmin** | http://localhost:8081 | User: `laravel`
Pass: `laravel123` | +| **MySQL** | localhost:3307 | Database: `luckywheel`
User: `laravel`
Pass: `laravel123`
Root Pass: `root123` | +| **Redis** | localhost:6380 | - | + +## 📦 Cấu Trúc Docker + +``` +LuckyWheel/ +├── docker-compose.yml # Cấu hình Docker Compose +├── Dockerfile # Dockerfile cho PHP/Laravel +├── .dockerignore # Loại trừ files khi build +├── .env.docker # Environment cho Docker +├── docker-setup.sh # Script khởi động tự động +├── docker-stop.sh # Script dừng containers +└── docker/ + ├── nginx/ + │ └── default.conf # Cấu hình Nginx + ├── supervisor/ + │ └── supervisord.conf # Cấu hình Supervisor + └── mysql/ + └── my.cnf # Cấu hình MySQL +``` + +## 🔧 Các Lệnh Docker Hữu Ích + +### Quản lý Containers +```bash +# Xem trạng thái containers +docker compose ps + +# Xem logs của tất cả services +docker compose logs -f + +# Xem logs của một service cụ thể +docker compose logs -f app +docker compose logs -f db + +# Dừng containers (giữ nguyên dữ liệu) +docker compose down + +# Dừng containers và XÓA dữ liệu +docker compose down -v + +# Khởi động lại containers +docker compose restart + +# Khởi động lại một service cụ thể +docker compose restart app +``` + +### Thao tác với Container App +```bash +# Truy cập vào container app +docker compose exec app bash + +# Chạy Artisan commands +docker compose exec app php artisan migrate +docker compose exec app php artisan db:seed +docker compose exec app php artisan tinker +docker compose exec app php artisan config:clear +docker compose exec app php artisan cache:clear + +# Cài đặt Composer packages +docker compose exec app composer install +docker compose exec app composer require package-name + +# Chạy tests +docker compose exec app php artisan test +``` + +### Thao tác với Database +```bash +# Truy cập MySQL CLI +docker compose exec db mysql -u laravel -plaravel123 luckywheel + +# Backup database +docker compose exec db mysqldump -u laravel -plaravel123 luckywheel > backup_$(date +%Y%m%d_%H%M%S).sql + +# Restore database +docker compose exec -T db mysql -u laravel -plaravel123 luckywheel < backup.sql + +# Reset database +docker compose exec app php artisan migrate:fresh --seed +``` + +### Quản lý Images +```bash +# Xem danh sách images +docker images + +# Rebuild image (không dùng cache) +docker compose build --no-cache + +# Xóa images không sử dụng +docker image prune -a +``` + +## 🔍 Xử Lý Sự Cố + +### Lỗi: Port đã được sử dụng +```bash +# Kiểm tra process đang sử dụng port +sudo lsof -i :8080 +sudo lsof -i :3307 + +# Hoặc thay đổi port trong docker-compose.yml +# Ví dụ: "8080:80" -> "8081:80" +``` + +### Lỗi: Permission denied +```bash +# Cấp quyền cho thư mục storage và bootstrap +docker compose exec app chown -R www-data:www-data /var/www/storage +docker compose exec app chown -R www-data:www-data /var/www/bootstrap/cache +docker compose exec app chmod -R 775 /var/www/storage +docker compose exec app chmod -R 775 /var/www/bootstrap/cache +``` + +### Lỗi: Cannot connect to MySQL +```bash +# Kiểm tra MySQL đã khởi động chưa +docker compose ps + +# Xem logs MySQL +docker compose logs db + +# Restart MySQL container +docker compose restart db + +# Chờ 30 giây sau khi khởi động MySQL +``` + +### Lỗi: Composer dependencies +```bash +# Xóa vendor và cài lại +docker compose exec app rm -rf vendor +docker compose exec app composer install --optimize-autoloader +``` + +### Reset hoàn toàn dự án +```bash +# Dừng và xóa tất cả (bao gồm volumes) +docker compose down -v + +# Xóa images +docker rmi luckywheel_app + +# Chạy lại setup +./docker-setup.sh +``` + +## 📊 Giám sát Resources + +```bash +# Xem tài nguyên đang sử dụng +docker stats + +# Xem dung lượng đang sử dụng +docker system df + +# Dọn dẹp tài nguyên không sử dụng +docker system prune -a +``` + +## 🔐 Bảo Mật + +### Trong môi trường Production: +1. Thay đổi tất cả passwords trong `.env.docker` +2. Đặt `APP_DEBUG=false` +3. Đặt `APP_ENV=production` +4. Tắt PHPMyAdmin (comment trong docker-compose.yml) +5. Sử dụng HTTPS +6. Giới hạn exposed ports + +### File .env.docker cho Production: +```env +APP_ENV=production +APP_DEBUG=false +DB_PASSWORD= +MYSQL_ROOT_PASSWORD= +``` + +## 🚀 Deploy lên Server + +### 1. Clone repository +```bash +git clone +cd LuckyWheel +``` + +### 2. Chạy setup +```bash +./docker-setup.sh +``` + +### 3. Cấu hình reverse proxy (Nginx) +```nginx +server { + listen 80; + server_name your-domain.com; + + location / { + proxy_pass http://localhost:8080; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } +} +``` + +## 📝 Ghi Chú + +- Tất cả dữ liệu database được lưu trong Docker volume `dbdata` +- Redis data được lưu trong volume `redisdata` +- Source code được mount từ host vào container, thay đổi sẽ reflect ngay lập tức +- Logs được lưu trong `/var/log/supervisor/` bên trong container + +## 💡 Tips & Tricks + +1. **Development nhanh**: Code changes tự động reflect, không cần rebuild +2. **Database GUI**: Sử dụng PHPMyAdmin tại http://localhost:8081 +3. **Redis GUI**: Có thể cài thêm Redis Commander nếu cần +4. **Xem real-time logs**: `docker compose logs -f app` +5. **Quick restart**: `docker compose restart app` thay vì down/up + +## 🆘 Hỗ Trợ + +Nếu gặp vấn đề, kiểm tra: +1. Docker và Docker Compose đã được cài đúng phiên bản +2. Ports 8080, 8081, 3307, 6380 chưa được sử dụng +3. Có đủ dung lượng ổ cứng và RAM +4. Logs của containers: `docker compose logs` + +--- + +**Chúc bạn deploy thành công! 🎉** diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..ab1abc3 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,60 @@ +FROM php:8.1-fpm + +# Install system dependencies +RUN apt-get update && apt-get install -y \ + git \ + curl \ + libpng-dev \ + libonig-dev \ + libxml2-dev \ + libicu-dev \ + zip \ + unzip \ + nginx \ + supervisor + +# Clear cache +RUN apt-get clean && rm -rf /var/lib/apt/lists/* + +# Install PHP extensions +RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd intl + +# Install Redis extension +RUN pecl install redis && docker-php-ext-enable redis + +# Get latest Composer +COPY --from=composer:latest /usr/bin/composer /usr/bin/composer + +# Set working directory +WORKDIR /var/www + +# Copy existing application directory contents +COPY . /var/www + +# Install dependencies +RUN composer install --optimize-autoloader --no-dev + +# Create required directories and set permissions +RUN mkdir -p /var/www/storage/framework/sessions \ + /var/www/storage/framework/views \ + /var/www/storage/framework/cache \ + /var/www/storage/framework/testing \ + /var/www/storage/logs \ + /var/www/storage/app/public \ + /var/www/bootstrap/cache + +# Set ownership and permissions +RUN chown -R www-data:www-data /var/www +RUN chmod -R 775 /var/www/storage /var/www/bootstrap/cache + +# Copy nginx configuration +COPY docker/nginx/default.conf /etc/nginx/sites-available/default + +# Copy supervisor configuration +COPY docker/supervisor/supervisord.conf /etc/supervisor/conf.d/supervisord.conf + +# Expose port 80 +EXPOSE 80 + +# Start supervisor +CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"] diff --git a/HUONG_DAN_DOCKER.md b/HUONG_DAN_DOCKER.md new file mode 100644 index 0000000..e6f37e6 --- /dev/null +++ b/HUONG_DAN_DOCKER.md @@ -0,0 +1,163 @@ +# 🎡 HƯỚNG DẪN SỬ DỤNG DOCKER - DỰ ÁN LUCKY WHEEL + +## 🚀 Khởi động dự án lần đầu + +```bash +./docker-setup.sh +``` + +## 🌐 Truy cập ứng dụng + +| Dịch vụ | URL | Thông tin đăng nhập | +|---------|-----|---------------------| +| **Ứng dụng Web** | http://localhost:8080 | - | +| **PHPMyAdmin** | http://localhost:8081 | User: `laravel`
Password: `laravel123` | +| **MySQL** | localhost:3307 | Database: `luckywheel`
User: `laravel`
Password: `laravel123` | +| **Redis** | localhost:6380 | - | + +## 📝 Các lệnh thường dùng + +### Quản lý containers +```bash +# Xem trạng thái containers +docker compose ps + +# Xem logs +docker compose logs -f + +# Dừng containers +docker compose down + +# Khởi động lại +docker compose restart + +# Dừng và xóa hoàn toàn (bao gồm dữ liệu) +docker compose down -v +``` + +### Làm việc với ứng dụng +```bash +# Vào container app +docker compose exec app bash + +# Chạy lệnh artisan +docker compose exec app php artisan migrate +docker compose exec app php artisan db:seed +docker compose exec app php artisan tinker + +# Clear cache +docker compose exec app php artisan cache:clear +docker compose exec app php artisan config:clear +docker compose exec app php artisan view:clear + +# Cài package mới +docker compose exec app composer require package-name +``` + +### Làm việc với database +```bash +# Truy cập MySQL CLI +docker compose exec db mysql -u laravel -plaravel123 luckywheel + +# Backup database +docker compose exec db mysqldump -u laravel -plaravel123 luckywheel > backup.sql + +# Import database +docker compose exec -T db mysql -u laravel -plaravel123 luckywheel < backup.sql + +# Reset database +docker compose exec app php artisan migrate:fresh --seed +``` + +## 🔧 Sửa lỗi thường gặp + +### Lỗi quyền truy cập (Permission denied) +```bash +docker compose exec app chmod -R 777 /var/www/storage /var/www/bootstrap/cache +``` + +### Lỗi không kết nối được MySQL +```bash +# Restart MySQL +docker compose restart db + +# Xem logs MySQL +docker compose logs db +``` + +### Port bị chiếm +Mở file `docker-compose.yml` và thay đổi port: +- `"8080:80"` → `"8081:80"` (cho app) +- `"3307:3306"` → `"3308:3306"` (cho MySQL) + +### Rebuild lại toàn bộ +```bash +docker compose down -v +docker compose build --no-cache +docker compose up -d +``` + +## 📂 Cấu trúc Docker + +``` +LuckyWheel/ +├── Dockerfile # Build image PHP/Laravel +├── docker-compose.yml # Cấu hình services +├── .env.docker # Environment cho Docker +├── docker-setup.sh # Script khởi động tự động +├── docker-stop.sh # Script dừng containers +└── docker/ + ├── nginx/ + │ └── default.conf # Cấu hình Nginx + ├── supervisor/ + │ └── supervisord.conf # Cấu hình Supervisor + └── mysql/ + └── my.cnf # Cấu hình MySQL +``` + +## 💾 Import/Export dữ liệu + +### Import file SQL có sẵn +```bash +docker compose exec -T db mysql -u laravel -plaravel123 luckywheel < your-file.sql +``` + +### Backup toàn bộ database +```bash +docker compose exec db mysqldump -u laravel -plaravel123 luckywheel > backup_$(date +%Y%m%d_%H%M%S).sql +``` + +## 🎯 Workflow phát triển + +1. **Sửa code**: Chỉnh sửa file PHP/Blade trực tiếp, thay đổi tự động reflect +2. **Chạy migration**: `docker compose exec app php artisan migrate` +3. **Test**: Truy cập http://localhost:8080 để xem kết quả +4. **Xem logs**: `docker compose logs -f app` +5. **Debug**: `docker compose exec app php artisan tinker` + +## 🛑 Dừng dự án + +```bash +# Dừng containers (giữ nguyên dữ liệu) +./docker-stop.sh + +# Hoặc +docker compose down + +# Dừng và XÓA toàn bộ dữ liệu +docker compose down -v +``` + +## ℹ️ Thông tin thêm + +- Source code được mount từ host → thay đổi code không cần rebuild +- Database được lưu trong Docker volume `dbdata` +- Redis data được lưu trong volume `redisdata` +- Logs nằm trong `/var/log/supervisor/` bên trong container + +## 🆘 Cần trợ giúp? + +Xem file [DOCKER_README.md](DOCKER_README.md) để có hướng dẫn chi tiết hơn. + +--- +**Chúc bạn code vui vẻ! 🎉** diff --git a/bootstrap/cache/.gitignore b/bootstrap/cache/.gitignore old mode 100644 new mode 100755 diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..0b37d7b --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,90 @@ +services: + # PHP & Nginx Application + app: + build: + context: . + dockerfile: Dockerfile + container_name: luckywheel_app + restart: unless-stopped + working_dir: /var/www + volumes: + - ./:/var/www + - ./docker/nginx/default.conf:/etc/nginx/sites-available/default + - ./docker/supervisor/supervisord.conf:/etc/supervisor/conf.d/supervisord.conf + ports: + - "8080:80" + networks: + - luckywheel + depends_on: + - db + - redis + environment: + - APP_ENV=local + - APP_DEBUG=true + - DB_HOST=db + - DB_PORT=3306 + - DB_DATABASE=luckywheel + - DB_USERNAME=laravel + - DB_PASSWORD=laravel123 + - REDIS_HOST=redis + - REDIS_PORT=6379 + + # MySQL Database + db: + image: mysql:8.0 + container_name: luckywheel_db + restart: unless-stopped + environment: + MYSQL_DATABASE: luckywheel + MYSQL_USER: laravel + MYSQL_PASSWORD: laravel123 + MYSQL_ROOT_PASSWORD: root123 + MYSQL_ALLOW_EMPTY_PASSWORD: 0 + volumes: + - dbdata:/var/lib/mysql + - ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf + ports: + - "3307:3306" + networks: + - luckywheel + command: --default-authentication-plugin=mysql_native_password + + # Redis + redis: + image: redis:7-alpine + container_name: luckywheel_redis + restart: unless-stopped + ports: + - "6380:6379" + networks: + - luckywheel + volumes: + - redisdata:/data + + # PHPMyAdmin (Optional - for database management) + phpmyadmin: + image: phpmyadmin/phpmyadmin + container_name: luckywheel_phpmyadmin + restart: unless-stopped + ports: + - "8081:80" + environment: + PMA_HOST: db + PMA_PORT: 3306 + PMA_USER: laravel + PMA_PASSWORD: laravel123 + UPLOAD_LIMIT: 100M + networks: + - luckywheel + depends_on: + - db + +networks: + luckywheel: + driver: bridge + +volumes: + dbdata: + driver: local + redisdata: + driver: local diff --git a/docker-setup.sh b/docker-setup.sh new file mode 100755 index 0000000..9e588bd --- /dev/null +++ b/docker-setup.sh @@ -0,0 +1,99 @@ +#!/bin/bash + +# Script khởi động Docker cho dự án Lucky Wheel +echo "🎡 Lucky Wheel - Docker Setup Script" +echo "====================================" + +# Kiểm tra Docker và Docker Compose +if ! command -v docker &> /dev/null; then + echo "❌ Docker chưa được cài đặt. Vui lòng cài đặt Docker trước." + exit 1 +fi + +if ! command -v docker compose &> /dev/null; then + echo "❌ Docker Compose chưa được cài đặt. Vui lòng cài đặt Docker Compose trước." + exit 1 +fi + +echo "✅ Docker và Docker Compose đã được cài đặt" + +# Sao chép file .env.docker thành .env +echo "" +echo "📋 Cấu hình file .env..." +if [ -f .env ]; then + echo "⚠️ File .env đã tồn tại. Tạo backup..." + cp .env .env.backup.$(date +%Y%m%d_%H%M%S) +fi +cp .env.docker .env +echo "✅ Đã sao chép .env.docker thành .env" + +# Dừng và xóa các container cũ (nếu có) +echo "" +echo "🛑 Dừng và xóa các container cũ..." +docker compose down -v + +# Build và khởi động containers +echo "" +echo "🔨 Building Docker images..." +docker compose build --no-cache + +echo "" +echo "🚀 Khởi động containers..." +docker compose up -d + +# Chờ MySQL khởi động hoàn toàn +echo "" +echo "⏳ Chờ MySQL khởi động (30 giây)..." +sleep 30 + +# Chạy migrations và seeders +echo "" +echo "📊 Chạy database migrations..." +docker compose exec app php artisan migrate --force + +echo "" +echo "🌱 Chạy database seeders..." +docker compose exec app php artisan db:seed --class=DanhSachGiaiThuongSeeder --force || true + +# Tạo symbolic link cho storage +echo "" +echo "🔗 Tạo symbolic link cho storage..." +docker compose exec app php artisan storage:link + +# Clear cache +echo "" +echo "🧹 Clear cache..." +docker compose exec app php artisan config:clear +docker compose exec app php artisan cache:clear +docker compose exec app php artisan view:clear +docker compose exec app php artisan route:clear + +# Optimize +echo "" +echo "⚡ Optimize application..." +docker compose exec app php artisan config:cache +docker compose exec app php artisan route:cache +docker compose exec app php artisan view:cache + +echo "" +echo "✅ Hoàn tất!" +echo "" +echo "📌 Thông tin dịch vụ:" +echo " - Ứng dụng Laravel: http://localhost:8080" +echo " - PHPMyAdmin: http://localhost:8081" +echo " - MySQL: localhost:3307" +echo " - Redis: localhost:6380" +echo "" +echo "📝 Thông tin đăng nhập MySQL:" +echo " - Database: luckywheel" +echo " - Username: laravel" +echo " - Password: laravel123" +echo " - Root Password: root123" +echo "" +echo "🔧 Các lệnh hữu ích:" +echo " - Xem logs: docker compose logs -f" +echo " - Xem logs app: docker compose logs -f app" +echo " - Vào container app: docker compose exec app bash" +echo " - Dừng services: docker compose down" +echo " - Khởi động lại: docker compose restart" +echo "" diff --git a/docker-stop.sh b/docker-stop.sh new file mode 100755 index 0000000..def96f5 --- /dev/null +++ b/docker-stop.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +# Script dừng Docker cho dự án Lucky Wheel +echo "🛑 Dừng Lucky Wheel Docker Containers..." + +docker compose down + +echo "✅ Đã dừng tất cả containers" +echo "" +echo "💡 Để khởi động lại, chạy: ./docker-setup.sh" +echo "💡 Để xóa tất cả dữ liệu (bao gồm database), chạy: docker compose down -v" diff --git a/docker/mysql/my.cnf b/docker/mysql/my.cnf new file mode 100644 index 0000000..8add9dd --- /dev/null +++ b/docker/mysql/my.cnf @@ -0,0 +1,13 @@ +[mysqld] +character-set-server=utf8mb4 +collation-server=utf8mb4_unicode_ci +default-authentication-plugin=mysql_native_password + +max_allowed_packet=100M +innodb_buffer_pool_size=256M + +[client] +default-character-set=utf8mb4 + +[mysql] +default-character-set=utf8mb4 diff --git a/docker/nginx/default.conf b/docker/nginx/default.conf new file mode 100644 index 0000000..21418fa --- /dev/null +++ b/docker/nginx/default.conf @@ -0,0 +1,45 @@ +server { + listen 80; + server_name localhost; + root /var/www/public; + + index index.php index.html index.htm; + + charset utf-8; + + # Increase upload size + client_max_body_size 100M; + + location / { + try_files $uri $uri/ /index.php?$query_string; + } + + location = /favicon.ico { access_log off; log_not_found off; } + location = /robots.txt { access_log off; log_not_found off; } + + error_page 404 /index.php; + + location ~ \.php$ { + fastcgi_pass 127.0.0.1:9000; + fastcgi_index index.php; + fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; + include fastcgi_params; + fastcgi_read_timeout 300; + } + + location ~ /\.(?!well-known).* { + deny all; + } + + # Disable access to hidden files + location ~ /\. { + deny all; + access_log off; + log_not_found off; + } + + # Security headers + add_header X-Frame-Options "SAMEORIGIN"; + add_header X-Content-Type-Options "nosniff"; + add_header X-XSS-Protection "1; mode=block"; +} diff --git a/docker/supervisor/supervisord.conf b/docker/supervisor/supervisord.conf new file mode 100644 index 0000000..941abba --- /dev/null +++ b/docker/supervisor/supervisord.conf @@ -0,0 +1,19 @@ +[supervisord] +nodaemon=true +user=root +logfile=/var/log/supervisor/supervisord.log +pidfile=/var/run/supervisord.pid + +[program:php-fpm] +command=/usr/local/sbin/php-fpm -F +autostart=true +autorestart=true +stdout_logfile=/var/log/supervisor/php-fpm.log +stderr_logfile=/var/log/supervisor/php-fpm-error.log + +[program:nginx] +command=/usr/sbin/nginx -g "daemon off;" +autostart=true +autorestart=true +stdout_logfile=/var/log/supervisor/nginx.log +stderr_logfile=/var/log/supervisor/nginx-error.log diff --git a/public/storage b/public/storage index dad100b..69db7b0 120000 --- a/public/storage +++ b/public/storage @@ -1 +1 @@ -/home/x79/LuckyWheel/storage/app/public \ No newline at end of file +/var/www/storage/app/public \ No newline at end of file diff --git a/storage/app/.gitignore b/storage/app/.gitignore old mode 100644 new mode 100755 diff --git a/storage/app/public/.gitignore b/storage/app/public/.gitignore old mode 100644 new mode 100755 diff --git a/storage/framework/.gitignore b/storage/framework/.gitignore old mode 100644 new mode 100755 diff --git a/storage/framework/cache/.gitignore b/storage/framework/cache/.gitignore old mode 100644 new mode 100755 diff --git a/storage/framework/cache/data/.gitignore b/storage/framework/cache/data/.gitignore old mode 100644 new mode 100755 diff --git a/storage/framework/sessions/.gitignore b/storage/framework/sessions/.gitignore old mode 100644 new mode 100755 diff --git a/storage/framework/testing/.gitignore b/storage/framework/testing/.gitignore old mode 100644 new mode 100755 diff --git a/storage/framework/views/.gitignore b/storage/framework/views/.gitignore old mode 100644 new mode 100755 diff --git a/storage/logs/.gitignore b/storage/logs/.gitignore old mode 100644 new mode 100755