Tanggal: 2025-11-05
Mini “Google Drive” siap-deploy: auth, folder, upload, preview (PDF.js, Office Viewer, XLSX via SheetJS+Handsontable), share publik (file/folder), permission per-folder (viewer/editor) dengan inheritance + override allow/deny, quota per user, S3-compatible storage, Audit Logs, Analytics (Chart.js), Email Notifikasi (throttle & daily digest).
- Auth: register/login,
password_hash(). - File/Folder: struktur folder, upload multi-file, delete, quota per-user.
- Preview: PDF (PDF.js), Office (via Microsoft Office Web Viewer), XLSX (SheetJS+Handsontable).
- Share/Permission:
- Publik: token link file/folder.
- Private share: per-folder ke user (email), role viewer/editor, inheritance ke subfolder, override allow/deny.
- S3-compatible: upload besar dengan MultipartUploader, unduh via pre-signed URL.
- Admin: set quota & role, Audit Logs (filter + CSV), Analytics (Top Users, Top Files, Heatmap).
- Notifikasi: email saat share & akses (throttle), daily digest via cron.
/public -> web root (wajib jadi Document Root)
/assets -> CSS/JS statis
/lib -> helper, auth, DB, storage, mailer
/storage -> file lokal (jika driver=local), sudah dilindungi .htaccess
config.php
db.sql -> semua schema dan alter yang diperlukan
composer.json -> aws-sdk, phpmailer
digest_daily.php -> cron digest harian
s3_lifecycle.php -> contoh set lifecycle bucket
README.md -> panduan ini
Note: Semua file sudah disiapkan—cukup upload ZIP ke node PHP kamu dan ikuti langkah di bawah.
- PHP 8.0+ (disarankan 8.1/8.2)
- MySQL/MariaDB
- Composer terpasang pada node PHP (untuk install dependency)
- (Opsional) S3-compatible storage (AWS S3/MinIO/Wasabi/dll)
- (Opsional) SMTP untuk email notifikasi
Target: bisa login, upload, preview, share, izin editor, analytics, notifikasi—tanpa modifikasi kode.
- Create Environment → pilih PHP 8.x + MySQL/MariaDB.
- Aktifkan Public IP / Load Balancer bila perlu.
- Buka Config node PHP → atur Document Root ke:
/public
- Buat database (nama bebas).
- Import
db.sql(via phpMyAdmin/CLI).- Script ini sudah mencakup CREATE dan ALTER (quota, role, public_token, shares, logs, ACL, email_events).
- Deployment → Upload ZIP final ini atau SFTP/FTPS.
- Pastikan struktur tetap dan public/ menjadi root web.
Masuk ke node PHP (Web SSH/SSH) pada root project:
composer install --no-dev -o
Memasang aws/aws-sdk-php & phpmailer/phpmailer.
Wajib (DB):
DB_HOST=...
DB_NAME=...
DB_USER=...
DB_PASS=...
Aplikasi (disarankan):
APP_BASEURL=https://drive.domainmu.id
USER_QUOTA_MB=512 # default kuota user (opsional)
UPLOAD_MAX_BYTES=10485760 # override jika perlu (opsional)
Storage (opsional S3):
STORAGE_DRIVER=s3
S3_KEY=...
S3_SECRET=...
S3_REGION=us-east-1
S3_BUCKET=nama-bucket
S3_ENDPOINT=... # kosongkan untuk AWS asli; isi untuk MinIO/Wasabi
S3_PATH_STYLE=true # true untuk MinIO
SMTP (opsional notifikasi):
SMTP_HOST=smtp.domainmu.id
SMTP_PORT=587
SMTP_USER=...
SMTP_PASS=...
SMTP_SECURE=tls
SMTP_FROM=no-reply@domainmu.id
SMTP_FROM_NAME=DewaDrive
Notifikasi throttle & digest (opsional):
NOTIFY_MIN_GAP_MIN=60 # throttle email event per file (default 60 menit)
DIGEST_HOUR=07 # jam kirim digest harian (24h)
Agar ENV & dependency aktif.
Login → lalu via DB jalankan:
UPDATE users SET role='admin' WHERE email='email_admin@domainmu.id';Setelah itu, Admin bisa atur kuota dan role user lain dari /admin.php.
- Register/Login → upload file, buat folder.
- Preview:
- PDF: tombol Buka dengan PDF.js atau pratinjau inline.
- Word/Excel/PPT: Publikasikan dulu (agar viewer online bisa akses), lalu pratinjau via Office Web Viewer.
- XLSX: tombol Spreadsheet Viewer (SheetJS + Handsontable; bisa ekspor CSV).
- Share Publik:
- File: Publikasikan → dapat token link.
- Folder: Publikasikan Folder → link publik folder (daftar file).
- Share Privat (per-folder):
- Permissions → masukkan email user terdaftar, pilih role viewer/editor.
- Folder yang dibagikan muncul di Shared With Me.
- Editor bisa upload/delete di folder tersebut (kuota owner terpakai).
- Quota: progress bar di beranda; admin bisa ubah kuota per user.
- Role share:
viewer(lihat/unduh) ataueditor(plus upload/delete) pada folder dibagikan. - Inheritance: share pada folder turun ke semua subfolder.
- Override (Granular Policy): pada folder tertentu, bisa set allow/deny (dengan role untuk allow). Resolusi akses memakai override terdekat (dari folder naik ke root); jika tak ada override, pakai share inheritance.
- Publik vs Privat: link publik memakai token (file/folder). Private share butuh akun login.
Admin pages:
- /admin.php → set quota & role user.
- /admin-logs.php → Audit Logs (filter action/user/date + Export CSV).
- /admin-analytics.php → Top Users, Top Files, Heatmap (Chart.js).
- Saat share: pemilik & penerima dapat email.
- Saat view/download: pemilik dapat email (throttle) — ENV
NOTIFY_MIN_GAP_MINmenghindari spam. - Daily Digest: ringkasan akses kemarin per owner:
- Cron harian (sesuaikan jam server):
php digest_daily.php - ENV
DIGEST_HOUR=07agar skrip mengirim setelah jam 07.
- Cron harian (sesuaikan jam server):
Jika SMTP belum disetel, sistem akan skip pengiriman (best-effort).
- Set
STORAGE_DRIVER=s3+ kredensial/bucket/endpoint. - Upload ≥ 15MB otomatis Multipart Upload.
- Unduh memakai pre-signed URL (default 10 menit).
- Contoh Lifecycle Policy (
s3_lifecycle.php):- Prefix
archive/→ pindah keSTANDARD_IA(30 hari) →GLACIER(90 hari) → expire 10 tahun.
- Prefix
A. 404 setelah deploy
- Cek Document Root harus /public.
- Pastikan semua file ZIP ter-ekstrak, bukan di subfolder ganda.
B. Tidak bisa login/register
- Cek koneksi DB & ENV
DB_*. - Pastikan
db.sqlsudah di-import tanpa error.
C. Upload gagal (“Gagal menyimpan file”/“Tipe tidak diizinkan”)
- Periksa
UPLOAD_MAX_BYTESdan whitelist MIME diconfig.php. - Jika pakai S3, cek bucket/endpoint/region/credential benar +
composer installsudah jalan.
D. Viewer Office tidak muncul
- File harus dipublikasikan agar dapat diakses Office Web Viewer.
- Cek
APP_BASEURLvalid & bisa diakses publik (HTTPS disarankan).
E. XLSX viewer kosong/”Cannot parse”
- Pastikan file benar-benar XLS/XLSX.
- Tes Open Raw untuk memastikan file dapat diunduh normal.
F. Email tidak terkirim
- Cek ENV SMTP_* dan port/firewall.
- Periksa throttle: event bisa tertahan jika belum melewati
NOTIFY_MIN_GAP_MIN.
G. “Admin only” saat buka admin page
- Pastikan sudah set role admin via SQL sesuai email login.
H. S3 download redirect terus
- Pre-signed URL kadaluarsa: reload halaman.
- Cek jam server & integritas kredensial.
- Untuk MinIO, gunakan
S3_PATH_STYLE=truedan setS3_ENDPOINT(URL http/https).
I. Permission editor tidak bisa upload/delete
- Pastikan folder memang dibagikan dengan role
editorke user tersebut. - Cek override deny di folder/subfolder terkait.
- Cek kuota owner tidak habis.
J. Digest tidak terkirim
- Cek cron sudah memanggil
php digest_daily.phpsetelah jamDIGEST_HOUR. - SMTP harus aktif.
- Jalankan di HTTPS.
- Pertimbangkan CSRF token, rate limiting, captcha untuk produksi.
- Tambahkan virus scan (ClamAV) bila menerima file dari publik.
- Audit & rotate kredensial DB/SMTP/S3 secara berkala.
- Versioning file, rename/move, folder ACL UI penuh, full-text search (OCR + index).
- Soft delete + recycle bin.
- Two-factor auth (2FA) untuk admin.
- Login/Registrasi OK
- Buat Folder, Upload File (lokal/S3)
- Preview PDF (PDF.js), Office, XLSX
- Share publik (file+folder)
- Share privat (viewer/editor), editor upload/delete OK
- Quota bekerja (blocked jika over)
- Admin: set quota/role OK
- Audit Logs filter+CSV OK
- Analytics grafik OK
- Email event (throttle) & Daily Digest OK
Selamat menggunakan DewaDrive! 🚀
Panduan ini merangkum semua yang perlu dikonfigurasi sebelum dan sesudah deploy.
Nilai default membaca dari ENV. Contoh variabel penting:
<?php
$APP_NAME = "DewaDrive";
$UPLOAD_MAX_BYTES = getenv("UPLOAD_MAX_BYTES") ?: 10485760; // 10 MB
$USER_QUOTA_MB = getenv("USER_QUOTA_MB") ?: 512;
$APP_BASEURL = getenv("APP_BASEURL") ?: "http://localhost";
$STORAGE_DRIVER = getenv("STORAGE_DRIVER") ?: "local";Set melalui panel Environment Variables di DewaCloud.
Database (wajib):
DB_HOST=...
DB_NAME=...
DB_USER=...
DB_PASS=...
Aplikasi:
APP_BASEURL=https://drive.domainmu.id
USER_QUOTA_MB=512
UPLOAD_MAX_BYTES=10485760
Storage Lokal (default):
STORAGE_DRIVER=local
S3 / MinIO / Wasabi (opsional):
STORAGE_DRIVER=s3
S3_KEY=...
S3_SECRET=...
S3_REGION=ap-southeast-1
S3_BUCKET=dewadrive-bucket
S3_ENDPOINT=https://s3.wasabisys.com # kosongkan untuk AWS asli
S3_PATH_STYLE=true # true untuk MinIO
SMTP (opsional notifikasi):
SMTP_HOST=smtp.domainmu.id
SMTP_PORT=587
SMTP_USER=no-reply@domainmu.id
SMTP_PASS=...
SMTP_SECURE=tls
SMTP_FROM=no-reply@domainmu.id
SMTP_FROM_NAME=DewaDrive Notifier
Notifikasi & Digest:
NOTIFY_MIN_GAP_MIN=60 # throttle email per file/event (menit)
DIGEST_HOUR=07 # jam kirim daily digest (24h)
| File | Fungsi | Catatan |
|---|---|---|
config.php |
Konfigurasi aplikasi | Membaca ENV otomatis |
/public/.htaccess |
Proteksi & routing | Jangan hapus |
db.sql |
Schema & alter semua versi | Wajib import awal |
composer.json |
Dependency | Jalankan composer install --no-dev -o |
digest_daily.php |
Cron digest harian | Jalankan 1x/hari |
s3_lifecycle.php |
Contoh lifecycle S3 | Opsional |
Contoh di DewaCloud (set sesuai path project):
php /var/app/current/digest_daily.php
Jalankan setelah jam DIGEST_HOUR.
Setelah registrasi user pertama, jadikan admin via SQL:
UPDATE users SET role='admin' WHERE email='email_admin@domainmu.id';Lalu buka /admin.php.
- Import
db.sqlsukses (tanpa error) - ENV
DB_*benar -
composer install --no-dev -osudah dijalankan - Document Root =
/public - (Opsional) SMTP aktif
- (Opsional) Cron
digest_daily.phpaktif - Admin user sudah di-set