Aplikasi web untuk manajemen inventaris perangkat dengan fitur barcode scanner, check-in/check-out, dashboard interaktif, dan role-based access control.
- Dashboard β Statistik stok, grafik pergerakan barang, alert stok menipis
- Manajemen Aset β CRUD, search, filter, generate & cetak barcode
- Scanner Barcode β Dukungan kamera webcam & scanner USB/Bluetooth
- Check-in / Check-out β Catat pengambilan & pengembalian barang
- Riwayat Transaksi β Log lengkap semua pergerakan
- Manajemen User β Kelola akun pengguna (admin only)
- Export Data β Export PDF & Excel untuk daftar aset dan riwayat transaksi dengan filter tanggal
- Backup & Restore β Download database, export JSON, kirim via email, dan restore dari file backup
- RBAC β Admin (akses penuh) vs Staff (scan & transaksi)
- Security β Rate limiting, security headers, JWT authentication
- Node.js versi 18 atau lebih baru
- Windows 10/11 atau Ubuntu 20.04+
- Buka https://nodejs.org β download versi LTS
- Jalankan installer, centang semua opsi default
- Buka Command Prompt baru, verifikasi:
node --version
cd C:\path\ke\inventory-app
copy .env.example .envGenerate JWT Secret:
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"Buka file .env, paste hasilnya ke JWT_SECRET=.
npm install
npm starthttp://localhost:3000
Login: admin / admin123 β segera ubah password di menu Kelola User.
Panduan lengkap untuk deploy di VPS/server Ubuntu dengan domain dan HTTPS.
sudo apt update && sudo apt upgrade -y
# Install Node.js 20 LTS
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
# Verifikasi
node --version
npm --versionCatatan: Aplikasi ini menggunakan SQLite secara default, sudah cukup untuk 1-50 user. MariaDB direkomendasikan jika:
- Data aset > 10.000 item
- User aktif > 50 orang bersamaan
- Butuh backup & replikasi database tingkat enterprise
# Install MariaDB
sudo apt install -y mariadb-server
# Amankan instalasi
sudo mysql_secure_installation
# Jawab: Set root password? Y β masukkan password
# Remove anonymous users? Y
# Disallow root login remotely? Y
# Remove test database? Y
# Reload privilege tables? Y
# Buat database & user untuk InvenTrack
sudo mysql -u root -pCREATE DATABASE inventrack CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'inventrack'@'localhost' IDENTIFIED BY 'password_anda_disini';
GRANT ALL PRIVILEGES ON inventrack.* TO 'inventrack'@'localhost';
FLUSH PRIVILEGES;
EXIT;Setelah database MariaDB siap, ikuti 3 langkah ini:
1. Install dependency MySQL:
npm install mysql22. Edit server.js, ubah 1 baris:
- const { initDb, saveDb } = require('./backend/db');
+ const { initDb, saveDb } = require('./backend/db-mysql');3. Tambahkan config MySQL di .env:
DB_HOST=localhost
DB_PORT=3306
DB_USER=inventrack
DB_PASSWORD=password_anda_disini
DB_NAME=inventrackRestart aplikasi β selesai! Tidak perlu ubah file lain.
# Buat direktori aplikasi
sudo mkdir -p /var/www/inventrack
cd /var/www/inventrack
# Upload file project (dari komputer lokal via SCP)
# Jalankan ini di komputer lokal:
# scp -r inventory-app/* user@ip-server:/var/www/inventrack/
# Setup environment
cp .env.example .env
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
# Edit .env, paste JWT_SECRET
nano .envIsi .env:
PORT=3000
JWT_SECRET=paste_hasil_generate_disini
JWT_EXPIRES=24h# Install dependencies
npm install
# Test jalankan
node server.js
# Kalau muncul banner InvenTrack, tekan Ctrl+C untuk lanjut setup# Install PM2
sudo npm install -g pm2
# Jalankan aplikasi
pm2 start server.js --name inventrack
# Auto-start saat server reboot
pm2 startup
pm2 savePerintah PM2:
pm2 status # Cek status
pm2 logs inventrack # Lihat log
pm2 restart inventrack # Restart
pm2 stop inventrack # Stopsudo apt install -y nginx
# Buat konfigurasi
sudo nano /etc/nginx/sites-available/inventrackPaste konfigurasi berikut (ganti inventaris.domain.com dengan domain Anda):
server {
listen 80;
server_name inventaris.domain.com;
# Redirect ke HTTPS (aktifkan setelah setup SSL)
# return 301 https://$host$request_uri;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
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 $scheme;
proxy_cache_bypass $http_upgrade;
# Upload limit
client_max_body_size 10M;
}
}# Aktifkan site
sudo ln -s /etc/nginx/sites-available/inventrack /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx# Install Certbot
sudo apt install -y certbot python3-certbot-nginx
# Generate sertifikat SSL (pastikan domain sudah pointing ke IP server)
sudo certbot --nginx -d inventaris.domain.com
# Certbot akan otomatis:
# - Generate sertifikat SSL
# - Update konfigurasi Nginx
# - Setup auto-renewal
# Test auto-renewal
sudo certbot renew --dry-runsudo ufw allow ssh
sudo ufw allow 'Nginx Full'
sudo ufw enable
sudo ufw statusDi panel domain Anda (Cloudflare / Niagahoster / dll), tambahkan:
| Type | Name | Value |
|---|---|---|
| A | inventaris | IP address server Anda |
Tunggu 5-30 menit propagasi DNS, lalu akses:
https://inventaris.domain.com
Untuk akses tanpa domain (jaringan lokal):
ipconfig # Windows - catat IPv4
ip addr show # Ubuntu - catat inetDari komputer lain, buka: http://IP-SERVER:3000
| Item | Lokasi Windows | Lokasi Ubuntu |
|---|---|---|
| Database | data\inventrack.db |
/var/www/inventrack/data/inventrack.db |
| Config | .env |
/var/www/inventrack/.env |
# Buat script backup harian
sudo nano /etc/cron.daily/backup-inventrack#!/bin/bash
BACKUP_DIR="/home/backup/inventrack"
mkdir -p $BACKUP_DIR
cp /var/www/inventrack/data/inventrack.db $BACKUP_DIR/inventrack_$(date +%Y%m%d).db
# Hapus backup lebih dari 30 hari
find $BACKUP_DIR -name "*.db" -mtime +30 -deletesudo chmod +x /etc/cron.daily/backup-inventrack| Fitur | Detail |
|---|---|
| Password | Hashed dengan bcrypt |
| Login token | JWT dengan secret dari .env |
| Rate limiting login | Maks 10 percobaan / 15 menit per IP |
| Rate limiting API | Maks 120 request / menit per IP |
| Security headers | X-Frame-Options, X-Content-Type-Options, X-XSS-Protection |
| Graceful shutdown | Ctrl+C / SIGTERM otomatis save database |
| Masalah | Solusi |
|---|---|
'node' is not recognized |
Restart CMD / terminal setelah install Node.js |
EADDRINUSE: port 3000 |
Port sudah dipakai. Ganti PORT=4000 di .env |
npm install error |
Pastikan internet aktif, jalankan sebagai Administrator / sudo |
| Kamera scanner tidak bisa | Kamera hanya via localhost atau https |
| Halaman blank | Buka Developer Tools (F12) β Console |
| Terlalu banyak percobaan login | Tunggu 15 menit, atau restart server |
| 502 Bad Gateway (Nginx) | Pastikan PM2 berjalan: pm2 status |
| SSL tidak bisa | Pastikan domain sudah pointing ke IP server dan port 80/443 terbuka |
inventory-app/
βββ .env # Konfigurasi (PORT, JWT_SECRET)
βββ .env.example # Template konfigurasi
βββ .gitignore # File yang diabaikan Git
βββ package.json # Dependencies
βββ server.js # Entry point server
βββ data/
β βββ inventrack.db # Database SQLite (auto-generated)
βββ backend/
β βββ db.js # Database SQLite (default)
β βββ db-mysql.js # Database MariaDB/MySQL (alternatif)
β βββ routes/
β βββ auth.js # Login & JWT middleware
β βββ assets.js # CRUD aset
β βββ transactions.js # Check-in/out
β βββ users.js # Manajemen user
βββ src/
βββ index.css # Stylesheet
βββ app.js # Router & layout
βββ main.js # Entry point frontend
βββ modules/
β βββ store.js # API client
β βββ auth.js # Auth helper
β βββ barcode.js # Barcode helper
βββ pages/
βββ login.js
βββ dashboard.js
βββ assets.js
βββ scanner.js
βββ transactions.js
βββ history.js
βββ users.js
| Komponen | Teknologi |
|---|---|
| Backend | Node.js + Express.js |
| Database | SQLite (default) / MariaDB / MySQL |
| Auth | JWT + bcrypt |
| Frontend | HTML5 + Vanilla JS + CSS |
| Charts | Chart.js |
| Barcode | JsBarcode + html5-qrcode |
| Icons | Font Awesome 6 |
| Font | Inter (Google Fonts) |
| Reverse Proxy | Nginx (production) |
| SSL | Let's Encrypt / Certbot |
| Process Manager | PM2 |









