> ## Content Index
> Fetch the complete content index at: https://debug.my.id/llms.txt
> Use this file to discover other available public pages before exploring further.

# Cara self hosted Ghost CMS dengan nginx dan pm2
- URL: https://debug.my.id/install-ghost-lokal-dengan-pm2/
- Published: 2025-02-25T00:00:00.000Z
- Updated: 2025-07-01T08:36:01.000Z
- Description: Artikel ini akan membahas bagaimana cara self hosted Ghost CMS dengan menggunakan Nginx dan PM2.
- Author: Tukang Debug
- Tags: Tutorial, Aplikasi, Review

**Ghost** adalah salah satu [**Content Managemen System**](https://www.debug.my.id/2022/09/install-ghost-lokal-dengan-pm2.html?ref=debug.my.id)populer yang gratis dan open source, serta berjalan dengan menggunakan Node.js. Dan karena gratis dan open source, maka [**Ghost CMS**](https://www.debug.my.id/2022/09/install-ghost-lokal-dengan-pm2.html?ref=debug.my.id) tentu saja dapat di install di lokal - baca: **self hosted** \- dengan mudah.

Cara meng-install-nya pun sangat mudah, yaitu dengan menggunakan **`ghost-cli`**. Akan tetapi cara ini kurang penulis sukai, karena **`ghost-cli`** nantinya akan menambahkan user sebagai **`*sudoer*`**. Oleh karena itu, berikut ini adalah alternatif lain untuk meng-install Ghost CMS dengan menggunakan **`pm2`** sebagai service manager.

## 0\. Menginstall **MySQL 8, Nginx, Node.js**, dan **PM2**

Untuk menggunakan Ghost CMS, pastikan sistem anda sudah ter-install beberapa package sebagai berikut.

1. MySQL 8
2. Nginx
3. Node.js
4. PM2

## 0.1\. Menginstall MySQL 8

Sejak versi 5, Ghost CMS tidak lagi men-support [**MariaDB**](https://www.debug.my.id/2022/09/install-ghost-lokal-dengan-pm2.html?ref=debug.my.id). Meski mungkin tetap bisa menggunakan MariaDB, tetapi tim pengembang Ghost CMS tidak menjamin akan tetap lancar jika menggunakan MariaDB. Oleh karena itu, pastikan system anda sudah ter-install MySQL versi 8.

```bash
sudo apt install mysql-server
```

## 0.2\. Menginstall Nginx

Kenapa dipilih **Nginx** dibandingkan dengan Apache, karena jelas `nginx` lebih ringan dan cepat jika dibandingkan dengan Apache. Tentu saja Anda tetap bisa menggunakan Apache atau web server yang lainnya.

```bash
sudo apt install nginx
```

## 0.3\. Menginstall Node.js

Sampai dengan tulisan ini ditulis, Ghost CMS hanya mensupport Node.js versi 18.x , 20.x (**direkomendasikan**) dan 22.x. Untuk Anda yang menggunakan Ubuntu 20.04 atau yang lainya, Anda dapat menginstall Node.js versi 22.x dengan perintah berikut ini.

```bash
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt-get install -y nodejs

```

## 0.4\. Menginstall PM2

**PM2** adalah service manager atau daemon process manager yang fungsi utamanya adalah membuat aplikasi Anda bisa berjalan secara otomatis seperti layaknya service. Bedanya dengan `**systemd**` atau yang sejenisnya, `pm2` ini berjalan disisi user non administrator. Dengan menggunakan `pm2`, Anda dapat membuat service tanpa perlu repot menambahkannya ke dalam **`systemd`**, artinya tidak perlu sering-sering merepotkan administrator.

Untuk meng-install PM2, jalankan perintah di bawah ini.

```bash
sudo npm install pm2 -g
```

## 1\. Menginstall **ghost-cli**

`**ghost-cli**` adalah tool yang dibuat oleh tim dari Ghost CMS untuk mempermudah proses install, update dan uninstall Ghost CMS. Namun kali ini `ghost-cli` hanya akan digunakan untuk men-download dan upgrade Ghost CMS saja. 

Untuk meng-install `ghost-cli`, jalankan perintah di bawah ini.

```bash
sudo npm install ghost-cli@latest -g
```

![Cara self hosted Ghost CMS dengan nginx dan pm2](https://debug.my.id/content/images/2025/06/image-169.png)

## 2\. Menyiapkan database untuk Ghost CMS

Salah satu *best practice* dalam menyiapkan database Ghost CMS dan aplikasi-aplikasi lainnya adalah, membuat user database tertentu untuk setiap aplikasi. Hal ini untuk memastikan bahwa satu aplikasi tidak memiliki akses ke database aplikasi yang lain (kecuali jika memang diinginkan).

Silahkan buat database baru sekaligus user baru untuk Ghost CMS ini. Misalkan nama database nya adalah **`ghost`**, sedangkan usernya adalah **`ghost_user`**. Silahkan jalankan perintah **SQL** di bawah ini pada server database Anda. Pastikan Anda mengganti password **password\_untuk\_user** dengan password pilihan Anda sendiri.

```javascript
create database ghost;
create user 'ghost_user'@'localhost' identified by 'password_untuk_user';
grant all privileges on ghost.* to 'ghost_user'@'localhost';
flush privileges;
```

### **Catatan:**

Pada contoh SQL di atas, database berada satu mesin dengan Ghost CMS, sehingga user yang dibuat menggunakan **`@localhost`**. Silahkan Anda sesuaikan dengan database Anda.

## 3\. Membuat user linux yang akan menjalankan Ghost CMS

Seperti yang disebutkan di atas, untuk membuat service Ghost CMS ini, kita akan menggunakan PM2\. Oleh karena itu, untuk memastikan keamanan user yang akan menjalankan PM2 tersebut, maka perlu disiapkan satu **user biasa tanpa password** dan **tidak bisa login ke dalam system**.

Jalankan perintah di bawah ini di server tempat Ghost CMS Anda akan diinstall. Untuk contoh kali ini, kita buat user dengan nama **`ghostuser`**.

```bash
sudo adduser --disabled-password --disabled-login ghostuser
```

### **Catatan:**

Meskipun user **`ghostuser`** ini dibuat tanpa password dan tidak bisa login, akan tetapi Anda tetap bisa menjadi user tersebut dengan cara **`sudo su ghostuser`**.

## 4\. Menginstall Ghost CMS

Sebelum menginstall Ghost CMS, yang pertama kali harus disiapkan adalah folder tempat Ghost CMS akan diinstall. Jika Anda menggunakan Ubuntu, maka folder tersebut biasanya adalah di `/**var/www/html**`. Maka buat folder tempat Ghost CMS tersebut (misalkan kita beri nama ghost) dan pastikan untuk men-setting **`ghostuser`** sebagai owner dari folder tersebut.

```bash
sudo mkdir /var/www/html/ghost
sudo chown ghostuser:ghostuser /var/www/html/ghost
```

Setelah folder siap. Maka selanjutnya kita akan menginstall Ghost CMS dengan user `*ghostuser*`. Oleh karena itu, silahkan berubah menjadi user **`ghostuser`** dengan perintah :

```bash
sudo su ghostuser
```

Setelah itu, masuk ke dalam folder Ghost CMS yang sudah Anda buat sebelumnya, kemudian jalankan perintah **`ghost install local --no-start --no-enable`**.

```bash
cd /var/www/html/ghost
ghost install local --no-start --no-enable
```

> **JANGAN LUPA** untuk menambahkan parameter local dan option **`--no-start`** dan **`--no-enable`** yang akan memberitahu ghost-cli bahwa instalasi ini untuk lokal dan tidak perlu setup autostart-nya. Dengan parameter dan option ini, maka ghost-cli hanya akan melakukan pengecekan folder dan mengunduh source code Ghost CMS ke dalam folder tersebut.

![Cara self hosted Ghost CMS dengan nginx dan pm2](https://debug.my.id/content/images/2025/06/image-170.png)

### **Catatan:**

Perhatikan informasi yang muncul ini : **`http://localhost:2369/ghost/`**. Bisa jadi nomor port yang muncul di sini akan berbeda dengan Anda. Biasanya port awal yang muncul adalah **`2368`**. Sedangkan pada tampilan di atas muncul **`2369`** karena saat itu sudah ada satu Ghost CMS yang terinstall.

## 5\. Pengaturan Ghost CMS

Secara default, perintah **ghost install local** akan otomatis men-setting Ghost CMS dalam **`mode development`** (dengan file **`config.development.json`**) dan menggunakan database **`sqlite`**. Oleh karena itu, kita akan mengubah konfigurasi tersebut menjadi **`mode production`** dengan database **mysql**.

Ubah nama file **`config.development.json`** menjadi **`config.production.json`**.

```bash
mv config.development.json config.production.json
```

Kemudian ubah isi dari file config.production.json tersebut dengan editor yang Anda sukai. Kira-kira diubah menjadi seperti berikut.

```bash
{
  "url": "http://localhost:2369/",
  "server": {
    "port": 2369,
    "host": "127.0.0.1"
  },
  "database": {
    "client": "mysql",
    "connection": {
      "host": "127.0.0.1",
      "port": 3306,
      "user": "ghost_user",
      "password": "password_untuk_user",
      "database": "ghost"
    }
  },
  "mail": {
    "transport": "Direct"
  },
  "logging": {
    "transports": [
      "file",
      "stdout"
    ]
  },
  "process": "local",
  "paths": {
    "contentPath": "/var/www/html/ghost/content"
  }
}
```

### **Catatan:**

> Sesuaikan beberapa nilai seperti **server port** (**2369**) dan **password database** (**password\_untuk\_user**) atau yang lainnya sesuai dengan konfigurasi server dan database Anda.

## 6\. Menambahkan Ghost CMS ke dalam PM2

Agar Ghost CMS bisa ditambahkan ke dalam PM2 dengan mudah, maka buat file dengan nama **`ecosystem.config.js`** di dalam folder Ghost CMS tersebut dengan isi kurang lebih sebagai berikut.

```bash
module.exports = {
  apps : [{
    name   : "ghost",
    cwd : "/var/www/html/ghost",
    script : "./current/index.js",
    env: {
       NODE_ENV: "production"
    }    
  }]
}
```

### Catatan:

> Sesuaikan **name** serta ganti nilai **cwd** sesuai dengan folder yang Anda buat sebelumnya.

Setelah file konfigurasi sudah Anda buat. Maka selanjutnya tambah dan jalankan Ghost CMS tersebut ke dalam `pm2` dengan perintah.

```bash
pm2 start
```

![Cara self hosted Ghost CMS dengan nginx dan pm2](https://debug.my.id/content/images/2025/06/image-180.png)

Akan terlihat bahwa aplikasi/service dengan nama ghost sudah masuk ke dalam PM2\. Untuk melihat daftar service di dalam PM2, Anda dapat menggunakan perintah.

```bash
pm2 list
```

Sampai di sini, jika tidak ada kesalahan, maka Anda sudah dapat mengakses Ghost CMS tersebut pada alamat **`http://localhost:2368`** atau untuk contoh di atas adalah **`http://localhost:2369`**. Sesuaikan dengan port Anda.

Jika sudah muncul seperti gambar di bawah ini, maka artinya Ghost CMS berhasil di-install dan saat ini sedang melakukan inisialisasi. Tunggu beberapa saat, kemudian coba refresh lagi.

![Cara self hosted Ghost CMS dengan nginx dan pm2](https://debug.my.id/content/images/2025/06/ghost.jpg)

Dan ini adalah tampilan awal jika Ghost CMS sudah selesai diinisialisasi.

![Cara self hosted Ghost CMS dengan nginx dan pm2](https://debug.my.id/content/images/2025/06/image-181.png)

## 7\. Setup user Admin

Karena Ghost CMS baru saja terinstall, maka belum ada user admin yang tersedia. Oleh karena itu, silahkan menuju halaman `/ghost` untuk menambahkan user admin.  
**`http://localhost:2368/ghost`** atau **`http://localhost:2369/ghost`**. Kemudian tuliskan user admin dan identitas website.

![Cara self hosted Ghost CMS dengan nginx dan pm2](https://debug.my.id/content/images/2025/06/image-174.png)

![Cara self hosted Ghost CMS dengan nginx dan pm2](https://debug.my.id/content/images/2025/06/image-175.png)

## 8\. Setting PM2 Startup

Setelah aplikasi berhasil ditambahkan ke dalam PM2, maka selanjutnya agar Ghost CMS ini bisa otomatis berjalan pada saat restart, maka kita harus menambahkan PM2 ke dalam `systemd`. Jalankan perintah berikut ini :

```bash
pm2 startup
```

![Cara self hosted Ghost CMS dengan nginx dan pm2](https://debug.my.id/content/images/2025/06/image-176.png)

Simpan kode perintah yang muncul dari hasil **`pm2 startup`** di atas ke dalam file atau editor, atau apapun. Karena perintah tersebut nantinya akan kita jalankan dengan sudo di luar user **`ghostuser`**. Ini adalah contoh kode yang muncul dari perintah **`pm2 startup`**.

```javascript
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u ghostuser --hp /home/ghostuser
```

Selanjutnya kita akan menyimpan hasil **`pm2 start`** sebelumnya agar tersinkron ke dalam buffer pm2 dengan perintah:

```javascript
pm2 save
```

![Cara self hosted Ghost CMS dengan nginx dan pm2](https://debug.my.id/content/images/2025/06/image-177.png)

Setelah pm2 save berhasil. Selanjutnya keluar dari user **ghostuser**, kembali ke user awal dengan menuliskan perintah **exit** di terminal. Kemudian jalankan perintah hasil **`pm2 startup`** sebelumnya.

![Cara self hosted Ghost CMS dengan nginx dan pm2](https://debug.my.id/content/images/2025/06/image-178.png)

Dengan ini maka Ghost CMS Anda akan otomatis berjalan setiap kali system di restart. Untuk memastikan hal di atas berhasil, jika perlu lakukan restart system, dan pastikan Ghost CMS otomatis berjalan. Jika setelah restart Ghost CMS gagal di akses, maka itu artinya setting startup PM2 di atas belum berhasil. Silahkan ulangi kembali.

## 9\. Membuat Virtualhost

Tentu Anda tidak ingin website Anda hanya dapat diakses dengan IP. Oleh karena itu, langkah selanjutnya adalah membuat Virtualhost untuk Ghost CMS. Di sini kita tidak akan membahas bagaimana cara mendapatkan atau membeli dan mengatur DNS untuk custom domain.

Misalkan domain yang akan kita pasang adalah **debug.my.id**. Silahkan buat file bernama **debug.my.id** pada folder **`/etc/nginx/sites-available`**

```bash
sudo vi /etc/nginx/sites-available/debug.my.id
```

Kemudian tuliskan konfigurasi seperti contoh di bawah ini.

```json
server {
   server_name debug.my.id;
   root /var/www/html/ghost;

   access_log   off;
   error_log         /var/log/nginx/debug.my.id_error.log;
   location / {
      proxy_redirect   off;
      proxy_set_header        X-Real-IP       $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host            $host;
      proxy_pass       http://127.0.0.1:2368;
      proxy_buffer_size          1024k;
      proxy_buffers           512 1024k;
      proxy_busy_buffers_size   1024k;
      proxy_read_timeout 300;
      proxy_set_header X-Forwarded-Proto $scheme;
      client_max_body_size 100M;
  }
}
```

### **Catatan:**

Sesuaikan konfigurasi **`server_name debug.my.id`** ini dengan domain Anda. Dan sesuaikan port pada konfigurasi **`proxy_pass http://127.0.0.1:2368`** dengan nilai port yang sesuai, dan nilai **`root`** dengan folder yang Anda buat sebelumnya.

Cek konfigurasi virtual host dan pastikan tidak terdapat kesalahan konfigurasi.

```bash
sudo nginx -t
```

![Cara self hosted Ghost CMS dengan nginx dan pm2](https://debug.my.id/content/images/2025/06/image-179.png)

Aktifkan virtual host tersebut dengan cara membuat symlink dari folder **`site-available`** ke dalam folder **`site-enabled`**.

```bash
sudo ln -s /etc/nginx/site-available/debug.my.id /etc/nginx/site-enabled/debug.my.id
```

Kemudian restart nginx dengan perintah :

```bash
sudo service nginx restart
```

Karena sekarang menggunakan domain, maka ubah nilai **`url`** pada **`config.production.json`** dengan domain di atas. Contoh :

```bash
{
  "url": "http://debug.my.id",
  ...
  ...
}
```

Coba kembali akses Ghost CMS ini dengan menggunakan domain. Jika tidak ada kesalahan pada setting virtualhost, maka Anda seharusnya sudah bisa mengakses Ghost CMS tersebut dengan menggunakan domain.

### Catatan:

> Jika Anda kemudian mengaktifkan **https**, maka pastikan mengubah kembali nilai **url** pada **config.production.json** dengan **https://....**

## Kesimpulan

Cara install Ghost CMS dengan menggunakan PM2 ini memang lebih rumit dibandingkan dengan menggunakan **`ghost-cli`** secara penuh. Akan tetapi dengan Anda menggunakan PM2, maka Anda memiliki beberapa fitur yang hanya disediakan oleh PM2\. Beberapa diantaranya adalah sebagai berikut:

1. Dapat melakukan monitoring secara realtime dengan fitur pm2 monit
2. Dapat dengan mudah mengaktifkan cluster mode, terutama jika Anda memilik CPU multi core

Sekian tip dan trik kali ini. Selamat mencoba dan semoga yang sedikit ini bermanfaat.

Sumber :  
[**PM2**](https://pm2.keymetrics.io/?ref=debug.my.id)  
[**Ghost CMS**](https://ghost.org/?ref=debug.my.id)

[](https://blogger.googleusercontent.com/img/a/AVvXsEjjjzWxu58aEF59fi%5Ff6W3dY03rafW7LMkShZ6i8q29MUlrzkRsalNVVeJ5flNmXe7x4RCvMXrqLwp46bUc8TtncoShO6-F4uEh3IRzHsGFnonG4y%5FxHCUc%5F0wIwTXw2XwAecRV6TBMDLdc68pNdf3ToWsNIS1p5JKuG7M7RPMZhScfdi9mGHP9y9%5F%5F=s16000?ref=debug.my.id)