605 lines
27 KiB
Markdown
605 lines
27 KiB
Markdown
# PROJECT_DEVELOPMENT.md - EZSCALE Site Architecture & Development Plan
|
|
|
|
## 1. Project Goal
|
|
|
|
Replace WHMCS with a custom Laravel 12 application for managing EZSCALE Hosting's VPS, Dedicated Server, Web Hosting, and Game Server business. The new platform must handle customer management, billing/subscriptions, automated provisioning, bandwidth monitoring, and comprehensive admin controls.
|
|
|
|
## 2. Infrastructure Overview
|
|
|
|
### Current EZSCALE Stack
|
|
- **VPS Platform:** VirtFusion (KVM/QEMU hypervisor stack)
|
|
- **Game Servers:** Pterodactyl Panel
|
|
- **Dedicated Servers:** SynergyCP
|
|
- **Web Hosting:** Enhance (https://enhance.com/)
|
|
- **Container Management:** Portainer (for BFACP deployment)
|
|
- **Support System:** SupportPal (ticketing)
|
|
- **Network:** Juniper switches with VLANs (dedicated customers, corporate, hypervisors)
|
|
- **Bandwidth Monitoring:** ElastiFlow (NetFlow/sFlow collector)
|
|
|
|
### Domain Structure
|
|
- **ezscale.cloud** — Marketing frontend, product catalog, public pages
|
|
- **account.ezscale.cloud** — Customer dashboard, service management, billing
|
|
- **admin.ezscale.cloud** — Admin panel (behind Cloudflare Zero Trust + passkeys)
|
|
|
|
### Hosting
|
|
- **Application Hosting:** EZSCALE's own infrastructure
|
|
- **Database:** MySQL 8.x with full redundancy (multi-region replication, automated backups, DR plan)
|
|
- **Caching/Queue:** Redis
|
|
- **Email Service:** Mailgun or SendGrid
|
|
|
|
## 3. Application Architecture
|
|
|
|
### High-Level Architecture
|
|
```
|
|
┌──────────────────────────────────────────────────────────────────┐
|
|
│ ezscale.cloud │
|
|
│ Marketing Site + Product Catalog (Laravel) │
|
|
└──────────────────────────────────────────────────────────────────┘
|
|
│
|
|
┌────────────┴────────────┐
|
|
│ │
|
|
┌───────────────────▼─────────┐ ┌───────────▼──────────────────────┐
|
|
│ account.ezscale.cloud │ │ admin.ezscale.cloud │
|
|
│ Customer Dashboard │ │ Admin Panel │
|
|
│ (Vue 3 + Inertia.js) │ │ (Cloudflare Zero Trust) │
|
|
└───────────────┬──────────────┘ └──────────┬───────────────────────┘
|
|
│ │
|
|
┌───────────────┴────────────────────────────┴───────────────────────┐
|
|
│ Laravel 12 Core │
|
|
│ ┌──────────┐ ┌──────────┐ ┌──────────────┐ ┌───────────────────┐ │
|
|
│ │ Auth │ │ Billing │ │ Provisioning │ │ Bandwidth │ │
|
|
│ │ Fortify │ │ Cashier │ │ Services │ │ Monitoring │ │
|
|
│ │ Passport │ │ Stripe │ │ VirtFusion │ │ ElastiFlow │ │
|
|
│ │ │ │ PayPal │ │ Pterodactyl │ │ Integration │ │
|
|
│ │ │ │ │ │ SynergyCP │ │ │ │
|
|
│ │ │ │ │ │ Enhance │ │ │ │
|
|
│ └──────────┘ └──────────┘ └──────────────┘ └───────────────────┘ │
|
|
│ ┌──────────┐ ┌──────────┐ ┌──────────────┐ ┌───────────────────┐ │
|
|
│ │SupportPal│ │Analytics │ │ Customer │ │ Admin Tools │ │
|
|
│ │Integration│ │Dashboard │ │ API │ │ Full Control │ │
|
|
│ │SSO+Tickets│ │MRR/Churn │ │ │ │ │ │
|
|
│ └──────────┘ └──────────┘ └──────────────┘ └───────────────────┘ │
|
|
├─────────────────────────────────────────────────────────────────────┤
|
|
│ MySQL 8.x (Multi-region) │ Redis (Queue/Cache/Session) │
|
|
└─────────────────────────────────────────────────────────────────────┘
|
|
│ │
|
|
┌────┴────────┬──────────┬───────────┬───┴────┬─────────────┐
|
|
│ │ │ │ │ │
|
|
VirtFusion Pterodactyl SynergyCP Enhance SupportPal ElastiFlow
|
|
API API API API API API
|
|
```
|
|
|
|
## 4. Key Design Decisions
|
|
|
|
### Payment & Billing (DECIDED)
|
|
- **Primary Gateway:** Stripe via Laravel Cashier v16 (~80%+ of customers)
|
|
- **Secondary Gateway:** PayPal via `srmklive/laravel-paypal` (~20% recurring subscriptions)
|
|
- **Tax:** To be decided (TaxJar/Avalara or manual rates)
|
|
- **Multi-Currency:** Full support (EUR, GBP, USD, etc.) via Stripe
|
|
- **Invoicing:** Full-featured PDF generation, custom numbering, multi-currency, email delivery
|
|
- **Payment Methods:** Customers can manage multiple payment methods per account
|
|
- **Coupons:** Full coupon system (percentage, fixed amount, trial extensions, usage limits, expiry)
|
|
- **Billing Architecture:** `BillingServiceInterface` abstracts Stripe and PayPal for gateway-agnostic code
|
|
|
|
### Frontend & Auth (DECIDED)
|
|
- **Stack:** Vue 3 + Inertia.js + Tailwind CSS (Laravel 12 Vue starter kit)
|
|
- **UI Theme:** **Vuexy** VueJS + Laravel Admin Dashboard Template
|
|
- Purchase: https://themeforest.net/item/vuexy-vuejs-html-laravel-admin-dashboard-template/23328599
|
|
- Demo: https://pixinvent.com/vuexy-vuejs-laravel-admin-template/
|
|
- Features: Pre-built admin components, charts, forms, tables, authentication pages, responsive design
|
|
- Source files will be integrated when development begins
|
|
- **Auth:** Laravel Fortify (headless backend) + Vuexy-styled Vue/Inertia auth pages
|
|
- **2FA:** Required for admins (passkeys preferred), encouraged for customers (TOTP/Authenticator)
|
|
- **SSO:** Laravel Passport OAuth2 server for future integrations
|
|
- **API:** RESTful API for both customers (service management) and admins
|
|
|
|
### Provisioning (DECIDED - Fully Automated)
|
|
All service provisioning is **fully automated** via API on successful payment:
|
|
|
|
| Service Type | Platform | Automation |
|
|
|--------------|----------|------------|
|
|
| VPS | VirtFusion API | Payment succeeds → API creates VPS → credentials emailed |
|
|
| Game Servers | Pterodactyl API | Payment succeeds → API creates server → credentials emailed |
|
|
| Dedicated Servers | SynergyCP API | Payment succeeds → API provisions (if hardware available) → credentials emailed |
|
|
| Web Hosting | Enhance API | Payment succeeds → API creates hosting account → credentials emailed |
|
|
|
|
**Note:** Dedicated servers may require semi-automation (admin assigns hardware if inventory limited).
|
|
|
|
### Panel Integration (DECIDED)
|
|
- **Pterodactyl & SynergyCP:** Separate login credentials (no SSO)
|
|
- **Dashboard Integration:** Full integration - Laravel dashboard shows:
|
|
- Server status (online/offline)
|
|
- Resource usage (CPU, RAM, disk, bandwidth)
|
|
- Basic controls (restart, power on/off via API)
|
|
- Links to panels for advanced management
|
|
- **Enhance:** Full integration for hosting account status and resource usage
|
|
|
|
### Bandwidth Monitoring (DECIDED)
|
|
- **Collection:** NetFlow/sFlow via ElastiFlow (Elastic-based flow collector)
|
|
- **Integration:** Laravel queries ElastiFlow API/database for bandwidth data
|
|
- **Display:** Real-time bandwidth graphs in customer dashboard
|
|
- **Billing:** Automatic overage billing at end of billing cycle
|
|
- **Alerts:** Multi-threshold warnings (75%, 90%, 100% of quota) via email + Discord webhook
|
|
- **No Add-ons:** Automatic overage billing only (no one-time bandwidth add-ons)
|
|
|
|
### Support Integration (DECIDED)
|
|
- **System:** SupportPal (external ticketing system)
|
|
- **Integration Level:** Full integration
|
|
- SSO for seamless access
|
|
- View recent tickets in billing dashboard
|
|
- Create tickets from billing panel via SupportPal API
|
|
- Full ticket history accessible to customers
|
|
- **Discord:** Admin notifications via webhook (new orders, failures, cancellations, high revenue)
|
|
|
|
### Customer Features (DECIDED)
|
|
- **Dashboard Layout:** Service overview (active services, next invoice, recent tickets, quick actions)
|
|
- **Self-Service:** Full self-service upgrades/downgrades with automatic proration
|
|
- **Cancellation:** Self-service cancellation with optional survey (service remains active until period end)
|
|
- **Payment Methods:** Manage multiple cards/PayPal accounts, set default per service
|
|
|
|
### Admin Panel (DECIDED)
|
|
- **Access Security:** Cloudflare Zero Trust + 2FA (passkeys preferred)
|
|
- **Control Level:** Full control over all customer services
|
|
- Provision, suspend, terminate, modify services
|
|
- View/edit customer accounts
|
|
- Invoice management, payment processing
|
|
- Analytics dashboard (MRR, ARR, churn, revenue trends, popular plans)
|
|
- **Suspension Policy:** Automatic suspension X days past due → terminate Y days later
|
|
|
|
### Analytics & Reporting (DECIDED)
|
|
- **Comprehensive analytics dashboard:**
|
|
- Revenue trends (daily, monthly, yearly)
|
|
- MRR (Monthly Recurring Revenue) and ARR (Annual Recurring Revenue)
|
|
- Churn rate and customer growth
|
|
- Plan popularity and conversion rates
|
|
- Outstanding invoices and overdue accounts
|
|
|
|
### Deployment & CI/CD (DECIDED)
|
|
- **CI/CD:** GitHub Actions pipeline
|
|
- Tests run on push
|
|
- Auto-deploy to staging environment
|
|
- Manual approval for production deployment
|
|
- **Environments:** Full staging environment (staging.account.ezscale.cloud with separate database)
|
|
|
|
## 5. Database Schema (Core Tables)
|
|
|
|
### Users & Auth
|
|
```
|
|
users
|
|
├── id, name, email, email_verified_at, password
|
|
├── status (active, suspended, banned)
|
|
├── phone, company
|
|
├── two_factor_secret, two_factor_recovery_codes
|
|
├── passkey_credentials (JSON for WebAuthn)
|
|
├── timestamps
|
|
|
|
user_profiles
|
|
├── id, user_id
|
|
├── billing_address (line1, line2, city, state, zip, country)
|
|
├── shipping_address (line1, line2, city, state, zip, country)
|
|
├── tax_id, tax_exempt
|
|
├── company_name, company_vat
|
|
├── notes (admin notes)
|
|
├── timestamps
|
|
|
|
roles (via spatie/laravel-permission)
|
|
├── id, name (admin, customer), guard_name, timestamps
|
|
|
|
permissions (via spatie/laravel-permission)
|
|
├── id, name, guard_name, timestamps
|
|
|
|
audit_logs
|
|
├── id, user_id, admin_id (nullable)
|
|
├── action (login, logout, service_provisioned, service_suspended, payment_failed, etc.)
|
|
├── resource_type, resource_id
|
|
├── ip_address, user_agent
|
|
├── changes (JSON - before/after state)
|
|
├── timestamps
|
|
```
|
|
|
|
### Billing
|
|
```
|
|
plans
|
|
├── id, name, slug, description
|
|
├── service_type (vps, dedicated, hosting, game_server)
|
|
├── price, currency, billing_cycle (monthly, quarterly, annual, hourly)
|
|
├── stripe_price_id, paypal_plan_id
|
|
├── features (JSON - RAM, CPU, disk, bandwidth, etc.)
|
|
├── stock_quantity (nullable - for limited dedicated server inventory)
|
|
├── status (active, hidden, archived)
|
|
├── sort_order
|
|
├── timestamps
|
|
|
|
subscriptions (extended from Cashier)
|
|
├── id, user_id, plan_id
|
|
├── gateway (stripe, paypal)
|
|
├── gateway_subscription_id
|
|
├── gateway_customer_id
|
|
├── gateway_price_id
|
|
├── status (active, past_due, cancelled, paused, trialing)
|
|
├── trial_ends_at, current_period_start, current_period_end
|
|
├── cancelled_at, ends_at
|
|
├── timestamps
|
|
|
|
subscription_items (Cashier-managed)
|
|
├── id, subscription_id, stripe_id, stripe_product, stripe_price
|
|
├── quantity, timestamps
|
|
|
|
invoices (extended from Cashier)
|
|
├── id, subscription_id, user_id
|
|
├── gateway (stripe, paypal), gateway_invoice_id
|
|
├── number (custom invoice numbering)
|
|
├── total, tax, currency, status
|
|
├── invoice_pdf (path to generated PDF)
|
|
├── due_date, paid_at
|
|
├── timestamps
|
|
|
|
invoice_items
|
|
├── id, invoice_id
|
|
├── description, amount, quantity
|
|
├── timestamps
|
|
|
|
payment_transactions
|
|
├── id, user_id, subscription_id (nullable), invoice_id (nullable)
|
|
├── gateway (stripe, paypal), gateway_transaction_id
|
|
├── amount, currency, status (succeeded, failed, refunded, pending)
|
|
├── payment_method (card, paypal, bank_transfer)
|
|
├── description, metadata (JSON)
|
|
├── timestamps
|
|
|
|
coupons
|
|
├── id, code, type (percentage, fixed_amount)
|
|
├── value, currency (for fixed_amount)
|
|
├── applies_to (all, specific_plans - JSON array of plan IDs)
|
|
├── max_uses, times_used
|
|
├── expires_at
|
|
├── timestamps
|
|
|
|
coupon_redemptions
|
|
├── id, coupon_id, user_id, subscription_id
|
|
├── discount_amount
|
|
├── timestamps
|
|
```
|
|
|
|
### Services & Provisioning
|
|
```
|
|
services
|
|
├── id, user_id, subscription_id, plan_id
|
|
├── service_type (vps, dedicated, hosting, game_server)
|
|
├── platform (virtfusion, pterodactyl, synergycp, enhance)
|
|
├── platform_service_id (ID in external system)
|
|
├── status (pending, active, suspended, terminated)
|
|
├── ipv4_address, ipv6_address
|
|
├── hostname, domain
|
|
├── credentials (encrypted JSON - username, password, access URLs)
|
|
├── provisioned_at, suspended_at, terminated_at
|
|
├── auto_renew (boolean)
|
|
├── timestamps
|
|
|
|
provisioning_logs
|
|
├── id, service_id, user_id
|
|
├── action (create, suspend, unsuspend, terminate, upgrade, downgrade)
|
|
├── platform, platform_response (JSON)
|
|
├── status (pending, success, failed)
|
|
├── error_message
|
|
├── admin_id (nullable - if manually triggered)
|
|
├── timestamps
|
|
|
|
bandwidth_usage
|
|
├── id, service_id
|
|
├── period_start, period_end
|
|
├── bytes_in, bytes_out, total_bytes
|
|
├── quota_bytes, overage_bytes
|
|
├── overage_charge
|
|
├── source (elastiflow)
|
|
├── timestamps
|
|
```
|
|
|
|
### Support (SupportPal Integration)
|
|
```
|
|
support_tickets (mirrored from SupportPal via webhooks)
|
|
├── id, user_id
|
|
├── supportpal_ticket_id
|
|
├── subject, status (open, closed, pending)
|
|
├── priority (low, medium, high, urgent)
|
|
├── last_reply_at
|
|
├── timestamps
|
|
|
|
announcements
|
|
├── id, title, content (HTML)
|
|
├── type (maintenance, feature, outage)
|
|
├── published_at, expires_at
|
|
├── timestamps
|
|
```
|
|
|
|
## 6. Key Integrations
|
|
|
|
### 6.1 VirtFusion API (VPS Provisioning)
|
|
**Endpoints needed:**
|
|
- `POST /api/vps/create` - Create new VPS instance
|
|
- `POST /api/vps/{id}/suspend` - Suspend VPS
|
|
- `POST /api/vps/{id}/unsuspend` - Unsuspend VPS
|
|
- `DELETE /api/vps/{id}` - Terminate VPS
|
|
- `GET /api/vps/{id}/status` - Get VPS status and resource usage
|
|
- `POST /api/vps/{id}/reboot` - Reboot VPS
|
|
|
|
**Provisioning Service:** `App\Services\Provisioning\VirtFusionService`
|
|
|
|
### 6.2 Pterodactyl API (Game Server Provisioning)
|
|
**Endpoints needed:**
|
|
- `POST /api/application/servers` - Create server
|
|
- `POST /api/application/servers/{id}/suspend` - Suspend
|
|
- `POST /api/application/servers/{id}/unsuspend` - Unsuspend
|
|
- `DELETE /api/application/servers/{id}` - Delete
|
|
- `GET /api/client/servers/{id}/resources` - Resource usage
|
|
|
|
**Provisioning Service:** `App\Services\Provisioning\PterodactylService`
|
|
|
|
### 6.3 SynergyCP API (Dedicated Server Provisioning)
|
|
**Endpoints needed:**
|
|
- `POST /api/server/provision` - Provision dedicated server
|
|
- `POST /api/server/{id}/suspend` - Suspend
|
|
- `POST /api/server/{id}/unsuspend` - Unsuspend
|
|
- `POST /api/server/{id}/terminate` - Terminate
|
|
- `GET /api/server/{id}` - Get server details and status
|
|
|
|
**Provisioning Service:** `App\Services\Provisioning\SynergyCPService`
|
|
|
|
### 6.4 Enhance API (Web Hosting Provisioning)
|
|
**Endpoints needed:**
|
|
- `POST /api/orgs/{org}/websites` - Create hosting account
|
|
- `PUT /api/orgs/{org}/websites/{id}/suspended` - Suspend
|
|
- `DELETE /api/orgs/{org}/websites/{id}` - Delete
|
|
- `GET /api/orgs/{org}/websites/{id}` - Get account status
|
|
|
|
**Provisioning Service:** `App\Services\Provisioning\EnhanceService`
|
|
|
|
### 6.5 ElastiFlow API (Bandwidth Monitoring)
|
|
**Integration approach:**
|
|
- Query Elasticsearch indices via REST API
|
|
- Aggregate bandwidth by service IP address and time period
|
|
- Calculate usage per billing cycle
|
|
- Store results in `bandwidth_usage` table
|
|
- Scheduled job runs daily to update bandwidth stats
|
|
|
|
**Service:** `App\Services\Monitoring\BandwidthService`
|
|
|
|
### 6.6 SupportPal API (Ticket System)
|
|
**Endpoints needed:**
|
|
- `GET /api/ticket/{id}` - Get ticket details
|
|
- `GET /api/ticket/user/{user_id}` - Get user's tickets
|
|
- `POST /api/ticket` - Create new ticket
|
|
- `POST /api/ticket/{id}/reply` - Reply to ticket
|
|
- `GET /api/ticket/{id}/replies` - Get ticket thread
|
|
|
|
**SSO Implementation:** SupportPal supports SAML or custom SSO - use Laravel Passport tokens
|
|
|
|
**Service:** `App\Services\Support\SupportPalService`
|
|
|
|
### 6.7 Email Notifications (Mailgun/SendGrid)
|
|
**Laravel Notifications for:**
|
|
- Welcome email (account created)
|
|
- Email verification
|
|
- Invoice generated (with PDF attachment)
|
|
- Payment received (receipt)
|
|
- Payment failed (with retry instructions)
|
|
- Service provisioned (credentials)
|
|
- Service suspended (past due payment)
|
|
- Service expiring soon (renewal reminder)
|
|
- Bandwidth usage alerts (75%, 90%, 100%)
|
|
- Bandwidth overage charge (end of cycle)
|
|
- Ticket updates (new reply, status change)
|
|
|
|
### 6.8 Discord Webhooks (Admin Alerts)
|
|
**Notifications sent to Discord:**
|
|
- New customer signup
|
|
- New order / subscription created
|
|
- High-value order (e.g., >$500)
|
|
- Payment failure
|
|
- Service suspension
|
|
- Service cancellation
|
|
- System errors / provisioning failures
|
|
- Security alerts (admin login failures, etc.)
|
|
|
|
## 7. Security Architecture
|
|
|
|
### Authentication
|
|
- **Customer Auth:** Email + password (bcrypt), optional 2FA (TOTP), passkey support (WebAuthn)
|
|
- **Admin Auth:** Email + password + **required** 2FA (passkeys preferred), behind Cloudflare Zero Trust
|
|
- **Session Management:** Redis-backed sessions with secure cookies
|
|
- **API Auth:** Laravel Sanctum tokens for customer/admin APIs
|
|
|
|
### Authorization
|
|
- **Roles:** `admin` and `customer` via spatie/laravel-permission
|
|
- **Policies:** Laravel policies for resource-level authorization (can user view this service?)
|
|
- **Admin Actions:** All admin actions logged to `audit_logs` table
|
|
- **Admin Impersonation:** Admins can impersonate customers (with audit logging)
|
|
|
|
### Data Protection
|
|
- **Encryption at Rest:** Service credentials, API keys, payment tokens encrypted in database
|
|
- **HTTPS Everywhere:** All traffic HTTPS-only, HSTS headers
|
|
- **CSRF Protection:** All forms CSRF-protected
|
|
- **Rate Limiting:** Login, registration, API endpoints rate-limited
|
|
- **Input Validation:** Laravel Form Request classes for all inputs
|
|
- **SQL Injection Prevention:** Eloquent ORM + prepared statements
|
|
- **XSS Prevention:** Blade/Vue escaping, CSP headers
|
|
|
|
### Admin Panel Security
|
|
- **Cloudflare Zero Trust:** Admin panel behind Zero Trust access control
|
|
- **Passkeys/2FA:** Required for all admin accounts
|
|
- **IP Logging:** All admin actions logged with IP address
|
|
- **Suspicious Activity Alerts:** Discord webhook for failed admin logins
|
|
|
|
## 8. Development Phases
|
|
|
|
### Phase 1: Foundation & Core Setup
|
|
- ~~Initialize Laravel 12 with Vue + Inertia starter kit~~ ✓ (base install in `website/`)
|
|
- Configure domains: ezscale.cloud, account.ezscale.cloud, admin.ezscale.cloud
|
|
- Set up MySQL with replication, Redis
|
|
- Install dependencies: Cashier, Fortify, Passport, PayPal, Spatie
|
|
- Create database schema and migrations
|
|
- Set up authentication (Fortify + 2FA + passkeys)
|
|
- Configure Cloudflare Zero Trust for admin panel
|
|
- Set up CI/CD pipeline (GitHub Actions)
|
|
|
|
### Phase 2: Billing & Subscriptions
|
|
- Implement `BillingServiceInterface` (Stripe + PayPal)
|
|
- Build plan catalog (VPS, Dedicated, Hosting, Game Server plans)
|
|
- Subscription creation and management
|
|
- Invoice generation (PDF, custom numbering, multi-currency)
|
|
- Payment method management (multiple cards/PayPal per customer)
|
|
- Coupon system (creation, redemption, validation)
|
|
- Webhook handlers for Stripe and PayPal
|
|
- Automatic overage billing for bandwidth
|
|
- Tax calculation (TaxJar/Avalara or manual)
|
|
|
|
### Phase 3: Provisioning Automation
|
|
- `ProvisioningServiceInterface` abstraction
|
|
- VirtFusion provisioning service
|
|
- Pterodactyl provisioning service
|
|
- SynergyCP provisioning service
|
|
- Enhance provisioning service
|
|
- Event-driven provisioning (listen to payment success events)
|
|
- Credential generation and secure storage
|
|
- Provisioning failure handling and retry logic
|
|
|
|
### Phase 4: Customer Dashboard (account.ezscale.cloud)
|
|
- Service overview dashboard
|
|
- Active services list with status and resource usage
|
|
- Bandwidth usage graphs (from ElastiFlow)
|
|
- Billing history and invoices (PDF download)
|
|
- Payment methods management
|
|
- Plan upgrades/downgrades (self-service)
|
|
- Subscription cancellation (with survey)
|
|
- Profile and account settings
|
|
- 2FA and passkey setup
|
|
|
|
### Phase 5: Admin Panel (admin.ezscale.cloud)
|
|
- Analytics dashboard (MRR, ARR, churn, revenue trends)
|
|
- Customer management (view, edit, impersonate, notes)
|
|
- Service management (view all services, suspend, terminate, modify)
|
|
- Order management (pending orders, approvals)
|
|
- Invoice management (view, edit, manual invoicing)
|
|
- Coupon management (create, edit, deactivate)
|
|
- Plan management (create, edit, pricing changes)
|
|
- System configuration (email templates, tax rates, suspension policies)
|
|
- Audit log viewer
|
|
|
|
### Phase 6: Bandwidth Monitoring & Billing
|
|
- ElastiFlow API integration
|
|
- Bandwidth data collection and storage
|
|
- Usage calculation per billing cycle
|
|
- Bandwidth graphs in customer dashboard
|
|
- Multi-threshold alerts (75%, 90%, 100%)
|
|
- Automatic overage billing
|
|
- Admin bandwidth reports
|
|
|
|
### Phase 7: SupportPal Integration
|
|
- SSO implementation (Laravel Passport + SupportPal)
|
|
- Ticket viewing in customer dashboard
|
|
- Ticket creation via SupportPal API
|
|
- Webhook handlers for ticket updates
|
|
- Discord notifications for new tickets
|
|
|
|
### Phase 8: Marketing Frontend (ezscale.cloud)
|
|
- Product catalog pages (VPS, Dedicated, Hosting, Game Servers)
|
|
- Pricing pages with plan comparison
|
|
- Signup flow with plan selection
|
|
- Blog/news section
|
|
- Knowledge base / FAQ
|
|
- Legal pages (Terms, Privacy, AUP)
|
|
|
|
### Phase 9: Testing, Migration & Launch
|
|
- Comprehensive testing (unit, feature, integration, E2E)
|
|
- Security audit and penetration testing
|
|
- WHMCS data export and migration scripts
|
|
- Customer data migration (users, subscriptions, services, invoices)
|
|
- Parallel operation period (run both systems)
|
|
- Full cutover to new platform
|
|
- Monitoring and alerting setup
|
|
- Post-launch support and bug fixes
|
|
|
|
## 9. WHMCS Migration Plan
|
|
|
|
### Migration Scope (DECIDED)
|
|
- **Full historical data migration:**
|
|
- All customer accounts and profiles
|
|
- All subscriptions (active and cancelled)
|
|
- Complete invoice history
|
|
- Complete payment history
|
|
- All support tickets (migrate to SupportPal or archive)
|
|
- Service configurations
|
|
- Product/plan mapping
|
|
|
|
### Migration Approach
|
|
- **Customer Volume:** Medium (100-1000 customers)
|
|
- **Strategy:** Automated migration scripts with manual verification
|
|
- **Staging:** Test migration in staging environment first
|
|
- **Parallel Operation:** Run WHMCS and new platform in parallel for 30 days
|
|
- **Cutover:** Maintenance window for final cutover, redirect WHMCS URLs
|
|
|
|
### Migration Steps
|
|
1. Export WHMCS database to SQL dump
|
|
2. Map WHMCS product IDs to new plan IDs
|
|
3. Create migration scripts (Laravel commands):
|
|
- `php artisan migrate:whmcs-customers` - Import customers and profiles
|
|
- `php artisan migrate:whmcs-subscriptions` - Import active subscriptions (coordinate with Stripe/PayPal)
|
|
- `php artisan migrate:whmcs-invoices` - Import invoice history
|
|
- `php artisan migrate:whmcs-payments` - Import payment history
|
|
- `php artisan migrate:whmcs-services` - Import service configurations
|
|
- `php artisan migrate:whmcs-tickets` - Migrate tickets to SupportPal
|
|
4. Verify data integrity in staging
|
|
5. Email customers about platform migration
|
|
6. Set up redirects from old WHMCS URLs
|
|
7. Execute final migration during maintenance window
|
|
8. Monitor for issues during parallel operation period
|
|
|
|
## 10. Open Questions & Decisions Needed
|
|
|
|
### Decided ✓
|
|
- [x] Payment gateway: Stripe + PayPal
|
|
- [x] Frontend stack: Vue 3 + Inertia.js
|
|
- [x] Infrastructure: VirtFusion, Pterodactyl, SynergyCP, Enhance
|
|
- [x] Bandwidth monitoring: ElastiFlow (NetFlow/sFlow)
|
|
- [x] Support system: SupportPal with full integration
|
|
- [x] Domain structure: ezscale.cloud / account / admin
|
|
- [x] Hosting: Own infrastructure with full DB redundancy
|
|
- [x] CI/CD: GitHub Actions with staging environment
|
|
- [x] Email: Mailgun or SendGrid
|
|
- [x] Admin security: Cloudflare Zero Trust + passkeys
|
|
- [x] Customer features: Full self-service (upgrades, downgrades, cancellations)
|
|
- [x] Provisioning: Fully automated for all service types
|
|
- [x] Analytics: Comprehensive dashboard (MRR, ARR, churn, etc.)
|
|
- [x] Multi-currency: Yes (Stripe supports this)
|
|
- [x] Coupons: Full system with all features
|
|
- [x] WHMCS migration: Full historical data import
|
|
|
|
### Still To Decide
|
|
- [ ] Tax calculation approach: TaxJar/Avalara integration vs manual tax rates?
|
|
- [ ] Email service final choice: Mailgun or SendGrid?
|
|
- [ ] Admin panel subdomain: admin.ezscale.cloud or something less obvious for security?
|
|
- [ ] Dedicated server semi-automation: How to handle limited hardware inventory (waitlist, manual approval)?
|
|
- [ ] NetFlow/sFlow deployment: Timeline for switching Juniper to flow exports?
|
|
- [x] ~~Customer portal theme/branding~~ **DECIDED: Vuexy VueJS + Laravel Admin Dashboard Template**
|
|
|
|
## 11. Tech Stack Summary
|
|
|
|
| Layer | Technology |
|
|
|-------|------------|
|
|
| **Framework** | Laravel 12 (PHP 8.2+) |
|
|
| **Frontend** | Vue 3 + Inertia.js + Tailwind CSS |
|
|
| **UI Theme** | Vuexy VueJS + Laravel Admin Dashboard |
|
|
| **Database** | MySQL 8.x (multi-region replication) |
|
|
| **Cache/Queue** | Redis |
|
|
| **Payments** | Laravel Cashier Stripe v16 + srmklive/laravel-paypal |
|
|
| **Auth** | Laravel Fortify + Passport (OAuth2) |
|
|
| **Roles** | spatie/laravel-permission |
|
|
| **Email** | Mailgun or SendGrid (via Laravel Mail) |
|
|
| **2FA** | TOTP (Authenticator apps) + WebAuthn (passkeys) |
|
|
| **Admin Security** | Cloudflare Zero Trust |
|
|
| **CI/CD** | GitHub Actions |
|
|
| **Monitoring** | ElastiFlow (bandwidth), Laravel Telescope (debugging) |
|
|
| **Provisioning APIs** | VirtFusion, Pterodactyl, SynergyCP, Enhance |
|
|
| **Support** | SupportPal (external integration) |
|
|
| **Notifications** | Laravel Notifications + Discord webhooks |
|