Files
AbelBirdNest-Stock/docs/deploy-debian13-low-ram.md

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:

  1. Ganti password admin seed.
  2. Buat user production final.
  3. Cek master data: currency, grade, bank.
  4. 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.id benar.
  • DNS www.abelbirdnest.id benar.
  • SSH port 3853 bisa login.
  • Firewall buka 3853, 80, dan 443.
  • Swap aktif dan permanen.
  • PostgreSQL jalan.
  • .env.production ada dan permission 600.
  • 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/health ok.
  • Admin bisa login.
  • Password default sudah diganti.
  • Backup database siap.