From c33193d5f02c077850e89f234c893be7dbdda628 Mon Sep 17 00:00:00 2001 From: arifal Date: Tue, 24 Jun 2025 15:09:21 +0700 Subject: [PATCH] add docker --- .env.local.backup | 76 ----------------------- Dockerfile | 45 ++++++++++++++ README-Docker-Usage.md | 109 +++++++++++++++++++++++++++++++++ docker-compose.local.yml | 84 +++++++++++++++++++++++++ docker-compose.yml | 129 +++++++++++++++++---------------------- 5 files changed, 294 insertions(+), 149 deletions(-) delete mode 100644 .env.local.backup create mode 100644 README-Docker-Usage.md create mode 100644 docker-compose.local.yml diff --git a/.env.local.backup b/.env.local.backup deleted file mode 100644 index 9527dc3..0000000 --- a/.env.local.backup +++ /dev/null @@ -1,76 +0,0 @@ -APP_NAME=SIBEDAS-PBG -APP_ENV=local -APP_KEY=base64:xqCpwixWKqgu1Ca22gFizoOt44p7h+cgTOKuhS/P0Jw= -APP_DEBUG=true -APP_TIMEZONE=Asia/Jakarta -APP_URL=http://localhost:8000 - -API_URL=http://localhost:8000 - -APP_LOCALE=en -APP_FALLBACK_LOCALE=en -APP_FAKER_LOCALE=en_US - -APP_MAINTENANCE_DRIVER=file -# APP_MAINTENANCE_STORE=database - -PHP_CLI_SERVER_WORKERS=4 - -BCRYPT_ROUNDS=12 - -LOG_CHANNEL=stack -LOG_STACK=single -LOG_DEPRECATIONS_CHANNEL=null -LOG_LEVEL=debug - -DB_CONNECTION=mariadb -DB_HOST=db -DB_PORT=3306 -DB_DATABASE=sibedas_db -DB_USERNAME=root -DB_PASSWORD=root - -SESSION_DRIVER=database -SESSION_LIFETIME=120 -SESSION_ENCRYPT=false -SESSION_PATH=/ -SESSION_DOMAIN=null - -BROADCAST_CONNECTION=log -FILESYSTEM_DISK=local -QUEUE_CONNECTION=database - -CACHE_STORE=database -CACHE_PREFIX= - -MEMCACHED_HOST=127.0.0.1 - -REDIS_CLIENT=phpredis -REDIS_HOST=127.0.0.1 -REDIS_PASSWORD=null -REDIS_PORT=6379 - -MAIL_MAILER=log -MAIL_HOST=127.0.0.1 -MAIL_PORT=2525 -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 - -VITE_APP_NAME="${APP_NAME}" - -SIMBG_HOST="https://simbg.pu.go.id/" -SIMBG_EMAIL="dputr@bandungkab.go.id" -SIMBG_PASSWORD="Simbg123" - -API_KEY_GOOGLE="AIzaSyBxfEShFkKmykkc7RJR3lVzkQ_xGHK3qr0" -SPREAD_SHEET_ID="1QoXzuLdEX3MK70Yrfigz0Qj5rAt4T819jX85vubBNdY" -OPENAI_API_KEY="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" \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 5fa5f3d..afe11ba 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,6 +9,51 @@ COPY . . EXPOSE 5173 CMD ["npm", "run", "dev", "--", "--host", "0.0.0.0"] +# Local development stage for PHP +FROM php:8.2-fpm AS local +WORKDIR /var/www + +# Install PHP extensions +RUN apt-get update && apt-get install -y \ + git curl zip unzip libpng-dev libonig-dev libxml2-dev libzip-dev \ + && docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd zip + +# Install Node.js +RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash - \ + && apt-get install -y nodejs + +# Install Composer +COPY --from=composer:latest /usr/bin/composer /usr/bin/composer + +# Create www-data user with same UID/GID as host user (1000:1000 is common for first user) +RUN usermod -u 1000 www-data && groupmod -g 1000 www-data + +# Copy application files +COPY . . + +# Install dependencies +RUN composer install + +# Create storage directories and set proper permissions +RUN mkdir -p storage/framework/{sessions,views,cache} \ + && mkdir -p storage/logs \ + && mkdir -p bootstrap/cache \ + && chown -R www-data:www-data /var/www \ + && chmod -R 775 /var/www/storage \ + && chmod -R 775 /var/www/bootstrap/cache + +# Create entrypoint script to fix permissions on startup +RUN echo '#!/bin/bash\n\ +chown -R www-data:www-data /var/www/storage /var/www/bootstrap/cache\n\ +chmod -R 775 /var/www/storage /var/www/bootstrap/cache\n\ +exec "$@"' > /entrypoint.sh && chmod +x /entrypoint.sh + +USER www-data + +EXPOSE 9000 +ENTRYPOINT ["/entrypoint.sh"] +CMD ["php-fpm"] + # Production stage FROM php:8.2-fpm AS production WORKDIR /var/www diff --git a/README-Docker-Usage.md b/README-Docker-Usage.md new file mode 100644 index 0000000..236fe02 --- /dev/null +++ b/README-Docker-Usage.md @@ -0,0 +1,109 @@ +# Docker Usage Guide + +Proyek ini memiliki dua konfigurasi Docker untuk keperluan yang berbeda: + +## 📁 File Konfigurasi + +### 1. `docker-compose.yml` - Production/Staging + +- **Target**: `production` (optimized build) +- **Environment**: Production settings +- **Debug**: Disabled +- **Asset handling**: Built dan optimized +- **Use case**: Deploy ke server production/staging + +### 2. `docker-compose.local.yml` - Local Development + +- **Target**: `local` (development build) +- **Environment**: Local development settings +- **Debug**: Enabled +- **Asset handling**: Vite dev server terpisah +- **Use case**: Development di local machine + +## 🚀 Cara Penggunaan + +### Local Development (Recommended) + +```bash +# Setup awal (otomatis) +./setup-local.sh + +# Atau manual +docker-compose -f docker-compose.local.yml up -d --build +``` + +### Production/Staging + +```bash +# Dengan environment variables +docker-compose up -d --build + +# Atau dengan custom .env +APP_ENV=production APP_DEBUG=false docker-compose up -d --build +``` + +## 🔧 Perbedaan Utama + +| Aspek | Local Development | Production | +| ---------------- | -------------------------- | --------------------- | +| **File** | `docker-compose.local.yml` | `docker-compose.yml` | +| **Target** | `local` | `production` | +| **Debug** | Enabled | Disabled | +| **Assets** | Vite dev server | Pre-built & optimized | +| **Permissions** | User mapping | Standard www-data | +| **Hot Reload** | ✅ Available | ❌ Not needed | +| **Node Modules** | Kept for dev | Removed after build | + +## 📋 Command Cheat Sheet + +### Local Development + +```bash +# Start +docker-compose -f docker-compose.local.yml up -d + +# Stop +docker-compose -f docker-compose.local.yml down + +# Logs +docker-compose -f docker-compose.local.yml logs -f app + +# Execute commands +docker-compose -f docker-compose.local.yml exec app php artisan [command] +``` + +### Production + +```bash +# Start +docker-compose up -d + +# Stop +docker-compose down + +# Logs +docker-compose logs -f app + +# Execute commands +docker-compose exec app php artisan [command] +``` + +## 🛠 Development Workflow + +1. **Daily development**: Gunakan `docker-compose.local.yml` +2. **Testing production build**: Gunakan `docker-compose.yml` +3. **Deploy**: Gunakan `docker-compose.yml` di server + +## ❓ FAQ + +**Q: Apakah perlu kedua file?** +A: Ya, keduanya memiliki fungsi berbeda: + +- `docker-compose.local.yml` untuk development +- `docker-compose.yml` untuk production/staging + +**Q: File mana yang digunakan untuk development?** +A: Gunakan `docker-compose.local.yml` dengan menjalankan `./setup-local.sh` + +**Q: Bagaimana cara switch antara development dan production?** +A: Gunakan flag `-f` untuk specify file yang ingin digunakan diff --git a/docker-compose.local.yml b/docker-compose.local.yml new file mode 100644 index 0000000..d92512b --- /dev/null +++ b/docker-compose.local.yml @@ -0,0 +1,84 @@ +services: + app: + build: + context: . + dockerfile: Dockerfile + target: local + container_name: sibedas_app_local + restart: unless-stopped + environment: + APP_ENV: local + APP_DEBUG: true + APP_URL: http://localhost:8000 + VITE_APP_URL: http://localhost:8000 + DB_CONNECTION: mariadb + DB_HOST: db + DB_PORT: 3306 + DB_DATABASE: sibedas + DB_USERNAME: root + DB_PASSWORD: root + volumes: + - .:/var/www + # Exclude node_modules to prevent conflicts + - /var/www/node_modules + depends_on: + - db + networks: + - sibedas_net + # Add user mapping for permission compatibility + user: "1000:1000" + + nginx: + image: nginx:alpine + container_name: sibedas_nginx_local + restart: unless-stopped + ports: + - "8000:80" + volumes: + - .:/var/www + - ./docker/nginx/conf.d/app.conf:/etc/nginx/conf.d/default.conf + depends_on: + - app + networks: + - sibedas_net + + db: + image: mariadb:10.6 + container_name: sibedas_db_local + restart: unless-stopped + environment: + MYSQL_ROOT_PASSWORD: root + MYSQL_DATABASE: sibedas + MYSQL_USER: root + MYSQL_PASSWORD: root + ports: + - "3306:3306" + volumes: + - dbdata_local:/var/lib/mysql + - ./sibedas.sql:/docker-entrypoint-initdb.d/sibedas.sql + networks: + - sibedas_net + + vite: + build: + context: . + dockerfile: Dockerfile + target: development + container_name: sibedas_vite_local + restart: unless-stopped + environment: + VITE_APP_URL: http://localhost:8000 + volumes: + - .:/var/www + - /var/www/node_modules + ports: + - "5173:5173" + networks: + - sibedas_net + +volumes: + dbdata_local: + +networks: + sibedas_net: + driver: bridge diff --git a/docker-compose.yml b/docker-compose.yml index 45e07e4..2d02000 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,80 +1,63 @@ services: - app: - build: - context: . - dockerfile: Dockerfile - target: production - container_name: sibedas_app - restart: unless-stopped - environment: - APP_ENV: local - APP_DEBUG: true - APP_URL: http://localhost - VITE_APP_URL: http://localhost - DB_CONNECTION: mariadb - DB_HOST: db - DB_PORT: 3306 - DB_DATABASE: sibedas_db - DB_USERNAME: root - DB_PASSWORD: root - volumes: - - .:/var/www - depends_on: - - db - networks: - - sibedas_net + app: + build: + context: . + dockerfile: Dockerfile + target: production + container_name: sibedas_app + restart: unless-stopped + environment: + APP_ENV: production + APP_DEBUG: false + APP_URL: ${APP_URL:-http://localhost:8000} + VITE_APP_URL: ${VITE_APP_URL:-http://localhost:8000} + DB_CONNECTION: mariadb + DB_HOST: db + DB_PORT: 3306 + DB_DATABASE: ${DB_DATABASE:-sibedas} + DB_USERNAME: ${DB_USERNAME:-root} + DB_PASSWORD: ${DB_PASSWORD:-root} + volumes: + - .:/var/www + depends_on: + - db + networks: + - sibedas_net - nginx: - image: nginx:alpine - container_name: sibedas_nginx - restart: unless-stopped - ports: - - "8000:80" - volumes: - - .:/var/www - - ./docker/nginx/conf.d/app.conf:/etc/nginx/conf.d/default.conf - depends_on: - - app - networks: - - sibedas_net + nginx: + image: nginx:alpine + container_name: sibedas_nginx + restart: unless-stopped + ports: + - "8000:80" + volumes: + - .:/var/www + - ./docker/nginx/conf.d/app.conf:/etc/nginx/conf.d/default.conf + depends_on: + - app + networks: + - sibedas_net - db: - image: mariadb:10.6 - container_name: sibedas_db - restart: unless-stopped - environment: - MYSQL_ROOT_PASSWORD: root - MYSQL_DATABASE: sibedas_db - MYSQL_USER: root - MYSQL_PASSWORD: root - ports: - - "3306:3306" - volumes: - - dbdata:/var/lib/mysql - - ./sibedas.sql:/docker-entrypoint-initdb.d/sibedas.sql - networks: - - sibedas_net - - vite: - build: - context: . - dockerfile: Dockerfile - target: development - container_name: sibedas_vite - restart: unless-stopped - environment: - VITE_APP_URL: http://localhost - volumes: - - .:/var/www - - /var/www/node_modules - ports: - - "5173:5173" - networks: - - sibedas_net + db: + image: mariadb:10.6 + container_name: sibedas_db + restart: unless-stopped + environment: + MYSQL_ROOT_PASSWORD: ${DB_PASSWORD:-root} + MYSQL_DATABASE: ${DB_DATABASE:-sibedas} + MYSQL_USER: ${DB_USERNAME:-root} + MYSQL_PASSWORD: ${DB_PASSWORD:-root} + ports: + - "3306:3306" + volumes: + - dbdata:/var/lib/mysql + - ./sibedas.sql:/docker-entrypoint-initdb.d/sibedas.sql + networks: + - sibedas_net volumes: - dbdata: + dbdata: networks: - sibedas_net: - driver: bridge + sibedas_net: + driver: bridge