2026-05-16

Tutorial Install OPENSid versi 2604 di Windows 1 Via Laragon

 

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: desamembangun

Simpan 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  : desamembangun

Kalau nanti Laragon belum mengenali opensid.test, biasanya cukup:

Stop All
Start All

di Laragon.