draft script PowerShell untuk Windows 11 + Laragon + OpenSID v2604.0.0.
Asumsi script ini:
- Laragon terinstall di C:\laragon
- Laragon Apache + MySQL sudah bisa jalan
- OpenSID akan dipasang di C:\laragon\www\opensid
- Domain lokal: http://opensid.test
- Database: opensid_umum
- User database: opensid_user
- Password database: desamembangunSimpan sebagai:
setup-opensid-v2604.ps1
Lalu jalankan PowerShell sebagai Administrator.
Script PowerShell
# setup-opensid-v2604.ps1
# Draft installer helper OpenSID v2604.0.0 untuk Windows 11 + Laragon
# Jalankan PowerShell sebagai Administrator
$ErrorActionPreference = "Stop"
# =========================
# KONFIGURASI
# =========================
$LaragonRoot = "C:\laragon"
$ProjectName = "opensid"
$Domain = "opensid.test"
$OpenSIDVersion = "v2604.0.0"
$OpenSIDZipUrl = "https://github.com/OpenSID/OpenSID/archive/refs/tags/$OpenSIDVersion.zip"
$DbName = "opensid_umum"
$DbUser = "opensid_user"
$DbPass = "desamembangun"
# Laragon default biasanya root tanpa password.
# Kalau root MySQL Laragon punya password, isi di sini.
$DbRootUser = "root"
$DbRootPass = ""
# Jika true, database lama dengan nama $DbName akan dihapus dan dibuat ulang.
$ResetDatabase = $true
# =========================
# FUNGSI BANTUAN
# =========================
function Write-Step($Text) {
Write-Host ""
Write-Host "=== $Text ===" -ForegroundColor Cyan
}
function Assert-Admin {
$currentIdentity = [Security.Principal.WindowsIdentity]::GetCurrent()
$principal = New-Object Security.Principal.WindowsPrincipal($currentIdentity)
$isAdmin = $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
if (-not $isAdmin) {
throw "Script harus dijalankan dari PowerShell Run as Administrator."
}
}
function Find-MySqlExe {
$mysqlCandidates = Get-ChildItem "$LaragonRoot\bin\mysql" -Recurse -Filter "mysql.exe" -ErrorAction SilentlyContinue |
Sort-Object FullName -Descending
if ($mysqlCandidates.Count -eq 0) {
throw "mysql.exe tidak ditemukan di $LaragonRoot\bin\mysql. Pastikan Laragon MySQL/MariaDB sudah terpasang."
}
return $mysqlCandidates[0].FullName
}
function Invoke-MySqlRoot($Sql) {
$mysqlExe = Find-MySqlExe
$args = @("-u", $DbRootUser)
if ($DbRootPass -ne "") {
$args += "-p$DbRootPass"
}
$Sql | & $mysqlExe @args
if ($LASTEXITCODE -ne 0) {
throw "Perintah MySQL gagal. Cek apakah MySQL Laragon sudah running dan password root benar."
}
}
function Ensure-HostsEntry {
$hostsPath = "$env:SystemRoot\System32\drivers\etc\hosts"
$hostsContent = Get-Content $hostsPath -Raw
if ($hostsContent -notmatch "(?m)^\s*127\.0\.0\.1\s+$([regex]::Escape($Domain))\s*$") {
Add-Content -Path $hostsPath -Value "`n127.0.0.1 $Domain"
Write-Host "Hosts entry ditambahkan: 127.0.0.1 $Domain"
} else {
Write-Host "Hosts entry sudah ada: $Domain"
}
}
function Write-ApacheVHost {
$sitesDir = Join-Path $LaragonRoot "etc\apache2\sites-enabled"
if (-not (Test-Path $sitesDir)) {
Write-Warning "Folder sites-enabled Laragon tidak ditemukan: $sitesDir"
Write-Warning "Kalau domain $Domain belum jalan, aktifkan Auto Virtual Hosts di Laragon atau buat vhost manual."
return
}
$projectPathApache = ($ProjectPath -replace "\\", "/")
$vhostPath = Join-Path $sitesDir "$Domain.conf"
$vhost = @"
<VirtualHost *:80>
ServerName $Domain
DocumentRoot "$projectPathApache"
<Directory "$projectPathApache">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
"@
Set-Content -Path $vhostPath -Value $vhost -Encoding ASCII
Write-Host "Apache vhost dibuat: $vhostPath"
}
# =========================
# MULAI
# =========================
Assert-Admin
$WwwRoot = Join-Path $LaragonRoot "www"
$ProjectPath = Join-Path $WwwRoot $ProjectName
$TempRoot = Join-Path $env:TEMP "opensid-setup"
$ZipPath = Join-Path $TempRoot "opensid-$OpenSIDVersion.zip"
$ExtractPath = Join-Path $TempRoot "extract"
Write-Step "Cek Laragon"
if (-not (Test-Path $LaragonRoot)) {
throw "Laragon tidak ditemukan di $LaragonRoot. Ubah variabel `$LaragonRoot di bagian atas script."
}
if (-not (Test-Path $WwwRoot)) {
throw "Folder www Laragon tidak ditemukan: $WwwRoot"
}
Write-Host "Laragon root : $LaragonRoot"
Write-Host "Project path : $ProjectPath"
Write-Step "Download OpenSID $OpenSIDVersion"
New-Item -ItemType Directory -Force -Path $TempRoot | Out-Null
if (Test-Path $ExtractPath) {
Remove-Item $ExtractPath -Recurse -Force
}
New-Item -ItemType Directory -Force -Path $ExtractPath | Out-Null
Invoke-WebRequest -Uri $OpenSIDZipUrl -OutFile $ZipPath
Write-Host "Downloaded: $ZipPath"
Write-Step "Extract OpenSID"
Expand-Archive -Path $ZipPath -DestinationPath $ExtractPath -Force
$ExtractedSource = Join-Path $ExtractPath "OpenSID-2604.0.0"
if (-not (Test-Path $ExtractedSource)) {
$ExtractedSource = Get-ChildItem $ExtractPath -Directory | Select-Object -First 1 -ExpandProperty FullName
}
if (-not (Test-Path (Join-Path $ExtractedSource "index.php"))) {
throw "Source OpenSID hasil extract tidak valid. index.php tidak ditemukan."
}
Write-Host "Extracted source: $ExtractedSource"
Write-Step "Siapkan folder project Laragon"
if (Test-Path $ProjectPath) {
$backupPath = "$ProjectPath-backup-$(Get-Date -Format 'yyyyMMdd-HHmmss')"
Rename-Item -Path $ProjectPath -NewName (Split-Path $backupPath -Leaf)
Write-Host "Folder lama di-backup menjadi: $backupPath"
}
New-Item -ItemType Directory -Force -Path $ProjectPath | Out-Null
Copy-Item -Path (Join-Path $ExtractedSource "*") -Destination $ProjectPath -Recurse -Force
Write-Host "OpenSID dicopy ke: $ProjectPath"
Write-Step "Buat .htaccess localhost"
$HtaccessPath = Join-Path $ProjectPath ".htaccess"
$Htaccess = @'
#============
# OpenSID .htaccess untuk localhost Laragon
# HTTPS redirect dimatikan
#============
RewriteEngine On
RewriteBase /
# Hilangkan index.php dari URL OpenSID
RewriteCond $1 !^(index\.php|resources|robots\.txt|favicon\.ico)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L,QSA]
# Cegah akses ke folder internal
RewriteRule ^(\.git|\.github) - [F,L]
RewriteRule ^(bin) - [F,L]
# Matikan directory listing
Options All -Indexes
# Paksa HTTPS dimatikan untuk localhost
# RewriteCond %{HTTPS} off
# RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Lindungi file tersembunyi
<FilesMatch "^\.">
Require all denied
</FilesMatch>
# Lindungi file sistem
<FilesMatch "^(composer.json|composer.lock|mitra|app_key|phpunit.xml|phpunit.xml.dist|rector)$">
Require all denied
</FilesMatch>
# Lindungi file arsip
<FilesMatch "(?i)\.(zip|rar)$">
Require all denied
</FilesMatch>
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access 1 year"
ExpiresByType image/jpg "access 1 year"
ExpiresByType image/jpeg "access 1 year"
ExpiresByType image/gif "access 1 year"
ExpiresByType image/png "access 1 year"
ExpiresByType image/webp "access 1 year"
ExpiresByType image/svg+xml "access 1 year"
ExpiresByType image/x-icon "access 1 year"
ExpiresByType text/css "access 1 year"
ExpiresByType application/javascript "access 1 year"
ExpiresByType application/x-javascript "access 1 year"
ExpiresByType application/pdf "access 1 year"
ExpiresByType application/font-woff "access 1 year"
ExpiresByType application/font-woff2 "access 1 year"
</IfModule>
'@
Set-Content -Path $HtaccessPath -Value $Htaccess -Encoding ASCII
Write-Step "Buat folder storage/cache"
$folders = @(
"storage\logs",
"storage\framework\cache",
"storage\framework\sessions",
"storage\framework\views",
"bootstrap\cache"
)
foreach ($folder in $folders) {
New-Item -ItemType Directory -Force -Path (Join-Path $ProjectPath $folder) | Out-Null
}
Write-Host "Folder storage/cache selesai."
Write-Step "Tambahkan hosts dan vhost Apache"
Ensure-HostsEntry
Write-ApacheVHost
Write-Step "Buat database OpenSID"
$createDbSql = ""
if ($ResetDatabase) {
$createDbSql += @"
DROP DATABASE IF EXISTS `$DbName`;
"@
}
$createDbSql += @"
CREATE DATABASE IF NOT EXISTS `$DbName` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER IF NOT EXISTS '$DbUser'@'localhost' IDENTIFIED BY '$DbPass';
ALTER USER '$DbUser'@'localhost' IDENTIFIED BY '$DbPass';
GRANT ALL PRIVILEGES ON `$DbName`.* TO '$DbUser'@'localhost';
FLUSH PRIVILEGES;
"@
Invoke-MySqlRoot $createDbSql
Write-Host "Database siap:"
Write-Host " DB Name : $DbName"
Write-Host " DB User : $DbUser"
Write-Host " DB Pass : $DbPass"
Write-Step "Buat shortcut desktop"
$desktop = [Environment]::GetFolderPath("Desktop")
$shortcutPath = Join-Path $desktop "OpenSID Installer.url"
$shortcut = @"
[InternetShortcut]
URL=http://$Domain/install
"@
Set-Content -Path $shortcutPath -Value $shortcut -Encoding ASCII
Write-Step "Selesai"
Write-Host "Sekarang lakukan ini:"
Write-Host "1. Pastikan Laragon Apache dan MySQL running."
Write-Host "2. Restart/Reload Apache dari Laragon."
Write-Host "3. Buka: http://$Domain/install"
Write-Host ""
Write-Host "Isi database installer OpenSID:"
Write-Host " Database host : localhost"
Write-Host " Database port : 3306"
Write-Host " Database name : $DbName"
Write-Host " Database user : $DbUser"
Write-Host " Database password : $DbPass"
Write-Host ""
Write-Host "Jika halaman belum terbuka, klik Stop All lalu Start All di Laragon."
Start-Process "http://$Domain/install"
Cara menjalankan
Buka PowerShell as Administrator, lalu masuk ke folder tempat script disimpan. Misalnya di Desktop:
cd $env:USERPROFILE\Desktop
Izinkan eksekusi script untuk sesi ini saja:
Set-ExecutionPolicy -Scope Process Bypass -Force
Jalankan:
.\setup-opensid-v2604.ps1
Setelah script selesai
Di installer OpenSID, isi database:
Database host : localhost
Database port : 3306
Database name : opensid_umum
Database user : opensid_user
Database password : desamembangunKalau nanti Laragon belum mengenali opensid.test, biasanya cukup:
Stop All
Start All
di Laragon.