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

Server Linux (Ubuntu 22.04 / Debian 12 atau lebih baru direkomendasikan)
Docker Engine ≥ 24 dan Docker Compose v2
Domain dengan DNS yang sudah diarahkan ke server (untuk HTTPS otomatis via Caddy)
SMTP server untuk pengiriman email (verifikasi akun & reset password)
Port 80 dan 443 terbuka di firewall

Konfigurasi Environment Variables

Salin .env.docker.example ke .env lalu isi semua variabel:

.env
1## SMTP — dibutuhkan untuk email verifikasi & reset password
2SMTP_HOST=mail.example.com
3SMTP_PORT=465
4SMTP_USERNAME=nxgate@example.com
5SMTP_PASSWORD=your-smtp-password
6SMTP_SENDER=NxGate <nxgate@example.com>
7
8## JWT — wajib diisi dengan string random ≥ 32 karakter
9JWT_SECRET=ganti-dengan-string-random-panjang
10
11## reCAPTCHA (opsional — bisa dinonaktifkan)
12PUBLIC_RECAPTCHA_SITE_KEY=XXXXXX
13RECAPTCHA_SECRET_KEY=XXXXXX
14PUBLIC_DISABLE_RECAPTCHA=false
15
16## Google OAuth (opsional — isi "none" jika tidak digunakan)
17PUBLIC_GOOGLE_AUTH_CLIENT_ID=none
18
19## Sign-up (set true untuk menonaktifkan pendaftaran baru)
20PUBLIC_DISABLE_SIGN_UP=false
21
22## URL deployment
23PUBLIC_BACKEND_URL=https://api.nxgate.example.com
24PUBLIC_FRONTEND_URL=https://nxgate.example.com
25
26## Database MySQL
27MYSQL_HOSTNAME=db
28MYSQL_PORT=3306
29MYSQL_DATABASE=license-gate
30MYSQL_ROOT_PASSWORD=root-password-aman
31MYSQL_USER=mysqluser
32MYSQL_PASSWORD=user-password-aman
33
34## Domain untuk Caddy (harus cocok dengan URL di atas)
35BACKEND_FQDN=api.nxgate.example.com
36FRONTEND_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).

docker-compose.yml
1version: '3.8'
2
3services:
4 db:
5 image: 'mysql:9.0.1'
6 restart: always
7 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/mysql
14 networks:
15 - internal
16
17 api:
18 build:
19 context: ./backend
20 dockerfile: Dockerfile
21 command: >
22 sh -c "sleep 30 && npm run prisma-up && npm run prisma-gen && npm run start"
23 depends_on:
24 - db
25 environment:
26 DATABASE_URL: "mysql://${MYSQL_USER}:${MYSQL_PASSWORD}@${MYSQL_HOSTNAME}:${MYSQL_PORT}/${MYSQL_DATABASE}"
27 NODE_ENV: production
28 PORT: 3000
29 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/login
37 RESET_PASSWORD_URL: ${PUBLIC_FRONTEND_URL}/auth/password
38 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 - caddy
44 - internal
45 labels:
46 caddy: ${BACKEND_FQDN}
47 caddy.reverse_proxy: "{{upstreams http 3000}}"
48
49 web:
50 build:
51 context: .
52 dockerfile: ./frontend/Dockerfile
53 env_file:
54 - .env
55 depends_on:
56 - api
57 networks:
58 - caddy
59 labels:
60 caddy: ${FRONTEND_FQDN}
61 caddy.reverse_proxy: "{{upstreams http 5000}}"
62
63 caddy:
64 image: lucaslorentz/caddy-docker-proxy:ci-alpine
65 ports:
66 - 80:80
67 - 443:443
68 environment:
69 - CADDY_INGRESS_NETWORKS=caddy
70 networks:
71 - caddy
72 volumes:
73 - /var/run/docker.sock:/var/run/docker.sock
74 - caddy_data:/data
75 restart: unless-stopped
76
77volumes:
78 db_data:
79 caddy_data: {}
80
81networks:
82 caddy:
83 external: true
84 internal:

Langkah Deploy

1# 1. Clone repository
2git clone https://github.com/NoxlyDev/NxGate.git
3cd NxGate
4
5# 2. Salin dan edit file environment
6cp .env.docker.example .env
7nano .env # isi semua variabel wajib
8
9# 3. Buat Docker network untuk Caddy
10docker network create caddy
11
12# 4. Build dan jalankan semua service
13docker compose up -d --build
14
15# 5. Pantau log untuk memastikan berhasil
16docker 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 terbaru
2git pull origin main
3
4# Rebuild dan restart service
5docker compose up -d --build
6
7# Jalankan migrasi database (jika ada)
8# Migrasi dijalankan otomatis saat api start (prisma-up)
9docker compose restart api

Panduan Lanjutan