🎁
Bonus Top-up 50%!Promo Terbatas
Upvote
environment variablessecretskeamananhelipoddevops

Cara Aman Kelola Environment Variables & Secret Files di Helipod

Tim Helipod

7 menit baca

Panduan lengkap menggunakan tab Variables dan Secrets di Helipod — enkripsi at rest, inject runtime, import/export env vars, dan mount secret files ke container.

Setiap aplikasi production punya data sensitif: API key, database password, JWT secret, service account JSON. Salah kelola data ini bisa berakibat fatal — mulai dari kebocoran data sampai akun yang dibobol.

Helipod menyediakan dua mekanisme untuk mengelola data sensitif dengan aman: Variables untuk environment variables teks, dan Secrets untuk file sensitif. Keduanya dienkripsi dan tidak pernah muncul di logs atau build output.

Variables vs Secrets — Kapan Pakai yang Mana?

Variables Secrets
Untuk String/nilai teks File (JSON, PEM, P12, dll)
Contoh DB_PASSWORD, API_KEY, JWT_SECRET Service account JSON, SSL certificate, .p8 key
Tersimpan di Encrypted database Private B2 storage
Di-inject sebagai Environment variable File read-only di dalam container
Muncul di logs ❌ Tidak pernah ❌ Tidak pernah
Muncul di build ❌ Tidak pernah ❌ Tidak pernah

Tab Variables

Cara Kerja

Variables di Helipod dienkripsi saat disimpan (encrypted at rest) dan di-inject langsung ke container saat runtime — bukan saat build. Ini berarti nilai variable tidak pernah masuk ke Docker image layer, dan tidak bisa di-extract dari image.

Di dalam container, variable ini tersedia persis seperti environment variable biasa:

# Python
import os
db_password = os.environ['DB_PASSWORD']
// Node.js
const dbPassword = process.env.DB_PASSWORD;
// PHP
$dbPassword = env('DB_PASSWORD'); // Laravel
$dbPassword = $_ENV['DB_PASSWORD']; // Plain PHP

Menambahkan Variable

Di dashboard Helipod, buka service → tab Variables → klik + New variable.

Masukkan KEY dan VALUE. Value langsung dienkripsi saat disimpan — bahkan tim Helipod tidak bisa melihat nilainya setelah tersimpan.

Keamanan: Perhatikan notifikasi di halaman Variables: "Variables are encrypted at rest. Injected directly into your container at runtime — never exposed in logs or builds."

Import dari File .env

Jika sudah punya file .env, kamu tidak perlu input satu per satu. Klik ikon upload (import) di pojok kanan atas tabel Variables, lalu paste isi file .env-mu.

Format yang didukung:

# Komentar diabaikan
APP_KEY=base64:xxxxx
APP_ENV=production
DB_HOST=postgres-service
DB_PORT=5432
DB_NAME=mydb
DB_USER=postgres
DB_PASSWORD=supersecret

# Value dengan spasi harus pakai quotes
APP_NAME="My Awesome App"

Export Variables

Klik ikon download (export) untuk mengunduh semua variable sebagai file .env. Nilai sensitif akan ditampilkan setelah konfirmasi.

Berguna untuk:

  • Sync environment antar developer di tim
  • Backup konfigurasi sebelum eksperimen besar
  • Migrate ke project atau environment baru

Copy dari Project Lain

Klik ikon copy untuk menyalin semua variable dari service lain dalam project yang sama. Berguna saat setup staging environment yang mirip dengan production.

Variabel yang Sering Dipakai

Laravel:

APP_KEY=base64:xxxxxx
APP_ENV=production
APP_DEBUG=false
APP_URL=https://nama-project.helipod.app

DB_CONNECTION=pgsql
DB_HOST=nama-service-postgres
DB_PORT=5432
DB_DATABASE=mydb
DB_USERNAME=postgres
DB_PASSWORD=secret

CACHE_DRIVER=redis
QUEUE_CONNECTION=redis
SESSION_DRIVER=redis

REDIS_HOST=nama-service-redis
REDIS_PORT=6379

Next.js:

NEXTAUTH_URL=https://nama-project.helipod.app
NEXTAUTH_SECRET=random-secret-yang-panjang
NEXT_PUBLIC_API_URL=https://api.helipod.app
DATABASE_URL=postgresql://user:pass@postgres-host:5432/db

Django:

SECRET_KEY=django-secret-key-yang-panjang
DEBUG=False
ALLOWED_HOSTS=nama-project.helipod.app,yourdomain.com
DATABASE_URL=postgresql://user:pass@postgres-host:5432/db
DJANGO_SETTINGS_MODULE=myproject.settings.production

FastAPI / Flask:

SECRET_KEY=your-secret-key
DATABASE_URL=postgresql+asyncpg://user:pass@postgres-host:5432/db
ENVIRONMENT=production
LOG_LEVEL=info

Tips Penamaan Variable

Gunakan UPPERCASE dengan underscore — konvensi standar yang dipakai semua framework.

Prefix untuk grupDB_HOST, DB_PORT, DB_NAME lebih mudah dibaca daripada DATABASE_HOST, DATABASE_PORT, DATABASE_NAME.

Jangan duplicate dengan helipack.json — variable yang di-set di dashboard akan override nilai di helipack.json. Gunakan helipack.json untuk nilai default non-sensitif, dan dashboard untuk override per-environment.

Buat .env.example — commit file contoh ke repository (tanpa nilai asli) agar tim tahu variable apa yang dibutuhkan:

# .env.example
APP_KEY=
APP_ENV=production
DB_HOST=
DB_PASSWORD=

Tab Secrets

Cara Kerja

Secret Files berbeda dari Variables — ini untuk file biner atau teks yang perlu di-mount ke dalam container sebagai file, bukan sebagai environment variable.

Secret Files disimpan di private B2 storage dan di-mount read-only ke container saat runtime, di path yang kamu tentukan. File ini tidak pernah masuk ke build layer.

Kapan Pakai Secret Files?

  • Google Cloud service account JSON — untuk akses Google APIs (Firebase, Cloud Storage, dll)
  • SSL/TLS certificate — file .pem, .crt, .key untuk TLS custom
  • Apple Push Notification .p8 key — untuk iOS push notification
  • SSH private key — jika aplikasi butuh akses ke server via SSH
  • Firebase service account — untuk Firebase Admin SDK
  • License file — beberapa software butuh license file untuk berjalan

Menambahkan Secret File

Di dashboard Helipod, buka service → tab Secrets → klik + New secret atau Add first secret.

Kamu akan diminta mengisi:

  • Name — nama identifier untuk secret (misalnya gcloud-service-account)
  • Mount path — path di dalam container (misalnya /app/secrets/gcloud.json)
  • File — upload file dari komputer

Setelah disimpan, file akan ter-mount otomatis di path yang ditentukan setiap kali container dijalankan.

Contoh: Google Cloud Service Account

# Di aplikasi (Python)
import os
from google.oauth2 import service_account

credentials = service_account.Credentials.from_service_account_file(
    '/app/secrets/gcloud.json',
    scopes=['https://www.googleapis.com/auth/cloud-platform']
)
// Node.js
const { Storage } = require('@google-cloud/storage');
const storage = new Storage({
  keyFilename: '/app/secrets/gcloud.json'
});

Contoh: Apple Push Notification Key

# Mount path: /app/secrets/apns.p8
import jwt
import time

with open('/app/secrets/apns.p8', 'r') as f:
    private_key = f.read()

token = jwt.encode(
    {'iss': TEAM_ID, 'iat': time.time()},
    private_key,
    algorithm='ES256',
    headers={'kid': KEY_ID}
)

Perbedaan Variables saat Build vs Runtime

Ini poin penting yang sering membingungkan:

Runtime Variables (Tab Variables Helipod)

Variables yang di-set di tab Variables hanya tersedia saat container berjalan, bukan saat docker build. Ini yang bikin nilai variable tidak masuk ke image layer.

Build-time Variables (BuildKit Secrets)

Untuk framework yang butuh environment variables saat build (misalnya Next.js NEXT_PUBLIC_*, atau Django collectstatic yang butuh DATABASE_URL), Helipack secara otomatis mem-pass variables kamu sebagai BuildKit secrets yang aman:

RUN --mount=type=secret,id=build_env,dst=/app/.env \
    npm run build

File .env ini hanya exist selama command RUN berjalan dan tidak tersimpan di layer apapun. Kamu tidak perlu melakukan apapun — Helipack mengurus ini otomatis dari variables yang kamu set di dashboard.


Anti-Pattern yang Harus Dihindari

❌ Jangan Hardcode di Kode

# JANGAN INI
DATABASE_URL = "postgresql://postgres:supersecret@localhost:5432/mydb"
API_KEY = "sk-xxxxxxxxxxxxx"

❌ Jangan Commit ke Repository

# JANGAN commit file ini
.env
.env.production
secrets.json
gcloud-key.json

Pastikan .gitignore kamu mengandung:

.env
.env.*
!.env.example
*.json.key
*.pem
*.p8
*.p12

❌ Jangan Taruh Secret di helipack.json

// JANGAN INI — helipack.json ada di repository!
{
  "env": {
    "DB_PASSWORD": "supersecret",
    "API_KEY": "sk-xxxxx"
  }
}

helipack.json boleh berisi env vars yang tidak sensitif (timezone, log level, dll). Untuk secret, selalu gunakan tab Variables di dashboard.

✅ Yang Benar

# Baca dari environment
import os
DATABASE_URL = os.environ['DATABASE_URL']  # wajib ada
API_KEY = os.environ.get('API_KEY', '')    # opsional dengan default

Redeploy Setelah Ubah Variable

Perubahan pada Variables atau Secrets tidak otomatis ter-apply ke container yang sedang berjalan. Kamu perlu Redeploy agar container baru mendapatkan nilai terbaru.

Klik Deploy di tab Deployments untuk trigger redeploy, atau klik Restart jika hanya ingin restart container tanpa rebuild image.

Restart vs Redeploy:

  • Restart — hanya restart container, menggunakan image yang sama. Variable terbaru ter-apply, tapi tidak ada proses build ulang.
  • Redeploy — clone repo terbaru, build image baru, deploy. Lebih lambat tapi pastikan semua perubahan kode juga ter-apply.

Kesimpulan

Mengelola environment variables dan secret files di Helipod dirancang untuk mudah sekaligus aman. Variables dienkripsi at rest dan tidak pernah muncul di logs. Secret files disimpan di private storage dan di-mount read-only ke container.

Yang terpenting: jangan pernah hardcode secret di kode atau commit ke repository. Selalu gunakan tab Variables dan Secrets di dashboard Helipod.

Ingin tahu lebih tentang cara monitoring aplikasi setelah live? Baca Monitor CPU, Memory, dan Logs di 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 →