Self Hosting
NxGate dirancang untuk di-deploy sendiri di infrastruktur Anda. Panduan ini menjelaskan cara menjalankan NxGate menggunakan Docker Compose — cara yang direkomendasikan untuk production.
Persyaratan
Konfigurasi Environment Variables
Salin .env.docker.example ke .env lalu isi semua variabel:
1## SMTP — dibutuhkan untuk email verifikasi & reset password2SMTP_HOST=mail.example.com3SMTP_PORT=4654SMTP_USERNAME=nxgate@example.com5SMTP_PASSWORD=your-smtp-password6SMTP_SENDER=NxGate <nxgate@example.com>78## JWT — wajib diisi dengan string random ≥ 32 karakter9JWT_SECRET=ganti-dengan-string-random-panjang1011## reCAPTCHA (opsional — bisa dinonaktifkan)12PUBLIC_RECAPTCHA_SITE_KEY=XXXXXX13RECAPTCHA_SECRET_KEY=XXXXXX14PUBLIC_DISABLE_RECAPTCHA=false1516## Google OAuth (opsional — isi "none" jika tidak digunakan)17PUBLIC_GOOGLE_AUTH_CLIENT_ID=none1819## Sign-up (set true untuk menonaktifkan pendaftaran baru)20PUBLIC_DISABLE_SIGN_UP=false2122## URL deployment23PUBLIC_BACKEND_URL=https://api.nxgate.example.com24PUBLIC_FRONTEND_URL=https://nxgate.example.com2526## Database MySQL27MYSQL_HOSTNAME=db28MYSQL_PORT=330629MYSQL_DATABASE=license-gate30MYSQL_ROOT_PASSWORD=root-password-aman31MYSQL_USER=mysqluser32MYSQL_PASSWORD=user-password-aman3334## Domain untuk Caddy (harus cocok dengan URL di atas)35BACKEND_FQDN=api.nxgate.example.com36FRONTEND_FQDN=nxgate.example.com
Variabel Wajib
JWT_SECRET, MYSQL_ROOT_PASSWORD, MYSQL_PASSWORD, BACKEND_FQDN, dan FRONTEND_FQDN wajib diisi sebelum menjalankan. JWT_SECRET minimal 32 karakter random.
Docker Compose
File docker-compose.yml menjalankan empat service: MySQL (database), API (backend), Web (frontend), dan Caddy (reverse proxy + HTTPS otomatis).
1version: '3.8'23services:4 db:5 image: 'mysql:9.0.1'6 restart: always7 environment:8 MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}9 MYSQL_DATABASE: ${MYSQL_DATABASE}10 MYSQL_USER: ${MYSQL_USER}11 MYSQL_PASSWORD: ${MYSQL_PASSWORD}12 volumes:13 - db_data:/var/lib/mysql14 networks:15 - internal1617 api:18 build:19 context: ./backend20 dockerfile: Dockerfile21 command: >22 sh -c "sleep 30 && npm run prisma-up && npm run prisma-gen && npm run start"23 depends_on:24 - db25 environment:26 DATABASE_URL: "mysql://${MYSQL_USER}:${MYSQL_PASSWORD}@${MYSQL_HOSTNAME}:${MYSQL_PORT}/${MYSQL_DATABASE}"27 NODE_ENV: production28 PORT: 300029 JWT_SECRET: ${JWT_SECRET}30 SMTP_HOST: ${SMTP_HOST}31 SMTP_PORT: ${SMTP_PORT}32 SMTP_USERNAME: ${SMTP_USERNAME}33 SMTP_PASSWORD: ${SMTP_PASSWORD}34 SMTP_SENDER: ${SMTP_SENDER}35 CORS_ORIGIN: ${PUBLIC_FRONTEND_URL}36 SIGN_IN_URL: ${PUBLIC_FRONTEND_URL}/auth/login37 RESET_PASSWORD_URL: ${PUBLIC_FRONTEND_URL}/auth/password38 RECAPTCHA_SECRET_KEY: ${RECAPTCHA_SECRET_KEY}39 GOOGLE_AUTH_CLIENT_ID: ${PUBLIC_GOOGLE_AUTH_CLIENT_ID}40 DISABLE_RECAPTCHA: ${PUBLIC_DISABLE_RECAPTCHA}41 DISABLE_SIGN_UP: ${PUBLIC_DISABLE_SIGN_UP}42 networks:43 - caddy44 - internal45 labels:46 caddy: ${BACKEND_FQDN}47 caddy.reverse_proxy: "{{upstreams http 3000}}"4849 web:50 build:51 context: .52 dockerfile: ./frontend/Dockerfile53 env_file:54 - .env55 depends_on:56 - api57 networks:58 - caddy59 labels:60 caddy: ${FRONTEND_FQDN}61 caddy.reverse_proxy: "{{upstreams http 5000}}"6263 caddy:64 image: lucaslorentz/caddy-docker-proxy:ci-alpine65 ports:66 - 80:8067 - 443:44368 environment:69 - CADDY_INGRESS_NETWORKS=caddy70 networks:71 - caddy72 volumes:73 - /var/run/docker.sock:/var/run/docker.sock74 - caddy_data:/data75 restart: unless-stopped7677volumes:78 db_data:79 caddy_data: {}8081networks:82 caddy:83 external: true84 internal:
Langkah Deploy
1# 1. Clone repository2git clone https://github.com/NoxlyDev/NxGate.git3cd NxGate45# 2. Salin dan edit file environment6cp .env.docker.example .env7nano .env # isi semua variabel wajib89# 3. Buat Docker network untuk Caddy10docker network create caddy1112# 4. Build dan jalankan semua service13docker compose up -d --build1415# 5. Pantau log untuk memastikan berhasil16docker compose logs -f api
Saat pertama kali berjalan, API service akan menunggu 30 detik agar MySQL siap, kemudian otomatis menjalankan migrasi database (prisma-up) dan generate Prisma client. Proses ini normal dan hanya terjadi sekali.
Upgrade NxGate
1# Pull perubahan terbaru2git pull origin main34# Rebuild dan restart service5docker compose up -d --build67# Jalankan migrasi database (jika ada)8# Migrasi dijalankan otomatis saat api start (prisma-up)9docker compose restart api