---
title: "Cara Aman Kelola Environment Variables & Secret Files di Helipod"
url: "https://helipod.io/blog/environment-variables-dan-secrets-di-helipod"
date: "2026-05-08"
updated: "2026-05-08"
author: "Tim Helipod"
tags: ["environment variables", "secrets", "keamanan", "helipod", "devops"]
excerpt: "Cara aman kelola environment variables dan secret files di Helipod: enkripsi at rest, inject runtime, import/export, dan mount ke container."
---

# Cara Aman Kelola Environment Variables & Secret Files di Helipod

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
# Python
import os
db_password = os.environ['DB_PASSWORD']
```

```javascript
// Node.js
const dbPassword = process.env.DB_PASSWORD;
```

```php
// 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:

```env
# 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:**
```env
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:**
```env
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:**
```env
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:**
```env
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 grup**: `DB_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
# .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

```bash
# 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']
)
```

```javascript
// Node.js
const { Storage } = require('@google-cloud/storage');
const storage = new Storage({
  keyFilename: '/app/secrets/gcloud.json'
});
```

### Contoh: Apple Push Notification Key

```python
# 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:

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

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

### ❌ Jangan Commit ke Repository

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

Pastikan `.gitignore` kamu mengandung:

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

### ❌ Jangan Taruh Secret di helipack.json

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

```python
# 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](/blog/monitoring-metrics-helipod).

Punya pertanyaan? Hubungi kami di [support@helipod.io](mailto:support@helipod.io) atau bergabung ke komunitas di [hangar.helipod.io](https://hangar.helipod.io).
