Compare commits
2 commits
a4f4c814ec
...
d5e8c28a6a
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d5e8c28a6a | ||
|
|
c64f9ab0d0 |
50 changed files with 3841 additions and 1 deletions
14
.gitignore
vendored
Normal file
14
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
# Prevent committing plaintext secrets
|
||||
*-secret.yaml
|
||||
*-secret.yml
|
||||
secret-*.yaml
|
||||
secret-*.yml
|
||||
secrets/
|
||||
*-secrets.yaml
|
||||
*-secrets.yml
|
||||
|
||||
# But allow sealed secrets
|
||||
!*-sealedsecret.yaml
|
||||
!*-sealedsecret.yml
|
||||
!sealed-secret-*.yaml
|
||||
!sealed-secret-*.yml
|
||||
64
README.md
64
README.md
|
|
@ -1,3 +1,65 @@
|
|||
# stack.basicstack.de
|
||||
|
||||
CD/CI deployment manifests and configurations for basicstack.de cluster
|
||||
CD/CI deployment manifests and configurations for the basicstack.de Kubernetes cluster.
|
||||
|
||||
## Repository Structure
|
||||
|
||||
```
|
||||
stack.basicstack.de/
|
||||
├── apps/ # Application deployments
|
||||
│ ├── stalwart/ # Stalwart mail server (example)
|
||||
│ └── forgejo/ # Forgejo Git service (placeholder)
|
||||
├── infrastructure/ # Infrastructure-level configurations
|
||||
│ ├── networking/ # Network policies, ingress, DNS
|
||||
│ └── monitoring/ # Monitoring, logging, observability
|
||||
└── docs/ # Documentation and guides
|
||||
```
|
||||
|
||||
## Purpose
|
||||
|
||||
This repository serves as the central source of truth for all deployment configurations targeting the `basicstack.de` Kubernetes cluster. It follows GitOps principles where infrastructure and application state is declaratively defined and version-controlled.
|
||||
|
||||
## Directory Details
|
||||
|
||||
### `apps/`
|
||||
Contains deployment configurations for individual applications and services running on the cluster. Each application should have its own subdirectory with:
|
||||
- Kubernetes manifests (Deployments, StatefulSets, Services, etc.)
|
||||
- Helm values files
|
||||
- Configuration files
|
||||
- Application-specific documentation
|
||||
|
||||
**Example:** The `stalwart/` directory contains the complete deployment configuration for the Stalwart mail server, including multiple deployment variants, monitoring setup, and operational guides.
|
||||
|
||||
### `infrastructure/`
|
||||
Contains cluster-wide infrastructure configurations:
|
||||
- **networking/**: Ingress controllers, network policies, DNS configurations, load balancers
|
||||
- **monitoring/**: Prometheus, Grafana, logging infrastructure, observability tools
|
||||
|
||||
### `docs/`
|
||||
General documentation including:
|
||||
- Deployment procedures
|
||||
- Cluster architecture
|
||||
- Troubleshooting guides
|
||||
- Best practices
|
||||
|
||||
## Getting Started
|
||||
|
||||
1. Clone this repository
|
||||
2. Review the example Stalwart deployment in `apps/stalwart/`
|
||||
3. Follow the pattern for new application deployments
|
||||
4. Ensure all manifests are tested before committing
|
||||
|
||||
## Contributing
|
||||
|
||||
All changes should be:
|
||||
1. Committed with clear, descriptive messages
|
||||
2. Tested in a development environment when possible
|
||||
3. Documented appropriately
|
||||
4. Reviewed before deployment to production
|
||||
|
||||
## Cluster Information
|
||||
|
||||
- **Cluster**: basicstack.de
|
||||
- **Platform**: K3s on Hetzner Cloud
|
||||
- **Namespace Strategy**: One namespace per application (recommended)
|
||||
- **Ingress**: Traefik (default K3s ingress controller)
|
||||
40
apps/README.md
Normal file
40
apps/README.md
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
# Applications
|
||||
|
||||
This directory contains deployment configurations for all applications running on the basicstack.de cluster.
|
||||
|
||||
## Structure
|
||||
|
||||
Each application should have its own subdirectory containing:
|
||||
|
||||
- **Kubernetes manifests**: Deployment, StatefulSet, Service, ConfigMap, Secret definitions
|
||||
- **Helm values**: If using Helm charts, include values.yaml files
|
||||
- **Configuration files**: Application-specific configs (TOML, JSON, YAML)
|
||||
- **Documentation**: README or guide specific to the application deployment
|
||||
- **Patches**: Any kubectl patches or modifications needed
|
||||
|
||||
## Example: Stalwart
|
||||
|
||||
The `stalwart/` directory serves as a reference implementation, containing:
|
||||
- Multiple deployment variants (basic, with OIDC, etc.)
|
||||
- Helm values files
|
||||
- Monitoring dashboard configurations
|
||||
- Backup/restore procedures
|
||||
- Operational documentation
|
||||
|
||||
## Adding a New Application
|
||||
|
||||
1. Create a new directory: `apps/<application-name>/`
|
||||
2. Add your Kubernetes manifests
|
||||
3. Include a README.md explaining:
|
||||
- What the application does
|
||||
- How to deploy it
|
||||
- Configuration options
|
||||
- Troubleshooting steps
|
||||
4. Test the deployment in a dev environment
|
||||
5. Commit with a descriptive message
|
||||
|
||||
## Naming Conventions
|
||||
|
||||
- Directory names: lowercase, hyphen-separated (e.g., `my-app`)
|
||||
- Manifest files: descriptive names indicating resource type (e.g., `deployment.yaml`, `service.yaml`)
|
||||
- Use consistent naming across applications
|
||||
18
apps/backup/forgejo-backup-secret-sealed.yaml
Normal file
18
apps/backup/forgejo-backup-secret-sealed.yaml
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
---
|
||||
apiVersion: bitnami.com/v1alpha1
|
||||
kind: SealedSecret
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: forgejo-backup-secret
|
||||
namespace: backup
|
||||
spec:
|
||||
encryptedData:
|
||||
POSTGRES_DB: AgBAaN4x6Izo1/jx7eeNHiDefYNqm+Mh482poUIxw+TgBlLloMDJ7biKazDiNUR+Ym7DniMjroVRjMc3Fi4hiqhcDBt06tuiKXe3qX2lEDwkZbe4mZ1VeqMgSqKbM0wY98y9XWN+G3JDHs5GYQsfJDXwQ9+QzOtNGByQw2Pi2jlov3xAo0vqZLucXPmzhhCDzR49CnaouR200U95vhXZesHF4un3qSFzmi5Ty2JGMd8gKo57OOkWs2GysAoMwDuAv5337aBkNicZK4M0ZtlyMS1YHKnHyxCeghAZPvrWTwLgy1mjP9pcZ+cFQB5qN8wIvXDh9URa6xhUB2QQB6+/1v7kFNisLHs1lTGjYnHPvdyXvFF+IIPfS0eqdz2X2aVRJCkBbiJgwTj1fBiBxdEZ/UP7qJUlemGWMn/lWiThubx3pMuqGHEKnEaCo6sC4GKneFkj6isIrmW6oVc9Xwj9QwL0ELglntteFp6/RSKkCgfHwt2BJQVMMRO7KSD3p1aFUy9bhOcecOrlVGWrEyKPZTTfCySLNi+Eg+3Pz3A2heiYid4X4Y4fQOOWYNz2nO5w2/aVvUsLXA7LbPp/7hg9BPDKmsgr48i2nJXzK9Gjt1cQuSiLy3kwQpry3nwPYclTdwVJTjprdRf0vAODq1ohaXfKoYOu/bvfKzWImqjWo7kB33qkQhT6xVocwadDrgmQlecxcM5eIInh
|
||||
POSTGRES_PASSWORD: AgB9KzB//Le/OMAum6LXDjEw8bH4jaa149ROYUhe6aG2zxVsFJDK55xAxGCCCOt1dpxV/EtzfzQjbf/CCs37D6jnwqEjlE/yhIKTwRN43ns5MJ6UXoGZVRWbw/yWSR1Cb6Z7P1hPg/wBp9mImX2lU8fDqNLYEN5Mze56UBH12peFBGBWRdtFPUqXmVfxZ2nmgBP9sb8KcxP6iMMFcGf5eoBz0Yta2iha4DyMu2cD4lGUfc6ZN5VREAwyOcqgUfTlHmpz6BWBXIQR0hxE1wHDrjyWouxZT9uvjuKalTtE9cEwkZV8qKz8S9Ba7Ms7uMqOnJ4Cm3ODDvmEAlcgP3mYlaoCjhBA4LmVM72cv6wA6xg4qCunbJDM+5rB8RetXPDfhV4LcYZe6QDGj1As7ztoOdNhdvZQwICoH4660xnxLUYPRN1UGKyoMNHrxZuzMWxDgULRyrl7TDy+bKJHv74L9VOSjJnKw8ov7cuomrqnUdrq6eawQquxnJgY0jv4lDs1Xn/5Gq+72TBSHOS5k6E6p7aIfG0QeilOVQK+OetGOyCCEaTH7Zo7URpjHnY+571RSdV86hX+qXPZBwjtHnwjgi5HiGn41k7/R3OrtdTj8lnftn246YGaYlIZ1gPY7jUQKYzMxhthXSow6uBA8IBSBmBL3tS8D9qLfr9yXoJ5CwIlDx2P5XyzwQU0NaPWb0Um+XnxteJRSH4bOSM+O84T9n3oXNqAPWpUlJMkIW5+zaCxHxOiWw3ZJWX1UZRrzw==
|
||||
POSTGRES_USER: AgBtQxQlKNvZbArIy4GTQd/J88Z6ShZoamMMw7sDSXsm0UwnToY8WKJflG+ydG3zzNCIfT1S2bcb0XVZbiDEgWySwct/CS6KtafLJqElJ9e65i4EOsdklBiUssjsceWC8yRoUIqrblwP6vqwrwhkdI46QaIcHJkdNmq/giT3yQqx35Mv/slJvoLwom76bZgs51jm22VjEAzcPA0d9rbe9flKXVGf6OmQpViMiV8OSDUgQ2Yjx6rQ5zFvCUdvoX6UIFxt9xmA75YiFgltxElOAWLRMa/CvdA6ZIY9jy1oD/gDIPjCL9pm4u5wM24mkQWMCfZiHAsDfkrxkMOsDlI8fRvFO4tMZgDnFNhi1EFOR1ga1WiK4NRKprKQ5WN0NjSuh59DxGSuKrg0WQjg88oXUdfYg7d9oqZiL7WUWVMWwtyLyW1wKuVR8qIoPxYcY88BaEOtw7tQ8odNszWBigsXCeHP9zVpVQjdPhDyGiN38MqftqQS1ywj/oLHWBC2UbH09I1VuAokiUl92CBAt7EiuvyVyYBv0yZlFT6ReatPeUfCWfAWmXkTg6iOiW+Y4+9HPuhBVjhyUw20WifEajNAbva8azSyc4S1LIIOpIlvoQp9joG7a65yRFjt1KzFoh4KDg+WJC1MNtBgqvMBS/4jOiBcrYh2lKIgGO/kBznPqVlZCDn8tdJyxGth56Td/QGfLdCPOxea1g8q
|
||||
template:
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: forgejo-backup-secret
|
||||
namespace: backup
|
||||
type: Opaque
|
||||
16
apps/bookstack/bookstack-oidc-sealed.yaml
Normal file
16
apps/bookstack/bookstack-oidc-sealed.yaml
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
---
|
||||
apiVersion: bitnami.com/v1alpha1
|
||||
kind: SealedSecret
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: bookstack-oidc
|
||||
namespace: bookstack
|
||||
spec:
|
||||
encryptedData:
|
||||
client-secret: AgAQm6fw4zFz45kuxPNY8GKcYBqjUomG0SJeZ0B3DEvNCwrzpMASv0G4KwgffTUNYIY7u0NAThb5rPSAoH3nyuQ2GLWk4f6Lal0w45VHbuBawkgHE0MfahJDjLOG9awIoChBa37NrxuHBDToMVfzI3yg1ZM5M/kMwIdUpon2aNjW4vJ7020/RPIbiv2QezmSQXK4SMeUjICRn7J25vqmObCRFd7HBPL5g7kqsCJMVNH6KdRK3ZZ/oXPR54ILjpezoNFL0eyes45vKYe3iiwBIB7dWp5lky0Wp5gsyA1kqfnMJAFTmOByvFoN6mq3FDrdzwmxipfjtHQqN/wbXrOwKxBYaTT4jquDqsnxlCigiO0frKlZPzw0EUXrcrsUWYGlQPIt5+/KIIcGxrm6rikmH7MjPg+Rvr1Ieg+IzEeZBiGKYpVhXGJ9bsv1RvnKhwXc+MDGEXyfoMQhO+H7wuniQ/cWfLofaZtltsJ58m4cd3JFO29hLp3OX3F7O8ka7GyfRO1Wwtgz+asj4fHVqdKQt++8KEP+d/E6ZodWX7qW5Vki/CsbAhmXwAgPtcCoP3q1jJtoNcQW0n1xLwbaBaVe2QUOV2CC+51wNXiQxr3hxPlHIJrPVUo4DbFqZXb9SO4sJYppA3su24gn5G5Gaz4Omww8+SVrTskQ4FqQyBUz0wo5At8tS++XB80EBD4h7TUjNwgGi17fsoAGwNy1XA/dJC18Jxi/AyAfuFndBcUOrUI16g==
|
||||
template:
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: bookstack-oidc
|
||||
namespace: bookstack
|
||||
type: Opaque
|
||||
19
apps/bookstack/mysql-sealed.yaml
Normal file
19
apps/bookstack/mysql-sealed.yaml
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
---
|
||||
apiVersion: bitnami.com/v1alpha1
|
||||
kind: SealedSecret
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: mysql
|
||||
namespace: bookstack
|
||||
spec:
|
||||
encryptedData:
|
||||
mysql-database: AgBPBcdy5I/zPy99m7MKtxckhzlLH4hdV4XpO0aE8iX/3r/9+jnq17j8qEG/GtpQGDSzTxUL81mhiioPdWRfbDXM9ormXm4P+btG3FtKPhWKsdv6gjfulos47T7cW/Irtp9cOWEQpXpW8E2pMlSqVSbYCABojRhphqD1y1vT2YQ6cqD6hhcM9rHyXnbksY88A0BaEhyOrJ9QGSGxPton4HBE2SIpi3HEqZFxzJxr5IjkNMDYxGO4suQZWojvO08YK+vkzBS/jf5AiKbGyBqlrq8xJO2AcVXyzlFBd4db0IkV90kW12FA4ctm18CHOElDjTGes4nePx3asyXDRUYu4T6uhmbhp0OfRvDuHoXP9vjNIq8mZMhWtdTfux2UqdDvFcOcVGu+cWZy78cz2Va7yTHQmz9yGsM8GGGL9yjs0VeyeXQ5UMohXwMEnLBCTsFOtV4cTs412nOpL8rqdWzAIqNEJKCl4zNNmouyraVGyLhVdIna+eu6nf/ZL5aDg810MXDToa7nHKRp7qLzAzmsUKQiYLbUSVBHes0nhcrtfm7tuUlT7rnpViQeq4PdKVlWZCThjeOWcAhhJJxq2CULa9zXs/kz1doevwPUEYjfxo8hyYt56OuhVXc/YT9wyYY+8UM51HjigsTqpnXElNJSR3DOIvwuo4hjd8kK7Fu92rHLg+OwRujQ3v0iPbdc96jq9V96KFmwK+QBW2E=
|
||||
mysql-password: AgAFP/wX4zReXHePck7aWqdO7ccB8gwXtpjhvwEPhW8fgn1TU+mqhML3iTjeleI/eTMJMu3+msI5jgrqDJBftveUGBIyA6xHM08sqnRJLICnnjUwa1Bh8bHAGZARY1Rn0EY5YwAznIVXNEP2FtubSapvR7dhGq353WpGiw/r98EQmAkFWiXG4ZEbKl53VYPRTeSE0VaQxiYrUgLANOZcJLGpcuq67RlAxHKtDHm9vUOjkEM5GYrnEruwt/Ry2ksRA0Uk0AkW/8obuLUHQcGQ5bTt6U+V1KHh2uayVEZovzP1+A6HIoJ/SIdmdIf+Qt0zwG9v31e2okTB7JPkOgGlvTyp7O05u0ifB9mXXBLn5Fjc4IA6vkXZlrz4+sjkSRuv5/qk1GV4eubmWOJ7Dlbnm0XuhuMXBLj4+J0cZhKahSePQ1hhTo4YmcZ05CIGkrnY6Kvfuzm1c9jdQQzR43I6xSIK78LYYCumAGdN7ebS8kIAoqPp6d0VTZeDrGxmYxADsnZvOXYuL2w8CvdkOQNs5EPk60cokyI0DsNMaTN5Ec2iQwJWoWTL1lsR5r5kf3m/0csHzLSAfASPmzfxnb0OQ62LixUV2+f8++Ujozo977GCWgzQwHKRDJvpHFsq8qNmK2p2rMvcoSK7TGTZTxxD/wepc26dW2J/aZgLgjUDeOxzSFj5CY8LHeGY4GU8XNOUXDFILmsscbEQgwdPHic+33DhzFhLQ1CyRCMoqIaD/4Kp5FAr2+mExcp891Fw7Q==
|
||||
mysql-root-password: AgAYI0DyEyRITu9xKfCvWn4gjq04Y9U9hsEDHvqRE373XYh4413b849js4tH9Xcr1gBJbhaah1+InFk+oAL9Gpk9Or7S4bvlPtkXkfowqeVBoj53M+dRR/WOsH+NFK//V6yjAc+3F/TbcPiz5bzp9vXKev+TpV9PNtcEnTYOn3kNWBmE17AHH/kySBnY3e+rhY2ai8YgjICvdMWgk99TrRu0c3G80owbytUyQIdHy8OWOxMkQgiFZJifI9RhGyczfCIfKEk8c1usWif5UdtiZp3uyvvOrMk5LmmxMQ+iRnllhrK2xSLyB9iukj/vfDIrgzxDmJtt6YKfWNh5vXazE+jq8NwITEGfxB4oSRb/9LKDmLDgT24pFaqhBLNaunUFr66ar51+FMP13ZrI+EjcHdF9woE+MozrYoF1Y4h6b5tQ/8GR459Cm60TRUZ77ty3CW+xpxLHEUF7UM3xXnKC+Nh2fF0ZnkuYXuJ28mPjY+Ee2rnkhCwTHlPZzv+LK+BD9xj6KV6nXtc0yu+DQCZ2PeMj7P9hU/QkBExZHmOgYWUbCDWYNgXhUFEOzGdU/gKr+LFRPU3ej3pnU/EdSGsTkl3bz1GK3Xm0BMZEdcqgXbYX9Ok6XIehbkBl3CYMmX65IABspJoXnmQke5umTo1lnafLjQZkzs1I9vvbovKIbUklX3T70vX4nKPZi+CC+GWnW6XDlJ/HCZhUNj/rdyXS+AydsTm1l4HdOa9A80ufq+pmyK3vs28N5QoGScKtqQ==
|
||||
mysql-user: AgBOFwgy3eU70+jv7KsEHDDdNZ4Ckar/3dHpqM5pefpRhsK4s6V6Vo1wfsKIyjI5zV41v5lJTwoVNIhqwSK8nFtKox411sG/hHli6DQzC6mYYEaaoZcXS2U7MCAPQ/M9aT3VgoBTzLNTSak9NutbW6/utpuu/EeWMxFl3DC8IZ/IG8w3874ESLOAfRF03X5q7MvvfP7nMwqZyoSCL8aA63a8LIONAyNKuNvSy2dAYLAft7SznW0Ro7sqk2PGux3E+x0ujhIIm0fQSuxrxM6Q0wTR/jQYZbz836XPRBcpgKS/3C8QDdZHJsGcZgh2J2SfsIA2naRH5RRCGImQC8wgF67bodMVxHoJnTA1V0zBUt/NJrecEMEc7Z735mEfzaMHCQrnLO8gtTbyAh0LTPP17WMByxpPaj7LQojDNKrsP7H8LYlo1oq1+4Z3e2L1B+CPItHp8M+dZb2TJcem3jxiDhvwiq87DG4My+WSM+U1wnhMl0qJlnxHg7+xr2I1jE4YNtHvlIAqovu/jhpZ+xXaWiYBup9NMhRXW+651OQhUSTz4EyKGqtRPrOd+wxzM2fBirOytwI3VQsnl9leUMdegq5+ykyvE0jHCPpoEDfTeNQsXJwlRq1bjl6BA8aPP2TmRrABmssGkpBE1JsZWlYe8FCkRuhFjMaTxGGupjw4UJM9FxciKYkM9Rv7bhzR4/UrGB4oLp51NFzCI3c=
|
||||
template:
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: mysql
|
||||
namespace: bookstack
|
||||
type: Opaque
|
||||
17
apps/directus/directus-admin-credentials-sealed.yaml
Normal file
17
apps/directus/directus-admin-credentials-sealed.yaml
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
---
|
||||
apiVersion: bitnami.com/v1alpha1
|
||||
kind: SealedSecret
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: directus-admin-credentials
|
||||
namespace: directus
|
||||
spec:
|
||||
encryptedData:
|
||||
admin-email: AgA4CbWzOUz0lGaRBRsJ9+jg3RZS3mMpZNNjwxlFfZCmCinr+5S+v+fWo3cCusLc1CYw56AywZEmGrhHcDa1+TdcgwuF8uOZYmOKaZpuwlmdRHjns38ST7RjJ7BbgYKjf10NUHVHFEn+lVkA/b3gvKzH5QikdEV3+LUq8WlVB3hEGKOSh+pZdt9B2WdEiVU8K48eUaDKDtMbK4KeXml3ci4KgCFprx7RFWzfLeosgxLAA6N84YqNLQQRLGlCbp2wbZQslvCYY4NZUiIQAlRvZoOHVpcCujJK6YdBSU2txbY5jyx09ypyNgcXAO+/wsdGlpPyDwpnDzvvleO1N2HpGKl+Ye81xvMpbvk8lio2+LrYU4wTtnLWpOGwYOjOMgXlRVxjxEym/jUdDP3BBGkUs18iGRw+HnMba/VbkbVFtwqYd+UFzwDcCwVO4h9N7jP5/z+DzZ2FjQqBIV8gv1RkKD1zD1yg/dB+X36A7swo87BdWmBQSfZ0rQpvMwkepm9oUZGLVRM04T6yTSnfkbZlg64hSIMwukXIc1monyEFNiWj1y6Z6BxiMJpQbjCBXrsmtjvo4V9UJZ6M7QGc0JsWLX4w3JKCObWQr3v89ee8Lydlea2QBw0n5k5YbW/fRzLaSmEu33pCu0szFZdIRo7ka8U86wdNVkzKYMGi+StykcfMND/v0UU110BMxfZyFTYafnmW9DhHvGOeA7me/pZ3/bw0OoRz
|
||||
admin-password: AgAI5BWSOz3WWcm3HofavBos+BKZPQxMbKW/RCETxdvtKXMdsMomB8VW8LXfOKg38j0pizsCY15vFpGPuc6O9DSS9Qw+oonDAfJQVo6NpgilZq5xVDio0/Tt91yLihQWQLy/a2gCMbHCaJOn0C50cPAbmrm2dUy8ezZ2Jw8skpPxXYVZ5UchSX6xsjrG6Vk/Cb7015nAerg9TXwvBZlSRQjCd7hU1CLitmCRkHF6BBvM2C9B2hw1EyX59QdCMCE1r2I/BDgml2CwTFzLtWGNPlNM+/cpPV2OCTtJ7aKOoAg62LD7lnnPKatAUcZ0PLhGgNvTA0BYW1V3r/+RBccJWCAMJrLFSaEsPSkOfVAaYTI5pnfN2oFF9P+MCh1rtGZJBEuPW0yZQB2srdQ5omRu2TrcR6y6dOVHQqDrU1APhKV1XI5A/SpJa1t70hyPqAmTFXQBJ3DgxMM22dxtB6DryLtx90qRq/+GvBGdhVrQCokViJ7ZsQkAs7T6zcW4ruOhFqlX3oYDURvh2UusD+LUslY8mCWky+eqaJSALPe5Bfrm3zo0nSCsrAotK9GA9jCQ5QIXnIT0aD3b86ipcqWHAOvQ4GFsZUUGQM8M8aweBYXmGIg1Sk9JWiktv9mr/LgWQBnwbgJUqH83E1qmcFxRveMCf54Mqi3hIG9KxyvayLNmUPoHdh+OxoCzqBTNpYd0hI5QPrSl66fVTpYM6Y71NDpun2fK0Jzt14g=
|
||||
template:
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: directus-admin-credentials
|
||||
namespace: directus
|
||||
type: Opaque
|
||||
16
apps/directus/directus-agent-token-sealed.yaml
Normal file
16
apps/directus/directus-agent-token-sealed.yaml
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
---
|
||||
apiVersion: bitnami.com/v1alpha1
|
||||
kind: SealedSecret
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: directus-agent-token
|
||||
namespace: directus
|
||||
spec:
|
||||
encryptedData:
|
||||
token: AgCn/l/zGHbc3Lu1GGWHHCapiRjkt1kYiwScEA/3GZL67AVjsEbFUXQucP65wfeYCli1KtHxBPGpH6M5zGZlA/HlRTWucEVdNIxWR62Q54916pKSaa5E53NcFrkWK/U8ANaLGmBy4lI7NHH8MKo5RWmX8lWKuRzKxhNsG5EvDUBTAt1OlBSAu9ico6Mr8JyCdBbr19pycfLeXrEHe2m6FSzCpiIuldtqqXZhegbwRQC5ma0anu+SQtRlXN9UKpvoH1jOdkWRmIcUOfGLgfxkV3DCeWqNYPur04nD7na+Bod8eZF1fLMJs1r2I4yc0G8/E7VTz1LUJqInn+ToF4yrm7ESL7FYu+N1VUdF2CNjd8vtfux3LRJxa7O7souUeA0zCY+D6CsqVr1YBF9h+CS4e5ecWoK/8hDxQZeBrC/4rUXy1dY2KZabo7UfL5LI9OA+o8Fw2S8MY/TF4RZ4L0vUbeaELTAPPj5LxwNm0k6IyLno7VAwkNCIZq2FT4dP/jZ7x9ExewqsQ/zf/u+hp1tE4YxUCRzEn6CzhVk0TkQOIULEdioKgF0ExICHunqigUIk/t+D2xLZATCDNdfnWsF5VCOQu71uXvMhCIR5hLfRe1XiXSdgjQ5KvqBp5hUXoBTs5R0LHauzNQHe2f9du+h7srAPsBRxV+kKkKRIoTAXrrb3uC1NWkaCYwGPl/c5x9rg7PwXMyUDb/G+a9OQQ8yZWnt3VP1ztRtRlolR2g79AsCBzCkFv1tbxjSEpPH0/g==
|
||||
template:
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: directus-agent-token
|
||||
namespace: directus
|
||||
type: Opaque
|
||||
17
apps/directus/directus-app-secrets-sealed.yaml
Normal file
17
apps/directus/directus-app-secrets-sealed.yaml
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
---
|
||||
apiVersion: bitnami.com/v1alpha1
|
||||
kind: SealedSecret
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: directus-app-secrets
|
||||
namespace: directus
|
||||
spec:
|
||||
encryptedData:
|
||||
key: AgCakMsBdtU8L5mZe7WZ59x5Uj5/scaj/1RyV6uD5XDga18CQDvHS0Trf44Kb6K11eNvaDe6D1oo2a6FjkmInYx/1LxNUjir5c39x0AsUyy/zo64gI9t09WB5xTvi1+pjPneaqlXChLWhaQuUvoHPaUiVlmyxu0mgnz36/32GDXufuxNL85diJTxF5iz7iqQoRQ7u4Da0AGq8Jpx7pkvch4WfMoYGz3XDr+rf5l0TseB2nJ2EnakC8dsrdH7bpBgtoTmin8oviM1z1XGupuehJEU8iPEDF632yPJ92kNlJnZECXcWVp9G7/k9VHwkbgeJXulFK0d4FYG+aVzT9X8+uPRqhxnR+mqqRTyuQPxtdpz2J5o+KXl3XdunfTDLb/bIt9v1g3H1GCKB+31ACADo/W75BGI1aQLrjSV5iz/PFNH16/SGvbBdk8KOMzH06lRAU9xknG9leKdOpefg8xhECeI3jCfrHMzKHyr8NlEyAr6lkp0J09LIgt7bXcYa360AACEb5hnB9Uw/H3EHQoz5hfC7DUPDBY26MScWvv/D3p/DSKskTQuYN8xzaOTwmYeurVEqta4H0TYcJwqUS5ZtjM1TOpzTDrI0NXcQDMU3oiRni9hCijnfpO033WZrEU0Z731eWYYu6aEljKumjG7IGo9zRDBMonTELqB1TiWdD/U0QzGPi6/ewjehM5vcNRkJ9/zbn0Pxy5jXbstyVUqLz+w1pdeigfrr2moxrHA6mq49k+tl+rA7nesr69TgsCOvyoPaVq4pG355w4IzcQgV62y
|
||||
secret: AgAFeUYRo9HQMB4fpQ7sYu81PydoI0tGFbFtJupdb11qBIvrEz2zV8vnNnKc/1v5PJmLUyeQb+ZbNprBu+6PtTPoLyUAufcaV3TTXXwBfn/HFwbuIDp/Zl8LMgvAojuqAh6LV9GYJZCZDhoI4Z5PCtIiOfGQ9tVmbPSscQSH7qlv62I4pTc+ShVrG3Vua16ThSOHN9qmqG4eHIW/wJbRV0318B9LYmiiGtO2XjGkOqpGrHDCEhp5y/9nrqARgeap6y7Ec9libcXqZw4bDjfkIEDR7uH1N1XqtcwM8/AAfp/t2KsFN32TNJvd2TU7OjChkGKInk9PP9p88RrKVd9EstOyfI9b7oJFlmCJCHFiJMj/9Me9QTWPxxkU1akOKesOAm+UqbeTFQme+ftsxNlRXdedzSqBGFeVL81IkPCEFBVdY9iWq9ll+vpeL1XMd1vxwcRt2jw6up2EnAr1AdaJnQqzALWUGnNw/6R3WNZA+uP3rtN+nFs4cvrj1IUNWNWaEksBfJI4KQHaaq2PvWA9LWg+lPleLKJIcY07gjQEyyJytds0hCbSFpFzKvwVzZQIrMmXXFePgquOevDaHQzL7lTjOjrzzRrlaOc69UtcxdS3NcL5aE6whPRwCPCGIMMsL49sjz6/19ez88rtyRFaCHOayK+LhJsvGYg+2EWkxv3cLjSBNppmGJeH+/EDbJ6U5G786lmCSwntClh/qdk3JueoYrtIpN6g0Y76sMhhScHmjJUO3r4bh6whWH74XqKGtWa7b4EfX7zQlmN9MHoj9G9l
|
||||
template:
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: directus-app-secrets
|
||||
namespace: directus
|
||||
type: Opaque
|
||||
17
apps/directus/directus-db-credentials-sealed.yaml
Normal file
17
apps/directus/directus-db-credentials-sealed.yaml
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
---
|
||||
apiVersion: bitnami.com/v1alpha1
|
||||
kind: SealedSecret
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: directus-db-credentials
|
||||
namespace: directus
|
||||
spec:
|
||||
encryptedData:
|
||||
directus-password: AgCQIu94TKMO4Kqao/bJQfKTw2sGXW8tx3rOV+1J/iCKCPgWYRizylP1PpGgqvcXx/gNdGItlMQtymfJ9JY7jKpv2S7l0RvO6kmSovQeNFLC5QmW6S8ltEmpklz1fzV4pnuQQXUjDxaiw7m9JiIkrpmZGf8HDJpx1v01k+e3oPtICCF/9vFxNVquymAeQFME1GLt45LhBoubNlcgvjPni7LHv+lODzD4l61VD30bMxlgH/MYj0i3u9uhlGKI+Fvl5LJuNdd68QOmSQ5s3eu51O2eLUWjKTh+4M+qHkGLXA1cfOeqn1nNxlK2fSe9+VtHv8cvt5QRYoqap3sasUYWewQk7iOBtrPPrhdoU0tFvLxCyPK8cPL8mqH24TAds7sFaALs4niFX6IsLHNTXSdP2F2RnwodpOW0SGdAoTSYc8s7X576OdExtJNtmkffr4KKVRVBahJj1yWGxzEYZ+mHepP5ezDP3sZUN1QXKgsVfubxVapOdGuprdlu20vuk3meHkum9ctvsUUIJ+RKfM/tAVP1pQa0MwyKQNMissdA9Z5m3ibFm0Szuhg7R44NGMuMibMaMJTqBUrkzpjd61pmHjuSNB8lxChhqo/phT2GGDuwGdqZm68bfNuCDzFfUsWe0zaeeaREoGkVe+n9enCdUYmf2I25pOqcyd2/c9zCKOqm77KxiMUzdlWclrZBPglt8M1Za2gigMutIDSfkKZ5u1cRbViruhnx7Kvqe23EgRwfNgoXqhKWCW41AKcteA==
|
||||
postgres-password: AgCMcWSshYc5RMxBG0f0Idycuy8EfPTYtZ6R/7N6F40xrzFiKLcz1rW9kcIPCpRd9m/ev3/3MRm0EYnw/a/7dcL1YZ28t9SuU/p3UA9wQxapiNeVrhH2pM9CJtrEjxq8xdCDapXAhmlB7PWfdpm40nCi7BzP0DZodx36NzOfy9JtA+EXBSGKzWqhAfiCRfUSvNRbv3oiYuJCjHcM7WtAUVHav5JhZ0HMc5jDCiGWFobsdm10dfcZtGcFjI6pUE7mOvs4JM+MfUekYAgUyulSlVaVt445JvXCVzh1CiY6Yc7RYtupmFJcnUjEbaolMwa0dJU81KUX5MDMXx2a0tmZNr7kFAgoPMCXPwILUIhKPYLCFVTBgIDXW2WF6IzvIF9Jm0L7PaXXmLcJprgkkWuD23vLADVJu68EqX7W/Y3ZDGW3sV9g9wl0kFoR+XjtrpKvg5Jpof0d5T+RQ7ELRNuXU9XWMzXr6dY20BQ3WVIje6u8qaEdfxR3jZpX+ui/biOQW0C+OjDIdWAGE3wtBOxv1hk30SJp03x25sNP8kgzF6Tlc8NYraOHIwcBepu3xDwMM/evSE32NSecpAXcLb6fjqob+kj8QR6UklxSSjVPZj1+J1ApKlngQ7qUOXqOaFyfv5zNz5flSc1Dodbks948DGG+E2wKTQOgGZAEz+tN3YODJ2HC1KfRzgOOUSLgn04whv+zxUobmUR7caOlk0hIyos6hjj0T4jfI2ADIGBMe/awLwgSbJCjT2YwovSf0w==
|
||||
template:
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: directus-db-credentials
|
||||
namespace: directus
|
||||
type: Opaque
|
||||
18
apps/directus/directus-oidc-secret-sealed.yaml
Normal file
18
apps/directus/directus-oidc-secret-sealed.yaml
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
---
|
||||
apiVersion: bitnami.com/v1alpha1
|
||||
kind: SealedSecret
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: directus-oidc-secret
|
||||
namespace: directus
|
||||
spec:
|
||||
encryptedData:
|
||||
client-id: AgAJkuSsqz1WWrfoIgyHjAVYN2vIarYsFmImg/c4ryRgkteB6Og/BgiXRJpfswZAFx2XecnSoSCWywutLcKRCr40KQOFdUTQlAb13pBGWfbmteWL+Jxt1KK9UlxTazkr2ErRgdDN+8VXA98b1OU7HdDt8WPxdZeCNUcGY/i/t5ivG7IrrJ3rTMqhJsPS8bBfqkYwb8f2vxdzuNdVya6s2oCDNLGhQhjfL0Hi8goNARpRRsNeWt1/yx4nt+PVgG8ircJNrCDPcwg+68WblX3H9IvOF/0TM3mezrS1FP1GTjB+aMaaGCKtOlavlv6D5dqp2+nMZ5/33o8GdV+oQ8RcLE6QXo05hnekJO1d0BjbHjAL+iNFAeiY/i/51BO6F3947EgYHl1klPAs1SCr1ivWUxB8Yv4rfAjvBvxx4tCJMn9RZ7KygOUmTxqS4VwSMqj7iiV4oH5huXJYovT9EZ/d9VUsMJTdBsgmvCgpgZRwmP2BbA02+VFo+uG/NQvKUSOG0GI8PRyYILv+YeKo0SXU2vhvsvP9HdyBy3XR+xJ1tJf6dyNFBdsSX2J81j5nZnCws6XvyOgX5Q1lU9AzP4zFtjMXSenxFoYoiAa0yzpWGhBnhOOWlALhZ9w08d2Z1/XzJXL4aTxylygpzsGcnsmmEbG4e/PQkmXiIcvPwJfLz832Rhkcg6D0luqDLJnQCZcUe6qUfaMi0/QI6gN2hjGgm5xJg2XcmSKeATnP22HEfQbz4sMWQMY=
|
||||
client-secret: AgBcU1Z0qqz6r6Kh971YCekz9yCBwOacLL7GU9TmhXBjyadRHwcluEaAt7WBLgVn7VAt6mOO1Na9QyRrsvxIHTwl4Er+LxT1Nj5d92nShR9bSbtjbuuZKu1vKTnZomqiw0vMmvjD2jKABpaksOFLnNoCamu30Ipb9SiceotPPjP/HgGsQH+fbJTsS39gV7leNXSQ12gC6OFtn+R0gl6Eftgf8RnHsnpK97+sItS9qS+8INxgn3SyhSfBMi4IiGBpA6H87WkcLF4yS0sgiEzG+GE1hrjiNyLjf73u+FQIXAyzNyK+bddaTYnN3Y3OlbdaNdiv4nWX1iKLzJv3wBs7TCMXfs/SFH1pxbvzsW08BheL2xPJ5VdwooWQp3/y5iP6+8unPLMsKxoNsiMcr9Gazeb4aKgUh1Lm29rshfeFWGP3Ra6d12JOinuNS3/UtIclBlXRfWYP2MWn9usdEfEC1ZUybJcNwawxVstPavEBJPWUxXpGe+We5PHsaNnFHKz932XWaKDMtkwe2ub262np7QmP4wut6xS6gHFErq5+P89uL3qqAfQX2IAQDCPWYdXrVl/d8f+eiS5c/ZD2dEppcTVYdi6TH42sF/VFFCgR9lfS55pGZyI9TjPuS9PMJYtjh2xdJoVVYrfN5OKNHt3k+ujuIzMxACU/aNZkMzRfQNeGVxWZjGaSYaaB11/jZ0zAjp97nL27R36PY+lCTq9YCgifocRZNuT3CLls80hkPMFqbQ==
|
||||
issuer-url: AgAaFWwB2wFkfSccwv7WTozSCpCYxsqKbXN9jhME8fSZS4tU06Mnp6P8rONwhHuV62GEbn1fHNj+vTMJRB+JvVzmX6nwJAgjOqtqCmfIl4ggnU0TmhwmmesIeNBzj78EDm3xUq5FSf8Jnow8qQuSy60smvHW0oDkEutJ81suSiLh0H1O20+53EBK8YgMyEz2tKsz5SkB+/QuLt2OEgeGxsl3iVb8bxxzrl5HPMhGbJa/x7Cbw1uvHiIox/XsfcM29uIY5lyEJ38DxqVlTFvIFUPc3HzI/zVIkVYuk7IYDUwi/maL04qaltolVlXqLfjmMK3XSdJ9s4V6+q/22E25W3zayci3zvTVt5a9Hkr2ZC9eVQaWUIU4lwIVWntNoO3hW2w/aG2iU3TCp5aiIRHHlVbNVZKqGMqWtXklDMCtunoy0C6xoDPYVTN0LMx6JjWGBnrwvpAlVYJa2uARmoCygrr0HMS5AaNPQF5CzG6cuKjQMWIQNCYhTQz1wCngS3WvYrCMPLM6jpsksHBZB0K7RJ8zZK63kgjT/oYph6DX9UIzUxLlKdfDd94Viz0uKYwH3Olx5kz9j2kGmV/enzkUcCbRGmewMVtulNCIQ/yLliFwN1V9FyXh+JwS2BbBfLdKybgKqx6zLnCC3ndh9NA3LIs6/vYJLU8Jvw/762N717BxcQ2WHvOOneK6LfvHWP/xPaM9mlQSF2/zNha43uJrFA/GMJRSumFQ6oUblQ==
|
||||
template:
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: directus-oidc-secret
|
||||
namespace: directus
|
||||
type: Opaque
|
||||
18
apps/forgejo/forgejo-postgres-secret-sealed.yaml
Normal file
18
apps/forgejo/forgejo-postgres-secret-sealed.yaml
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
---
|
||||
apiVersion: bitnami.com/v1alpha1
|
||||
kind: SealedSecret
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: forgejo-postgres-secret
|
||||
namespace: forgejo
|
||||
spec:
|
||||
encryptedData:
|
||||
POSTGRES_DB: AgA/t0N5BwFDA3GBsp9Ph+H8YSWLAEStB5b/vR9MjFOFyizrRNUl2+R8olhUxXkechVT8nasVrBUSVKECEzSRRZT/EY0BuWZn3+0Nnl+hpH++mXPDZOU1MPXpS6tQrikidr6/ZEYA6bpCMxMm2A2oO6mcO+U1VC46uee/IRvBTSXbMu7/vApWEmifGhgDOt0VUZXqsiy83TApS4Y+B7X5j03XzFwKWWRjV/n4Q8NUR1GnrvEAz1Jc3mRnimYd3FYV05Pd6a1Z4D8f15+y5u+9Tz53f1Xql86n3hdMgp88P4+lQInJ0svfCjmMNGRyyDi6RQFJlEsgViICvMsbFYYoFOmu0goNx6mHnMdhy8VPc4LnL7cPY5Cj6HHUMq42LpMJI+jiTHAETEDh4B9KMc9Gt+SPJ52mHhMSpDOS4fSk88HbVn8ngqtAzAEwNfI1Luy+JdKB3s1n70fTJpFXNorQ6EfwzEVkeP+hyZOu5j5Xb6a9RGX4YdINBs896jV95yK8DxBZHl03l1b789IWIvpduZ2/40xNpmi75fTj819E+RbvmIh8oVsOqH/X83AxNg4jaXcHyebJTnmpUubQhNJJDIEPakazCCpdLaawUXTHUzZo/0fjMjcijKNjHZnIoKLszxCAtyS9WrO0s7qdAN3jGHBTtFtVPMDw/OAihztLbOa4lufnmVO/95pZbFADZfOkbXOB7yjgGfT
|
||||
POSTGRES_PASSWORD: AgAuKTm3lK1/H5acJr9euOsHtcxL0yspaNU8tfBsTU4rlOlaZa8L5ICuzY1JRKcA/JOcj8b/2EuAj/hejkMZmFpU33p+ihm2NbOOij5KT1WSf6vAg/dmjTeCkCX3BNBzevJRenNAST3CgkzmB1/Z1ZDO2Ryhy98Ar6Q8fOXWA2Y5EES1LubZVel4gk28lUqeh+KuHbc2a6X2XBKZh6QUs/V1Pvp0UJkWpx5NIsds32+d+yaBT7+zY5ESS0guXg87PUhoQRRYpsTiMN2hB4WQUyXBb9C9oR8Hnd6Iz/B40lzo+cVB3Y/YSyXqrH9K4mLdhBk2LPVIx4EzJidsidz3XQe6La0FwuelzVI3VV5iuo2ANXxnHvh3pEe++Fs57Q816s6mBEPcdyQNqVUj/slXax7gzbmVTvRM97O/hO+JvVt8yd2+/YrHJdTcTr3qWlMMky6Rrmto+rehlJ736Dwv22y+mOb8KAWuH59A873UPmvNV8KnkpU2m71grhT6jtd6fvJ8HsmilP6l5MR477MhAyZk/5P4XQ0ubRPpy6/Z81VbdmFD4KO2NC47my8R6HcCwR9bUnO4ubrz/SRcIbRqXzoZZFgLM/grb5SxGStCygnA1cYomX2J3L1zl1BjwZjnbu23iRZUzdgP2xb9O2SChfwKawlCam53tJ3vGMNFNnazuFWxoW6ggsDK31M9BwRNirtHpAG8+OWGpIHFnAQGzdTw7Qjl3Jy+qFoqyMRPG53vw4vehvydYoyF/BGbzQ==
|
||||
POSTGRES_USER: AgAJJt0xhglhU+IQQiVNv7KG1iTqcScGZ8eAABBGJdZT+0s1jSOWv6nSMRAEcma+woN1kuBFmOe2XmoGehaZtJ++pUGm+C0yTCPu1Zu2iHKx/7GsUNRIEJlG8FeSxz/E95WM83Siz6mks/cG5UqgeL/wiTXOH+TtyYtJp97g9rFPMXCo3stNiI726nms8pzDKmbru5ubvmOKZ/6IyKwK2OQMwv7CfifOETKwozf6JUUbHigre28fDOrSmQ9Izmwl65IcNwZM14gCm/t+UVNw63kS/qi9onZ6WXkvdV51+Q7Fstr0PQKTzWgBoZ8N2goBCTXHg0RFFWjd+64cv3uoRWMcXw64Qt1cWxI4MlpMOTX1fQcDCcu9ZSoUXwQFXeeaGJ/z2Rhu3LJj4LPy9Vc7VyxHsHXrvCsOQrbMsJgGARsMtsW5lZaHIt/628sAJQSf55YY4n2xHMT1RBtb4LR92QYar2a6esUcgSmvL4Xp/bshy8izC+p96R8bYcHkxul0kdmabRgWBOl9EY9qp2Ntyxgxv7Csb9s8T+bGm4TwS4FABcVPZ63hixhIUsWcXXnzg6jvIg1DbOYZsc6g/yaCo5O6VcnQPrNxPFjzBMtNUCY4knJikn4ntH1imAJ4Q4kaloN9RuDWIWVRFfvxlAkvCDg3STwTXT3130DjyM+8R36swFeqdFqRGiOGEJ8weU8G0wboAJC9hRE6
|
||||
template:
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: forgejo-postgres-secret
|
||||
namespace: forgejo
|
||||
type: Opaque
|
||||
22
apps/paperclip/paperclip-secrets-sealed.yaml
Normal file
22
apps/paperclip/paperclip-secrets-sealed.yaml
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
---
|
||||
apiVersion: bitnami.com/v1alpha1
|
||||
kind: SealedSecret
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: paperclip-secrets
|
||||
namespace: paperclip
|
||||
spec:
|
||||
encryptedData:
|
||||
AGENT_JWT_SECRET: AgCA2QFej+jJlYP3qMIbPAerVFbXImcDiGVf5Yjsw9hjQDQEQhZmDaQdjClBtotO4aHzIJ2zgS5rn22qHbea9DLk8SVZdC3R1YoWGL3fZGYX9dtaAGefVLekPbM/KVFAGV+a3ZAPqNgjEVBGC3jfz08ml+chbFXXMgzvfXGtxUZqpffhOWOuks7rUfUob1gqYeSYxOuuCew0S+0L740hv7+6mtBkUpQ+jpcgyO3PnUPMUAw0zg9Gropkpfz3NdDTZ34NZlVpg2kzJg7z97OOQpFT95bYRZZKfvRafOW05vpkWyFro+IbcG6B5r5HQ7JmmZLJcTiyW5hXuRC/KcFqfNJx1YVmKBhsVyQHecV6Av+N99Vh8lx6+PSoDzcztY3h3pjwXEaixBbV+Yv0ZS358MKB+IVMwyj1gBCmGsXLAoFSpspsEu/c6Eynjl99peGbFthZ912c3rxupvEgWuuvApbRYr5uh1D6LAZg6mbgCArQICBAQigN6qCUNhXETYCAwc8Wh9Q7OXCEInncWWVrVSgDcbR8TzGF0H82yc/oeI06twuhLkxGmgCS7xMyfzDvLPZf0TPF6JYtVNy2kXPs5kECXxF13VEOL2EWvPJZpQPGmqaUM5AiCeNmjd3LgC5Ol6Ww/GkJ4Pg0N18RJ1ti6MYMdOu3C8CDZrSeDaezcWX5KuWg++2453uiAsv2PMBaiS64cyNJiA7bHox1skS3pleoMfIHdj5LtQAnpbk5pvs0gqJP0tUfzxOnInInQg==
|
||||
ANTHROPIC_API_KEY: AgBkK9ZBW/chQR/azcc2Dg8WgjTxDm9v1s0Tyv9BZ3NDlx2uUpyrSQOU78iW5VxYqDU1DmJYiWzxi2j04Z3oY/3AJUy9IkJW4CSIt4OoWNXgUlm913rP97fpTFGDdlEDXMkeclIcmnMT0dl/yHHIvkruFzgJlCI34DG7wv6NviYkg5J8CJeredz5KnhlkcQUTUEpVr7mGo1WkD0V3+al3j764XvqD9o3JQinbnUq8N+vwJ2HjxHbxhkahscudMnRt94KcJ1ap7AMBieT12LN/a3KFwy/I5AAYr3uZ0DALlNgX19Au2KFTNjdvQ301jAAyg2micwpPMjGRLOaXWjmrG1xGtH8QejleDMd5R4I5q8Hj5MiAcZ4QqxpQqNPgdnJnkZLGGDYVoK2OQK1uRt8ZVxg9snamRwLSC2o47HDhVgbI64hBaMHcxscSYTrVpwC/RUmcPPpKUbeE0T4fM8XKrXNSxyVWSd6wfpelNU+7YS5fYRkpEkxp0u02Lp/nbeMvrXjdNgOmG2fJB9byvsehl23Bud93QsARCWrDUmZpfzV5Uf+RG7Irso9CpFFO1pSrItD+Q++OBVvTfSBn9fGOWPzV+yFFOiKjvjhaSjWH1s77keJSSMuYDH048ks6u7ZTsUcR4rU7wMW4k6l+YTBBKsift2NtmWs/zxGCdzRZgJ80pBTYC0RN6tuoJwg5Z3xpec=
|
||||
BETTER_AUTH_SECRET: AgBaqrwdWMZApjXhTN/p1yEZcxgTEVywTtjVVeXYpESKI3Py/O7rY/wZrLDJ1G4yVJ240xjnnUkDNreJGXZfJSCu4ZjvywKuSc/aILKQ9WIi/QyeGDzQPkO24/qs7KFlW7G7P6CtepBCs6eZgp1W7HzLL4EWZ1flXrIygfKsvddr3vjWTB08uBnptcH0NpWdNH4WNIqAt10Hx/m9Z++XS0FHZH2Y9+v8pZB9jCMZ43VPuL1F31xlIW4g9ULuTyWQkJGjVJIiNYrMaZ2Ariw0+FoMc5iinelTnDxxXYyfqlOG66FjEolvAGAYirfuBUGvhZ2pxCP4+x7YddDhRhpBirY9u0uQp703hkgBlw/xqwBWimde177sy18VaYG2Pw7r+qWUdE98Rl7nXYLshqQKA5rQ0jAr+qaXpMqenEl/aCQ8YzovH12oCTBjE/kvS+hVoxgHAlIh6DFwPsPZ2Zyy/41Wi8VCgrhJmbF4g2xL9s4IedQzg8SDhkVjdjTJLO17iF5W+vn/IZhuLoXc2bSJ8OJHAyAJybXEav1xd4AyFiZLg3Z+49Ai5btX3vT9FcOGCEIVQeluPtyr1V0InLfMU4L1cbhCKpR/XnxDssn74RduPyA91BdaLc2nSuVKbGVi/cEjj7iElhekzVsg0xInQhgkr51iJkPHnqk9bAfX5ddZ1e4Ktl5EHhKkt1kvTYZS3fczNVqFORpVHtmECpgpc+KLJ7KTsB0JRbuX9bKHE1PmEv4XBHf+IuMLaTcIyQ==
|
||||
DATABASE_URL: AgBSYZhZYNxzlVRgGH7wvqvBD+1xIvxq3OordmmuAkBDnx2sLu3YjZBfB+xhhBb0/WbvkWO11fBxNbaIztk2BL9263fe0VWgGqIGUvlXDPQ6iEUtU73Bntv4p21JOeHllIG4Ur0XEYpinXA91ZupcKr+UJ8sRsCu8jVv939RWIYPlJZhUduSZdo7S39ACUw92NesCj8gtWYKtyjkX1RSN5sDmvVrP4EDiP2bnuU9RtwirPfgvFzuiqIfUsew+NsTgCkFZB1rY6WEfxjNt6O4YCNRa4Pg1BVWZxKdJ93LRpNhcMdl3Luchz3/A2ybLoTA5eJhHjY6jFM/0KKeDwNejBtStiawORR96RFEI3xEBvGAFtbbcDFW4eEIt7bFy5lOLk4xl5PuJ7+c3ogulu6Qoa9Fw5qywCQnYbZZiyxrtWGhp1BKX+dOJRP+QJaRAGHAauYbtehB961ZALRSZtGE0YbYnmlN1KHlCkFv9EJ7SG1a1/zaMO9vk9dexBS20MjW3IWgUUfvFzccFS68pREg232ByXW+Ec0jMfCIOVPjKuA76t4MOwrZXD7gwbdwYPmRTxtMaX7S2IZHmXFri4PGgoarn32bQ81LW08xwZEbIoBXcRue6jJDBsSAl2CpCeoJTvVEl9WtCyGio6/eG7mfMAcvNRVmozE2ZhCSGTuRpwDiNpIz+vCBjx+esjastBtsMSWhOfpUR/wNfD26DexwTWKKba2qxOwT1hkLCNFLeJqZtWYSvHSg9Oyt2NfUoQw+dCzKPxeyq7HlPTnZ1J7NbA2rwDbt1wu2uolTvW7ReoWLIdmyQWXBFYs=
|
||||
OIDC_CLIENT_SECRET: AgAREuUCCAWsPe1dng5Ei5nB6ejLs6XJ7wG1LZJf7qaRb+K11vjg71TyW5hULtLZX1gfHqvmwlEJl0hiNXaxjXex4D0YLsV6i1U3IOHPQLZsp0Fu9IcQ/j6vSD4aHPVWUKTX25Sciw6BauRwKXaTBZcPXZV9s4/EtHPf+zlHBVR2Hy1LqAOb7PF9LSdZxjhRu0n+/8iQ9hJOFGFD6y0fCA3Yic2D/b54GI5Z78EPr6YJPpJqgW9b5aMcT+gr8ip90ESEHDJUr2OOgdZ5385h4VV2B5CgJVHW3S/wTKQ6B2AWJV8tHo0W6MeOWJUkV1HXdJeP2MEPlQ9qmXn4yw/vRaJaozlXwQauMs1fw1r+h6AEtM4R9eGWiMN93S1fNBUzmeSg0fsiUHNYt61eCEMRnaWpMeXpnkBpWKoXDCJXoeZhi+hmVBiKBX5KzTX38/+zTzlpRSczfifEFqolmPuwvMBXOFAsl1LbpZVCpiKyKUilmZS6ZbXPm5JuCYD314MDhUVuWZAuq1aK0G91tMu6ddafBkzzDw1AgU85cTJemZ6sPdQGJvuXv8K8uLgANFERLjRB9e8SgWDNlRU5VYyQbgdMhlC+OROGhbJJ5hey8FOgz4Gad+QSBiTDEuKR3S0ln+GuP2w4dCbzXe0J7RZAK0E6O2G2SZtsAgJb6p2safd1zN/MkEhouGPGhffGXT4eJ0xxJy+sDcUE19g3asowZy34stLfYrBtAwBD0MdYN4TxoQ==
|
||||
OPENAI_API_KEY: AgBIAmxVwn/J/vxPck2pv5h2AIizUz7zhnU5U0VN9SVsx9oOG9YRjPpHehMA+cWdRnZwPbTlAXWvBA09EynrLpM9ERuUGl7eNSa6N8V5ZASKDENtBL/QogeEx2+iYBIcFsLR1VHnTi7FGsgEKRpEu+Z7xmx8+2Piloqy4D6rVcwuG/RPy/0CN/WzVNDk3fpRQZmCQh1uBDJoHP3TkVu7W1jAGIWIk0Oko3nbnhFOZkvDvsRYnsEf4hNnqQJ+T2uJH1HoqD+sJ1pGdeczDTcIRWgED0OFXYOYjH9XscvJM+uKNkAklokkDrcqOn0ryOXwXPv7kla8KeuFSjrF4/JS0M9CbdUb8aQx0MxnF3LAyHJV+oqEHd4o3TK/3KGuR8zcD7+SXtIS8RkehOZXcGvq9ONkCncLxcTcqefikBdo8xJQGx8Zu24BoZNxx/l9888F1+1WEtmMM05q8gRXMc40DBNtO3uhYYh7Gvxl9sYVcnC0HyK6dvnwspOcSDYgy7m3zONYyyPtmrAE5r4er5lRvl0B2gzvL922A0S/e8/3LXKPm9aAuwfpQkHFS6vbCqBSyQtJQJlXGZmC8xb1L2W7bsbY0cC6fqRZEr0Y7dAlRT2/n1Bc/ffg4W3VgoNq0G182ymEk0Bjy2W3DF02Ivubw+9WSoi8jWIV36z48Rm9NDZn2qVd1drqe7Sj9/Z1h+t0K0w=
|
||||
POSTGRES_PASSWORD: AgBu6J+RG+jLIANGDP4cfUJoejAATDzLTYtJPaO4/Fik9g4EGczWMSHvnmD2fnwyclB8Mp3lIrGdW9kbnCuk+JLZjynKhJ0JZwnbLpr79tfhaCNUjvE7AvycGkMkQoVH1l5OwLRW9ucz0caHDmZ2CadqN0EAW8L7ZwADUzSlL6UGUDwLzN/4kM1sSGbGichJrbduXGS0oAmiRH4MroIytQW5cmHOQaVSuhzPZSuzGKahVCC0uRJoWenRRBFQNu9moI0dVu8e0c0EnUJewHJlZFPSv+QAobipKqKKepP8965wKlaKxTRXOOEAp/qdN3w0VtX/P2VZ/I7S8sB5MmN1/yEL2lNOGxJuJupgCRDN7fLsRHvpg+DjwjpAfmXYQZH2Pj/dm6nuXsSS3bvCPM8MFHhSIIEcV04h9uFOvXhnjh4pjcWKOPKRNHjH2vETZbizB6NfkOUJoTSwyr0Jci/3jxHAuzIXlvE1l+EpMkea8TG2tCXVsgGthYuPIFEb+mNsDLV9hef8XNnUYqXQmM2xsMQ9NvzdbhxW/Ue3UQbMau0Z8Z30NCz8X+4Du4m09YuyfLCM8mfGoou+ZpkVzS2EPoOTebuYMCAjFOBdxm/C+9RH9G3JIj4d8LsMBMs2iJd/BVm7tI8RRKf9fL195neECzFNaoTDMfqAYaKpfGjLHzFALcq4b+sSOTSaVS2mfo7MpBG/oh3xHJwl3oApnWj8A4+W3bO2u0ACi97nBCQzUBQWMg==
|
||||
template:
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: paperclip-secrets
|
||||
namespace: paperclip
|
||||
type: Opaque
|
||||
19
apps/passbolt/mariadb-secret-sealed.yaml
Normal file
19
apps/passbolt/mariadb-secret-sealed.yaml
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
---
|
||||
apiVersion: bitnami.com/v1alpha1
|
||||
kind: SealedSecret
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: mariadb-secret
|
||||
namespace: passbolt
|
||||
spec:
|
||||
encryptedData:
|
||||
MYSQL_DATABASE: AgBPxY12vhfOZ/V6DQAhkFsiaie0WK3ekPhV923iyiAHQz1B3fPhMDDdLwu9YELwQlB+S7FKVDKCSU+TR6dRmO/kZZE3JV4m9DpAl4Q7lVHrhuAkkvMBBE3aJe94r5phmxn69vDuL3HQ1vOi/bBRithKZZwnOYoA9WytboCyeHECxrisEY2QJSzUAkafaXMKRTpueb0zN8AJWscyzOjFsjNLmjsCXzoQ4q3DRBuBpFAMmr16ybIWXlfncRz2WJFGWHPvPZfZuO3UAwq75BvpC3p2t4VuUg5Q4rfnPbufemuOCkJNvxz69ci4jtx9GaLQE5WBM6Za0RKufF3kAr2knr9IXhYtI5h5PoqtOTjVqoYfa1j3GAVu0mC1TKw54NAv7YMLwRCPOpnK/GdptbM2x3A9GUZ6QXOTIMzI6drUiV8GGw/B97y08iZccoIuXwUZByrPwZGhTyCoUIoFGM/pNtaoJ2+Cd0LYpNIaQ60yYc6xwstwyvYO2BiXeLV85Q0c/SqsK3Ll+qD55fQGSyH+uBZaaeU9MujecGoyqK4jUwYIUyiog1LKjzhly+ShzdNcvA4fp4eu9CJ7TrX3tGcY2FJZJROBhXhsT0KLByWRXjff0F1CN0NYbDKjLFMZDSLxUfEFqNYoQvvj2AaHBBN8p+f1FhzDV9K/BtIvqi7Brn+4+eFaDyJgg1WutDfIp8OJxGH9qVECO8ZHIw==
|
||||
MYSQL_PASSWORD: AgClVQp13avAQlsQV2PvhdJK3f9nf8jk3CK1HJWP32iPRKazV4TSF/u94ZMDN1GypbRJJfEkX5se5heqahdpfGxaUMXFRKg9YysQ1vYmRAFLk8zsQJvW8268lvLaw+IwYlscxzx3Z94zAWclOrNiDDUuGJxI2naB3mK7OjDJ9za5Mo7dlf163CgcrIzwXFK5Lcz6hhp3jzuGg6a750vKuTXUW+R3hMtJP7X9gETzWvyRU1OhOSCp8UlmjFyWwiu1JK3TBcxznX+9gABVZSyOgf1nMI2Sc12DkvayfGTwqtmI119kQQy0EmihKRaPA6Kndp8jsLhPtOPuN2v+SUF0m6YFFo4ghr1XbpX6xYMwc0VKRCr/b4nOPiovoo7aG3QUKsh1fiZ05E27XAchQobLx7qBlIx6LpVny7Uqh1CbFEV89VP4Oowyjo6FfRv5a9FSWwhtkOiuXZVzIB3MvODAH2PQIxq55HwmYw1VIwdS1BknUvUYhGuwKLspmWHffF5ZhI4f4pOVazrHKP8itxzerP28xlncdWvLo/z1D8i3eLL3QF4byXoLcC1w68dFMfFtsAiMK14OT9f0m68YBMfDiLu5GzrNGh//u9kOT1qoCKoB5wHk541f4rOYvd+OldN82mjxKVEucFCXAqvfPRU7GNL6bibLgYadWJZW1Xk35ANYmK8qDpS/Pz9RtdSbX26TXF9yYSuOCHk1RY35yh/bJqkR+hXUjNYSmgDlF8QPqzahhV94CEHHoYoK4+XIeg==
|
||||
MYSQL_ROOT_PASSWORD: AgBhnOtKQSFE404ttF071VJSb2NBYbZJ9MLUz3dWVkIvBPtHDMRZ4bM1Qt7j893MMtpHvBsfIXpk1eBVHOptz0evc0Bjge7IRTSZiKB89SbFs0s5BS7/L18LcYSdZrNDINd99A374WRXnR5XIizkzBWtBx2k2c9NUjg2APvT3CEmNcS8GDMVgjy2Q31xH6iKuf5fraZrvAYY0fgLN6B1XIwhsnul7fwuK/cv6qoKgPncIeNMk8riS8B2xg18KUXvPZrW47NibDqPq+XMWizmFPMJK7CTMdSAhFRBExKmzjjJeAjyeqzFjVt5R1pM70+hYKjKlJXGaNejKZCwJ2z3gg8lFipyH4SJgt2E7ZhfSQHprvBc92t5nG5gnLDrwvuUiTkYwUVbB/1Lsn23iyo3TmKhuGPKhiPo3dummlRoc6HWJh5Rn7h+mI9cs1hhOFopVkv9IAmFHz2WH9OE939ElFXWvtnrEm2rZt4WWc/Em5Lz1pvtwvdYxhnHOVhudSC+96OhDfEsLaDRbW+7f8wuFQIrgmarJHjocNLASXYxBjqhVpXGdGWiyO8/YHu/Bnq/Fxwa3U/XYrSS3ZrSPCk3bwZRb/2/fYDcn45RmNZF/sUKQNFigT9UFmdGcS0qbexxjrLw+zHSeki74oPOtSAcPSZE3b7X5WQDKPeeZ3wb3EXHG5xVCF09LTTQNK16GR4O28TSIX0DIG2pCg/gctc8ghwsC5ONyASMgP/1bL/whKHCHWTgpPAjtylLRct7HQ==
|
||||
MYSQL_USER: AgAqVEl1q4ij+DOB/zcgerYrpvxd+wlC6aWDJDfeuApwB6bi5KsElPX7YSwy/tgUag3Aay54mbn5wPlmPFVnK4rkWqRm4JXM+zZiRnR0iTKbIYo1esHRIO+tC4YaVVmgewoHe+rlwvoV+01puyjsi63BsBZmS9m7aEpDU9pk5+oHjDee+0YGZ52yFt6As1J/si4Gk5DHYxwDY80GlhsdxMSzNE6vbCgVy/blU//WO1AQ5JKDyt8VhpwpzdCgfiQqZI5dN07URloFjVs66DW54xzXVBa/+2krWNV+eTmykHIrYDDS+lMbxfzH0SkvP1AbZaJLzOiOAl1O/njEu6FjPF8gib2LtmULRdMwML/9/pStzT8ZEIF2lY3NBCyA855FjTYbSo+++HCSW4/33Lkg5DIQrSqDRY6Zbs16yZdGVQPEqYVyu2ehbS37DQrLRIYvM4vArBTobMvjh6F7GiZ5EQu+7wVxMoOfm9ky3e9EUJWRsVWUKJ3cLA8oq0XADeeGo2AAHBdtV8If/pcaFduVXpiMrZLuBvIzn+5K28yia5YOqz1ju+evdcEsIl9uqFuZ8h65TBWI1bRoLqP87o44Bsg2lCwzGeZwTOqnNaMN28/FOXK61d5eKXna7fWJwS2BhF8DSBMkeuOB/dRByfLst3rc4SPMhbXu7cJTsO6g7BkllRdF7pS4d9PAiD+eCFMS39sF/EAkRCx+8Q==
|
||||
template:
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: mariadb-secret
|
||||
namespace: passbolt
|
||||
type: Opaque
|
||||
25
apps/passbolt/passbolt-secret-sealed.yaml
Normal file
25
apps/passbolt/passbolt-secret-sealed.yaml
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
---
|
||||
apiVersion: bitnami.com/v1alpha1
|
||||
kind: SealedSecret
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: passbolt-secret
|
||||
namespace: passbolt
|
||||
spec:
|
||||
encryptedData:
|
||||
APP_FULL_BASE_URL: AgBZHONa3yM1JEUk5G4aX3Z2F7ScfL/u8rRWCgzm7aiYHKLeU46yTLQz+drqpnpQGMU2hoSrSrXvAoPIoABXdGSUnJVS+oZ5LjBE4JlYBaHX3SCEIeEvjzIpdzln35nvvP3nVJP0s9nRiaq/joTy+lN6AUDQm4SnBNWVu4OMHtwI12RwfiCuVfRnO0iGmAMdOVH71tnNl70HaMz6ZnpgF1WSbNpTIYabqJghwqpekSl2SWy8jTvDsVQu+3QoeoTmXmcNRxaizvUbJaq7xVr94BeISMcC4KLNRY37z9tBdD6J92HjgAPVXw8Qxa7vvwCD+jJ0XIzNR2IJSdqjkhr4PKC+AsZ57mCWHKRSgg3+QUO3TkoDhD+dwoDtCmBbv9aVSA+9gnNlS9QAVqsJvYs/KAJ/z51CBEnDyvc/qADa2pEUTvf3pu4wD6yMBpan7TTZQvdZqk5+UbSWkUZzY2NQSrpECRzlKcGa+PJcuqxGcut15dqzDt7Gl5EQBFi45iSJ86gL0O6VqXU8yQJFb62vl+3CLR1EwoTmodqQFSCLx4349/QNl/ZuHEYhn3nN2dkzI078cg1kwah8qb5Y+1HbkRSYraU5HwGWERvG2dmW2zfRV6DQrq4xaeX4UQHBz7+eyz+KIpcyLCc7bPkpSdPnQ4jPcz+mj4sF+Aro2qOlzQTkYPdBYMwU7pkqdYL5zI8vVhsjBIJkwNEcTEg8nBnV3V0u+4FhQ4yYFYppeWlcIJM=
|
||||
DATASOURCES_DEFAULT_DATABASE: AgAqsuJ/io7Hn+YtaktL47MfmV/h9k/escD6xfHUwtmvPoMP6qH78SB1qymBBxsfy7rozyGM5Lynj+/It4s1aNp/iIcD5XQ+IAh2PkQURIuYBow1D2WIPz/y4aHdIBEZZxX9luvHhV+FnVv4Jo6fGY+vSpjl1/QDvWC4O0B1ZHYvSaSKwbMZ7g6SHJBPO/qIZPzB49+jkH1ko4y/2Cdj8waAWcIrN2a7UlaIpoiKw+HZ8hQoac4xgY5H6RN3wNS9GJ6GIx9ImJdp5oU+RbJzsn40BU3psD1mgDtLlBTFIkLJO9Mo85ASnPguPQKV4d6b4OTy+EJJ1NL3Zi3Tq3U7LNjxx1HdqbQk1J3dxUsi6xd1UNd587MEiQQXVR8JtVpAu+FyPGyIwXBgfNev7YgeT9JBdKusvaCHsuVZPJgBpEeaHfw34eNJijxca4DZNkZKyhJdWUDJUp64vlcGStr5pK2GWm8+ncxF4qjYpRT799HJfoXgq/AmAaAnWNvF9EJmILCU72iqduE8z3DCZbO87NQqifsfp4Nl6MhsEfQ6fHGWdOG/WiIpOQUIvVQ4IPhjc9DwQCbvMmGTEphs+1LKm9dpSyYmDiZji2pJ2Btg8VNlGxNCAP9YDuC/+zqxhIvR3++hS8aWZW1qzuILkMrfn8yoqSk9XNIhrJ1AFp12LJZE/JGDyIYNxpaljCT10GWkuXhFqIyyt+dxnQ==
|
||||
DATASOURCES_DEFAULT_HOST: AgAWyQcHR8CUM/t7cGBPO24xLFEdEmcx3rQXdHHMOSrMAkZgKb6FAfvidUO7KdY4O+HOv6218uNVU79nYlonocbNG9lri3Iwqhz2vBjlbctERplC/BabSeJe5r9wcFE/2+lQqfDFAHvoRgbbEHuDrksONcv3Anx3sHysQSzekTv7KThFbZaIhaPlu91In+E17wYzyEIJyZUpN+VIqwIMG75wlWRJM6II7p7amESA4qrgE5zjEmoZph9LWSNwLHrF+7g8L0vluvWjOboFABHCecAEJ7RNxrHQVNBcBNFTowUex29JODlmi9bFohiiB0lL2OJXF9ovGmscRXfUvz3sNk3XBtjPzwTI/gI9kc8JrMvFODsJevf0LfCzpVX9XoZQD2gk8xAzDmifuBhrP3gzChlG7kjxwGJ6WkpvFP7Mzfh4zgXQMUJ1FKtF/wF3nJqQVnKeFGbVzo71UHw2bOvVr7DfKpCMyCmi+pFjR62+1Rw8+7ILHrZKixqHCjnnhR3kotksoNXxRJJ+gQyZTV5BxOyjHGMZtPFD7RVmtpu4vY+1ja4OqieauB05M39Ysz9Cwc3XLdyg1lRxofGWxlsEiBR66J4i1I1s71GLpl46a/FxNz29qfiLGOzanpXso7gtq2vLmukLVoAItYHCpfRW7UibO2lOl3NTj9A/iNVnENslxXfqE99MqPOh2ZxvrIP56w3iU6iBCyxU
|
||||
DATASOURCES_DEFAULT_PASSWORD: AgBiRSRkk7vU4WrU/8Gc4QJlAS8DVG7kvSBiC9Z+DuGf5guo5pLp/5j3Gcdm3Wu/eJTmn1fg3lUj/I3tUX174VnlEbDEmbkI5j/37HwNMvaqisWppscjVhwTy8yUA6bC6hww6t4H2cZbEUPQmNYQ4M6Gv6Z4TUJmAtqAOyGXw/HpHuz9n3vRHdCUN499SrjomdCvdcW15Mwj6tEj9a4yms+XN7A4c2x2mB+s1G3fq/i5QLH0FflbiZqJqcsKZWmzXgbHkK8CN2TN8hXJqgEDhTEWWd+8143ciZGZOwm0NnqT6dhvmP53dNRTEZDzhz7e9rRm/Gy3SEvckaIyoS1JmoUys8SLYmYD4Hdp2EbVnRaJncKgspg616Tk6CqIXBb0g2UrpZQGfnk+zrz977pupM2hkKcnhq3UB4od+Z+Fx5ttql6FAAcfj6WF/UjrtV29RhPmRIKKU1uuyHLBXTJSS7kYZLGtmJlLJ9L6lrQiMKOq85dUd7NnBYcqSqCr13EiOa0f5XVOOnGAOBb9C8mVQ17sK2BXTfQmavBxB8kejhK7Yc7xTewHirLMswsZo/5cAVOrM6JUIqkyMek681vPYbyMh9EzFy5332MzWs7Ybr8cNeJ95ZKvjV5QJut1s8bsiTAY0ab37nfloeF+1TafcQpQCqCAfKYc/m8rCXI4cO3L2sPUSes1RyGbGSWBfVRMfBqbC2RtHGPuxZNqM/FFFkBhV4TsLuyFjz14NF0OYvOQfgtqoJ6GdxEC1TZN7w==
|
||||
DATASOURCES_DEFAULT_USERNAME: AgCY34cXlrVdN3ZVXjIgLvsMBTTzDiIGrONPfVkw5pymP+pta5Da7qObJ7E1t8dBeunFwOe3Pt9bpAjF1yr4SqmELrH2ZdVkrA2aVrqV8twuDHKndP2RbhwVQDaA7m4TdlEeC6wPWX1PUiy4Mlry4tEvOruxRHZtRAXIxROCChNBMJYkCXrwu3JV35DeQPKqo9NVDYzJpP6ko2BY5Tu8yv5ndbtuYg54JqSCewT4BDqsjYpSKHxYruQWS1p/2jOjIHqAsx862AmNDI32T3tR/uVkl8acxFAveCdpw+Mvl/1ljSUt/ZJdm6xJIHKjx5rcw4ug/8zzG/st7hcMtbPUkcV3yZ0tS8h2iSwuqehn08XN+e48tEyruBGXOsPYl+iSOlZjAixneaOn4SIFVrbOs3thF/VIVUAN/vzFOh8/exXgL67IfVND4wtOqqHMsFIhxOGU1+pJi7+AfDhoBUjEW9uZk84qPwQnPO+wxoO1GFikKegfaUh+wvN0/fH9z1UdtSPbx8KRgjLevfJLIkcEYsdwpeETmqIIs5qV89GTjgoFrbMknrxhqkb2DqOzfSbrI8HhO9iKEK64Tf8JdH2DSWpC2UUqf/cWZaRDMWD8ojvHdoRE0SorYu4X3x7fLLn7RDf4WWVJFAbgntDB7KVyxX3P+KuPdklctzmQ71hWcTUm8kc8GlMZVPnOb94wcHjs3cHo2/V2VNMqrQ==
|
||||
EMAIL_DEFAULT_FROM: AgCFY4Xq7FMilyIsWhylcI60xMZPKh0ATurfM2N8mBkO/f5gX9ASKBElvsIn0r+1bW5LMxylzcAZiiFjYbxnRmxE4QnLdt3AqHepPT52m8mJ9EsVpFln/VzDKsZhoGzdYNDS49tzyVYwlq+ZaZcR8DJhEDTPast0QCB6pcaPv29JqVYvrfg3spm5l/pGNJ4/L2/N04U/5swlKhigxNGzanFyOMIkLPLsLQswZwFjKeknWMZRKnZFPBqNqG0Kzo3fdBkyksaY58hlRQJ/MYXWlL2wnYF8cs7lPQZ9bd9/SAJpdou2em1eHCc3akjIoCUIOtPKo5QYBaSNm4Ge0Ul+phGgJNqB2//SExOANn1XDosjTl/zOBqFjhzPEmJp9F3iv/4qTx3PBwPFHe9a2Z3A4PloEBq14Jc5BpGf4Emvu01Jy21SaBXmsLZTfud6GtAzIwgq4awO0wR4rz71UdeioZYXjmMITFLuBd4EjSW5h0G6oz4dM73aJqKAP0O2EZxSnItRE7MVjxMESUCpRBwButPtROXwJr5ByGGXpZyuEisNTk/CWPDxrlvqjE1swKdXtMHLyCfkC/rnPlPWb/d6zf8urNVaIwzeKcY8hZEd9d+8HtzwocnjMavRWtc4NVqpQ/UjTypDH+HZDo/JyPTHaDCrSoEh1LzyaiZx//oAuMrAB3Q7fOFUELiePsE942XqXLvXPs+HHL/p9ioO3SYd2iyP5PKz93zR
|
||||
EMAIL_TRANSPORT_DEFAULT_HOST: AgBGnI65mbVdqKbXa+dGgex+nATzUi0WUoyixhO3rWktc8f9r0Rczb8hcWy7rhsicuElhX7FL/H0bjk2kFR9Fo0KnVIirvjuvqXeXnryrCWWdAbjYQm2lQDPGoLItGk+Hiix/RZjfe/Ljy4xmCizbwdwE/+rGJMajjsr0t/fGXmLvvQqL/jhr8K9WPVjcolyBwv1o1uB3UNcUaJp5Uo0yaiSfEg1hP7oJlTGwJgvT1Nqt64n16ApEtRSFRiD4ICDLRjGeiyIkNvuDtGOonnle99Nj+uS+iKZZ165qol1dT7uvbT502hiz9Zt9qbr7yTALQ/Z7hZQi212Hhhx9KOehVfOLrZUKW37xfJtaa/aSFqoNjfPXtem55jXDS2XlT0oojH1CH1juOIvXXLQm6b/2YEhkPdWeclEwBNGRzZ7dh80owYeBg8eMWKgzGGaHJrqkkREelEhpyjQSUSu7Q1+b9W31dcUgsGH+wlost9sEX45BIDouUZpiQNe+Ngd7XcF22jPbPznyooWrKO41EEY6OXsnPltJvBtrK/UU7WwzwUeGRi8Y7fBFu6otgLJwY3gHXa2eXT5Bi64+Ug7WWAm+gB5RuhqNXDTis66IC8HU27X0HYtLRQ5TtiUeNKn0mDmSWnoBZMWfHxHCpeEVT08UDHXNvZ+eoSLmMndHD9bnjKnNdga5BL2j6bygf3QVJLtTqm4jhmzvrgsJxN87ivSfVX0U81TF2285AEvKHR38GKa6ov0nsLquicg
|
||||
EMAIL_TRANSPORT_DEFAULT_PORT: AgBYGMmzj+LqVckAzsRCmjKjCDb2rnpzG7aBECSy6C/IjhPd+Ic6sbSU3jkn3PFV6JJ9YC1KXpp5wUPmWaeI2wp04LksxveNs6ErN8QKqaT81Y/wwZrGby3w1tXngjl1ubnxzlRcLxCoEhSVjZlmDFHZ5CrkKKMHOjXARyJC2x+pCCIdpNgij02TnD8ZMvODl0GaU2SuQcpKPZ0zIh0RcoR1R746RWnZRv7/smAizUdCWtz68wt9Q/YAJgd8G2QjEklCe9rj5uh5yc/qFqmF+wDESMLRCuNAJtmdL3tyi4Mp/rQZxIEvp0BoEvxYJ6JP3mlSgSa41Y+aM1sa72ZXb4uZMiRuTTZ75BPPQzh91dI+zW6oJMOR3SS3yeTwgK09dNbzeIT8G2VGW4I3b/KVnKvJwZvLSSrHMV2f5XBcbibxCKvEeVtvnlf7nK5HfhInF7g6Vckl2wj/D6FceT+Ru1cn9T06AHk+pX4WYCzhalIOfNLVRHa1eFFsXaOaNjzMXpVK/ZvFea55RgR8KlxJHp32NeoHR1tTypVOFHLC84jHRgvI3pX1NMqvSg+oelQ1gOH9+6tiaHf65aKRInv39rIV2yRvV1N0QPbZ6B+wOKrYiJjxQ5GtlLHEORHhsZJ/7Plh4K25F3qDNj5jUMjtRla4G3ebsIzubRTDmmPWsPOLIRk0MNxFdZDPgYYPHD+hiBXgbw==
|
||||
EMAIL_TRANSPORT_DEFAULT_TLS: AgAQcZPEIqpL5VYWC+32cfWP3gD5N6AanpYKCPBEfwlU942U+Df/CfnfxSByeHmEoUf4X56I0STdoajEYZWka3wQpGfPLfDaFeqYJaRyaUcSBe8GdxrB4miiwr58E1SlmWdMKYMPWsw8uFuD5iVOa8ObIhgDdwJ75njhZVZw2sbzhHBf22UCavfSsIyqAiys1Mnx2WKoCCLg0XDeISbxHcRhFhKchkAdZhOGPTezWdbN74xDxDdpV3a1e7zps35ujMH5kSYIwbaOvyF8tHjfx2T72c8WbZaDpT4TddY4l4Dk8WY3P8QeXYmZVj0zmqJ74UmiICCqm2CNHgOTLr/SiuQg08gvDI5Kep3WvMwOpm2kpti9oBBQ1dER1n9kFEVr2jtYPZ0D5zJfNPcNlkX5Xc6PQdRo70isLoFLeyd4GytwL07Ke3sfzgmuvIV005Oi706Wx/S46rjA0uzd5g4vdTd09PDzCdS/rNNVFDpWzLCgqfdYsYkbCixMRce6MyYuuUiAuZG9aL1BBsm3iGSdjR20fG5HL/A7RsL3yLrHtED3upYXYXi2BdMwTTeAN+f4jtYfBGkiesy/sDlimdRQ43LviXMD4MLbT+aZq9bxh31Lu1SHHAVQvbos0oBpCf91GT2heyJy3e4AUNYZsx8q8rQeqgOUPFExpZ9Sj1FZ/JxxyFOnoF6ofGpaFjcl81bQKUVhj9cAlQ==
|
||||
PASSBOLT_JWT_SERVER_EXPONENT: AgChtQaje7YWcPBKEQN1Q4d2+PiWyxhp0eU9C9n5OtjXYwa8ejN1MVPQQ1TmHW6ybNjKJBZSbu4bodwj8CMRJd/iGYkmR6iRKAjazg57uWYbZjUanUaZXHhY1AfSy6a6yEpiAUlNpODL8vch8R39dIzlGb40rvG98c20bRwB7grqmCjuiWzshU2KZpkJod15svyGS+CEr/5NV7LsUhsKGt2p9D2zgEEvDEO3IKIghkGa5WG+Fhv6V6u6ESyqPwaO2pj1KVIN7yvyqP8dUCJ3ekJprW7FJRdXkZFWvdWHSpryIG1EXhosLaFidggkYqK38AGokxaKK1fuCW/tABVWAD8Wppo9YiHeznk1kdnAtfkoR485/fd9hfQ/VFs+WthKoytHQBTDaxq/QDwsr/ZyNSxb1ihhJx20tM4k1DtTf7LC+0IlW2zjl5K2U3EZ8K702uSn/w4GnjyZbW3wVdjirRcAh+K8pc7kzZTUEceKRpofBxzwuXhnz40uHtjODYdlysTl+mu2NiGDg3BE6CGusedXyRbhnTTLSndD1I+5NlCGbRI4RhZJrXxL7Ug41l/ho847+617mwNp5Fq4drL2CDNULzX7YKAxLtJMIQCw7W6VpJUyux1x+xtEK64iHy940Hfm8VPozLAZhxdg/fLf7zYePAlDiwr+EbO0Gpasup6x+4qN/juldIPjPpiwDBqmb+wGqLAeUrzgLefBnvKho1RlLu9t24MxASKqMrqErbOQm0tABmGNpLX5nopxRw==
|
||||
template:
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: passbolt-secret
|
||||
namespace: passbolt
|
||||
type: Opaque
|
||||
16
apps/platform-prod/paperclip-auth-secret-sealed.yaml
Normal file
16
apps/platform-prod/paperclip-auth-secret-sealed.yaml
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
---
|
||||
apiVersion: bitnami.com/v1alpha1
|
||||
kind: SealedSecret
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: paperclip-auth-secret
|
||||
namespace: platform-prod
|
||||
spec:
|
||||
encryptedData:
|
||||
better-auth-secret: AgA5HmbWv21FilfH73iNAgqiTtImfz2noM6b5O+WImgMkE+EBTY5EXOD7puZJmuK7QJKNv2+81e7PIpAuZeTlw+3AIp43BebSElpQcGAfvA66B5TpILIB9cR1zgO+taaRIsoMOvPqzXMbT4bU5TN4CNyCavRQx6uMc/MRpJ8/xM9ae+AipcWEY3xPvunKfmJvMowHl2lECjD//V8+LPXNV2KiEoshmPeu2xp3appiLFbm/4pnLoGuiABzXw3PsO49OeQ7n788YyvaCdn81+TzoHF+yeJHyVNMOMLSutO44vQXWdgb86lmWBMbFLgNoGHsD/VWMl3NIYredidxUEQQl6rdpu60Zkl9NTgYtogIkmmt7MaJww8Bkocvggf1gQxYLzbowWFCO50UwNLXy4yYtZbpH/gj+wbL3BnH9Sqn2Rk/QwxDsldMfbcmJk+dvX6s2jGcQ1YCQnKC26g6NZ7xCIcuZtEaSYTJthzYPpTdYYj9SY+1XpAItlnW9dj+zVg3wxifBViB7nqAHXjB3yHztiGyUTQo9C22zIgewxEq/4gCxLYx3HfPyHOKPD6aHMmFnTIFszO2JleV8xjiMy5+m9sFYvxUaPyHY2nO69CqoPJji7f8125YHPPZimUbluyPi2eXDCrN9aRXxe2478pyXaogfWft/vTX1lNyb79k2H/eKL7lpGDzov0smIqTgdUBi6VALpw7n23v3dCEniUwuE/UlcVCYfQQ1bUqw55X5FXUM5aSDS+ps6ZbcIiTUfdRsbopIOrJcukBpF+
|
||||
template:
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: paperclip-auth-secret
|
||||
namespace: platform-prod
|
||||
type: Opaque
|
||||
18
apps/platform-prod/paperclip-oidc-secret-sealed.yaml
Normal file
18
apps/platform-prod/paperclip-oidc-secret-sealed.yaml
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
---
|
||||
apiVersion: bitnami.com/v1alpha1
|
||||
kind: SealedSecret
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: paperclip-oidc-secret
|
||||
namespace: platform-prod
|
||||
spec:
|
||||
encryptedData:
|
||||
client-id: AgAW44lRQJw+NgeQYhxFklVOFieFew0Nq/fInttWrf3G81QDXJkclqNAFTk7xMsvDff4N3OpGdPojFwdmng78ZXtvYkgvoR9iu3uIItZlMOZqdtSBsHMOJtls36G2slPA3z4OEmCxW7bnRzrUpV6VbSKCCa8A5AAMZAxHFGUGDrm61wen0U9jIDDn+Xa2AMf3XoHWVZEQ9cBg77ruhNmmw4JssI6rbuDkiFmSKMAmNubel/IjhAtZ2FJvA32Zz2Q0p2DEXSsx8jXdSRtPL0tvZICltojBBL2HXQ8dTZKOQqo+JXzJx6hKbCHPORzirIhCyZSFrZv2ac8qo3y2XzMM9EQVAs3QJHXiNqi9jFD/OV862OoOo8cVe/tk2h3/bj49pR1WPp+Mmdza/U7oxtj+Mns9nO78KJsqQDT22b2vnvTQBY6fzDsmBw2+rEAZx4UlEW9xaApzwv2V7ZermIQuo5AQw+HXN3HKESJyfCZoeMX204qNSHhh88n6O8VTxin1ZB2OomF8+CZrmANluHNNsGPVwFFMl7sr9fdtLlnb2x8ux+oRi29/6K/x4mYgk2lVg+VHD58NV9HFFb08kq6rSP71WJE1eCZSix8HIL1Io6ahUDfNQ0sHk/OHni/BwY7S7cYgVGv2n6nyy5uJ8oT5/ce2vE4TXABdkNonbM/igA3nIsh6YC4oiGz2Ck2mehixxvn+7TpluhWodJvTExvw2I6tntE1dmXG1Q6FrHyO17quY17Ah8=
|
||||
client-secret: AgB73qCz4Rp0ZasaqZ6kbROSIuo0Dld7WStDV40Kel3pfTeFhvTALVy3Lp1OjYHzUZ6v2AeolLH0ewmEEyXOdDCspgXfURxXAgoCi6oFYrfeXJIvVlvbnPyVvAbFaVmyFGtVrQyFi+tbhd77YMxquA2fYobCWc3NHIDf9EnLEgfLvdjoWhk3BsCBzFmqgbxsOAPkkhcocqcTff4DntUY/FnsHVRCESid3r+xZsa+Bu3wTSJZH/CyOfRss8vaieBVW3DDglV2/GCCN7TUmdaZuLx3SwAw/zDkOHThkBz59SieVuJf1LP/ax8euMZ+dVLWQ+dc0lDBx+RdzV/hILny+7NzqoegCkRcqapBRgDxQygu1NHwbgkW6jWASaMrrP0VmBus1vQezkXeYoJK+ECrD2WBZ+WlW+9k7yqwZFW3xeC9BJ5N8HTdjivzatQ66m0ovSyTyYGyBYfJ+DUNiD30hRUHMRKmynpLs4dCFCFvWT9vXt87WeSKLKngSB285Q39URKOk9eJZL7Ob8lBCzAZ0rlnQKeUO5Zo1hdVFvuDAQIh0ELiKMMlGDJZEs4qU2yPk26tskZEHw4Wez7v8ANK4HTBUKalqJ0uio3xeEg/xZw6zrZH5tG3tiMGVGScfLaSErFVwZh3j2wSOhrOaqa/3FwhRmWjnl6Ol6Dr6OU1dO/8B7dhU3AP8d5tQMsyApJ2J7kUDNtqxvhqrMe5cp3p313Wj/XzMzFtloEU/s0gBmpoLw==
|
||||
issuer: AgBoZ2oQ/RvqabCnuUQP5cDtBHJdx9nDUlEMp2GSDJ/T5jnB1fuBe5dM/031GBR0378udqmiv7KCCq9eSIlYGQoKomvWQwEa4nEamQktu9xzYxGUzwOK6oH55Tpe2OMXSC0BG5Wx7mZX9JMA/ZBkqDuE/XynLO1P3VedePZwSP6EKkaGqQ1csqmVivYoPh1kMGN/MI9c/IwhdqM8NQOK7jXwZKHWI0oLl9eUJh9d73w/f3EVslMNYFnhBPPN7lD4TtwJRk/iQueeFMaazObnY4LDlzjI28v3aFmptie5QMVBRXcGcotIs5NS04JOkwuxp8uPBDRTYGenWglYzab5Ep5dZywxF+4SQbUETxcki4UIdahFe1F2t3NlIuuzVQy0ltDkWCueepPybv8tuYY36IpZfHVFNYuCa9snMDlPQWs2/EXkxwFkVldxhhXXcGIimE+UI3t685xTvhiGVwIOSPIK/41CvprZWdMpw5iWeF2V/2RPKhfE2Pa9ARPgX6dZ4+LPO40HOHaDfhhlBIj+UbUq3pjRsLzRB7gij0bbkejTq+jQGefEjzTkO6vGvcRKAuWc5bSO0TBKQL3ItgBKKLhqcAjjXo9T0XXhennL2PDdLQLl9ixLzFkTLSlRXMRTRtk3a0hVI7vXY5POwnxuyqKEKhNTaqis9yi+bm0wAtza4/uw0ZdjFNmV7b47KSUFmlzdze8CHgLEkhk6x3i0eBUb0av+NLS8oz4pYg==
|
||||
template:
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: paperclip-oidc-secret
|
||||
namespace: platform-prod
|
||||
type: Opaque
|
||||
16
apps/platform-prod/paperclip-session-secret-sealed.yaml
Normal file
16
apps/platform-prod/paperclip-session-secret-sealed.yaml
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
---
|
||||
apiVersion: bitnami.com/v1alpha1
|
||||
kind: SealedSecret
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: paperclip-session-secret
|
||||
namespace: platform-prod
|
||||
spec:
|
||||
encryptedData:
|
||||
secret: AgCQntkVAWf6xX1Gv1f1Wx7NVc42nUMSTktjeI8xv1t4Uia4Sk6q1YQWFfoksxT4zlQJlR+ObctV97+h4AXiKYuVYXfF3CkQzdG5BAvOvhowo7LtUHkh+k3m9j/8MuO2l1ud1QKPNYV2Bi/vJ+x4ifX31l8QZexitVusb31KMWc1wDoRuIo4Ntk9BCIuEA9ctg7XbG1t17pMGMHGasL0vYb2fN/GePFKhaFoe00ZThZBAI2er4pVM5AV6Q33xQTXTAN5VWJKu65/NeGi+xeUXs0/I7oOesHKf0G51zjUT2I01ZtaFTmX0hzBuKCRA/SNyq5IT0+V46euItgD/vg8HAj8J5yVyvoaAtg9Ts44QsPOmkuXGpCsCj4PmhE8ZZVXarH8t5qmdWXwbgR9sR8+3mUAP2pnq8D0CNLowLmxE9HVPuUxWIsCpBHAc6f9eH8jclT+H/KmaW7wcaIIuMB3BH3Si6ZanCBKpy0oz0qKllHQt+l1W7nA8W4hXR1h2aVOOThzUbtg/j+xAmJz+pfQx9KUaucLZxa3/ZdQFtVOU8dF6slQcIrt+OB8XXebTk/LGJDgO27sGKjY46kRFkIIJ6U/SLvsyfrZNTHxMqSariQQosekqkNZ+ME3wRE5D8UgQtRfkK44KwyU/zKjXCDgXBIAI9gNJRs77yAzPeQv4AoKGVTQ60Li2bA2PMoPjYHY9gGtYNssa/XEQISoEw5dYzRGJOLbtgjA1ZLUrR5nIWUHn5ntff84e0SsumI7AQ==
|
||||
template:
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: paperclip-session-secret
|
||||
namespace: platform-prod
|
||||
type: Opaque
|
||||
16
apps/pocket-id/pocket-id-secrets-sealed.yaml
Normal file
16
apps/pocket-id/pocket-id-secrets-sealed.yaml
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
---
|
||||
apiVersion: bitnami.com/v1alpha1
|
||||
kind: SealedSecret
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: pocket-id-secrets
|
||||
namespace: pocket-id
|
||||
spec:
|
||||
encryptedData:
|
||||
ENCRYPTION_KEY: AgBM639EX8/HwWMnseTcoch5BgSFTXwgeMjEoC7/bwxeJq9SDmtDKSI4y57+deHv3JxaoqjitJ2N+oK1SS6lLd1odx/9nVarzu2OMFUg0Jj9TlZybe+lSoIBkqTU7P9O3jznybrVfqOowlWVJznucSiVOlrJfYgqOaGmAW3bNZ/oQCmFNIb2fu68sltuOMLYS0AgPrkWxn8vr7Js1MeoVx9gbq75RwW9mpOkvSQOPupiYFdjMUNHR/ye2bE/yyT/sZZ1xjzL5ImKmSL3khMsriAio/o/019sftZ7AWWRsyYGWtPvFz/FTgQEDoBGztep5D3MU4yKYMxvkX/q5BLP5K5+qkt1UypsytAUtjIqY4+aU63Na5yGoXSZIGXJ80E1yJjGnyRRP8WVADM42QXX8yXMerlP0pyfchYJHXklU0n3QlDftHXjIn+BYODwRsPaNIXrbLnfQfq7chUqHAxA7URhtlnghMhZki0sxdLpjmtvLa1vSw0kGdjGsE14GxJqHmpdHU2axPhENh9oDH/9pYWZEbZiN6RzI+aWqU0h5c8covX0Lu3UX1QViTTAgMg8Ecc7JTbq6VJd7BgjdUfE4RIaE+BuOT4A2LOZaI6ycUDYESfphRtotbMwIWIHQdXXrniP3UJk2pv6ZxSN7JwiemNKLNIyPi5pvamvJDefIKjyVb/XNmJvvDosw2Sd7+3j+nHld9ktlA++eqmjk7Xoi6RZk6saQiXDT/bv7uv2ycsUKQOeoaVWrZ+WUdcavQ==
|
||||
template:
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: pocket-id-secrets
|
||||
namespace: pocket-id
|
||||
type: Opaque
|
||||
54
apps/stalwart/README.md
Normal file
54
apps/stalwart/README.md
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
# Stalwart Mail Server Deployment
|
||||
|
||||
This directory contains the complete deployment configuration for the Stalwart mail server on the basicstack.de cluster.
|
||||
|
||||
## Files Overview
|
||||
|
||||
### Deployment Manifests
|
||||
- `stalwart-deployment.yaml` - Basic deployment configuration
|
||||
- `stalwart-deployment-new.yaml` - Updated deployment variant
|
||||
- `stalwart-deployment-with-oidc.yaml` - Deployment with OIDC integration
|
||||
- `stalwart-deployment-oidc-only.yaml` - OIDC-only authentication deployment
|
||||
|
||||
### Helm Configuration
|
||||
- `stalwart-values.yaml` - Main Helm values file
|
||||
- `stalwart-values-fixed-ports.yaml` - Values with corrected port configurations
|
||||
- `stalwart-values-correct.yaml` - Verified correct values
|
||||
- `stalwart-helm-values-oidc.yaml` - Helm values for OIDC setup
|
||||
- `stalwart-helm-fix.yaml` - Helm chart fixes
|
||||
|
||||
### Configuration
|
||||
- `stalwart-oidc-config.yaml` - OIDC provider configuration
|
||||
- `stalwart-config-fix.yaml` - Configuration corrections
|
||||
- `stalwart-config-fix-v2.yaml` - Updated configuration fix
|
||||
|
||||
### Monitoring
|
||||
- `stalwart-monitoring.yaml` - Prometheus ServiceMonitor and metrics
|
||||
- `stalwart-dashboard-configmap.yaml` - Grafana dashboard configuration
|
||||
|
||||
### Maintenance
|
||||
- `stalwart-console-pod.yaml` - Debug/console pod for troubleshooting
|
||||
- `stalwart-service-patch.yaml` - Service configuration patch
|
||||
- `stalwart-statefulset-patch.yaml` - StatefulSet patches (v1, v2, v3)
|
||||
|
||||
### Documentation
|
||||
- `stalwart-backup-restore.md` - Backup and restore procedures
|
||||
- `stalwart-bootstrap-completion-guide.md` - Initial setup guide
|
||||
|
||||
## Deployment Notes
|
||||
|
||||
This is a reference implementation showing the evolution of a production deployment. Multiple variants are preserved to show:
|
||||
- Different authentication strategies (local vs. OIDC)
|
||||
- Configuration iterations and fixes
|
||||
- Monitoring integration
|
||||
- Operational procedures
|
||||
|
||||
When deploying a new service, you don't need this many files - choose the appropriate manifest for your use case and adapt it.
|
||||
|
||||
## Current Production Deployment
|
||||
|
||||
Review the files to determine which manifest represents the current production state, or check the cluster directly with:
|
||||
|
||||
```bash
|
||||
kubectl get deployment,statefulset -n stalwart
|
||||
```
|
||||
22
apps/stalwart/stalwart-admin-credentials-sealed.yaml
Normal file
22
apps/stalwart/stalwart-admin-credentials-sealed.yaml
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
---
|
||||
apiVersion: bitnami.com/v1alpha1
|
||||
kind: SealedSecret
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: stalwart-admin-credentials
|
||||
namespace: stalwart
|
||||
spec:
|
||||
encryptedData:
|
||||
admin-email: AgA6gOWZpJVbz0mLCBwyGwpnSLDAYSyUhVeipZ01IDsQ5P8AKuFJbdVPTcD6TrsIehCIzf8Sid5dSV1yxkztKqz0Zp0mT+4JJu7cvSVCk1SdYHU/RDtzppV/OWlr5o19cLtU31eSnkOWNNxlCYa0VCNujwCwtJ1KcccLTDSXd8tFJc/iVVOjt2W9wrLRIGE0iKfGdAwkfhY8KAZyV9AKphbijUf8fYO9X1Xk4CKUEVZNHGQMH4pIths+KwbW4FX0oG97QaBThiH8owFeAEi3lpGBgF0Dbp/vKzmmafJbEVnvyoPTH3PF1BEhc6uvluiRgzJ8D8Rqpk9+arEGUTyesZJN4gcVE+Jyu7wHuAsCM9uBYz2EM8k/wg7Fgatd8udKdppXonP+y3a2qgbUxru2FDffTtg2nAW/yG2fYmViKOFDOAMBafe1CLUMTr7immv156iJWyIZxBNP9PeF1UFSM1Ndkxc06/MP+xXKR32NRGNlCFEp/NhbydCJbrpmAi+KyJBLNhS7krKMmgza3HApwYRoXmjVjpVoc3jYYXjxD0PEYVXmmj6m90olAUao+g4DBTKCHocpi/PNoIgbJ4EApqvTMs59IGa0v870EerLmdn2ypM+K62XUBzSPU0erYOCUQriSKGbOqWOfyZLdohhvbsxbp3GXG6o1HLQ3wuuZ5TnW9/ks1++sOczuOU+mHdqc4FaRvohMNqPlcpLD2K7QtDzNVtq
|
||||
admin-password: AgCGkbKLoN+KEU8yZmfPu5j45KoHssDoL6TfCefanaWlv5NP81GUA2iVH1asg4aCW9exfSyhho7Pu+tG+MtU5PCMBghusKaGYsnD6c0URJhBELjiSvzicJlvpZNRew3b66jComtXt/7pdbxq61jB+xpbjO0qReMkhYeJ5gKWrMWbXPMJZrrEOn8idrtjeNPyKuBL82bf/O8ID+g/OUdODAEdprmWSJxYARQMnQysAN0865iDxWKaTxS/3edAxomRlYmIwn9UgXDH/1kwc+XEZErfwDiT/eMUz8Bku3vbzr1Im4jzqZUT/Iy+7vCBLVxSAIZ/8mH1qvnUPUV6JhQ/nxf9JYlMQPp3mBk0DDfkxU5A7dP+l0TrJEnaYUCK45c4XIQ0RbM1ckWyJ52Leyqoy0W0/fH2SxyycVe4zw92nbX7+m4phoVKtZgARMKQybPpmVeylqDqwa+HEtN5eODg0oJg6d1xVyw8mP3LTyrzLRMzFZ3/C2aGKKPK1UdJls+biS0U+TBXEQehYBRmkN9dZlgYbqBkJQKHwWp5Fjw4qmu7WL8WivBlyzPeCxESAcLBDC7NvKwm/vGl09Gwks0y8JbGkyWfv8iFHdRU0+UXLKVYYXfYnBIRssw4yVh3COQ1yv5C40XGfduYkdh+pZ29Qv553WPlfH2dgNzw0So35LTeEc7+C7bTzWCAXEdyhsrDu4eDUTyZh6OOBG4EWX2X94A/qftX7VbsQzHLAfbbdY61Bn1L2z37hVEoOuXx1w==
|
||||
andreas-email: AgBEqHQPc5maUzyPhsQoGdnmKcqPkDafZZDEFWHEjsSekzb3cNYZyzK7aLtY3HK64IyK7mqAlKOAn2bKhr6BCVR2wE61Fe6OwqfwF1VKjC22BQIECNkcVoSJxi64LdaOMzZ3Y0JMdA/h3Jrnf7lQLPzMi7+T53A9h8qUTE2TzyeIeu9e8W3ZIo8UNC/Hjo4GODKWr7DN8wSwm2u5vogMS9mzes08e0QFApQpEAfaZJ+aKbm9ayBjQS+Zjt6hVTI+iYWMxEFmuHi7eqoMeJRAofaVibQKJu/F6rCG9noJs4Y11KYjXorI1cIq8pg40EScfiLQOoTXemn6uI9P6vIzFAEm+r/Pl0HFwZDyrOoXi14QD7RLnIQHXZiyrYehUhKbyg6POE70rDOp9r/M4REL/4dCP4ifGqlnAgvhyCsxHDWNaxsmc8MHzybxkeOSpaQCKYAwQzGRbU9hCrsY8XVb0HYqTejrTSX8FqAMzavRAcFTsOACB2rXXh25OJmdNpPSeXpwiGQ7lhq1+yLn1TDCNiMkuSvFTjNTmP/wTgkzdCUQTwOY9gOeUrn7jZ68xWTcxxGQrE3qdxgCfvTH8C8icz5FA89gEYHBlr+dUvY9Tst1fCn/UhYqfrLjEO/izDS3li43QzdkNwNdwED96sRamEU5lJX9ivN+G9MMIOZ0TvTgffDQqEBHOZxisX+7eeMdoz5S6t9aUJCeJB8pFEniOMBbrsSHYn7VkcI85aLz
|
||||
andreas-password: AgAZzQK5pwXwpwxcle8Rmr8k0mL2qVIY2biFPRJRZWNpLy92aQZWqe3mgMecH4ZlP/nuSMKo7dFbT/GxGd+uZC5SRDW044Gzt69wuQ+52wwoNNQdHAx2IU5UkUFAz4JjOvYzY6atHbF7yFxcq+MQxnWJHGQp3+/jacUo41imtD7gq/xVVw2QK1KPRdbHRg5B9o+EPHGDHjCWcOLlsaeaTNb2Q0K45E0yh8LoWTFRSWof7N+pFXOIhSU6pNlZMOD8SsHME+tR6jKAF5y7MIH/0Hh+ngzS3Cec/u+2d/du7dFvRqrrxLmFXA5oGm16ovC7w3Js4XFJICax1k23lx4erATDT6hbqkP8EGGjHAfnMKLmqWy4BPrM2QOk3omVDJj6a18r5BI06mX/uy/vzfz3SLR9sPzPcHxDJg6ExdRpGlh6fIg+j4Dr4qdQoruJcvKIX8nGCETH8dI83suSpjlk9NSWdmfn0eHQT+qdS729JRo6vqv/jRV3cYcGhNAtqhSebzQbSzara/ui9OSsKt+nRqL13xejM5307cZ0uixiB3WxI9MxK3YcrdQxJlw1TC/ddX3/oyzZJqG0EqxBFm7PQ3Wy+kAdIrPNRg0Bb2npvWsBaFWtFpPsbzyAlZPhb3gP1wgwxT+4OLf72n5UDjGZH38MQeRrels1LREhsoIdUQmG4y7/C9J59KOVCjO2Hb/8HPDFzS936syzBSEPRRRb3C5Y7erfIgu6AFuELPQcQQjle9i/OpoqmftNaQ4MDw==
|
||||
paperclip-email: AgCimQ3gZPas6mcLbubokHVJdmqya3hebD6ZaEb40xPqPydXgR7w7BM4cQ3SbJN1+PGWfZUaTUdI2AydpnlRckkgY/QR1nrIOCKTnvF17F3iCWcFkweWlbeDegNvrc09lllSxfhn7fcHwwwnO4dVNi2M/mxbsGcEgSQEODS3Eh+KPnbXz9el1ArFTr8E/1RH71sEh4ZP5Vb4fv0+1kybWuBskJ68H+wNHxVXdUQLtUTHVlN5eqNkHrHqfgExhtSrSMnmuw2p9MOI8qJhdBoIyrgz04VqCFWKMD3Tc649l5nkJcgz9oAVHKsoL1D1zyqWdnDMuZ2XLpFL8fa+fF7zwh+leGMXMd2OeMa79z3oxP1vTRuK+GYnYJ6D6vjxEQD4V+6VArqCOOJDInAklVgCtrUyHDvZ0dWHDw/4IN8B0ITqTavHEPpOKULlzdDQpqD4/QyLT/YT5Ede+clEDNhvTanLAH57bk2TXAYKExQnKJvU0ct3cOpVzSEG5v+ZPiJ2llNKw8cC3LTCk3eGr1KaSRezTJfKATroJuLVlH00MqfXDNLRm5zBmIz0NMJFzsE5n3JS8IyMLeNqYw7rDncXyOo29sCnUG0OPaEtKrOuggl8YWfDC5OHzUZsQorkpsil7v6dBO/ZQk6OpRY1V/KTzptWDAC94FD7KsPGR5RKJEu1uV7o4Wu8VotQ0bqnMTLV9gOoG/E2Gm2o6KiwQqh2lHlWoWpLMytcpw==
|
||||
paperclip-password: AgAA74Yj0aKe18zRqinlKT8NaV1U3x+71gWMaE3eQ+SYI9S/9PTiFNJQ2aNVEFl/vdIhKli/F+LVQZ5dBBu7ryoTQbfJUSTJaCguuQTbOVRNpHm8/aqT+PbJUzfHrCM125o5rah0YITmkOyv8M2ZUW2tFic5xyTZQ3SDRQrhxxbIKbSWQ44rBkwhTBAKxFBd7wR/hMH7NYvmcLXchcIJHwPEsgGrsEegIyc0LONWXlx5uzjdRNkvA4MWnoc5lFpu3ndCks3OnkAYlHd7PFKAYWhWJWGJswSoNLagxerQdik/yLbadH/29eLkYG5Hcgle2SaonBVxpDFsfmenkDAEIY7xbgmJk3ZbCo+27ykSWoNyZN5DnFKhzQ/eYOh/yrW8oMHJbt698nKR4BGvP1BRj3xOJiBxVmCzXcZtkN3lRBh+VvXLHrs0K8vKmJJ9MSqF51TzCg+tYZH0lBi1fy2qh96qCVObR86drh5VQrKVmAioVhqezsW60WMOVko8vzUNWG1nWvVjDTWGffprtS+3ddiTJ42d2S8HhpJiQKq942LwkC/AUzceXPEjyW6SVFp49nMo9mFpQr2aZvxKzu2cQE32XeMfEQq9tVF58iBXg6a1N9TVP5J4rSLUR1kmGnwrxHzVnZcNMKLTgUxNZLu71kIwru/lGaLh141RWzKDpOG75e3afjwX+NhkBgDruTV32pM+Yf84b5zxewrFWGuRaMD+Qonqxbz+0aUzq3KxZ3FY1YJqtSoB73iGdtIyBA==
|
||||
recovery-admin-password: AgB3QBYlyS7D71xR0ohvyxmfUIvgplaGjEj5RAqEY5fvKcksNjA8i3FEY3WZzKcxymG9L1ePsmxgUJUZNYbwnO9TwkaeDfEuPHlWiG271XXrQrYDl4ftCGKlRbMuY3DBZSwMB5OvC+1+PEKCxeN5J5eO2VjjFp6eUBgD4RzBFFvQV4D9kwWIJ1IIG/PidLJhf78PPoSUK46FXGuQlBKozjefaofIycWowDSFtTdotJyXbIr51iwNOyTsq5rcd1Z7EEGwrVpKYGpXJulsILImp1YJ4PUMowTwFWaj4R5/nEoteVenJM3o6a9CY7c31VDObDouAhrCa/k/onAmVrxFFAMKTHLtfORQMcOSR8vyioB41WMgBzGa4MyqdgnUSV91aYANCx1TveGqcROtMUo1WQwk3LzJNHPtxp/0ZrfDWDS1kgznajs12GRmfWI7NB90GbsirfcZedgg4FkdeSAFgL7Nb3BhoK06Fp794w8FlEGJATyoS1BdB+6aai7TPhLL8quN9jQuA8cVHI8vVjF+vDUAUtIad7XXhcGVs6E//fdY4I8dVX1L8TjpvrYZFkXOZzVOi6LCLgFbNf1IStYd8AX22RTZs1ny9EDyBXRdawwpXCm4y07e5P/4/vXVOTtmA11uzzzeZ4kfdbv78alJ4WzZO17lG/jX3aakOHL99MH2GZt/1lvHMpfY8UV4lM2u9T9zfJ4lvT2g6fCLlET6ivMubskwiOunYKiAcSQG8NqFiJDhZN/OF2zSApNqfQ==
|
||||
template:
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: stalwart-admin-credentials
|
||||
namespace: stalwart
|
||||
type: Opaque
|
||||
230
apps/stalwart/stalwart-backup-restore.md
Executable file
230
apps/stalwart/stalwart-backup-restore.md
Executable file
|
|
@ -0,0 +1,230 @@
|
|||
# Stalwart Mail Server — Backup & Restore Procedures
|
||||
|
||||
## Overview
|
||||
|
||||
Stalwart stores all data in a RocksDB database mounted at `/opt/stalwart-mail` on a 20Gi encrypted hcloud volume (`hcloud-volumes-encrypted` storage class).
|
||||
|
||||
## Backup Strategy
|
||||
|
||||
### Option A: Hetzner Volume Snapshots (Recommended)
|
||||
|
||||
Hetzner Cloud provides volume snapshots that capture the full encrypted volume state.
|
||||
|
||||
#### Manual Snapshot via hcloud CLI
|
||||
|
||||
```bash
|
||||
# Get the volume ID
|
||||
bin/hcloud volume list | grep stalwart
|
||||
|
||||
# Create a snapshot (works even while volume is mounted — RocksDB is crash-safe)
|
||||
bin/hcloud volume snapshot create <volume-id> --description "stalwart-backup-$(date +%Y%m%d)"
|
||||
```
|
||||
|
||||
#### Scheduled Snapshots (Daily)
|
||||
|
||||
Create a CronJob in Kubernetes to automate snapshots:
|
||||
|
||||
```yaml
|
||||
# Requires hcloud CLI and API token in a secret
|
||||
apiVersion: batch/v1
|
||||
kind: CronJob
|
||||
metadata:
|
||||
name: stalwart-snapshot
|
||||
namespace: mail
|
||||
spec:
|
||||
schedule: "0 3 * * *" # 3 AM daily
|
||||
jobTemplate:
|
||||
spec:
|
||||
template:
|
||||
spec:
|
||||
restartPolicy: OnFailure
|
||||
containers:
|
||||
- name: hcloud-snapshot
|
||||
image: alpine:latest
|
||||
command:
|
||||
- /bin/sh
|
||||
- -c
|
||||
- |
|
||||
apk add --no-cache curl jq
|
||||
VOLUME_ID=$(curl -s -H "Authorization: Bearer $HCLOUD_TOKEN" \
|
||||
https://api.hetzner.cloud/v1/volumes | \
|
||||
jq -r '.volumes[] | select(.name | contains("stalwart")) | .id')
|
||||
curl -X POST -H "Authorization: Bearer $HCLOUD_TOKEN" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "{\"description\": \"stalwart-auto-$(date +%Y%m%d)\"}" \
|
||||
https://api.hetzner.cloud/v1/volumes/$VOLUME_ID/actions/create_snapshot
|
||||
env:
|
||||
- name: HCLOUD_TOKEN
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: hcloud-credentials
|
||||
key: token
|
||||
```
|
||||
|
||||
### Option B: Filesystem-Level Backup
|
||||
|
||||
Back up the data directory while Stalwart is paused or using a consistent snapshot.
|
||||
|
||||
```bash
|
||||
# Scale down Stalwart (brief downtime)
|
||||
kubectl scale deployment stalwart -n mail --replicas=0
|
||||
|
||||
# Exec into a temporary pod with the same PVC
|
||||
kubectl run backup-helper --image=alpine --restart=Never \
|
||||
-n mail \
|
||||
--overrides='{"spec":{"volumes":[{"name":"data","persistentVolumeClaim":{"claimName":"stalwart-data"}}],"containers":[{"name":"backup-helper","image":"alpine","command":["sleep","3600"],"volumeMounts":[{"name":"data","mountPath":"/opt/stalwart-mail"}]}]}}'
|
||||
|
||||
# Copy data out
|
||||
kubectl cp mail/backup-helper:/opt/stalwart-mail ./stalwart-backup-$(date +%Y%m%d)
|
||||
|
||||
# Clean up helper pod
|
||||
kubectl delete pod backup-helper -n mail
|
||||
|
||||
# Restore Stalwart
|
||||
kubectl scale deployment stalwart -n mail --replicas=1
|
||||
```
|
||||
|
||||
### Option C: Stalwart Admin API Backup (Config Only)
|
||||
|
||||
Backup the configuration without downtime:
|
||||
|
||||
```bash
|
||||
# Backup config via Stalwart admin API
|
||||
curl -u admin:PASSWORD https://mail.paperclip.cloud/api/store/backup \
|
||||
-o stalwart-config-backup-$(date +%Y%m%d).zip
|
||||
```
|
||||
|
||||
## Restore Procedures
|
||||
|
||||
### Restore from Volume Snapshot
|
||||
|
||||
1. **Create a new volume from the snapshot**:
|
||||
```bash
|
||||
bin/hcloud volume create --name stalwart-restore --size 20 \
|
||||
--snapshot <snapshot-id> --location fsn1
|
||||
```
|
||||
|
||||
2. **Scale down Stalwart**:
|
||||
```bash
|
||||
kubectl scale deployment stalwart -n mail --replicas=0
|
||||
```
|
||||
|
||||
3. **Delete old PVC** (after backing up the PV name):
|
||||
```bash
|
||||
PV_NAME=$(kubectl get pvc stalwart-data -n mail -o jsonpath='{.spec.volumeName}')
|
||||
kubectl delete pvc stalwart-data -n mail
|
||||
```
|
||||
|
||||
4. **Create PV pointing to restored volume**:
|
||||
```bash
|
||||
RESTORED_VOLUME_ID=<new-volume-id>
|
||||
kubectl apply -f - <<EOF
|
||||
apiVersion: v1
|
||||
kind: PersistentVolume
|
||||
metadata:
|
||||
name: stalwart-restored
|
||||
spec:
|
||||
capacity:
|
||||
storage: 20Gi
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
persistentVolumeReclaimPolicy: Retain
|
||||
storageClassName: hcloud-volumes-encrypted
|
||||
csi:
|
||||
driver: csi.hetzner.cloud
|
||||
volumeHandle: "$RESTORED_VOLUME_ID"
|
||||
EOF
|
||||
```
|
||||
|
||||
5. **Create PVC bound to restored PV**:
|
||||
```bash
|
||||
kubectl apply -f - <<EOF
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: stalwart-data
|
||||
namespace: mail
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
storageClassName: hcloud-volumes-encrypted
|
||||
resources:
|
||||
requests:
|
||||
storage: 20Gi
|
||||
volumeName: stalwart-restored
|
||||
EOF
|
||||
```
|
||||
|
||||
6. **Scale Stalwart back up**:
|
||||
```bash
|
||||
kubectl scale deployment stalwart -n mail --replicas=1
|
||||
kubectl rollout status deployment stalwart -n mail
|
||||
```
|
||||
|
||||
7. **Verify restoration**:
|
||||
```bash
|
||||
kubectl logs -n mail deployment/stalwart --tail=20
|
||||
curl -k https://mail.paperclip.cloud/api/principal -u admin:PASSWORD
|
||||
```
|
||||
|
||||
### Restore from Filesystem Backup
|
||||
|
||||
```bash
|
||||
# Scale down Stalwart
|
||||
kubectl scale deployment stalwart -n mail --replicas=0
|
||||
|
||||
# Create restore helper pod
|
||||
kubectl run restore-helper --image=alpine --restart=Never \
|
||||
-n mail \
|
||||
--overrides='{"spec":{"volumes":[{"name":"data","persistentVolumeClaim":{"claimName":"stalwart-data"}}],"containers":[{"name":"restore-helper","image":"alpine","command":["sleep","3600"],"volumeMounts":[{"name":"data","mountPath":"/opt/stalwart-mail"}]}]}}'
|
||||
|
||||
# Wait for pod
|
||||
kubectl wait pod restore-helper -n mail --for=condition=Ready
|
||||
|
||||
# Clear existing data and restore
|
||||
kubectl exec -n mail restore-helper -- rm -rf /opt/stalwart-mail/*
|
||||
kubectl cp ./stalwart-backup-YYYYMMDD/. mail/restore-helper:/opt/stalwart-mail/
|
||||
|
||||
# Clean up helper
|
||||
kubectl delete pod restore-helper -n mail
|
||||
|
||||
# Scale back up
|
||||
kubectl scale deployment stalwart -n mail --replicas=1
|
||||
```
|
||||
|
||||
## Snapshot Retention Policy
|
||||
|
||||
Recommended retention:
|
||||
- **Daily snapshots**: Keep 7 days
|
||||
- **Weekly snapshots**: Keep 4 weeks
|
||||
- **Monthly snapshots**: Keep 6 months
|
||||
|
||||
Hetzner snapshots are billed at €0.01/GB/month, so a 20GB volume costs €0.20/month per snapshot.
|
||||
|
||||
## Testing Backup/Restore
|
||||
|
||||
Test the restore procedure quarterly:
|
||||
|
||||
1. Create a snapshot
|
||||
2. Create a new volume from the snapshot in a test namespace
|
||||
3. Deploy a test Stalwart instance pointing to the restored volume
|
||||
4. Verify mail data is accessible via admin API
|
||||
5. Delete test resources
|
||||
|
||||
```bash
|
||||
# Verification test command
|
||||
kubectl run test-restore --image=curlimages/curl --restart=Never \
|
||||
-n mail -- curl -k -u admin:PASSWORD \
|
||||
https://mail.paperclip.cloud/api/principal
|
||||
kubectl logs test-restore -n mail
|
||||
kubectl delete pod test-restore -n mail
|
||||
```
|
||||
|
||||
## Recovery Time Objectives
|
||||
|
||||
| Scenario | RTO | RPO |
|
||||
|----------|-----|-----|
|
||||
| Pod crash | ~30 seconds | 0 (persistent volume) |
|
||||
| Node failure | ~2 minutes | 0 (PVC reattaches) |
|
||||
| Volume corruption | 30-60 minutes | <24 hours (last snapshot) |
|
||||
| Data center failure | 1-2 hours | <24 hours (manual restore to new region) |
|
||||
162
apps/stalwart/stalwart-bootstrap-completion-guide.md
Normal file
162
apps/stalwart/stalwart-bootstrap-completion-guide.md
Normal file
|
|
@ -0,0 +1,162 @@
|
|||
# Stalwart 0.16 Bootstrap Wizard Completion Guide
|
||||
|
||||
## Current Status
|
||||
|
||||
- ✅ Pod running: `stalwart-0` in namespace `stalwart`
|
||||
- ✅ JMAP API accessible (tested)
|
||||
- ✅ OIDC credentials prepared in Kubernetes secret
|
||||
- ⏳ Bootstrap wizard awaiting completion
|
||||
|
||||
## Bootstrap Access Credentials
|
||||
|
||||
**URL**: https://mail.basicstack.de/admin
|
||||
**Username**: `admin`
|
||||
**Password**: `YFMySjQYfMB3tYZa`
|
||||
|
||||
> **Note**: These credentials are valid only until the bootstrap wizard is completed, then they will be automatically disabled.
|
||||
|
||||
## OIDC Configuration Details
|
||||
|
||||
Retrieved from Kubernetes secret `stalwart-oidc` in namespace `stalwart`:
|
||||
|
||||
```
|
||||
Client ID: 0f37a0e3-8d3b-4413-a394-36226f42a980
|
||||
Client Secret: LPo8VejJXznisTQ87TGAs4Ad0Typ1MJw
|
||||
Issuer URL: https://auth.basicstack.de
|
||||
Redirect URI: https://mail.basicstack.de/admin/oauth/callback
|
||||
Scopes: openid profile email
|
||||
```
|
||||
|
||||
## Step-by-Step Bootstrap Wizard Completion
|
||||
|
||||
### Step 1: Access Bootstrap Interface
|
||||
|
||||
1. Open browser to: https://mail.basicstack.de/admin
|
||||
2. Login with bootstrap credentials:
|
||||
- Username: `admin`
|
||||
- Password: `YFMySjQYfMB3tYZa`
|
||||
|
||||
### Step 2: Configure Data Store
|
||||
|
||||
The wizard should show the data store configuration. This is likely auto-configured:
|
||||
|
||||
- **Type**: RocksDB
|
||||
- **Path**: `/opt/stalwart-mail/data`
|
||||
|
||||
Verify the settings and proceed.
|
||||
|
||||
### Step 3: Set Up OIDC Authentication
|
||||
|
||||
Configure OAuth/OIDC provider with these exact settings:
|
||||
|
||||
| Field | Value |
|
||||
|-------|-------|
|
||||
| Provider Name | Pocket ID |
|
||||
| Issuer URL | `https://auth.basicstack.de` |
|
||||
| Client ID | `0f37a0e3-8d3b-4413-a394-36226f42a980` |
|
||||
| Client Secret | `LPo8VejJXznisTQ87TGAs4Ad0Typ1MJw` |
|
||||
| Redirect URI | `https://mail.basicstack.de/admin/oauth/callback` |
|
||||
| Scopes | `openid profile email` |
|
||||
|
||||
**Authorization Endpoint** (auto-discovered): `https://auth.basicstack.de/api/oidc/authorize`
|
||||
**Token Endpoint** (auto-discovered): `https://auth.basicstack.de/api/oidc/token`
|
||||
**UserInfo Endpoint** (auto-discovered): `https://auth.basicstack.de/api/oidc/userinfo`
|
||||
|
||||
### Step 4: Create/Link Administrator Account
|
||||
|
||||
Choose **Option A** (recommended): Link to Pocket ID user
|
||||
|
||||
- When prompted, link the admin account to a Pocket ID user
|
||||
- The Pocket ID OIDC client is already configured with group restrictions
|
||||
- Only users in the `Stalwart-admin` group can access
|
||||
|
||||
If the wizard requires creating an internal admin first:
|
||||
- Create a temporary internal admin
|
||||
- Link it to OIDC
|
||||
- The bootstrap password login will be automatically disabled after setup
|
||||
|
||||
### Step 5: Disable Password Authentication (if prompted)
|
||||
|
||||
- **Web UI Authentication**: OIDC only
|
||||
- **Mail Client Authentication**: Uses internal directory (separate from web UI auth)
|
||||
|
||||
This ensures the web admin interface only accepts OIDC login while mail clients continue to work normally.
|
||||
|
||||
### Step 6: Complete Setup
|
||||
|
||||
1. Review all configuration
|
||||
2. Click "Complete Setup" or equivalent final button
|
||||
3. The system will:
|
||||
- Save configuration to RocksDB
|
||||
- Exit bootstrap mode
|
||||
- Disable the bootstrap credentials
|
||||
- Enable OIDC authentication
|
||||
|
||||
### Step 7: Verify OIDC Login
|
||||
|
||||
1. Log out from the bootstrap session
|
||||
2. Access https://mail.basicstack.de/admin again
|
||||
3. Click "Login with Pocket ID" or the OAuth login button
|
||||
4. Should redirect to https://auth.basicstack.de for authentication
|
||||
5. After successful Pocket ID login, should return to Stalwart admin interface
|
||||
|
||||
## Post-Bootstrap Verification
|
||||
|
||||
Run these commands to verify the configuration:
|
||||
|
||||
```bash
|
||||
# Check pod is still running
|
||||
export KUBECONFIG=/paperclip/instances/default/workspaces/b4536334-39f2-4e05-b2f1-bb0e4670fba8/k3s.kubeconfig
|
||||
/paperclip/instances/default/workspaces/b4536334-39f2-4e05-b2f1-bb0e4670fba8/bin/kubectl get pods -n stalwart
|
||||
|
||||
# Test JMAP API (should still work with OIDC credentials now)
|
||||
curl -s -X POST https://mail.basicstack.de/jmap \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"using":["urn:ietf:params:jmap:core"],"methodCalls":[["Core/echo",{"test":"post-bootstrap"},"0"]]}'
|
||||
|
||||
# Verify management API is now accessible
|
||||
curl -s https://mail.basicstack.de/api/session
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Issue: Cannot access bootstrap UI
|
||||
- Verify pod is running: `kubectl get pods -n stalwart`
|
||||
- Check pod logs: `kubectl logs stalwart-0 -n stalwart`
|
||||
- Verify ingress: `kubectl get ingress -n stalwart`
|
||||
|
||||
### Issue: OIDC login not working after setup
|
||||
- Check Stalwart logs for OAuth errors
|
||||
- Verify redirect URI matches exactly
|
||||
- Confirm user is in `Stalwart-admin` group in Pocket ID
|
||||
- Test Pocket ID OIDC client directly
|
||||
|
||||
### Issue: Bootstrap credentials don't work
|
||||
- Pod may have been restarted and new credentials generated
|
||||
- Check parent issue DEV-155 for any updates
|
||||
- May need to restart the pod or check the deployment
|
||||
|
||||
## Security Notes
|
||||
|
||||
- Bootstrap credentials automatically expire after setup completion
|
||||
- OIDC client secret is stored in Kubernetes secret `stalwart-oidc`
|
||||
- Access restricted to `Stalwart-admin` group members only
|
||||
- All communication over HTTPS/TLS
|
||||
|
||||
## References
|
||||
|
||||
- Parent Issue: DEV-155
|
||||
- OIDC Client configured in Pocket ID (client ID: 0f37a0e3-8d3b-4413-a394-36226f42a980)
|
||||
- User Group: `Stalwart-admin` (group ID: 99ffc3ae-0112-4fa0-bec9-90da19bdaddd)
|
||||
- Pocket ID: https://auth.basicstack.de
|
||||
- Stalwart: https://mail.basicstack.de
|
||||
|
||||
## Acceptance Criteria Checklist
|
||||
|
||||
- [ ] Bootstrap setup wizard completed
|
||||
- [ ] OIDC authentication configured with Pocket ID
|
||||
- [ ] Can login to web UI via Pocket ID
|
||||
- [ ] Password login disabled for web UI
|
||||
- [ ] Bootstrap mode exited
|
||||
- [ ] Configuration saved to RocksDB
|
||||
- [ ] Management API responding (not "no available server")
|
||||
78
apps/stalwart/stalwart-config-complete.json
Normal file
78
apps/stalwart/stalwart-config-complete.json
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
{
|
||||
"store": {
|
||||
"data": {
|
||||
"type": "rocksdb",
|
||||
"path": "/var/lib/stalwart/data"
|
||||
},
|
||||
"blob": {
|
||||
"type": "rocksdb",
|
||||
"path": "/var/lib/stalwart/blobs"
|
||||
}
|
||||
},
|
||||
"directory": {
|
||||
"internal": {
|
||||
"type": "internal",
|
||||
"store": "data"
|
||||
}
|
||||
},
|
||||
"server": {
|
||||
"hostname": "mail.basicstack.de",
|
||||
"listener": {
|
||||
"management": {
|
||||
"bind": ["[::]:8080"],
|
||||
"protocol": "http"
|
||||
},
|
||||
"smtp": {
|
||||
"bind": ["[::]:25"],
|
||||
"protocol": "smtp"
|
||||
},
|
||||
"submission": {
|
||||
"bind": ["[::]:587"],
|
||||
"protocol": "smtp"
|
||||
},
|
||||
"submissions": {
|
||||
"bind": ["[::]:465"],
|
||||
"protocol": "smtp",
|
||||
"tls": {
|
||||
"implicit": true
|
||||
}
|
||||
},
|
||||
"imap": {
|
||||
"bind": ["[::]:143"],
|
||||
"protocol": "imap"
|
||||
},
|
||||
"imaps": {
|
||||
"bind": ["[::]:993"],
|
||||
"protocol": "imap",
|
||||
"tls": {
|
||||
"implicit": true
|
||||
}
|
||||
},
|
||||
"sieve": {
|
||||
"bind": ["[::]:4190"],
|
||||
"protocol": "managesieve"
|
||||
}
|
||||
}
|
||||
},
|
||||
"session": {
|
||||
"auth": {
|
||||
"mechanisms": ["plain", "login"],
|
||||
"directory": "internal"
|
||||
}
|
||||
},
|
||||
"queue": {
|
||||
"path": "/var/lib/stalwart/queue"
|
||||
},
|
||||
"report": {
|
||||
"path": "/var/lib/stalwart/reports"
|
||||
},
|
||||
"resolver": {
|
||||
"type": "system"
|
||||
},
|
||||
"certificate": {
|
||||
"default": {
|
||||
"cert": "/etc/stalwart/tls/tls.crt",
|
||||
"private-key": "/etc/stalwart/tls/tls.key"
|
||||
}
|
||||
}
|
||||
}
|
||||
15
apps/stalwart/stalwart-config-fix-v2.yaml
Normal file
15
apps/stalwart/stalwart-config-fix-v2.yaml
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: stalwart-stalwart-config
|
||||
namespace: mail
|
||||
labels:
|
||||
app.kubernetes.io/instance: stalwart
|
||||
app.kubernetes.io/name: stalwart
|
||||
data:
|
||||
config.json: |
|
||||
{
|
||||
"@type": "RocksDb",
|
||||
"path": "/var/lib/stalwart",
|
||||
"compression": "lz4"
|
||||
}
|
||||
66
apps/stalwart/stalwart-config-fix.yaml
Normal file
66
apps/stalwart/stalwart-config-fix.yaml
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: stalwart-stalwart-config
|
||||
namespace: mail
|
||||
labels:
|
||||
app.kubernetes.io/instance: stalwart
|
||||
app.kubernetes.io/name: stalwart
|
||||
data:
|
||||
config.json: |
|
||||
{
|
||||
"store": {
|
||||
"db": {
|
||||
"type": "rocksdb",
|
||||
"path": "/var/lib/stalwart/data"
|
||||
},
|
||||
"blob": {
|
||||
"type": "rocksdb",
|
||||
"path": "/var/lib/stalwart/blobs"
|
||||
}
|
||||
},
|
||||
"directory": {
|
||||
"internal": {
|
||||
"type": "internal",
|
||||
"store": "db"
|
||||
}
|
||||
},
|
||||
"authentication": {
|
||||
"fallback-admin": {
|
||||
"user": "admin",
|
||||
"secret": "REPLACED_BY_SECRET"
|
||||
}
|
||||
},
|
||||
"server": {
|
||||
"hostname": "mail.basicstack.de",
|
||||
"http": {
|
||||
"bind": ["[::]:8080"],
|
||||
"protocol": "http"
|
||||
}
|
||||
},
|
||||
"session": {
|
||||
"ehlo": {
|
||||
"require": true
|
||||
},
|
||||
"auth": {
|
||||
"directory": "internal"
|
||||
}
|
||||
},
|
||||
"queue": {
|
||||
"path": "/var/lib/stalwart/queue",
|
||||
"hash": 64
|
||||
}
|
||||
}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: stalwart-stalwart-env
|
||||
namespace: mail
|
||||
labels:
|
||||
app.kubernetes.io/instance: stalwart
|
||||
app.kubernetes.io/name: stalwart
|
||||
type: Opaque
|
||||
stringData:
|
||||
STALWART_LOG_LEVEL: "info"
|
||||
STALWART_LOG_FORMAT: "json"
|
||||
5
apps/stalwart/stalwart-config-with-data.json
Normal file
5
apps/stalwart/stalwart-config-with-data.json
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"@type": "RocksDb",
|
||||
"path": "/var/lib/stalwart",
|
||||
"compression": "lz4"
|
||||
}
|
||||
21
apps/stalwart/stalwart-console-pod.yaml
Normal file
21
apps/stalwart/stalwart-console-pod.yaml
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: stalwart-console
|
||||
namespace: mail
|
||||
spec:
|
||||
containers:
|
||||
- name: stalwart
|
||||
image: stalwartlabs/stalwart:v0.16.9
|
||||
command: ["/bin/sh", "-c", "sleep 3600"]
|
||||
volumeMounts:
|
||||
- name: data
|
||||
mountPath: /var/lib/stalwart
|
||||
securityContext:
|
||||
runAsUser: 2000
|
||||
runAsGroup: 2000
|
||||
volumes:
|
||||
- name: data
|
||||
persistentVolumeClaim:
|
||||
claimName: data-stalwart-stalwart-0
|
||||
restartPolicy: Never
|
||||
593
apps/stalwart/stalwart-dashboard-configmap.yaml
Executable file
593
apps/stalwart/stalwart-dashboard-configmap.yaml
Executable file
|
|
@ -0,0 +1,593 @@
|
|||
apiVersion: v1
|
||||
data:
|
||||
stalwart-mail.json: |
|
||||
{
|
||||
"annotations": {
|
||||
"list": [
|
||||
{
|
||||
"builtIn": 1,
|
||||
"datasource": "-- Grafana --",
|
||||
"enable": true,
|
||||
"hide": true,
|
||||
"iconColor": "rgba(0, 211, 255, 1)",
|
||||
"name": "Annotations & Alerts",
|
||||
"type": "dashboard"
|
||||
}
|
||||
]
|
||||
},
|
||||
"editable": true,
|
||||
"gnetId": null,
|
||||
"graphTooltip": 0,
|
||||
"id": null,
|
||||
"links": [],
|
||||
"panels": [
|
||||
{
|
||||
"datasource": "Prometheus",
|
||||
"fieldConfig": {
|
||||
"defaults": {
|
||||
"color": {
|
||||
"mode": "thresholds"
|
||||
},
|
||||
"mappings": [
|
||||
{
|
||||
"options": {
|
||||
"0": {
|
||||
"color": "red",
|
||||
"index": 0,
|
||||
"text": "Down"
|
||||
},
|
||||
"1": {
|
||||
"color": "green",
|
||||
"index": 1,
|
||||
"text": "Running"
|
||||
}
|
||||
},
|
||||
"type": "value"
|
||||
}
|
||||
],
|
||||
"thresholds": {
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "red",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "green",
|
||||
"value": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
"unit": "none"
|
||||
}
|
||||
},
|
||||
"gridPos": {
|
||||
"h": 4,
|
||||
"w": 6,
|
||||
"x": 0,
|
||||
"y": 0
|
||||
},
|
||||
"id": 1,
|
||||
"options": {
|
||||
"colorMode": "background",
|
||||
"graphMode": "none",
|
||||
"justifyMode": "auto",
|
||||
"orientation": "auto",
|
||||
"reduceOptions": {
|
||||
"calcs": [
|
||||
"lastNotNull"
|
||||
],
|
||||
"fields": "",
|
||||
"values": false
|
||||
},
|
||||
"textMode": "auto"
|
||||
},
|
||||
"pluginVersion": "8.0.0",
|
||||
"targets": [
|
||||
{
|
||||
"expr": "kube_pod_status_phase{namespace=\"mail\", pod=~\"stalwart-.*\", phase=\"Running\"}",
|
||||
"refId": "A"
|
||||
}
|
||||
],
|
||||
"title": "Pod Status",
|
||||
"type": "stat"
|
||||
},
|
||||
{
|
||||
"datasource": "Prometheus",
|
||||
"fieldConfig": {
|
||||
"defaults": {
|
||||
"color": {
|
||||
"mode": "thresholds"
|
||||
},
|
||||
"mappings": [],
|
||||
"thresholds": {
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "green",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "yellow",
|
||||
"value": 1
|
||||
},
|
||||
{
|
||||
"color": "red",
|
||||
"value": 5
|
||||
}
|
||||
]
|
||||
},
|
||||
"unit": "none"
|
||||
}
|
||||
},
|
||||
"gridPos": {
|
||||
"h": 4,
|
||||
"w": 6,
|
||||
"x": 6,
|
||||
"y": 0
|
||||
},
|
||||
"id": 2,
|
||||
"options": {
|
||||
"colorMode": "background",
|
||||
"graphMode": "area",
|
||||
"justifyMode": "auto",
|
||||
"orientation": "auto",
|
||||
"reduceOptions": {
|
||||
"calcs": [
|
||||
"lastNotNull"
|
||||
],
|
||||
"fields": "",
|
||||
"values": false
|
||||
},
|
||||
"textMode": "auto"
|
||||
},
|
||||
"pluginVersion": "8.0.0",
|
||||
"targets": [
|
||||
{
|
||||
"expr": "kube_pod_container_status_restarts_total{namespace=\"mail\", pod=~\"stalwart-.*\"}",
|
||||
"refId": "A"
|
||||
}
|
||||
],
|
||||
"title": "Container Restarts",
|
||||
"type": "stat"
|
||||
},
|
||||
{
|
||||
"datasource": "Prometheus",
|
||||
"fieldConfig": {
|
||||
"defaults": {
|
||||
"color": {
|
||||
"mode": "thresholds"
|
||||
},
|
||||
"mappings": [],
|
||||
"max": 100,
|
||||
"min": 0,
|
||||
"thresholds": {
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "green",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "yellow",
|
||||
"value": 75
|
||||
},
|
||||
{
|
||||
"color": "red",
|
||||
"value": 90
|
||||
}
|
||||
]
|
||||
},
|
||||
"unit": "percent"
|
||||
}
|
||||
},
|
||||
"gridPos": {
|
||||
"h": 4,
|
||||
"w": 6,
|
||||
"x": 12,
|
||||
"y": 0
|
||||
},
|
||||
"id": 3,
|
||||
"options": {
|
||||
"orientation": "auto",
|
||||
"reduceOptions": {
|
||||
"calcs": [
|
||||
"lastNotNull"
|
||||
],
|
||||
"fields": "",
|
||||
"values": false
|
||||
},
|
||||
"showThresholdLabels": false,
|
||||
"showThresholdMarkers": true
|
||||
},
|
||||
"pluginVersion": "8.0.0",
|
||||
"targets": [
|
||||
{
|
||||
"expr": "(kubelet_volume_stats_used_bytes{namespace=\"mail\", persistentvolumeclaim=\"stalwart-data\"} / kubelet_volume_stats_capacity_bytes{namespace=\"mail\", persistentvolumeclaim=\"stalwart-data\"}) * 100",
|
||||
"refId": "A"
|
||||
}
|
||||
],
|
||||
"title": "Disk Usage (20Gi PVC)",
|
||||
"type": "gauge"
|
||||
},
|
||||
{
|
||||
"datasource": "Prometheus",
|
||||
"fieldConfig": {
|
||||
"defaults": {
|
||||
"color": {
|
||||
"mode": "thresholds"
|
||||
},
|
||||
"mappings": [],
|
||||
"max": 100,
|
||||
"min": 0,
|
||||
"thresholds": {
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "green",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "yellow",
|
||||
"value": 75
|
||||
},
|
||||
{
|
||||
"color": "red",
|
||||
"value": 85
|
||||
}
|
||||
]
|
||||
},
|
||||
"unit": "percent"
|
||||
}
|
||||
},
|
||||
"gridPos": {
|
||||
"h": 4,
|
||||
"w": 6,
|
||||
"x": 18,
|
||||
"y": 0
|
||||
},
|
||||
"id": 4,
|
||||
"options": {
|
||||
"orientation": "auto",
|
||||
"reduceOptions": {
|
||||
"calcs": [
|
||||
"lastNotNull"
|
||||
],
|
||||
"fields": "",
|
||||
"values": false
|
||||
},
|
||||
"showThresholdLabels": false,
|
||||
"showThresholdMarkers": true
|
||||
},
|
||||
"pluginVersion": "8.0.0",
|
||||
"targets": [
|
||||
{
|
||||
"expr": "(container_memory_working_set_bytes{namespace=\"mail\", pod=~\"stalwart-.*\", container=\"stalwart\"} / container_spec_memory_limit_bytes{namespace=\"mail\", pod=~\"stalwart-.*\", container=\"stalwart\"}) * 100",
|
||||
"refId": "A"
|
||||
}
|
||||
],
|
||||
"title": "Memory Usage",
|
||||
"type": "gauge"
|
||||
},
|
||||
{
|
||||
"datasource": "Prometheus",
|
||||
"fieldConfig": {
|
||||
"defaults": {
|
||||
"color": {
|
||||
"mode": "palette-classic"
|
||||
},
|
||||
"custom": {
|
||||
"axisLabel": "",
|
||||
"axisPlacement": "auto",
|
||||
"barAlignment": 0,
|
||||
"drawStyle": "line",
|
||||
"fillOpacity": 10,
|
||||
"gradientMode": "none",
|
||||
"hideFrom": {
|
||||
"tooltip": false,
|
||||
"viz": false,
|
||||
"legend": false
|
||||
},
|
||||
"lineInterpolation": "linear",
|
||||
"lineWidth": 1,
|
||||
"pointSize": 5,
|
||||
"scaleDistribution": {
|
||||
"type": "linear"
|
||||
},
|
||||
"showPoints": "never",
|
||||
"spanNulls": true
|
||||
},
|
||||
"mappings": [],
|
||||
"thresholds": {
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "green",
|
||||
"value": null
|
||||
}
|
||||
]
|
||||
},
|
||||
"unit": "percentunit"
|
||||
}
|
||||
},
|
||||
"gridPos": {
|
||||
"h": 8,
|
||||
"w": 12,
|
||||
"x": 0,
|
||||
"y": 4
|
||||
},
|
||||
"id": 5,
|
||||
"options": {
|
||||
"legend": {
|
||||
"calcs": [],
|
||||
"displayMode": "list",
|
||||
"placement": "bottom"
|
||||
},
|
||||
"tooltip": {
|
||||
"mode": "multi"
|
||||
}
|
||||
},
|
||||
"pluginVersion": "8.0.0",
|
||||
"targets": [
|
||||
{
|
||||
"expr": "rate(container_cpu_usage_seconds_total{namespace=\"mail\", pod=~\"stalwart-.*\", container=\"stalwart\"}[5m]) / (container_spec_cpu_quota{namespace=\"mail\", pod=~\"stalwart-.*\", container=\"stalwart\"} / container_spec_cpu_period{namespace=\"mail\", pod=~\"stalwart-.*\", container=\"stalwart\"})",
|
||||
"legendFormat": "CPU Usage",
|
||||
"refId": "A"
|
||||
}
|
||||
],
|
||||
"title": "CPU Usage Over Time",
|
||||
"type": "timeseries"
|
||||
},
|
||||
{
|
||||
"datasource": "Prometheus",
|
||||
"fieldConfig": {
|
||||
"defaults": {
|
||||
"color": {
|
||||
"mode": "palette-classic"
|
||||
},
|
||||
"custom": {
|
||||
"axisLabel": "",
|
||||
"axisPlacement": "auto",
|
||||
"barAlignment": 0,
|
||||
"drawStyle": "line",
|
||||
"fillOpacity": 10,
|
||||
"gradientMode": "none",
|
||||
"hideFrom": {
|
||||
"tooltip": false,
|
||||
"viz": false,
|
||||
"legend": false
|
||||
},
|
||||
"lineInterpolation": "linear",
|
||||
"lineWidth": 1,
|
||||
"pointSize": 5,
|
||||
"scaleDistribution": {
|
||||
"type": "linear"
|
||||
},
|
||||
"showPoints": "never",
|
||||
"spanNulls": true
|
||||
},
|
||||
"mappings": [],
|
||||
"thresholds": {
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "green",
|
||||
"value": null
|
||||
}
|
||||
]
|
||||
},
|
||||
"unit": "bytes"
|
||||
}
|
||||
},
|
||||
"gridPos": {
|
||||
"h": 8,
|
||||
"w": 12,
|
||||
"x": 12,
|
||||
"y": 4
|
||||
},
|
||||
"id": 6,
|
||||
"options": {
|
||||
"legend": {
|
||||
"calcs": [],
|
||||
"displayMode": "list",
|
||||
"placement": "bottom"
|
||||
},
|
||||
"tooltip": {
|
||||
"mode": "multi"
|
||||
}
|
||||
},
|
||||
"pluginVersion": "8.0.0",
|
||||
"targets": [
|
||||
{
|
||||
"expr": "container_memory_working_set_bytes{namespace=\"mail\", pod=~\"stalwart-.*\", container=\"stalwart\"}",
|
||||
"legendFormat": "Memory Usage",
|
||||
"refId": "A"
|
||||
},
|
||||
{
|
||||
"expr": "container_spec_memory_limit_bytes{namespace=\"mail\", pod=~\"stalwart-.*\", container=\"stalwart\"}",
|
||||
"legendFormat": "Memory Limit",
|
||||
"refId": "B"
|
||||
}
|
||||
],
|
||||
"title": "Memory Usage Over Time",
|
||||
"type": "timeseries"
|
||||
},
|
||||
{
|
||||
"datasource": "Prometheus",
|
||||
"fieldConfig": {
|
||||
"defaults": {
|
||||
"color": {
|
||||
"mode": "palette-classic"
|
||||
},
|
||||
"custom": {
|
||||
"axisLabel": "",
|
||||
"axisPlacement": "auto",
|
||||
"barAlignment": 0,
|
||||
"drawStyle": "line",
|
||||
"fillOpacity": 10,
|
||||
"gradientMode": "none",
|
||||
"hideFrom": {
|
||||
"tooltip": false,
|
||||
"viz": false,
|
||||
"legend": false
|
||||
},
|
||||
"lineInterpolation": "linear",
|
||||
"lineWidth": 1,
|
||||
"pointSize": 5,
|
||||
"scaleDistribution": {
|
||||
"type": "linear"
|
||||
},
|
||||
"showPoints": "never",
|
||||
"spanNulls": true
|
||||
},
|
||||
"mappings": [],
|
||||
"thresholds": {
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "green",
|
||||
"value": null
|
||||
}
|
||||
]
|
||||
},
|
||||
"unit": "bytes"
|
||||
}
|
||||
},
|
||||
"gridPos": {
|
||||
"h": 8,
|
||||
"w": 12,
|
||||
"x": 0,
|
||||
"y": 12
|
||||
},
|
||||
"id": 7,
|
||||
"options": {
|
||||
"legend": {
|
||||
"calcs": [
|
||||
"lastNotNull"
|
||||
],
|
||||
"displayMode": "table",
|
||||
"placement": "bottom"
|
||||
},
|
||||
"tooltip": {
|
||||
"mode": "multi"
|
||||
}
|
||||
},
|
||||
"pluginVersion": "8.0.0",
|
||||
"targets": [
|
||||
{
|
||||
"expr": "kubelet_volume_stats_used_bytes{namespace=\"mail\", persistentvolumeclaim=\"stalwart-data\"}",
|
||||
"legendFormat": "Used Space",
|
||||
"refId": "A"
|
||||
},
|
||||
{
|
||||
"expr": "kubelet_volume_stats_capacity_bytes{namespace=\"mail\", persistentvolumeclaim=\"stalwart-data\"}",
|
||||
"legendFormat": "Total Capacity (20Gi)",
|
||||
"refId": "B"
|
||||
},
|
||||
{
|
||||
"expr": "kubelet_volume_stats_available_bytes{namespace=\"mail\", persistentvolumeclaim=\"stalwart-data\"}",
|
||||
"legendFormat": "Available Space",
|
||||
"refId": "C"
|
||||
}
|
||||
],
|
||||
"title": "Disk Space Over Time (Encrypted Volume)",
|
||||
"type": "timeseries"
|
||||
},
|
||||
{
|
||||
"datasource": "Prometheus",
|
||||
"fieldConfig": {
|
||||
"defaults": {
|
||||
"color": {
|
||||
"mode": "palette-classic"
|
||||
},
|
||||
"custom": {
|
||||
"axisLabel": "",
|
||||
"axisPlacement": "auto",
|
||||
"barAlignment": 0,
|
||||
"drawStyle": "line",
|
||||
"fillOpacity": 10,
|
||||
"gradientMode": "none",
|
||||
"hideFrom": {
|
||||
"tooltip": false,
|
||||
"viz": false,
|
||||
"legend": false
|
||||
},
|
||||
"lineInterpolation": "linear",
|
||||
"lineWidth": 1,
|
||||
"pointSize": 5,
|
||||
"scaleDistribution": {
|
||||
"type": "linear"
|
||||
},
|
||||
"showPoints": "never",
|
||||
"spanNulls": true
|
||||
},
|
||||
"mappings": [],
|
||||
"thresholds": {
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "green",
|
||||
"value": null
|
||||
}
|
||||
]
|
||||
},
|
||||
"unit": "none"
|
||||
}
|
||||
},
|
||||
"gridPos": {
|
||||
"h": 8,
|
||||
"w": 12,
|
||||
"x": 12,
|
||||
"y": 12
|
||||
},
|
||||
"id": 8,
|
||||
"options": {
|
||||
"legend": {
|
||||
"calcs": [],
|
||||
"displayMode": "list",
|
||||
"placement": "bottom"
|
||||
},
|
||||
"tooltip": {
|
||||
"mode": "multi"
|
||||
}
|
||||
},
|
||||
"pluginVersion": "8.0.0",
|
||||
"targets": [
|
||||
{
|
||||
"expr": "kubelet_volume_stats_inodes_used{namespace=\"mail\", persistentvolumeclaim=\"stalwart-data\"}",
|
||||
"legendFormat": "Inodes Used",
|
||||
"refId": "A"
|
||||
},
|
||||
{
|
||||
"expr": "kubelet_volume_stats_inodes{namespace=\"mail\", persistentvolumeclaim=\"stalwart-data\"}",
|
||||
"legendFormat": "Total Inodes",
|
||||
"refId": "B"
|
||||
}
|
||||
],
|
||||
"title": "Disk Inodes Usage",
|
||||
"type": "timeseries"
|
||||
}
|
||||
],
|
||||
"refresh": "30s",
|
||||
"schemaVersion": 27,
|
||||
"style": "dark",
|
||||
"tags": ["stalwart", "mail", "kubernetes"],
|
||||
"templating": {
|
||||
"list": []
|
||||
},
|
||||
"time": {
|
||||
"from": "now-6h",
|
||||
"to": "now"
|
||||
},
|
||||
"timepicker": {},
|
||||
"timezone": "",
|
||||
"title": "Stalwart Mail Server",
|
||||
"uid": "stalwart-mail",
|
||||
"version": 1
|
||||
}
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: stalwart-dashboard
|
||||
namespace: observability
|
||||
labels:
|
||||
grafana_dashboard: "1"
|
||||
231
apps/stalwart/stalwart-deployment-new.yaml
Executable file
231
apps/stalwart/stalwart-deployment-new.yaml
Executable file
|
|
@ -0,0 +1,231 @@
|
|||
---
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: mail
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: stalwart-data
|
||||
namespace: mail
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
storageClassName: hcloud-volumes-encrypted
|
||||
resources:
|
||||
requests:
|
||||
storage: 20Gi
|
||||
---
|
||||
# Secret managed via SealedSecrets
|
||||
# See: stalwart-admin-credentials-sealed.yaml
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: stalwart
|
||||
namespace: mail
|
||||
spec:
|
||||
type: ClusterIP
|
||||
clusterIP: None
|
||||
selector:
|
||||
app: stalwart
|
||||
ports:
|
||||
- name: smtp
|
||||
port: 25
|
||||
targetPort: 25
|
||||
protocol: TCP
|
||||
- name: submission
|
||||
port: 587
|
||||
targetPort: 587
|
||||
protocol: TCP
|
||||
- name: submissions
|
||||
port: 465
|
||||
targetPort: 465
|
||||
protocol: TCP
|
||||
- name: imap
|
||||
port: 143
|
||||
targetPort: 143
|
||||
protocol: TCP
|
||||
- name: imaps
|
||||
port: 993
|
||||
targetPort: 993
|
||||
protocol: TCP
|
||||
- name: http
|
||||
port: 8080
|
||||
targetPort: 8080
|
||||
protocol: TCP
|
||||
- name: sieve
|
||||
port: 4190
|
||||
targetPort: 4190
|
||||
protocol: TCP
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: stalwart-smtp
|
||||
namespace: mail
|
||||
spec:
|
||||
type: LoadBalancer
|
||||
selector:
|
||||
app: stalwart
|
||||
ports:
|
||||
- name: smtp
|
||||
port: 25
|
||||
targetPort: 25
|
||||
protocol: TCP
|
||||
- name: submission
|
||||
port: 587
|
||||
targetPort: 587
|
||||
protocol: TCP
|
||||
- name: submissions
|
||||
port: 465
|
||||
targetPort: 465
|
||||
protocol: TCP
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: stalwart-imap
|
||||
namespace: mail
|
||||
spec:
|
||||
type: LoadBalancer
|
||||
selector:
|
||||
app: stalwart
|
||||
ports:
|
||||
- name: imap
|
||||
port: 143
|
||||
targetPort: 143
|
||||
protocol: TCP
|
||||
- name: imaps
|
||||
port: 993
|
||||
targetPort: 993
|
||||
protocol: TCP
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: stalwart-http
|
||||
namespace: mail
|
||||
spec:
|
||||
type: ClusterIP
|
||||
selector:
|
||||
app: stalwart
|
||||
ports:
|
||||
- name: http
|
||||
port: 8080
|
||||
targetPort: 8080
|
||||
protocol: TCP
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: StatefulSet
|
||||
metadata:
|
||||
name: stalwart
|
||||
namespace: mail
|
||||
spec:
|
||||
serviceName: stalwart
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: stalwart
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: stalwart
|
||||
spec:
|
||||
securityContext:
|
||||
fsGroup: 2000
|
||||
runAsUser: 2000
|
||||
runAsGroup: 2000
|
||||
initContainers:
|
||||
- name: fix-permissions
|
||||
image: busybox
|
||||
command: ["sh", "-c", "chown -R 2000:2000 /opt/stalwart && chmod -R 755 /opt/stalwart"]
|
||||
volumeMounts:
|
||||
- name: data
|
||||
mountPath: /opt/stalwart
|
||||
containers:
|
||||
- name: stalwart
|
||||
image: stalwartlabs/stalwart:latest
|
||||
ports:
|
||||
- containerPort: 25
|
||||
name: smtp
|
||||
- containerPort: 587
|
||||
name: submission
|
||||
- containerPort: 465
|
||||
name: submissions
|
||||
- containerPort: 143
|
||||
name: imap
|
||||
- containerPort: 993
|
||||
name: imaps
|
||||
- containerPort: 8080
|
||||
name: http
|
||||
- containerPort: 4190
|
||||
name: sieve
|
||||
volumeMounts:
|
||||
- name: data
|
||||
mountPath: /opt/stalwart
|
||||
- name: data
|
||||
mountPath: /etc/stalwart
|
||||
subPath: etc
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: /healthz/live
|
||||
port: 8080
|
||||
initialDelaySeconds: 30
|
||||
periodSeconds: 10
|
||||
timeoutSeconds: 5
|
||||
failureThreshold: 3
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
path: /healthz/ready
|
||||
port: 8080
|
||||
initialDelaySeconds: 10
|
||||
periodSeconds: 5
|
||||
timeoutSeconds: 3
|
||||
failureThreshold: 3
|
||||
resources:
|
||||
requests:
|
||||
memory: "512Mi"
|
||||
cpu: "250m"
|
||||
limits:
|
||||
memory: "2Gi"
|
||||
cpu: "2000m"
|
||||
securityContext:
|
||||
runAsNonRoot: true
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
drop: [ALL]
|
||||
add: [NET_BIND_SERVICE]
|
||||
seccompProfile:
|
||||
type: RuntimeDefault
|
||||
volumes:
|
||||
- name: data
|
||||
persistentVolumeClaim:
|
||||
claimName: stalwart-data
|
||||
---
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: stalwart-web
|
||||
namespace: mail
|
||||
annotations:
|
||||
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
||||
traefik.ingress.kubernetes.io/router.entrypoints: websecure
|
||||
spec:
|
||||
ingressClassName: traefik
|
||||
tls:
|
||||
- hosts:
|
||||
- mail.basicstack.de
|
||||
secretName: stalwart-tls
|
||||
rules:
|
||||
- host: mail.basicstack.de
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: stalwart-http
|
||||
port:
|
||||
number: 8080
|
||||
226
apps/stalwart/stalwart-deployment-oidc-only.yaml
Executable file
226
apps/stalwart/stalwart-deployment-oidc-only.yaml
Executable file
|
|
@ -0,0 +1,226 @@
|
|||
---
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: mail
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: stalwart-data
|
||||
namespace: mail
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
storageClassName: hcloud-volumes-encrypted
|
||||
resources:
|
||||
requests:
|
||||
storage: 20Gi
|
||||
---
|
||||
# OAuth Configuration ConfigMap
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: stalwart-oauth-config
|
||||
namespace: mail
|
||||
data:
|
||||
oauth-config.json: |
|
||||
{
|
||||
"oauth": {
|
||||
"providers": [
|
||||
{
|
||||
"id": "pocket-id",
|
||||
"name": "Pocket ID",
|
||||
"issuer": "https://auth.basicstack.de",
|
||||
"authorization-url": "https://auth.basicstack.de/api/oidc/authorize",
|
||||
"token-url": "https://auth.basicstack.de/api/oidc/token",
|
||||
"userinfo-url": "https://auth.basicstack.de/api/oidc/userinfo",
|
||||
"client-id": "REPLACED_BY_SECRET",
|
||||
"client-secret": "REPLACED_BY_SECRET",
|
||||
"scopes": ["openid", "profile", "email"],
|
||||
"redirect-url": "https://mail.basicstack.de/login/oauth",
|
||||
"user-mapping": {
|
||||
"username": "preferred_username",
|
||||
"email": "email",
|
||||
"name": "name"
|
||||
}
|
||||
}
|
||||
],
|
||||
"enabled": true,
|
||||
"allow-password-auth": false
|
||||
}
|
||||
}
|
||||
---
|
||||
# Secret managed via SealedSecrets
|
||||
# See: stalwart-oidc-sealed.yaml
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: stalwart-smtp
|
||||
namespace: mail
|
||||
spec:
|
||||
type: LoadBalancer
|
||||
selector:
|
||||
app: stalwart
|
||||
ports:
|
||||
- name: smtp
|
||||
port: 25
|
||||
targetPort: 25
|
||||
protocol: TCP
|
||||
- name: submission
|
||||
port: 587
|
||||
targetPort: 587
|
||||
protocol: TCP
|
||||
- name: submissions
|
||||
port: 465
|
||||
targetPort: 465
|
||||
protocol: TCP
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: stalwart-imap
|
||||
namespace: mail
|
||||
spec:
|
||||
type: LoadBalancer
|
||||
selector:
|
||||
app: stalwart
|
||||
ports:
|
||||
- name: imap
|
||||
port: 143
|
||||
targetPort: 143
|
||||
protocol: TCP
|
||||
- name: imaps
|
||||
port: 993
|
||||
targetPort: 993
|
||||
protocol: TCP
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: stalwart-http
|
||||
namespace: mail
|
||||
spec:
|
||||
type: ClusterIP
|
||||
selector:
|
||||
app: stalwart
|
||||
ports:
|
||||
- name: http
|
||||
port: 8080
|
||||
targetPort: 8080
|
||||
protocol: TCP
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: stalwart
|
||||
namespace: mail
|
||||
spec:
|
||||
replicas: 1
|
||||
strategy:
|
||||
type: Recreate
|
||||
selector:
|
||||
matchLabels:
|
||||
app: stalwart
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: stalwart
|
||||
spec:
|
||||
initContainers:
|
||||
- name: fix-permissions
|
||||
image: busybox
|
||||
command: ["sh", "-c", "chown -R 2000:2000 /opt/stalwart-mail && chmod -R 755 /opt/stalwart-mail"]
|
||||
volumeMounts:
|
||||
- name: data
|
||||
mountPath: /opt/stalwart-mail
|
||||
containers:
|
||||
- name: stalwart
|
||||
image: stalwartlabs/stalwart:v0.16
|
||||
command: ["/usr/local/bin/stalwart"]
|
||||
args: ["--config", "/etc/stalwart/config.json"]
|
||||
ports:
|
||||
- containerPort: 25
|
||||
name: smtp
|
||||
- containerPort: 587
|
||||
name: submission
|
||||
- containerPort: 465
|
||||
name: submissions
|
||||
- containerPort: 143
|
||||
name: imap
|
||||
- containerPort: 993
|
||||
name: imaps
|
||||
- containerPort: 8080
|
||||
name: http
|
||||
env:
|
||||
# Emergency recovery admin (can be disabled after OIDC is working)
|
||||
- name: STALWART_RECOVERY_ADMIN
|
||||
value: "admin@basicstack.de:***REMOVED***"
|
||||
# OAuth configuration
|
||||
- name: STALWART_OAUTH_ENABLED
|
||||
value: "true"
|
||||
- name: STALWART_OAUTH_PROVIDER
|
||||
value: "pocket-id"
|
||||
- name: STALWART_OAUTH_CLIENT_ID
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: stalwart-oidc-secret
|
||||
key: client-id
|
||||
- name: STALWART_OAUTH_CLIENT_SECRET
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: stalwart-oidc-secret
|
||||
key: client-secret
|
||||
# Disable password authentication (except recovery admin)
|
||||
- name: STALWART_PASSWORD_AUTH_ENABLED
|
||||
value: "false"
|
||||
volumeMounts:
|
||||
- name: data
|
||||
mountPath: /var/lib/stalwart
|
||||
- name: data
|
||||
mountPath: /etc/stalwart
|
||||
subPath: etc
|
||||
- name: oauth-config
|
||||
mountPath: /etc/stalwart/oauth
|
||||
readOnly: true
|
||||
resources:
|
||||
requests:
|
||||
memory: "512Mi"
|
||||
cpu: "250m"
|
||||
limits:
|
||||
memory: "1Gi"
|
||||
cpu: "1000m"
|
||||
volumes:
|
||||
- name: data
|
||||
persistentVolumeClaim:
|
||||
claimName: stalwart-data
|
||||
- name: oauth-config
|
||||
configMap:
|
||||
name: stalwart-oauth-config
|
||||
---
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: stalwart-web
|
||||
namespace: mail
|
||||
annotations:
|
||||
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
||||
traefik.ingress.kubernetes.io/router.entrypoints: websecure
|
||||
spec:
|
||||
ingressClassName: traefik
|
||||
tls:
|
||||
- hosts:
|
||||
- mail.basicstack.de
|
||||
secretName: stalwart-tls
|
||||
rules:
|
||||
- host: mail.basicstack.de
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: stalwart-http
|
||||
port:
|
||||
number: 8080
|
||||
186
apps/stalwart/stalwart-deployment-with-oidc.yaml
Executable file
186
apps/stalwart/stalwart-deployment-with-oidc.yaml
Executable file
|
|
@ -0,0 +1,186 @@
|
|||
---
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: mail
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: stalwart-data
|
||||
namespace: mail
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
storageClassName: hcloud-volumes-encrypted
|
||||
resources:
|
||||
requests:
|
||||
storage: 20Gi
|
||||
---
|
||||
# Secrets managed via SealedSecrets
|
||||
# See: stalwart-admin-credentials-sealed.yaml and stalwart-oidc-sealed.yaml
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: stalwart-smtp
|
||||
namespace: mail
|
||||
spec:
|
||||
type: LoadBalancer
|
||||
selector:
|
||||
app: stalwart
|
||||
ports:
|
||||
- name: smtp
|
||||
port: 25
|
||||
targetPort: 25
|
||||
protocol: TCP
|
||||
- name: submission
|
||||
port: 587
|
||||
targetPort: 587
|
||||
protocol: TCP
|
||||
- name: submissions
|
||||
port: 465
|
||||
targetPort: 465
|
||||
protocol: TCP
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: stalwart-imap
|
||||
namespace: mail
|
||||
spec:
|
||||
type: LoadBalancer
|
||||
selector:
|
||||
app: stalwart
|
||||
ports:
|
||||
- name: imap
|
||||
port: 143
|
||||
targetPort: 143
|
||||
protocol: TCP
|
||||
- name: imaps
|
||||
port: 993
|
||||
targetPort: 993
|
||||
protocol: TCP
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: stalwart-http
|
||||
namespace: mail
|
||||
spec:
|
||||
type: ClusterIP
|
||||
selector:
|
||||
app: stalwart
|
||||
ports:
|
||||
- name: http
|
||||
port: 8080
|
||||
targetPort: 8080
|
||||
protocol: TCP
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: stalwart
|
||||
namespace: mail
|
||||
spec:
|
||||
replicas: 1
|
||||
strategy:
|
||||
type: Recreate
|
||||
selector:
|
||||
matchLabels:
|
||||
app: stalwart
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: stalwart
|
||||
spec:
|
||||
initContainers:
|
||||
- name: fix-permissions
|
||||
image: busybox
|
||||
command: ["sh", "-c", "chown -R 2000:2000 /opt/stalwart-mail && chmod -R 755 /opt/stalwart-mail"]
|
||||
volumeMounts:
|
||||
- name: data
|
||||
mountPath: /opt/stalwart-mail
|
||||
containers:
|
||||
- name: stalwart
|
||||
image: stalwartlabs/stalwart:v0.16
|
||||
command: ["/usr/local/bin/stalwart"]
|
||||
args: ["--config", "/etc/stalwart/config.json"]
|
||||
ports:
|
||||
- containerPort: 25
|
||||
name: smtp
|
||||
- containerPort: 587
|
||||
name: submission
|
||||
- containerPort: 465
|
||||
name: submissions
|
||||
- containerPort: 143
|
||||
name: imap
|
||||
- containerPort: 993
|
||||
name: imaps
|
||||
- containerPort: 8080
|
||||
name: http
|
||||
env:
|
||||
- name: STALWART_RECOVERY_ADMIN
|
||||
value: "admin@basicstack.de:***REMOVED***"
|
||||
# OIDC Configuration
|
||||
- name: STALWART_OAUTH_ENABLE
|
||||
value: "true"
|
||||
- name: STALWART_OAUTH_ISSUER
|
||||
value: "https://auth.basicstack.de"
|
||||
- name: STALWART_OAUTH_CLIENT_ID
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: stalwart-oidc
|
||||
key: oidc-client-id
|
||||
- name: STALWART_OAUTH_CLIENT_SECRET
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: stalwart-oidc
|
||||
key: oidc-client-secret
|
||||
- name: STALWART_OAUTH_REDIRECT_URI
|
||||
value: "https://mail.basicstack.de/login/oauth"
|
||||
- name: STALWART_OAUTH_SCOPES
|
||||
value: "openid profile email"
|
||||
volumeMounts:
|
||||
- name: data
|
||||
mountPath: /var/lib/stalwart
|
||||
- name: data
|
||||
mountPath: /etc/stalwart
|
||||
subPath: etc
|
||||
resources:
|
||||
requests:
|
||||
memory: "512Mi"
|
||||
cpu: "250m"
|
||||
limits:
|
||||
memory: "1Gi"
|
||||
cpu: "1000m"
|
||||
volumes:
|
||||
- name: data
|
||||
persistentVolumeClaim:
|
||||
claimName: stalwart-data
|
||||
---
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: stalwart-web
|
||||
namespace: mail
|
||||
annotations:
|
||||
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
||||
traefik.ingress.kubernetes.io/router.entrypoints: websecure
|
||||
spec:
|
||||
ingressClassName: traefik
|
||||
tls:
|
||||
- hosts:
|
||||
- mail.basicstack.de
|
||||
secretName: stalwart-tls
|
||||
rules:
|
||||
- host: mail.basicstack.de
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: stalwart-http
|
||||
port:
|
||||
number: 8080
|
||||
170
apps/stalwart/stalwart-deployment.yaml
Executable file
170
apps/stalwart/stalwart-deployment.yaml
Executable file
|
|
@ -0,0 +1,170 @@
|
|||
---
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: mail
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: stalwart-data
|
||||
namespace: mail
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
storageClassName: hcloud-volumes-encrypted
|
||||
resources:
|
||||
requests:
|
||||
storage: 20Gi
|
||||
---
|
||||
# Secret managed via SealedSecrets
|
||||
# See: stalwart-admin-credentials-sealed.yaml
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: stalwart-smtp
|
||||
namespace: mail
|
||||
spec:
|
||||
type: LoadBalancer
|
||||
selector:
|
||||
app: stalwart
|
||||
ports:
|
||||
- name: smtp
|
||||
port: 25
|
||||
targetPort: 25
|
||||
protocol: TCP
|
||||
- name: submission
|
||||
port: 587
|
||||
targetPort: 587
|
||||
protocol: TCP
|
||||
- name: submissions
|
||||
port: 465
|
||||
targetPort: 465
|
||||
protocol: TCP
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: stalwart-imap
|
||||
namespace: mail
|
||||
spec:
|
||||
type: LoadBalancer
|
||||
selector:
|
||||
app: stalwart
|
||||
ports:
|
||||
- name: imap
|
||||
port: 143
|
||||
targetPort: 143
|
||||
protocol: TCP
|
||||
- name: imaps
|
||||
port: 993
|
||||
targetPort: 993
|
||||
protocol: TCP
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: stalwart-http
|
||||
namespace: mail
|
||||
spec:
|
||||
type: ClusterIP
|
||||
selector:
|
||||
app: stalwart
|
||||
ports:
|
||||
- name: http
|
||||
port: 8080
|
||||
targetPort: 8080
|
||||
protocol: TCP
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: stalwart
|
||||
namespace: mail
|
||||
spec:
|
||||
replicas: 1
|
||||
strategy:
|
||||
type: Recreate
|
||||
selector:
|
||||
matchLabels:
|
||||
app: stalwart
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: stalwart
|
||||
spec:
|
||||
initContainers:
|
||||
- name: fix-permissions
|
||||
image: busybox
|
||||
command: ["sh", "-c", "chown -R 2000:2000 /opt/stalwart-mail && chmod -R 755 /opt/stalwart-mail"]
|
||||
volumeMounts:
|
||||
- name: data
|
||||
mountPath: /opt/stalwart-mail
|
||||
containers:
|
||||
- name: stalwart
|
||||
image: stalwartlabs/stalwart:v0.16
|
||||
command: ["/usr/local/bin/stalwart"]
|
||||
args: ["--config", "/etc/stalwart/config.json"]
|
||||
ports:
|
||||
- containerPort: 25
|
||||
name: smtp
|
||||
- containerPort: 587
|
||||
name: submission
|
||||
- containerPort: 465
|
||||
name: submissions
|
||||
- containerPort: 143
|
||||
name: imap
|
||||
- containerPort: 993
|
||||
name: imaps
|
||||
- containerPort: 8080
|
||||
name: http
|
||||
env:
|
||||
- name: STALWART_RECOVERY_ADMIN
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: stalwart-admin-credentials
|
||||
key: recovery-admin-password
|
||||
volumeMounts:
|
||||
- name: data
|
||||
mountPath: /var/lib/stalwart
|
||||
- name: data
|
||||
mountPath: /etc/stalwart
|
||||
subPath: etc
|
||||
resources:
|
||||
requests:
|
||||
memory: "512Mi"
|
||||
cpu: "250m"
|
||||
limits:
|
||||
memory: "1Gi"
|
||||
cpu: "1000m"
|
||||
volumes:
|
||||
- name: data
|
||||
persistentVolumeClaim:
|
||||
claimName: stalwart-data
|
||||
---
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: stalwart-web
|
||||
namespace: mail
|
||||
annotations:
|
||||
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
||||
traefik.ingress.kubernetes.io/router.entrypoints: websecure
|
||||
spec:
|
||||
ingressClassName: traefik
|
||||
tls:
|
||||
- hosts:
|
||||
- mail.basicstack.de
|
||||
secretName: stalwart-tls
|
||||
rules:
|
||||
- host: mail.basicstack.de
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: stalwart-http
|
||||
port:
|
||||
number: 8080
|
||||
584
apps/stalwart/stalwart-grafana-dashboard.json
Executable file
584
apps/stalwart/stalwart-grafana-dashboard.json
Executable file
|
|
@ -0,0 +1,584 @@
|
|||
{
|
||||
"annotations": {
|
||||
"list": [
|
||||
{
|
||||
"builtIn": 1,
|
||||
"datasource": "-- Grafana --",
|
||||
"enable": true,
|
||||
"hide": true,
|
||||
"iconColor": "rgba(0, 211, 255, 1)",
|
||||
"name": "Annotations & Alerts",
|
||||
"type": "dashboard"
|
||||
}
|
||||
]
|
||||
},
|
||||
"editable": true,
|
||||
"gnetId": null,
|
||||
"graphTooltip": 0,
|
||||
"id": null,
|
||||
"links": [],
|
||||
"panels": [
|
||||
{
|
||||
"datasource": "Prometheus",
|
||||
"fieldConfig": {
|
||||
"defaults": {
|
||||
"color": {
|
||||
"mode": "thresholds"
|
||||
},
|
||||
"mappings": [
|
||||
{
|
||||
"options": {
|
||||
"0": {
|
||||
"color": "red",
|
||||
"index": 0,
|
||||
"text": "Down"
|
||||
},
|
||||
"1": {
|
||||
"color": "green",
|
||||
"index": 1,
|
||||
"text": "Running"
|
||||
}
|
||||
},
|
||||
"type": "value"
|
||||
}
|
||||
],
|
||||
"thresholds": {
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "red",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "green",
|
||||
"value": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
"unit": "none"
|
||||
}
|
||||
},
|
||||
"gridPos": {
|
||||
"h": 4,
|
||||
"w": 6,
|
||||
"x": 0,
|
||||
"y": 0
|
||||
},
|
||||
"id": 1,
|
||||
"options": {
|
||||
"colorMode": "background",
|
||||
"graphMode": "none",
|
||||
"justifyMode": "auto",
|
||||
"orientation": "auto",
|
||||
"reduceOptions": {
|
||||
"calcs": [
|
||||
"lastNotNull"
|
||||
],
|
||||
"fields": "",
|
||||
"values": false
|
||||
},
|
||||
"textMode": "auto"
|
||||
},
|
||||
"pluginVersion": "8.0.0",
|
||||
"targets": [
|
||||
{
|
||||
"expr": "kube_pod_status_phase{namespace=\"mail\", pod=~\"stalwart-.*\", phase=\"Running\"}",
|
||||
"refId": "A"
|
||||
}
|
||||
],
|
||||
"title": "Pod Status",
|
||||
"type": "stat"
|
||||
},
|
||||
{
|
||||
"datasource": "Prometheus",
|
||||
"fieldConfig": {
|
||||
"defaults": {
|
||||
"color": {
|
||||
"mode": "thresholds"
|
||||
},
|
||||
"mappings": [],
|
||||
"thresholds": {
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "green",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "yellow",
|
||||
"value": 1
|
||||
},
|
||||
{
|
||||
"color": "red",
|
||||
"value": 5
|
||||
}
|
||||
]
|
||||
},
|
||||
"unit": "none"
|
||||
}
|
||||
},
|
||||
"gridPos": {
|
||||
"h": 4,
|
||||
"w": 6,
|
||||
"x": 6,
|
||||
"y": 0
|
||||
},
|
||||
"id": 2,
|
||||
"options": {
|
||||
"colorMode": "background",
|
||||
"graphMode": "area",
|
||||
"justifyMode": "auto",
|
||||
"orientation": "auto",
|
||||
"reduceOptions": {
|
||||
"calcs": [
|
||||
"lastNotNull"
|
||||
],
|
||||
"fields": "",
|
||||
"values": false
|
||||
},
|
||||
"textMode": "auto"
|
||||
},
|
||||
"pluginVersion": "8.0.0",
|
||||
"targets": [
|
||||
{
|
||||
"expr": "kube_pod_container_status_restarts_total{namespace=\"mail\", pod=~\"stalwart-.*\"}",
|
||||
"refId": "A"
|
||||
}
|
||||
],
|
||||
"title": "Container Restarts",
|
||||
"type": "stat"
|
||||
},
|
||||
{
|
||||
"datasource": "Prometheus",
|
||||
"fieldConfig": {
|
||||
"defaults": {
|
||||
"color": {
|
||||
"mode": "thresholds"
|
||||
},
|
||||
"mappings": [],
|
||||
"max": 100,
|
||||
"min": 0,
|
||||
"thresholds": {
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "green",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "yellow",
|
||||
"value": 75
|
||||
},
|
||||
{
|
||||
"color": "red",
|
||||
"value": 90
|
||||
}
|
||||
]
|
||||
},
|
||||
"unit": "percent"
|
||||
}
|
||||
},
|
||||
"gridPos": {
|
||||
"h": 4,
|
||||
"w": 6,
|
||||
"x": 12,
|
||||
"y": 0
|
||||
},
|
||||
"id": 3,
|
||||
"options": {
|
||||
"orientation": "auto",
|
||||
"reduceOptions": {
|
||||
"calcs": [
|
||||
"lastNotNull"
|
||||
],
|
||||
"fields": "",
|
||||
"values": false
|
||||
},
|
||||
"showThresholdLabels": false,
|
||||
"showThresholdMarkers": true
|
||||
},
|
||||
"pluginVersion": "8.0.0",
|
||||
"targets": [
|
||||
{
|
||||
"expr": "(kubelet_volume_stats_used_bytes{namespace=\"mail\", persistentvolumeclaim=\"stalwart-data\"} / kubelet_volume_stats_capacity_bytes{namespace=\"mail\", persistentvolumeclaim=\"stalwart-data\"}) * 100",
|
||||
"refId": "A"
|
||||
}
|
||||
],
|
||||
"title": "Disk Usage (20Gi PVC)",
|
||||
"type": "gauge"
|
||||
},
|
||||
{
|
||||
"datasource": "Prometheus",
|
||||
"fieldConfig": {
|
||||
"defaults": {
|
||||
"color": {
|
||||
"mode": "thresholds"
|
||||
},
|
||||
"mappings": [],
|
||||
"max": 100,
|
||||
"min": 0,
|
||||
"thresholds": {
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "green",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "yellow",
|
||||
"value": 75
|
||||
},
|
||||
{
|
||||
"color": "red",
|
||||
"value": 85
|
||||
}
|
||||
]
|
||||
},
|
||||
"unit": "percent"
|
||||
}
|
||||
},
|
||||
"gridPos": {
|
||||
"h": 4,
|
||||
"w": 6,
|
||||
"x": 18,
|
||||
"y": 0
|
||||
},
|
||||
"id": 4,
|
||||
"options": {
|
||||
"orientation": "auto",
|
||||
"reduceOptions": {
|
||||
"calcs": [
|
||||
"lastNotNull"
|
||||
],
|
||||
"fields": "",
|
||||
"values": false
|
||||
},
|
||||
"showThresholdLabels": false,
|
||||
"showThresholdMarkers": true
|
||||
},
|
||||
"pluginVersion": "8.0.0",
|
||||
"targets": [
|
||||
{
|
||||
"expr": "(container_memory_working_set_bytes{namespace=\"mail\", pod=~\"stalwart-.*\", container=\"stalwart\"} / container_spec_memory_limit_bytes{namespace=\"mail\", pod=~\"stalwart-.*\", container=\"stalwart\"}) * 100",
|
||||
"refId": "A"
|
||||
}
|
||||
],
|
||||
"title": "Memory Usage",
|
||||
"type": "gauge"
|
||||
},
|
||||
{
|
||||
"datasource": "Prometheus",
|
||||
"fieldConfig": {
|
||||
"defaults": {
|
||||
"color": {
|
||||
"mode": "palette-classic"
|
||||
},
|
||||
"custom": {
|
||||
"axisLabel": "",
|
||||
"axisPlacement": "auto",
|
||||
"barAlignment": 0,
|
||||
"drawStyle": "line",
|
||||
"fillOpacity": 10,
|
||||
"gradientMode": "none",
|
||||
"hideFrom": {
|
||||
"tooltip": false,
|
||||
"viz": false,
|
||||
"legend": false
|
||||
},
|
||||
"lineInterpolation": "linear",
|
||||
"lineWidth": 1,
|
||||
"pointSize": 5,
|
||||
"scaleDistribution": {
|
||||
"type": "linear"
|
||||
},
|
||||
"showPoints": "never",
|
||||
"spanNulls": true
|
||||
},
|
||||
"mappings": [],
|
||||
"thresholds": {
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "green",
|
||||
"value": null
|
||||
}
|
||||
]
|
||||
},
|
||||
"unit": "percentunit"
|
||||
}
|
||||
},
|
||||
"gridPos": {
|
||||
"h": 8,
|
||||
"w": 12,
|
||||
"x": 0,
|
||||
"y": 4
|
||||
},
|
||||
"id": 5,
|
||||
"options": {
|
||||
"legend": {
|
||||
"calcs": [],
|
||||
"displayMode": "list",
|
||||
"placement": "bottom"
|
||||
},
|
||||
"tooltip": {
|
||||
"mode": "multi"
|
||||
}
|
||||
},
|
||||
"pluginVersion": "8.0.0",
|
||||
"targets": [
|
||||
{
|
||||
"expr": "rate(container_cpu_usage_seconds_total{namespace=\"mail\", pod=~\"stalwart-.*\", container=\"stalwart\"}[5m]) / (container_spec_cpu_quota{namespace=\"mail\", pod=~\"stalwart-.*\", container=\"stalwart\"} / container_spec_cpu_period{namespace=\"mail\", pod=~\"stalwart-.*\", container=\"stalwart\"})",
|
||||
"legendFormat": "CPU Usage",
|
||||
"refId": "A"
|
||||
}
|
||||
],
|
||||
"title": "CPU Usage Over Time",
|
||||
"type": "timeseries"
|
||||
},
|
||||
{
|
||||
"datasource": "Prometheus",
|
||||
"fieldConfig": {
|
||||
"defaults": {
|
||||
"color": {
|
||||
"mode": "palette-classic"
|
||||
},
|
||||
"custom": {
|
||||
"axisLabel": "",
|
||||
"axisPlacement": "auto",
|
||||
"barAlignment": 0,
|
||||
"drawStyle": "line",
|
||||
"fillOpacity": 10,
|
||||
"gradientMode": "none",
|
||||
"hideFrom": {
|
||||
"tooltip": false,
|
||||
"viz": false,
|
||||
"legend": false
|
||||
},
|
||||
"lineInterpolation": "linear",
|
||||
"lineWidth": 1,
|
||||
"pointSize": 5,
|
||||
"scaleDistribution": {
|
||||
"type": "linear"
|
||||
},
|
||||
"showPoints": "never",
|
||||
"spanNulls": true
|
||||
},
|
||||
"mappings": [],
|
||||
"thresholds": {
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "green",
|
||||
"value": null
|
||||
}
|
||||
]
|
||||
},
|
||||
"unit": "bytes"
|
||||
}
|
||||
},
|
||||
"gridPos": {
|
||||
"h": 8,
|
||||
"w": 12,
|
||||
"x": 12,
|
||||
"y": 4
|
||||
},
|
||||
"id": 6,
|
||||
"options": {
|
||||
"legend": {
|
||||
"calcs": [],
|
||||
"displayMode": "list",
|
||||
"placement": "bottom"
|
||||
},
|
||||
"tooltip": {
|
||||
"mode": "multi"
|
||||
}
|
||||
},
|
||||
"pluginVersion": "8.0.0",
|
||||
"targets": [
|
||||
{
|
||||
"expr": "container_memory_working_set_bytes{namespace=\"mail\", pod=~\"stalwart-.*\", container=\"stalwart\"}",
|
||||
"legendFormat": "Memory Usage",
|
||||
"refId": "A"
|
||||
},
|
||||
{
|
||||
"expr": "container_spec_memory_limit_bytes{namespace=\"mail\", pod=~\"stalwart-.*\", container=\"stalwart\"}",
|
||||
"legendFormat": "Memory Limit",
|
||||
"refId": "B"
|
||||
}
|
||||
],
|
||||
"title": "Memory Usage Over Time",
|
||||
"type": "timeseries"
|
||||
},
|
||||
{
|
||||
"datasource": "Prometheus",
|
||||
"fieldConfig": {
|
||||
"defaults": {
|
||||
"color": {
|
||||
"mode": "palette-classic"
|
||||
},
|
||||
"custom": {
|
||||
"axisLabel": "",
|
||||
"axisPlacement": "auto",
|
||||
"barAlignment": 0,
|
||||
"drawStyle": "line",
|
||||
"fillOpacity": 10,
|
||||
"gradientMode": "none",
|
||||
"hideFrom": {
|
||||
"tooltip": false,
|
||||
"viz": false,
|
||||
"legend": false
|
||||
},
|
||||
"lineInterpolation": "linear",
|
||||
"lineWidth": 1,
|
||||
"pointSize": 5,
|
||||
"scaleDistribution": {
|
||||
"type": "linear"
|
||||
},
|
||||
"showPoints": "never",
|
||||
"spanNulls": true
|
||||
},
|
||||
"mappings": [],
|
||||
"thresholds": {
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "green",
|
||||
"value": null
|
||||
}
|
||||
]
|
||||
},
|
||||
"unit": "bytes"
|
||||
}
|
||||
},
|
||||
"gridPos": {
|
||||
"h": 8,
|
||||
"w": 12,
|
||||
"x": 0,
|
||||
"y": 12
|
||||
},
|
||||
"id": 7,
|
||||
"options": {
|
||||
"legend": {
|
||||
"calcs": [
|
||||
"lastNotNull"
|
||||
],
|
||||
"displayMode": "table",
|
||||
"placement": "bottom"
|
||||
},
|
||||
"tooltip": {
|
||||
"mode": "multi"
|
||||
}
|
||||
},
|
||||
"pluginVersion": "8.0.0",
|
||||
"targets": [
|
||||
{
|
||||
"expr": "kubelet_volume_stats_used_bytes{namespace=\"mail\", persistentvolumeclaim=\"stalwart-data\"}",
|
||||
"legendFormat": "Used Space",
|
||||
"refId": "A"
|
||||
},
|
||||
{
|
||||
"expr": "kubelet_volume_stats_capacity_bytes{namespace=\"mail\", persistentvolumeclaim=\"stalwart-data\"}",
|
||||
"legendFormat": "Total Capacity (20Gi)",
|
||||
"refId": "B"
|
||||
},
|
||||
{
|
||||
"expr": "kubelet_volume_stats_available_bytes{namespace=\"mail\", persistentvolumeclaim=\"stalwart-data\"}",
|
||||
"legendFormat": "Available Space",
|
||||
"refId": "C"
|
||||
}
|
||||
],
|
||||
"title": "Disk Space Over Time (Encrypted Volume)",
|
||||
"type": "timeseries"
|
||||
},
|
||||
{
|
||||
"datasource": "Prometheus",
|
||||
"fieldConfig": {
|
||||
"defaults": {
|
||||
"color": {
|
||||
"mode": "palette-classic"
|
||||
},
|
||||
"custom": {
|
||||
"axisLabel": "",
|
||||
"axisPlacement": "auto",
|
||||
"barAlignment": 0,
|
||||
"drawStyle": "line",
|
||||
"fillOpacity": 10,
|
||||
"gradientMode": "none",
|
||||
"hideFrom": {
|
||||
"tooltip": false,
|
||||
"viz": false,
|
||||
"legend": false
|
||||
},
|
||||
"lineInterpolation": "linear",
|
||||
"lineWidth": 1,
|
||||
"pointSize": 5,
|
||||
"scaleDistribution": {
|
||||
"type": "linear"
|
||||
},
|
||||
"showPoints": "never",
|
||||
"spanNulls": true
|
||||
},
|
||||
"mappings": [],
|
||||
"thresholds": {
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "green",
|
||||
"value": null
|
||||
}
|
||||
]
|
||||
},
|
||||
"unit": "none"
|
||||
}
|
||||
},
|
||||
"gridPos": {
|
||||
"h": 8,
|
||||
"w": 12,
|
||||
"x": 12,
|
||||
"y": 12
|
||||
},
|
||||
"id": 8,
|
||||
"options": {
|
||||
"legend": {
|
||||
"calcs": [],
|
||||
"displayMode": "list",
|
||||
"placement": "bottom"
|
||||
},
|
||||
"tooltip": {
|
||||
"mode": "multi"
|
||||
}
|
||||
},
|
||||
"pluginVersion": "8.0.0",
|
||||
"targets": [
|
||||
{
|
||||
"expr": "kubelet_volume_stats_inodes_used{namespace=\"mail\", persistentvolumeclaim=\"stalwart-data\"}",
|
||||
"legendFormat": "Inodes Used",
|
||||
"refId": "A"
|
||||
},
|
||||
{
|
||||
"expr": "kubelet_volume_stats_inodes{namespace=\"mail\", persistentvolumeclaim=\"stalwart-data\"}",
|
||||
"legendFormat": "Total Inodes",
|
||||
"refId": "B"
|
||||
}
|
||||
],
|
||||
"title": "Disk Inodes Usage",
|
||||
"type": "timeseries"
|
||||
}
|
||||
],
|
||||
"refresh": "30s",
|
||||
"schemaVersion": 27,
|
||||
"style": "dark",
|
||||
"tags": ["stalwart", "mail", "kubernetes"],
|
||||
"templating": {
|
||||
"list": []
|
||||
},
|
||||
"time": {
|
||||
"from": "now-6h",
|
||||
"to": "now"
|
||||
},
|
||||
"timepicker": {},
|
||||
"timezone": "",
|
||||
"title": "Stalwart Mail Server",
|
||||
"uid": "stalwart-mail",
|
||||
"version": 1
|
||||
}
|
||||
116
apps/stalwart/stalwart-helm-fix.yaml
Normal file
116
apps/stalwart/stalwart-helm-fix.yaml
Normal file
|
|
@ -0,0 +1,116 @@
|
|||
# Stalwart Helm Fix - Proper Environment Configuration
|
||||
image:
|
||||
repository: stalwartlabs/stalwart
|
||||
tag: "v0.16.9"
|
||||
pullPolicy: Always
|
||||
|
||||
# IMPORTANT: Remove args to let Stalwart use environment variables
|
||||
# The Helm chart should not pass --config if we want env-based config
|
||||
extraArgs: []
|
||||
|
||||
# Enable recovery admin
|
||||
recoveryAdmin:
|
||||
enabled: true
|
||||
username: admin
|
||||
password: ***REMOVED***
|
||||
|
||||
# Persistence
|
||||
persistence:
|
||||
enabled: true
|
||||
storageClass: hcloud-volumes-encrypted
|
||||
accessMode: ReadWriteOnce
|
||||
size: 20Gi
|
||||
|
||||
# Service configuration
|
||||
service:
|
||||
type: LoadBalancer
|
||||
ports:
|
||||
smtp: 25
|
||||
submission: 587
|
||||
smtps: 465
|
||||
imap: 143
|
||||
imaps: 993
|
||||
pop3: 110
|
||||
pop3s: 995
|
||||
sieve: 4190
|
||||
mgmt: 8080
|
||||
|
||||
# Ingress
|
||||
ingress:
|
||||
enabled: true
|
||||
className: traefik
|
||||
annotations:
|
||||
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
||||
traefik.ingress.kubernetes.io/router.entrypoints: websecure
|
||||
hosts:
|
||||
- host: mail.basicstack.de
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
portName: mgmt
|
||||
tls:
|
||||
- secretName: stalwart-tls
|
||||
hosts:
|
||||
- mail.basicstack.de
|
||||
|
||||
# Minimal config - just database location
|
||||
config:
|
||||
"@type": "RocksDb"
|
||||
path: "/var/lib/stalwart"
|
||||
|
||||
# Security contexts
|
||||
podSecurityContext:
|
||||
fsGroup: 2000
|
||||
runAsUser: 2000
|
||||
runAsGroup: 2000
|
||||
|
||||
containerSecurityContext:
|
||||
runAsNonRoot: true
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
drop: [ALL]
|
||||
add: [NET_BIND_SERVICE]
|
||||
seccompProfile:
|
||||
type: RuntimeDefault
|
||||
|
||||
# Resources
|
||||
resources:
|
||||
requests:
|
||||
memory: "512Mi"
|
||||
cpu: "250m"
|
||||
limits:
|
||||
memory: "2Gi"
|
||||
cpu: "2"
|
||||
|
||||
# Environment variables for proper configuration
|
||||
env:
|
||||
- name: RUST_LOG
|
||||
value: "debug"
|
||||
- name: STALWART_LOG_LEVEL
|
||||
value: "debug"
|
||||
|
||||
# OIDC Configuration
|
||||
envFrom:
|
||||
- secretRef:
|
||||
name: stalwart-stalwart-env
|
||||
|
||||
# Additional OIDC env vars
|
||||
extraEnv:
|
||||
- name: STALWART_OAUTH_ENABLE
|
||||
value: "true"
|
||||
- name: STALWART_OAUTH_ISSUER
|
||||
value: "https://auth.basicstack.de"
|
||||
- name: STALWART_OAUTH_REDIRECT_URI
|
||||
value: "https://mail.basicstack.de/admin/oauth/callback"
|
||||
- name: STALWART_OAUTH_SCOPES
|
||||
value: "openid profile email"
|
||||
- name: STALWART_OAUTH_CLIENT_ID
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: stalwart-oidc
|
||||
key: oidc-client-id
|
||||
- name: STALWART_OAUTH_CLIENT_SECRET
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: stalwart-oidc
|
||||
key: oidc-client-secret
|
||||
100
apps/stalwart/stalwart-helm-values-oidc.yaml
Executable file
100
apps/stalwart/stalwart-helm-values-oidc.yaml
Executable file
|
|
@ -0,0 +1,100 @@
|
|||
# Stalwart Helm Values with OIDC Configuration
|
||||
image:
|
||||
repository: stalwartlabs/stalwart
|
||||
tag: latest
|
||||
pullPolicy: Always
|
||||
|
||||
replicaCount: 1
|
||||
|
||||
# Recovery admin for initial setup
|
||||
recoveryAdmin:
|
||||
enabled: true
|
||||
username: admin
|
||||
password: ***REMOVED***
|
||||
|
||||
# Persistent storage with encrypted volumes
|
||||
persistence:
|
||||
enabled: true
|
||||
storageClass: hcloud-volumes-encrypted
|
||||
accessMode: ReadWriteOnce
|
||||
size: 20Gi
|
||||
|
||||
# Service configuration
|
||||
service:
|
||||
type: LoadBalancer
|
||||
ports:
|
||||
smtp: 25
|
||||
submission: 587
|
||||
smtps: 465
|
||||
imap: 143
|
||||
imaps: 993
|
||||
pop3: 110
|
||||
pop3s: 995
|
||||
sieve: 4190
|
||||
mgmt: 8080
|
||||
|
||||
# Ingress for web UI
|
||||
ingress:
|
||||
enabled: true
|
||||
className: traefik
|
||||
annotations:
|
||||
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
||||
traefik.ingress.kubernetes.io/router.entrypoints: websecure
|
||||
hosts:
|
||||
- host: mail.basicstack.de
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
portName: mgmt
|
||||
tls:
|
||||
- secretName: stalwart-tls
|
||||
hosts:
|
||||
- mail.basicstack.de
|
||||
|
||||
# RocksDB configuration
|
||||
config:
|
||||
"@type": "RocksDb"
|
||||
path: "/var/lib/stalwart"
|
||||
|
||||
# Pod security context
|
||||
podSecurityContext:
|
||||
fsGroup: 2000
|
||||
runAsUser: 2000
|
||||
runAsGroup: 2000
|
||||
|
||||
# Container security context
|
||||
containerSecurityContext:
|
||||
runAsNonRoot: true
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
drop: [ALL]
|
||||
add: [NET_BIND_SERVICE]
|
||||
seccompProfile:
|
||||
type: RuntimeDefault
|
||||
|
||||
# Resources
|
||||
resources:
|
||||
requests:
|
||||
memory: "512Mi"
|
||||
cpu: "250m"
|
||||
limits:
|
||||
memory: "2Gi"
|
||||
cpu: "2000m"
|
||||
|
||||
# OIDC Configuration via environment variables
|
||||
env:
|
||||
- name: STALWART_OAUTH_ENABLE
|
||||
value: "true"
|
||||
- name: STALWART_OAUTH_ISSUER
|
||||
value: "https://auth.basicstack.de"
|
||||
- name: STALWART_OAUTH_CLIENT_ID
|
||||
value: "stalwart-webui"
|
||||
- name: STALWART_OAUTH_CLIENT_SECRET
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: stalwart-oidc
|
||||
key: oidc-client-secret
|
||||
- name: STALWART_OAUTH_REDIRECT_URI
|
||||
value: "https://mail.basicstack.de/admin/oauth/callback"
|
||||
- name: STALWART_OAUTH_SCOPES
|
||||
value: "openid profile email"
|
||||
100
apps/stalwart/stalwart-monitoring.yaml
Executable file
100
apps/stalwart/stalwart-monitoring.yaml
Executable file
|
|
@ -0,0 +1,100 @@
|
|||
---
|
||||
# PrometheusRule for Stalwart alerting
|
||||
apiVersion: monitoring.coreos.com/v1
|
||||
kind: PrometheusRule
|
||||
metadata:
|
||||
name: stalwart-alerts
|
||||
namespace: mail
|
||||
labels:
|
||||
app: stalwart
|
||||
prometheus: kube-prometheus-stack
|
||||
release: kube-prometheus-stack
|
||||
spec:
|
||||
groups:
|
||||
- name: stalwart.rules
|
||||
interval: 30s
|
||||
rules:
|
||||
# Pod availability alert
|
||||
- alert: StalwartPodDown
|
||||
expr: kube_pod_status_phase{namespace="mail", pod=~"stalwart-.*", phase!="Running"} == 1
|
||||
for: 5m
|
||||
labels:
|
||||
severity: critical
|
||||
component: mail
|
||||
annotations:
|
||||
summary: "Stalwart mail server pod is down"
|
||||
description: "Stalwart pod {{ $labels.pod }} in namespace {{ $labels.namespace }} has been down for more than 5 minutes."
|
||||
|
||||
# Container restart alert
|
||||
- alert: StalwartContainerRestarting
|
||||
expr: rate(kube_pod_container_status_restarts_total{namespace="mail", pod=~"stalwart-.*"}[15m]) > 0
|
||||
for: 5m
|
||||
labels:
|
||||
severity: warning
|
||||
component: mail
|
||||
annotations:
|
||||
summary: "Stalwart container is restarting"
|
||||
description: "Stalwart container in pod {{ $labels.pod }} has restarted {{ $value }} times in the last 15 minutes."
|
||||
|
||||
# Memory usage alert
|
||||
- alert: StalwartHighMemoryUsage
|
||||
expr: |
|
||||
(container_memory_working_set_bytes{namespace="mail", pod=~"stalwart-.*", container="stalwart"}
|
||||
/ container_spec_memory_limit_bytes{namespace="mail", pod=~"stalwart-.*", container="stalwart"}) > 0.85
|
||||
for: 10m
|
||||
labels:
|
||||
severity: warning
|
||||
component: mail
|
||||
annotations:
|
||||
summary: "Stalwart memory usage is high"
|
||||
description: "Stalwart container {{ $labels.pod }} is using {{ $value | humanizePercentage }} of its memory limit."
|
||||
|
||||
# CPU usage alert
|
||||
- alert: StalwartHighCPUUsage
|
||||
expr: |
|
||||
(rate(container_cpu_usage_seconds_total{namespace="mail", pod=~"stalwart-.*", container="stalwart"}[5m])
|
||||
/ container_spec_cpu_quota{namespace="mail", pod=~"stalwart-.*", container="stalwart"}
|
||||
* container_spec_cpu_period{namespace="mail", pod=~"stalwart-.*", container="stalwart"}) > 0.85
|
||||
for: 10m
|
||||
labels:
|
||||
severity: warning
|
||||
component: mail
|
||||
annotations:
|
||||
summary: "Stalwart CPU usage is high"
|
||||
description: "Stalwart container {{ $labels.pod }} is using {{ $value | humanizePercentage }} of its CPU limit."
|
||||
|
||||
# Disk usage alert for PVC
|
||||
- alert: StalwartDiskSpaceLow
|
||||
expr: |
|
||||
(kubelet_volume_stats_used_bytes{namespace="mail", persistentvolumeclaim="stalwart-data"}
|
||||
/ kubelet_volume_stats_capacity_bytes{namespace="mail", persistentvolumeclaim="stalwart-data"}) > 0.75
|
||||
for: 5m
|
||||
labels:
|
||||
severity: warning
|
||||
component: mail
|
||||
annotations:
|
||||
summary: "Stalwart disk space is running low"
|
||||
description: "Stalwart PVC stalwart-data is {{ $value | humanizePercentage }} full. Consider expanding the volume."
|
||||
|
||||
- alert: StalwartDiskSpaceCritical
|
||||
expr: |
|
||||
(kubelet_volume_stats_used_bytes{namespace="mail", persistentvolumeclaim="stalwart-data"}
|
||||
/ kubelet_volume_stats_capacity_bytes{namespace="mail", persistentvolumeclaim="stalwart-data"}) > 0.90
|
||||
for: 5m
|
||||
labels:
|
||||
severity: critical
|
||||
component: mail
|
||||
annotations:
|
||||
summary: "Stalwart disk space is critically low"
|
||||
description: "Stalwart PVC stalwart-data is {{ $value | humanizePercentage }} full. Immediate action required!"
|
||||
|
||||
# PVC availability alert
|
||||
- alert: StalwartPVCNotBound
|
||||
expr: kube_persistentvolumeclaim_status_phase{namespace="mail", persistentvolumeclaim="stalwart-data", phase!="Bound"} == 1
|
||||
for: 5m
|
||||
labels:
|
||||
severity: critical
|
||||
component: mail
|
||||
annotations:
|
||||
summary: "Stalwart PVC is not bound"
|
||||
description: "Stalwart PVC stalwart-data is in {{ $labels.phase }} state. Mail data may be unavailable."
|
||||
18
apps/stalwart/stalwart-oauth2-proxy-secret-sealed.yaml
Normal file
18
apps/stalwart/stalwart-oauth2-proxy-secret-sealed.yaml
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
---
|
||||
apiVersion: bitnami.com/v1alpha1
|
||||
kind: SealedSecret
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: stalwart-oauth2-proxy-secret
|
||||
namespace: stalwart
|
||||
spec:
|
||||
encryptedData:
|
||||
client-id: AgARqBsHsoED3MPN81QKic7nfuLpv4CAIpqkPQL3lwUSqmmbxK4JAO2wGuSpS0we+tr7p84VhXWHIe5e7jfe3J+lj5W0JAZdfwEED/5lV/wKD/xNfHgO0iKUTJHvetU7i3ecMogVqJGqG9rX42dE83LfybZ4Ua21AcjTMPSQmakQb8204VXIxqTlOFBD0f7hWNCs7IZ+AfLBjLEZHqmdfh849/TKwXnXFDtYMYzG16o/+zkXBKkOoK/RuPQN8Nt2YdA7Xd1AqU/DggzD8GzMJEvPEFvZQjBnq+hgrxa4lY5dj+S6nJ9/Tt+dLYV6+08vSPLM8mN0jc0Vd73lr2aGnjL8TurKB7s3yDeKsBUgqoilkDJO7YoCBfx3px73lK+a1G+i+KNf7iUcTIGIRq+nIYLHXP3OWSFCIBHe5BhH4oyB3GRUIhHhgBTEMXnHyxALqfzsr3SMHdnRHYnvz9IMLWxw1NTiQhvEP8zF0gZLjpHATWglPvX50vQnESc30HYa0HXc2F9xPX0oTnWucmviuSKGS0DHmNO9zKLFZNR2DJm/FVY6AMaH2YZxpM/3RDqEmCbfGzLgzslaIz8vp432FhR/Isl9yzHV4SJDlXKBlD/EDNo9tthgpqzQilBxx2I79ute1Nbt0Ka71P7doeVyl93NYKCFWhh36hHwlM4vpePUmpRronv4iZl35xzAoV8hNm1RxxLCI79PESH4Qk6XeXiQXBt0s5T7/3ZaMUDnxugY3G9F1U4=
|
||||
client-secret: AgBbziMEuveXDkylbbtppuNIHyJ7rcC6Do+qANtpk89N4Qqo+wFmG/mPzCXDpCjX/i+o7r4vOhwfuzHREy42Pn76VaulYiNpkETiIGFc7266dCIIEwSaHcn353iMHgDYQgnqehsHZejq6EGUEM1Wtv7O+8Bt1O+E7jLxxeAtB6XdaFwyDvvZrpJuN981me1DMPk4tvEfoVkDwtVm+dKogR5GnaN1FK75hojCoqU+SxUulmX6ykj7fdV2GPsxQTOFT1gy/hSWfR3BZ1ZBhHgt3xtfWKWm5DUcn7CFCJGgVxXbe1xspL7ntZu/aDtV01K1udVAVVGnmrckpYr9R54+ATnhcIvt4O8kRBHyJKdeP/Fi9hN7Kupc7yL+gljMaQhMMYu8gtC7Vf9cDPH1ytMfhbyrF2lkKY7MU+iWvFxVPnY6tgd2R2dwhSB0Uxde7iznAiVgD1dObw0JDlHhIKQHn5+Bp9z0gYscK3BJPLbW+xCCIkTOFWXnCu9ahDXD7C+pEpngp1hGdGmMhT1wKjD2GY+8RAlO2Gz9K1Jdix6ukqL2LY35QgdSXrxrJgkD1xRkQP6BEBHefcYcP1QO9gl+xKmxPDZX60MgT0RYAE9ETJBuLuw/11kZKjthlWkgzqzwwKd9S+jk6aghcJueTv89gTcRnDlP9URjjQi8iFk/ag9+Af2Q4ftW7NPu7K141onzA0VPE3ZruwhQVhpWVbLb+cXfmShbn360TECBFFXXAj1oBA==
|
||||
cookie-secret: AgAzT2XhiQrTb2AU5nZAPCJqTZTXk/nSCU3FUgu0g/7N5Wg7vis5MLv8RaUSNrx7nDBFtHO0YJb8cWx+UF69j2tBNmnOYYFmhYIE+U0oK7ZgKuTfbFUiQISmOwKzq/JCbsn9pR/jsjaBXCiIfVBvV15tVDj44iDtVNRtmgjHfatvD/N2YaPn5KP8t/8Xr+Enp8PF58+Z44OO30hG9mXXInAZzPuKbv9kOwMDdRGm+6gWczigyC26Cl3oIVRO4t5TcKDcoEmQD9N7NfEjbZ/D+6GpruYIM7u1W9rEip63SHZ6ty0B2m9BmQZYRWcJPX5ISh5VHPvxY665gAcg1+Qooekp9YcHubb8FJjMHGBuXj2fJVjCbjSZSIuiU6cEoIn9C2yX24rvcVOG7EMDysG9LqDsZnkvqFsQ2uRuQR9d3oKZPkR9xXGibOHDIKPcWVH212hX7QtAo7On0JeeDM/QiSBs+MKuF1l4pdiGfyXqZ0pwrlHsfWwZaZYDYRhMWmftrZTsjTBMDZ9Cw8i2BQpk9NC04wCwJ6EPNySPD9HLJ9HNnet6bEAFmLmMZyN9x6vbW20VJKfx09eOjd99Y4TlEIsVLyUF9S29lVoib09EfzvDMn9axDIYaZ0SKhqZF+eH0lHzhr1vXtMxfecLO9kjBarcAuSilfIS6XqtwcXXUhjiRbz0qGtUNvy3n+xWVCTXtAz0FB4cuUSIqxoV0gXeDRNNQiRdCJNABNGLJxKHYcl4QA==
|
||||
template:
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: stalwart-oauth2-proxy-secret
|
||||
namespace: stalwart
|
||||
type: Opaque
|
||||
40
apps/stalwart/stalwart-oidc-config.yaml
Executable file
40
apps/stalwart/stalwart-oidc-config.yaml
Executable file
|
|
@ -0,0 +1,40 @@
|
|||
---
|
||||
# Stalwart OIDC Configuration
|
||||
# This ConfigMap configures Pocket ID as the OAuth provider for Stalwart Mail Server
|
||||
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: stalwart-oidc-config
|
||||
namespace: mail
|
||||
data:
|
||||
oauth.toml: |
|
||||
# OAuth/OIDC Configuration for Pocket ID
|
||||
[oauth]
|
||||
|
||||
# OAuth provider configuration
|
||||
[oauth.pocket-id]
|
||||
issuer-url = "https://auth.basicstack.de"
|
||||
# client-id and client-secret loaded from SealedSecret: stalwart-oidc-sealed.yaml
|
||||
client-id = "REPLACED_BY_SECRET"
|
||||
client-secret = "REPLACED_BY_SECRET"
|
||||
|
||||
# OAuth endpoints (auto-discovered from issuer-url)
|
||||
authorization-endpoint = "https://auth.basicstack.de/api/oidc/authorize"
|
||||
token-endpoint = "https://auth.basicstack.de/api/oidc/token"
|
||||
userinfo-endpoint = "https://auth.basicstack.de/api/oidc/userinfo"
|
||||
|
||||
# Scopes to request
|
||||
scopes = ["openid", "profile", "email"]
|
||||
|
||||
# Callback URL (must match what's configured in Pocket ID)
|
||||
redirect-uri = "https://mail.basicstack.de/login/oauth"
|
||||
|
||||
# User attribute mapping
|
||||
[oauth.pocket-id.user-mapping]
|
||||
username = "preferred_username"
|
||||
email = "email"
|
||||
name = "name"
|
||||
---
|
||||
# Secret managed via SealedSecrets
|
||||
# See: stalwart-oidc-sealed.yaml
|
||||
17
apps/stalwart/stalwart-oidc-sealed.yaml
Normal file
17
apps/stalwart/stalwart-oidc-sealed.yaml
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
---
|
||||
apiVersion: bitnami.com/v1alpha1
|
||||
kind: SealedSecret
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: stalwart-oidc
|
||||
namespace: stalwart
|
||||
spec:
|
||||
encryptedData:
|
||||
client-id: AgAZPyei756I2qAxQUcZ+PPhTXxTV7pVCK3KuhZoMp6YqrN5tLYQsayRsof7SmT3rjd/kIquWLj+B66cly+JYd5+ejTeaWZV7lxpjvmX80kFa9i6GEI/4KyBczSKZFLMdFdXF4J8YCW3mmQ/Thw+FCvAM9bFcHKXOrKxTJUOR6mDNx5N94G4yc0HH2gfyvfMuzFdzmBhF01wliOCMNpL53RZ5vHc8ysIlNGdReSlovCFZNWwADqxDIGOlyIOd1/dKMsw0QVfPypdkgPGWCH94qcQe8HmzlY+Qh536+AqWLiOzMXv4aZXjO1g7URA1JUPqfrkRWlQ1HMCsiLfHEEzuMq5yNbvs1gY6rj8TBqfSEr+dgbQ2n/dBqhzpiakKxJKLUHNf/6eRipsIV8JAj1/bClH7wxJLmtWgyHkaI1IEy/hCx30K2e+g42ogfrPYo7OZSanT562t6wnzOT2aKfbcPhiBBlZx+6Sw6/aHbOu+7gd30cTm0RnfxAe4/S8GqRn24Hta1/0GK+XHzHDAv5CsDklZYS7IYBd9mtcrDP8xCFnKDAFxATwRYUoxBxbpqJdzf0sysF12GWDUbGcSDgyhukBkzox7Ym2+rh4Xq/kVUcbB+G6v8f3pZrqf/C/Adv4fZKmmAote2Z4h8aCHgLST4xIdwH0nydxurGs/+Pb8UHY2vWBhsJwblUoOU6LywN5c43ooa+AiDnGauLo/yXLsfuElbmUy6y3jPJs20J62Ea+lZR5cX4=
|
||||
client-secret: AgB+khWWpOjDzt8YohAaRmwJ8789tqJD+jvGl/Sitxz9A0yNH1MABPdRa0XbwtmoZkLFAgtCozPJfodCk9HgF4sEOPudrvHdHxE9BL9Tw+ropA56EzvIIOgyvgfOUxKC5gvdiXZN7mty0lldITLMxfeY+IvbxGN4AuEgDnF3YZ0wyKj3i3IfZ47502Xj/aUYiCwO9Fz0K8iI6M5y1ThoeJq1GhHQhPK8Wcq13pJYRIg1c3TGP1PopgpCA7R2O7u6/O6csbJMeOWJpeuUDteZGu4Zr8md79knWz9QNiZR4MNeEjzpD8tfCHqKSaLoR++zqMqN2S+xCQhvBvrS+16E3qupC3BtzidJazylVW3FwrYMhRUguaBDZ7Z/6ueGt7fnaSWDH1KuVYRw+a5AEI/tlJqByWt+C3z4P7G2VAqZLvKNsP1ZUWO2aiYj8o8ROwilAWGoYyukluih2fn3XlJXQUdoFiuLs+ZUrXv2musL+68+Lzv9v+5cBzVGenfBVX5+uCoQmo7lxFR+z4eDTwRjvKrOLEwgdDcwhsWt8tRT2EvQ371SPVaGmiJAk+HN4+o5lh7fzranQ8yPR0kVYvygJwBRUkDda6asqjDo7RvPEW0xkBLSjmD0Sg5eAS8YneRpTaHlUnQadx5Gi19ygX/DPGVsCc2nzhQjwl9jfQHapCzJB3oxC62pkCZPZt9v0Oyo65gApOw/bwFScgfOkNeihNe3ab3hvu95zirUol4leW6a2Q==
|
||||
template:
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: stalwart-oidc
|
||||
namespace: stalwart
|
||||
type: Opaque
|
||||
20
apps/stalwart/stalwart-s3-backup-sealed.yaml
Normal file
20
apps/stalwart/stalwart-s3-backup-sealed.yaml
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
---
|
||||
apiVersion: bitnami.com/v1alpha1
|
||||
kind: SealedSecret
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: stalwart-s3-backup
|
||||
namespace: stalwart
|
||||
spec:
|
||||
encryptedData:
|
||||
access-key: AgAg8YEUTFc3YlfKKzIoHyG1WjL9+5F3enPhbWtyrEtLH7tiOaq9IEklOKft+ng8MJFNdORy3all7F9zjht436jlZFuVc75b/ZYWnKrjwhtnkfaSqmKPND0KmbBv/5IEu9rGM2UlwIJypxLzR4ef1aRDoTN9fdFL6lA5f0JETERCGrJqum69cKKV71yQ3Q0onlyftoymE00J5dThYrqSkKEB0GKRLqfDmvPY+oAocb2Hm6pIaM7/tM9MAS5fTr0ABHfvyB4qCro41PRl3QfVOfQpTb6yeW00p3heInBCPAvcUyH13VNH921WB5pEcARe54u4gsYe1TZH9DpzcaP3ZKS//5+5ST9pxkLnGidzwU3cCKDeGRDQuyC3hD7DgF2skZT1dSXaDOeeWZdS0ElWWszo251Mtk1CFbJe2oyKiWF/4z1rZ9l4aNcE3qP638zrfqHvRwwlLZpAiN9Auty1I1JDfp12yb8k9ojMq2coG2N56cQE7l9UxPCgfafhanI5VGweNJlkusG3HEHbE0QEXggNoY+iPpQNiJTAAz5Fm2uqo3WJjcx4/cz4+ZCwsUU2szgMhwmnOI+SLwcwD3SvkRMivDIh+eTpcMKdjmiXgiS1319ub69ns3hiw8THwnctevT550n9F+dhs8oc+2smsPAthrOgF2GSME+U91ALfhrq3H7WPCFU0mNLpAbM0KsYP5soSK16hibSYXr49PSo+S0Z571a4g==
|
||||
bucket: AgBiQK1GGumYvtfPZSPbJNDVnwo83VY2YuEQliYIoxFtBk7i1PDJQgLOyRtls0OicD2Sz2qE01/vctkE/CYYjRGimTfYMteggPNcBjN63r9yA5mFT/e9FCYkVNzjME8bruAstWNITINDP3WYFMqIsQ/n61A+lGLlYmAxKs+Fv4pjZeRvggEoXPPp7hVqjkdJXoLhPhX8Q8JgqUO7ikcxXuLc/xUKegrvHOl37W0lHlShACAVbYjrfq4W21vrJdnjhJJiiu75j6nQAz246UrujbImKLVodyzkWK54aDbhOvNdQSgGslWkbYvQ+qJ7MVmKNcszp7ohOKMK6/M91BxIEPRFPEfR2n6pxD+2qrBMjUDMx9zbJTXKuGQKIq1AT8LQiKGYr9BlPZWK21nFLKy3BmTrMVqHL3e3l5gdo/PTf8QzX5l4AkO+mc33rJJkzQTQG5TzTUZNdyHn2hvvxsxOuDkz9vQ+L2n/icCX4pvYPozUrvcH2xRmpnC2WQhIJq1VCtz27mtKaoaTE6V6cxF+g3boFBI0SlauqX5lQoahrfOIvrY781vwCGK9K0OYrWHyVD+HvNUqtbjIqK0k9TZYrmkzUa/HI2DJdrVnvnAHNV4fEsVvKtx4K+kVY1pVG1z23uy8ITQi8mvPWRqH5hB1Yo0JKAjLsjWzUG++uvCtv87h+fx7mwiMndeAJSF1hWyjvM4OQJPmMYiCDr3nWkEhmvjEGQ==
|
||||
endpoint: AgA1XHEld9VqRTQw+YI+v4loinopol4fnkTtI60M/XI9READfFfFkV555q//jCdWHeo2jXuGiW+cdcAlDsMouzzGk2RnHpfxPIHzZuV02yWOT8jmG48JifDTQl2Pdrl3fgpia/dYFmoSG7VLxJDHpl8q6yt/HOoECI+LFciu9MV2AYihO0UBd0wd+PufRn4mGuhc7jIJp2BtyTAQvhC1/r+0l7a7BZWCtGemCDz2KhyunAV7qywuNE7TPQPtco+q4JhbycF6iMfb2yBot+Av2+fP1FseW7m3ybeVL8VEpggtvuErffwXysl2vfQBVHAyY+KpBF4BQDUwcABKk/HkT0KJ6jDy/WuSOqAds4w7KyVIaz6qCtqr8zI+/GAont1Y1vwpprVcyYGDAU10T4s2E2xcQRtq1ynq0O4F79ilvDXyAobwAgTbJC4ssE5VfLmnMYFNbL2bJHzw4A68tUu48n7Uu3wL+hehZMq+MwHlvU1urfbiptLF4Pl0TifiQYufMgDwmARpJcekQBoGIwSWFPPFIhVSbgK3ZxYbJqx3v4Gb9jek0KaNrlCEWCERoxMcROgQO+yKWiyUMe01O0t2xIiLW95H70TnTXfA+/B8Xr14otT9SM6rLH8fYy6+ctpmR9SzBSqH32N1PlJecYxgi0GgxFwxPGwz0Ccqx7xgizYthv5nMEaf1cZm8fVvZF/8KecSDHAK/jNXyJn3rHr1vqb3bohbTbhTagnxQNdun3CkDMwFjA==
|
||||
restic-password: AgB+D9uD90BTJTRmTNHqVdXE74cXPEWp5t8R0rYTyTgptKY79NkKJc4iOlTstX2KRdzMibSleTu7slM1FHLJZZs/xsIyMRAWVAdkCRMiVqOetpI+6QtwEdjoxt2kiJNEL7AVJiU+8ZrWlK95PsQBUhk8YYjKNh6Cjfkqkb7+PfeSrSNWve9nm6HqVPBxEUSkOtHuchVziuuCepHjPbrN3//awRtoJO0b+8eRULvZmHepNXzCkzKZe0LpHvho/DlTbJAfuQBPYGWwEYD/8DBkpIHdbE4AfCmEm4U1IxfGW5FE34++n0OPyAKM6qeTF46jmVZV2PRXv0QOz3qqGLM9U4VbBWE8OzFPi7mjtQRgkttfmMsMrxLXG4ODUlURfBhcXJJRA818mbzJ8t29DHuGpIcJxW28SbE2uVwQNjzDKp0RlIvjMH0S1D6xwf0E/00FiZ8ng9nD0bbf9JYpnQY4RDQacV4TLvJNKK4rc2VVJ4e1t7mvADk1BtFfDFIYtNXszMxGxs2vfRB6UtVXk80jXgLa8LdDEWyRpkTa1USvD3T02kukub95AcPGdnWQX6GDPuDDJS9BuZIWboelkNVuFPNbvemzecX45IVP8qLbS9NpBMfOyDHrS+PSvkxMpHy/LvNT/U/A81OIwFhperE9vIMEGvwh0Hq6wx2//Fiso2v8xzdfcZXWWM4HZTfvbdQymqk9d9hmjoDVkBhpQxnBGYNytzdWb8VCudrvHvIY+BAS9OuuB9TIv4FLeO0iXg==
|
||||
secret-key: AgAl5eIpafdecB7CDhUiVQ3ozrf+7ND9pTs6rKqlvbleVRFqsC+/wzGhmVh/1ZOliaDQDR0oUbPwESDuIF74GmYWLjJU//D8D/hnldkg6guJyE6mzkMsEy+LY6fKO6vlfeJocLscscheuKRl7wdXBqc17APvgX97YnH64GPNIypOx5Xhvp9br9C9BZEOkfQD0Dfq7mKxJqDDjUTecQRt6+EpLzdYhkZdWs6Mw9oQUFmto10AA6zoQ8b2p/CaLu8REmVxZzgfA6ve9CMeVq1t6olcNUnrj+yMtByPmsJL4bGZLKWAzdmGzeEOb7IZ8bAJ0tRlLLjzxq3oP4UQgNs9EgzJLe/2mv+3y6T01vDmTzjOWm398Gm9e7ZQThSnfJEDZe2UKfj6ejcEzLkKHVcFJ0haUpJYrCOQLgEfFzG264FuhCjZsIWxRA8IBpJ85/UoPcFAlplai44kEjY/pOtCembOHYd8HTJh1QpI1wyGzRe7r8li7WhaQSOFihU1ZLXEhIZ2NDF2p+qs6ywYlRvqF8gKGZRJvLcH9o3cEA7ju2WPDkX+dv9AtdONZhZniY0U5C0UfOQ6gapQ40VP+KrrrDy+FkzFCjJDshJY7XPkDHQOoUmnIRdbdDoXjH2gITsqQZhJalGEZqxlP65qSYTDkaPtUjIVbZLU7UibLF0niwhp6CQJX3AJSndH6Tk9pG2y8S9xE23tbtW64fyefu8RhoAp76pPjXxZ7kyQHRqmipJgcca0Hn4YkxrC
|
||||
template:
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: stalwart-s3-backup
|
||||
namespace: stalwart
|
||||
type: Opaque
|
||||
5
apps/stalwart/stalwart-service-patch.yaml
Executable file
5
apps/stalwart/stalwart-service-patch.yaml
Executable file
|
|
@ -0,0 +1,5 @@
|
|||
spec:
|
||||
externalIPs:
|
||||
- 178.105.17.239 # k3s-cp-1 (where DNS points)
|
||||
- 178.105.216.48 # k3s-worker-1
|
||||
- 49.13.134.255 # k3s-worker-2
|
||||
6
apps/stalwart/stalwart-statefulset-patch-v2.yaml
Normal file
6
apps/stalwart/stalwart-statefulset-patch-v2.yaml
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
spec:
|
||||
template:
|
||||
spec:
|
||||
containers:
|
||||
- name: stalwart
|
||||
args: ["--help"]
|
||||
9
apps/stalwart/stalwart-statefulset-patch-v3.yaml
Normal file
9
apps/stalwart/stalwart-statefulset-patch-v3.yaml
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
spec:
|
||||
template:
|
||||
spec:
|
||||
containers:
|
||||
- name: stalwart
|
||||
args: []
|
||||
env:
|
||||
- name: STALWART_LOG_LEVEL
|
||||
value: "debug"
|
||||
19
apps/stalwart/stalwart-statefulset-patch.yaml
Normal file
19
apps/stalwart/stalwart-statefulset-patch.yaml
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
spec:
|
||||
template:
|
||||
spec:
|
||||
containers:
|
||||
- name: stalwart
|
||||
args: ["--init"]
|
||||
env:
|
||||
- name: STALWART_STORAGE_DATA
|
||||
value: "rocksdb"
|
||||
- name: STALWART_STORAGE_BLOB
|
||||
value: "rocksdb"
|
||||
- name: STALWART_STORAGE_ROCKSDB_PATH
|
||||
value: "/var/lib/stalwart"
|
||||
- name: STALWART_SERVER_HOSTNAME
|
||||
value: "mail.basicstack.de"
|
||||
- name: STALWART_SERVER_HTTP_BIND
|
||||
value: "[::]:8080"
|
||||
- name: STALWART_LOG_LEVEL
|
||||
value: "info"
|
||||
86
apps/stalwart/stalwart-values-correct.yaml
Executable file
86
apps/stalwart/stalwart-values-correct.yaml
Executable file
|
|
@ -0,0 +1,86 @@
|
|||
# Stalwart Helm Values - Fresh Deployment
|
||||
# Domain: mail.basicstack.de
|
||||
# Storage: hcloud-volumes-encrypted
|
||||
|
||||
image:
|
||||
repository: stalwartlabs/stalwart
|
||||
tag: "latest"
|
||||
pullPolicy: Always
|
||||
|
||||
replicaCount: 1
|
||||
|
||||
# Enable recovery admin for initial setup
|
||||
recoveryAdmin:
|
||||
enabled: true
|
||||
username: "admin"
|
||||
password: "***REMOVED***"
|
||||
|
||||
# RocksDB data store
|
||||
config:
|
||||
"@type": RocksDb
|
||||
path: /var/lib/stalwart
|
||||
|
||||
# LoadBalancer service to expose mail ports
|
||||
service:
|
||||
type: LoadBalancer
|
||||
ports:
|
||||
smtp: 25
|
||||
smtps: 465
|
||||
submission: 587
|
||||
imap: 143
|
||||
imaps: 993
|
||||
pop3: 110
|
||||
pop3s: 995
|
||||
sieve: 4190
|
||||
http: 80
|
||||
https: 443
|
||||
mgmt: 8080
|
||||
|
||||
# Ingress for web management interface
|
||||
ingress:
|
||||
enabled: true
|
||||
className: traefik
|
||||
annotations:
|
||||
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
||||
traefik.ingress.kubernetes.io/router.entrypoints: websecure
|
||||
hosts:
|
||||
- host: mail.basicstack.de
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
portName: mgmt
|
||||
tls:
|
||||
- secretName: stalwart-tls
|
||||
hosts:
|
||||
- mail.basicstack.de
|
||||
|
||||
# Persistent storage with encrypted volumes
|
||||
persistence:
|
||||
enabled: true
|
||||
accessMode: ReadWriteOnce
|
||||
storageClass: "hcloud-volumes-encrypted"
|
||||
size: 20Gi
|
||||
|
||||
# Pod security
|
||||
podSecurityContext:
|
||||
fsGroup: 2000
|
||||
runAsUser: 2000
|
||||
runAsGroup: 2000
|
||||
|
||||
containerSecurityContext:
|
||||
runAsNonRoot: true
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
drop: [ALL]
|
||||
add: [NET_BIND_SERVICE]
|
||||
seccompProfile:
|
||||
type: RuntimeDefault
|
||||
|
||||
# Resource limits
|
||||
resources:
|
||||
requests:
|
||||
memory: "512Mi"
|
||||
cpu: "250m"
|
||||
limits:
|
||||
memory: "2Gi"
|
||||
cpu: "2000m"
|
||||
90
apps/stalwart/stalwart-values-fixed-ports.yaml
Executable file
90
apps/stalwart/stalwart-values-fixed-ports.yaml
Executable file
|
|
@ -0,0 +1,90 @@
|
|||
# Stalwart Helm Values - Fixed Port Configuration
|
||||
# Domain: mail.basicstack.de
|
||||
# Storage: hcloud-volumes-encrypted
|
||||
|
||||
image:
|
||||
repository: stalwartlabs/stalwart
|
||||
tag: "latest"
|
||||
pullPolicy: Always
|
||||
|
||||
replicaCount: 1
|
||||
|
||||
# Enable recovery admin for initial setup
|
||||
recoveryAdmin:
|
||||
enabled: true
|
||||
username: "admin"
|
||||
password: "***REMOVED***"
|
||||
|
||||
# RocksDB data store
|
||||
config:
|
||||
"@type": RocksDb
|
||||
path: /var/lib/stalwart
|
||||
|
||||
# LoadBalancer service - ONLY mail ports, NO HTTP ports (80, 443, 8080)
|
||||
# HTTP access is handled by Ingress/Traefik
|
||||
service:
|
||||
type: LoadBalancer
|
||||
ports:
|
||||
# SMTP ports
|
||||
smtp: 25
|
||||
smtps: 465
|
||||
submission: 587
|
||||
# IMAP ports
|
||||
imap: 143
|
||||
imaps: 993
|
||||
# POP3 ports (optional, can be disabled)
|
||||
pop3: 110
|
||||
pop3s: 995
|
||||
# Sieve port
|
||||
sieve: 4190
|
||||
# Management port - exposed internally only, NOT on LoadBalancer
|
||||
mgmt: 8080
|
||||
|
||||
# Ingress for web management interface via Traefik
|
||||
ingress:
|
||||
enabled: true
|
||||
className: traefik
|
||||
annotations:
|
||||
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
||||
traefik.ingress.kubernetes.io/router.entrypoints: websecure
|
||||
hosts:
|
||||
- host: mail.basicstack.de
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
portName: mgmt
|
||||
tls:
|
||||
- secretName: stalwart-tls
|
||||
hosts:
|
||||
- mail.basicstack.de
|
||||
|
||||
# Persistent storage with encrypted volumes
|
||||
persistence:
|
||||
enabled: true
|
||||
accessMode: ReadWriteOnce
|
||||
storageClass: "hcloud-volumes-encrypted"
|
||||
size: 20Gi
|
||||
|
||||
# Pod security
|
||||
podSecurityContext:
|
||||
fsGroup: 2000
|
||||
runAsUser: 2000
|
||||
runAsGroup: 2000
|
||||
|
||||
containerSecurityContext:
|
||||
runAsNonRoot: true
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
drop: [ALL]
|
||||
add: [NET_BIND_SERVICE]
|
||||
seccompProfile:
|
||||
type: RuntimeDefault
|
||||
|
||||
# Resource limits
|
||||
resources:
|
||||
requests:
|
||||
memory: "512Mi"
|
||||
cpu: "250m"
|
||||
limits:
|
||||
memory: "2Gi"
|
||||
cpu: "2000m"
|
||||
110
apps/stalwart/stalwart-values.yaml
Executable file
110
apps/stalwart/stalwart-values.yaml
Executable file
|
|
@ -0,0 +1,110 @@
|
|||
# Stalwart Helm Chart Values
|
||||
# Domain: mail.basicstack.de
|
||||
# Storage: hcloud-volumes-encrypted
|
||||
|
||||
image:
|
||||
repository: stalwartlabs/stalwart
|
||||
tag: "latest"
|
||||
pullPolicy: Always
|
||||
|
||||
replicaCount: 1
|
||||
|
||||
# Recovery admin for initial setup (disabled)
|
||||
recoveryAdmin:
|
||||
enabled: false
|
||||
|
||||
# Persistent storage with encrypted volumes
|
||||
persistence:
|
||||
enabled: true
|
||||
storageClassName: hcloud-volumes-encrypted
|
||||
accessMode: ReadWriteOnce
|
||||
size: 20Gi
|
||||
|
||||
# Service configuration
|
||||
service:
|
||||
type: LoadBalancer
|
||||
smtp:
|
||||
enabled: true
|
||||
ports:
|
||||
- port: 25
|
||||
name: smtp
|
||||
- port: 587
|
||||
name: submission
|
||||
- port: 465
|
||||
name: submissions
|
||||
imap:
|
||||
enabled: true
|
||||
ports:
|
||||
- port: 143
|
||||
name: imap
|
||||
- port: 993
|
||||
name: imaps
|
||||
http:
|
||||
enabled: true
|
||||
port: 8080
|
||||
|
||||
# Ingress for web UI
|
||||
ingress:
|
||||
enabled: true
|
||||
className: traefik
|
||||
annotations:
|
||||
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
||||
traefik.ingress.kubernetes.io/router.entrypoints: websecure
|
||||
hosts:
|
||||
- host: mail.basicstack.de
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
tls:
|
||||
- secretName: stalwart-tls
|
||||
hosts:
|
||||
- mail.basicstack.de
|
||||
|
||||
# RocksDB configuration (default)
|
||||
config:
|
||||
"@type": "RocksDb"
|
||||
path: "/opt/stalwart"
|
||||
|
||||
# Pod security context
|
||||
podSecurityContext:
|
||||
fsGroup: 2000
|
||||
runAsUser: 2000
|
||||
runAsGroup: 2000
|
||||
|
||||
# Container security context
|
||||
containerSecurityContext:
|
||||
runAsNonRoot: true
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
drop: [ALL]
|
||||
add: [NET_BIND_SERVICE]
|
||||
seccompProfile:
|
||||
type: RuntimeDefault
|
||||
|
||||
# Health probes
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: /healthz/live
|
||||
port: 8080
|
||||
initialDelaySeconds: 30
|
||||
periodSeconds: 10
|
||||
timeoutSeconds: 5
|
||||
failureThreshold: 3
|
||||
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
path: /healthz/ready
|
||||
port: 8080
|
||||
initialDelaySeconds: 10
|
||||
periodSeconds: 5
|
||||
timeoutSeconds: 3
|
||||
failureThreshold: 3
|
||||
|
||||
# Resources
|
||||
resources:
|
||||
requests:
|
||||
memory: "512Mi"
|
||||
cpu: "250m"
|
||||
limits:
|
||||
memory: "2Gi"
|
||||
cpu: "2000m"
|
||||
16
docs/README.md
Normal file
16
docs/README.md
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
# Documentation
|
||||
|
||||
This directory contains general documentation for the basicstack.de cluster and deployment processes.
|
||||
|
||||
## Suggested Content
|
||||
|
||||
- **Architecture**: Overall cluster architecture and design decisions
|
||||
- **Deployment Guides**: Step-by-step deployment procedures
|
||||
- **Troubleshooting**: Common issues and solutions
|
||||
- **Best Practices**: Standards and conventions for this cluster
|
||||
- **Operations Runbooks**: Incident response and operational procedures
|
||||
- **Disaster Recovery**: Backup and restore procedures at the cluster level
|
||||
|
||||
## Note
|
||||
|
||||
Application-specific documentation should live in the respective `apps/<app-name>/` directories, not here. This directory is for cross-cutting concerns and cluster-wide documentation.
|
||||
41
infrastructure/README.md
Normal file
41
infrastructure/README.md
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
# Infrastructure
|
||||
|
||||
This directory contains cluster-wide infrastructure configurations that support all applications.
|
||||
|
||||
## Structure
|
||||
|
||||
### `networking/`
|
||||
Network-level configurations including:
|
||||
- Ingress controller configurations
|
||||
- Network policies
|
||||
- DNS settings
|
||||
- Load balancer configurations
|
||||
- Certificate management (cert-manager, TLS)
|
||||
- Service mesh configurations (if applicable)
|
||||
|
||||
### `monitoring/`
|
||||
Observability infrastructure:
|
||||
- Prometheus operator and configurations
|
||||
- Grafana dashboards and datasources
|
||||
- Logging stack (Loki, Promtail, etc.)
|
||||
- Alert rules and notification channels
|
||||
- Service monitors and pod monitors
|
||||
|
||||
## Purpose
|
||||
|
||||
Infrastructure configurations in this directory are shared across all applications. Changes here can affect the entire cluster, so:
|
||||
|
||||
1. Test thoroughly before applying
|
||||
2. Document all changes
|
||||
3. Consider the impact on existing deployments
|
||||
4. Coordinate with other team members
|
||||
|
||||
## Adding Infrastructure Components
|
||||
|
||||
When adding new infrastructure components:
|
||||
|
||||
1. Create appropriate subdirectories if needed
|
||||
2. Include clear documentation
|
||||
3. Define dependencies and prerequisites
|
||||
4. Provide rollback procedures
|
||||
5. Update this README with the new component
|
||||
Loading…
Add table
Reference in a new issue