4.3 KiB
Travel AntarKota
Travel AntarKota is a premium, high-performance, and feature-rich containerized Intercity Travel Booking Web Application built using Next.js 14, Prisma, and MySQL.
Designed with a modern, responsive Glassmorphism Dark Theme, it provides customers with a seamless ticket booking workflow and gives administrators full control over routes, schedules, transactions, and branding options.
Key Features
👤 Customer Features
- Route Search: Find active intercity schedules by departure and arrival cities, date, and ticket pricing.
- Seat Selection: Interactive, vehicle-specific visual layout selection (Toyota HiAce 10-seater or Executive Bus 30-seater) preventing duplicate seat bookings in real time.
- Digital Ticketing: Generate and view digital tickets with QR/barcode references once payment is verified.
- Order Tracking: Check booking status (Pending, Lunas, Batal) at any time.
- User Profile: Dedicated customer dashboard to manage active tickets, view travel history, update personal details, and change security passwords.
⚙️ Administrator Features
- Dashboard Overview: Visual overview statistics for bookings, routes, active vehicles, revenue, and pending schedules.
- Route Management: Add, update, or remove intercity routes, durations, and pricing.
- Schedule Management: Create departure schedules linked to active routes, select vehicle formats, and define pricing overrides.
- Booking Management: Audit transaction logs, view passenger details, confirm payments, and cancel bookings.
- Dynamic Branding & Styling: Custom configuration via database settings:
- Custom Brand Name and Logo Icons/Images.
- Dynamically adjustable Primary Theme Color (calculates light/dark relative luminance dynamically on page load to adjust contrast and prevent styling issues).
- Admin Profile: Manage administrator information and securely update passwords.
Tech Stack & Architecture
- Frontend & Backend: Next.js 14.2.x (React Server Components, App Router).
- Database ORM: Prisma Client v7.8.0.
- Database: MySQL 8.0.
- Database Driver Adapter:
@prisma/adapter-mariadb(MariaDB node-driver compatibility layer). - Security & Session: HTTP-Only Cookie-based JWT tokens (
jose) with password verification hashed viabcryptjs. - Containerization: Multi-stage
Dockerfileanddocker-compose.ymlfor isolated production-ready orchestration.
Production Deployment & Orchestration
The application is fully containerized. A robust, non-blocking Next.js build configuration ensures that all dynamic pages are statically ignored at build-time using a dummy mock Prisma adapter, bypassing database query timeouts entirely.
Requirements
- Docker and Docker Compose installed.
Setup and Running the Application
-
Clone and Navigate:
git clone <repository_url> cd travel-antarkota -
Launch Container Services: Start the MySQL database and Next.js application in background mode:
docker compose up -d --build -
Database Auto-Orchestration:
- The Next.js container automatically executes
docker-entrypoint.shon startup. - It performs a TCP healthcheck to wait until MySQL is fully initialized.
- It executes
prisma db pushto synchronize tables. - It checks and seeds initial system settings and creates the default administrator:
- Admin Email:
admin@travel.com - Admin Password:
admin123
- Admin Email:
- The Next.js container automatically executes
-
Accessing the App:
- User Frontend: http://localhost:3000
- Admin Dashboard: http://localhost:3000/admin (Log in using the default admin credentials).
Configuration
Secrets and settings are managed strictly through environment variables inside docker-compose.yml:
JWT_SECRET: Secret key used for signing session JSON Web Tokens.ADMIN_EMAIL: Initial admin account email created during database seeding.ADMIN_PASSWORD: Initial admin account password.
All database transactions, session management, and image uploads (stored as persistent base64 long-text entries in MySQL) are self-contained and run out of the box with zero external configuration requirements.
License
This project is licensed under the MIT License - see the LICENSE file for details.