{"id":47891647,"url":"https://github.com/rootdavinalfa/modern-router-management","last_synced_at":"2026-04-04T03:07:48.545Z","repository":{"id":341504523,"uuid":"1170095086","full_name":"rootdavinalfa/modern-router-management","owner":"rootdavinalfa","description":"Vibe Coding to make ZTE f6600p modern dashboard UI. May include other device","archived":false,"fork":false,"pushed_at":"2026-03-02T05:10:48.000Z","size":628,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-02T07:46:29.293Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rootdavinalfa.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-01T17:36:10.000Z","updated_at":"2026-03-02T05:10:52.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/rootdavinalfa/modern-router-management","commit_stats":null,"previous_names":["rootdavinalfa/modern-router-management"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/rootdavinalfa/modern-router-management","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rootdavinalfa%2Fmodern-router-management","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rootdavinalfa%2Fmodern-router-management/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rootdavinalfa%2Fmodern-router-management/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rootdavinalfa%2Fmodern-router-management/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rootdavinalfa","download_url":"https://codeload.github.com/rootdavinalfa/modern-router-management/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rootdavinalfa%2Fmodern-router-management/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31385963,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T01:22:39.193Z","status":"online","status_checked_at":"2026-04-04T02:00:07.569Z","response_time":60,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-04-04T03:07:48.140Z","updated_at":"2026-04-04T03:07:48.540Z","avatar_url":"https://github.com/rootdavinalfa.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Modern Router Management\n\nA full-stack web application for managing and monitoring ZTE fiber routers (ONT/ONU devices). Built with a monorepo architecture using Turborepo, featuring a NestJS API server and a TanStack React web client.\n\n## Features\n\n- **Real-time Monitoring**: View router status, optical power levels, and connection metrics\n- **PON Optical Module**: Monitor RX/TX power, temperature, voltage, and ONU state\n- **WAN Connections**: Track all WAN connections with IPv4/IPv6 support\n- **Multi-Router Support**: Manage multiple routers from a single dashboard\n- **Secure Storage**: Encrypted credential storage using AES-256-GCM\n- **Modern UI**: Beautiful, responsive interface built with Tailwind CSS\n\n## Project Structure\n\n```\nmodern-router-management/\n├── apps/\n│   ├── api/              # NestJS API server\n│   └── web/              # TanStack React web client\n├── packages/\n│   ├── types/            # Shared TypeScript types and Zod schemas\n│   ├── drivers/          # Router driver implementations (Playwright)\n│   └── ui/               # Shared UI components\n├── docs/                 # Documentation\n└── turbo.json            # Turborepo configuration\n```\n\n## Tech Stack\n\n### Frontend (Web)\n- **Framework**: TanStack React Start\n- **Routing**: TanStack Router (file-based)\n- **Styling**: Tailwind CSS v4\n- **Forms**: React Hook Form + Zod\n- **Data Fetching**: TanStack Query\n- **State Management**: React Context + TanStack Query\n\n### Backend (API)\n- **Framework**: NestJS\n- **Database**: SQLite (default) or PostgreSQL\n- **ORM**: Drizzle ORM\n- **Encryption**: Node.js Crypto (AES-256-GCM)\n- **Validation**: Zod\n\n### Infrastructure\n- **Monorepo**: Turborepo\n- **Package Manager**: Bun\n- **Browser Automation**: Playwright\n\n## Prerequisites\n\n- **Node.js**: v18 or higher\n- **Bun**: v1.3.5 or higher\n- **Database**: SQLite (bundled) or PostgreSQL v14+ (optional)\n\n## Quick Start\n\n### 1. Clone and Install\n\n```bash\ngit clone \u003crepository-url\u003e\ncd modern-router-management\nbun install\n```\n\n### 2. Configure Environment\n\n**API Server:**\n```bash\ncd apps/api\ncp .env.example .env\n\n# Generate encryption key\nopenssl rand -base64 32\n\n# Edit .env and add the generated key to ROUTER_CREDENTIALS_KEY\n```\n\n**Web Client:**\n```bash\ncd apps/web\ncp .env.example .env.local\n```\n\n### 3. Run the Application\n\n**Option A: Run everything together (from root)**\n```bash\n# Terminal 1: Start API server\nbun run dev:api\n\n# Terminal 2: Start web client\nbun run dev:web\n```\n\n**Option B: Run specific apps**\n```bash\n# API only\ncd apps/api \u0026\u0026 bun run dev\n\n# Web only\ncd apps/web \u0026\u0026 bun run dev\n```\n\n### 4. Access the Application\n\n- **Web Client**: http://localhost:3000\n- **API Server**: http://localhost:3001\n\n## Available Commands\n\n### Root Level\n\n```bash\nbun run build          # Build all packages\nbun run dev            # Run all apps in dev mode\nbun run dev:web        # Run web client only\nbun run dev:api        # Run API server only\nbun run lint           # Lint all packages\nbun run format         # Format all code\nbun run check-types    # Type check all packages\nbun run clean          # Clean all build artifacts\n```\n\n### Package Level\n\nEach package has its own scripts. See individual READMEs:\n- [`apps/api/README.md`](apps/api/README.md) - API server documentation\n- [`apps/web/README.md`](apps/web/README.md) - Web client documentation\n\n## Supported Routers\n\n- **ZTE F6600P** - Full support (PON metrics, WAN status, connected devices)\n\nMore router models coming soon!\n\n## API Endpoints\n\n| Method | Endpoint | Description |\n|--------|----------|-------------|\n| GET | `/routers` | List all routers |\n| GET | `/routers/active` | Get active router |\n| GET | `/routers/:id/status` | Get router status |\n| GET | `/routers/:id/devices` | Get connected devices |\n| POST | `/routers` | Add new router |\n| POST | `/routers/:id/wifi` | Update WiFi settings |\n| POST | `/routers/:id/reboot` | Reboot router |\n\n## Architecture\n\n```\n┌─────────────┐     ┌──────────────┐     ┌─────────────────┐\n│   Web UI    │────▶│   API Server │────▶│  Router Driver  │\n│  (React)    │     │   (NestJS)   │     │  (Playwright)   │\n└─────────────┘     └──────────────┘     └─────────────────┘\n                           │\n                           ▼\n                    ┌──────────────┐\n                    │   Database   │\n                    │ (SQLite/PG)  │\n                    └──────────────┘\n```\n\n## Security\n\n- Router credentials are encrypted using AES-256-GCM before storage\n- Encryption key must be provided via environment variable\n- No plaintext passwords stored in database\n\n## Development\n\n### Building Packages\n\n```bash\n# Build all packages\nbun run build\n\n# Build specific package\nbun run build:types\nbun run build:drivers\nbun run build:api\nbun run build:web\n```\n\n### Testing\n\n```bash\n# Run all tests\nbun run test\n\n# Run E2E tests\nbun run test:e2e\n```\n\n### Code Quality\n\n```bash\n# Lint and format\nbun run lint\nbun run format\n\n# Fix issues automatically\nbun run lint:fix\nbun run check\n```\n\n## Troubleshooting\n\n### API won't start\n- Check that `.env` file exists in `apps/api/`\n- Verify `ROUTER_CREDENTIALS_KEY` is set and valid (32 bytes base64)\n- Ensure port 3001 is not in use\n\n### Web can't connect to API\n- Verify API server is running\n- Check `VITE_API_URL` in `apps/web/.env.local`\n- Check for CORS issues in browser console\n\n### Build errors\n```bash\n# Clean and reinstall\nbun run clean\nbun install\n\n# Rebuild dependencies\ncd apps/api \u0026\u0026 bun run build:deps\n```\n\n## Contributing\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m 'Add amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n## License\n\nMIT License - see [LICENSE](LICENSE) for details.\n\n## Docker Deployment\n\n### Prerequisites\n\n- **Podman** or **Docker** installed\n- **PostgreSQL** (optional, can run in container)\n\n### Pull the Image\n\nThe Docker image is automatically built and pushed to GitHub Container Registry (ghcr.io) via GitHub Actions on every push to main/develop branches and tags.\n\n```bash\n# Pull the latest image from ghcr.io\ndocker pull ghcr.io/rootdavinalfa/modern-router-management:latest\n```\n\n### Run with Docker Compose (Recommended)\n\n```bash\n# Start PostgreSQL and App together\ndocker-compose up -d\n\n# View logs\ndocker-compose logs -f app\n\n# Stop everything\ndocker-compose down\n```\n\nAccess the application at **http://localhost:3000** (TanStack Start frontend) and **http://localhost:3001** (API).\n\n### Run Manually\n\n**1. Start PostgreSQL:**\n```bash\ndocker run -d --name modern-router-db \\\n  -e POSTGRES_USER=postgres \\\n  -e POSTGRES_PASSWORD=12345678 \\\n  -e POSTGRES_DB=modern_router_mgmt \\\n  -p 5432:5432 \\\n  postgres:16-alpine\n```\n\n**2. Generate Encryption Key:**\n```bash\nopenssl rand -base64 32\n```\n\n**3. Create Environment File:**\n```bash\ncat \u003e .env.docker \u003c\u003c EOF\nNODE_ENV=production\nPORT=3001\nDB_ENGINE=postgres\nDATABASE_URL=postgresql://postgres:12345678@localhost:5432/modern_router_mgmt\nROUTER_CREDENTIALS_KEY=\u003cyour-generated-key\u003e\nEOF\n```\n\n**4. Run the App Container:**\n```bash\ndocker run -d --name modern-router-app \\\n  -p 3000:3000 \\\n  -p 3001:3001 \\\n  --env-file .env.docker \\\n  ghcr.io/rootdavinalfa/modern-router-management:latest\n```\n\n### Test the Deployment\n\n```bash\n# Access frontend (TanStack Start SSR)\ncurl http://localhost:3000\n\n# Check API health endpoint\ncurl http://localhost:3001/health\n\n# List routers via API\ncurl http://localhost:3001/routers\n\n# Check container logs\ndocker logs modern-router-app\n```\n\n### Container Architecture\n\nThe single container includes:\n- **TanStack Start Server** (port 3000): SSR frontend with React Router\n- **NestJS API** (port 3001): Backend API server\n- **Playwright Chromium**: Browser automation for router scraping\n\n**Image Size:**\n- Build stage: ~3 GB (includes build tools, Chromium, frontend build)\n- Production stage: ~1 GB (slim, runtime only)\n\n**Environment Variables:**\n| Variable | Required | Description |\n|----------|----------|-------------|\n| `DB_ENGINE` | Yes | `sqlite` or `postgres` |\n| `DATABASE_URL` | If postgres | PostgreSQL connection string |\n| `ROUTER_CREDENTIALS_KEY` | Yes | Base64-encoded 32-byte key |\n| `PORT` | No | API port (default: 3001) |\n\n**Volumes:**\n- PostgreSQL data is persisted in `postgres_data` volume\n- App container is stateless (no volumes needed)\n\n## Kubernetes Deployment\n\nFor production deployments, Kubernetes manifests are provided in the [`kubernetes/`](kubernetes/) folder.\n\n### Quick Deploy\n\n```bash\n# Create secrets first (see kubernetes/README.md)\nkubectl apply -f kubernetes/secrets.yaml\n\n# Deploy everything\nkubectl apply -k kubernetes/\n\n# Check status\nkubectl get pods -n modern-router-mgmt\n```\n\n### Features\n\n- **Namespace isolation** - All resources in `modern-router-mgmt` namespace\n- **StatefulSet for PostgreSQL** - Persistent storage for database\n- **Deployment for API** - Scalable API with health checks\n- **Ingress ready** - TLS termination with cert-manager support\n- **Kustomize support** - Base and production overlays\n- **Resource limits** - CPU and memory limits configured\n- **Security contexts** - Non-root containers, read-only filesystem\n\nSee [`kubernetes/README.md`](kubernetes/README.md) for complete documentation.\n\n## CI/CD\n\nGitHub Actions workflow is configured in [`.github/workflows/ci-cd.yml`](.github/workflows/ci-cd.yml).\n\n### Pipeline Stages\n\n1. **Lint** - Code linting and formatting checks\n2. **Type Check** - TypeScript type checking\n3. **Build** - Build all packages (API, Web, Types, Drivers)\n4. **Test** - Run test suites\n5. **Docker Build \u0026 Push** - Build and push combined container to ghcr.io\n\n### Triggers\n\n- **Push to main/develop** - Full pipeline + build/push Docker image\n- **Push tags (v*)** - Full pipeline + build/push with semantic version tags\n- **Pull Request** - Lint, type check, build, test\n\n### Manual Deployment\n\nAfter the Docker image is pushed to the registry:\n\n```bash\n# Pull the latest image\ndocker pull ghcr.io/rootdavinalfa/modern-router-management:latest\n\n# Run with PostgreSQL\ndocker run -d --name modern-router-app \\\n  -p 3000:3000 \\\n  -p 3001:3001 \\\n  -e NODE_ENV=production \\\n  -e DB_ENGINE=postgres \\\n  -e DATABASE_URL=postgresql://user:pass@host:5432/db \\\n  -e ROUTER_CREDENTIALS_KEY=your-key \\\n  ghcr.io/rootdavinalfa/modern-router-management:latest\n```\n\nAccess:\n- **Frontend**: http://localhost:3000 (TanStack Start SSR)\n- **API**: http://localhost:3001\n\nFor Kubernetes deployment, see [`kubernetes/README.md`](kubernetes/README.md).\n\n## Acknowledgments\n\n- [NestJS](https://nestjs.com/) - Progressive Node.js framework\n- [TanStack](https://tanstack.com/) - React Router and Query\n- [Turborepo](https://turborepo.org/) - Build system for monorepos\n- [Playwright](https://playwright.dev/) - Browser automation\n- [Drizzle ORM](https://orm.drizzle.team/) - TypeScript ORM\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frootdavinalfa%2Fmodern-router-management","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frootdavinalfa%2Fmodern-router-management","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frootdavinalfa%2Fmodern-router-management/lists"}