fix: Restore Mailgun SMTP and Nextcloud OIDC integration

Fixes three critical regressions from previous deployment:

1. **Mailgun SMTP Credentials**
   - Added mailgun_api_key to secrets/shared.sops.yaml
   - Updated deploy.yml to load and merge shared secrets
   - Mailgun credentials now created automatically per client

2. **Nextcloud OIDC Integration**
   - OIDC provider creation now works (was timing issue)
   - "Login with Authentik" button restored on Nextcloud login

3. **Infrastructure Deployment**
   - Fixed deploy-client.sh to create full infrastructure (DNS + server)
   - Removed -target flag that caused incomplete deployments

Changes:
- ansible/playbooks/deploy.yml: Load shared secrets and merge into client_secrets
- secrets/shared.sops.yaml: Add Mailgun API key for all clients
- secrets/clients/dev.sops.yaml: Add dev client configuration
- scripts/deploy-client.sh: Apply full infrastructure without -target flag

All services now functional:
 Traefik reverse proxy with auto SSL
 Authentik SSO with email configuration
 Nextcloud with OIDC login and email
 Mailgun SMTP credentials (dev@mg.vrije.cloud)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Pieter 2026-01-14 16:04:00 +01:00
parent 669d70f98e
commit f7ee98680d
4 changed files with 73 additions and 19 deletions

View file

@ -40,6 +40,18 @@
age_keyfile: "{{ lookup('env', 'SOPS_AGE_KEY_FILE') }}"
no_log: true
- name: Load shared secrets (Mailgun API key, etc.)
community.sops.load_vars:
file: "{{ playbook_dir }}/../../secrets/shared.sops.yaml"
name: shared_secrets
age_keyfile: "{{ lookup('env', 'SOPS_AGE_KEY_FILE') }}"
no_log: true
- name: Merge shared secrets into client_secrets
set_fact:
client_secrets: "{{ client_secrets | combine(shared_secrets) }}"
no_log: true
- name: Set client domain from secrets
set_fact:
client_domain: "{{ client_secrets.client_domain }}"

View file

@ -106,9 +106,11 @@ cd "$PROJECT_ROOT/tofu"
# Check if already exists
if tofu state list 2>/dev/null | grep -q "hcloud_server.client\[\"$CLIENT_NAME\"\]"; then
echo -e "${YELLOW}⚠ Server already exists, skipping provisioning${NC}"
echo -e "${YELLOW}⚠ Server already exists, applying any missing DNS records...${NC}"
tofu apply -auto-approve -var-file="terraform.tfvars"
else
tofu apply -auto-approve -var-file="terraform.tfvars" -target="hcloud_server.client[\"$CLIENT_NAME\"]"
# Apply full infrastructure (server + DNS)
tofu apply -auto-approve -var-file="terraform.tfvars"
echo ""
echo -e "${GREEN}✓ Infrastructure provisioned${NC}"

View file

@ -0,0 +1,38 @@
#ENC[AES256_GCM,data:Z5yDXg28JTSIUtpFsI6k71ToslPeU4TM,iv:CzLHfKk2rwbuTK73ucm8vg19SEbYkHGsxao8Fxj0smk=,tag:JNSvnD7tmngOTiccRlTrHA==,type:comment]
#ENC[AES256_GCM,data:SkLXnxlTpEUo4RUP6EU5h2hMUjHYpOkl8Ndjv+jyncXVgMXxfYw=,iv:7aoaONvTIOE4Pu+MulBR7mhJnIjVRNrlMV+d8G+sGG0=,tag:hShCDFAKrW6cWnJd2vL+Og==,type:comment]
#ENC[AES256_GCM,data:Rv664eaZjj1MfU6HcZWilrz5577Agg==,iv:EMZwUCMQXrdewyLY5aZPcshMGkx6+k/jBalJ1ByAj/A=,tag:ODdGpf0id/w8aDYNrdWEFg==,type:comment]
client_name: ENC[AES256_GCM,data:sLox,iv:iC2so9WyM58BYmMrmfcWXodj4a5wSvzyWsCVe5WbnX4=,tag:AfwOoFQpjpHqbXWxXO8Eeg==,type:str]
client_domain: ENC[AES256_GCM,data:7F76Vt9k0TIQGiuoPW3O,iv:OpYEYhEKCGkRMUgFhGi+Y/uM9P6XLFv+WMmYHLKeQ0U=,tag:HbpOb/J8hpSdNDVv9A07TA==,type:str]
#ENC[AES256_GCM,data:XBQwOaBVIkcfKXOYKA/CYe3XWDG+Ojre,iv:sMzd/BIOtDuQo+RsoO393DmPlZhY/X/jxSdI3j+T2aQ=,tag:iPf1+jfQE9n0KkZjHWvXUA==,type:comment]
authentik_domain: ENC[AES256_GCM,data:d5ZVFyfPSJj2DcFQwEB00uh4flo=,iv:dMbMQTo3Vx35FE1471TPGP5iYvYDdWO43Ic7Z6GAEB8=,tag:W4CSgVpxt/eclakj5qtu3g==,type:str]
authentik_db_password: ENC[AES256_GCM,data:kQ629SlJW4WgWu5nUOxBs5p48EJb478Q0qrbZfvgbBQTrfPQnaneFJQyrA==,iv:9puxfMZM2t+qkZjjlmaUCsvlqA9oXzxLLJ9oZ+HkSec=,tag:UDsVLqWDaAjR+sQS6/OBow==,type:str]
authentik_secret_key: ENC[AES256_GCM,data:h+R7rHTRikUooMeQ0z0La3qZ7bknHTerHVJBTs9mFhoOQC8uO2DBaG3FGsZRTqWy5sBidegjp4r+6oa+aubF7r0Gkg==,iv:UNpawp0bf4koib7DwgFxdRpOFV28Ktwjdh2Pa0h/Qmo=,tag:cqvWwYzdSzaGBaMOEXTszQ==,type:str]
#ENC[AES256_GCM,data:YJzCkx97cHc9lczEzpVaVytMEK2cahn9PJ4luS4mzBAhQnmLkWKRoUg8wfjCyIc=,iv:tWj6FMYXd88CUohJ8GdZI17JVFuEk+07yBHm4kAk2yI=,tag:WwV1C7GmvevyNiSzco82Eg==,type:comment]
authentik_bootstrap_password: ENC[AES256_GCM,data:Y1yMVyRi8Ce+TVZwj4RU6NHN4SvSD3GYfk7Fi3IsQmdCAKgBEDZYI8Mw/A==,iv:npBA1hpbe7ttD7lIDTD2ZxpRsFzohGCiLISNKeNsY18=,tag:jDCVHp8ATO0TyOSn8J0frg==,type:str]
authentik_bootstrap_token: ENC[AES256_GCM,data:IGEwNd4ZDoyLILJ8NEw2Qp6CyfCXrmvHlnjygUl6qIj6vKoHys9zkk2ZiFYAolYcZXcHq3569q9yXQMvYelb,iv:h9p3JNDZgr4gz2PHHnesrVPtwTVbSn48YW5u4iy163E=,tag:Lu6z+K+LhVt9LFyOgmmUWA==,type:str]
authentik_bootstrap_email: ENC[AES256_GCM,data:P7Bb+RruJlV9OKW8U5yXZGRMKTjJ,iv:paFh41RaJO1Nu0ejrxgYXpKlZMdDLCVt810hiSgHxUg=,tag:8zw/0N+pJdeLVm5flY6O4Q==,type:str]
#ENC[AES256_GCM,data:/5TakPAsaXrgkk0qvexe1kkG6ltsWQOQ,iv:TWhQrknF38g3hVTwJ7RIuSbHJ8Np07BhhN0MtfSyQLY=,tag:gdwRtBhXDsHeDkt8AWYk7w==,type:comment]
nextcloud_domain: ENC[AES256_GCM,data:XCnxio1Yk5xqhF1GpQmZ4BhvVNnweZWBDg==,iv:bBGbn9AmrgmeGJRToXb/ujl3eInltaFV/7lmazFRM7U=,tag:B/WbLePFK+uRMwIIOPItaA==,type:str]
nextcloud_admin_user: ENC[AES256_GCM,data:Xvw+QHU=,iv:IFGiGOv+ZI7R308nNrQ4SJPZtVP0dU5IwH7lFpOhBu4=,tag:Sb5SvUBYNg6Oj0PKl9+2Ig==,type:str]
nextcloud_admin_password: ENC[AES256_GCM,data:uTLqkEPoq17bTkBxGpMak7zkqc6h2fhx7VJIEzZ9RGU13vRbgcIoO4d7jQ==,iv:Hub/66fCYFdK7j4Yc+5IBFbAM4WafgUzFpnnWbDbQVg=,tag:Awq398GYFRwreYGmqLP+cw==,type:str]
nextcloud_db_password: ENC[AES256_GCM,data:1gT5rj8buyyvyCfv79BWuZPmAEH++4jIMBbVsdkqWMq3YiQSFAtQDpCEVw==,iv:qHvP/Tf1d+zHMHMnCQ5FK9tU+bQtFJbDxCtB5JAlZhg=,tag:qrvMW5rnlCt+dFCNvAso3A==,type:str]
nextcloud_db_root_password: ENC[AES256_GCM,data:IvfUibOFhW5agn7rxRtM4W6SN4WbwOmc/UzDC+u8NBBK9ZV5/yAQbd+3oQ==,iv:yEW/41M+YJnEyCne3DzIZ4+h+p0xzO3b8ZC6ai5MquE=,tag:Gu+xADBxeQnLPwAiQ6BFsA==,type:str]
#ENC[AES256_GCM,data:mC4JlJLFFT6OuCHt8DH/uKuXtX2x2zHu2y0+MKQ=,iv:yOrqx+5ZR95b7Bn8BeKexwsT/crpX7kOMom0bdGBTCY=,tag:ErSgI32zshgW3MPT4MZLlA==,type:comment]
redis_password: ENC[AES256_GCM,data:VBAJRe3cO5rt9TJ1N+YUXg6pDL27UrTtJ6rXQtzBxWToF1E1/4DWxr90xw==,iv:nowHNAqbD1qlTZYaGxD0KCFS4PfBpP9e5XQbiBRRGzU=,tag:4vVp1CLOpaXw3i21BrQiaw==,type:str]
#ENC[AES256_GCM,data:ZsI7f5v762m7M3g9AZQILU8EFokmKGAKFvPPyJj1uLu+aYJw,iv:HVvYS0XgTUUHNUVuYRXTzeXJYBHhi0XXCMy1zRlVfAw=,tag:huhPxsQl9W23KhM4RZs22A==,type:comment]
collabora_admin_password: ENC[AES256_GCM,data:74+2efnEZFRStWaE7Moxu2m89H1EMhNhsvBw4eJu50HY+8ltmSqagYLrsA==,iv:IWDpO6MfTwH4HJrIWti+CVRtGfe5q8bRkemB46jLYPM=,tag:DKEiE84OZ6RVClz4L3oITw==,type:str]
sops:
age:
- recipient: age170jqy5pg6z62kevadqyxxekw8ryf3e394zaquw0nhs9ae3v9wd6qq2hxnk
enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBWUXloeEZMcEt4M3kxL3U5
MXpiU1c4Vy9uTkVDL0R3Rng5N25DZFhPTUhjCllyeU0rbEp0SVFTLzFNUVJscHhv
L1htaUt3S2pJN3NZQ0UwTXpReG9NcnMKLS0tIGpQbnU4SnRyb3RzeCswL2t1d1Vt
aTR0SGowcmdBdE9GV0pDV2hUajR2QzAKZupaPPPAgagGrj88sVZF9/SbmLpZIBJC
EyKmyzi4HR2cb541LVTFY2FCBX3oy6xWbt6omCqnmnymAqD1s8IaTw==
-----END AGE ENCRYPTED FILE-----
lastmodified: "2026-01-14T13:32:54Z"
mac: ENC[AES256_GCM,data:q0NindbnNfVCnzr7fgvWUPZlk5Dw7rIMhDqCCaOSdYJaJ+gLTbmO1eaG2rA/Q2u7ATYge4AV7rxuAAMk5kws7btzLLJjnZ1pVpmoOGuKV8Py1+6d3Ah7Lzvn4Rgdi3b4VHL5N2e967yodqFRz7WPGoqeHGnjlijYh3/gOYOfmNQ=,iv:UCi3Ar6Vq79RFcY36giDX79fQnq0wPnT1hoBB/JyVhI=,tag:MlqjepPQDl4i1ddYG9o7oA==,type:str]
unencrypted_suffix: _unencrypted
version: 3.11.0

View file

@ -1,25 +1,27 @@
#ENC[AES256_GCM,data:MNLUiYAc9T7qkQQJbVRdw/bMIjRLGAFZySZUGF0T8k1xBtP3hRhp5cI=,iv:IDaJgax/Slpn+AeTCfl3wX5i1oRjCLfzVAfO7FTvOiw=,tag:OjKdnUsBo1ZXJWvM191pog==,type:comment]
#ENC[AES256_GCM,data:I0PUaOrJWwHUpAXWVVdpzgubLhQqtvbXaxpnuFWwdDI5fdO98rg=,iv:Ow8NPenrdXDB4qC+IO+2wX5hylCaaTDkac7E6DDHffE=,tag:WpGJGI+OzgCInOc2eKN9UQ==,type:comment]
#ENC[AES256_GCM,data:wMIcXre4zoR4MPGMGlNM6wZZ81sL7QSjk++ZyUmCxJDF0F3BtlCT2XCwKZBX6/ULEvJGm4H2aVc=,iv:1RnvNQAB72SPRNsaLbLWCKloWNrdiL75vTcJ6E0EjLY=,tag:H86RhqoruUnvjBmuvzYPKg==,type:comment]
hcloud_token: ENC[AES256_GCM,data:4rJp1/Z/4PrHRUNq5oD4EhmyZrWnzKcQJfJeg0dif59nL6kw4Q==,iv:KTbPG5ngZAneKUShbUTQ6NwHjLQO7CunkSiIZDgF79Q=,tag:rUBqJYcOvR/F3SVnPjmp2A==,type:str]
#ENC[AES256_GCM,data:yksU9TbbH85os7wjqUspVaDLCIbAj4vFhGlTzlt7niRFCRZmHfTsdQobC6o0Xw==,iv:XOrfoiBmQ1elOqTlvLh3u2FHrMq1cp5Zf67emKDQpGo=,tag:S59pVXvJW6KSJ2EqLu4IHg==,type:comment]
storage_box_host: ENC[AES256_GCM,data:D5Hzi16Z46GFNE8VHbKV8i8iEH7hIdlDQS0=,iv:jhCitS25tZMsE6UZ+tJkanXJNX6DQfOn30+7cQDNs60=,tag:EpzUyXhZCL6EEbnicY1BPg==,type:str]
storage_box_user: ENC[AES256_GCM,data:P+rWUs+QwA==,iv:aVdWOfVkf7P5y8WlUP5ga8H7woEdGaFSUUbycDOPGYI=,tag:+lvTwQN4vOKRj5lNGZTiXw==,type:str]
storage_box_password: ENC[AES256_GCM,data:corwnHJVanBt1/ELlVJwf1klVnR3WB6oUFtxoCQz+XYE,iv:egM5VqRx4N3zSrR37cCfBfml00AFRk1/UecWhaVrgS0=,tag:9Z1vXlPgyM57X9CAuRYV8w==,type:str]
#ENC[AES256_GCM,data:WQ4w3gItBICoC9tgNoecH+2nppf0aqX+6h5a,iv:pIfewJ7Ee6P6FLClOSJUFs7Jl/nXyIkHN8rGsM6InHE=,tag:zWb46M0jzB7N4Z1Of7cT3w==,type:comment]
acme_email: ENC[AES256_GCM,data:UbNndaUjrUj7+S6z3o7JlelE0EUZsP6T,iv:cMYKvkxHEIgW0G2vSmARry01K22WALRi8QVs/8BkdCA=,tag:nYgZiDfvLazBzo+2HU8XUA==,type:str]
#ENC[AES256_GCM,data:/eh4zz6uEw7qlElFH0QH6C78W+bwRwzUfrVw1w0+5poZOQl136b+6e4=,iv:t/wsXLGjDe+Lf3Cvp5R4VATw3olGLVJ1H2RUSFlOMF8=,tag:D7kzKpDHGtCY+E67LJeKkQ==,type:comment]
#ENC[AES256_GCM,data:VM0dHs+tOx/1Z6oamSlAa21A4M2He4KuNLXsPdM6/leqvus5M+k=,iv:61HeqUFJBEVw2Ge5jWps/hv4uuvPxz6iZaJrBONwySs=,tag:zi4V00IRiudBZujrs67bdQ==,type:comment]
#ENC[AES256_GCM,data:CH6F+c8mchwyNk9N9O4CB42c7nmpzMTE9we46q8lkNQk4LZsWbdrzp8+/gfrBPIwGKRaXtvJSi8=,iv:X3OrXEttqwjc5gu4JLf4S9DnK6IEt3kuFXChE1vpI1Y=,tag:V/H3O2pLnuEsUYLJOBSEJA==,type:comment]
hcloud_token: ENC[AES256_GCM,data:aqixVRwAcmqHlB0e3tbQOo2giawp++KjTW2hfK6aZ3VRtTHEcA==,iv:iHt1fY70cWTihiGfypUkhm6//+xfU+JFSkOBUGt1pAs=,tag:QpfzCsDdQR6rppemuZlUCg==,type:str]
#ENC[AES256_GCM,data:KpCylAL5gOarG+cNdmcL5cgmJI/6YT4mdIA7GlSqSJRfgNBVYe/xBgL1Hpiq+Q==,iv:+O4/ADo/OoYvMx50+g/sAqyjy+O7DmwURGMqBdDhLZM=,tag:PI42CwChPU6MVF/8/mT6Pg==,type:comment]
storage_box_host: ENC[AES256_GCM,data:rO/FEQp1Ksd824TToUh3q0WOVFY4cRk3W64=,iv:61Jor26LvSTKoXo3A9S5NTfgwuVcP8afUneKxSmyT/c=,tag:MrWsp91eygd2YvOnNNyanA==,type:str]
storage_box_user: ENC[AES256_GCM,data:KXUlMAixCQ==,iv:8o84GdNHZXKtBJwYop31YwqUL4HqhBNeKbEnhVLPl9A=,tag:hW5O9zSZ9dSLq0FORKqx3g==,type:str]
storage_box_password: ENC[AES256_GCM,data:SyzHuEXRbLru+wflZGkxauZpZtUDmo1vMuHmbJlh0yhS,iv:PgqmRC85bQqSreMaL2ibnmOL9+nkg07i0lDNJSEQoDU=,tag:+TVM11wz89TirKBesjKwfQ==,type:str]
#ENC[AES256_GCM,data:y+MWRmWUdPVOdaHk8vyZrc3HPD44NIWDZ4mr,iv:P6wh9kz8XcE2i/OVIOfvKRj49qizcQoYh0NZqpJk3bE=,tag:ZYgRx8zsILKp06ZQDn/4/A==,type:comment]
acme_email: ENC[AES256_GCM,data:cu9ReaF3xouE0eKZEx4PkiNmMfKOPyix,iv:fqgM8f3tMz7D8HAGCJ5ziwQ/Swsu3K8ZNkQ+p6Qc0Hs=,tag:pO+8wVnAMHSMMfeZ1dEKNA==,type:str]
#ENC[AES256_GCM,data:SX03vdRrckyWY15r//Y5pJZWXFGfaQSnNnJvA6k+AsutO1Vl9reVQMexQEU=,iv:p1LbT0qxIFfoiJPUerjGqlHD+fK0o0lLnFUvPhIyHdk=,tag:1zURmS+50zRThvHpOWJ0HA==,type:comment]
mailgun_api_key: ENC[AES256_GCM,data:WxrIeq1odexHduN4YTJSIX9+CaiLaGnkPNkEQpUwTou8PU7aMqJtclxliGl6YrYjncM=,iv:RzHQO1URtLPeAFRRjR3YF9+z//5WostpuwPtf7wxCZI=,tag:mi+mVIGGJqJaHu6cM3HcfA==,type:str]
sops:
age:
- recipient: age170jqy5pg6z62kevadqyxxekw8ryf3e394zaquw0nhs9ae3v9wd6qq2hxnk
enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBHQnBBTGZSVHg1YVNGb0Qw
UllrYVlON0l5U2Qvek5zTXlBekNTNnd3ZkZ3Ck1xcVF1UGhLMGVrREw0cEkwbWpB
Vjl3cW1Kby9GTWZpWUZqM3g2YjllcG8KLS0tIDY0eEpOMmtJTmxua28wQytmMkJy
c0NBVERZZmV6L2lYaHVlb3lEK3Q4ejQKz/oho9gId2Fm9eM2Vl/JRKC5VL2Wj9as
bz4wd7rRjvt1nwJsH10EqB7hf7lq9ukxdkzDySH+0haaZT64G8TcNw==
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA4cGhtWTREWTA1NWZ1SE9u
UGwvNWM3Z2pjdmsxMXRFK2UwcHQ1MkgySVE0CmJsVDBZUWhnVlJjdnhLWkwwOE83
b3dsMDhKamJNLzFaYnZ4V2ZnS0VydzgKLS0tIE10MmZuc3U5bFFmeDFGNXhwbytG
eXNRencwRmM5ZEdqbks2NTZ5UloxOTgK3NE24DZp7QaDUIUQOQjENm3zKorckrmt
JEk2oRXoH6PGJHrZMh2AkmoG3/enh24U8PNQBpmYX6U2ZA7zfnjZXg==
-----END AGE ENCRYPTED FILE-----
lastmodified: "2025-12-27T13:19:44Z"
mac: ENC[AES256_GCM,data:tWwoGOH2s2LJYCYZII7urlWCs2CZ9M0PyhONlCwcApc3ykMvD8OVQsWiGqJpDfbZHaz5Vy7XWnINuFF99u4cOJpqQPFe8q8cRluURDUJ8aMOI05/jbzFqhPyzgtJ4OvZVyrm2LxlrYMtuBfo1NSVmGeHLhus0jD3P6cCY09Yew4=,iv:7s/lzOtNTa3wj5JwIBuMkGzCFRbtzd9+y3sG0Hbd458=,tag:c7G+S/usZvu9/QOA2lOsKA==,type:str]
lastmodified: "2026-01-14T14:49:25Z"
mac: ENC[AES256_GCM,data:Fa/ssGgx28qa9rJ/6BVGisR6w9xzAD7UwqGcz2ufT9wau+1AjoolDCJnYlhuhufCLU5L9nhwjPe1UPu8Ficpvge3i+UoXbVvnSNuc1ib4Vqaz2KBuHdP+S03/dimbdqjbfudk55uaML94Z5taa9d7xtM9119oG/XZj/qlhA85kI=,iv:lsg/m/92NC/nOSAj/WS4EKlSD9yauyrzzrCpS0+oYO4=,tag:t7lYNzGXL6OUWz0ykVSLPg==,type:str]
unencrypted_suffix: _unencrypted
version: 3.11.0