HedgeDocをKubernetesに構築する
===
## 環境
基盤: Kubernetes
OIDC認証プロバイダー: Zitadel
## Manifests
See: [GitHub](https://github.com/walnuts1018/infra/tree/main/k8s/apps/hedgedoc)
## ポイント
### OAUTH2 env設定
```yaml
- name: CMD_OAUTH2_USER_PROFILE_URL
value: "https://auth.walnuts.dev/oidc/v1/userinfo"
- name: CMD_OAUTH2_USER_PROFILE_USERNAME_ATTR
value: "preferred_username"
- name: CMD_OAUTH2_USER_PROFILE_DISPLAY_NAME_ATTR
value: "name"
- name: CMD_OAUTH2_USER_PROFILE_EMAIL_ATTR
value: "email"
- name: CMD_OAUTH2_TOKEN_URL
value: "https://auth.walnuts.dev/oauth/v2/token"
- name: CMD_OAUTH2_AUTHORIZATION_URL
value: "https://auth.walnuts.dev/oauth/v2/authorize"
- name: CMD_OAUTH2_CLIENT_ID
value: "
[email protected]"
- name: CMD_OAUTH2_CLIENT_SECRET
valueFrom:
secretKeyRef:
name: hedgedoc-secret
key: client-secret
- name: CMD_OAUTH2_PROVIDERNAME
value: "walnuts.dev"
- name: CMD_OAUTH2_SCOPE
value: "openid profile email"
```
https://github.com/walnuts1018/infra/blob/3eea9e74065ad20982b8b9d74b2b271600b4ee8c/k8s/apps/hedgedoc/deployment.yaml#L42-L64
:::warning
私の環境では[external-secrets](https://external-secrets.io/latest/)と[Vault](https://www.vaultproject.io/)を使っており、`CMD_OAUTH2_CLIENT_SECRET`はそこから取得しています。
:::
```yaml
- name: CMD_EMAIL
value: "false"
```
これを付けるとデフォルトのログイン画面が表示されなくなるので、OIDCログインのみに限定できます。
![](https://minio.walnuts.dev/hedgedoc/uploads/94271d96-e6af-4f45-8331-a9cfde0ed485.png)
### Role制限
指定したRoleを持つ人のみにログインを制限する場合、`CMD_OAUTH2_ACCESS_ROLE`で実現できます。
ただし、zitadelではRolesが一般的な方法で渡されないので、自分でzitadel actionを書いて成型する必要があります。
[例](https://zenn.dev/walnuts/scraps/2c504e78536d84)
上の例のような設定をしたうえで、
```yaml
- name: CMD_OAUTH2_ROLES_CLAIM
value: "my:zitadel:grants"
- name: CMD_OAUTH2_ACCESS_ROLE
value: "237477822715658605:hedgedoc-user"
```
とすると、うまくRole制限を実現できます。
## 権限設定
VolumeMountを10000:10000でする必要がある
無理やりだがInitContainterで対応した
```yaml
securityContext:
fsGroup: 10000
fsGroupChangePolicy: "OnRootMismatch"
initContainers:
- name: chown-change
image: busybox:1.36.1
command: ["chown", "-R", "10000:10000", "/hedgedoc/public/uploads"]
volumeMounts:
- name: hedgedoc-data
mountPath: /hedgedoc/public/uploads
```
https://github.com/walnuts1018/infra/blob/2ff3472cf540ee9b31071934048c31da7132e7ee/k8s/apps/hedgedoc/deployment.yaml#L19-L28