232 views
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