Init Commit
This commit is contained in:
604
PROJECT_DEVELOPMENT.md
Normal file
604
PROJECT_DEVELOPMENT.md
Normal file
@@ -0,0 +1,604 @@
|
||||
# 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
|
||||
- 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 |
|
||||
Reference in New Issue
Block a user