Admin UI
Admin UI
Web dashboard for Pvdify at pvdify.win.
Overview
The Admin UI provides a visual interface for managing apps, releases, config, and domains. Built with Svelte and SvelteKit.
Access
URL: https://pvdify.win
Authentication via Cloudflare Access:
- Email OTP
- GitHub OAuth (planned)
Features
Dashboard
Home view showing:
- All apps with status indicators
- Recent deployments
- System health
- Quick actions
┌──────────────────────────────────────────────────────────┐│ Pvdify [user@email] │├──────────────────────────────────────────────────────────┤│ ││ Apps (5) [+ New App] ││ ┌────────────────────────────────────────────────────┐ ││ │ ● myapp production v42 running │ ││ │ ● myapp-staging staging v15 running │ ││ │ ○ myapp-pr-123 preview v1 deploying │ ││ │ ● api-service production v8 running │ ││ │ ● worker-service production v12 running │ ││ └────────────────────────────────────────────────────┘ ││ ││ Recent Activity ││ • myapp deployed v42 (5 min ago) ││ • api-service config updated (1 hour ago) ││ • myapp-pr-123 preview created (2 hours ago) ││ │└──────────────────────────────────────────────────────────┘App Detail
Per-app management:
┌──────────────────────────────────────────────────────────┐│ ← Back myapp [Deploy] [⚙️] │├──────────────────────────────────────────────────────────┤│ ││ Status: ● Running ││ Environment: production ││ Image: ghcr.io/org/app:v1.2.3 ││ Release: v42 (deployed 5 minutes ago) ││ ││ ┌─────────┬─────────┬─────────┬─────────┬─────────┐ ││ │ Overview│ Releases│ Config │ Domains │ Logs │ ││ └─────────┴─────────┴─────────┴─────────┴─────────┘ ││ ││ Processes ││ ┌────────────────────────────────────────────────────┐ ││ │ web.1 ● running 2h uptime [Restart] │ ││ │ web.2 ● running 2h uptime [Restart] │ ││ │ worker.1 ● running 2h uptime [Restart] │ ││ └────────────────────────────────────────────────────┘ ││ [Scale Processes] ││ ││ Domains ││ • myapp.com (SSL ✓) ││ • www.myapp.com (SSL ✓) ││ [+ Add Domain] ││ │└──────────────────────────────────────────────────────────┘Releases
Release history with rollback:
┌──────────────────────────────────────────────────────────┐│ Releases │├──────────────────────────────────────────────────────────┤│ ││ v42 ● Active [Current] ││ ghcr.io/org/app:v1.2.3 ││ Deployed by gh-actions • 5 minutes ago ││ ││ v41 [Rollback] ││ ghcr.io/org/app:v1.2.2 ││ Deployed by user@email • 1 day ago ││ ││ v40 [Rollback] ││ ghcr.io/org/app:v1.2.1 ││ Deployed by gh-actions • 3 days ago ││ │└──────────────────────────────────────────────────────────┘Config Editor
Environment variable management:
┌──────────────────────────────────────────────────────────┐│ Config [+ Add Var] │├──────────────────────────────────────────────────────────┤│ ││ NODE_ENV production [Edit] ││ DATABASE_URL postgres://... [Edit] ││ API_KEY ●●●●●●●● (secret) [Edit] ││ REDIS_URL redis://... [Edit] ││ ││ Version: v3 (updated 1 hour ago) ││ [View History] ││ │└──────────────────────────────────────────────────────────┘Config Versions History
View and restore previous config versions:
┌──────────────────────────────────────────────────────────┐│ Config History [Close] │├──────────────────────────────────────────────────────────┤│ ││ v3 ● Current 2026-01-05 10:30 [Restore] ││ Changes: API_KEY, REDIS_URL ││ ││ v2 2026-01-03 10:00 [Restore] ││ Changes: DATABASE_URL ││ ││ v1 2026-01-01 10:00 [Restore] ││ Changes: NODE_ENV ││ │└──────────────────────────────────────────────────────────┘Click View History in the Config tab to see all versions with timestamps and change lists. Click Restore to revert to a previous configuration.
Log Viewer
Real-time log streaming:
┌──────────────────────────────────────────────────────────┐│ Logs [All ▼] [Follow ✓] [Download] │├──────────────────────────────────────────────────────────┤│ ││ 2026-01-05 10:30:01 [web.1] Server started on :3001 ││ 2026-01-05 10:30:02 [web.1] Connected to database ││ 2026-01-05 10:30:05 [web.1] GET /health 200 2ms ││ 2026-01-05 10:30:10 [web.2] Server started on :3001 ││ 2026-01-05 10:30:15 [worker.1] Processing job abc123 ││ 2026-01-05 10:30:20 [web.1] GET /api/users 200 45ms ││ █ ││ │└──────────────────────────────────────────────────────────┘Domain Management
┌──────────────────────────────────────────────────────────┐│ Domains [+ Add Domain] │├──────────────────────────────────────────────────────────┤│ ││ myapp.com ││ Status: ● Active SSL: ✓ Full (strict) ││ DNS: CNAME → tunnel.cfargotunnel.com ││ [Verify] [Remove] ││ ││ www.myapp.com ││ Status: ● Active SSL: ✓ Full (strict) ││ DNS: CNAME → tunnel.cfargotunnel.com ││ [Verify] [Remove] ││ │└──────────────────────────────────────────────────────────┘Deployment
Deploy Modal
One-click deploy from UI:
┌────────────────────────────────────────┐│ Deploy myapp │├────────────────────────────────────────┤│ ││ Image: ││ ┌──────────────────────────────────┐ ││ │ ghcr.io/org/app:v1.2.4 │ ││ └──────────────────────────────────┘ ││ ││ Recent images: ││ • ghcr.io/org/app:v1.2.3 ││ • ghcr.io/org/app:v1.2.2 ││ ││ [Cancel] [Deploy] ││ │└────────────────────────────────────────┘Scale Modal
Adjust process counts:
┌────────────────────────────────────────┐│ Scale Processes │├────────────────────────────────────────┤│ ││ Web: [2] [▲] [▼] ││ Worker: [1] [▲] [▼] ││ ││ Resource limits: ││ Memory: 512M per process ││ CPU: 0.5 per process ││ ││ [Cancel] [Scale] ││ │└────────────────────────────────────────┘Click Scale Processes in the app detail view to adjust the number of running instances for each process type.
Technical Stack
| Component | Technology |
|---|---|
| Framework | SvelteKit |
| Styling | Tailwind CSS |
| Icons | Lucide |
| Auth | Cloudflare Access |
| API | pvdifyd REST API |
| Real-time | Server-Sent Events |
Development
# Clone and installgit clone https://github.com/pvdify/admin-uicd admin-uinpm install
# Development servernpm run dev
# Build for productionnpm run build
# Deploy to production (on VPS)systemctl restart pvdifydHosting
Served by pvdifyd as static files:
- Source:
/opt/pvdify/admin-ui/dist/ - Domain:
pvdify.win(via Cloudflare Tunnel) - Access: Cloudflare Access (email OTP)
- Deployment: Build locally, restart pvdifyd
# Buildcd /opt/pvdify/admin-uinpm run build
# Restart pvdifyd to serve new static filessystemctl restart pvdifyd