---
createdAt: 2026-06-30
updatedAt: 2026-06-30
title: Self-Hosting Intlayer
description: Jalankan instance Intlayer lengkap di infrastruktur Anda sendiri dengan satu perintah. Tidak memerlukan akun Intlayer Cloud.
keywords:
- Self-Hosting
- Docker
- Docker Compose
- Intlayer
- CMS
- Installation
- Infrastructure
slugs:
- doc
- self-hosting
author: aymericzip
---
# Self-Hosting Intlayer
Intlayer dapat berjalan sepenuhnya di infrastruktur Anda sendiri — tidak memerlukan akun Intlayer Cloud. Satu perintah akan mem-boot stack yang siap produksi:
```sh
curl -fsSL https://intlayer.org/install.sh | sh
```
Installer mengunduh `docker-compose.yml` dan `.env`, membuat secret yang diperlukan secara otomatis, dan memulai semua kontainer dengan `docker compose up -d`.
## Daftar Isi
---
## Arsitektur
```
┌─────────────────────────────┐
browser ──────▶ │ app (TanStack Start) :3000│ ──┐
└─────────────────────────────┘ │ VITE_BACKEND_URL
┌─────────────────────────────┐ │
│ backend (Fastify/Bun) :3100│ ◀─┘
└──────────────┬──────────────┘
┌──────────┬─────────┼──────────┬───────────┐
▼ ▼ ▼ ▼ ▼
mongo:27017 redis:6379 minio:9000 mailpit:1025 Chromium
(1-node RS) (S3 API) (SMTP) (in-image)
minio:9001 mailpit:8025
(console) (web UI)
```
Chromium (digunakan untuk pembuatan screenshot Puppeteer) dibundel di dalam image backend — tidak diperlukan kontainer terpisah.
---
## Prasyarat
- **Docker** ≥ 24 dan **Docker Compose** ≥ v2. Jika salah satunya tidak ada, installer akan mencetak tautan instalasi dan keluar.
- Port `3000`, `3100`, `8025`, `9000`, dan `9001` tersedia di host.
- Host Linux atau macOS (atau WSL2 di Windows).
---
## Memulai Cepat
```sh
curl -fsSL https://intlayer.org/install.sh | sh
```
Apa yang dilakukan installer:
1. Memeriksa bahwa `docker` dan `docker compose` ada.
2. Mengunduh `docker-compose.yml` dan `.env.example` ke `./intlayer/`.
3. Jika tidak ada `.env` yang ada, menyalin contoh dan menghasilkan secret acak untuk `BETTER_AUTH_SECRET`, `S3_ACCESS_KEY_ID`, dan `S3_SECRET_ACCESS_KEY` melalui `openssl rand`.
4. Menjalankan `docker compose pull` + `docker compose up -d`.
5. Mencetak URL: dashboard `:3000`, API `:3100`, UI email `:8025`, konsol MinIO `:9001`.
Setelah stack aktif, buka **http://localhost:3000** dan buat akun pertama Anda.
---
## Layanan
| Layanan | Image | Port Host | Tujuan |
| ----------- | ------------------------------------- | ------------------------------ | ----------------------------------------------------------------------- |
| **app** | dibuat dari `apps/app/Dockerfile` | `3000` | Dashboard TanStack Start (UI CMS) |
| **backend** | dibuat dari `apps/backend/Dockerfile` | `3100` | Fastify REST API (`/health` endpoint) |
| **mongo** | `mongo:7` | internal | Replika set node tunggal (`rs0`) |
| **redis** | `redis:7-alpine` | internal | Job queues (BullMQ) dan caching (ioredis) |
| **minio** | `minio/minio` | `9000` (S3), `9001` (konsol) | Penyimpanan objek yang kompatibel dengan S3 untuk avatar dan screenshot |
| **mailpit** | `axllent/mailpit` | `1025` (SMTP), `8025` (UI web) | Sink email transaksional lokal |
Port internal (mongo, redis) tidak terekspos ke host secara default.
> Port MinIO `9000` harus dapat dijangkau oleh browser karena aset yang diunggah (avatar, screenshot) dimuat langsung dari `S3_PUBLIC_URL=http://localhost:9000/intlayer`.
---
## Variabel Lingkungan
Installer menghasilkan `.env` yang siap pakai. Tabel di bawah ini menjelaskan setiap variabel.
### Wajib (dibuat secara otomatis atau diminta)
| Variabel | Contoh | Deskripsi |
| ---------------------- | ----------------------------------------------- | ------------------------------------------------------- |
| `NODE_ENV` | `production` | Lingkungan runtime |
| `PORT` | `3100` | Port listen backend |
| `BACKEND_URL` | `http://localhost:3100` | URL publik API backend |
| `APP_URL` | `http://localhost:3000` | URL publik dashboard |
| `DOMAIN` | `localhost` | Domain cookie |
| `MONGODB_URI` | `mongodb://mongo:27017/intlayer?replicaSet=rs0` | URI koneksi MongoDB lengkap |
| `REDIS_URL` | `redis://redis:6379` | URL koneksi Redis |
| `BETTER_AUTH_SECRET` | _(dibuat)_ | Secret 32-byte untuk penandatanganan sesi |
| `MAIL_PROVIDER` | `smtp` | Transportasi mail: `smtp` atau `resend` |
| `MAIL_SMTP_HOST` | `mailpit` | Nama host SMTP (nama kontainer Mailpit) |
| `MAIL_SMTP_PORT` | `1025` | Port SMTP |
| `MAIL_FROM` | `Intlayer ` | Alamat pengirim |
| `S3_ENDPOINT` | `http://minio:9000` | Endpoint yang kompatibel dengan S3 |
| `S3_PUBLIC_URL` | `http://localhost:9000/intlayer` | URL publik untuk pemuatan aset browser |
| `S3_BUCKET_NAME` | `intlayer` | Nama bucket |
| `S3_ACCESS_KEY_ID` | _(dibuat)_ | Kunci akses MinIO |
| `S3_SECRET_ACCESS_KEY` | _(dibuat)_ | Kunci secret MinIO |
| `VITE_BACKEND_URL` | `http://localhost:3100` | URL backend yang tertanam di dashboard pada waktu build |
| `VITE_DOMAIN` | `localhost` | Domain yang tertanam di dashboard pada waktu build |
### Opsional (fitur akan menurun secara bertahap jika tidak ada)
| Variabel | Fitur |
| -------------------------------------------------------- | ------------------------------------------------------------- |
| `OPENAI_API_KEY` | Terjemahan berbantuan AI dan audit konten |
| `STRIPE_SECRET_KEY`, `STRIPE_WEBHOOK_SECRET`, `STRIPE_*` | Penagihan dan manajemen langganan |
| `RESEND_API_KEY` | Email transaksional via Resend (menimpa Mailpit jika disetel) |
| `GITHUB_CLIENT_ID`, `GITHUB_CLIENT_SECRET` | Login GitHub OAuth |
| `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET` | Login Google OAuth |
| `GITLAB_CLIENT_ID`, `GITLAB_CLIENT_SECRET` | Login GitLab OAuth |
| `MICROSOFT_CLIENT_ID`, `MICROSOFT_CLIENT_SECRET` | Login Microsoft OAuth |
| `LINKEDIN_CLIENT_ID`, `LINKEDIN_CLIENT_SECRET` | Login LinkedIn OAuth |
| `ATLASSIAN_CLIENT_ID`, `ATLASSIAN_CLIENT_SECRET` | Login Atlassian OAuth |
---
## Menghubungkan proyek Intlayer Anda
Setelah stack berjalan, arahkan proyek Anda ke backend dan dashboard yang di-self-host, bukan ke `intlayer.org`.
### Konfigurasi proyek
```typescript fileName="intlayer.config.ts" codeFormat={["typescript", "esm", "commonjs"]}
import type { IntlayerConfig } from "intlayer";
const config: IntlayerConfig = {
editor: {
clientId: process.env.INTLAYER_CLIENT_ID,
clientSecret: process.env.INTLAYER_CLIENT_SECRET,
/**
* URL dashboard CMS yang di-self-host.
* Default: https://app.intlayer.org
*/
cmsURL: process.env.INTLAYER_CMS_URL, // e.g. http://localhost:3000
/**
* URL API backend yang di-self-host.
* Default: https://back.intlayer.org
*/
backendURL: process.env.INTLAYER_BACKEND_URL, // e.g. http://localhost:3100
},
};
export default config;
```
Setel variabel lingkungan di `.env` proyek Anda:
```sh
INTLAYER_CMS_URL=http://localhost:3000
INTLAYER_BACKEND_URL=http://localhost:3100
INTLAYER_CLIENT_ID=
INTLAYER_CLIENT_SECRET=
```
Buat kredensial akses di dashboard self-host Anda di bawah **Projects → Access keys** di `http://localhost:3000/projects`.
### `@intlayer/api` SDK
Saat menggunakan `@intlayer/api` SDK secara terprogram, teruskan `backendURL` secara eksplisit:
```typescript fileName="cms.ts" codeFormat="typescript"
import { createIntlayerCMS } from "@intlayer/api";
import { dictionaryEndpoint } from "@intlayer/api/dictionary";
const cms = createIntlayerCMS({
editor: {
clientId: process.env.INTLAYER_CLIENT_ID,
clientSecret: process.env.INTLAYER_CLIENT_SECRET,
backendURL: process.env.INTLAYER_BACKEND_URL, // http://localhost:3100
},
});
const { data: dictionaries } = await dictionaryEndpoint(cms).getDictionaries();
```
---
## Peningkatan
Menjalankan ulang installer pada deployment yang ada akan melakukan rolling upgrade:
```sh
curl -fsSL https://intlayer.org/install.sh | sh
```
Ini menarik image terbaru dan memulai ulang kontainer dengan `docker compose pull && docker compose up -d`. Volume yang sudah ada (`mongo-data`, `redis-data`, `minio-data`) dipertahankan — tidak ada kehilangan data.
Untuk meningkatkan secara manual dari dalam direktori `./intlayer/`:
```sh
docker compose pull
docker compose up -d
```
---
## Cadangkan dan pulihkan
Semua data persisten berada dalam tiga volume Docker bernama.
### Cadangkan
```sh
docker run --rm \
-v intlayer_mongo-data:/data \
-v "$(pwd)":/backup \
busybox tar czf /backup/mongo-data.tar.gz /data
docker run --rm \
-v intlayer_redis-data:/data \
-v "$(pwd)":/backup \
busybox tar czf /backup/redis-data.tar.gz /data
docker run --rm \
-v intlayer_minio-data:/data \
-v "$(pwd)":/backup \
busybox tar czf /backup/minio-data.tar.gz /data
```
### Pulihkan
```sh
docker run --rm \
-v intlayer_mongo-data:/data \
-v "$(pwd)":/backup \
busybox tar xzf /backup/mongo-data.tar.gz -C /
# Ulangi untuk redis-data dan minio-data
```
---
## Menggunakan reverse proxy (Nginx / Caddy)
Untuk deployment produksi, letakkan reverse proxy di depan kontainer aplikasi dan backend daripada mengeksposnya secara langsung.
### Contoh Nginx
```nginx
server {
listen 80;
server_name cms.example.com;
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://localhost:3100;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
```
Perbarui variabel `.env` berikut agar sesuai dengan domain publik Anda:
```sh
BACKEND_URL=https://api.example.com
APP_URL=https://cms.example.com
DOMAIN=example.com
VITE_BACKEND_URL=https://api.example.com
VITE_DOMAIN=example.com
```
> Variabel `VITE_*` tertanam dalam image dashboard pada waktu build. Jika Anda mengubahnya setelah image dibuat, Anda perlu membangun ulang image `app` (`docker compose build app`) atau menggunakan injeksi konfigurasi runtime.
---
## Pemecahan Masalah
### Backend crash-loops pada start pertama
MongoDB dan Redis harus sehat sebelum backend dimulai. File compose menggunakan `depends_on` dengan `condition: service_healthy`. Jika Anda melihat restart backend berulang, periksa apakah `healthchecks` `mongo` dan `redis` lulus:
```sh
docker compose ps
docker compose logs mongo
docker compose logs redis
```
### Dashboard tidak dapat mencapai API
Verifikasi bahwa `VITE_BACKEND_URL` cocok dengan URL di mana backend dapat dijangkau dari **browser** (bukan jaringan Docker). Jika Anda mengubah port backend atau menambahkan reverse proxy, bangun ulang image dashboard:
```sh
docker compose build app
docker compose up -d app
```
### Email tidak terkirim
Secara default, semua email keluar ditangkap oleh Mailpit. Buka `http://localhost:8025` untuk melihat pesan yang terkirim. Untuk mengirim email sungguhan, setel `MAIL_PROVIDER=resend` dan `RESEND_API_KEY=` di `.env`, lalu restart backend:
```sh
docker compose restart backend
```
### Bucket MinIO hilang
Jika layanan one-shot `minio-init` tidak berjalan (atau berjalan sebelum MinIO siap), buat bucket secara manual:
```sh
docker compose run --rm minio-init
```
---
## Tautan Berguna
- [Dokumentasi Intlayer CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/id/intlayer_CMS.md)
- [Referensi Konfigurasi](https://github.com/aymericzip/intlayer/blob/main/docs/docs/id/configuration.md)
- [SDK CMS — `@intlayer/api`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/id/intlayer_CMS.md#programmatic-access-with-the-intlayerapi-sdk)