Release version 1.0.5

Chat Message Admin Improvements: 3 API endpoints, 9 page HTML split, chat-log UI with delete/confirm/pagination/filter/bulk delete

CI/CD Improvements: Go cache fix, lint script, Vite env cleanup, chat start_period 30s, nginx health check, log dump on fail
This commit is contained in:
zwitschi committed 2026-08-05 11:44:46 +02:00
1 parent ee16441b79
commit 084e694082
7 files changed
+53 -32

No files matched your search

+24 -5
View File
@@ -73,23 +73,42 @@ jobs:
env: env:
DOCKER_HOST: tcp://192.168.88.40:2375 DOCKER_HOST: tcp://192.168.88.40:2375
run: | run: |
# Wait for playout to stabilize (it may restart during init) # Wait for services to stabilize
sleep 20 sleep 20
curl -f http://192.168.88.40:3000/health || exit 1
# Check chat health
echo "Checking chat health..."
if ! curl -f http://192.168.88.40:3000/health; then
echo "Chat health check failed"
docker logs linearvoid-chat --tail 50
exit 1
fi
# Check nginx health
echo "Checking nginx health..."
if ! curl -f http://192.168.88.40:8080/; then
echo "Nginx health check failed"
docker logs linearvoid-nginx --tail 50
exit 1
fi
# Retry playout health check since it may still be initializing # Retry playout health check since it may still be initializing
echo "Checking playout health..."
for i in $(seq 1 6); do for i in $(seq 1 6); do
if docker exec linearvoid-playout curl -sf http://localhost:8081/health; then if docker exec linearvoid-playout curl -sf http://localhost:8081/health; then
echo "Playout is healthy" echo "Playout is healthy"
exit 0 break
fi fi
echo "Playout not ready yet (attempt $i/6), waiting 5s..." echo "Playout not ready yet (attempt $i/6), waiting 5s..."
sleep 5 sleep 5
done done
if ! docker exec linearvoid-playout curl -sf http://localhost:8081/health; then
echo "Playout failed to become healthy after 6 attempts" echo "Playout failed to become healthy after 6 attempts"
docker logs linearvoid-playout --tail 50 docker logs linearvoid-playout --tail 50
exit 1 exit 1
curl -f http://192.168.88.40:3000/health || exit 1 fi
docker exec linearvoid-playout curl -sf http://localhost:8081/health || exit 1
echo "All services healthy"
- name: Cleanup old images - name: Cleanup old images
env: env:
+3
View File
@@ -36,6 +36,9 @@ jobs:
with: with:
go-version: "1.22" go-version: "1.22"
cache: true cache: true
cache-dependency-path: |
backend/playout/go.sum
backend/chat/go.sum
- name: Validate Playlist Normalization - name: Validate Playlist Normalization
run: cd backend/playout && go run src/playlist.go playlist.txt || echo "Validation script not yet complete" run: cd backend/playout && go run src/playlist.go playlist.txt || echo "Validation script not yet complete"
+20 -22
View File
@@ -2,40 +2,38 @@
<!-- markdownlint-disable MD024 --> <!-- markdownlint-disable MD024 -->
## Unreleased ## [1.0.5] - 2026-08-05
### Added ### Added
- Documentation for Admin UI Media Library (arc42 updates, refined TODO, media DB model decisions per ADR-006). - `GET /api/admin/chat-log` endpoint with `?room=`, `?limit=`, `?before=`, `?username=`, `?text=` filter/pagination support.
- Started implementation of full Media CRUD + video duration extraction using ffprobe (Media Library - Full CRUD section). - `GET /api/admin/chat-log/:id` endpoint returning a single chat log entry as JSON.
- Added `/api/admin/media/{id}` GET/PUT/DELETE handlers for media metadata retrieval, updates, and file+record deletion. - `DELETE /api/admin/chat-log/:id` endpoint returning 204 No Content on success.
- Extended admin schedule and dashboard data endpoints with media duration totals, runtime strings, and media counts. - `DELETE /api/admin/chat-log/bulk` endpoint accepting `{"ids": [...]}` for bulk deletion (max 500).
- Added admin UI runtime display for schedule/dashboard plus media library edit/delete actions. - Chat Log admin tab with table, individual delete with confirmation dialog, pagination (prev/next), search/filter by room/username/text, select-all checkbox, and bulk delete button.
- Added a dedicated plain TypeScript admin module for tab navigation, media CRUD actions, schedule/system analytics refresh, and moderation workflows without Alpine dependencies. - Added `"lint": "tsc --noEmit"` script to `frontend/package.json`.
- Added resumable chunked admin media upload flow with upload-session endpoints and client progress indicators. - `/api/admin/media/{id}` GET/PUT/DELETE handlers for media metadata retrieval, updates, and file+record deletion.
- Expanded architecture documentation with scaling strategy, API surface reference, detailed video normalization spec, and Cloudflare configuration reference. - Resumable chunked admin media upload flow with upload-session endpoints and client progress indicators.
- Added `API.md`, `DEPLOYMENT.md`, `MONITORING.md`, and `SECURITY.md` as dedicated operational documentation guides. - Prometheus-format `/metrics` endpoint for chat runtime and admin-session monitoring.
- Dedicated operational documentation: `API.md`, `DEPLOYMENT.md`, `MONITORING.md`, `SECURITY.md`.
### Changed ### Changed
- Revised ADR-006 to reflect current implemented storage: PostgreSQL is the compose default and deployed primary backend, with SQLite retained as optional fallback. - Split `frontend/admin/index.html` into a template shell plus 9 per-tab page HTML files loaded dynamically via `loadPageContent` / `switchTab` / `bindPageEvents`.
- Updated chat runtime image to include ffmpeg/ffprobe for media duration probing on upload.
- Rebuilt viewer, admin, and admin-login pages around custom semantic class structures with accessibility-focused landmarks, tab semantics, and keyboard-focus behavior. - Rebuilt viewer, admin, and admin-login pages around custom semantic class structures with accessibility-focused landmarks, tab semantics, and keyboard-focus behavior.
- Replaced legacy and Tailwind-based stylesheet rules with a custom design-token CSS system covering responsive layouts, forms, tables, and reduced-motion behavior. - Replaced legacy and Tailwind-based stylesheet rules with a custom design-token CSS system covering responsive layouts, forms, tables, and reduced-motion behavior.
- Switched the frontend theme to dark-mode-first token defaults with a light-scheme override path for users who prefer light appearance. - Switched frontend theme to dark-mode-first token defaults with light-scheme override.
- Refactored the viewer page to a single header plus unified content layout with responsive video/chat split, mobile stacking, and chat panel toggle behavior. - Bumped chat healthcheck `start_period` from 10s to 30s in `docker-compose.prod.yml`.
- Code-split `hls.js` via lazy loading in the viewer bootstrap to shrink the main frontend bundle and isolate stream playback logic into a dedicated chunk. - CD workflow now verifies nginx (port 8080) + chat (3000) + playout (8081); dumps container logs for all failing services.
- Added navigation links in root README and architecture docs to the new API, deployment, monitoring, and security guide files. - Updated Prometheus scrape targets and Grafana dashboard queries to use live chat metrics.
### Fixed ### Fixed
- Started Admin UI Media Library backend implementation by adding the `Media` GORM model and AutoMigrate integration in chat startup. - Go module cache in CI now correctly references `backend/playout/go.sum` and `backend/chat/go.sum`.
- Implemented media upload duration probing with ffprobe and persisted media metadata to the database alongside filesystem storage.
- Updated media listing to read from the media table and return duration metadata with HH:MM:SS runtime formatting.
- Removed Tailwind and Alpine runtime/build dependencies from the frontend package configuration and eliminated Tailwind directives/warnings during production build.
- Enforced 2GB upload ceiling plus server-side media file type/size validation for admin uploads. - Enforced 2GB upload ceiling plus server-side media file type/size validation for admin uploads.
- Increased nginx `client_max_body_size` to allow resumable admin upload chunks and prevent `413 Content Too Large` responses. - Increased nginx `client_max_body_size` to allow resumable admin upload chunks without 413 errors.
- Removed legacy now-playing viewer UI elements that conflicted with the streamlined single-header layout. - Removed unused `data-admin-*` Vite env var attributes from admin HTML template.
- Removed Tailwind and Alpine runtime/build dependencies; eliminated Tailwind directives/warnings during production build.
## [1.0.3] - 2026-08-03 ## [1.0.3] - 2026-08-03
+1 -1
View File
@@ -7,7 +7,7 @@
[![Build Status](https://git.allucanget.biz/zwitschi/linearvoid/actions/workflows/ci.yml/badge.svg)](https://git.allucanget.biz/zwitschi/linearvoid/actions) [![Build Status](https://git.allucanget.biz/zwitschi/linearvoid/actions/workflows/ci.yml/badge.svg)](https://git.allucanget.biz/zwitschi/linearvoid/actions)
[![License](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) [![License](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
[![Gitea](https://img.shields.io/badge/Gitea-1.27.1-blue)](https://git.allucanget.biz) [![Gitea](https://img.shields.io/badge/Gitea-1.27.1-blue)](https://git.allucanget.biz)
[![Version](https://img.shields.io/badge/version-1.0.3-blue)](https://git.allucanget.biz/zwitschi/linearvoid/releases) [![Version](https://img.shields.io/badge/version-1.0.5-blue)](https://git.allucanget.biz/zwitschi/linearvoid/releases)
[![Release Notes](https://img.shields.io/badge/release-notes-green)](CHANGELOG.md) [![Release Notes](https://img.shields.io/badge/release-notes-green)](CHANGELOG.md)
## Architecture ## Architecture
+1 -1
View File
@@ -42,7 +42,7 @@ services:
interval: 10s interval: 10s
timeout: 5s timeout: 5s
retries: 5 retries: 5
start_period: 10s start_period: 30s
nginx: nginx:
image: git.allucanget.biz/zwitschi/linearvoid/nginx:latest image: git.allucanget.biz/zwitschi/linearvoid/nginx:latest
+1 -1
View File
@@ -8,7 +8,7 @@
<link rel="stylesheet" href="../src/style.css" /> <link rel="stylesheet" href="../src/style.css" />
</head> </head>
<body class="admin-body" data-admin-default-moderator="%VITE_PUBLIC_ADMIN_DEFAULT_MODERATOR%" data-admin-default-room="%VITE_PUBLIC_ADMIN_DEFAULT_ROOM%" data-admin-moderation-log-limit="%VITE_PUBLIC_ADMIN_MODERATION_LOG_LIMIT%"> <body class="admin-body">
<div class="admin-shell"> <div class="admin-shell">
<aside class="admin-sidebar" aria-label="Primary"> <aside class="admin-sidebar" aria-label="Primary">
<div class="brand-block"> <div class="brand-block">
+3 -2
View File
@@ -1,12 +1,13 @@
{ {
"name": "frontend", "name": "frontend",
"private": true, "private": true,
"version": "0.0.0", "version": "1.0.5",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",
"build": "tsc && vite build", "build": "tsc && vite build",
"preview": "vite preview" "preview": "vite preview",
"lint": "tsc --noEmit"
}, },
"devDependencies": { "devDependencies": {
"typescript": "~6.0.2", "typescript": "~6.0.2",