CMS Pemerintah
Content Management System untuk website instansi pemerintah Indonesia.
Dibangun dengan CodeIgniter 4 + PostgreSQL + Tailwind CSS.
Product Requirements Document (PRD)
1. Executive Summary
CMS Pemerintah adalah platform pengelolaan konten web yang dirancang khusus untuk kebutuhan instansi pemerintah di Indonesia. Sistem ini memungkinkan pengelolaan berita, halaman statis, galeri media, album foto, video embed, berkas unduhan, FAQ, slide carousel, menu navigasi, dan pengaturan situs — semuanya melalui panel administrasi berbasis web.
2. Target Pengguna
| Role |
Hak Akses |
| Admin |
Akses penuh: semua modul, manajemen pengguna, menu, halaman, pengaturan |
| Penulis |
Konten saja: berita, galeri media, album, video, unduhan, slide, FAQ |
3. Fitur Utama
3.1 Modul Publik
| Modul |
URL Publik |
Deskripsi |
| Berita |
/berita |
Artikel berita dengan kategori, arsip, RSS |
| Halaman Statis |
/halaman/{slug} |
Halaman konten dinamis dengan path kustom |
| Album Foto |
/album |
Galeri foto dengan lightbox modal |
| Video |
/video |
Embed YouTube, Instagram, TikTok |
| Unduh |
/download |
Berkas PDF, DOC, XLS, ZIP, PPT |
| FAQ |
(di beranda) |
Accordion expand/collapse |
| Slide Carousel |
(di beranda) |
Banner dengan auto-play, swipe, drag |
3.2 Panel Admin (/admin)
| Modul |
Fitur CRUD |
Toggle Status |
Pencarian |
Upload File |
| Dashboard |
— |
— |
— |
— |
| Berita |
✅ |
✅ |
✅ |
— |
| Galeri Media |
Upload/Hapus |
— |
✅ |
✅ |
| Album Foto |
✅ |
✅ |
✅ |
✅ |
| Video |
✅ |
✅ |
✅ |
— |
| Unduh |
✅ |
✅ |
✅ |
✅ |
| Slide Carousel |
✅ |
✅ |
— |
— |
| FAQ |
✅ |
✅ |
— |
— |
| Pengguna |
✅ |
— |
✅ |
— |
| Menu Navigasi |
✅ |
✅ |
✅ |
— |
| Halaman |
✅ |
✅ |
✅ |
— |
| Kategori |
✅ |
— |
✅ |
— |
| Tautan |
✅ |
— |
✅ |
✅ |
| Pengaturan |
— |
— |
— |
✅ |
3.3 Fitur Sistem
- Autentikasi: Login/logout dengan role-based access (admin/penulis)
- Rate Limiting: Max 3 percobaan login dalam 5 menit per IP
- Remember Me: Cookie token 30 hari untuk auto-login
- CSRF Protection: Token regenerasi setiap submit form
- Visitor Tracking: Pencatatan kunjungan per halaman publik
- SEO: Meta title, description, keywords per berita/halaman
- RSS Feed:
/feed untuk berita terbaru
- Theme Picker: 9 tema warna header & footer
- Webhook Deploy:
POST /webhook?token=... untuk git pull + migrasi
- 404 Custom: Halaman error yang rapi
- Scroll to Top: Tombol floating di halaman publik
- Reverse Proxy: Mendeteksi IP asli via
X-Forwarded-For
4. Arsitektur Teknis
| Layer |
Teknologi |
| Bahasa |
PHP 8.2+ |
| Framework |
CodeIgniter 4.7 |
| Database |
PostgreSQL 15+ |
| Frontend |
Tailwind CSS v4 (CDN), DaisyUI, MDI Icons v7 |
| Editor |
TinyMCE 8 (self-hosted), sweEditor |
| Map |
Leaflet.js + OpenStreetMap |
| Web Server |
FrankenPHP (Docker) + openresty reverse proxy |
Pola Arsitektur
- MVC — Model-View-Controller
- Explicit Routing — Auto-routing dimatikan (
$routes->setAutoRoute(false))
- Auth Filter — Middleware
before untuk semua route admin
- 404 Override — Catch-all untuk halaman dengan path kustom
5. Struktur Database
| Tabel |
Deskripsi |
users |
Admin & penulis (bcrypt password) |
categories |
Kategori berita |
berita |
Artikel berita (tags, views) |
galleries |
Galeri media (gambar) |
menus |
Menu navigasi hierarkis |
pages |
Halaman statis (slug + path) |
settings |
Key-value pengaturan situs |
links |
Tautan eksternal (logo) |
visits |
Tracking kunjungan halaman |
albums |
Album foto |
album_photos |
Foto dalam album |
videos |
Video embed (YouTube/IG/TikTok) |
downloads |
Berkas unduhan |
slides |
Slide carousel beranda |
faqs |
FAQ accordion |
login_throttle |
Rate limiting login |
6. Endpoint API
| Method |
Endpoint |
Deskripsi |
| GET |
/feed |
RSS berita terbaru |
| GET |
/api |
API publik (JSON) |
| GET |
/admin/galeri/json/:num |
JSON gallery pagination |
| GET |
/admin/profile/data |
JSON data profil user |
| POST |
/webhook?token=... |
Git deploy + migrasi |
7. Keamanan
- CSRF: Cookie-based, regenerate setiap submit
- Password: bcrypt hashing via
password_hash()
- Input Validation: CI4 validation rules di semua form
- SQL Injection: CI4 Query Builder (prepared statements)
- XSS:
esc() helper di semua output view
- Rate Limiting:
login_throttle table, max 3 attempt / 5 menit
- Auth Filter: Middleware cek session & role
- Reverse Proxy:
proxyIPs config untuk X-Forwarded-For
Panduan Instalasi
Prasyarat
- PHP 8.2+
- PostgreSQL 15+
- Composer
- Git
Langkah Instalasi
# 1. Clone repository
git clone <repo-url>
cd CMS
# 2. Install dependencies
composer install
# 3. Salin dan sesuaikan environment
cp .env.example .env
# Edit .env: database credentials, WEBHOOK_TOKEN
# 4. Import database schema
psql -U postgres -d cms_pemerintah -f database/schema.sql
# 5. Jalankan migrations (jika ada yang belum)
# Migrations akan berjalan otomatis via webhook deploy
# 6. Set folder permissions
chmod -R 755 public/uploads
chmod -R 777 writable
# 7. Jalankan server
php spark serve
# atau gunakan FrankenPHP: ./frankenphp php-server
Default Login
| Username |
Password |
Role |
| admin |
admin123 |
admin |
Webhook Deploy
curl -X POST "https://domain.com/webhook?token=RAHASIA123"
Webhook akan menjalankan git pull, migrasi database, dan membersihkan direktori upload.
Struktur Direktori
CMS/
├── app/
│ ├── Config/ # Routes, Database, Security, Filters, dll
│ ├── Controllers/ # Admin (CRUD) + Public
│ ├── Filters/ # AuthFilter, ThrottleFilter
│ ├── Helpers/ # seo_helper (render_meta, tgl_indonesia)
│ ├── Models/ # 17 model files
│ └── Views/ # admin/ + public views
├── database/
│ ├── schema.sql # Full DDL + seed data
│ └── migrations/ # Incremental SQL files (001-010)
├── public/
│ ├── index.php # Entry point + CORS headers
│ ├── plugins/ # tinymce, sweeditor (self-hosted)
│ └── uploads/ # galeri, albums, downloads, settings, tautan
├── writable/ # logs, session, cache
├── .env.example # Template environment
└── README.md # Dokumentasi ini