93 lines
4.4 KiB
Text
93 lines
4.4 KiB
Text
@page
|
|
@model PlanTempusAdmin.Pages.Setup.DatabaseModel
|
|
@{
|
|
ViewData["Title"] = "Database Schema";
|
|
}
|
|
|
|
<div class="page-header">
|
|
<h1 class="page-title">Database Schema</h1>
|
|
<p class="page-subtitle">PostgreSQL schema til backup logs</p>
|
|
</div>
|
|
|
|
<div class="card">
|
|
<div class="card-header">
|
|
backup-logs.sql
|
|
<button onclick="copyScript('sql-schema')" style="float: right; background: var(--accent); color: var(--background); border: none; padding: 4px 12px; cursor: pointer; font-size: 11px;">
|
|
Kopier
|
|
</button>
|
|
</div>
|
|
<div class="card-body">
|
|
<pre id="sql-schema" style="max-height: 600px; overflow: auto;"><code class="language-sql">@Model.SqlSchema</code></pre>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="card mt-2">
|
|
<div class="card-header">Database Bruger Setup</div>
|
|
<div class="card-body">
|
|
<p>Opret en dedikeret bruger til backup scriptet:</p>
|
|
<pre id="user-setup"><code class="language-sql">-- Opret bruger til backup script
|
|
CREATE USER backup_writer WITH PASSWORD 'your_secure_password_here';
|
|
|
|
-- Giv rettigheder
|
|
GRANT CONNECT ON DATABASE plantempus TO backup_writer;
|
|
GRANT USAGE ON SCHEMA public TO backup_writer;
|
|
GRANT INSERT, UPDATE ON backup_logs TO backup_writer;
|
|
GRANT USAGE, SELECT ON SEQUENCE backup_logs_id_seq TO backup_writer;
|
|
|
|
-- Giv læseadgang (brug din eksisterende app-bruger)
|
|
-- GRANT SELECT ON backup_logs TO your_app_user;
|
|
-- GRANT SELECT ON backup_repository_summary TO your_app_user;</code></pre>
|
|
<button onclick="copyScript('user-setup')" style="background: var(--accent); color: var(--background); border: none; padding: 4px 12px; cursor: pointer; font-size: 11px; margin-top: 8px;">
|
|
Kopier bruger setup
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="card mt-2">
|
|
<div class="card-header">Tabel Struktur</div>
|
|
<div class="card-body">
|
|
<table class="table">
|
|
<thead>
|
|
<tr>
|
|
<th>Kolonne</th>
|
|
<th>Type</th>
|
|
<th>Beskrivelse</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr><td><code>id</code></td><td>SERIAL</td><td>Primary key</td></tr>
|
|
<tr><td><code>started_at</code></td><td>TIMESTAMP</td><td>Backup start tidspunkt</td></tr>
|
|
<tr><td><code>completed_at</code></td><td>TIMESTAMP</td><td>Backup slut tidspunkt</td></tr>
|
|
<tr><td><code>duration_ms</code></td><td>INTEGER</td><td>Varighed i millisekunder</td></tr>
|
|
<tr><td><code>backup_type</code></td><td>VARCHAR(50)</td><td>'forgejo_repos', 'postgres_db', etc.</td></tr>
|
|
<tr><td><code>source_name</code></td><td>VARCHAR(255)</td><td>Repository eller database navn</td></tr>
|
|
<tr><td><code>source_path</code></td><td>VARCHAR(500)</td><td>Fuld sti på serveren</td></tr>
|
|
<tr><td><code>destination</code></td><td>VARCHAR(50)</td><td>'azure_blob', 's3', 'local', 'sftp'</td></tr>
|
|
<tr><td><code>remote_path</code></td><td>VARCHAR(500)</td><td>Sti på destination</td></tr>
|
|
<tr><td><code>status</code></td><td>VARCHAR(20)</td><td>'running', 'success', 'failed', 'partial'</td></tr>
|
|
<tr><td><code>size_bytes</code></td><td>BIGINT</td><td>Backup størrelse</td></tr>
|
|
<tr><td><code>file_count</code></td><td>INTEGER</td><td>Antal filer i backup</td></tr>
|
|
<tr><td><code>error_message</code></td><td>TEXT</td><td>Fejlbesked hvis fejlet</td></tr>
|
|
<tr><td><code>error_code</code></td><td>VARCHAR(50)</td><td>Fejlkode</td></tr>
|
|
<tr><td><code>retry_count</code></td><td>INTEGER</td><td>Antal forsøg</td></tr>
|
|
<tr><td><code>hostname</code></td><td>VARCHAR(100)</td><td>Server hostname</td></tr>
|
|
<tr><td><code>script_version</code></td><td>VARCHAR(20)</td><td>Script version</td></tr>
|
|
<tr><td><code>checksum</code></td><td>VARCHAR(64)</td><td>SHA256 checksum</td></tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
|
|
@section Scripts {
|
|
<script>
|
|
function copyScript(elementId) {
|
|
const element = document.getElementById(elementId);
|
|
const text = element.textContent || element.innerText;
|
|
navigator.clipboard.writeText(text).then(() => {
|
|
alert('Kopieret til udklipsholder!');
|
|
}).catch(err => {
|
|
console.error('Kunne ikke kopiere:', err);
|
|
});
|
|
}
|
|
</script>
|
|
}
|