# 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

```bash
ssh -p 3853 root@IP_SERVER
```

Jika memakai user sudo:

```bash
ssh -p 3853 namauser@IP_SERVER
```

## 2. DNS

Pastikan DNS mengarah ke IP server:

```text
abelbirdnest.id      A      IP_SERVER
www.abelbirdnest.id  A      IP_SERVER
```

Cek dari komputer lokal:

```bash
dig +short abelbirdnest.id
dig +short www.abelbirdnest.id
```

## 3. Install Paket Dasar

```bash
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:

```bash
node -v
npm -v
psql --version
nginx -v
```

## 4. Firewall

Karena SSH memakai port `3853`:

```bash
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:

```text
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:

```bash
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
```

Buat permanen setelah reboot:

```bash
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
```

Cek:

```bash
free -h
swapon --show
```

Jika 2 GB masih kurang, ganti menjadi 4 GB:

```bash
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

```bash
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

```bash
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:

```bash
openssl rand -base64 32
```

Masuk PostgreSQL:

```bash
sudo -u postgres psql
```

Buat user dan database. Ganti `GANTI_PASSWORD_DB_KUAT` dengan password yang dibuat tadi.

```sql
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:

```bash
psql "postgresql://abelbirdnest_app:GANTI_PASSWORD_DB_KUAT@127.0.0.1:5432/abelbirdnest_prod?schema=public"
```

Keluar dari prompt `psql`:

```sql
\q
```

## 9. Buat Environment Production

Generate secret:

```bash
openssl rand -base64 48
```

Buat file env:

```bash
sudo -u abelbirdnest nano /var/www/abelbirdnest-web/.env.production
```

Isi:

```env
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:

```bash
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:

```bash
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:

```text
Environment variable not found: DATABASE_URL
```

Artinya env belum ter-load. Ulangi dari:

```bash
set -a
source .env.production
set +a
```

Lalu cek:

```bash
echo "$DATABASE_URL" | sed 's/:.*@/:***@/'
```

## 11. Seed Admin Awal

Jalankan script superadmin setelah migration selesai:

```bash
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:

```text
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:

```bash
free -h
swapon --show
```

Build dengan limit memory Node:

```bash
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:

```bash
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:

```bash
sudo nano /etc/systemd/system/abelbirdnest-web.service
```

Isi:

```ini
[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:

```bash
sudo systemctl daemon-reload
sudo systemctl enable abelbirdnest-web
sudo systemctl start abelbirdnest-web
sudo systemctl status abelbirdnest-web
```

Cek lokal:

```bash
curl http://127.0.0.1:3007/api/v1/health
```

## 14. Setup Nginx HTTP

Buat config:

```bash
sudo nano /etc/nginx/sites-available/abelbirdnest.id.conf
```

Isi:

```nginx
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:

```bash
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:

```bash
curl http://abelbirdnest.id/api/v1/health
```

## 15. Pasang SSL

```bash
sudo certbot --nginx -d abelbirdnest.id -d www.abelbirdnest.id
```

Pilih redirect HTTP ke HTTPS jika ditanya.

Tes renew:

```bash
sudo certbot renew --dry-run
```

Cek HTTPS:

```bash
curl https://abelbirdnest.id/api/v1/health
```

## 16. Login Pertama

Buka:

```text
https://abelbirdnest.id/login
```

Login:

```text
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:

```bash
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:

```bash
sudo journalctl -u abelbirdnest-web -f
```

Status:

```bash
sudo systemctl status abelbirdnest-web
```

Restart:

```bash
sudo systemctl restart abelbirdnest-web
```

Cek OOM:

```bash
sudo dmesg -T | tail -80
```

## 19. Backup Database

Backup manual:

```bash
sudo -u postgres pg_dump abelbirdnest_prod > /root/abelbirdnest_prod_$(date +%F_%H%M).sql
```

Restore:

```bash
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.
