ヘッドレスCMSとしても使えるGhostをDigitalOceanのManaged k8s cluster(DOKS)にhelmでインストールしてみる。
ヘッドレスCMSのstrapiも試してみたかったが、2022/3月時点で公式やbitnamiのHelm Chartがないので断念。
Setup MySQL Database for Ghost
k8s clusterにインストール済みのMySQL(ns:mysql/svc:mysql)にGhost用Databaseを作成。
create database ghost;
create user hogehoge identified by 'hogehoge';
GRANT ALL PRIVILEGES ON ghost.* TO hogehoge@'%';
FLUSH PRIVILEGES;
Installing Ghost by Helm
下記をインストール。
helm search repo ghost
NAME CHART VERSION APP VERSION DESCRIPTION
bitnami/ghost 16.2.0 4.37.0 Ghost is an open source publishing platform des...
chartファイル作成
ghostUsername: hogehoge
ghostPassword: "Password"
ghostEmail: hogehoge@example.net
ghostBlogTitle: DOK8S-CMS
ghostHost: "cms.dok8s.net"
ghostPath: /
ghostEnableHttps: false
replicaCount: 1
service:
type: ClusterIP
ingress:
enabled: false
persistence:
enabled: true
storageClass: ""
annotations: {}
accessModes:
- ReadWriteOnce
size: 2Gi
existingClaim: ""
mariadb:
enabled: false
externalDatabase:
host: mysql.mysql
port: 3306
user: hogehoge
password: "Password"
database: ghost
existingSecret: ""
ssl: false
sslCaFile: ""
Ghostインストール
helm install ghost bitnami/ghost --namespace ghost --create-namespace -f ghost-values.yaml
deploy確認
helm ls -n ghost
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
ghost ghost 2 2022-03-14 18:26:28.211397 +0900 JST deployed ghost-16.2.0 4.37.0
k8sステータス確認
kubectl -n ghost get all,pvc
NAME READY STATUS RESTARTS AGE
pod/ghost-5654bcbcbc-2s4lf 1/1 Running 0 60m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/ghost ClusterIP 10.245.156.179 <none> 80/TCP 2d1h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/ghost 1/1 1 1 2d1h
NAME DESIRED CURRENT READY AGE
replicaset.apps/ghost-5654bcbcbc 1 1 1 60m
replicaset.apps/ghost-7dc6cf45d 0 0 0 2d1h
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/ghost Bound pvc-f0761f3b-4ac9-4e0d-86be-d6978c6ee6ce 2Gi RWO do-block-storage 2d1h
Add Ambassador host/mapping resources
Hostリソース追加
---
apiVersion: getambassador.io/v2
kind: Host
metadata:
name: dok8s-ghost
namespace: ambassador
spec:
hostname: cms.dok8s.net
acmeProvider:
email: hogehoge@example.net
tlsSecret:
name: dok8s-cms-tls2-cert
---
apiVersion: getambassador.io/v2
kind: TLSContext
metadata:
name: tls-cms
namespace: ambassador
spec:
secret: dok8s-cms-tls2-cert
hosts:
- cms.dok8s.net
alpn_protocols: h2
manifest適用
kubectl apply -f dok8s-wp-host.yaml
Mappingリソース追加
---
apiVersion: getambassador.io/v2
kind: Mapping
metadata:
name: dok8s-cms
namespace: ambassador
spec:
prefix: /
host: cms.dok8s.net
service: http://ghost.ghost/
manifest適用
kubectl apply -f dok8s-wp-map.yaml
ステータス確認
kubectl -n ambassador get host dok8s-ghost
NAME HOSTNAME STATE PHASE COMPLETED PHASE PENDING AGE
dok8s-ghost cms.dok8s.net Ready 2d6h
kubectl -n ambassador get mapping dok8s-cms
NAME SOURCE HOST SOURCE PREFIX DEST SERVICE STATE REASON
dok8s-cms cms.dok8s.net / http://ghost.ghost/