docs(dashboard): Phase 5 P1 — fix port/endpoint drift, dedupe deployment docs
Closes the Phase 5 P1 doc-drift checkbox and REVIEW_ACTIONS #5. The 3000-vs-3049 confusion came from prose claims in three docs that each picked a different "right" answer. The truth is: the web container listens on :3000; docker-compose maps `127.0.0.1:3049:3000`; production is fronted by Traefik on `https://devops.bytelyst.com`. Encoding that explicitly so future readers don't have to dig through compose files: - DEPLOYMENT.md becomes canonical. Its content is now the (more accurate) old DEPLOYMENT_GUIDE.md merged with a "Ports — quick reference" table covering Local dev / Docker Compose / Production Traefik, plus a Local-development section for `pnpm dev`. - DEPLOYMENT_GUIDE.md → 5-line redirect stub pointing at DEPLOYMENT.md (kept for `deploy.sh` and any external links). - deploy.sh updated to point at DEPLOYMENT.md. - README.md "Web port: 3000" line rewritten to spell out container vs Compose-host vs dev-mode and link to the port table. - ENDPOINTS.md gets a top-of-file note: every `localhost:3000` URL in that file is the `pnpm dev` workflow; substitute `:3049` for the Dockerized stack. - REVIEW_ACTIONS.md #5 marked RESOLVED with the rationale. No code, behavior, lint, or test changes. Generated with [Devin](https://cli.devin.ai/docs) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
parent
3fc471e880
commit
824f31586a
@ -1,106 +1,365 @@
|
|||||||
# DevOps Dashboard Deployment Guide
|
# DevOps & Admin Dashboard Deployment Guide
|
||||||
|
|
||||||
## Current Status
|
> Canonical deployment doc for `dashboard/`. The previous `DEPLOYMENT_GUIDE.md`
|
||||||
|
> has been folded into this file; it remains as a one-line redirect for
|
||||||
|
> backwards compatibility with `deploy.sh` and external links.
|
||||||
|
|
||||||
The DevOps dashboard has been significantly enhanced with production-ready features, but deployment requires resolving workspace dependencies.
|
## Overview
|
||||||
|
|
||||||
## Dependency Issues
|
This guide covers deploying both the DevOps Dashboard and Platform Admin Dashboard using the existing Traefik gateway infrastructure, following the same pattern as the trading dashboard (https://invttrdg.bytelyst.com).
|
||||||
|
|
||||||
The dashboard currently depends on workspace packages from `learning_ai_common_plat`:
|
## Public URLs
|
||||||
- `@bytelyst/config` - Configuration management
|
|
||||||
- `@bytelyst/auth` - Authentication utilities
|
|
||||||
- `@bytelyst/cosmos` - Cosmos DB client
|
|
||||||
- `@bytelyst/errors` - Error handling
|
|
||||||
- `@bytelyst/react-auth` - React auth context
|
|
||||||
- `@bytelyst/telemetry-client` - Telemetry
|
|
||||||
|
|
||||||
## Deployment Options
|
- **DevOps Dashboard**: `https://devops.bytelyst.com`
|
||||||
|
- **Admin Dashboard**: `https://admin.bytelyst.com`
|
||||||
|
- **API Gateway**: `https://api.bytelyst.com`
|
||||||
|
- Platform API: `https://api.bytelyst.com/platform/api`
|
||||||
|
- DevOps API: `https://api.bytelyst.com/api/devops`
|
||||||
|
|
||||||
### Option 1: Deploy with Common Platform (Recommended)
|
## Ports — quick reference
|
||||||
|
|
||||||
**Prerequisites:**
|
The web container always listens on **3000** internally; what changes is what
|
||||||
1. Ensure `learning_ai_common_plat` packages are built and available
|
the host exposes. Memorize the column for the deployment mode you're in:
|
||||||
2. Configure npm registry to point to local package registry
|
|
||||||
3. Use the provided install scripts
|
| Mode | Web (host) | Backend (host) | Notes |
|
||||||
|
|-------------------------------------|--------------------|-------------------|--------------------------------------------------------------------|
|
||||||
|
| Local dev (`pnpm dev`) | `localhost:3000` | `localhost:4004` | Next listens directly on 3000. |
|
||||||
|
| Docker Compose (this repo) | `localhost:3049` | `localhost:4004` | `docker-compose.yml` maps `127.0.0.1:3049:3000` (loopback only). |
|
||||||
|
| Production (Traefik) | `https://devops.bytelyst.com` | `https://api.bytelyst.com/api/devops` | Traefik label `loadbalancer.server.port=3000` targets the container port. |
|
||||||
|
|
||||||
|
Whenever a doc says "the dashboard runs on port 3000", it means the **container
|
||||||
|
port** seen by Traefik / Next dev mode — not the host port for the deployed
|
||||||
|
stack. Use the table above instead of relying on prose.
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
```
|
||||||
|
Internet → Traefik Gateway → Services
|
||||||
|
├─ DevOps Web (container :3000, host :3049)
|
||||||
|
├─ DevOps Backend (:4004)
|
||||||
|
├─ Admin Web (:3001)
|
||||||
|
├─ Platform Service (:4003)
|
||||||
|
└─ Trading Dashboard (:3085)
|
||||||
|
```
|
||||||
|
|
||||||
|
- **Traefik**: API gateway and reverse proxy.
|
||||||
|
- **Docker network**: All services connect via `learning_ai_common_plat_default`.
|
||||||
|
- **Domain routing**: Traefik routes by host header.
|
||||||
|
- **SSL/TLS**: Managed by Traefik with Let's Encrypt.
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
1. Platform stack running with Traefik gateway.
|
||||||
|
2. Docker and Docker Compose installed.
|
||||||
|
3. Domain names configured with DNS pointing to your server.
|
||||||
|
4. Azure Cosmos DB account (shared with platform-service).
|
||||||
|
5. Platform Service running and accessible.
|
||||||
|
|
||||||
|
## Quick Start
|
||||||
|
|
||||||
|
### 1. Start the platform stack (if not running)
|
||||||
|
|
||||||
**Steps:**
|
|
||||||
```bash
|
```bash
|
||||||
cd /opt/bytelyst/learning_ai_devops_tools/dashboard
|
cd /opt/bytelyst/learning_ai_common_plat
|
||||||
|
|
||||||
# Install dependencies with common platform
|
|
||||||
pnpm install:common-plat
|
|
||||||
|
|
||||||
# Build both backend and web
|
|
||||||
pnpm build
|
|
||||||
|
|
||||||
# Deploy with Docker Compose
|
|
||||||
docker-compose up -d
|
docker-compose up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
### Option 2: Deploy Standalone (Simplified)
|
### 2. Deploy the dashboards
|
||||||
|
|
||||||
**Prerequisites:**
|
```bash
|
||||||
1. Remove workspace dependencies
|
cd /opt/bytelyst/learning_ai_devops_tools/dashboard
|
||||||
2. Implement simplified auth/config/cosmos layers
|
./deploy.sh
|
||||||
3. Set up environment variables
|
```
|
||||||
|
|
||||||
**Environment Variables Required:**
|
This will:
|
||||||
```env
|
- Deploy the DevOps Dashboard (backend + web)
|
||||||
|
- Deploy the Admin Dashboard via the platform stack
|
||||||
|
- Run health checks
|
||||||
|
- Print deployment information
|
||||||
|
|
||||||
|
## Local development
|
||||||
|
|
||||||
|
If you only need a non-containerized iteration loop (no Traefik, no Docker):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /opt/bytelyst/learning_ai_devops_tools/dashboard
|
||||||
|
|
||||||
|
# Resolve workspace deps
|
||||||
|
pnpm install:common-plat # uses sibling learning_ai_common_plat checkout
|
||||||
|
# or
|
||||||
|
pnpm install:gitea # uses local Gitea registry at localhost:3300
|
||||||
|
|
||||||
|
pnpm dev # backend on 4004, web on 3000 (NOT 3049)
|
||||||
|
```
|
||||||
|
|
||||||
|
Required env vars are documented under **Environment Configuration** below; for
|
||||||
|
local dev a minimal `.env` with `JWT_SECRET`, `COSMOS_*`, and
|
||||||
|
`PLATFORM_SERVICE_URL` is enough.
|
||||||
|
|
||||||
|
## Manual Docker deployment
|
||||||
|
|
||||||
|
### Deploy DevOps Dashboard
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /opt/bytelyst/learning_ai_devops_tools/dashboard
|
||||||
|
docker-compose up -d --build
|
||||||
|
```
|
||||||
|
|
||||||
|
### Deploy Admin Dashboard
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /opt/bytelyst/learning_ai_common_plat
|
||||||
|
docker-compose up -d admin-web
|
||||||
|
```
|
||||||
|
|
||||||
|
## Environment Configuration
|
||||||
|
|
||||||
|
### DevOps Dashboard (`.env`)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Backend
|
||||||
PORT=4004
|
PORT=4004
|
||||||
PLATFORM_SERVICE_URL=http://localhost:4003
|
PLATFORM_SERVICE_URL=http://platform-service:4003
|
||||||
COSMOS_ENDPOINT=https://your-cosmos-account.documents.azure.com:443/
|
COSMOS_ENDPOINT=https://your-cosmos-account.documents.azure.com:443/
|
||||||
COSMOS_KEY=your-cosmos-primary-key
|
COSMOS_KEY=your-cosmos-primary-key
|
||||||
COSMOS_DATABASE=bytelyst-platform
|
COSMOS_DATABASE=bytelyst-platform
|
||||||
JWT_SECRET=your-jwt-signing-secret
|
JWT_SECRET=your-production-jwt-secret
|
||||||
CSRF_SECRET=your-csrf-secret-change-in-production
|
CSRF_SECRET=your-production-csrf-secret
|
||||||
|
ENCRYPTION_KEY=your-production-encryption-key
|
||||||
|
PRODUCT_ID=bytelyst-devops
|
||||||
|
PRODUCT_NAME=ByteLyst DevOps Dashboard
|
||||||
|
|
||||||
|
# Azure Key Vault (optional)
|
||||||
|
AZURE_TENANT_ID=your-tenant-id
|
||||||
|
AZURE_CLIENT_ID=your-client-id
|
||||||
|
AZURE_CLIENT_SECRET=your-client-secret
|
||||||
|
AZURE_KEY_VAULT_URL=https://your-keyvault.vault.azure.net/
|
||||||
|
|
||||||
|
# Frontend
|
||||||
|
NEXT_PUBLIC_DEVOPS_API_URL=https://api.bytelyst.com/devops
|
||||||
|
NEXT_PUBLIC_PLATFORM_URL=https://api.bytelyst.com/platform/api
|
||||||
|
NEXT_PUBLIC_ADMIN_WEB_URL=https://admin.bytelyst.com
|
||||||
|
NEXT_PUBLIC_PRODUCT_ID=bytelyst-devops
|
||||||
|
NEXT_PUBLIC_PRODUCT_NAME=ByteLyst DevOps Dashboard
|
||||||
```
|
```
|
||||||
|
|
||||||
**Steps:**
|
### Platform Dashboard (`.env`)
|
||||||
|
|
||||||
|
Add to your platform `.env`:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd /opt/bytelyst/learning_ai_devops_tools/dashboard/backend
|
# Admin Web Dashboard
|
||||||
npm install
|
NEXT_PUBLIC_PLATFORM_URL=https://api.bytelyst.com/platform/api
|
||||||
npm run build
|
NEXT_PUBLIC_DEVOPS_WEB_URL=https://devops.bytelyst.com
|
||||||
npm start
|
|
||||||
|
|
||||||
# In another terminal:
|
|
||||||
cd /opt/bytelyst/learning_ai_devops_tools/dashboard/web
|
|
||||||
npm install
|
|
||||||
npm run build
|
|
||||||
npm start
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Option 3: Deploy to Production Server
|
## Traefik Configuration
|
||||||
|
|
||||||
**Prerequisites:**
|
Both dashboards use Traefik labels for routing.
|
||||||
1. Production server with Node.js 22+
|
|
||||||
2. Azure Cosmos DB account
|
|
||||||
3. Platform service instance
|
|
||||||
4. Docker installed
|
|
||||||
|
|
||||||
**Steps:**
|
### DevOps Web
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
labels:
|
||||||
|
- 'traefik.enable=true'
|
||||||
|
- 'traefik.http.routers.devops-web.rule=Host(`devops.bytelyst.com`)'
|
||||||
|
- 'traefik.http.services.devops-web.loadbalancer.server.port=3000' # container port
|
||||||
|
```
|
||||||
|
|
||||||
|
### DevOps Backend API
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
labels:
|
||||||
|
- 'traefik.enable=true'
|
||||||
|
- 'traefik.http.routers.devops-api.rule=PathPrefix(`/api/devops`)'
|
||||||
|
- 'traefik.http.services.devops-api.loadbalancer.server.port=4004'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Admin Web
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
labels:
|
||||||
|
- 'traefik.enable=true'
|
||||||
|
- 'traefik.http.routers.admin-web.rule=Host(`admin.bytelyst.com`)'
|
||||||
|
- 'traefik.http.services.admin-web.loadbalancer.server.port=3001'
|
||||||
|
```
|
||||||
|
|
||||||
|
## DNS Configuration
|
||||||
|
|
||||||
|
Add DNS records pointing to your Traefik gateway server:
|
||||||
|
|
||||||
|
```
|
||||||
|
devops.bytelyst.com A <your-server-ip>
|
||||||
|
admin.bytelyst.com A <your-server-ip>
|
||||||
|
api.bytelyst.com A <your-server-ip>
|
||||||
|
```
|
||||||
|
|
||||||
|
## SSL/TLS Configuration
|
||||||
|
|
||||||
|
Traefik can automatically handle SSL certificates with Let's Encrypt:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
command:
|
||||||
|
- '--certificatesresolvers.myresolver.acme.tlschallenge=true'
|
||||||
|
- '--certificatesresolvers.myresolver.acme.email=admin@bytelyst.com'
|
||||||
|
- '--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json'
|
||||||
|
```
|
||||||
|
|
||||||
|
Then update router labels:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
labels:
|
||||||
|
- 'traefik.http.routers.devops-web.tls=true'
|
||||||
|
- 'traefik.http.routers.devops-web.tls.certresolver=myresolver'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Cross-Navigation
|
||||||
|
|
||||||
|
### DevOps Dashboard → Admin Dashboard
|
||||||
|
- Header includes a "Platform Admin" link with Shield icon.
|
||||||
|
- Opens admin dashboard in a new tab.
|
||||||
|
- Uses `NEXT_PUBLIC_ADMIN_WEB_URL`.
|
||||||
|
|
||||||
|
### Admin Dashboard → DevOps Dashboard
|
||||||
|
- Sidebar includes a "DevOps Dashboard" link with Server icon.
|
||||||
|
- Opens devops dashboard in a new tab.
|
||||||
|
- Uses `NEXT_PUBLIC_DEVOPS_WEB_URL`.
|
||||||
|
|
||||||
|
## Shared Authentication
|
||||||
|
|
||||||
|
1. **Platform Service Auth**: Both authenticate against platform-service.
|
||||||
|
2. **JWT Tokens**: Same `JWT_SECRET` validates tokens across services.
|
||||||
|
3. **Per-Product Access**: Admin access is checked per-product via membership roles.
|
||||||
|
4. **Single Sign-On**: Users stay logged in across both dashboards.
|
||||||
|
|
||||||
|
### Granting Access
|
||||||
|
|
||||||
|
To grant a user access to both dashboards:
|
||||||
|
|
||||||
|
1. Ensure user exists in platform-service.
|
||||||
|
2. Add admin membership for both products:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"memberships": [
|
||||||
|
{ "productId": "bytelyst-devops", "role": "admin", "plan": "pro" },
|
||||||
|
{ "productId": "bytelyst-platform", "role": "admin", "plan": "pro" }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Health Checks
|
||||||
|
|
||||||
|
- DevOps Backend: `http://localhost:4004/health`
|
||||||
|
- DevOps Web: `http://localhost:3049` (Docker Compose host port; container :3000)
|
||||||
|
- Admin Web: `http://localhost:3001`
|
||||||
|
- Traefik Dashboard: `http://localhost:8080`
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Network issues
|
||||||
```bash
|
```bash
|
||||||
# Build Docker images
|
# Check if the platform network exists
|
||||||
docker-compose build
|
docker network inspect learning_ai_common_plat_default
|
||||||
|
|
||||||
# Tag and push to registry
|
# Check container connectivity
|
||||||
docker tag devops-backend:latest your-registry/devops-backend:latest
|
docker network inspect learning_ai_common_plat_default | grep devops
|
||||||
docker tag devops-web:latest your-registry/devops-web:latest
|
|
||||||
docker push your-registry/devops-backend:latest
|
|
||||||
docker push your-registry/devops-web:latest
|
|
||||||
|
|
||||||
# On production server:
|
|
||||||
docker pull your-registry/devops-backend:latest
|
|
||||||
docker pull your-registry/devops-web:latest
|
|
||||||
docker-compose -f docker-compose.prod.yml up -d
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Traefik routing
|
||||||
|
```bash
|
||||||
|
# Traefik dashboard
|
||||||
|
http://localhost:8080
|
||||||
|
|
||||||
|
# Traefik logs
|
||||||
|
docker logs $(docker ps -q -f name=gateway)
|
||||||
|
|
||||||
|
# Router config for the devops web container
|
||||||
|
docker inspect devops-web | grep -A 10 Labels
|
||||||
|
```
|
||||||
|
|
||||||
|
### Authentication failures
|
||||||
|
- Verify `JWT_SECRET` matches across all services.
|
||||||
|
- Check platform-service is accessible: `curl http://localhost:4003/health`.
|
||||||
|
- Ensure the user has the right product memberships.
|
||||||
|
|
||||||
|
### Service not starting
|
||||||
|
```bash
|
||||||
|
docker logs devops-backend
|
||||||
|
docker logs devops-web
|
||||||
|
docker logs admin-web
|
||||||
|
docker ps
|
||||||
|
docker inspect devops-backend | grep -A 5 Health
|
||||||
|
```
|
||||||
|
|
||||||
|
### Workspace dependency errors
|
||||||
|
```bash
|
||||||
|
pnpm install:common-plat # local sibling checkout
|
||||||
|
pnpm install:gitea # local Gitea registry
|
||||||
|
```
|
||||||
|
|
||||||
|
## Service Management
|
||||||
|
|
||||||
|
### Stop services
|
||||||
|
```bash
|
||||||
|
cd /opt/bytelyst/learning_ai_devops_tools/dashboard
|
||||||
|
docker-compose down
|
||||||
|
|
||||||
|
cd /opt/bytelyst/learning_ai_common_plat
|
||||||
|
docker-compose stop admin-web
|
||||||
|
```
|
||||||
|
|
||||||
|
### Restart services
|
||||||
|
```bash
|
||||||
|
cd /opt/bytelyst/learning_ai_devops_tools/dashboard
|
||||||
|
docker-compose restart
|
||||||
|
|
||||||
|
cd /opt/bytelyst/learning_ai_common_plat
|
||||||
|
docker-compose restart admin-web
|
||||||
|
```
|
||||||
|
|
||||||
|
### View logs
|
||||||
|
```bash
|
||||||
|
# DevOps
|
||||||
|
docker logs -f devops-backend
|
||||||
|
docker logs -f devops-web
|
||||||
|
|
||||||
|
# Admin
|
||||||
|
docker logs -f admin-web
|
||||||
|
|
||||||
|
# Traefik
|
||||||
|
docker logs -f gateway
|
||||||
|
```
|
||||||
|
|
||||||
|
## Comparison with Trading Dashboard
|
||||||
|
|
||||||
|
| Feature | Trading | DevOps | Admin |
|
||||||
|
|--------------|----------------------|-------------------------|------------------------|
|
||||||
|
| Domain | invttrdg.bytelyst.com| devops.bytelyst.com | admin.bytelyst.com |
|
||||||
|
| Web Port | 3085 (host) | 3049 (host) / 3000 (ctr)| 3001 (host) |
|
||||||
|
| Backend Port | 4018 | 4004 | N/A |
|
||||||
|
| Network | platform_net | platform_net | default |
|
||||||
|
| Traefik | Yes | Yes | Yes |
|
||||||
|
| Auth | Platform | Platform | Platform |
|
||||||
|
|
||||||
|
## Production Checklist
|
||||||
|
|
||||||
|
- [ ] Platform stack running with Traefik.
|
||||||
|
- [ ] DNS records configured.
|
||||||
|
- [ ] SSL/TLS certificates configured in Traefik.
|
||||||
|
- [ ] Environment variables set for production.
|
||||||
|
- [ ] Cosmos DB connection configured.
|
||||||
|
- [ ] `JWT_SECRET` matches across all services.
|
||||||
|
- [ ] User memberships configured for access.
|
||||||
|
- [ ] Health checks passing.
|
||||||
|
- [ ] Cross-navigation links working.
|
||||||
|
- [ ] Monitoring and logging configured.
|
||||||
|
|
||||||
## Features Implemented
|
## Features Implemented
|
||||||
|
|
||||||
The dashboard includes these production-ready features:
|
### Backend (port 4004)
|
||||||
|
|
||||||
### Backend (Port 4004)
|
|
||||||
- ✅ CI/CD pipeline with Gitea Actions
|
- ✅ CI/CD pipeline with Gitea Actions
|
||||||
- ✅ E2E tests with Playwright
|
- ✅ E2E tests with Playwright (gated; see `.gitea/workflows/ci.yml`)
|
||||||
- ✅ Telemetry integration
|
- ✅ Telemetry integration
|
||||||
- ✅ Error boundary
|
- ✅ Error boundary
|
||||||
- ✅ CSRF protection with token refresh
|
- ✅ CSRF protection with token refresh
|
||||||
@ -115,58 +374,13 @@ The dashboard includes these production-ready features:
|
|||||||
- ✅ Docker cleanup endpoints
|
- ✅ Docker cleanup endpoints
|
||||||
- ✅ OpenAPI/Swagger documentation at `/docs`
|
- ✅ OpenAPI/Swagger documentation at `/docs`
|
||||||
|
|
||||||
### Frontend (Port 3000)
|
### Frontend (container :3000, host :3049 under Compose)
|
||||||
- ✅ Service management UI
|
- ✅ Service management UI
|
||||||
- ✅ Deployment monitoring
|
- ✅ Deployment monitoring
|
||||||
- ✅ Health dashboard
|
- ✅ Health dashboard
|
||||||
- ✅ Metrics/charts page
|
- ✅ Metrics/charts page
|
||||||
- ✅ System management page
|
- ✅ System management page
|
||||||
- ✅ Real-time log viewer
|
- ✅ Log viewer (poll-based)
|
||||||
- ✅ Accessibility features (ARIA, keyboard nav)
|
- ✅ Accessibility features (ARIA, keyboard nav)
|
||||||
- ✅ PWA manifest
|
- ✅ PWA manifest
|
||||||
- ✅ Responsive design
|
- ✅ Responsive design
|
||||||
|
|
||||||
## Services Configured
|
|
||||||
|
|
||||||
The dashboard can deploy:
|
|
||||||
1. **Investment Trading** (`learning_ai_invt_trdg`)
|
|
||||||
2. **Agentic Notes** (`learning_ai_notes`)
|
|
||||||
3. **AI Clock** (`learning_ai_clock`)
|
|
||||||
4. **Platform Services** (`learning_ai_common_plat`) - can be added
|
|
||||||
|
|
||||||
## Next Steps for Production Deployment
|
|
||||||
|
|
||||||
1. **Resolve Workspace Dependencies**: Ensure common platform packages are accessible
|
|
||||||
2. **Configure Environment Variables**: Set production values for Cosmos, JWT, etc.
|
|
||||||
3. **Set Up Infrastructure**: Azure Cosmos DB, platform service instance
|
|
||||||
4. **Configure CI/CD**: Update Gitea Actions with production registry
|
|
||||||
5. **Test Deployments**: Verify all deployment scripts work in production
|
|
||||||
6. **Set Up Monitoring**: Configure logging, metrics, and alerting
|
|
||||||
|
|
||||||
## Access
|
|
||||||
|
|
||||||
- **Dashboard**: http://localhost:3000 (or production URL)
|
|
||||||
- **API**: http://localhost:4004 (or production URL)
|
|
||||||
- **API Docs**: http://localhost:4004/docs
|
|
||||||
- **System Management**: Navigate to System page in dashboard
|
|
||||||
|
|
||||||
## Troubleshooting
|
|
||||||
|
|
||||||
**Workspace dependency errors:**
|
|
||||||
```bash
|
|
||||||
# Use the install scripts provided
|
|
||||||
pnpm install:common-plat # For local development
|
|
||||||
pnpm install:gitea # For Gitea environment
|
|
||||||
```
|
|
||||||
|
|
||||||
**Docker build failures:**
|
|
||||||
- Ensure Dockerfiles reference correct lock files
|
|
||||||
- Check that all dependencies are in registry
|
|
||||||
- Verify context paths in docker-compose.yml
|
|
||||||
|
|
||||||
**Port conflicts:**
|
|
||||||
- Backend uses port 4004
|
|
||||||
- Web uses port 3000
|
|
||||||
- Ensure these ports are available
|
|
||||||
|
|
||||||
The dashboard is feature-complete and ready for production deployment once the dependency infrastructure is resolved.
|
|
||||||
|
|||||||
@ -1,339 +1,5 @@
|
|||||||
# DevOps & Admin Dashboard Deployment Guide
|
# DevOps & Admin Dashboard Deployment Guide
|
||||||
|
|
||||||
## Overview
|
This file is a redirect kept for backwards compatibility (e.g. `deploy.sh`).
|
||||||
|
The canonical deployment guide is now [`DEPLOYMENT.md`](./DEPLOYMENT.md). Open
|
||||||
This guide covers deploying both the DevOps Dashboard and Platform Admin Dashboard using the existing Traefik gateway infrastructure, following the same pattern as the trading dashboard (https://invttrdg.bytelyst.com).
|
that file for the current content; do not edit this stub.
|
||||||
|
|
||||||
## URLs
|
|
||||||
|
|
||||||
- **DevOps Dashboard**: `https://devops.bytelyst.com`
|
|
||||||
- **Admin Dashboard**: `https://admin.bytelyst.com`
|
|
||||||
- **API Gateway**: `https://api.bytelyst.com`
|
|
||||||
- Platform API: `https://api.bytelyst.com/platform/api`
|
|
||||||
- DevOps API: `https://api.bytelyst.com/api/devops`
|
|
||||||
|
|
||||||
## Architecture
|
|
||||||
|
|
||||||
Both dashboards follow the same pattern as the trading dashboard:
|
|
||||||
|
|
||||||
```
|
|
||||||
Internet → Traefik Gateway → Services
|
|
||||||
├─ DevOps Web (port 3049)
|
|
||||||
├─ DevOps Backend (port 4004)
|
|
||||||
├─ Admin Web (port 3001)
|
|
||||||
├─ Platform Service (port 4003)
|
|
||||||
└─ Trading Dashboard (port 3085)
|
|
||||||
```
|
|
||||||
|
|
||||||
- **Traefik**: Acts as API gateway and reverse proxy
|
|
||||||
- **Docker Network**: All services connect via `learning_ai_common_plat_default`
|
|
||||||
- **Domain Routing**: Traefik routes based on host headers
|
|
||||||
- **SSL/TLS**: Managed by Traefik with Let's Encrypt
|
|
||||||
|
|
||||||
## Prerequisites
|
|
||||||
|
|
||||||
1. Platform stack running with Traefik gateway
|
|
||||||
2. Docker and Docker Compose installed
|
|
||||||
3. Domain names configured with DNS pointing to your server
|
|
||||||
4. Azure Cosmos DB account (shared with platform-service)
|
|
||||||
5. Platform Service running and accessible
|
|
||||||
|
|
||||||
## Quick Start
|
|
||||||
|
|
||||||
### 1. Start Platform Stack (if not running)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /opt/bytelyst/learning_ai_common_plat
|
|
||||||
docker-compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. Deploy Dashboards
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /opt/bytelyst/learning_ai_devops_tools/dashboard
|
|
||||||
./deploy.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
This will:
|
|
||||||
- Deploy DevOps Dashboard (backend + web)
|
|
||||||
- Deploy Admin Dashboard via platform stack
|
|
||||||
- Run health checks
|
|
||||||
- Show deployment information
|
|
||||||
|
|
||||||
## Manual Deployment
|
|
||||||
|
|
||||||
### Deploy DevOps Dashboard
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /opt/bytelyst/learning_ai_devops_tools/dashboard
|
|
||||||
docker-compose up -d --build
|
|
||||||
```
|
|
||||||
|
|
||||||
### Deploy Admin Dashboard
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /opt/bytelyst/learning_ai_common_plat
|
|
||||||
docker-compose up -d admin-web
|
|
||||||
```
|
|
||||||
|
|
||||||
## Environment Configuration
|
|
||||||
|
|
||||||
### DevOps Dashboard (.env)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Backend
|
|
||||||
PORT=4004
|
|
||||||
PLATFORM_SERVICE_URL=http://platform-service:4003
|
|
||||||
COSMOS_ENDPOINT=https://your-cosmos-account.documents.azure.com:443/
|
|
||||||
COSMOS_KEY=your-cosmos-primary-key
|
|
||||||
COSMOS_DATABASE=bytelyst-platform
|
|
||||||
JWT_SECRET=your-production-jwt-secret
|
|
||||||
CSRF_SECRET=your-production-csrf-secret
|
|
||||||
ENCRYPTION_KEY=your-production-encryption-key
|
|
||||||
PRODUCT_ID=bytelyst-devops
|
|
||||||
PRODUCT_NAME=ByteLyst DevOps Dashboard
|
|
||||||
|
|
||||||
# Azure Key Vault (optional)
|
|
||||||
AZURE_TENANT_ID=your-tenant-id
|
|
||||||
AZURE_CLIENT_ID=your-client-id
|
|
||||||
AZURE_CLIENT_SECRET=your-client-secret
|
|
||||||
AZURE_KEY_VAULT_URL=https://your-keyvault.vault.azure.net/
|
|
||||||
|
|
||||||
# Frontend
|
|
||||||
NEXT_PUBLIC_DEVOPS_API_URL=https://api.bytelyst.com/devops
|
|
||||||
NEXT_PUBLIC_PLATFORM_URL=https://api.bytelyst.com/platform/api
|
|
||||||
NEXT_PUBLIC_ADMIN_WEB_URL=https://admin.bytelyst.com
|
|
||||||
NEXT_PUBLIC_PRODUCT_ID=bytelyst-devops
|
|
||||||
NEXT_PUBLIC_PRODUCT_NAME=ByteLyst DevOps Dashboard
|
|
||||||
```
|
|
||||||
|
|
||||||
### Platform Dashboard (.env)
|
|
||||||
|
|
||||||
Add to your platform `.env`:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Admin Web Dashboard
|
|
||||||
NEXT_PUBLIC_PLATFORM_URL=https://api.bytelyst.com/platform/api
|
|
||||||
NEXT_PUBLIC_DEVOPS_WEB_URL=https://devops.bytelyst.com
|
|
||||||
```
|
|
||||||
|
|
||||||
## Traefik Configuration
|
|
||||||
|
|
||||||
Both dashboards use Traefik labels for routing:
|
|
||||||
|
|
||||||
### DevOps Web
|
|
||||||
```yaml
|
|
||||||
labels:
|
|
||||||
- 'traefik.enable=true'
|
|
||||||
- 'traefik.http.routers.devops-web.rule=Host(`devops.bytelyst.com`)'
|
|
||||||
- 'traefik.http.services.devops-web.loadbalancer.server.port=3000'
|
|
||||||
```
|
|
||||||
|
|
||||||
### DevOps Backend API
|
|
||||||
```yaml
|
|
||||||
labels:
|
|
||||||
- 'traefik.enable=true'
|
|
||||||
- 'traefik.http.routers.devops-api.rule=PathPrefix(`/api/devops`)'
|
|
||||||
- 'traefik.http.services.devops-api.loadbalancer.server.port=4004'
|
|
||||||
```
|
|
||||||
|
|
||||||
### Admin Web
|
|
||||||
```yaml
|
|
||||||
labels:
|
|
||||||
- 'traefik.enable=true'
|
|
||||||
- 'traefik.http.routers.admin-web.rule=Host(`admin.bytelyst.com`)'
|
|
||||||
- 'traefik.http.services.admin-web.loadbalancer.server.port=3001'
|
|
||||||
```
|
|
||||||
|
|
||||||
## DNS Configuration
|
|
||||||
|
|
||||||
Add DNS records pointing to your Traefik gateway server:
|
|
||||||
|
|
||||||
```
|
|
||||||
devops.bytelyst.com A <your-server-ip>
|
|
||||||
admin.bytelyst.com A <your-server-ip>
|
|
||||||
api.bytelyst.com A <your-server-ip>
|
|
||||||
```
|
|
||||||
|
|
||||||
## SSL/TLS Configuration
|
|
||||||
|
|
||||||
Traefik can automatically handle SSL certificates with Let's Encrypt. Add to your Traefik configuration:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
command:
|
|
||||||
- '--certificatesresolvers.myresolver.acme.tlschallenge=true'
|
|
||||||
- '--certificatesresolvers.myresolver.acme.email=admin@bytelyst.com'
|
|
||||||
- '--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json'
|
|
||||||
```
|
|
||||||
|
|
||||||
Then update router labels:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
labels:
|
|
||||||
- 'traefik.http.routers.devops-web.tls=true'
|
|
||||||
- 'traefik.http.routers.devops-web.tls.certresolver=myresolver'
|
|
||||||
```
|
|
||||||
|
|
||||||
## Cross-Navigation Features
|
|
||||||
|
|
||||||
Both dashboards include cross-navigation links:
|
|
||||||
|
|
||||||
### DevOps Dashboard → Admin Dashboard
|
|
||||||
- Header includes "Platform Admin" link with Shield icon
|
|
||||||
- Opens admin dashboard in new tab
|
|
||||||
- Uses configured `NEXT_PUBLIC_ADMIN_WEB_URL`
|
|
||||||
|
|
||||||
### Admin Dashboard → DevOps Dashboard
|
|
||||||
- Sidebar includes "DevOps Dashboard" link with Server icon
|
|
||||||
- Opens devops dashboard in new tab
|
|
||||||
- Uses configured `NEXT_PUBLIC_DEVOPS_WEB_URL`
|
|
||||||
|
|
||||||
## Shared Authentication
|
|
||||||
|
|
||||||
Both dashboards use the same authentication system:
|
|
||||||
|
|
||||||
1. **Platform Service Auth**: Both authenticate against platform-service
|
|
||||||
2. **JWT Tokens**: Same JWT secret validates tokens across services
|
|
||||||
3. **Per-Product Access**: Admin access is checked per-product via membership roles
|
|
||||||
4. **Single Sign-On**: Users stay logged in across both dashboards
|
|
||||||
|
|
||||||
### Granting Access
|
|
||||||
|
|
||||||
To grant a user access to both dashboards:
|
|
||||||
|
|
||||||
1. Ensure user exists in platform-service
|
|
||||||
2. Add admin membership for both products:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"memberships": [
|
|
||||||
{
|
|
||||||
"productId": "bytelyst-devops",
|
|
||||||
"role": "admin",
|
|
||||||
"plan": "pro"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"productId": "bytelyst-platform",
|
|
||||||
"role": "admin",
|
|
||||||
"plan": "pro"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Health Checks
|
|
||||||
|
|
||||||
- DevOps Backend: `http://localhost:4004/health`
|
|
||||||
- DevOps Web: `http://localhost:3049`
|
|
||||||
- Admin Web: `http://localhost:3001`
|
|
||||||
- Traefik Dashboard: `http://localhost:8080`
|
|
||||||
|
|
||||||
## Troubleshooting
|
|
||||||
|
|
||||||
### Network Issues
|
|
||||||
```bash
|
|
||||||
# Check if platform network exists
|
|
||||||
docker network inspect learning_ai_common_plat_default
|
|
||||||
|
|
||||||
# Check container connectivity
|
|
||||||
docker network inspect learning_ai_common_plat_default | grep devops
|
|
||||||
```
|
|
||||||
|
|
||||||
### Traefik Routing
|
|
||||||
```bash
|
|
||||||
# Check Traefik dashboard
|
|
||||||
http://localhost:8080
|
|
||||||
|
|
||||||
# Check Traefik logs
|
|
||||||
docker logs $(docker ps -q -f name=gateway)
|
|
||||||
|
|
||||||
# Check router configuration
|
|
||||||
docker inspect devops-web | grep -A 10 Labels
|
|
||||||
```
|
|
||||||
|
|
||||||
### Authentication Failures
|
|
||||||
- Verify JWT_SECRET matches across all services
|
|
||||||
- Check platform-service is accessible: `curl http://localhost:4003/health`
|
|
||||||
- Ensure user has proper product memberships
|
|
||||||
|
|
||||||
### Service Not Starting
|
|
||||||
```bash
|
|
||||||
# Check service logs
|
|
||||||
docker logs devops-backend
|
|
||||||
docker logs devops-web
|
|
||||||
docker logs admin-web
|
|
||||||
|
|
||||||
# Check health status
|
|
||||||
docker ps
|
|
||||||
docker inspect devops-backend | grep -A 5 Health
|
|
||||||
```
|
|
||||||
|
|
||||||
## Monitoring
|
|
||||||
|
|
||||||
Both dashboards include:
|
|
||||||
- Performance monitoring hooks
|
|
||||||
- Audit logging
|
|
||||||
- Health check endpoints
|
|
||||||
- Error tracking
|
|
||||||
|
|
||||||
Monitor these through:
|
|
||||||
- Traefik Dashboard: `http://localhost:8080`
|
|
||||||
- Grafana (if configured): `http://localhost:3000`
|
|
||||||
- Loki logs (if configured): `http://localhost:3100`
|
|
||||||
|
|
||||||
## Comparison with Trading Dashboard
|
|
||||||
|
|
||||||
| Feature | Trading | DevOps | Admin |
|
|
||||||
|---------|---------|--------|-------|
|
|
||||||
| Domain | invttrdg.bytelyst.com | devops.bytelyst.com | admin.bytelyst.com |
|
|
||||||
| Web Port | 3085 | 3049 | 3001 |
|
|
||||||
| Backend Port | 4018 | 4004 | N/A |
|
|
||||||
| Network | platform_net | platform_net | default |
|
|
||||||
| Traefik | Yes | Yes | Yes |
|
|
||||||
| Auth | Platform | Platform | Platform |
|
|
||||||
|
|
||||||
## Service Management
|
|
||||||
|
|
||||||
### Stop Services
|
|
||||||
```bash
|
|
||||||
cd /opt/bytelyst/learning_ai_devops_tools/dashboard
|
|
||||||
docker-compose down
|
|
||||||
|
|
||||||
cd /opt/bytelyst/learning_ai_common_plat
|
|
||||||
docker-compose stop admin-web
|
|
||||||
```
|
|
||||||
|
|
||||||
### Restart Services
|
|
||||||
```bash
|
|
||||||
cd /opt/bytelyst/learning_ai_devops_tools/dashboard
|
|
||||||
docker-compose restart
|
|
||||||
|
|
||||||
cd /opt/bytelyst/learning_ai_common_plat
|
|
||||||
docker-compose restart admin-web
|
|
||||||
```
|
|
||||||
|
|
||||||
### View Logs
|
|
||||||
```bash
|
|
||||||
# DevOps
|
|
||||||
docker logs -f devops-backend
|
|
||||||
docker logs -f devops-web
|
|
||||||
|
|
||||||
# Admin
|
|
||||||
docker logs -f admin-web
|
|
||||||
|
|
||||||
# Traefik
|
|
||||||
docker logs -f gateway
|
|
||||||
```
|
|
||||||
|
|
||||||
## Production Checklist
|
|
||||||
|
|
||||||
- [ ] Platform stack running with Traefik
|
|
||||||
- [ ] DNS records configured
|
|
||||||
- [ ] SSL/TLS certificates configured in Traefik
|
|
||||||
- [ ] Environment variables set for production
|
|
||||||
- [ ] Cosmos DB connection configured
|
|
||||||
- [ ] JWT_SECRET matches across all services
|
|
||||||
- [ ] User memberships configured for access
|
|
||||||
- [ ] Health checks passing
|
|
||||||
- [ ] Cross-navigation links working
|
|
||||||
- [ ] Monitoring and logging configured
|
|
||||||
|
|||||||
@ -4,6 +4,14 @@ Canonical URL reference for the ByteLyst DevOps dashboard workspace.
|
|||||||
|
|
||||||
Use this document when you need the dashboard website URL, browser routes, backend API endpoints, health checks, or the related integration URLs referenced by the dashboard.
|
Use this document when you need the dashboard website URL, browser routes, backend API endpoints, health checks, or the related integration URLs referenced by the dashboard.
|
||||||
|
|
||||||
|
> **Local port note:** every `http://localhost:3000` URL in this file refers to
|
||||||
|
> the **`pnpm dev`** workflow, where Next listens directly on 3000. Under the
|
||||||
|
> Docker Compose deployment in this repo, the same web container is exposed on
|
||||||
|
> the host as **`http://localhost:3049`** (compose maps `127.0.0.1:3049:3000`).
|
||||||
|
> Substitute `:3049` for `:3000` whenever you're hitting the dockerized stack.
|
||||||
|
> Production traffic goes through Traefik on `https://devops.bytelyst.com` and
|
||||||
|
> doesn't expose either port. See `DEPLOYMENT.md` for the full port table.
|
||||||
|
|
||||||
## Canonical Bases
|
## Canonical Bases
|
||||||
|
|
||||||
| Surface | Local | Production | Notes |
|
| Surface | Local | Production | Notes |
|
||||||
|
|||||||
@ -102,7 +102,7 @@ pnpm dev # Runs on port 4004
|
|||||||
```bash
|
```bash
|
||||||
cd web
|
cd web
|
||||||
cp .env.local.example .env.local # Add your URLs
|
cp .env.local.example .env.local # Add your URLs
|
||||||
pnpm dev # Runs on port 3000
|
pnpm dev # Next dev server on http://localhost:3000 (no Docker)
|
||||||
```
|
```
|
||||||
|
|
||||||
### Running Both
|
### Running Both
|
||||||
@ -197,8 +197,8 @@ See [DEPLOYMENT.md](./DEPLOYMENT.md) for detailed deployment instructions.
|
|||||||
|
|
||||||
Deploy as a ByteLyst product:
|
Deploy as a ByteLyst product:
|
||||||
- Product ID: `devops-internal`
|
- Product ID: `devops-internal`
|
||||||
- Backend port: 4004
|
- Backend port: 4004 (host) / 4004 (container)
|
||||||
- Web port: 3000
|
- Web port: 3000 (container) — exposed on host as **`localhost:3049`** under Docker Compose; dev mode (`pnpm dev`) listens directly on `localhost:3000`. See [`DEPLOYMENT.md`](./DEPLOYMENT.md) for the full port table.
|
||||||
- Use existing deployment scripts in parent directory
|
- Use existing deployment scripts in parent directory
|
||||||
- Public API base: `https://api.bytelyst.com/devops`
|
- Public API base: `https://api.bytelyst.com/devops`
|
||||||
|
|
||||||
|
|||||||
@ -39,12 +39,11 @@ Backend has 12 modules (`services`, `deployments`, `health`, `audit`, `backup`,
|
|||||||
### 4. SSE deployment-log streaming is disabled — RESOLVED (removed)
|
### 4. SSE deployment-log streaming is disabled — RESOLVED (removed)
|
||||||
The TODO has been resolved by **removing the SSE claim**, not by shipping it: the `fastify-sse-v2` dependency is gone from `backend/package.json`, the commented-out import + plugin registration are gone from `backend/src/server.ts`, and the deployment-log endpoint is now documented as JSON-polled. The web client never used `EventSource` (`web/src/lib/api.ts` already polls `/api/deployments/:id/logs` via the normal `apiRequest` helper), so no UI change was required. README/DEPLOYMENT.md updated to match. If a real-time stream is wanted later, ship it explicitly via `reply.raw` and update the docs in the same change.
|
The TODO has been resolved by **removing the SSE claim**, not by shipping it: the `fastify-sse-v2` dependency is gone from `backend/package.json`, the commented-out import + plugin registration are gone from `backend/src/server.ts`, and the deployment-log endpoint is now documented as JSON-polled. The web client never used `EventSource` (`web/src/lib/api.ts` already polls `/api/deployments/:id/logs` via the normal `apiRequest` helper), so no UI change was required. README/DEPLOYMENT.md updated to match. If a real-time stream is wanted later, ship it explicitly via `reply.raw` and update the docs in the same change.
|
||||||
|
|
||||||
### 5. Documentation drift
|
### 5. Documentation drift — RESOLVED
|
||||||
- `README.md` says "Web port: 3000" but `docker-compose.yml` exposes web as `3049:3000`.
|
- `DEPLOYMENT.md` is now the single canonical deployment guide; `DEPLOYMENT_GUIDE.md` is reduced to a one-line redirect for backwards compat with `deploy.sh` and external links. `deploy.sh` updated to reference `DEPLOYMENT.md`.
|
||||||
- `README.md` lists API endpoints inline; `ENDPOINTS.md` is the canonical source and contradicts in places (e.g. note about `https://api.bytelyst.com/api/devops` vs `https://api.bytelyst.com/devops`).
|
- `DEPLOYMENT.md` carries an explicit **Ports — quick reference** table that distinguishes container port (`:3000`), Compose host port (`:3049`), and the Traefik production URL — so the 3000-vs-3049 question has one truthful answer per deployment mode rather than three contradictory prose claims.
|
||||||
- `DEPLOYMENT.md` and `DEPLOYMENT_GUIDE.md` overlap; unclear which is canonical.
|
- `README.md` "Web port: 3000" rewritten to call out container vs Compose host vs dev-mode explicitly and link to the port table.
|
||||||
|
- `ENDPOINTS.md` got a top-of-file note: every `localhost:3000` URL in the file refers to `pnpm dev`; substitute `:3049` for the Dockerized stack. The `https://api.bytelyst.com/api/devops` vs `/devops` ambiguity was already resolved by the existing "URL Note" section (kept).
|
||||||
- Action: pick `ENDPOINTS.md` as the single source for URLs and reduce `README.md` to a pointer. Merge the two deployment docs into one (`DEPLOYMENT.md`) and delete the loser. Fix the 3000 vs 3049 mismatch.
|
|
||||||
|
|
||||||
### 6. Docker socket + host log mounts are very privileged
|
### 6. Docker socket + host log mounts are very privileged
|
||||||
`docker-compose.yml` mounts `/var/run/docker.sock`, the host `scripts` directory, and three host log paths into `devops-backend`. This is the same risk profile as Portainer but with custom code reading/writing those mounts. There is no documentation of which backend module talks to the docker socket or what commands it issues.
|
`docker-compose.yml` mounts `/var/run/docker.sock`, the host `scripts` directory, and three host log paths into `devops-backend`. This is the same risk profile as Portainer but with custom code reading/writing those mounts. There is no documentation of which backend module talks to the docker socket or what commands it issues.
|
||||||
|
|||||||
@ -190,7 +190,7 @@ show_info() {
|
|||||||
echo "2. Configure SSL certificates in Traefik"
|
echo "2. Configure SSL certificates in Traefik"
|
||||||
echo "3. Grant user access via platform-service memberships"
|
echo "3. Grant user access via platform-service memberships"
|
||||||
echo ""
|
echo ""
|
||||||
echo "See DEPLOYMENT_GUIDE.md for detailed instructions"
|
echo "See DEPLOYMENT.md for detailed instructions"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Main deployment flow
|
# Main deployment flow
|
||||||
|
|||||||
@ -124,7 +124,7 @@ This is the biggest operational asymmetry and the reason half the ops-panel warn
|
|||||||
- [x] **P0:** Replace the no-op `lint` echo with real linting (`next lint` for web, minimal ESLint for backend); make `pnpm lint` fail on bad code.
|
- [x] **P0:** Replace the no-op `lint` echo with real linting (`next lint` for web, minimal ESLint for backend); make `pnpm lint` fail on bad code.
|
||||||
- [x] **P1:** Add tests for `auth`, `csrf`, `deployments/orchestrator`, `health`, **and `hermes-ops`**; add `pnpm test:coverage` gate. *(35 new unit tests; v8 coverage thresholds gated on the six tested files in `backend/vitest.config.ts` (≥85% lines/funcs/stmts, ≥65% branches), wired into Gitea CI as a dedicated step. Today's actuals: ≥95% lines on every gated file. Ratchet up as more modules get tested.)*
|
- [x] **P1:** Add tests for `auth`, `csrf`, `deployments/orchestrator`, `health`, **and `hermes-ops`**; add `pnpm test:coverage` gate. *(35 new unit tests; v8 coverage thresholds gated on the six tested files in `backend/vitest.config.ts` (≥85% lines/funcs/stmts, ≥65% branches), wired into Gitea CI as a dedicated step. Today's actuals: ≥95% lines on every gated file. Ratchet up as more modules get tested.)*
|
||||||
- [x] **P1:** Resolve the SSE TODO — either ship a Fastify-5-compatible log-stream or remove the SSE claim from docs/UI. *(Chose **remove**: dropped `fastify-sse-v2` dep, deleted commented-out plugin import + TODO from `server.ts` and `deployments/routes.ts`, rewrote the README/DEPLOYMENT.md "Log Streaming" section as "Logs (JSON-polled, no SSE)". Web client already polls `/deployments/:id/logs` via `apiRequest` — no UI change needed. If a real-time stream is wanted later, implement via `reply.raw` and update docs in the same change.)*
|
- [x] **P1:** Resolve the SSE TODO — either ship a Fastify-5-compatible log-stream or remove the SSE claim from docs/UI. *(Chose **remove**: dropped `fastify-sse-v2` dep, deleted commented-out plugin import + TODO from `server.ts` and `deployments/routes.ts`, rewrote the README/DEPLOYMENT.md "Log Streaming" section as "Logs (JSON-polled, no SSE)". Web client already polls `/deployments/:id/logs` via `apiRequest` — no UI change needed. If a real-time stream is wanted later, implement via `reply.raw` and update docs in the same change.)*
|
||||||
- [ ] **P1:** Fix doc drift (web port 3000 vs 3049; endpoint URLs; merge duplicate deployment docs).
|
- [x] **P1:** Fix doc drift (web port 3000 vs 3049; endpoint URLs; merge duplicate deployment docs). *(`DEPLOYMENT.md` is now canonical; `DEPLOYMENT_GUIDE.md` reduced to a redirect stub; `deploy.sh` updated. Added an explicit "Ports — quick reference" table to `DEPLOYMENT.md` distinguishing container `:3000`, Compose host `:3049`, Traefik production. README and ENDPOINTS.md cross-link to it. Marks REVIEW_ACTIONS #5 resolved.)*
|
||||||
- [ ] **P1:** Document the docker-socket + host-log/script mount privilege surface (the backend reads cross-user/host paths — blast radius must be written down; consider an allow-list wrapper over the raw socket).
|
- [ ] **P1:** Document the docker-socket + host-log/script mount privilege surface (the backend reads cross-user/host paths — blast radius must be written down; consider an allow-list wrapper over the raw socket).
|
||||||
- [ ] **P2:** Structured backend logging (pino → stdout); wire E2E (`hermes.spec.ts`) into CI with a started stack.
|
- [ ] **P2:** Structured backend logging (pino → stdout); wire E2E (`hermes.spec.ts`) into CI with a started stack.
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user