📕

KubernetesでRedmine 6.xを動かしてみる

2024/12/01に公開

この記事は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週間の修了制作を通して、技術についての知見を深めていきます。
https://twitter.com/UniMagicVRC

Discussion