From 33a74298b1b73445a018acf70106a90cf49ab6f0 Mon Sep 17 00:00:00 2001 From: novysan87 Date: Sun, 12 Apr 2026 06:38:44 +0000 Subject: [PATCH] Add deployment, backup, and project documentation --- .env.example | 36 ++-- DEPLOY.md | 542 +++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 308 +++++++++++++++++++++++++---- backup.sh | 71 +++++++ deploy.sh | 92 +++++++++ 5 files changed, 995 insertions(+), 54 deletions(-) create mode 100644 DEPLOY.md create mode 100755 backup.sh create mode 100755 deploy.sh diff --git a/.env.example b/.env.example index c0660ea..2fcbf46 100644 --- a/.env.example +++ b/.env.example @@ -1,43 +1,41 @@ -APP_NAME=Laravel -APP_ENV=local +APP_NAME="Database Kesiswaan" +APP_ENV=production APP_KEY= -APP_DEBUG=true +APP_DEBUG=false APP_URL=http://localhost -APP_LOCALE=en -APP_FALLBACK_LOCALE=en -APP_FAKER_LOCALE=en_US +APP_LOCALE=id +APP_FALLBACK_LOCALE=id +APP_FAKER_LOCALE=id_ID 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 +LOG_LEVEL=error -DB_CONNECTION=sqlite -# DB_HOST=127.0.0.1 -# DB_PORT=3306 -# DB_DATABASE=laravel -# DB_USERNAME=root -# DB_PASSWORD= +DB_CONNECTION=mysql +DB_HOST=127.0.0.1 +DB_PORT=3306 +DB_DATABASE=database_kesiswaan +DB_USERNAME=kesiswaan +DB_PASSWORD=changeme -SESSION_DRIVER=database +SESSION_DRIVER=file SESSION_LIFETIME=120 SESSION_ENCRYPT=false SESSION_PATH=/ SESSION_DOMAIN=null BROADCAST_CONNECTION=log -FILESYSTEM_DISK=local +FILESYSTEM_DISK=public QUEUE_CONNECTION=database -CACHE_STORE=database +CACHE_STORE=file # CACHE_PREFIX= MEMCACHED_HOST=127.0.0.1 @@ -53,7 +51,7 @@ MAIL_HOST=127.0.0.1 MAIL_PORT=2525 MAIL_USERNAME=null MAIL_PASSWORD=null -MAIL_FROM_ADDRESS="hello@example.com" +MAIL_FROM_ADDRESS="admin@kesiswaan.local" MAIL_FROM_NAME="${APP_NAME}" AWS_ACCESS_KEY_ID= diff --git a/DEPLOY.md b/DEPLOY.md new file mode 100644 index 0000000..1dd38a3 --- /dev/null +++ b/DEPLOY.md @@ -0,0 +1,542 @@ +# DEPLOY.md - Database Kesiswaan + +Panduan ini dibuat supaya aplikasi **Database Kesiswaan** mudah dipindahkan dan dideploy ke server baru tanpa bergantung pada ingatan manual. + +--- + +## 1. Ringkasan Arsitektur Deploy + +Pisahkan 3 hal ini dengan jelas: + +1. **Source code** + - Disimpan di GitHub repository project + - Berisi code Laravel, migration, seeder, assets, docs + +2. **Environment & runtime** + - File `.env` + - Database MySQL / MariaDB + - Folder `storage/app/public` + - Cache, logs, session runtime + +3. **Backup** + - Dump database + - Backup file upload / storage publik + - Salinan `.env` yang aman + +> GitHub adalah source of truth untuk **kode**, bukan untuk data produksi. + +--- + +## 2. Kebutuhan Server + +Minimal server baru perlu: + +- Linux server (Ubuntu/Debian direkomendasikan) +- Web server: **Apache** atau **Nginx** +- PHP **8.2+** +- Composer +- Node.js + npm +- MySQL / MariaDB +- Git + +### PHP extensions yang dibutuhkan + +Minimal pastikan extension berikut aktif: + +- bcmath +- ctype +- curl +- dom +- fileinfo +- filter +- gd +- intl +- mbstring +- openssl +- pdo +- pdo_mysql +- session +- tokenizer +- xml +- zip + +Cek cepat: + +```bash +php -m +``` + +--- + +## 3. Struktur Lokasi yang Disarankan + +Contoh lokasi deploy: + +```bash +/var/www/database-kesiswaan +``` + +Document root web server harus mengarah ke: + +```bash +/var/www/database-kesiswaan/public +``` + +--- + +## 4. Fresh Deploy dari GitHub + +### 4.1 Clone repository + +```bash +cd /var/www +git clone https://github.com/novysan87/database-kesiswaan.git +cd database-kesiswaan +``` + +Atau pakai SSH: + +```bash +git clone git@github.com:novysan87/database-kesiswaan.git +cd database-kesiswaan +``` + +--- + +### 4.2 Cara deploy yang direkomendasikan + +Setelah `.env` siap, gunakan script deploy bawaan project: + +```bash +./deploy.sh +``` + +Untuk staging / non-production: + +```bash +APP_ENVIRONMENT=staging ./deploy.sh +``` + +Kalau perlu sekalian seed: + +```bash +RUN_SEED=true ./deploy.sh +``` + +--- + +### 4.3 Alternatif manual (tanpa script) + +#### Install dependency backend + +```bash +composer install --no-dev --optimize-autoloader +``` + +Untuk server development / staging: + +```bash +composer install +``` + +#### Install dependency frontend + +```bash +npm install +npm run build +``` + +Kalau lingkungan development: + +```bash +npm run dev +``` + +--- + +### 4.4 Siapkan file environment + +Copy `.env.example` menjadi `.env`: + +```bash +cp .env.example .env +``` + +Lalu edit: + +```bash +nano .env +``` + +Minimal sesuaikan: + +```env +APP_NAME="Database Kesiswaan" +APP_ENV=production +APP_KEY= +APP_DEBUG=false +APP_URL=https://domain-anda.com + +LOG_CHANNEL=stack +LOG_LEVEL=error + +DB_CONNECTION=mysql +DB_HOST=127.0.0.1 +DB_PORT=3306 +DB_DATABASE=database_kesiswaan +DB_USERNAME=kesiswaan +DB_PASSWORD=PASSWORD_DB_ANDA + +FILESYSTEM_DISK=public +SESSION_DRIVER=file +CACHE_STORE=file +QUEUE_CONNECTION=database +``` + +> Jangan commit `.env` ke GitHub. + +--- + +### 4.5 Generate APP_KEY + +```bash +php artisan key:generate +``` + +--- + +### 4.6 Jalankan migration + +```bash +php artisan migrate --force +``` + +Kalau perlu data awal admin: + +```bash +php artisan db:seed --force +``` + +> Perhatikan seeder aktif di project. Pastikan tidak menimpa data produksi yang sudah ada. + +--- + +### 4.7 Buat symbolic link storage + +```bash +php artisan storage:link +``` + +Tanpa ini, file upload publik seperti dokumen dan branding tidak akan tampil. + +--- + +### 4.8 Atur permission + +Pastikan web server user bisa menulis ke folder berikut: + +- `storage/` +- `bootstrap/cache/` + +Contoh untuk Apache (`www-data`): + +```bash +chown -R www-data:www-data /var/www/database-kesiswaan +find /var/www/database-kesiswaan -type f -exec chmod 644 {} \; +find /var/www/database-kesiswaan -type d -exec chmod 755 {} \; +chmod -R 775 /var/www/database-kesiswaan/storage +chmod -R 775 /var/www/database-kesiswaan/bootstrap/cache +``` + +> Sesuaikan user/group web server jika bukan `www-data`. + +--- + +## 5. Konfigurasi Web Server + +### 5.1 Apache (contoh VirtualHost) + +```apache + + ServerName database-kesiswaan.local + DocumentRoot /var/www/database-kesiswaan/public + + + AllowOverride All + Require all granted + + + ErrorLog ${APACHE_LOG_DIR}/database-kesiswaan-error.log + CustomLog ${APACHE_LOG_DIR}/database-kesiswaan-access.log combined + +``` + +Lalu: + +```bash +a2enmod rewrite +systemctl reload apache2 +``` + +--- + +### 5.2 Nginx (contoh server block) + +```nginx +server { + listen 80; + server_name domain-anda.com; + root /var/www/database-kesiswaan/public; + index index.php index.html; + + location / { + try_files $uri $uri/ /index.php?$query_string; + } + + location ~ \.php$ { + include snippets/fastcgi-php.conf; + fastcgi_pass unix:/run/php/php8.2-fpm.sock; + fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; + include fastcgi_params; + } + + location ~ /\.ht { + deny all; + } +} +``` + +--- + +## 6. Fresh Deploy dengan Data Produksi Lama + +Kalau server baru bukan install kosong, tetapi pindahan dari server lama: + +### 6.1 Pindahkan source code +- clone dari GitHub + +### 6.2 Pindahkan `.env` +- copy `.env` lama, lalu sesuaikan domain / host DB bila perlu + +### 6.3 Restore database +Gunakan dump SQL lama: + +```bash +mysql -u USER_DB -p database_kesiswaan < backup.sql +``` + +### 6.4 Pindahkan storage publik +Yang wajib ikut: + +- `storage/app/public/branding` +- `storage/app/public/student-documents` +- `storage/app/public/student-exit-letters` +- `storage/app/public/student-transfer-letters` +- file publik lain hasil upload runtime + +Contoh copy: + +```bash +rsync -avz /server-lama/var/www/database-kesiswaan/storage/app/public/ /var/www/database-kesiswaan/storage/app/public/ +``` + +### 6.5 Jalankan ulang + +```bash +php artisan storage:link +php artisan optimize:clear +npm run build +``` + +--- + +## 7. Update Deploy (setelah ada perubahan baru) + +Kalau server sudah live dan ingin update dari GitHub: + +```bash +cd /var/www/database-kesiswaan +git pull origin main +composer install --no-dev --optimize-autoloader +npm install +npm run build +php artisan migrate --force +php artisan optimize:clear +``` + +Kalau perlu cache ulang: + +```bash +php artisan config:cache +php artisan route:cache +php artisan view:cache +``` + +> Jangan cache route/config terlalu cepat saat masih sering debugging. Gunakan setelah yakin stabil. + +--- + +## 8. Backup yang Wajib Dipahami + +Supaya aplikasi benar-benar bisa dipulihkan, backup yang dibutuhkan adalah: + +### 8.1 Database +Contoh: + +```bash +mysqldump -u USER_DB -p database_kesiswaan > backup-database-kesiswaan.sql +``` + +### 8.2 Storage publik +Contoh: + +```bash +tar -czf backup-storage-public.tar.gz storage/app/public +``` + +### 8.3 File `.env` +Simpan terpisah dan aman. Jangan masuk GitHub. + +--- + +## 9. Hal yang Tidak Boleh Masuk GitHub + +Pastikan hal berikut tetap **tidak** masuk repository: + +- `.env` +- `vendor/` +- `node_modules/` +- `storage/logs/*` +- `storage/framework/views/*` +- `storage/app/public/*` hasil upload runtime +- dump database +- file backup manual +- dokumen siswa produksi +- token / credential / password + +--- + +## 10. Post-Deploy Checklist + +Gunakan checklist ini setelah deploy ke server baru. + +### A. Validasi dasar +- [ ] `composer install` sukses +- [ ] `npm run build` sukses +- [ ] `.env` sudah benar +- [ ] `php artisan key:generate` sudah dijalankan +- [ ] `php artisan migrate --force` sukses +- [ ] `php artisan storage:link` sukses +- [ ] permission `storage/` dan `bootstrap/cache/` benar + +### B. Validasi web +- [ ] halaman login bisa dibuka +- [ ] dashboard bisa dibuka setelah login +- [ ] branding/logo tampil normal +- [ ] halaman publik pencarian siswa tampil +- [ ] halaman publik `lengkapi-data-siswa` tampil + +### C. Validasi data +- [ ] data siswa muncul +- [ ] branding settings terbaca +- [ ] dokumen siswa bisa dipreview +- [ ] surat keluar/mutasi lama masih bisa diakses +- [ ] region data tersedia normal + +### D. Validasi storage +- [ ] folder branding terbaca +- [ ] upload baru bisa dilakukan +- [ ] file lama tetap tersedia + +### E. Validasi keamanan minimum +- [ ] `APP_DEBUG=false` di production +- [ ] `.env` tidak bisa diakses publik +- [ ] document root mengarah ke `public/` +- [ ] repo GitHub private + +--- + +## 11. Troubleshooting Cepat + +### Problem: logo / dokumen tidak muncul +Cek: + +```bash +php artisan storage:link +ls -la public/storage +``` + +### Problem: error permission Laravel +Cek: + +```bash +chown -R www-data:www-data /var/www/database-kesiswaan +chmod -R 775 storage bootstrap/cache +``` + +### Problem: perubahan view tidak muncul +Cek: + +```bash +php artisan optimize:clear +``` + +### Problem: migration gagal +Cek koneksi DB di `.env` lalu jalankan: + +```bash +php artisan migrate:status +``` + +### Problem: asset CSS/JS tidak tampil +Build ulang: + +```bash +npm install +npm run build +``` + +--- + +## 12. Rekomendasi Lanjutan + +Agar deploy makin nyaman ke depan, pertimbangkan langkah berikut: + +- buat script `deploy.sh` +- buat script backup otomatis database + storage publik +- tambahkan `HEALTHCHECK.md` / SOP operasional +- siapkan server staging jika aplikasi makin besar +- pertimbangkan CI/CD setelah alur deploy manual sudah stabil + +--- + +## 13. Ringkasan Singkat Perintah Deploy + +### Fresh install + +```bash +cd /var/www +git clone https://github.com/novysan87/database-kesiswaan.git +cd database-kesiswaan +cp .env.example .env +./deploy.sh +``` + +### Update deploy + +```bash +cd /var/www/database-kesiswaan +git pull origin main +./deploy.sh +``` + +### Backup manual + +```bash +cd /var/www/database-kesiswaan +./backup.sh +``` + +--- + +Kalau nanti arsitektur aplikasi berubah signifikan, update file ini juga supaya tetap relevan. diff --git a/README.md b/README.md index 5ad1377..ebfcfb8 100644 --- a/README.md +++ b/README.md @@ -1,58 +1,296 @@ -

Laravel Logo

+# Database Kesiswaan -

-Build Status -Total Downloads -Latest Stable Version -License -

+Aplikasi administrasi sekolah berbasis **Laravel** untuk mengelola data siswa, dokumen siswa, data orang tua/wali, kenaikan kelas, mutasi/keluar siswa, portal publik pencarian siswa, dan portal pelengkapan biodata siswa. -## About Laravel +--- -Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as: +## Tujuan Aplikasi -- [Simple, fast routing engine](https://laravel.com/docs/routing). -- [Powerful dependency injection container](https://laravel.com/docs/container). -- Multiple back-ends for [session](https://laravel.com/docs/session) and [cache](https://laravel.com/docs/cache) storage. -- Expressive, intuitive [database ORM](https://laravel.com/docs/eloquent). -- Database agnostic [schema migrations](https://laravel.com/docs/migrations). -- [Robust background job processing](https://laravel.com/docs/queues). -- [Real-time event broadcasting](https://laravel.com/docs/broadcasting). +Project ini dibuat untuk membantu operasional sekolah dalam satu panel administrasi yang lebih rapi dan terstruktur, dengan fokus pada: -Laravel is accessible, powerful, and provides tools required for large, robust applications. +- pengelolaan data siswa +- master data akademik +- pengelolaan dokumen siswa +- pemantauan kelengkapan dan verifikasi dokumen +- histori akademik siswa +- promosi / kenaikan kelas +- arsip siswa keluar dan mutasi +- portal publik untuk pencarian informasi siswa +- portal publik untuk pelengkapan biodata siswa secara mandiri -## Learning Laravel +--- -Laravel has the most extensive and thorough [documentation](https://laravel.com/docs) and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework. +## Fitur Utama -In addition, [Laracasts](https://laracasts.com) contains thousands of video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript. Boost your skills by digging into our comprehensive video library. +### Dashboard +- ringkasan jumlah siswa +- ringkasan kelengkapan dokumen +- ringkasan verifikasi dokumen -You can also watch bite-sized lessons with real-world projects on [Laravel Learn](https://laravel.com/learn), where you will be guided through building a Laravel application from scratch while learning PHP fundamentals. +### Master Data +- Tahun Angkatan +- Program Keahlian +- Kelas +- Jenis Dokumen -## Agentic Development +### Data Siswa +- CRUD data siswa +- detail siswa +- relasi ke Tahun Angkatan, Program Keahlian, dan Kelas +- histori akademik siswa -Laravel's predictable structure and conventions make it ideal for AI coding agents like Claude Code, Cursor, and GitHub Copilot. Install [Laravel Boost](https://laravel.com/docs/ai) to supercharge your AI workflow: +### Orang Tua / Wali +- nested CRUD di bawah siswa +- dukungan ayah, ibu, dan wali +### Dokumen Siswa +- upload dokumen +- edit / hapus dokumen +- preview browser +- download file +- verifikasi cepat dokumen +- catatan verifikasi + +### Arsip Status Siswa +- Data Siswa Keluar +- Data Siswa Mutasi +- Data Siswa Lulus + +### Promosi / Kenaikan Kelas +- rekomendasi kenaikan kelas +- penulisan histori akademik otomatis + +### Portal Publik +- pencarian siswa publik +- portal pelengkapan biodata siswa +- verifikasi melalui NIS/NISN dan kode akses + +### Pengaturan +- manajemen pengguna +- branding aplikasi +- reset data tertentu + +--- + +## Teknologi yang Dipakai + +- **Laravel** +- **Blade** +- **Tailwind CSS** +- **Vite** +- **MySQL / MariaDB** +- **SweetAlert2** +- **Alpine.js** + +--- + +## Requirement Minimum + +- PHP 8.2+ +- Composer +- Node.js + npm +- MySQL / MariaDB +- Git +- Web server Apache atau Nginx + +--- + +## Instalasi Lokal / Fresh Setup + +### 1. Clone repository ```bash -composer require laravel/boost --dev - -php artisan boost:install +git clone https://github.com/novysan87/database-kesiswaan.git +cd database-kesiswaan ``` -Boost provides your agent 15+ tools and skills that help agents build Laravel applications while following best practices. +### 2. Copy file environment +```bash +cp .env.example .env +``` -## Contributing +### 3. Edit konfigurasi `.env` +Sesuaikan terutama: +- `APP_URL` +- `DB_HOST` +- `DB_PORT` +- `DB_DATABASE` +- `DB_USERNAME` +- `DB_PASSWORD` -Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions). +### 4. Jalankan script deploy +```bash +./deploy.sh +``` -## Code of Conduct +Untuk staging: +```bash +APP_ENVIRONMENT=staging ./deploy.sh +``` -In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct). +Kalau perlu seeder: +```bash +RUN_SEED=true ./deploy.sh +``` -## Security Vulnerabilities +--- -If you discover a security vulnerability within Laravel, please send an e-mail to Taylor Otwell via [taylor@laravel.com](mailto:taylor@laravel.com). All security vulnerabilities will be promptly addressed. +## Menjalankan Secara Manual -## License +Kalau tidak memakai `deploy.sh`: -The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT). +```bash +composer install +npm install +npm run build +php artisan key:generate +php artisan migrate +php artisan storage:link +``` + +Untuk development: +```bash +php artisan serve +npm run dev +``` + +--- + +## Backup + +Project ini menyediakan script backup manual: + +```bash +./backup.sh +``` + +Yang dibackup: +- database MySQL +- `storage/app/public` +- file `.env` + +Lokasi backup default: +- `storage/app/backups-manual/database` +- `storage/app/backups-manual/storage` +- `storage/app/backups-manual/env` + +--- + +## Deploy ke Server Baru + +Panduan lengkap ada di file: + +```bash +DEPLOY.md +``` + +Di sana sudah dibahas: +- fresh deploy +- update deploy +- setup web server +- storage link +- backup & restore dasar +- checklist verifikasi pasca deploy + +--- + +## Struktur Penting Project + +```bash +app/ # controller, model, middleware, logic aplikasi +config/ # konfigurasi Laravel +database/ # migration, seeder, factory +public/ # document root web server +resources/views/ # Blade views +routes/ # web route & auth route +storage/app/public/ # file upload runtime (tidak masuk git) +DEPLOY.md # panduan deploy server baru +deploy.sh # script deploy +backup.sh # script backup +``` + +--- + +## Catatan Penting + +### Jangan upload ke GitHub: +- `.env` +- dump database produksi +- file upload produksi +- dokumen siswa +- log runtime +- cache runtime +- credential / token / secret + +### Yang masuk GitHub: +- source code +- migration +- seeder +- konfigurasi contoh +- script deploy / backup +- dokumentasi + +--- + +## Alur Deploy yang Direkomendasikan + +### Fresh server +```bash +git clone +cd database-kesiswaan +cp .env.example .env +./deploy.sh +``` + +### Update aplikasi +```bash +cd /var/www/database-kesiswaan +git pull origin main +./deploy.sh +``` + +### Backup manual +```bash +cd /var/www/database-kesiswaan +./backup.sh +``` + +--- + +## Branding + +Branding aplikasi bisa diatur dari dashboard melalui menu: + +- **Pengaturan > Branding Aplikasi** + +Pengaturan ini dapat mencakup: +- nama aplikasi +- nama singkat / inisial +- logo utama +- favicon +- logo portal publik + +--- + +## Catatan Operasional + +- source code di GitHub adalah **source of truth untuk code** +- data produksi tetap harus dibackup terpisah +- folder `storage/app/public` harus ikut dipindahkan saat migrasi server +- `php artisan storage:link` wajib tersedia agar file publik tampil normal + +--- + +## Status Saat Ini + +Project ini sudah memiliki fondasi deploy dasar: +- repository GitHub +- `DEPLOY.md` +- `deploy.sh` +- `backup.sh` +- `.env.example` yang lebih relevan + +--- + +## Lisensi / Kepemilikan + +Project ini adalah aplikasi internal/operasional yang dikembangkan untuk kebutuhan administrasi sekolah. Gunakan dan kelola repository dengan akses yang sesuai, idealnya **private repository**. diff --git a/backup.sh b/backup.sh new file mode 100755 index 0000000..b08e623 --- /dev/null +++ b/backup.sh @@ -0,0 +1,71 @@ +#!/usr/bin/env bash +set -euo pipefail + +APP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +cd "$APP_DIR" + +PHP_BIN="${PHP_BIN:-php}" +BACKUP_ROOT="${BACKUP_ROOT:-$APP_DIR/storage/app/backups-manual}" +TIMESTAMP="$(date '+%Y-%m-%d-%H%M%S')" +RETENTION_DAYS="${RETENTION_DAYS:-14}" + +log() { + printf '\n[%s] %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$1" +} + +abort() { + printf '\n[ERROR] %s\n' "$1" >&2 + exit 1 +} + +[[ -f .env ]] || abort "File .env tidak ditemukan." +[[ -f artisan ]] || abort "File artisan tidak ditemukan. Jalankan dari root project Laravel." + +mkdir -p "$BACKUP_ROOT/database" +mkdir -p "$BACKUP_ROOT/storage" +mkdir -p "$BACKUP_ROOT/env" + +DB_CONNECTION=$(grep '^DB_CONNECTION=' .env | cut -d '=' -f2- | tr -d '"') +DB_HOST=$(grep '^DB_HOST=' .env | cut -d '=' -f2- | tr -d '"') +DB_PORT=$(grep '^DB_PORT=' .env | cut -d '=' -f2- | tr -d '"') +DB_DATABASE=$(grep '^DB_DATABASE=' .env | cut -d '=' -f2- | tr -d '"') +DB_USERNAME=$(grep '^DB_USERNAME=' .env | cut -d '=' -f2- | tr -d '"') +DB_PASSWORD=$(grep '^DB_PASSWORD=' .env | cut -d '=' -f2- | tr -d '"') + +[[ -n "$DB_CONNECTION" ]] || abort "DB_CONNECTION tidak ditemukan di .env" +[[ "$DB_CONNECTION" == "mysql" ]] || abort "backup.sh saat ini hanya mendukung DB_CONNECTION=mysql" +[[ -n "$DB_DATABASE" ]] || abort "DB_DATABASE tidak ditemukan di .env" +[[ -n "$DB_USERNAME" ]] || abort "DB_USERNAME tidak ditemukan di .env" + +DB_HOST="${DB_HOST:-127.0.0.1}" +DB_PORT="${DB_PORT:-3306}" + +DB_FILE="$BACKUP_ROOT/database/${DB_DATABASE}-${TIMESTAMP}.sql" +STORAGE_FILE="$BACKUP_ROOT/storage/storage-public-${TIMESTAMP}.tar.gz" +ENV_FILE="$BACKUP_ROOT/env/env-${TIMESTAMP}.backup" + +log "Backup database: $DB_DATABASE" +MYSQL_PWD="$DB_PASSWORD" mysqldump \ + --host="$DB_HOST" \ + --port="$DB_PORT" \ + --user="$DB_USERNAME" \ + --single-transaction \ + --quick \ + --skip-lock-tables \ + "$DB_DATABASE" > "$DB_FILE" + +log "Backup storage/app/public" +tar -czf "$STORAGE_FILE" storage/app/public + +log "Backup file .env" +cp .env "$ENV_FILE" +chmod 600 "$ENV_FILE" || true + +log "Hapus backup lama di atas ${RETENTION_DAYS} hari" +find "$BACKUP_ROOT" -type f -mtime +"$RETENTION_DAYS" -delete || true + +log "Backup selesai" +printf '\nHasil backup:\n' +printf -- '- Database: %s\n' "$DB_FILE" +printf -- '- Storage : %s\n' "$STORAGE_FILE" +printf -- '- .env : %s\n' "$ENV_FILE" diff --git a/deploy.sh b/deploy.sh new file mode 100755 index 0000000..e9159fb --- /dev/null +++ b/deploy.sh @@ -0,0 +1,92 @@ +#!/usr/bin/env bash +set -euo pipefail + +APP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +cd "$APP_DIR" + +PHP_BIN="${PHP_BIN:-php}" +COMPOSER_BIN="${COMPOSER_BIN:-composer}" +NPM_BIN="${NPM_BIN:-npm}" +APP_ENVIRONMENT="${APP_ENVIRONMENT:-production}" +RUN_SEED="${RUN_SEED:-false}" +INSTALL_NODE_MODULES="${INSTALL_NODE_MODULES:-true}" +COMPOSER_FLAGS_DEFAULT="--no-dev --optimize-autoloader" +COMPOSER_FLAGS="${COMPOSER_FLAGS:-$COMPOSER_FLAGS_DEFAULT}" + +if [[ "$APP_ENVIRONMENT" != "production" ]]; then + COMPOSER_FLAGS="${COMPOSER_FLAGS_NON_PROD:-}" +fi + +log() { + printf '\n[%s] %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$1" +} + +abort() { + printf '\n[ERROR] %s\n' "$1" >&2 + exit 1 +} + +require_cmd() { + command -v "$1" >/dev/null 2>&1 || abort "Command not found: $1" +} + +log "Memulai deploy di: $APP_DIR" + +require_cmd "$PHP_BIN" +require_cmd "$COMPOSER_BIN" +require_cmd "$NPM_BIN" + +[[ -f artisan ]] || abort "File artisan tidak ditemukan. Pastikan script dijalankan dari root project Laravel." +[[ -f .env ]] || abort "File .env tidak ditemukan. Copy .env.example menjadi .env terlebih dahulu." + +log "Menampilkan versi tool" +$PHP_BIN -v | head -n 1 +$COMPOSER_BIN --version +$NPM_BIN --version + +log "Install/update dependency Composer" +if [[ -n "$COMPOSER_FLAGS" ]]; then + $COMPOSER_BIN install $COMPOSER_FLAGS +else + $COMPOSER_BIN install +fi + +if [[ "$INSTALL_NODE_MODULES" == "true" ]]; then + log "Install dependency frontend" + $NPM_BIN install +fi + +log "Build asset frontend" +$NPM_BIN run build + +log "Pastikan APP_KEY tersedia" +$PHP_BIN artisan key:generate --force + +log "Jalankan migration" +$PHP_BIN artisan migrate --force + +if [[ "$RUN_SEED" == "true" ]]; then + log "Jalankan seeder" + $PHP_BIN artisan db:seed --force +fi + +log "Pastikan symbolic link storage tersedia" +$PHP_BIN artisan storage:link || true + +log "Bersihkan cache Laravel" +$PHP_BIN artisan optimize:clear + +if [[ "$APP_ENVIRONMENT" == "production" ]]; then + log "Cache config, route, dan view untuk production" + $PHP_BIN artisan config:cache + $PHP_BIN artisan route:cache + $PHP_BIN artisan view:cache +fi + +log "Deploy selesai" +printf '\nChecklist manual setelah deploy:\n' +printf -- '- Cek halaman login\n' +printf -- '- Cek dashboard setelah login\n' +printf -- '- Cek branding/logo\n' +printf -- '- Cek portal publik\n' +printf -- '- Cek file upload dan dokumen lama\n'