Initial vibeproxy implementation

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
This commit is contained in:
2026-08-17 10:28:59 -05:00
co-authored by Claude Sonnet 5
commit ba1f7c4c03
105 changed files with 9142 additions and 0 deletions
+51
View File
@@ -0,0 +1,51 @@
{{define "logs"}}{{template "header" .}}
{{$d := .Data}}
<ul class="nav nav-pills mb-3">
<li class="nav-item"><a class="nav-link active" href="/logs">Requests</a></li>
<li class="nav-item"><a class="nav-link" href="/logs/audit">Audit</a></li>
</ul>
<form method="get" action="/logs" class="row g-2 mb-3">
<div class="col-auto">
<input type="text" class="form-control" name="q" value="{{$d.Query}}" placeholder="Search host / path / IP…">
</div>
<div class="col-auto">
<input type="text" class="form-control" name="status" value="{{if $d.Status}}{{$d.Status}}{{end}}" placeholder="Status code">
</div>
<div class="col-auto"><button class="btn btn-outline-primary">Filter</button></div>
</form>
<div class="card">
<div class="table-responsive">
<table class="table table-sm align-middle mb-0">
<thead class="table-light">
<tr><th>Time</th><th>Proxy Host</th><th>Client IP</th><th>Method</th><th>Host</th><th>Path</th><th>Status</th><th>Size</th><th>Backend</th><th>ms</th><th>User Agent</th></tr>
</thead>
<tbody>
{{range $d.Logs}}
<tr>
<td>{{fmtTime .Timestamp}}</td>
<td>{{.ProxyHostName}}</td>
<td>{{.ClientIP}}</td>
<td>{{.Method}}</td>
<td>{{.Host}}</td>
<td class="text-truncate" style="max-width:16rem">{{.Path}}</td>
<td class="{{statusClass .Status}}">{{.Status}}</td>
<td>{{.ResponseSize}}</td>
<td>{{.Backend}}</td>
<td>{{.ResponseTimeMS}}</td>
<td class="text-truncate" style="max-width:12rem">{{.UserAgent}}</td>
</tr>
{{else}}
<tr><td colspan="11" class="text-center text-secondary py-4">No requests logged yet.</td></tr>
{{end}}
</tbody>
</table>
</div>
</div>
{{if gt $d.TotalPages 1}}
<nav class="mt-3"><ul class="pagination pagination-sm">
{{range $i := iterate $d.TotalPages}}
<li class="page-item {{if eq (add $i 1) $d.Page}}active{{end}}"><a class="page-link" href="/logs?page={{add $i 1}}&q={{$d.Query}}">{{add $i 1}}</a></li>
{{end}}
</ul></nav>
{{end}}
{{template "footer" .}}{{end}}