The firewall now permits the backend subnet (172.16.19.0/24) to reach the DMZ reverseproxy on 443, so server-to-server calls can use the public FQDN over the reverseproxy instead of the previous workarounds: - Remove the `*_extra_hosts` pins from nextcloud, opnform, bookstack and homarr; their OIDC discovery/issuer now uses the public auth.gymb.* FQDN (verified: discovery returns 200 with the public iss over the reverseproxy). - Switch nextcloud OIDC discovery_url from auth.int.* to auth.gymb.*. - Drop authentik_host_rewrite_domains and authentik_outpost_domains; point the LDAP outpost (both host_vars) at the public auth.gymb.* FQDN. - Repoint the garage-webui ForwardAuth from the never-functional dedicated outpost FQDN to auth.gymb.*. The embedded outpost only serves the auth path when Host is a configured authentik_domain and matches the protected app via X-Forwarded-Host, so auth.gymb.* stays pinned to the application host on storage to bypass the reverseproxy's X-Forwarded-Host stripping. The *.int.* names and their cert SANs are kept: the DMZ verifies the backend cert (acme cert_mode) and connects by name, so they remain structural to the DMZ->backend hop. The console.s3 DMZ route limitation is pre-existing and tracked separately.
123 lines
4.8 KiB
YAML
123 lines
4.8 KiB
YAML
---
|
|
# Bao secret <mount>/data/nextcloud expected to contain:
|
|
# postgres_password, admin_password
|
|
_nextcloud: "{{ lookup('community.hashi_vault.hashi_vault', vault_mount + '/data/nextcloud', url=vault_addr) }}"
|
|
_authentik: "{{ lookup('community.hashi_vault.hashi_vault', vault_mount + '/data/authentik', url=vault_addr) }}"
|
|
|
|
# 33.0.2 hits the PHP 8.4 TypeError in UserConfig::getValueBool() that
|
|
# user_ldap triggers on every authenticated request (nextcloud/server
|
|
# #59629; fix in 33.0.3). Pin to the patched tag.
|
|
nextcloud_image: "nextcloud:33.0.3-fpm"
|
|
|
|
# First entry is the canonical public FQDN (used for OVERWRITEHOST and
|
|
# OIDC redirects). Additional entries cover internal *.int.* names so
|
|
# collabora's WOPI callbacks hit nextcloud on a name with a valid
|
|
# internal cert instead of routing through the DMZ.
|
|
nextcloud_domains:
|
|
- "cloud.gymb.souveredu.ch"
|
|
- "cloud.int.gymb.souveredu.ch"
|
|
nextcloud_postgres_password: "{{ _nextcloud.postgres_password }}"
|
|
nextcloud_admin_user: admin
|
|
nextcloud_admin_password: "{{ _nextcloud.admin_password }}"
|
|
|
|
nextcloud_enable_notify_push: true
|
|
# Use the internal FQDN for the notify_push setup check so curl from the
|
|
# nextcloud container hits the local traefik directly instead of
|
|
# hairpinning through the DMZ reverseproxy.
|
|
nextcloud_notify_push_domain: "cloud.int.gymb.souveredu.ch"
|
|
|
|
# Collabora integration
|
|
# wopi_url (server-to-server: nextcloud calls collabora for discovery /
|
|
# capabilities) goes to the internal FQDN so the call stays in the LAN.
|
|
# public_wopi_url is what the browser loads the office iframe from — that
|
|
# stays on the public name reachable through the DMZ.
|
|
nextcloud_enable_collabora: true
|
|
nextcloud_collabora_domain: "office.int.gymb.souveredu.ch"
|
|
nextcloud_collabora_public_domain: "office.gymb.souveredu.ch"
|
|
|
|
# Draw.io integration
|
|
nextcloud_enable_drawio: true
|
|
nextcloud_drawio_url: "https://draw.gymb.souveredu.ch"
|
|
|
|
nextcloud_apps_to_install:
|
|
- groupfolders
|
|
- richdocuments
|
|
- spreed
|
|
- user_ldap
|
|
- user_oidc
|
|
- whiteboard
|
|
- drawio
|
|
- files_lock
|
|
- notify_push
|
|
|
|
# S3 primary storage via Garage — server-to-server, so use the internal FQDN.
|
|
# Resolves through the internal DNS to the storage host and presents a valid
|
|
# cert from the local traefik on storage.
|
|
nextcloud_use_s3_storage: true
|
|
nextcloud_s3_key: "{{ lookup('digitalboard.core.garage_credentials', 'nextcloud', host='storage')['key_id'] }}"
|
|
nextcloud_s3_secret: "{{ lookup('digitalboard.core.garage_credentials', 'nextcloud', host='storage')['secret_key'] }}"
|
|
nextcloud_s3_bucket: "nextcloud"
|
|
nextcloud_s3_host: "s3.int.gymb.souveredu.ch"
|
|
nextcloud_s3_port: 443
|
|
nextcloud_s3_ssl: true
|
|
nextcloud_s3_usepath_style: true
|
|
|
|
# OIDC discovery/token/userinfo and the S3 backend both target FQDNs
|
|
# that resolve to RFC1918 addresses (auth.gymb.* via the reverseproxy,
|
|
# s3.int.* directly), which Nextcloud's DnsPinMiddleware would otherwise
|
|
# block as "local server access".
|
|
nextcloud_allow_local_remote_servers: true
|
|
|
|
# Share the LDAP docker network with the authentik LDAP outpost
|
|
nextcloud_extra_networks:
|
|
- ldap
|
|
|
|
# LDAP backend (Authentik LDAP outpost)
|
|
nextcloud_ldap_enabled: true
|
|
nextcloud_ldap_config:
|
|
ldapHost: "ldap://authentik-outpost-ldap-ldap-1"
|
|
ldapPort: "3389"
|
|
ldapAgentName: "cn=akadmin,ou=users,dc=gymb,dc=souveredu,dc=ch"
|
|
ldapAgentPassword: "{{ _authentik.admin_password }}"
|
|
ldapBase: "dc=gymb,dc=souveredu,dc=ch"
|
|
ldapBaseUsers: "ou=users,dc=gymb,dc=souveredu,dc=ch"
|
|
ldapTLS: "0"
|
|
turnOffCertCheck: "1"
|
|
ldapUserFilter: "(&(objectClass=user)(cn=*))"
|
|
ldapUserFilterObjectclass: "user"
|
|
ldapLoginFilter: "(&(objectClass=user)(cn=%uid))"
|
|
ldapLoginFilterUsername: "1"
|
|
ldapUserDisplayName: "cn"
|
|
ldapEmailAttribute: "mail"
|
|
ldapExpertUsernameAttr: "cn"
|
|
ldapExpertUUIDUserAttr: "uid"
|
|
ldapExpertUUIDGroupAttr: "uid"
|
|
ldapBaseGroups: "ou=groups,dc=gymb,dc=souveredu,dc=ch"
|
|
ldapGroupFilter: "(&(objectClass=group))"
|
|
ldapGroupFilterObjectclass: "group"
|
|
ldapGroupDisplayName: "cn"
|
|
ldapGroupMemberAssocAttr: "member"
|
|
ldapAdminGroup: "admins"
|
|
ldapCacheTTL: "600"
|
|
ldapPagingSize: "500"
|
|
ldapExperiencedAdmin: "1"
|
|
ldapConfigurationActive: "1"
|
|
|
|
# OIDC providers for login (Authentik)
|
|
nextcloud_oidc_providers:
|
|
- identifier: authentik
|
|
display_name: "Login with Authentik"
|
|
client_id: nextcloud
|
|
client_secret: "{{ _authentik.nextcloud_oidc_secret }}"
|
|
# Discovery via the public FQDN. It resolves (internal DNS view) to
|
|
# the DMZ reverseproxy, which the backend subnet can now reach, so
|
|
# the server-to-server call stays in the LAN while the iss claim and
|
|
# all listed endpoints match the public hostname the browser sees
|
|
# during login — no host-rewrite or /etc/hosts pin needed.
|
|
discovery_url: "https://auth.gymb.souveredu.ch/application/o/nextcloud/.well-known/openid-configuration"
|
|
scope: "openid email profile"
|
|
unique_uid: true
|
|
mapping:
|
|
uid: preferred_username
|
|
display_name: name
|
|
email: email
|