WP-40/41/42: dashboard, security hardening, deployment and operations docs

Dashboard endpoint and page aggregating inventory, vulnerabilities, cluster
health, backups and recent jobs. Security headers (CSP, nosniff, DENY,
referrer policy), 1 MB body limit, configurable login rate limit, audit
steps in CI. Installer script, systemd unit, install/architecture docs.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Dennis Nemec
2026-09-02 23:26:01 +02:00
parent a89395ae18
commit 9234e1ba47
29 changed files with 851 additions and 21 deletions

View File

@ -10,7 +10,7 @@ async function loginAdmin(page: Page) {
test('admin saves SMTP settings and a schedule', async ({ page }) => {
await loginAdmin(page)
await page.getByRole('link', { name: 'Settings' }).click()
await page.getByRole('navigation').getByRole('link', { name: 'Settings' }).click()
await page.getByLabel('SMTP host').fill('mail.example.com')
await page.getByLabel('Port').fill('587')
await page.getByLabel('Username').fill('bot')
@ -31,7 +31,7 @@ test('admin saves SMTP settings and a schedule', async ({ page }) => {
test('admin runs a job manually and sees the log', async ({ page }) => {
await loginAdmin(page)
await page.getByRole('link', { name: 'Jobs' }).click()
await page.getByRole('navigation').getByRole('link', { name: 'Jobs' }).click()
await page.getByLabel('Job').selectOption('package_refresh')
await page.getByRole('button', { name: 'Run now' }).click()
const row = page.getByRole('row', { name: /package_refresh/ }).first()