diff --git a/.env.example b/.env.example deleted file mode 100644 index f644696..0000000 --- a/.env.example +++ /dev/null @@ -1,9 +0,0 @@ -# MySQL -MYSQL_ROOT_PASSWORD=change-me-root-password -MYSQL_DATABASE=webstack -MYSQL_USER=webstack -MYSQL_PASSWORD=change-me-user-password - -# RustFS (S3-compatible storage) -RUSTFS_ACCESS_KEY=change-me-access-key -RUSTFS_SECRET_KEY=change-me-secret-key diff --git a/.gitignore b/.gitignore index 57f3729..c6ef218 100644 --- a/.gitignore +++ b/.gitignore @@ -1,29 +1,2 @@ -# Environment & secrets -.env -.env.* -!.env.example +.idea -# Deploy scripts (per-project, may contain paths/secrets) -deploy-*.sh -!deploy.example.sh - -# Database & storage data (runtime/volume data) -data/* -!data/.gitkeep - -# Projects (should be separate repos) -projects/* -!projects/.gitkeep - -# Claude Code local settings -.claude/settings.local.json - -# OS files -.DS_Store -Thumbs.db - -# IDE -.idea/ -.vscode/ -*.swp -*.swo diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..74e56ed --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "projects/example"] + path = projects/example + url = https://github.com/hanafiah/example.git diff --git a/README-art.md b/README-art.md deleted file mode 100644 index f044650..0000000 --- a/README-art.md +++ /dev/null @@ -1,40 +0,0 @@ -# art — PHP Artisan Shortcut - -Run Laravel Artisan commands inside the Docker container for any project. - -## Usage - -```bash -./art [artisan arguments...] -``` - -## Examples - -```bash -# Run migrations -./art paynrent.com migrate - -# Rollback migrations -./art paynrent.com migrate:rollback - -# Fresh migrate with seed -./art paynrent.com migrate:fresh --seed - -# Open Tinker REPL -./art paynrent.com tinker - -# Clear cache -./art paynrent.com cache:clear - -# Run queue worker -./art paynrent.com queue:work - -# List all routes -./art paynrent.com route:list - -# Create a model with migration -./art paynrent.com make:model Post -m - -# Run tests -./art paynrent.com test -``` diff --git a/README.md b/README.md index aa1e6f3..4552a73 100644 --- a/README.md +++ b/README.md @@ -1,204 +1,75 @@ -# Docker Webstack - -Production-grade Docker Compose stack untuk hosting multiple PHP projects pada satu server. - -**Target host:** 24 CPU, 96GB RAM (AMD EPYC 7282) +Docker Web Stack +=============================== -## Arsitektur +This is general stack for the web development environment with preset Nginx, PHP, MariaDB & MongoDB -``` - ┌─────────────┐ - :80 │ Nginx │ - ───────────────►│ (Alpine) │ - └──────┬──────┘ - │ - ┌────────────┼────────────┐ - │ │ │ - ▼ ▼ ▼ - ┌──────────┐ ┌──────────┐ ┌──────────┐ - │ PHP 8.4 │ │ RustFS │ │Gotenberg │ - │ FPM │ │ (S3) │ │ (PDF) │ - │ :9000 │ │:9000/9001│ │ :3000 │ - └────┬─────┘ └──────────┘ └──────────┘ - │ - ┌─────┴─────┐ - │ │ - ▼ ▼ - ┌──────────┐ ┌──────────┐ - │ MySQL │ │ Redis │ - │ 8.4 │ │ (Alpine) │ - │ :3306 │ │ :6379 │ - └──────────┘ └──────────┘ -``` - -## Services +You can use this setup for multiple projects. -| Service | Image | Port(s) | Fungsi | -|------------|--------------------|-------------|-------------------------------| -| Nginx | `nginx:alpine` | 80 | Reverse proxy & static files | -| PHP 8.4 | Custom (FPM) | 9000 | PHP application server | -| MySQL | `mysql:8.4` | 3306 | Database utama | -| Redis | `redis:alpine` | 6379 | Cache & session store | -| RustFS | `rustfs/rustfs` | 9000, 9001 | S3-compatible object storage | -| Gotenberg | `gotenberg` | 3000 | HTML-to-PDF conversion | - -## Struktur Direktori +Put in your project under projects folder and set your nginx.conf there. +Structure +=== ``` -docker-webstack/ -├── docker-compose.yml -├── .env # Credentials (gitignored) -├── docker/ -│ ├── nginx/ -│ │ ├── nginx.conf # Config utama Nginx -│ │ └── conf.d/ -│ │ ├── optimization.conf # Gzip, buffers, caching -│ │ └── rustfs.conf # Proxy ke RustFS console & S3 API -│ ├── php/8.4/ -│ │ ├── Dockerfile # PHP extensions & Composer -│ │ ├── php.ini # OPcache, JIT, session via Redis -│ │ ├── www.conf # FPM pool (dynamic, max 200 workers) -│ │ └── zz-docker.conf # FPM daemon config -│ ├── mysql/ -│ │ └── my.cnf # InnoDB tuning untuk 96GB RAM -│ └── redis/ -│ └── redis.conf # 4GB maxmemory, AOF + RDB persistence -├── data/ # Volume data (gitignored) -│ ├── mysql/ -│ ├── redis/ -│ └── rustfs/ -└── projects/ # PHP projects (gitignored) - └── / - └── nginx.conf # Vhost auto-loaded oleh Nginx +Projects\YOUR_PROJECT_FOLDER\nginx.conf ``` -## Setup +Please see the example project on how to configure your nginx.conf file +[projects/example](https://github.com/hanafiah/docker-general/tree/master/projects/example) -### 1. Clone & Configure +## SubModule project +if you're using git for your projects. you can add that under projects folder using submodule command -```bash -git clone && cd docker-webstack ``` - -Buat `.env` dari contoh: - -```bash -cat > .env << 'EOF' -MYSQL_ROOT_PASSWORD= -MYSQL_DATABASE= -MYSQL_USER= -MYSQL_PASSWORD= - -RUSTFS_ACCESS_KEY= -RUSTFS_SECRET_KEY= -EOF +cd projects +git submodule add -f git@github.com:hanafiah/example.git ``` -### 2. Start Services - -```bash -docker compose up -d +Virtual host +=== +make sure to set virtual host on hosts file +## Mac/Linux ``` - -### 3. Tambah Project Baru - -Letakkan project PHP dalam `projects//`. Buat `nginx.conf` di root project tersebut — ia akan di-load secara automatik oleh Nginx. - -Contoh vhost (`projects/example.com/nginx.conf`): - -```nginx -server { - listen 80; - server_name example.com; - root /var/www/projects/example.com/public; - index index.php; - - location / { - try_files $uri $uri/ /index.php?$query_string; - } - - location ~ \.php$ { - fastcgi_pass php84:9000; - fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; - include fastcgi_params; - } -} +sudo vim /etc/hosts ``` - -Kemudian reload Nginx: - -```bash -docker compose exec nginx nginx -s reload +## windows +1. open notepad as administratio +2. open hosts file located at +``` +C:\Windows\System32\drivers\etc\hosts ``` -## Konfigurasi Utama - -### PHP 8.4 FPM - -- **OPcache** enabled dengan JIT tracing (256MB buffer) -- **Session** disimpan dalam Redis (`tcp://redis:6379`) -- **FPM Pool:** dynamic, 20 start / max 200 workers -- **Extensions:** pdo_mysql, redis, gd, intl, zip, bcmath, pcntl, sockets, exif, opcache -- **Upload limit:** 256MB - -### MySQL 8.4 - -- **InnoDB buffer pool:** 16GB (8 instances) -- **Log file:** 1GB -- **Max connections:** 500 -- **Slow query log:** enabled (> 2s) -- **Charset:** utf8mb4 - -### Redis - -- **Max memory:** 4GB (allkeys-lru eviction) -- **Persistence:** AOF (everysec) + RDB snapshots -- **IO threads:** 4 - -### Nginx - -- **Worker connections:** 8,192 -- **Gzip:** level 6, min 256 bytes -- **FastCGI timeout:** 300s -- **Upload limit:** 256MB -- **Auto-vhost:** loads `projects/*/nginx.conf` - -### RustFS (S3-Compatible Storage) - -- **Console:** port 9001 (proxied via `rustfs.okdii.com`) -- **S3 API:** port 9000 (proxied via `/s3/` path) +add the following +``` +127.0.0.1 www.example.local +``` -## Resource Limits +once saved, you should be able to access site from -| Service | CPU Limit | Memory Limit | CPU Reserved | Memory Reserved | -|-----------|-----------|--------------|--------------|-----------------| -| Nginx | 4 | 2GB | 1 | 256MB | -| PHP 8.4 | 8 | 16GB | 2 | 1GB | -| MySQL | 8 | 24GB | 2 | 4GB | -| Redis | 4 | 6GB | 1 | 512MB | -| RustFS | 2 | 4GB | 0.5 | 256MB | -| Gotenberg | 2 | 2GB | 0.5 | 256MB | -| **Total** | **28** | **54GB** | **7** | **6.25GB** | +http://www.example.local -## Commands +Load Example +=== +run the following command +``` +git submodule update --init +``` -```bash -# Start semua services -docker compose up -d +To Start Docker +=== +run the following command inside your docker-general directory +``` +docker-compose up -d +``` -# Stop semua -docker compose down +To stop +``` +docker-compose stop +``` -# Rebuild PHP image (selepas edit Dockerfile) -docker compose build php84 && docker compose up -d php84 +![Alt text](/screen1.png) -# Logs -docker compose logs -f -# Masuk container -docker compose exec php84 bash -docker compose exec mysql mysql -u root -p -# Reload Nginx config -docker compose exec nginx nginx -s reload -``` +Using php composer +=== +https://github.com/hanafiah/docker-webstack/wiki/How-to-use-composer diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..c741881 --- /dev/null +++ b/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-slate \ No newline at end of file diff --git a/art b/art deleted file mode 100755 index 07e0ab7..0000000 --- a/art +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -# Usage: ./art [artisan arguments...] -# Example: ./art paynrent.com migrate -# ./art paynrent.com tinker - -PROJECT="$1" -shift - -if [ -z "$PROJECT" ]; then - echo "Usage: ./art [artisan arguments...]" - echo "Example: ./art paynrent.com migrate" - exit 1 -fi - -docker exec -it webstack-php84 php /var/www/projects/"$PROJECT"/artisan "$@" diff --git a/data/.gitkeep b/data/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/db/.gitignore b/db/.gitignore new file mode 100644 index 0000000..f8f989e --- /dev/null +++ b/db/.gitignore @@ -0,0 +1,3 @@ +#empty dir +* +!.gitignore diff --git a/deploy.example.sh b/deploy.example.sh deleted file mode 100755 index ca7a528..0000000 --- a/deploy.example.sh +++ /dev/null @@ -1,88 +0,0 @@ -#!/bin/bash -set -e - -# ==================================== -# Example deploy script for a Laravel app -# Copy this file (e.g. deploy-myapp.sh) and adjust the variables below. -# -# Expected layout (single-folder Laravel): -# projects/myapp.com/ -# -# Or split frontend/backend layout: -# projects/myapp.com/ -# ├── backend/ (Laravel) -# └── frontend/ (SPA / Vite) -# Set FRONTEND_DIR to "" if you don't have a separate frontend folder. -# ==================================== - -APP_NAME="myapp.com" - -APP_DIR="/root/docker-webstack/projects/${APP_NAME}" -BACKEND_DIR="${APP_DIR}" # or: "${APP_DIR}/backend" -FRONTEND_DIR="" # or: "${APP_DIR}/frontend" - -PHP_CONTAINER="webstack-php84" -WORK_DIR="/var/www/projects/${APP_NAME}" -BACKEND_WORK_DIR="${WORK_DIR}" # or: "${WORK_DIR}/backend" - -# Set to "true" if the app uses stancl/tenancy (or similar) tenant migrations. -RUN_TENANT_MIGRATIONS="false" - -GREEN='\033[0;32m' -RED='\033[0;31m' -YELLOW='\033[1;33m' -NC='\033[0m' - -log() { echo -e "${GREEN}[DEPLOY]${NC} $1"; } -warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } -fail() { echo -e "${RED}[ERROR]${NC} $1"; exit 1; } - -# Check php container is running -docker ps --format '{{.Names}}' | grep -q "^${PHP_CONTAINER}$" || fail "Container ${PHP_CONTAINER} is not running" - -log "Putting application in maintenance mode..." -docker exec ${PHP_CONTAINER} php ${BACKEND_WORK_DIR}/artisan down --retry=60 || warn "Already in maintenance mode or artisan down failed" - -# 1. Git pull -log "Pulling latest changes..." -cd "${APP_DIR}" -git pull || fail "Git pull failed" - -# 2. Composer install (backend) -log "Running composer install..." -docker exec ${PHP_CONTAINER} composer install --no-dev --no-interaction --prefer-dist --optimize-autoloader -d ${BACKEND_WORK_DIR} - -# 3. NPM build -if [ -n "${FRONTEND_DIR}" ] && [ -d "${FRONTEND_DIR}" ]; then - log "Running npm install & build (frontend)..." - cd "${FRONTEND_DIR}" - npm ci --no-audit --no-fund - npm run build -elif [ -f "${BACKEND_DIR}/package.json" ]; then - log "Running npm install & build..." - cd "${BACKEND_DIR}" - npm ci --no-audit --no-fund - npm run build -else - warn "No package.json found, skipping npm build" -fi - -# 4. Database migration -log "Running database migrations..." -docker exec ${PHP_CONTAINER} php ${BACKEND_WORK_DIR}/artisan migrate --force - -# 5. Tenant migrations (optional) -if [ "${RUN_TENANT_MIGRATIONS}" = "true" ]; then - log "Running tenant migrations..." - docker exec ${PHP_CONTAINER} php ${BACKEND_WORK_DIR}/artisan tenants:migrate --force || warn "tenants:migrate failed or not applicable" -fi - -# 6. Optimize (cache config, routes, views) -log "Optimizing application..." -docker exec ${PHP_CONTAINER} php ${BACKEND_WORK_DIR}/artisan optimize - -# 7. Bring app back up -log "Bringing application back online..." -docker exec ${PHP_CONTAINER} php ${BACKEND_WORK_DIR}/artisan up - -log "Deploy completed successfully!" diff --git a/docker-compose.yml b/docker-compose.yml index 5f5efec..8d2a4a1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,230 +1,56 @@ +version: '3.7' services: - nginx: - image: nginx:alpine - container_name: webstack-nginx - ports: - - "80:80" - volumes: - - ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf:ro - - ./docker/nginx/conf.d:/etc/nginx/conf.d:ro - - ./docker/nginx/.htpasswd:/etc/nginx/.htpasswd:ro - - ./projects:/var/www/projects:ro - depends_on: - - php84 - networks: - - webstack - restart: unless-stopped - deploy: - resources: - limits: - cpus: "4" - memory: 2G - reservations: - cpus: "1" - memory: 256M - - php84: - build: - context: ./docker/php/8.4 - dockerfile: Dockerfile - container_name: webstack-php84 - volumes: - - ./projects:/var/www/projects - - ./docker/php/8.4/php.ini:/usr/local/etc/php/php.ini:ro - - ./docker/php/8.4/www.conf:/usr/local/etc/php-fpm.d/www.conf:ro - - ./docker/php/8.4/zz-docker.conf:/usr/local/etc/php-fpm.d/zz-docker.conf:ro - networks: - - webstack - restart: unless-stopped - deploy: - resources: - limits: - cpus: "8" - memory: 16G - reservations: - cpus: "2" - memory: 1G - - mysql: - image: mysql:8.4 - container_name: webstack-mysql - ports: - - "127.0.0.1:3306:3306" - volumes: - - ./data/mysql:/var/lib/mysql - - ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf:ro - environment: - MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} - MYSQL_DATABASE: ${MYSQL_DATABASE} - MYSQL_USER: ${MYSQL_USER} - MYSQL_PASSWORD: ${MYSQL_PASSWORD} - networks: - - webstack - restart: unless-stopped - deploy: - resources: - limits: - cpus: "8" - memory: 24G - reservations: - cpus: "2" - memory: 4G - - redis: - image: redis:alpine - container_name: webstack-redis - volumes: - - ./data/redis:/data - - ./docker/redis/redis.conf:/usr/local/etc/redis/redis.conf:ro - command: redis-server /usr/local/etc/redis/redis.conf - networks: - - webstack - restart: unless-stopped - deploy: - resources: - limits: - cpus: "4" - memory: 6G - reservations: - cpus: "1" - memory: 512M - - rustfs: - image: rustfs/rustfs - container_name: webstack-rustfs - volumes: - - ./data/rustfs:/data - environment: - RUSTFS_ACCESS_KEY: ${RUSTFS_ACCESS_KEY} - RUSTFS_SECRET_KEY: ${RUSTFS_SECRET_KEY} - command: server /data --console-address ":9001" - networks: - - webstack - restart: unless-stopped - deploy: - resources: - limits: - cpus: "2" - memory: 4G - reservations: - cpus: "0.5" - memory: 256M - - pamilio-scheduler: - build: - context: ./docker/php/8.4 - dockerfile: Dockerfile - container_name: pamilio-scheduler - volumes: - - ./projects:/var/www/projects - - ./docker/php/8.4/php.ini:/usr/local/etc/php/php.ini:ro - working_dir: /var/www/projects/pamilio.com - command: ["php", "artisan", "schedule:work"] - depends_on: - - mysql - - redis - networks: - - webstack - restart: unless-stopped - deploy: - resources: - limits: - cpus: "1" - memory: 512M - reservations: - cpus: "0.25" - memory: 64M - - pamilio-worker: - build: - context: ./docker/php/8.4 - dockerfile: Dockerfile - container_name: pamilio-worker - volumes: - - ./projects:/var/www/projects - - ./docker/php/8.4/php.ini:/usr/local/etc/php/php.ini:ro - working_dir: /var/www/projects/pamilio.com - command: ["php", "artisan", "queue:work", "redis", "--sleep=3", "--tries=3", "--max-time=3600"] - depends_on: - - mysql - - redis - networks: - - webstack - restart: unless-stopped - deploy: - resources: - limits: - cpus: "2" - memory: 1G - reservations: - cpus: "0.25" - memory: 128M - - paynrent-scheduler: - build: - context: ./docker/php/8.4 - dockerfile: Dockerfile - container_name: paynrent-scheduler - volumes: - - ./projects:/var/www/projects - - ./docker/php/8.4/php.ini:/usr/local/etc/php/php.ini:ro - working_dir: /var/www/projects/paynrent.com/backend - command: ["php", "artisan", "schedule:work"] - depends_on: - - mysql - - redis - networks: - - webstack - restart: unless-stopped - deploy: - resources: - limits: - cpus: "1" - memory: 512M - reservations: - cpus: "0.25" - memory: 64M - - paynrent-worker: - build: - context: ./docker/php/8.4 - dockerfile: Dockerfile - container_name: paynrent-worker - volumes: - - ./projects:/var/www/projects - - ./docker/php/8.4/php.ini:/usr/local/etc/php/php.ini:ro - working_dir: /var/www/projects/paynrent.com/backend - command: ["php", "artisan", "queue:work", "redis", "--sleep=3", "--tries=3", "--max-time=3600"] - depends_on: - - mysql - - redis - networks: - - webstack - restart: unless-stopped - deploy: - resources: - limits: - cpus: "2" - memory: 1G - reservations: - cpus: "0.25" - memory: 128M - - gotenberg: - image: gotenberg/gotenberg - container_name: webstack-gotenberg - networks: - - webstack - restart: unless-stopped - deploy: - resources: - limits: - cpus: "2" - memory: 2G - reservations: - cpus: "0.5" - memory: 256M - + mariadb: + image: mariadb + container_name: "mariadb" + ports: + # only allow port 3306 access from localhost only + - "127.0.0.1:3306:3306" + volumes: + - "./db/mariadb:/var/lib/mysql:rw" + - "./etc/mysql/:/etc/mysql/" + environment: + # ALLOW_EMPTY_PASSWORD is recommended only for development. + # - "MYSQL_ALLOW_EMPTY_PASSWORD=yes" + - "MYSQL_ROOT_PASSWORD=12345" + - "SET GLOBAL sql_mode =''" + networks: + - docker_webstack + nginx: + image: nginx:latest + container_name: "nginx" + ports: + - "80:80" + - "443:443" + restart: always + volumes: + - "./etc/nginx/default.conf:/etc/nginx/conf.d/default.conf" + - "./etc/ssl:/etc/ssl" + - "./projects/:/var/www/projects" + depends_on: + - php7 + - php5 + - mariadb + networks: + - docker_webstack + php7: + build: php-stack-7-fpm + container_name: "php7" + restart: always + volumes: + - "./etc/php/php.ini:/usr/local/etc/php/conf.d/php.ini" + - "./projects/:/var/www/projects" + networks: + - docker_webstack + php5: + build: php-stack-5.6.30-fpm + container_name: "php5" + restart: always + volumes: + - "./etc/php/php.ini:/usr/local/etc/php/conf.d/php.ini" + - "./projects/:/var/www/projects" + networks: + - docker_webstack networks: - webstack: - driver: bridge + docker_webstack: + driver: bridge diff --git a/docker/mysql/my.cnf b/docker/mysql/my.cnf deleted file mode 100644 index 86da7bf..0000000 --- a/docker/mysql/my.cnf +++ /dev/null @@ -1,49 +0,0 @@ -[mysqld] -# --- InnoDB --- -# Host: 24 CPU, 96GB RAM -innodb_buffer_pool_size = 16G -innodb_buffer_pool_instances = 8 -innodb_log_file_size = 1G -innodb_flush_log_at_trx_commit = 2 -innodb_flush_method = O_DIRECT -innodb_file_per_table = 1 -innodb_io_capacity = 4000 -innodb_io_capacity_max = 8000 -innodb_read_io_threads = 8 -innodb_write_io_threads = 8 -innodb_buffer_pool_dump_at_shutdown = 1 -innodb_buffer_pool_load_at_startup = 1 - -# --- Connections --- -max_connections = 500 -max_allowed_packet = 256M -wait_timeout = 600 -interactive_timeout = 600 -thread_cache_size = 64 - -# --- Buffers --- -key_buffer_size = 64M -sort_buffer_size = 8M -read_buffer_size = 4M -read_rnd_buffer_size = 8M -join_buffer_size = 8M -tmp_table_size = 256M -max_heap_table_size = 256M -table_open_cache = 8000 -table_definition_cache = 4000 - -# --- Logging --- -slow_query_log = 1 -slow_query_log_file = /var/log/mysql/slow.log -long_query_time = 2 - -# --- Character Set --- -character-set-server = utf8mb4 -collation-server = utf8mb4_unicode_ci - -# --- General --- -skip-name-resolve -authentication_policy = caching_sha2_password - -[client] -default-character-set = utf8mb4 diff --git a/docker/nginx/.htpasswd b/docker/nginx/.htpasswd deleted file mode 100644 index 9a469d7..0000000 --- a/docker/nginx/.htpasswd +++ /dev/null @@ -1 +0,0 @@ -okdii:$apr1$vUr/ZKsG$Zc5c2f/pRsTlL81gb5gvV0 diff --git a/docker/nginx/conf.d/optimization.conf b/docker/nginx/conf.d/optimization.conf deleted file mode 100644 index 9a3a781..0000000 --- a/docker/nginx/conf.d/optimization.conf +++ /dev/null @@ -1,46 +0,0 @@ -# --- Performance --- -sendfile on; -tcp_nopush on; -tcp_nodelay on; -keepalive_timeout 65; -keepalive_requests 1000; -types_hash_max_size 2048; -server_tokens off; - -# --- Buffer Sizes --- -client_max_body_size 256M; -client_body_buffer_size 256k; -large_client_header_buffers 4 32k; - -# --- FastCGI Buffers --- -fastcgi_buffers 32 32k; -fastcgi_buffer_size 64k; -fastcgi_connect_timeout 300; -fastcgi_send_timeout 300; -fastcgi_read_timeout 300; - -# --- Gzip Compression --- -gzip on; -gzip_vary on; -gzip_proxied any; -gzip_comp_level 6; -gzip_min_length 256; -gzip_types - text/plain - text/css - text/xml - text/javascript - application/json - application/javascript - application/x-javascript - application/xml - application/xml+rss - application/vnd.ms-fontobject - font/opentype - image/svg+xml; - -# --- Open File Cache --- -open_file_cache max=50000 inactive=60s; -open_file_cache_valid 120s; -open_file_cache_min_uses 2; -open_file_cache_errors on; diff --git a/docker/nginx/conf.d/rustfs.conf b/docker/nginx/conf.d/rustfs.conf deleted file mode 100644 index 591f742..0000000 --- a/docker/nginx/conf.d/rustfs.conf +++ /dev/null @@ -1,31 +0,0 @@ -server { - listen 80; - server_name rustfs.okdii.com; - - resolver 127.0.0.11 valid=30s; - - # RustFS Console (WebUI) - location / { - set $rustfs_console http://rustfs:9001; - proxy_pass $rustfs_console; - 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 https; - - # WebSocket support (untuk console live updates) - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - } - - # S3 API - location /s3/ { - set $rustfs_api http://rustfs:9000; - rewrite ^/s3/(.*)$ /$1 break; - proxy_pass $rustfs_api; - proxy_set_header Host $host; - proxy_http_version 1.1; - client_max_body_size 256M; - } -} diff --git a/docker/nginx/conf.d/status.conf b/docker/nginx/conf.d/status.conf deleted file mode 100644 index a66ec86..0000000 --- a/docker/nginx/conf.d/status.conf +++ /dev/null @@ -1,22 +0,0 @@ -server { - listen 80; - server_name 127.0.0.1; - - # Nginx stub_status for Netdata - location /nginx_status { - stub_status on; - allow 172.16.0.0/12; # Docker network - allow 127.0.0.1; - deny all; - } - - # PHP-FPM status for Netdata - location /fpm_status { - fastcgi_pass php84:9000; - fastcgi_param SCRIPT_FILENAME $fastcgi_script_name; - include fastcgi_params; - allow 172.16.0.0/12; - allow 127.0.0.1; - deny all; - } -} diff --git a/docker/nginx/nginx.conf b/docker/nginx/nginx.conf deleted file mode 100644 index 3bfd7ea..0000000 --- a/docker/nginx/nginx.conf +++ /dev/null @@ -1,29 +0,0 @@ -user nginx; -worker_processes auto; -worker_rlimit_nofile 65535; -worker_cpu_affinity auto; -error_log /var/log/nginx/error.log warn; -pid /var/run/nginx.pid; - -events { - worker_connections 8192; - multi_accept on; - use epoll; -} - -http { - include /etc/nginx/mime.types; - default_type application/octet-stream; - - log_format main '$remote_addr - $remote_user [$time_local] "$request" ' - '$status $body_bytes_sent "$http_referer" ' - '"$http_user_agent" "$http_x_forwarded_for"'; - - access_log /var/log/nginx/access.log main; - - # Load optimization config - include /etc/nginx/conf.d/*.conf; - - # Load per-project vhost configs - include /var/www/projects/*/nginx.conf; -} diff --git a/docker/php/8.4/Dockerfile b/docker/php/8.4/Dockerfile deleted file mode 100644 index c6166b1..0000000 --- a/docker/php/8.4/Dockerfile +++ /dev/null @@ -1,48 +0,0 @@ -FROM php:8.4-fpm - -# System dependencies -RUN apt-get update && apt-get install -y --no-install-recommends \ - git \ - unzip \ - curl \ - libpng-dev \ - libjpeg62-turbo-dev \ - libfreetype6-dev \ - libzip-dev \ - libicu-dev \ - libxml2-dev \ - libonig-dev \ - libcurl4-openssl-dev \ - libssl-dev \ - && rm -rf /var/lib/apt/lists/* - -# Configure and install PHP extensions -RUN docker-php-ext-configure gd --with-freetype --with-jpeg \ - && docker-php-ext-install -j$(nproc) \ - pdo_mysql \ - mbstring \ - xml \ - bcmath \ - curl \ - zip \ - gd \ - intl \ - opcache \ - exif \ - pcntl \ - sockets - -# Install Redis extension via PECL -RUN pecl install redis && docker-php-ext-enable redis - -# Install Composer -COPY --from=composer:latest /usr/bin/composer /usr/bin/composer - -# Set working directory -WORKDIR /var/www/projects - -# Use default user www-data -USER www-data - -EXPOSE 9000 -CMD ["php-fpm"] diff --git a/docker/php/8.4/php.ini b/docker/php/8.4/php.ini deleted file mode 100644 index 5b1bce2..0000000 --- a/docker/php/8.4/php.ini +++ /dev/null @@ -1,42 +0,0 @@ -[PHP] -; --- General --- -; Host: 24 CPU, 96GB RAM, AMD EPYC 7282 -expose_php = Off -memory_limit = 1G -max_execution_time = 300 -max_input_time = 300 -max_input_vars = 10000 -upload_max_filesize = 256M -post_max_size = 256M -default_charset = "UTF-8" - -; --- Error Handling --- -error_reporting = E_ALL -display_errors = On -display_startup_errors = On -log_errors = On -error_log = /var/log/php/error.log - -; --- OPcache --- -opcache.enable = 1 -opcache.memory_consumption = 512 -opcache.interned_strings_buffer = 64 -opcache.max_accelerated_files = 50000 -opcache.validate_timestamps = 1 -opcache.revalidate_freq = 2 -opcache.save_comments = 1 -opcache.jit = tracing -opcache.jit_buffer_size = 256M -opcache.huge_code_pages = 1 - -; --- Realpath Cache --- -realpath_cache_size = 8192K -realpath_cache_ttl = 600 - -; --- Session --- -session.save_handler = redis -session.save_path = "tcp://redis:6379" -session.gc_maxlifetime = 1440 - -; --- Date --- -date.timezone = Asia/Kuala_Lumpur diff --git a/docker/php/8.4/www.conf b/docker/php/8.4/www.conf deleted file mode 100644 index bf7c825..0000000 --- a/docker/php/8.4/www.conf +++ /dev/null @@ -1,33 +0,0 @@ -[www] -user = www-data -group = www-data - -listen = 0.0.0.0:9000 - -; --- Process Manager --- -; Host: 24 CPU, 96GB RAM — boleh handle banyak workers -pm = dynamic -pm.max_children = 200 -pm.start_servers = 20 -pm.min_spare_servers = 10 -pm.max_spare_servers = 60 -pm.max_requests = 1000 -pm.process_idle_timeout = 10s - -; --- Timeouts --- -request_terminate_timeout = 300 - -; --- Logging --- -access.log = /proc/self/fd/2 -slowlog = /proc/self/fd/2 -request_slowlog_timeout = 5s - -; --- Status --- -pm.status_path = /fpm_status -pm.status_listen = 0.0.0.0:9001 - -; --- Security --- -security.limit_extensions = .php - -; --- Environment --- -clear_env = no diff --git a/docker/php/8.4/zz-docker.conf b/docker/php/8.4/zz-docker.conf deleted file mode 100644 index 363ab1f..0000000 --- a/docker/php/8.4/zz-docker.conf +++ /dev/null @@ -1,5 +0,0 @@ -[global] -daemonize = no - -[www] -listen = 0.0.0.0:9000 diff --git a/docker/redis/redis.conf b/docker/redis/redis.conf deleted file mode 100644 index 51d7032..0000000 --- a/docker/redis/redis.conf +++ /dev/null @@ -1,35 +0,0 @@ -# --- Memory --- -# Host: 96GB RAM — allocate 4GB for Redis -maxmemory 4gb -maxmemory-policy allkeys-lru - -# --- Persistence (AOF) --- -appendonly yes -appendfsync everysec -no-appendfsync-on-rewrite no -auto-aof-rewrite-percentage 100 -auto-aof-rewrite-min-size 64mb - -# --- Persistence (RDB) --- -save 900 1 -save 300 10 -save 60 10000 -rdbcompression yes - -# --- Network --- -bind 0.0.0.0 -protected-mode no -tcp-backlog 2048 -timeout 300 -tcp-keepalive 300 - -# --- Performance --- -io-threads 4 -io-threads-do-reads yes -lazyfree-lazy-eviction yes -lazyfree-lazy-expire yes -lazyfree-lazy-server-del yes - -# --- General --- -databases 16 -loglevel notice diff --git a/etc/mysql/my.cnf b/etc/mysql/my.cnf new file mode 100644 index 0000000..03c4c44 --- /dev/null +++ b/etc/mysql/my.cnf @@ -0,0 +1,2 @@ +[mysqld] +sql-mode="ALLOW_INVALID_DATES" \ No newline at end of file diff --git a/etc/nginx/default.conf b/etc/nginx/default.conf new file mode 100755 index 0000000..5896378 --- /dev/null +++ b/etc/nginx/default.conf @@ -0,0 +1,9 @@ +# auto load nginx conf for each projects +include /var/www/projects/*/nginx.conf; + +# DO NOT PUT YOUR NGINX CONFIG HERE +# PLEASE PUT nginx.conf UNDER YOUR PROJECT'S FILE +# +# example +# projects/your_project_folder/nginx.conf +# diff --git a/etc/php/php.ini b/etc/php/php.ini new file mode 100755 index 0000000..dbb22bb --- /dev/null +++ b/etc/php/php.ini @@ -0,0 +1,5 @@ +memory_limit=2048M +upload_max_filesize=200M +post_max_size=200M +max_execution_time = 300 +request_terminate_timeout = 300 \ No newline at end of file diff --git a/php-stack-5.6.30-fpm/Dockerfile b/php-stack-5.6.30-fpm/Dockerfile new file mode 100644 index 0000000..6e035ee --- /dev/null +++ b/php-stack-5.6.30-fpm/Dockerfile @@ -0,0 +1,37 @@ +FROM php:5.6.30-fpm + +# RUN printf "deb http://archive.debian.org/debian/ jessie main\ndeb-src http://archive.debian.org/debian/ jessie main\ndeb http://security.debian.org jessie/updates main\ndeb-src http://security.debian.org jessie/updates main" > /etc/apt/sources.list +# RUN sed -i 's;http://archive.debian.org/debian/;http://deb.debian.org/debian/;' /etc/apt/sources.list + +# debian stretch moved to archive.debian.org on 2023-03-27 +RUN export DEBIAN_FRONTEND="noninteractive" && \ + echo "deb http://archive.debian.org/debian/ stretch main non-free contrib" > /etc/apt/sources.list && \ + echo "deb http://archive.debian.org/debian-security/ stretch/updates main non-free contrib" >> /etc/apt/sources.list && \ + apt-get update -o Acquire::AllowInsecureRepositories=true -o Acquire::AllowDowngradeToInsecureRepositories=true -o APT::Get::AllowUnauthenticated=true && \ + apt-get install -y --no-install-recommends -o APT::Get::AllowUnauthenticated=true debian-archive-keyring + + +RUN apt-get update && apt-get install --yes --force-yes \ + libssl-dev \ + libssl-doc \ + libsasl2-dev \ + libfreetype6-dev \ + libjpeg62-turbo-dev \ + libpq-dev \ + libmagickwand-dev \ + libmcrypt-dev \ + libpng12-dev \ + libmemcached-dev \ + zlib1g-dev \ + && docker-php-ext-install -j$(nproc) bz2 iconv mcrypt mbstring pdo_mysql mysql mysqli pgsql pdo_pgsql zip \ + && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \ + && docker-php-ext-install -j$(nproc) gd + +# Install xdebug +# RUN pecl install xdebug && docker-php-ext-enable xdebug + +# Install MongoDB Client +# RUN pecl install mongodb && docker-php-ext-enable mongodb + +# Install Redis Client +# RUN pecl install redis && docker-php-ext-enable redis diff --git a/php-stack-7-fpm/Dockerfile b/php-stack-7-fpm/Dockerfile new file mode 100644 index 0000000..a49b7f9 --- /dev/null +++ b/php-stack-7-fpm/Dockerfile @@ -0,0 +1,73 @@ +FROM php:7.4-fpm +MAINTAINER Muhamad Hanafiah Yahya + +RUN apt-get update && \ + apt-get install -y \ + freetds-bin \ + freetds-dev \ + freetds-common \ + libzip-dev \ + libpng-dev \ + libjpeg-dev \ + libfreetype6-dev \ + zip \ + && apt-get install -y locales \ + && echo "en_US.UTF-8 UTF-8" > /etc/locale.gen \ + && locale-gen + +RUN docker-php-ext-configure pdo_mysql --with-pdo-mysql=mysqlnd \ + && docker-php-ext-configure mysqli --with-mysqli=mysqlnd \ + && docker-php-ext-install pdo_mysql \ + && docker-php-ext-install mysqli + +RUN docker-php-ext-configure pdo_dblib --with-libdir=lib/x86_64-linux-gnu && \ + docker-php-ext-install pdo_dblib + +# Zip +RUN docker-php-ext-install zip + +# remove list +RUN rm -rf /var/lib/apt/lists/* + +# GD +RUN docker-php-ext-configure gd --with-freetype --with-jpeg +RUN docker-php-ext-install gd + +# install xdebug +RUN pecl install xdebug +RUN docker-php-ext-enable xdebug + +RUN echo "xdebug.remote_enable=1" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini +RUN echo "xdebug.remote_autostart=0" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini +RUN echo "xdebug.default_enable=0" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini +RUN echo "xdebug.remote_host=host.docker.internal" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini +RUN echo "xdebug.remote_port=9000" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini +RUN echo "xdebug.remote_connect_back=0" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini +RUN echo "xdebug.profiler_enable=0" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini +RUN echo "xdebug.remote_log=\"/tmp/xdebug.log\"" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini + + + +ENV LOCALTIME Asia/Kuala_Lumpur +ENV PHPFPM__access.format '"%R - %u [%t] \"%m %r\" %s %l %Q %f"' + +WORKDIR /var/www + +# Install Composer +RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer + + +### Special modifications for the www-data user. + +RUN groupadd -og 999 docker && usermod -a -G docker www-data + + +# Add www-data environment (for SSH mostly) +#RUN sed -i 's/\#umask 022/umask 002/' /etc/skel/.profile +#RUN usermod -d /home/www-data -s /bin/bash www-data \ +# && cp -av /etc/skel /home/www-data \ +# && mv /var/www /home/www-data/www \ +# && ln -s /home/www-data/www /var/www \ +# && chown -R www-data:www-data /home/www-data + + diff --git a/php-stack-8-fpm/Dockerfile b/php-stack-8-fpm/Dockerfile new file mode 100644 index 0000000..dd3c055 --- /dev/null +++ b/php-stack-8-fpm/Dockerfile @@ -0,0 +1,107 @@ +FROM php:8.0-fpm-buster +# guna buster utk debian 10. driver mssql msodbcsql17 xda lagi untuk debian 11 ( bulleye ) +MAINTAINER Muhamad Hanafiah Yahya + +RUN apt-get update && \ + apt-get install -y \ + freetds-bin \ + freetds-dev \ + freetds-common \ + libzip-dev \ + libpng-dev \ + libjpeg-dev \ + libfreetype6-dev \ + zip \ + gnupg2 \ + && apt-get install -y locales \ + && echo "en_US.UTF-8 UTF-8" > /etc/locale.gen \ + && locale-gen + +RUN docker-php-ext-configure pdo_mysql --with-pdo-mysql=mysqlnd \ + && docker-php-ext-configure mysqli --with-mysqli=mysqlnd \ + && docker-php-ext-install pdo_mysql \ + && docker-php-ext-install mysqli \ + && docker-php-ext-install bcmath + +#RUN docker-php-ext-configure pdo_dblib --with-libdir=lib/x86_64-linux-gnu && \ +# docker-php-ext-install pdo_dblib + +# Install the Microsoft ODBC driver for SQL Server +# https://learn.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-ver16&tabs=debian18-install%2Calpine17-install%2Cdebian8-install%2Credhat7-13-install%2Crhel7-offline +# https://stackoverflow.com/questions/75424070/docker-unixodbc-h-no-such-file-or-directory-pecl-install-sqlsrv-error-with-u +# RUN apt-get update \ +# && ACCEPT_EULA=Y apt-get install -y msodbcsql18 \ +# && ACCEPT_EULA=Y apt-get install -y mssql-tools18 \ +# && echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc + +# #RUN apt-get install unixodbc-dev=2.3.7 unixodbc=2.3.7 odbcinst1debian2=2.3.7 odbcinst=2.3.7 + +# RUN . ~/.bashrc +# SHELL ["/bin/bash", "-c"] +# RUN apt-get update \ +# && apt-get install -y --allow-downgrades unixodbc-dev=2.3.7 unixodbc=2.3.7 odbcinst1debian2=2.3.7 odbcinst=2.3.7 + +RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - +RUN curl https://packages.microsoft.com/config/debian/10/prod.list > /etc/apt/sources.list.d/mssql-release.list + +RUN apt-get update \ + && ACCEPT_EULA=Y apt-get install --yes --no-install-recommends msodbcsql17 unixodbc-dev=2.3.7 unixodbc=2.3.7 odbcinst1debian2=2.3.7 odbcinst=2.3.7 \ + && echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile \ + && echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc + +# Install pdo sqlsrv +RUN pecl config-set php_ini /usr/local/etc/php/conf.d/php.ini \ + && pecl install sqlsrv \ + && pecl install pdo_sqlsrv \ + && echo 'extension=sqlsrv.so' >> /usr/local/etc/php/conf.d/sqlsrv.ini \ + && echo 'extension=pdo_sqlsrv.so' >> /usr/local/etc/php/conf.d/sqlsrv.ini + +# Zip +RUN docker-php-ext-install zip + +# remove list +RUN rm -rf /var/lib/apt/lists/* + +# GD +RUN docker-php-ext-configure gd --with-freetype --with-jpeg +RUN docker-php-ext-install gd + +# install xdebug +RUN pecl install xdebug +RUN docker-php-ext-enable xdebug + +# RUN echo "xdebug.remote_enable=1" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini +# RUN echo "xdebug.remote_autostart=0" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini +# RUN echo "xdebug.default_enable=0" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini +# RUN echo "xdebug.remote_host=host.docker.internal" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini +# RUN echo "xdebug.remote_port=9000" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini +# RUN echo "xdebug.remote_connect_back=0" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini +# RUN echo "xdebug.profiler_enable=0" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini +# RUN echo "xdebug.remote_log=\"/tmp/xdebug.log\"" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini + +RUN echo "xdebug.mode=debug" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini + + + +ENV LOCALTIME Asia/Kuala_Lumpur +ENV PHPFPM__access.format '"%R - %u [%t] \"%m %r\" %s %l %Q %f"' + +WORKDIR /var/www + +# Install Composer +RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer + + +### Special modifications for the www-data user. + +# RUN groupadd -og 999 docker && usermod -a -G docker www-data + +# Add www-data environment (for SSH mostly) +# RUN sed -i 's/\#umask 022/umask 002/' /etc/skel/.profile +# RUN usermod -d /home/www-data -s /bin/bash www-data \ +# && cp -av /etc/skel /home/www-data \ +# && mv /var/www /home/www-data/www \ +# && ln -s /home/www-data/www /var/www \ +# && chown -R www-data:www-data /home/www-data + + diff --git a/projects/.gitignore b/projects/.gitignore new file mode 100644 index 0000000..df20d8a --- /dev/null +++ b/projects/.gitignore @@ -0,0 +1,5 @@ +#empty dir +* +!.gitignore +!example/*.* +!logs/.gitignore diff --git a/projects/.gitkeep b/projects/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/projects/example b/projects/example new file mode 160000 index 0000000..48837ee --- /dev/null +++ b/projects/example @@ -0,0 +1 @@ +Subproject commit 48837ee26448e56eff86e74fe218c77f47f307ab diff --git a/projects/logs/.gitignore b/projects/logs/.gitignore new file mode 100644 index 0000000..6ef83b5 --- /dev/null +++ b/projects/logs/.gitignore @@ -0,0 +1,3 @@ +# empty folder +* +!.gitignore