9.4 KiB
Deploy Debian 13 Production Low RAM
Panduan ini mencatat langkah deploy production Abel Birdnest pada server Debian 13 kosong dengan RAM kecil. Jalur ini sudah terbukti bisa dipakai dengan mengaktifkan swap sebelum next build.
Target:
- Domain:
abelbirdnest.id - SSH port:
3853 - App user:
abelbirdnest - App path:
/var/www/abelbirdnest-web - App port:
3007 - Database: PostgreSQL lokal
- Reverse proxy: Nginx
- SSL: Let's Encrypt
1. Login Server
ssh -p 3853 root@IP_SERVER
Jika memakai user sudo:
ssh -p 3853 namauser@IP_SERVER
2. DNS
Pastikan DNS mengarah ke IP server:
abelbirdnest.id A IP_SERVER
www.abelbirdnest.id A IP_SERVER
Cek dari komputer lokal:
dig +short abelbirdnest.id
dig +short www.abelbirdnest.id
3. Install Paket Dasar
sudo apt update
sudo apt full-upgrade -y
sudo apt install -y git curl ca-certificates build-essential nodejs npm postgresql postgresql-contrib nginx certbot python3-certbot-nginx ufw
Cek versi:
node -v
npm -v
psql --version
nginx -v
4. Firewall
Karena SSH memakai port 3853:
sudo ufw allow 3853/tcp
sudo ufw allow 'Nginx Full'
sudo ufw enable
sudo ufw status
Jangan tutup akses SSH lama sebelum login lewat port 3853 sudah terbukti berhasil.
5. Aktifkan Swap untuk Server RAM Rendah
Jika server hanya punya RAM kecil, npm run build bisa mati dengan pesan seperti:
Next.js build worker exited with code: null and signal: SIGKILL
Itu biasanya karena proses build kehabisan memori. Aktifkan swap sebelum build.
Swap 2 GB:
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
Buat permanen setelah reboot:
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Cek:
free -h
swapon --show
Jika 2 GB masih kurang, ganti menjadi 4 GB:
sudo swapoff /swapfile
sudo rm /swapfile
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
free -h
Jika /etc/fstab sudah berisi baris /swapfile, tidak perlu menambah baris lagi.
6. Buat User Aplikasi
sudo useradd -r -m -d /var/www/abelbirdnest-web -s /bin/bash abelbirdnest
sudo mkdir -p /var/www/abelbirdnest-web
sudo chown -R abelbirdnest:abelbirdnest /var/www/abelbirdnest-web
7. Clone Repo
sudo -u abelbirdnest -H bash
cd /var/www/abelbirdnest-web
git clone https://git.iptek.co/wirabasalamah/AbelBirdNest-Stock.git .
git checkout main
exit
Jika Git meminta login atau token, gunakan credential Git internal yang berlaku.
8. Setup Database PostgreSQL
Generate password database:
openssl rand -base64 32
Masuk PostgreSQL:
sudo -u postgres psql
Buat user dan database. Ganti GANTI_PASSWORD_DB_KUAT dengan password yang dibuat tadi.
CREATE USER abelbirdnest_app WITH PASSWORD 'GANTI_PASSWORD_DB_KUAT';
CREATE DATABASE abelbirdnest_prod OWNER abelbirdnest_app;
REVOKE ALL ON DATABASE abelbirdnest_prod FROM PUBLIC;
GRANT ALL PRIVILEGES ON DATABASE abelbirdnest_prod TO abelbirdnest_app;
\q
Tes koneksi:
psql "postgresql://abelbirdnest_app:GANTI_PASSWORD_DB_KUAT@127.0.0.1:5432/abelbirdnest_prod?schema=public"
Keluar dari prompt psql:
\q
9. Buat Environment Production
Generate secret:
openssl rand -base64 48
Buat file env:
sudo -u abelbirdnest nano /var/www/abelbirdnest-web/.env.production
Isi:
NODE_ENV=production
PORT=3007
APP_URL=https://abelbirdnest.id
DATABASE_URL="postgresql://abelbirdnest_app:GANTI_PASSWORD_DB_KUAT@127.0.0.1:5432/abelbirdnest_prod?schema=public"
AUTH_SECRET="GANTI_DENGAN_HASIL_OPENSSL"
AUTH_BOOTSTRAP=false
SMTP_HOST=
SMTP_PORT=465
SMTP_SECURE=true
SMTP_USER=
SMTP_PASSWORD=
SMTP_FROM="Abel Birdnest <no-reply@abelbirdnest.id>"
NEXT_PUBLIC_API_BASE_URL=
Kunci permission:
sudo chown abelbirdnest:abelbirdnest /var/www/abelbirdnest-web/.env.production
sudo chmod 600 /var/www/abelbirdnest-web/.env.production
10. Install Dependency, Migration, dan Seed Master
Prisma CLI perlu DATABASE_URL. Karena .env.production tidak selalu otomatis dibaca oleh perintah Prisma, load env sebelum migration dan seed:
sudo -u abelbirdnest -H bash
cd /var/www/abelbirdnest-web
set -a
source .env.production
set +a
npm install
npm run prisma:generate
npm run prisma:migrate:deploy
npm run seed:master
exit
npm run seed:master mengisi:
- currency
- grade
- bank
Jika muncul error:
Environment variable not found: DATABASE_URL
Artinya env belum ter-load. Ulangi dari:
set -a
source .env.production
set +a
Lalu cek:
echo "$DATABASE_URL" | sed 's/:.*@/:***@/'
11. Seed Admin Awal
Jalankan script superadmin setelah migration selesai:
sudo -u abelbirdnest -H bash
cd /var/www/abelbirdnest-web
set -a
source .env.production
set +a
node scripts/seed-local-superadmin.mjs
exit
User yang dibuat:
email: wirabasalamah@gmail.com
username: wirabasalamah
password: password
role: SYSTEM_ADMIN
Setelah login pertama, segera ganti password.
12. Build Production pada RAM Rendah
Pastikan swap aktif:
free -h
swapon --show
Build dengan limit memory Node:
sudo -u abelbirdnest -H bash
cd /var/www/abelbirdnest-web
set -a
source .env.production
set +a
NODE_OPTIONS=--max-old-space-size=1024 npm run build
exit
Jika masih mati dengan SIGKILL, cek OOM:
sudo dmesg -T | tail -80
Cari baris Out of memory, Killed process, atau node. Jika ada, naikkan swap menjadi 4 GB lalu ulang build.
13. Setup systemd
Buat service:
sudo nano /etc/systemd/system/abelbirdnest-web.service
Isi:
[Unit]
Description=AbelBirdnest Stock Next.js
After=network.target postgresql.service
[Service]
Type=simple
WorkingDirectory=/var/www/abelbirdnest-web
Environment=NODE_ENV=production
Environment=PORT=3007
Environment=NODE_OPTIONS=--max-old-space-size=512
EnvironmentFile=/var/www/abelbirdnest-web/.env.production
ExecStart=/usr/bin/npm run start
Restart=always
RestartSec=5
User=abelbirdnest
Group=abelbirdnest
[Install]
WantedBy=multi-user.target
Start service:
sudo systemctl daemon-reload
sudo systemctl enable abelbirdnest-web
sudo systemctl start abelbirdnest-web
sudo systemctl status abelbirdnest-web
Cek lokal:
curl http://127.0.0.1:3007/api/v1/health
14. Setup Nginx HTTP
Buat config:
sudo nano /etc/nginx/sites-available/abelbirdnest.id.conf
Isi:
server {
listen 80;
listen [::]:80;
server_name abelbirdnest.id www.abelbirdnest.id;
client_max_body_size 20m;
location / {
proxy_pass http://127.0.0.1:3007;
proxy_http_version 1.1;
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 http;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 120s;
}
}
Enable:
sudo ln -s /etc/nginx/sites-available/abelbirdnest.id.conf /etc/nginx/sites-enabled/abelbirdnest.id.conf
sudo nginx -t
sudo systemctl reload nginx
Cek HTTP:
curl http://abelbirdnest.id/api/v1/health
15. Pasang SSL
sudo certbot --nginx -d abelbirdnest.id -d www.abelbirdnest.id
Pilih redirect HTTP ke HTTPS jika ditanya.
Tes renew:
sudo certbot renew --dry-run
Cek HTTPS:
curl https://abelbirdnest.id/api/v1/health
16. Login Pertama
Buka:
https://abelbirdnest.id/login
Login:
username/email: wirabasalamah atau wirabasalamah@gmail.com
password: password
Setelah login:
- Ganti password admin seed.
- Buat user production final.
- Cek master data: currency, grade, bank.
- Tes alur penting: purchase, receipt, lot, sales.
17. Update Deployment Berikutnya
Untuk server RAM rendah, tetap load env dan pakai swap sebelum build:
sudo -u abelbirdnest -H bash
cd /var/www/abelbirdnest-web
git pull origin main
set -a
source .env.production
set +a
npm install
npm run prisma:generate
npm run prisma:migrate:deploy
NODE_OPTIONS=--max-old-space-size=1024 npm run build
exit
sudo systemctl restart abelbirdnest-web
curl https://abelbirdnest.id/api/v1/health
18. Log dan Troubleshooting
Lihat log service:
sudo journalctl -u abelbirdnest-web -f
Status:
sudo systemctl status abelbirdnest-web
Restart:
sudo systemctl restart abelbirdnest-web
Cek OOM:
sudo dmesg -T | tail -80
19. Backup Database
Backup manual:
sudo -u postgres pg_dump abelbirdnest_prod > /root/abelbirdnest_prod_$(date +%F_%H%M).sql
Restore:
sudo -u postgres psql abelbirdnest_prod < /root/NAMA_FILE_BACKUP.sql
20. Checklist Go-Live
- DNS
abelbirdnest.idbenar. - DNS
www.abelbirdnest.idbenar. - SSH port
3853bisa login. - Firewall buka
3853,80, dan443. - Swap aktif dan permanen.
- PostgreSQL jalan.
.env.productionada dan permission600.- Migration sukses.
- Seed currency, grade, dan bank sukses.
- Seed admin sukses.
- Build sukses dengan
NODE_OPTIONS=--max-old-space-size=1024. - systemd enabled dan running.
- Nginx proxy jalan.
- SSL aktif.
https://abelbirdnest.id/api/v1/healthok.- Admin bisa login.
- Password default sudah diganti.
- Backup database siap.