Self-contained HTTP/HTTPS/TCP/UDP reverse proxy manager written in Go, with SQLite storage, a Bootstrap 5 admin UI (Go templates, no JS framework), and a REST API under /api/v1. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QTXFrNP1imCW7jtfL5SZrw
92 lines
4.4 KiB
HTML
92 lines
4.4 KiB
HTML
{{define "settings"}}{{template "header" .}}
|
|
{{$s := .Data}}
|
|
<div class="row g-3">
|
|
<div class="col-lg-7">
|
|
<div class="card mb-3">
|
|
<div class="card-header">Let's Encrypt / ACME</div>
|
|
<div class="card-body">
|
|
<form method="post" action="/settings">
|
|
{{template "csrf_field" .CSRFToken}}
|
|
<div class="row g-3">
|
|
<div class="col-md-6">
|
|
<label class="form-label">Contact Email</label>
|
|
<input class="form-control" name="acme_email" value="{{$s.ACMEEmail}}">
|
|
</div>
|
|
<div class="col-md-6">
|
|
<label class="form-label">Renewal Window (days before expiry)</label>
|
|
<input class="form-control" name="acme_renewal_window_days" value="{{$s.ACMERenewalWindowDays}}">
|
|
</div>
|
|
<div class="col-md-6">
|
|
<div class="form-check form-switch mt-4">
|
|
<input class="form-check-input" type="checkbox" name="acme_staging" id="staging" {{if $s.ACMEStaging}}checked{{end}}>
|
|
<label class="form-check-label" for="staging">Use Let's Encrypt staging environment</label>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-12">
|
|
<label class="form-label">Certificate Storage Path</label>
|
|
<input class="form-control" name="cert_storage_path" value="{{$s.CertStoragePath}}">
|
|
</div>
|
|
<div class="col-md-12">
|
|
<label class="form-label">Trusted Proxy Networks (CIDR, one per line — only these may set X-Forwarded-For)</label>
|
|
<textarea class="form-control" name="trusted_proxy_cidrs" rows="3">{{join $s.TrustedProxyCIDRs "\n"}}</textarea>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<label class="form-label">Log Retention (days)</label>
|
|
<input class="form-control" name="log_retention_days" value="{{$s.LogRetentionDays}}">
|
|
</div>
|
|
</div>
|
|
<hr>
|
|
<h6>Backups</h6>
|
|
<div class="row g-3">
|
|
<div class="col-md-4">
|
|
<div class="form-check form-switch mt-4">
|
|
<input class="form-check-input" type="checkbox" name="backup_enabled" id="backupEn" {{if $s.BackupEnabled}}checked{{end}}>
|
|
<label class="form-check-label" for="backupEn">Automatic backups enabled</label>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-4">
|
|
<label class="form-label">Interval (hours)</label>
|
|
<input class="form-control" name="backup_interval_hours" value="{{$s.BackupIntervalHours}}">
|
|
</div>
|
|
<div class="col-md-4">
|
|
<label class="form-label">Keep last N backups</label>
|
|
<input class="form-control" name="backup_retention_count" value="{{$s.BackupRetentionCount}}">
|
|
</div>
|
|
<div class="col-12">
|
|
<label class="form-label">Backup Directory</label>
|
|
<input class="form-control" name="backup_path" value="{{$s.BackupPath}}">
|
|
</div>
|
|
</div>
|
|
<div class="mt-4"><button class="btn btn-primary"><i class="bi bi-check-lg"></i> Save Settings</button></div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="card mb-3">
|
|
<div class="card-header">Manual Backup</div>
|
|
<div class="card-body">
|
|
<form method="post" action="/settings/backup">
|
|
{{template "csrf_field" .CSRFToken}}
|
|
<button class="btn btn-outline-primary"><i class="bi bi-download"></i> Backup Now</button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-lg-5">
|
|
<div class="card mb-3">
|
|
<div class="card-header">Administrator Account</div>
|
|
<div class="card-body">
|
|
<form method="post" action="/settings/password">
|
|
{{template "csrf_field" .CSRFToken}}
|
|
<div class="mb-3"><label class="form-label">Current Password</label><input type="password" class="form-control" name="current_password" required></div>
|
|
<div class="mb-3"><label class="form-label">New Password</label><input type="password" class="form-control" name="new_password" minlength="8" required></div>
|
|
<div class="mb-3"><label class="form-label">Confirm New Password</label><input type="password" class="form-control" name="confirm_password" minlength="8" required></div>
|
|
<button class="btn btn-primary"><i class="bi bi-key"></i> Change Password</button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{{template "footer" .}}{{end}}
|