KubernetesでRedmine 6.xを動かしてみる
この記事はUniMagic Advent Calendar 2024の1日目の記事です
初手からゆにまじ関係なさそうな話題ですが、一応関係あります
経緯
VRChat内の学園型イベント「魔術学舎United」を運営する上で、従来はDiscordとスプレッドシートでのみタスク管理を行っており、運用が煩雑化していたため一部部署で試験的にredmineを運用してみようということになりました
環境
- microk8s v1.29
- argocd v2.7
- redmine v6.x
- mariadb v10.6
Redmineはなんとなくで最新版の6を、mariadbとkubernetesクラスタは転がってたものを使用しています
出来上がったマニフェスト
apiVersion: v1
kind: Namespace
metadata:
name: unimagic-redmine
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: redmine-files-pvc
namespace: unimagic-redmine
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: "100Gi"
---
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: unimagic-redmine
name: redmine
labels:
app: redmine
spec:
revisionHistoryLimit: 1
selector:
matchLabels:
app: redmine
template:
metadata:
labels:
app: redmine
spec:
containers:
- image: redmine:6-alpine
name: redmine
command:
[
"sh",
"-c",
"apk add --no-cache build-base ruby-dev libc-dev; git clone https://github.com/o-tr/redmine_webhook -b v0.0.7 /usr/src/redmine/plugins/redmine_webhook; git clone https://github.com/o-tr/kanban -b v0.0.14 /usr/src/redmine/plugins/kanban; /docker-entrypoint.sh rails server -b 0.0.0.0",
]
livenessProbe:
httpGet:
path: /login
port: 3000
failureThreshold: 1
periodSeconds: 10
startupProbe:
httpGet:
path: /login
port: 3000
failureThreshold: 360
periodSeconds: 10
env:
- name: REDMINE_PLUGINS_MIGRATE
value: "true"
- name: REDMINE_DB_MYSQL
valueFrom:
secretKeyRef:
name: redmine-appsettings
key: db_host
- name: REDMINE_DB_DATABASE
valueFrom:
secretKeyRef:
name: redmine-appsettings
key: db_name
- name: REDMINE_DB_USERNAME
valueFrom:
secretKeyRef:
name: redmine-appsettings
key: db_username
- name: REDMINE_DB_PASSWORD
valueFrom:
secretKeyRef:
name: redmine-appsettings
key: db_password
- name: REDMINE_DB_ENCODING
value: utf8mb4
resources:
limits:
memory: 2Gi
cpu: "1"
requests:
memory: 1Gi
cpu: "0.1"
volumeMounts:
- name: redmine-files-persistent-storage
mountPath: /usr/src/redmine/files
volumes:
- name: redmine-files-persistent-storage
persistentVolumeClaim:
claimName: redmine-files-pvc
---
kind: Service
apiVersion: v1
metadata:
namespace: unimagic-redmine
name: unimagic-redmine-svc
spec:
selector:
app: redmine
ports:
- protocol: TCP
port: 3000
targetPort: 3000
type: LoadBalancer
---
apiVersion: v1
kind: Secret
metadata:
name: redmine-appsettings
namespace: unimagic-redmine
type: Opaque
data:
db_host: hoge
db_name: hoge
db_username: hoge
db_password: hoge
各種設定
PVC
他の記事を参考にファイル用PVを100GBで確保しました
accessModesは手元の環境の都合でReadWriteOnceになっていますが、ReadWriteManyが利用できるのであればそちらの方が良いでしょう
Deployment
死活監視
/loginへリクエストを飛ばしています
/healthzエンドポイントがない上、認証を必須にすると/が403を返すので実質的に使用できるのがログイン画面くらいという...
絵文字対応
REDMINE_DB_ENCODINGをutf8mb4に設定することで絵文字を扱えるようになります
Plugins
起動時のコマンドでプラグインの導入を行っています
各パッケージはプラグインの導入時に必要そうだったので追加しています
Redmine Discord Webhook
https://github.com/suer/redmine_webhook をベースに6.xで動くように修正を加えたうえでDiscord用にフォーマットの変更を行っています
Redmine Kanban
https://github.com/happy-se-life/kanban をベースに6.xで動くように修正を加えています
メール
今回のユースケースでは不要だったので設定しませんでした
secret_key_base
公式ドキュメントではsecret_key_base
を設定して複数ノード間での認証を可能にしろとありますが、ぶっ壊れているらしく、設定すると起動しなくなるので諦めて設定を外しましょう
ネット上への公開
セキュリティ的観点からあまりポートを公開したくないのと、自宅に固定IPが無いことからkubernetes上にデプロイしたCloudflare Accessを用いて公開しています
だいぶ前から私はCloudflareと心中する覚悟をしています
さいごに
中の人にはだいぶ好評なようです
なお、何も考えずに6系を採用しましたが、プラグイン周りのことを考えるのであれば4.xのほうが良さそうです
宣伝
魔術学舎United、略してUniMagic(ユニマジック)とは、VRの世界に関係の深い技術を学ぶ学園空間型のイベントです。
15名~18名程度で構成されるクラスで、2週間の授業と1週間の修了制作を通して、技術についての知見を深めていきます。
Discussion