🎁
Bonus Top-up 50%!Promo Terbatas
Upvote
terminaldebugginghelipoddevopsproduction

Terminal Live di Helipod: Debug Langsung ke Container Tanpa SSH

Tim Helipod

7 menit baca

Panduan lengkap menggunakan fitur Terminal di Helipod — akses shell langsung ke container yang berjalan, jalankan migrasi, debug masalah production, dan inspect environment tanpa setup apapun.

Ada masalah di production. Aplikasi tidak berjalan seperti yang diharapkan. Kamu butuh masuk ke dalam container untuk lihat apa yang sebenarnya terjadi — inspect file, cek environment variable, jalankan command debug.

Di setup VPS tradisional, kamu butuh SSH key, IP server, dan biasanya beberapa langkah autentikasi. Di Helipod, kamu cukup buka tab Terminal di dashboard — dan langsung dapat shell ke container yang sedang berjalan.

Tidak perlu SSH. Tidak perlu setup apapun.

Cara Membuka Terminal

  1. Buka dashboard Helipod
  2. Klik service yang ingin kamu akses
  3. Pilih tab Terminal di panel sebelah kanan
  4. Tunggu beberapa detik — terminal akan otomatis connect ke container

Kamu akan melihat prompt seperti ini:

6CF75A80 · CONNECTED
Connecting to heli-6cf75a80-855f9cf889-gnnpt...
nextjs@heli-6cf75a80-855f9cf889-gnnpt:/app$

Format prompt: [username]@[pod-name]:[working-directory]$

Username disesuaikan dengan framework:

  • nextjs untuk Next.js
  • appuser untuk Python (Django/FastAPI/Flask)
  • appgroup untuk NestJS/Node generic
  • www-data untuk Laravel/PHP

Apa yang Bisa Kamu Lakukan di Terminal?

1. Jalankan Database Migration

Setelah deploy pertama atau setelah ada perubahan schema:

Laravel:

php artisan migrate --force
php artisan migrate:status
php artisan db:seed --force

Django:

python manage.py migrate
python manage.py showmigrations
python manage.py createsuperuser

NestJS + TypeORM:

npx typeorm migration:run -d dist/data-source.js
npx typeorm migration:show -d dist/data-source.js

NestJS + Prisma:

npx prisma migrate deploy
npx prisma migrate status
npx prisma db seed

FastAPI + Alembic:

alembic upgrade head
alembic history
alembic current

2. Inspect Environment Variables

Cek apakah environment variable sudah ter-inject dengan benar:

# Lihat semua env vars
env

# Cari variable spesifik
echo $DATABASE_URL
echo $APP_KEY
printenv | grep DB_

# PHP: lihat via artisan
php artisan env

Catatan keamanan: Variable yang ditampilkan di terminal session ini tidak dilog atau disimpan oleh Helipod. Tapi tetap berhati-hati — jangan screenshot atau share output yang mengandung credential.

3. Debug Koneksi Database

Test koneksi ke database dari dalam container:

PostgreSQL:

# Test dengan psql
psql $DATABASE_URL -c "SELECT version();"
psql -h $DB_HOST -U $DB_USER -d $DB_NAME -c "\l"

# Test dengan nc (netcat)
nc -zv postgres 5432

Redis:

redis-cli -h $REDIS_HOST -p 6379 ping
redis-cli -h redis -p 6379 info server

Laravel:

php artisan db:monitor
php artisan tinker
>>> DB::select('SELECT 1')

Django:

python manage.py shell
>>> from django.db import connection
>>> connection.ensure_connection()
>>> print("Connected!")

4. Inspect File System

# Lihat struktur aplikasi
ls -la
ls -la storage/
ls -la public/

# Cek ukuran folder
du -sh *
du -sh storage/*

# Cek apakah file ada
ls -la storage/app/public/
cat .env  # jangan lakukan ini di shared environment!

# Cek permission
stat storage/
ls -la bootstrap/cache/

5. Jalankan Artisan / Manage Commands

Laravel:

# Cache management
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear

# Queue management
php artisan queue:work --once
php artisan queue:failed
php artisan queue:retry all

# Tinker (REPL Laravel)
php artisan tinker
>>> User::count()
>>> User::first()
>>> Cache::get('my-key')

Django:

python manage.py shell_plus  # jika pakai django-extensions
python manage.py collectstatic --noinput
python manage.py check --deploy
python manage.py clearsessions

6. Debug Aplikasi Node.js

# Cek versi Node
node --version
npm --version

# Inspect package yang terinstall
ls node_modules/ | head -20
cat package.json

# Test import module
node -e "const db = require('./dist/database'); console.log(db)"

# Cek environment
node -e "console.log(process.env.NODE_ENV)"
node -e "console.log(process.env.DATABASE_URL)"

7. Monitor Resource Usage

# CPU dan memory
top
htop  # jika tersedia

# Disk usage
df -h
du -sh /app/*

# Network connections
netstat -tlnp  # jika tersedia
ss -tlnp

# Process yang berjalan
ps aux
ps aux | grep node
ps aux | grep gunicorn

8. Manipulasi Storage dan File

# Laravel storage:link
php artisan storage:link

# Buat folder
mkdir -p storage/app/public/uploads
chmod -R 775 storage/

# Copy file
cp config/production.php config/local.php

# Edit file (jika vi/nano tersedia)
vi .env.testing

# Download file dari URL
curl -o /app/public/assets.zip https://example.com/assets.zip
wget -O file.txt https://example.com/file.txt

Tips Debugging Production

Debugging Memory Leak

# Monitor memory selama beberapa detik
watch -n 2 'ps aux --sort=-%mem | head -5'

# Cek memory PHP
php -r "echo memory_get_usage(true) / 1024 / 1024 . ' MB';"

# Node.js memory
node -e "
const used = process.memoryUsage();
for (const key in used) {
  console.log(key, Math.round(used[key] / 1024 / 1024 * 100) / 100, 'MB');
}
"

Debugging Slow Query

Django:

python manage.py shell
>>> from django.db import connection, reset_queries
>>> from django.conf import settings
>>> settings.DEBUG = True
>>> reset_queries()
>>> # Jalankan operasi yang lambat
>>> from myapp.models import MyModel
>>> list(MyModel.objects.all())
>>> print(len(connection.queries))
>>> for q in connection.queries: print(q['time'], q['sql'][:100])

Laravel:

php artisan tinker
>>> DB::enableQueryLog();
>>> // Jalankan operasi
>>> User::with('posts')->get();
>>> dd(DB::getQueryLog());

Cek Log Aplikasi dari Dalam Container

# Laravel
tail -f storage/logs/laravel.log
cat storage/logs/laravel.log | grep ERROR

# Python
cat /var/log/app.log  # jika dikonfigurasi
# Atau lihat stdout langsung via tab App Logs di dashboard

# Node.js
# Stdout/stderr langsung muncul di tab App Logs

Keterbatasan Terminal Helipod

Ada beberapa hal yang perlu diketahui:

Session tidak persistent — Terminal session akan terputus jika browser ditutup atau koneksi internet terputus. Command yang sedang berjalan (seperti php artisan migrate pada database besar) akan terhenti jika koneksi putus. Untuk command yang butuh waktu lama, gunakan nohup atau jalankan di background:

nohup php artisan migrate --force > /tmp/migrate.log 2>&1 &
# Pantau progress:
tail -f /tmp/migrate.log

Non-root user — Terminal berjalan sebagai non-root user untuk keamanan. Kamu tidak bisa install package sistem (apt install, apk add) dari sini. Untuk tambah package sistem, gunakan helipack.json dengan field packages.apk atau packages.apt, lalu redeploy.

File system ephemeral — File yang dibuat di dalam container (di luar persistent volume) akan hilang saat redeploy. Jika perlu menyimpan file permanent, mount persistent volume di Settings → Storage Volumes.

Multiple replicas — Jika service kamu berjalan dengan beberapa replica, terminal akan connect ke salah satu replica. Perubahan yang kamu buat (seperti clear cache) mungkin tidak ter-apply ke semua replica.

Use Case Lanjutan

Seed Data Production (Hati-hati!)

# Laravel - jalankan seeder spesifik
php artisan db:seed --class=ProductionDataSeeder --force

# Django - custom management command
python manage.py seed_initial_data --production

Generate Laravel App Key

Jika lupa set APP_KEY di Variables:

php artisan key:generate --show
# Copy output ke tab Variables → APP_KEY

Debug OAuth / JWT Token

# Laravel - generate personal access token via tinker
php artisan tinker
>>> $user = User::find(1)
>>> $token = $user->createToken('debug-token')
>>> echo $token->plainTextToken

# Decode JWT
echo "your.jwt.token" | cut -d. -f2 | base64 -d 2>/dev/null | python3 -m json.tool

Inspect Container Image

# Cek OS
cat /etc/os-release

# Cek PHP version dan extensions
php --version
php -m | grep -i redis
php -m | grep -i pdo

# Cek Python packages
pip list | grep -i django
pip show fastapi

# Cek Node version dan packages
node --version
cat node_modules/.package-lock.json | python3 -m json.tool | grep '"version"' | head -20

Kesimpulan

Terminal di Helipod menghilangkan salah satu hambatan terbesar saat debugging production: "bagaimana cara masuk ke dalam container?" Cukup buka tab Terminal, dan kamu langsung punya shell ke container yang sedang berjalan.

Ini bukan fitur yang semua platform punya — Render misalnya, tidak menyediakan terminal ke container sama sekali. Ini salah satu keunggulan Helipod yang langsung terasa nilainya saat ada insiden production.

Ingin tahu cara monitor CPU dan memory aplikasimu? Baca Panduan Monitoring Metrics Helipod.

Punya pertanyaan? Hubungi kami di support@helipod.id atau bergabung ke komunitas di hangar.helipod.io.

Siap coba Helipod?

Deploy aplikasi kamu sekarang. Gratis, tanpa kartu kredit.

Mulai Gratis →