Enterprise-grade hosting storefront and client portal built with Next.js 14 and Supabase.
VexaNode is an open-source hosting storefront and billing platform. It provides a complete customer-facing portal for purchasing and managing game servers, VPS instances, Lavalink nodes, and web hosting — paired with an admin panel for managing users, orders, and support tickets.
The frontend is built on Next.js 14 App Router with a glassmorphic dark-theme design. The backend uses Supabase (PostgreSQL) for persistence, NextAuth.js for authentication, and Cashfree for payment gateway integration.
-
Storefront — Interactive landing pages for VPS, game servers, Lavalink nodes, web hosting, and domains with live billing frequency calculators and location selectors.
-
Ticket System — Create, reply to, and track support tickets with priority states.
-
Admin Panel — Order management, ticket queue, system metrics, and global configuration controls (currency rates, discount tiers, storefront toggles).
-
Domain Checker — Integrates with a domain availability API with a frosted-glass search UI.
| Layer | Technology |
|---|---|
| Framework | Next.js 14 (App Router) |
| Language | TypeScript |
| Database | Supabase (PostgreSQL) |
| Auth | NextAuth.js v4 |
| Payments | Cashfree Gateway |
| Styling | Tailwind CSS + Framer Motion |
| Deployment | Vercel / PM2 + Nginx |
VexaNode/
├── app/
│ ├── api/ # Route handlers
│ │ ├── admin/ # Admin data, settings, and actions
│ │ ├── auth/ # NextAuth config and user registration
│ │ ├── domains/ # Domain availability check
│ │ ├── lavalink/ # Lavalink node stats
│ │ ├── orders/ # Order submission
│ │ ├── payments/ # Cashfree gateway config
│ │ ├── tickets/ # Ticket CRUD and replies
│ │ └── user/ # Session profile retrieval
│ ├── components/ # Shared UI components (Navbar, FAQ, Pricing)
│ ├── config/ # Theme variables and nav mappings
│ ├── (pages)/ # Public-facing storefront pages
│ │ ├── vps/
│ │ ├── games/
│ │ ├── lavalink/
│ │ ├── domains/
│ │ └── webhosting/
│ └── (legal)/ # Policy and legal pages (TOS, SLA, AUP, etc.)
├── lib/ # Supabase client helpers and query utilities
├── public/ # Static assets
├── types/ # TypeScript interface definitions
└── setup_database.sql # Supabase schema setup script
All tables live in the public schema of your Supabase project. Run setup_database.sql in the Supabase SQL Editor to initialize them.
Tables:
users— Core user records (NextAuth adapter)accounts— OAuth provider accounts linked to userssessions— Active JWT sessionsverification_tokens— Email verification tokensprofiles— Extended user profiles (status, admin flag, join date)orders— Service orders with proof upload and expiry trackingtickets— Support ticket records with priority and statusticket_replies— Append-only reply log for each ticketsettings— Key/value store for global admin configuration (JSONB values)
A PostgreSQL trigger (on_auth_user_created) automatically creates a profiles row on first user insert.
| Endpoint | Method | Auth | Description |
|---|---|---|---|
/api/auth/register |
POST |
Public | Create a new credentials-based user |
/api/user/data |
GET |
Session | Fetch active orders and profile for current user |
/api/orders/create |
POST |
Session | Submit a new service order |
/api/tickets |
GET, POST |
Session | List tickets or create a new one |
/api/tickets/[id] |
GET |
Session | Fetch a single ticket and its replies |
/api/tickets/[id]/reply |
POST |
Session | Append a reply to a ticket |
/api/admin/data |
GET |
Admin | Pull user list, order history, ticket queue, and metrics |
/api/admin/settings |
POST |
Admin | Update global platform configuration |
/api/domains/check |
GET |
Public | Check domain name availability |
- Node.js v18 or later
- A Supabase project
- Discord and Google OAuth applications (optional, for social login)
# 1. Clone the repository
git clone https://github.com/Ayushisingh09/VexaNode.git
cd VexaNode
# 2. Install dependencies
npm install
# 3. Configure environment variables
cp .env.example .env.local
# Fill in your values (see Environment Variables below)
# 4. Initialize the database
# Run setup_database.sql in your Supabase SQL Editor
# 5. Start the development server
npm run devOpen http://localhost:3000 in your browser.
Create a .env.local file in the project root:
# Supabase
NEXT_PUBLIC_SUPABASE_URL="https://<project-id>.supabase.co"
SUPABASE_SERVICE_ROLE_KEY="<supabase-service-role-key>"
# NextAuth
NEXTAUTH_SECRET="<random-32-char-secret>"
NEXTAUTH_URL="http://localhost:3000"
# Discord OAuth
DISCORD_CLIENT_ID="<discord-client-id>"
DISCORD_CLIENT_SECRET="<discord-client-secret>"
# Google OAuth
GOOGLE_CLIENT_ID="<google-client-id>"
GOOGLE_CLIENT_SECRET="<google-client-secret>"- Push your repository to GitHub.
- Import the project into Vercel.
- Add all environment variables in Project Settings → Environment Variables.
- Deploy. Vercel handles edge functions, static optimization, and SSL automatically.
# Build and start with PM2
npm run build
pm2 start npm --name "vexanode" -- start
pm2 saveNginx reverse proxy config (/etc/nginx/sites-available/vexanode.cloud):
server {
listen 80;
server_name vexanode.cloud www.vexanode.cloud;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
}
}sudo ln -s /etc/nginx/sites-available/vexanode.cloud /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginxUse Certbot to provision a free SSL certificate.
- All protected API routes validate sessions with
getServerSession(authOptions)server-side before any database access. - Supabase is accessed via the service role client exclusively from server-side route handlers — never exposed to the client.
- Passwords are never returned in any API response payload.
- RLS (Row Level Security) is intentionally bypassed server-side via the service role client; permission checks are enforced at the Next.js layer.
Contributions are welcome. Please open an issue first to discuss what you'd like to change. Pull requests should target the main branch.
- Fork the repository
- Create a feature branch (
git checkout -b feat/your-feature) - Commit your changes (
git commit -m 'feat: add your feature') - Push to your branch (
git push origin feat/your-feature) - Open a pull request
- Ayushisingh09 — Core developer, authentication systems, database architecture
- titanxdevz — Platform infrastructure, server operations
MIT © VexaNode Contributors