Compare commits
10 Commits
ac0d92654a
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ad7c6807f7 | ||
|
|
816e21af68 | ||
|
|
a2e8b42539 | ||
|
|
6b89f0f2b3 | ||
|
|
a3b1c230c6 | ||
|
|
405763f158 | ||
|
|
75aede94ac | ||
|
|
5acca5d4c7 | ||
|
|
663049fb89 | ||
|
|
40d4c92271 |
@@ -44,11 +44,13 @@ jobs:
|
|||||||
PBS_PASSWORD: ${{ secrets.PBS_PASSWORD }}
|
PBS_PASSWORD: ${{ secrets.PBS_PASSWORD }}
|
||||||
PBS_FINGERPRINT: ${{ secrets.PBS_FINGERPRINT }}
|
PBS_FINGERPRINT: ${{ secrets.PBS_FINGERPRINT }}
|
||||||
ONLYOFFICE_SECRET: ${{ secrets.ONLYOFFICE_SECRET }}
|
ONLYOFFICE_SECRET: ${{ secrets.ONLYOFFICE_SECRET }}
|
||||||
|
WHITEBOARD_JWT_SECRET_KEY: ${{ secrets.WHITEBOARD_JWT_SECRET_KEY }}
|
||||||
|
|
||||||
# used only on helm set values - only required as environment variables
|
# used only on helm set values - only required as environment variables
|
||||||
NEXTCLOUD_HOST: ${{ secrets.NEXTCLOUD_HOST }}
|
NEXTCLOUD_HOST: ${{ secrets.NEXTCLOUD_HOST }}
|
||||||
NEXTCLOUD_USERNAME: ${{ secrets.NEXTCLOUD_USERNAME }}
|
NEXTCLOUD_USERNAME: ${{ secrets.NEXTCLOUD_USERNAME }}
|
||||||
NEXTCLOUD_PASSWORD: ${{ secrets.NEXTCLOUD_PASSWORD }}
|
NEXTCLOUD_PASSWORD: ${{ secrets.NEXTCLOUD_PASSWORD }}
|
||||||
|
REDIS_PASSWORD: ${{ secrets.REDIS_PASSWORD }}
|
||||||
|
|
||||||
run: |
|
run: |
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
@@ -57,6 +59,7 @@ jobs:
|
|||||||
trap '
|
trap '
|
||||||
[ -d deploy/app/.env.d ] && rm -rf deploy/app/.env.d/*;
|
[ -d deploy/app/.env.d ] && rm -rf deploy/app/.env.d/*;
|
||||||
[ -d deploy/app/onlyoffice/.env.d ] && rm -rf deploy/app/onlyoffice/.env.d/*;
|
[ -d deploy/app/onlyoffice/.env.d ] && rm -rf deploy/app/onlyoffice/.env.d/*;
|
||||||
|
[ -d deploy/app/whiteboard/.env.d ] && rm -rf deploy/app/whiteboard/.env.d/*;
|
||||||
' EXIT
|
' EXIT
|
||||||
|
|
||||||
# setup secrets files
|
# setup secrets files
|
||||||
@@ -72,9 +75,12 @@ jobs:
|
|||||||
|
|
||||||
echo "secret=${ONLYOFFICE_SECRET:?Missing ONLYOFFICE_SECRET}" >> deploy/app/onlyoffice/.env.d/onlyoffice.env
|
echo "secret=${ONLYOFFICE_SECRET:?Missing ONLYOFFICE_SECRET}" >> deploy/app/onlyoffice/.env.d/onlyoffice.env
|
||||||
|
|
||||||
|
echo "JWT_SECRET_KEY=${WHITEBOARD_JWT_SECRET_KEY:?Missing WHITEBOARD_JWT_SECRET_KEY}" >> deploy/app/whiteboard/.env.d/whiteboard.env
|
||||||
|
|
||||||
# enforce secrets files security
|
# enforce secrets files security
|
||||||
chmod 600 deploy/app/.env.d/*
|
chmod 600 deploy/app/.env.d/*
|
||||||
chmod 600 deploy/app/onlyoffice/.env.d/*
|
chmod 600 deploy/app/onlyoffice/.env.d/*
|
||||||
|
chmod 600 deploy/app/whiteboard/.env.d/*
|
||||||
|
|
||||||
# invoke deploy script
|
# invoke deploy script
|
||||||
ops-scripts/apply-app.sh
|
ops-scripts/apply-app.sh
|
||||||
|
|||||||
6
.vscode/settings.json
vendored
6
.vscode/settings.json
vendored
@@ -1,7 +1,11 @@
|
|||||||
{
|
{
|
||||||
"cSpell.words": [
|
"cSpell.words": [
|
||||||
"authentik",
|
"authentik",
|
||||||
|
"COLLAB",
|
||||||
|
"dbindex",
|
||||||
"documentserver",
|
"documentserver",
|
||||||
"onlyoffice"
|
"onlyoffice",
|
||||||
|
"overwritehost",
|
||||||
|
"overwriteprotocol"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
26
README.md
26
README.md
@@ -6,6 +6,7 @@ Using [NextCloud](https://nextcloud.com/)
|
|||||||
|
|
||||||
- [Integrations](#integrations)
|
- [Integrations](#integrations)
|
||||||
- [OAuth2/OpenID Provider](#oauth2openid-provider)
|
- [OAuth2/OpenID Provider](#oauth2openid-provider)
|
||||||
|
- [whiteboard](#whiteboard)
|
||||||
- [cli](#cli)
|
- [cli](#cli)
|
||||||
- [maintenance mode](#maintenance-mode)
|
- [maintenance mode](#maintenance-mode)
|
||||||
- [scan files](#scan-files)
|
- [scan files](#scan-files)
|
||||||
@@ -20,6 +21,7 @@ Using [NextCloud](https://nextcloud.com/)
|
|||||||
- [Setup and Deploy](#setup-and-deploy)
|
- [Setup and Deploy](#setup-and-deploy)
|
||||||
- [App](#app)
|
- [App](#app)
|
||||||
- [Infra](#infra)
|
- [Infra](#infra)
|
||||||
|
- [internal logs](#internal-logs)
|
||||||
- [Database](#database)
|
- [Database](#database)
|
||||||
|
|
||||||
## Integrations
|
## Integrations
|
||||||
@@ -30,10 +32,23 @@ Using [NextCloud](https://nextcloud.com/)
|
|||||||
- <https://github.com/nextcloud/user_oidc>
|
- <https://github.com/nextcloud/user_oidc>
|
||||||
- <https://apps.nextcloud.com/apps/user_oidc>
|
- <https://apps.nextcloud.com/apps/user_oidc>
|
||||||
|
|
||||||
## cli
|
### whiteboard
|
||||||
|
|
||||||
``` bash
|
``` bash
|
||||||
su -s /bin/bash www-data -c "php occ upgrade;"
|
php occ config:app:set whiteboard collabBackendUrl --value="https://cloud.limbosolutions.com/whiteboard"
|
||||||
|
php occ config:app:set whiteboard jwt_secret_key --value="?????"
|
||||||
|
```
|
||||||
|
|
||||||
|
## cli
|
||||||
|
|
||||||
|
When on browser error:
|
||||||
|
|
||||||
|
Please use the command line updater because updating via browser is disabled in your config.php.
|
||||||
|
|
||||||
|
Execute:
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
php occ upgrade;
|
||||||
```
|
```
|
||||||
|
|
||||||
### maintenance mode
|
### maintenance mode
|
||||||
@@ -174,6 +189,13 @@ Can be executed in VS Code using the “Apply Infra” task.
|
|||||||
- services accounts:
|
- services accounts:
|
||||||
- Continuous deploy - Deployment RBAC (ServiceAccount + Role + RoleBinding)
|
- Continuous deploy - Deployment RBAC (ServiceAccount + Role + RoleBinding)
|
||||||
|
|
||||||
|
## internal logs
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
POD_NAME=$(kubectl get pod -l 'app.kubernetes.io/name'=nextcloud -n cloud-limbosolutions-com -o jsonpath='{.items[0].metadata.name}')
|
||||||
|
kubectl exec -it ${POD_NAME} -- cat /var/www/html/data/nextcloud.log
|
||||||
|
```
|
||||||
|
|
||||||
## Database
|
## Database
|
||||||
|
|
||||||
**Connect to db:**
|
**Connect to db:**
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ resources:
|
|||||||
- ./mariadb-deploy.yaml
|
- ./mariadb-deploy.yaml
|
||||||
- ./backups/backup-pbs-cronjob.yaml
|
- ./backups/backup-pbs-cronjob.yaml
|
||||||
- ./onlyoffice
|
- ./onlyoffice
|
||||||
|
- ./whiteboard
|
||||||
|
|
||||||
generatorOptions:
|
generatorOptions:
|
||||||
disableNameSuffixHash: true
|
disableNameSuffixHash: true
|
||||||
|
|||||||
@@ -6,6 +6,9 @@ image:
|
|||||||
|
|
||||||
replicaCount: 1
|
replicaCount: 1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
livenessProbe:
|
livenessProbe:
|
||||||
initialDelaySeconds: 60
|
initialDelaySeconds: 60
|
||||||
periodSeconds: 60
|
periodSeconds: 60
|
||||||
@@ -77,6 +80,8 @@ resources:
|
|||||||
cpu: "0.5"
|
cpu: "0.5"
|
||||||
memory: 512Mi
|
memory: 512Mi
|
||||||
|
|
||||||
|
redis:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
## Cronjob to execute Nextcloud background tasks
|
## Cronjob to execute Nextcloud background tasks
|
||||||
## ref: https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/background_jobs_configuration.html#cron
|
## ref: https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/background_jobs_configuration.html#cron
|
||||||
@@ -84,14 +89,65 @@ resources:
|
|||||||
cronjob:
|
cronjob:
|
||||||
enabled: true
|
enabled: true
|
||||||
|
|
||||||
# openssl.cafile = /etc/ssl/certs/ca-certificates.crt
|
|
||||||
#openssl.capath = /etc/ssl/certs
|
|
||||||
|
|
||||||
|
|
||||||
nextcloud:
|
nextcloud:
|
||||||
|
extraEnv:
|
||||||
|
- name: REDIS_PASSWORD
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: nextcloud-redis
|
||||||
|
key: redis-password
|
||||||
|
|
||||||
|
defaultConfigs:
|
||||||
|
redis.config.php: false
|
||||||
|
|
||||||
|
extraInitContainers:
|
||||||
|
- name: data-folder-structure-fix
|
||||||
|
image: busybox
|
||||||
|
command:
|
||||||
|
- sh
|
||||||
|
- -c
|
||||||
|
- |
|
||||||
|
# Create only parents
|
||||||
|
mkdir -p /mnt/users
|
||||||
|
mkdir -p /mnt/shared
|
||||||
|
|
||||||
|
# Fix permissions on parents pvc folder data-folder-structure
|
||||||
|
chown 33:33 /mnt/users
|
||||||
|
chown 33:33 /mnt/shared
|
||||||
|
chown 33:33 /mnt/users/marcio.fernandes
|
||||||
|
chown 33:33 /mnt/users/marcio.fernandes/Documents
|
||||||
|
chown 33:33 /mnt/users/marcio.fernandes/Photos
|
||||||
|
chown 33:33 /mnt/shared/Gaming
|
||||||
|
chown 33:33 /mnt/shared/Music
|
||||||
|
chown 33:33 /mnt/shared/Videos
|
||||||
|
chown 33:33 /mnt/shared/NerdStuff
|
||||||
|
|
||||||
|
volumeMounts:
|
||||||
|
- name: data-folder-structure
|
||||||
|
mountPath: /mnt
|
||||||
|
- name: mf-nextcloud
|
||||||
|
mountPath: /mnt/users/marcio.fernandes
|
||||||
|
- name: mf-documents
|
||||||
|
mountPath: /mnt/users/marcio.fernandes/Documents
|
||||||
|
- name: mf-photos
|
||||||
|
mountPath: /mnt/users/marcio.fernandes/Photos
|
||||||
|
- name: media-gaming
|
||||||
|
mountPath: /mnt/shared/Gaming
|
||||||
|
- name: media-music
|
||||||
|
mountPath: /mnt/shared/Music
|
||||||
|
- name: media-videos
|
||||||
|
mountPath: /mnt/shared/Videos
|
||||||
|
- name: it-storage
|
||||||
|
mountPath: /mnt/shared/NerdStuff
|
||||||
|
securityContext:
|
||||||
|
runAsUser: 33
|
||||||
|
runAsGroup: 33
|
||||||
|
fsGroup: 33
|
||||||
|
fsGroupChangePolicy: "OnRootMismatch"
|
||||||
|
|
||||||
phpConfigs:
|
phpConfigs:
|
||||||
php.ini: |-
|
php.ini: |-
|
||||||
memory_limit = 512M
|
memory_limit = 1024M
|
||||||
extraVolumes:
|
extraVolumes:
|
||||||
- name: mf-documents
|
- name: mf-documents
|
||||||
persistentVolumeClaim:
|
persistentVolumeClaim:
|
||||||
@@ -114,9 +170,14 @@ nextcloud:
|
|||||||
- name: mf-nextcloud
|
- name: mf-nextcloud
|
||||||
persistentVolumeClaim:
|
persistentVolumeClaim:
|
||||||
claimName: mf-nextcloud-limbosolutions-com
|
claimName: mf-nextcloud-limbosolutions-com
|
||||||
|
- name: data-folder-structure
|
||||||
|
emptyDir: {}
|
||||||
|
|
||||||
extraVolumeMounts:
|
extraVolumeMounts:
|
||||||
|
|
||||||
|
- name: data-folder-structure
|
||||||
|
mountPath: /mnt
|
||||||
|
|
||||||
- name: mf-nextcloud
|
- name: mf-nextcloud
|
||||||
mountPath: /mnt/users/marcio.fernandes
|
mountPath: /mnt/users/marcio.fernandes
|
||||||
|
|
||||||
@@ -139,17 +200,17 @@ nextcloud:
|
|||||||
mountPath: /mnt/shared/NerdStuff
|
mountPath: /mnt/shared/NerdStuff
|
||||||
|
|
||||||
configs:
|
configs:
|
||||||
# appstore.override.config.php: |-
|
|
||||||
# <?php
|
|
||||||
# $CONFIG = array (
|
|
||||||
# 'appstoreenabled' => true,
|
|
||||||
# 'appstoreurl' => 'https://apps.nextcloud.com/api/v1',
|
|
||||||
# );
|
|
||||||
global.config.php: |-
|
global.config.php: |-
|
||||||
<?php
|
<?php
|
||||||
$CONFIG = array (
|
$CONFIG = array (
|
||||||
'allow_local_remote_servers' => true
|
'allow_local_remote_servers' => true,
|
||||||
|
'loglevel' => 1
|
||||||
);
|
);
|
||||||
|
phone.config.php: |-
|
||||||
|
<?php
|
||||||
|
$CONFIG = array (
|
||||||
|
'default_phone_region' => 'PT',
|
||||||
|
);
|
||||||
|
|
||||||
https.config.php: |-
|
https.config.php: |-
|
||||||
<?php
|
<?php
|
||||||
@@ -173,10 +234,26 @@ nextcloud:
|
|||||||
'maintenance_window_start' => 1,
|
'maintenance_window_start' => 1,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
redis.config.php: |-
|
||||||
|
<?php
|
||||||
|
$CONFIG = array (
|
||||||
|
'memcache.local' => '\OC\Memcache\APCu',
|
||||||
|
'memcache.distributed' => '\OC\Memcache\Redis',
|
||||||
|
'memcache.locking' => '\OC\Memcache\Redis',
|
||||||
|
|
||||||
|
'redis' => array(
|
||||||
|
'host' => 'nextcloud-redis-master',
|
||||||
|
'port' => 6379,
|
||||||
|
'timeout' => 1.5,
|
||||||
|
'password' => getenv('REDIS_PASSWORD'),
|
||||||
|
'dbindex' => 0,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
onlyoffice.config.php: |-
|
onlyoffice.config.php: |-
|
||||||
<?php
|
<?php
|
||||||
$CONFIG = array (
|
$CONFIG = array (
|
||||||
'onlyoffice' =>
|
'onlyoffice' =>
|
||||||
array (
|
array (
|
||||||
'verify_peer_off' => true,
|
'verify_peer_off' => true,
|
||||||
'allow_local_remote_servers' => true,
|
'allow_local_remote_servers' => true,
|
||||||
12
deploy/app/redis-helm-values.yaml
Normal file
12
deploy/app/redis-helm-values.yaml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
architecture: standalone
|
||||||
|
|
||||||
|
auth:
|
||||||
|
enabled: true
|
||||||
|
|
||||||
|
|
||||||
|
master:
|
||||||
|
persistence:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
replica:
|
||||||
|
replicaCount: 0
|
||||||
3
deploy/app/whiteboard/.env.d/.gitignore
vendored
Normal file
3
deploy/app/whiteboard/.env.d/.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
**
|
||||||
|
!*.example
|
||||||
|
!.gitignore
|
||||||
1
deploy/app/whiteboard/.env.d/whiteboard.env.example
Normal file
1
deploy/app/whiteboard/.env.d/whiteboard.env.example
Normal file
@@ -0,0 +1 @@
|
|||||||
|
JWT_SECRET_KEY= ????
|
||||||
37
deploy/app/whiteboard/deployment.yaml
Normal file
37
deploy/app/whiteboard/deployment.yaml
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: nextcloud-whiteboard
|
||||||
|
labels:
|
||||||
|
app: nextcloud-whiteboard
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: nextcloud-whiteboard
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nextcloud-whiteboard
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: whiteboard-ws
|
||||||
|
image: ghcr.io/nextcloud-releases/whiteboard:stable
|
||||||
|
ports:
|
||||||
|
- containerPort: 3002
|
||||||
|
env:
|
||||||
|
- name: NEXTCLOUD_URL
|
||||||
|
value: https://cloud.limbosolutions.com
|
||||||
|
- name: JWT_SECRET_KEY
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: nextcloud-whiteboard
|
||||||
|
key: JWT_SECRET_KEY
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
memory: "256Mi"
|
||||||
|
cpu: "200m"
|
||||||
|
requests:
|
||||||
|
memory: "64Mi"
|
||||||
|
cpu: "50m"
|
||||||
|
|
||||||
14
deploy/app/whiteboard/kustomization.yaml
Normal file
14
deploy/app/whiteboard/kustomization.yaml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||||
|
kind: Kustomization
|
||||||
|
|
||||||
|
secretGenerator:
|
||||||
|
- name: nextcloud-whiteboard
|
||||||
|
envs:
|
||||||
|
- ./.env.d/whiteboard.env
|
||||||
|
|
||||||
|
generatorOptions:
|
||||||
|
disableNameSuffixHash: true
|
||||||
|
|
||||||
|
resources:
|
||||||
|
- ./deployment.yaml
|
||||||
|
- ./service.yaml
|
||||||
12
deploy/app/whiteboard/service.yaml
Normal file
12
deploy/app/whiteboard/service.yaml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: nextcloud-whiteboard
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
app: nextcloud-whiteboard
|
||||||
|
ports:
|
||||||
|
- name: ws
|
||||||
|
port: 3002
|
||||||
|
targetPort: 3002
|
||||||
|
type: ClusterIP
|
||||||
@@ -21,7 +21,9 @@ spec:
|
|||||||
- name: ak-outpost-authentik-embedded-outpost
|
- name: ak-outpost-authentik-embedded-outpost
|
||||||
namespace: id-limbosolutions-com
|
namespace: id-limbosolutions-com
|
||||||
port: 9000
|
port: 9000
|
||||||
|
middlewares:
|
||||||
|
- name: nextcloud-security-headers
|
||||||
|
- name: rate-limit
|
||||||
|
|
||||||
# PUBLIC SHARES (NO SSO)
|
# PUBLIC SHARES (NO SSO)
|
||||||
- match: Host(`cloud.limbosolutions.com`) &&
|
- match: Host(`cloud.limbosolutions.com`) &&
|
||||||
@@ -36,6 +38,7 @@ spec:
|
|||||||
middlewares:
|
middlewares:
|
||||||
- name: rate-limit
|
- name: rate-limit
|
||||||
- name: nextcloud-security-headers
|
- name: nextcloud-security-headers
|
||||||
|
- name: nextcloud-deny-paths
|
||||||
|
|
||||||
# Sync clients + mobile app (no SSO)
|
# Sync clients + mobile app (no SSO)
|
||||||
- match: Host(`cloud.limbosolutions.com`) &&
|
- match: Host(`cloud.limbosolutions.com`) &&
|
||||||
@@ -55,6 +58,23 @@ spec:
|
|||||||
middlewares:
|
middlewares:
|
||||||
- name: webdav-strip-auth
|
- name: webdav-strip-auth
|
||||||
- name: rate-limit
|
- name: rate-limit
|
||||||
|
- name: nextcloud-deny-paths
|
||||||
|
- name: nextcloud-dav
|
||||||
|
|
||||||
|
- match: Host(`cloud.limbosolutions.com`) && PathPrefix(`/whiteboard`)
|
||||||
|
kind: Rule
|
||||||
|
services:
|
||||||
|
- name: nextcloud-whiteboard
|
||||||
|
port: 3002
|
||||||
|
middlewares:
|
||||||
|
- name: nextcloud-security-headers
|
||||||
|
- name: rate-limit
|
||||||
|
- name: nextcloud-deny-paths
|
||||||
|
- name: nextcloud-wellknown
|
||||||
|
- name: nextcloud-hostmeta
|
||||||
|
- name: nextcloud-dav
|
||||||
|
- name: strip-whiteboard
|
||||||
|
|
||||||
|
|
||||||
# 3) EVERYTHING ELSE (SSO REQUIRED)
|
# 3) EVERYTHING ELSE (SSO REQUIRED)
|
||||||
- match: Host(`cloud.limbosolutions.com`)
|
- match: Host(`cloud.limbosolutions.com`)
|
||||||
@@ -63,10 +83,12 @@ spec:
|
|||||||
- name: nextcloud
|
- name: nextcloud
|
||||||
port: 8080
|
port: 8080
|
||||||
middlewares:
|
middlewares:
|
||||||
- name: authentik-forward-auth
|
# - name: authentik-forward-auth
|
||||||
- name: nextcloud-security-headers
|
- name: nextcloud-security-headers
|
||||||
- name: rate-limit
|
- name: rate-limit
|
||||||
|
- name: nextcloud-deny-paths
|
||||||
|
- name: nextcloud-wellknown
|
||||||
|
- name: nextcloud-hostmeta
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -14,59 +14,29 @@ spec:
|
|||||||
- main: cloud.limbosolutions.com
|
- main: cloud.limbosolutions.com
|
||||||
|
|
||||||
routes:
|
routes:
|
||||||
|
|
||||||
# AUTHENTIK OUTPOST
|
|
||||||
- match: Host(`cloud.limbosolutions.com`) && PathPrefix(`/outpost.goauthentik.io`)
|
|
||||||
kind: Rule
|
|
||||||
services:
|
|
||||||
- name: ak-outpost-authentik-embedded-outpost
|
|
||||||
namespace: id-limbosolutions-com
|
|
||||||
port: 9000
|
|
||||||
|
|
||||||
|
|
||||||
# PUBLIC SHARES (NO SSO)
|
|
||||||
- match: Host(`cloud.limbosolutions.com`) &&
|
|
||||||
(PathPrefix(`/s/`) ||
|
|
||||||
PathPrefix(`/index.php/s/`) ||
|
|
||||||
PathPrefix(`/public.php/`) ||
|
|
||||||
PathPrefix(`/remote.php/dav/public-files/`))
|
|
||||||
kind: Rule
|
|
||||||
services:
|
|
||||||
- name: nextcloud
|
|
||||||
port: 8080
|
|
||||||
middlewares:
|
|
||||||
- name: rate-limit
|
|
||||||
- name: nextcloud-security-headers
|
|
||||||
|
|
||||||
# Sync clients + mobile app (no SSO)
|
|
||||||
- match: Host(`cloud.limbosolutions.com`) &&
|
|
||||||
(PathPrefix(`/remote.php/dav`) ||
|
|
||||||
PathPrefix(`/remote.php/webdav`) ||
|
|
||||||
PathPrefix(`/remote.php/caldav`) ||
|
|
||||||
PathPrefix(`/remote.php/carddav`) ||
|
|
||||||
PathPrefix(`/ocs/v1.php`) ||
|
|
||||||
PathPrefix(`/ocs/v2.php`) ||
|
|
||||||
PathPrefix(`/status.php`) ||
|
|
||||||
PathPrefix(`/index.php/login/v2`) ||
|
|
||||||
PathPrefix(`/index.php/login/v2/poll`))
|
|
||||||
kind: Rule
|
|
||||||
services:
|
|
||||||
- name: nextcloud
|
|
||||||
port: 8080
|
|
||||||
middlewares:
|
|
||||||
- name: webdav-strip-auth
|
|
||||||
- name: rate-limit
|
|
||||||
|
|
||||||
# 3) EVERYTHING ELSE (SSO REQUIRED)
|
|
||||||
- match: Host(`cloud.limbosolutions.com`)
|
- match: Host(`cloud.limbosolutions.com`)
|
||||||
kind: Rule
|
kind: Rule
|
||||||
services:
|
services:
|
||||||
- name: nextcloud
|
- name: nextcloud
|
||||||
port: 8080
|
port: 8080
|
||||||
middlewares:
|
middlewares:
|
||||||
#- name: authentik-forward-auth
|
|
||||||
- name: nextcloud-security-headers
|
- name: nextcloud-security-headers
|
||||||
- name: rate-limit
|
- name: rate-limit
|
||||||
|
- name: nextcloud-deny-paths
|
||||||
|
- name: nextcloud-wellknown
|
||||||
|
- name: nextcloud-hostmeta
|
||||||
|
- name: nextcloud-dav
|
||||||
|
|
||||||
|
- match: Host(`cloud.limbosolutions.com`) && PathPrefix(`/whiteboard`)
|
||||||
|
kind: Rule
|
||||||
|
services:
|
||||||
|
- name: nextcloud-whiteboard
|
||||||
|
port: 3002
|
||||||
|
middlewares:
|
||||||
|
- name: nextcloud-security-headers
|
||||||
|
- name: rate-limit
|
||||||
|
- name: nextcloud-deny-paths
|
||||||
|
- name: nextcloud-wellknown
|
||||||
|
- name: nextcloud-hostmeta
|
||||||
|
- name: nextcloud-dav
|
||||||
|
- name: strip-whiteboard
|
||||||
@@ -1,13 +1,14 @@
|
|||||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||||
kind: Kustomization
|
kind: Kustomization
|
||||||
resources:
|
resources:
|
||||||
- namespace.yaml
|
|
||||||
- cd-serviceaccount.yaml
|
- cd-serviceaccount.yaml
|
||||||
|
- network-policies.yaml
|
||||||
- middlewares.yaml
|
- middlewares.yaml
|
||||||
- ingress-web.yaml
|
- ingress-web.yaml
|
||||||
- ingress-web-public.yaml
|
- ingress-web-public.yaml
|
||||||
- storage-limbosolutions-com/pv.yaml
|
- storage-limbosolutions-com/pv.yaml
|
||||||
- ./onlyoffice/ingress.yaml
|
- ./onlyoffice/ingress.yaml
|
||||||
- ./onlyoffice/middlewares.yaml
|
- ./onlyoffice/middlewares.yaml
|
||||||
|
- ./whiteboard/middlewares.yaml
|
||||||
generatorOptions:
|
generatorOptions:
|
||||||
disableNameSuffixHash: true
|
disableNameSuffixHash: true
|
||||||
@@ -17,8 +17,8 @@ metadata:
|
|||||||
name: rate-limit
|
name: rate-limit
|
||||||
spec:
|
spec:
|
||||||
rateLimit:
|
rateLimit:
|
||||||
average: 50
|
average: 100
|
||||||
burst: 100
|
burst: 500
|
||||||
|
|
||||||
---
|
---
|
||||||
# Optional: security headers for UI
|
# Optional: security headers for UI
|
||||||
@@ -28,19 +28,20 @@ metadata:
|
|||||||
name: nextcloud-security-headers
|
name: nextcloud-security-headers
|
||||||
spec:
|
spec:
|
||||||
headers:
|
headers:
|
||||||
stsSeconds: 31536000
|
|
||||||
stsIncludeSubdomains: true
|
|
||||||
stsPreload: true
|
|
||||||
browserXssFilter: true
|
browserXssFilter: true
|
||||||
contentTypeNosniff: true
|
contentTypeNosniff: true
|
||||||
frameDeny: true
|
frameDeny: false
|
||||||
referrerPolicy: "no-referrer"
|
referrerPolicy: "no-referrer"
|
||||||
|
stsSeconds: 15552000
|
||||||
|
stsIncludeSubdomains: true
|
||||||
|
stsPreload: true
|
||||||
customResponseHeaders:
|
customResponseHeaders:
|
||||||
|
X-Powered-By: ""
|
||||||
X-Content-Type-Options: "nosniff"
|
X-Content-Type-Options: "nosniff"
|
||||||
X-Frame-Options: "DENY"
|
X-Frame-Options: "SAMEORIGIN"
|
||||||
X-XSS-Protection: "1; mode=block"
|
X-XSS-Protection: "1; mode=block"
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
apiVersion: traefik.io/v1alpha1
|
apiVersion: traefik.io/v1alpha1
|
||||||
kind: Middleware
|
kind: Middleware
|
||||||
metadata:
|
metadata:
|
||||||
@@ -64,3 +65,58 @@ spec:
|
|||||||
- X-authentik-meta-app
|
- X-authentik-meta-app
|
||||||
- X-authentik-meta-version
|
- X-authentik-meta-version
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
|
apiVersion: traefik.io/v1alpha1
|
||||||
|
kind: Middleware
|
||||||
|
metadata:
|
||||||
|
name: nextcloud-deny-paths
|
||||||
|
spec:
|
||||||
|
redirectRegex:
|
||||||
|
regex: "^/(build|tests|config|lib|3rdparty|templates|data|autotest|occ|issue|indie|db_|console)"
|
||||||
|
replacement: "/"
|
||||||
|
permanent: false
|
||||||
|
|
||||||
|
---
|
||||||
|
apiVersion: traefik.io/v1alpha1
|
||||||
|
kind: Middleware
|
||||||
|
metadata:
|
||||||
|
name: nextcloud-dav
|
||||||
|
spec:
|
||||||
|
redirectRegex:
|
||||||
|
regex: "^/.well-known/(carddav|caldav)$"
|
||||||
|
replacement: "/remote.php/dav"
|
||||||
|
permanent: true
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
apiVersion: traefik.io/v1alpha1
|
||||||
|
kind: Middleware
|
||||||
|
metadata:
|
||||||
|
name: nextcloud-wellknown
|
||||||
|
spec:
|
||||||
|
redirectRegex:
|
||||||
|
regex: "^/.well-known/(webfinger|nodeinfo)$"
|
||||||
|
replacement: "/index.php/.well-known/${1}"
|
||||||
|
permanent: true
|
||||||
|
---
|
||||||
|
apiVersion: traefik.io/v1alpha1
|
||||||
|
kind: Middleware
|
||||||
|
metadata:
|
||||||
|
name: nextcloud-hostmeta
|
||||||
|
spec:
|
||||||
|
redirectRegex:
|
||||||
|
regex: "^/.well-known/host-meta$"
|
||||||
|
replacement: "/public.php?service=host-meta"
|
||||||
|
permanent: true
|
||||||
|
---
|
||||||
|
|
||||||
|
apiVersion: traefik.io/v1alpha1
|
||||||
|
kind: Middleware
|
||||||
|
metadata:
|
||||||
|
name: nextcloud-hostmeta-json
|
||||||
|
spec:
|
||||||
|
redirectRegex:
|
||||||
|
regex: "^/.well-known/host-meta.json$"
|
||||||
|
replacement: "/public.php?service=host-meta-json"
|
||||||
|
permanent: true
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
apiVersion: v1
|
|
||||||
kind: Namespace
|
|
||||||
metadata:
|
|
||||||
name: cloud-limbosolutions-com
|
|
||||||
labels:
|
|
||||||
name: cloud-limbosolutions-com
|
|
||||||
102
deploy/infra/network-policies.yaml
Normal file
102
deploy/infra/network-policies.yaml
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
apiVersion: cilium.io/v2
|
||||||
|
kind: CiliumNetworkPolicy
|
||||||
|
metadata:
|
||||||
|
name: allow-same-namespace-ingress
|
||||||
|
spec:
|
||||||
|
endpointSelector: {} # All pods in this namespace
|
||||||
|
ingress:
|
||||||
|
- fromEndpoints:
|
||||||
|
- matchExpressions:
|
||||||
|
- key: k8s:io.kubernetes.pod.namespace
|
||||||
|
operator: In
|
||||||
|
values:
|
||||||
|
- cloud-limbosolutions-com
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
apiVersion: cilium.io/v2
|
||||||
|
kind: CiliumNetworkPolicy
|
||||||
|
metadata:
|
||||||
|
name: allow-traefik-to-nextcloud-ingress
|
||||||
|
spec:
|
||||||
|
endpointSelector:
|
||||||
|
matchLabels:
|
||||||
|
app.kubernetes.io/name: nextcloud
|
||||||
|
|
||||||
|
ingress:
|
||||||
|
# -------------------------------------------------------------
|
||||||
|
# Allow Traefik (internal and public) to reach nextcloud web port
|
||||||
|
# -------------------------------------------------------------
|
||||||
|
- fromEndpoints:
|
||||||
|
- matchLabels:
|
||||||
|
app.kubernetes.io/name: traefik
|
||||||
|
matchExpressions:
|
||||||
|
- key: k8s:io.kubernetes.pod.namespace
|
||||||
|
operator: In
|
||||||
|
values:
|
||||||
|
- traefik
|
||||||
|
- traefik-public
|
||||||
|
toPorts:
|
||||||
|
- ports:
|
||||||
|
- port: "80"
|
||||||
|
|
||||||
|
protocol: TCP
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
apiVersion: cilium.io/v2
|
||||||
|
kind: CiliumNetworkPolicy
|
||||||
|
metadata:
|
||||||
|
name: allow-traefik-to-onlyoffice-ingress
|
||||||
|
spec:
|
||||||
|
endpointSelector:
|
||||||
|
matchLabels:
|
||||||
|
app: onlyoffice
|
||||||
|
|
||||||
|
ingress:
|
||||||
|
# -------------------------------------------------------------
|
||||||
|
# Allow Traefik (internal and public) to reach onlyoffice web port
|
||||||
|
# -------------------------------------------------------------
|
||||||
|
- fromEndpoints:
|
||||||
|
- matchLabels:
|
||||||
|
app.kubernetes.io/name: traefik
|
||||||
|
matchExpressions:
|
||||||
|
- key: k8s:io.kubernetes.pod.namespace
|
||||||
|
operator: In
|
||||||
|
values:
|
||||||
|
- traefik
|
||||||
|
- traefik-public
|
||||||
|
toPorts:
|
||||||
|
- ports:
|
||||||
|
- port: "80"
|
||||||
|
|
||||||
|
protocol: TCP
|
||||||
|
---
|
||||||
|
apiVersion: cilium.io/v2
|
||||||
|
kind: CiliumNetworkPolicy
|
||||||
|
metadata:
|
||||||
|
name: allow-traefik-to-whiteboard-ingress
|
||||||
|
spec:
|
||||||
|
endpointSelector:
|
||||||
|
matchLabels:
|
||||||
|
app: nextcloud-whiteboard
|
||||||
|
|
||||||
|
ingress:
|
||||||
|
# -------------------------------------------------------------
|
||||||
|
# Allow Traefik (internal and public) to reach whiteboard ws
|
||||||
|
# -------------------------------------------------------------
|
||||||
|
- fromEndpoints:
|
||||||
|
- matchLabels:
|
||||||
|
app.kubernetes.io/name: traefik
|
||||||
|
matchExpressions:
|
||||||
|
- key: k8s:io.kubernetes.pod.namespace
|
||||||
|
operator: In
|
||||||
|
values:
|
||||||
|
- traefik
|
||||||
|
- traefik-public
|
||||||
|
toPorts:
|
||||||
|
- ports:
|
||||||
|
- port: "3002"
|
||||||
|
|
||||||
|
protocol: TCP
|
||||||
@@ -29,3 +29,4 @@ spec:
|
|||||||
X-Forwarded-Proto: "https"
|
X-Forwarded-Proto: "https"
|
||||||
X-Forwarded-Ssl: "on"
|
X-Forwarded-Ssl: "on"
|
||||||
X-Forwarded-Port: "443"
|
X-Forwarded-Port: "443"
|
||||||
|
|
||||||
|
|||||||
8
deploy/infra/whiteboard/middlewares.yaml
Normal file
8
deploy/infra/whiteboard/middlewares.yaml
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
apiVersion: traefik.io/v1alpha1
|
||||||
|
kind: Middleware
|
||||||
|
metadata:
|
||||||
|
name: strip-whiteboard
|
||||||
|
spec:
|
||||||
|
stripPrefix:
|
||||||
|
prefixes:
|
||||||
|
- "/whiteboard"
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
set -e
|
set -e
|
||||||
echo "Executing nextcloud app deploy."
|
echo "Executing nextcloud app deploy."
|
||||||
|
|
||||||
kubectl kustomize deploy/app | kubectl apply -f -
|
kubectl kustomize deploy/app | kubectl apply -f -
|
||||||
|
|
||||||
load_env_file() {
|
load_env_file() {
|
||||||
@@ -21,9 +20,10 @@ helm repo add nextcloud https://nextcloud.github.io/helm/ --force-update
|
|||||||
|
|
||||||
load_env_file "deploy/app/.env.d/nextcloud-mariadb.env"
|
load_env_file "deploy/app/.env.d/nextcloud-mariadb.env"
|
||||||
load_env_file "deploy/app/.env.d/nextcloud-secrets.env"
|
load_env_file "deploy/app/.env.d/nextcloud-secrets.env"
|
||||||
|
load_env_file "deploy/app/.env.d/redis.env"
|
||||||
|
|
||||||
helm upgrade --install nextcloud nextcloud/nextcloud \
|
helm upgrade --install nextcloud nextcloud/nextcloud --version "9.0" \
|
||||||
--values ./deploy/app/helm-values.yaml \
|
--values ./deploy/app/nextcloud-helm-values.yaml \
|
||||||
--set externalDatabase.user=${MARIADB_USER:?Missing MARIADB_USER} \
|
--set externalDatabase.user=${MARIADB_USER:?Missing MARIADB_USER} \
|
||||||
--set externalDatabase.password=${MARIADB_PASSWORD:?Missing MARIADB_PASSWORD} \
|
--set externalDatabase.password=${MARIADB_PASSWORD:?Missing MARIADB_PASSWORD} \
|
||||||
--set externalDatabase.database=${MARIADB_DATABASE:?Missing MARIADB_DATABASE} \
|
--set externalDatabase.database=${MARIADB_DATABASE:?Missing MARIADB_DATABASE} \
|
||||||
@@ -32,3 +32,12 @@ helm upgrade --install nextcloud nextcloud/nextcloud \
|
|||||||
--set nextcloud.password=${NEXTCLOUD_PASSWORD:?Missing NEXTCLOUD_PASSWORD} \
|
--set nextcloud.password=${NEXTCLOUD_PASSWORD:?Missing NEXTCLOUD_PASSWORD} \
|
||||||
--namespace cloud-limbosolutions-com
|
--namespace cloud-limbosolutions-com
|
||||||
|
|
||||||
|
helm repo add bitnami https://charts.bitnami.com/bitnami --force-update
|
||||||
|
|
||||||
|
helm upgrade --install nextcloud-redis bitnami/redis --version "25.3" \
|
||||||
|
--values ./deploy/app/redis-helm-values.yaml \
|
||||||
|
--set auth.password="${REDIS_PASSWORD:?Missing REDIS_PASSWORD}" \
|
||||||
|
--namespace cloud-limbosolutions-com
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
set -e
|
set -e
|
||||||
echo "Executing infra deploy."
|
echo "Executing infra deploy."
|
||||||
|
kubectl create namespace cloud-limbosolutions-com || true
|
||||||
kubectl kustomize deploy/infra | kubectl -n cloud-limbosolutions-com apply -f -
|
kubectl kustomize deploy/infra | kubectl -n cloud-limbosolutions-com apply -f -
|
||||||
|
|||||||
Reference in New Issue
Block a user