First commit
This commit is contained in:
1
ansible/.gitignore
vendored
Normal file
1
ansible/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
kubeconfig.yaml
|
||||||
2
ansible/k3s/.gitignore
vendored
Normal file
2
ansible/k3s/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
.ansible
|
||||||
|
inventory.ini
|
||||||
51
ansible/k3s/configure_disk.yml
Normal file
51
ansible/k3s/configure_disk.yml
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
- name: Configurar disco adicional en las VMs
|
||||||
|
hosts: k3s_cluster
|
||||||
|
become: yes
|
||||||
|
collections:
|
||||||
|
- community.general
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
- name: Verificar si el disco /dev/vdb existe
|
||||||
|
ansible.builtin.stat:
|
||||||
|
path: /dev/vdb
|
||||||
|
register: disk_check
|
||||||
|
|
||||||
|
- name: Crear particion de datos en disco /dev/vdb
|
||||||
|
community.general.parted:
|
||||||
|
device: /dev/vdb
|
||||||
|
fs_type: ext4
|
||||||
|
label: gpt
|
||||||
|
number: 1
|
||||||
|
state: present
|
||||||
|
when: disk_check.stat.exists
|
||||||
|
|
||||||
|
- name: Formatear la partición en ext4
|
||||||
|
community.general.filesystem:
|
||||||
|
fstype: ext4
|
||||||
|
dev: /dev/vdb1
|
||||||
|
when: disk_check.stat.exists
|
||||||
|
|
||||||
|
- name: Obtener UUID del disco
|
||||||
|
ansible.builtin.command: blkid -s UUID -o value /dev/vdb1
|
||||||
|
register: disk_uuid
|
||||||
|
when: disk_check.stat.exists
|
||||||
|
|
||||||
|
- name: Montar disco en /mnt/data
|
||||||
|
ansible.posix.mount:
|
||||||
|
path: /mnt/data
|
||||||
|
src: UUID={{ disk_uuid.stdout }}
|
||||||
|
fstype: ext4
|
||||||
|
state: "mounted"
|
||||||
|
when: disk_check.stat.exists
|
||||||
|
|
||||||
|
- name: Crear carpeta para longhorn
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /mnt/data/longhorn
|
||||||
|
state: directory
|
||||||
|
mode: '0755'
|
||||||
|
|
||||||
|
- name: Crear carpeta para postgres
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /mnt/data/postgres
|
||||||
|
state: directory
|
||||||
|
mode: '0755'
|
||||||
18
ansible/k3s/create_folders.yml
Normal file
18
ansible/k3s/create_folders.yml
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
- name: Configurar carpetas para longhorn y postrges
|
||||||
|
hosts: k3s_cluster
|
||||||
|
become: yes
|
||||||
|
collections:
|
||||||
|
- community.general
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
- name: Crear carpeta para longhorn
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /mnt/data/longhorn
|
||||||
|
state: directory
|
||||||
|
mode: '0755'
|
||||||
|
|
||||||
|
- name: Crear carpeta para postgres
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /mnt/data/postgres
|
||||||
|
state: directory
|
||||||
|
mode: '0755'
|
||||||
59
ansible/k3s/install.yml
Normal file
59
ansible/k3s/install.yml
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
- name: Instalar K3s en el Cluster
|
||||||
|
hosts: k3s_cluster
|
||||||
|
become: true
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
- name: Actualizar paquetes
|
||||||
|
ansible.builtin.apt:
|
||||||
|
update_cache: true
|
||||||
|
upgrade: true
|
||||||
|
|
||||||
|
- name: Instalar dependencias
|
||||||
|
ansible.builtin.apt:
|
||||||
|
name:
|
||||||
|
- curl
|
||||||
|
- vim
|
||||||
|
- unzip
|
||||||
|
- nfs-common
|
||||||
|
|
||||||
|
- name: Descargar instalador de K3s si no existe
|
||||||
|
ansible.builtin.get_url:
|
||||||
|
url: https://get.k3s.io
|
||||||
|
dest: /tmp/k3s-install.sh
|
||||||
|
mode: '0755'
|
||||||
|
register: k3s_install_script
|
||||||
|
|
||||||
|
- name: Instalar K3s en master
|
||||||
|
ansible.builtin.command: /tmp/k3s-install.sh server --disable=servicelb
|
||||||
|
args:
|
||||||
|
creates: /usr/local/bin/k3s
|
||||||
|
when: inventory_hostname in groups['k3s_master']
|
||||||
|
|
||||||
|
- name: Obtener el token de K3s
|
||||||
|
ansible.builtin.command: cat /var/lib/rancher/k3s/server/node-token
|
||||||
|
register: k3s_token
|
||||||
|
changed_when: false
|
||||||
|
delegate_to: "{{ groups['k3s_master'][0] }}"
|
||||||
|
|
||||||
|
- name: Instalar K3s en nodos worker
|
||||||
|
ansible.builtin.command: /tmp/k3s-install.sh
|
||||||
|
args:
|
||||||
|
creates: /usr/local/bin/k3s
|
||||||
|
environment:
|
||||||
|
K3S_URL: "https://{{ hostvars[groups['k3s_master'][0]]['inventory_hostname'] }}:6443"
|
||||||
|
K3S_TOKEN: "{{ k3s_token.stdout }}"
|
||||||
|
when: inventory_hostname in groups['k3s_workers']
|
||||||
|
|
||||||
|
- name: Copiar kubeconfig al host local
|
||||||
|
ansible.builtin.fetch:
|
||||||
|
src: /etc/rancher/k3s/k3s.yaml
|
||||||
|
dest: ../kubeconfig.yaml
|
||||||
|
flat: true
|
||||||
|
delegate_to: "{{ groups['k3s_master'][0] }}"
|
||||||
|
|
||||||
|
- name: Ajustar kubeconfig para acceso externo
|
||||||
|
ansible.builtin.replace:
|
||||||
|
path: ../kubeconfig.yaml
|
||||||
|
regexp: '127.0.0.1'
|
||||||
|
replace: "{{ hostvars[groups['k3s_master'][0]]['inventory_hostname'] }}"
|
||||||
|
delegate_to: localhost
|
||||||
16
ansible/k3s/uninstall_k3s.yml
Normal file
16
ansible/k3s/uninstall_k3s.yml
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
- name: Desinstalar K3s en el Cluster
|
||||||
|
hosts: k3s_cluster
|
||||||
|
become: yes
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
- name: Desinstalar K3s en los nodos master
|
||||||
|
shell: |
|
||||||
|
/usr/local/bin/k3s-uninstall.sh
|
||||||
|
when:
|
||||||
|
- inventory_hostname in groups['k3s_master']
|
||||||
|
|
||||||
|
- name: Desinstalar K3s en los nodos workers
|
||||||
|
shell: |
|
||||||
|
/usr/local/bin/k3s-agent-uninstall.sh
|
||||||
|
when:
|
||||||
|
- inventory_hostname in groups['k3s_workers']
|
||||||
4
ansible/pihole/.gitignore
vendored
Normal file
4
ansible/pihole/.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
.ansible
|
||||||
|
inventory.ini
|
||||||
|
auth_body.json
|
||||||
|
secrets.yml
|
||||||
25
ansible/pihole/config.json
Normal file
25
ansible/pihole/config.json
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"config": {
|
||||||
|
"dns": {
|
||||||
|
"listeningMode": "local",
|
||||||
|
"upstreams": [
|
||||||
|
"8.8.8.8",
|
||||||
|
"8.8.4.4",
|
||||||
|
"9.9.9.10",
|
||||||
|
"149.112.112.10",
|
||||||
|
"1.1.1.1",
|
||||||
|
"1.0.0.1"
|
||||||
|
],
|
||||||
|
"hosts": [
|
||||||
|
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"dhcp": {
|
||||||
|
"active": true,
|
||||||
|
"start": "192.168.1.100",
|
||||||
|
"end": "192.168.1.254",
|
||||||
|
"router": "192.168.1.1",
|
||||||
|
"netmask": "255.255.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
28
ansible/pihole/configure.yml
Normal file
28
ansible/pihole/configure.yml
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
- name: Configurar Pihole
|
||||||
|
hosts: pihole
|
||||||
|
become: false
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
- name: Autenticar la API de pihole
|
||||||
|
ansible.builtin.uri:
|
||||||
|
url: http://localhost/api/auth
|
||||||
|
method: POST
|
||||||
|
body: |
|
||||||
|
{
|
||||||
|
"password": "{{ pihole_password }}"
|
||||||
|
}
|
||||||
|
body_format: json
|
||||||
|
return_content: true
|
||||||
|
register: auth_response
|
||||||
|
changed_when: false
|
||||||
|
|
||||||
|
- name: Extraer SID de la respuesta de autenticación
|
||||||
|
ansible.builtin.set_fact:
|
||||||
|
pihole_sid: "{{ auth_response.json.session.sid | urlencode }}"
|
||||||
|
|
||||||
|
- name: Configurar pihole
|
||||||
|
ansible.builtin.uri:
|
||||||
|
url: http://localhost/api/config?sid={{ pihole_sid }}
|
||||||
|
method: PATCH
|
||||||
|
src: config.json
|
||||||
|
body_format: json
|
||||||
43
ansible/pihole/install.yml
Normal file
43
ansible/pihole/install.yml
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
- name: Instalar pihole
|
||||||
|
hosts: pihole
|
||||||
|
become: true
|
||||||
|
vars_files:
|
||||||
|
- secrets.yml
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
- name: Actualizar e instalar paquetes
|
||||||
|
ansible.builtin.apt:
|
||||||
|
update_cache: true
|
||||||
|
upgrade: true
|
||||||
|
name:
|
||||||
|
- curl
|
||||||
|
|
||||||
|
- name: Crear carpeta para archivo necesario para unattended
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /etc/pihole
|
||||||
|
state: directory
|
||||||
|
mode: '0755'
|
||||||
|
|
||||||
|
- name: Creando archivo necesario para unattended
|
||||||
|
ansible.builtin.copy:
|
||||||
|
content: ""
|
||||||
|
dest: /etc/pihole/setupVars.conf
|
||||||
|
force: false
|
||||||
|
mode: '0755'
|
||||||
|
|
||||||
|
- name: Descargar script
|
||||||
|
ansible.builtin.get_url:
|
||||||
|
url: https://install.pi-hole.net
|
||||||
|
dest: /tmp/install_pihole.sh
|
||||||
|
mode: '0755'
|
||||||
|
|
||||||
|
- name: Instalar pihole
|
||||||
|
ansible.builtin.command: /tmp/install_pihole.sh --unattended
|
||||||
|
environment:
|
||||||
|
PIHOLE_SKIP_OS_CHECK: "true"
|
||||||
|
args:
|
||||||
|
creates: '/usr/local/bin/pihole'
|
||||||
|
|
||||||
|
- name: Habilitar contraseña si no está configurada
|
||||||
|
ansible.builtin.command: pihole setpassword {{ pihole_password }}
|
||||||
|
changed_when: false
|
||||||
1
ansible/pihole/secrets.yml.example
Normal file
1
ansible/pihole/secrets.yml.example
Normal file
@@ -0,0 +1 @@
|
|||||||
|
pihole_password: "SECRET"
|
||||||
2
haos/.gitignore
vendored
Normal file
2
haos/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
*.env
|
||||||
|
!*.env.example
|
||||||
45
haos/execute_random_video.py
Normal file
45
haos/execute_random_video.py
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
import requests
|
||||||
|
|
||||||
|
API_KEY = "SECRET" #Reemplazar por la del .env ( no puedo leer realmente un archivo en haos con estos scripts :/ )
|
||||||
|
PLAYLIST_ID = "PLSRBwQZwqGmKf9dHlAuhKSyNy0cH-3RyT"
|
||||||
|
|
||||||
|
def get_videos():
|
||||||
|
"""Obtiene todos los IDs de video de una playlist de YouTube."""
|
||||||
|
video_ids = []
|
||||||
|
next_page_token = None
|
||||||
|
|
||||||
|
while True:
|
||||||
|
params = {
|
||||||
|
"part": "contentDetails",
|
||||||
|
"maxResults": 50,
|
||||||
|
"playlistId": PLAYLIST_ID,
|
||||||
|
"key": API_KEY,
|
||||||
|
}
|
||||||
|
|
||||||
|
if next_page_token:
|
||||||
|
params["pageToken"] = next_page_token
|
||||||
|
|
||||||
|
response = requests.get(
|
||||||
|
"https://youtube.googleapis.com/youtube/v3/playlistItems",
|
||||||
|
params=params,
|
||||||
|
headers={"accept": "application/json"},
|
||||||
|
).json()
|
||||||
|
|
||||||
|
# Manejo de errores
|
||||||
|
if "error" in response:
|
||||||
|
print(f"Error en la API: {response['error']['message']}")
|
||||||
|
return []
|
||||||
|
|
||||||
|
# Extraer IDs de video
|
||||||
|
for item in response.get("items", []):
|
||||||
|
video_ids.append(item["contentDetails"]["videoId"])
|
||||||
|
|
||||||
|
# Verificar si hay más páginas
|
||||||
|
next_page_token = response.get("nextPageToken")
|
||||||
|
if not next_page_token:
|
||||||
|
break
|
||||||
|
|
||||||
|
return [f"https://www.youtube.com/watch?v={video_id}" for video_id in video_ids]
|
||||||
|
|
||||||
|
|
||||||
|
print(get_videos())
|
||||||
1
haos/haos.env.example
Normal file
1
haos/haos.env.example
Normal file
@@ -0,0 +1 @@
|
|||||||
|
API_KEY=EXAMPLE
|
||||||
10
manifest/00-metallb/metallb.yml
Normal file
10
manifest/00-metallb/metallb.yml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
apiVersion: helm.cattle.io/v1
|
||||||
|
kind: HelmChart
|
||||||
|
metadata:
|
||||||
|
name: metallb
|
||||||
|
namespace: kube-system
|
||||||
|
spec:
|
||||||
|
repo: https://metallb.github.io/metallb
|
||||||
|
chart: metallb
|
||||||
|
targetNamespace: metallb-system
|
||||||
|
createNamespace: true
|
||||||
17
manifest/00-metallb/settings.yml
Normal file
17
manifest/00-metallb/settings.yml
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
apiVersion: metallb.io/v1beta1
|
||||||
|
kind: IPAddressPool
|
||||||
|
metadata:
|
||||||
|
name: main-pool
|
||||||
|
namespace: metallb-system
|
||||||
|
spec:
|
||||||
|
addresses:
|
||||||
|
- 192.168.4.1-192.168.4.254
|
||||||
|
---
|
||||||
|
apiVersion: metallb.io/v1beta1
|
||||||
|
kind: L2Advertisement
|
||||||
|
metadata:
|
||||||
|
name: metallb-advertisement
|
||||||
|
namespace: metallb-system
|
||||||
|
spec:
|
||||||
|
ipAddressPools:
|
||||||
|
- main-pool
|
||||||
38
manifest/01-traefik/traefik.yml
Normal file
38
manifest/01-traefik/traefik.yml
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
apiVersion: helm.cattle.io/v1
|
||||||
|
kind: HelmChartConfig
|
||||||
|
metadata:
|
||||||
|
name: traefik
|
||||||
|
namespace: kube-system
|
||||||
|
spec:
|
||||||
|
valuesContent: |-
|
||||||
|
service:
|
||||||
|
annotations:
|
||||||
|
metallb.universe.tf/loadBalancerIPs: 192.168.4.1
|
||||||
|
spec:
|
||||||
|
externalTrafficPolicy: Local
|
||||||
|
additionalArguments:
|
||||||
|
- "--providers.kubernetesingress.allowexternalnameservices"
|
||||||
|
- "--providers.kubernetescrd.allowexternalnameservices"
|
||||||
|
|
||||||
|
---
|
||||||
|
apiVersion: traefik.containo.us/v1alpha1
|
||||||
|
kind: Middleware
|
||||||
|
metadata:
|
||||||
|
namespace: default
|
||||||
|
name: allow-local-only
|
||||||
|
spec:
|
||||||
|
ipWhiteList:
|
||||||
|
sourceRange:
|
||||||
|
- 127.0.0.1/32
|
||||||
|
- 192.168.0.0/16
|
||||||
|
- 10.0.0.0/8
|
||||||
|
---
|
||||||
|
apiVersion: traefik.containo.us/v1alpha1
|
||||||
|
kind: Middleware
|
||||||
|
metadata:
|
||||||
|
name: redirect-https
|
||||||
|
namespace: default
|
||||||
|
spec:
|
||||||
|
redirectScheme:
|
||||||
|
scheme: https
|
||||||
|
permanent: true
|
||||||
1
manifest/02-certmanager/.gitignore
vendored
Normal file
1
manifest/02-certmanager/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
secret.yml
|
||||||
33
manifest/02-certmanager/certificate.yml
Normal file
33
manifest/02-certmanager/certificate.yml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
apiVersion: cert-manager.io/v1
|
||||||
|
kind: ClusterIssuer
|
||||||
|
metadata:
|
||||||
|
name: letsencrypt-staging
|
||||||
|
spec:
|
||||||
|
acme:
|
||||||
|
email: hola@danielcortes.xyz
|
||||||
|
server: https://acme-staging-v02.api.letsencrypt.org/directory
|
||||||
|
privateKeySecretRef:
|
||||||
|
name: acme
|
||||||
|
solvers:
|
||||||
|
- dns01:
|
||||||
|
cloudflare:
|
||||||
|
apiTokenSecretRef:
|
||||||
|
name: cloudflare-api-token-secret
|
||||||
|
key: api-token
|
||||||
|
---
|
||||||
|
apiVersion: cert-manager.io/v1
|
||||||
|
kind: ClusterIssuer
|
||||||
|
metadata:
|
||||||
|
name: letsencrypt-prod
|
||||||
|
spec:
|
||||||
|
acme:
|
||||||
|
email: hola@danielcortes.xyz
|
||||||
|
server: https://acme-v02.api.letsencrypt.org/directory
|
||||||
|
privateKeySecretRef:
|
||||||
|
name: acme
|
||||||
|
solvers:
|
||||||
|
- dns01:
|
||||||
|
cloudflare:
|
||||||
|
apiTokenSecretRef:
|
||||||
|
name: cloudflare-api-token-secret
|
||||||
|
key: api-token
|
||||||
12
manifest/02-certmanager/certmanager.yml
Normal file
12
manifest/02-certmanager/certmanager.yml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
apiVersion: helm.cattle.io/v1
|
||||||
|
kind: HelmChart
|
||||||
|
metadata:
|
||||||
|
name: cert-manager
|
||||||
|
namespace: kube-system
|
||||||
|
spec:
|
||||||
|
repo: https://charts.jetstack.io
|
||||||
|
chart: cert-manager
|
||||||
|
targetNamespace: cert-manager
|
||||||
|
createNamespace: true
|
||||||
|
set:
|
||||||
|
crds.enabled: "true"
|
||||||
8
manifest/02-certmanager/secret.yml.example
Normal file
8
manifest/02-certmanager/secret.yml.example
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: cloudflare-api-token-secret
|
||||||
|
namespace: cert-manager
|
||||||
|
type: Opaque
|
||||||
|
stringData:
|
||||||
|
api-token: EXAMPLE
|
||||||
35
manifest/03-longhorn/ingress.yml
Normal file
35
manifest/03-longhorn/ingress.yml
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
apiVersion: cert-manager.io/v1
|
||||||
|
kind: Certificate
|
||||||
|
metadata:
|
||||||
|
name: longhorn-certificate
|
||||||
|
namespace: longhorn-system
|
||||||
|
spec:
|
||||||
|
secretName: longhorn-skrd-fun-tls
|
||||||
|
dnsNames:
|
||||||
|
- "longhorn.skrd.fun"
|
||||||
|
issuerRef:
|
||||||
|
name: letsencrypt-prod
|
||||||
|
kind: ClusterIssuer
|
||||||
|
---
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: longhorn
|
||||||
|
namespace: longhorn-system
|
||||||
|
annotations:
|
||||||
|
traefik.ingress.kubernetes.io/router.middlewares: default-allow-local-only@kubernetescrd, default-redirect-https@kubernetescrd
|
||||||
|
spec:
|
||||||
|
ingressClassName: traefik
|
||||||
|
rules:
|
||||||
|
- host: longhorn.skrd.fun
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: longhorn-frontend
|
||||||
|
port:
|
||||||
|
number: 80
|
||||||
|
tls:
|
||||||
|
- secretName: longhorn-skrd-fun-tls
|
||||||
13
manifest/03-longhorn/longhorn.yml
Normal file
13
manifest/03-longhorn/longhorn.yml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
apiVersion: helm.cattle.io/v1
|
||||||
|
kind: HelmChart
|
||||||
|
metadata:
|
||||||
|
name: longhorn
|
||||||
|
namespace: kube-system
|
||||||
|
spec:
|
||||||
|
repo: https://charts.longhorn.io
|
||||||
|
chart: longhorn
|
||||||
|
targetNamespace: longhorn-system
|
||||||
|
createNamespace: true
|
||||||
|
set:
|
||||||
|
defaultSettings.defaultDataPath: "/mnt/data/longhorn"
|
||||||
|
|
||||||
1
manifest/04-minio/.gitignore
vendored
Normal file
1
manifest/04-minio/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
secret.yml
|
||||||
72
manifest/04-minio/ingress.yml
Normal file
72
manifest/04-minio/ingress.yml
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
apiVersion: cert-manager.io/v1
|
||||||
|
kind: Certificate
|
||||||
|
metadata:
|
||||||
|
name: minio-certificate
|
||||||
|
namespace: minio
|
||||||
|
spec:
|
||||||
|
secretName: minio-skrd-fun-tls
|
||||||
|
dnsNames:
|
||||||
|
- "minio.skrd.fun"
|
||||||
|
issuerRef:
|
||||||
|
name: letsencrypt-prod
|
||||||
|
kind: ClusterIssuer
|
||||||
|
---
|
||||||
|
apiVersion: cert-manager.io/v1
|
||||||
|
kind: Certificate
|
||||||
|
metadata:
|
||||||
|
name: minio-api-certificate
|
||||||
|
namespace: minio
|
||||||
|
spec:
|
||||||
|
secretName: minio-api-skrd-fun-tls
|
||||||
|
dnsNames:
|
||||||
|
- "minio-api.skrd.fun"
|
||||||
|
issuerRef:
|
||||||
|
name: letsencrypt-prod
|
||||||
|
kind: ClusterIssuer
|
||||||
|
---
|
||||||
|
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: minio
|
||||||
|
namespace: minio
|
||||||
|
annotations:
|
||||||
|
traefik.ingress.kubernetes.io/router.middlewares: default-allow-local-only@kubernetescrd, default-redirect-https@kubernetescrd
|
||||||
|
spec:
|
||||||
|
ingressClassName: traefik
|
||||||
|
rules:
|
||||||
|
- host: minio.skrd.fun
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: minio
|
||||||
|
port:
|
||||||
|
number: 9001
|
||||||
|
tls:
|
||||||
|
- secretName: minio-skrd-fun-tls
|
||||||
|
---
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: minio-api
|
||||||
|
namespace: minio
|
||||||
|
annotations:
|
||||||
|
traefik.ingress.kubernetes.io/router.middlewares: default-allow-local-only@kubernetescrd, default-redirect-https@kubernetescrd
|
||||||
|
spec:
|
||||||
|
ingressClassName: traefik
|
||||||
|
rules:
|
||||||
|
- host: minio-api.skrd.fun
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: minio
|
||||||
|
port:
|
||||||
|
number: 9000
|
||||||
|
tls:
|
||||||
|
- secretName: minio-api-skrd-fun-tls
|
||||||
78
manifest/04-minio/minio.yml
Normal file
78
manifest/04-minio/minio.yml
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
apiVersion: apps/v1
|
||||||
|
kind: StatefulSet
|
||||||
|
metadata:
|
||||||
|
name: minio
|
||||||
|
namespace: minio
|
||||||
|
labels:
|
||||||
|
app: minio
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: minio
|
||||||
|
serviceName: minio
|
||||||
|
replicas: 3
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: minio
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: minio
|
||||||
|
env:
|
||||||
|
- name: MINIO_REGION_NAME
|
||||||
|
value: "us-east-1"
|
||||||
|
- name: MINIO_ACCESS_KEY
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: minio-secret
|
||||||
|
key: user
|
||||||
|
- name: MINIO_SECRET_KEY
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: minio-secret
|
||||||
|
key: pass
|
||||||
|
image: minio/minio:RELEASE.2025-03-12T18-04-18Z
|
||||||
|
args:
|
||||||
|
- server
|
||||||
|
- http://minio-0.minio.minio.svc.cluster.local/data
|
||||||
|
- http://minio-1.minio.minio.svc.cluster.local/data
|
||||||
|
- http://minio-2.minio.minio.svc.cluster.local/data
|
||||||
|
- --console-address=:9001
|
||||||
|
ports:
|
||||||
|
- containerPort: 9000
|
||||||
|
protocol: TCP
|
||||||
|
name: api
|
||||||
|
- containerPort: 9001
|
||||||
|
protocol: TCP
|
||||||
|
name: console
|
||||||
|
volumeMounts:
|
||||||
|
- name: data
|
||||||
|
mountPath: /data
|
||||||
|
volumeClaimTemplates:
|
||||||
|
- metadata:
|
||||||
|
name: data
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
- ReadWriteOnce
|
||||||
|
storageClassName: longhorn
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: 10Gi
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: minio
|
||||||
|
namespace: minio
|
||||||
|
labels:
|
||||||
|
app: minio
|
||||||
|
spec:
|
||||||
|
clusterIP: None
|
||||||
|
ports:
|
||||||
|
- port: 9000
|
||||||
|
name: minio
|
||||||
|
- port: 9001
|
||||||
|
name: console
|
||||||
|
selector:
|
||||||
|
app: minio
|
||||||
|
---
|
||||||
4
manifest/04-minio/namespace.yml
Normal file
4
manifest/04-minio/namespace.yml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Namespace
|
||||||
|
metadata:
|
||||||
|
name: minio
|
||||||
9
manifest/04-minio/secret.yml.example
Normal file
9
manifest/04-minio/secret.yml.example
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: minio-secret
|
||||||
|
namespace: minio
|
||||||
|
type: Opaque
|
||||||
|
stringData:
|
||||||
|
user: EXAMPLE
|
||||||
|
pass: EXAMPLE
|
||||||
517
manifest/04-minio/values.yaml.example
Normal file
517
manifest/04-minio/values.yaml.example
Normal file
@@ -0,0 +1,517 @@
|
|||||||
|
# Root key for MinIO Tenant Chart
|
||||||
|
tenant:
|
||||||
|
###
|
||||||
|
# The Tenant name
|
||||||
|
#
|
||||||
|
# Change this to match your preferred MinIO Tenant name.
|
||||||
|
name: minio-tenant
|
||||||
|
###
|
||||||
|
# Specify the Operator container image to use for the deployment.
|
||||||
|
# ``image.tag``
|
||||||
|
# For example, the following sets the image to the ``quay.io/minio/operator`` repo and the v7.0.0 tag.
|
||||||
|
# The container pulls the image if not already present:
|
||||||
|
#
|
||||||
|
# .. code-block:: yaml
|
||||||
|
#
|
||||||
|
# image:
|
||||||
|
# repository: quay.io/minio/minio
|
||||||
|
# tag: RELEASE.2024-11-07T00-52-20Z
|
||||||
|
# pullPolicy: IfNotPresent
|
||||||
|
#
|
||||||
|
# The chart also supports specifying an image based on digest value:
|
||||||
|
#
|
||||||
|
# .. code-block:: yaml
|
||||||
|
#
|
||||||
|
# image:
|
||||||
|
# repository: quay.io/minio/minio@sha256
|
||||||
|
# digest: 28c80b379c75242c6fe793dfbf212f43c602140a0de5ebe3d9c2a3a7b9f9f983
|
||||||
|
# pullPolicy: IfNotPresent
|
||||||
|
#
|
||||||
|
#
|
||||||
|
image:
|
||||||
|
repository: quay.io/minio/minio
|
||||||
|
tag: RELEASE.2024-11-07T00-52-20Z
|
||||||
|
pullPolicy: IfNotPresent
|
||||||
|
###
|
||||||
|
#
|
||||||
|
# An array of Kubernetes secrets to use for pulling images from a private ``image.repository``.
|
||||||
|
# Only one array element is supported at this time.
|
||||||
|
imagePullSecret: { }
|
||||||
|
###
|
||||||
|
#
|
||||||
|
# Specify `initContainers <https://kubernetes.io/docs/concepts/workloads/pods/init-containers/>`__ to perform setup or configuration tasks before the main Tenant pods starts.
|
||||||
|
#
|
||||||
|
# Example of init container which waits for idenity provider to be reachable before starting MinIO Tenant:
|
||||||
|
#
|
||||||
|
# .. code-block:: yaml
|
||||||
|
#
|
||||||
|
# initContainers:
|
||||||
|
# - name: wait-for-idp
|
||||||
|
# image: busybox
|
||||||
|
# command:
|
||||||
|
# - sh
|
||||||
|
# - -c
|
||||||
|
# - |
|
||||||
|
# URL="https://idp-url"
|
||||||
|
# echo "Checking IdP reachability (${URL})"
|
||||||
|
# until $(wget -q -O "/dev/null" ${URL}) ; do
|
||||||
|
# echo "IdP (${URL}) not reachable. Waiting to be reachable..."
|
||||||
|
# sleep 5
|
||||||
|
# done
|
||||||
|
# echo "IdP (${URL}) reachable. Starting MinIO..."
|
||||||
|
#
|
||||||
|
initContainers: [ ]
|
||||||
|
###
|
||||||
|
# The Kubernetes `Scheduler <https://kubernetes.io/docs/concepts/scheduling-eviction/kube-scheduler/>`__ to use for dispatching Tenant pods.
|
||||||
|
#
|
||||||
|
# Specify an empty dictionary ``{}`` to dispatch pods with the default scheduler.
|
||||||
|
scheduler: { }
|
||||||
|
###
|
||||||
|
# The Kubernetes secret name that contains MinIO environment variable configurations.
|
||||||
|
# The secret is expected to have a key named config.env containing environment variables exports.
|
||||||
|
configuration:
|
||||||
|
name: myminio-env-configuration
|
||||||
|
###
|
||||||
|
# Root key for dynamically creating a secret for use with configuring root MinIO User
|
||||||
|
# Specify the ``name`` and then a list of environment variables.
|
||||||
|
#
|
||||||
|
# .. important::
|
||||||
|
#
|
||||||
|
# Do not use this in production environments.
|
||||||
|
# This field is intended for use with rapid development or testing only.
|
||||||
|
#
|
||||||
|
# For example:
|
||||||
|
#
|
||||||
|
# .. code-block:: yaml
|
||||||
|
#
|
||||||
|
# name: myminio-env-configuration
|
||||||
|
# accessKey: minio
|
||||||
|
# secretKey: minio123
|
||||||
|
#
|
||||||
|
configSecret:
|
||||||
|
name: myminio-env-configuration
|
||||||
|
accessKey: minio
|
||||||
|
secretKey: minio123
|
||||||
|
#existingSecret: true
|
||||||
|
|
||||||
|
###
|
||||||
|
# Metadata that will be added to the statefulset and pods of all pools
|
||||||
|
poolsMetadata:
|
||||||
|
###
|
||||||
|
# Specify `annotations <https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/>`__ to associate to Tenant pods.
|
||||||
|
annotations: { }
|
||||||
|
###
|
||||||
|
# Specify `labels <https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/>`__ to associate to Tenant pods.
|
||||||
|
labels: { }
|
||||||
|
|
||||||
|
###
|
||||||
|
# If this variable is set to true, then enable the usage of an existing Kubernetes secret to set environment variables for the Tenant.
|
||||||
|
# The existing Kubernetes secret name must be placed under .tenant.configuration.name e.g. existing-minio-env-configuration
|
||||||
|
# The secret must contain a key ``config.env``.
|
||||||
|
# The values should be a series of export statements to set environment variables for the Tenant.
|
||||||
|
# For example:
|
||||||
|
#
|
||||||
|
# .. code-block:: shell
|
||||||
|
#
|
||||||
|
# stringData:
|
||||||
|
# config.env: |-
|
||||||
|
# export MINIO_ROOT_USER=ROOTUSERNAME
|
||||||
|
# export MINIO_ROOT_PASSWORD=ROOTUSERPASSWORD
|
||||||
|
#
|
||||||
|
# existingSecret: false
|
||||||
|
###
|
||||||
|
# Top level key for configuring MinIO Pool(s) in this Tenant.
|
||||||
|
#
|
||||||
|
# See `Operator CRD: Pools <https://min.io/docs/minio/kubernetes/upstream/reference/operator-crd.html#pool>`__ for more information on all subfields.
|
||||||
|
pools:
|
||||||
|
###
|
||||||
|
# The number of MinIO Tenant Pods / Servers in this pool.
|
||||||
|
# For standalone mode, supply 1. For distributed mode, supply 4 or more.
|
||||||
|
# Note that the operator does not support upgrading from standalone to distributed mode.
|
||||||
|
- servers: 4
|
||||||
|
###
|
||||||
|
# Custom name for the pool
|
||||||
|
name: pool-0
|
||||||
|
###
|
||||||
|
# The number of volumes attached per MinIO Tenant Pod / Server.
|
||||||
|
volumesPerServer: 4
|
||||||
|
###
|
||||||
|
# The capacity per volume requested per MinIO Tenant Pod.
|
||||||
|
size: 10Gi
|
||||||
|
###
|
||||||
|
# The `storageClass <https://kubernetes.io/docs/concepts/storage/storage-classes/>`__ to associate with volumes generated for this pool.
|
||||||
|
#
|
||||||
|
# If using Amazon Elastic Block Store (EBS) CSI driver
|
||||||
|
# Please make sure to set xfs for "csi.storage.k8s.io/fstype" parameter under StorageClass.parameters.
|
||||||
|
# Docs: https://github.com/kubernetes-sigs/aws-ebs-csi-driver/blob/master/docs/parameters.md
|
||||||
|
storageClassName: longhorn
|
||||||
|
###
|
||||||
|
# Specify `storageAnnotations <https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/>`__ to associate to PVCs.
|
||||||
|
storageAnnotations: { }
|
||||||
|
###
|
||||||
|
# Specify `storageLabels <https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/>`__ to associate to PVCs.
|
||||||
|
storageLabels: { }
|
||||||
|
###
|
||||||
|
# Specify `annotations <https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/>`__ to associate to Tenant pods.
|
||||||
|
annotations: { }
|
||||||
|
###
|
||||||
|
# Specify `labels <https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/>`__ to associate to Tenant pods.
|
||||||
|
labels: { }
|
||||||
|
###
|
||||||
|
#
|
||||||
|
# An array of `Toleration labels <https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/>`__ to associate to Tenant pods.
|
||||||
|
#
|
||||||
|
# These settings determine the distribution of pods across worker nodes.
|
||||||
|
tolerations: [ ]
|
||||||
|
###
|
||||||
|
# Any `Node Selectors <https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/>`__ to apply to Tenant pods.
|
||||||
|
#
|
||||||
|
# The Kubernetes scheduler uses these selectors to determine which worker nodes onto which it can deploy Tenant pods.
|
||||||
|
#
|
||||||
|
# If no worker nodes match the specified selectors, the Tenant deployment will fail.
|
||||||
|
nodeSelector: { }
|
||||||
|
###
|
||||||
|
#
|
||||||
|
# The `affinity <https://kubernetes.io/docs/tasks/configure-pod-container/assign-pods-nodes-using-node-affinity/>`__ or anti-affinity settings to apply to Tenant pods.
|
||||||
|
#
|
||||||
|
# These settings determine the distribution of pods across worker nodes and can help prevent or allow colocating pods onto the same worker nodes.
|
||||||
|
affinity: { }
|
||||||
|
###
|
||||||
|
#
|
||||||
|
# The `Requests or Limits <https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/>`__ for resources to associate to Tenant pods.
|
||||||
|
#
|
||||||
|
# These settings can control the minimum and maximum resources requested for each pod.
|
||||||
|
# If no worker nodes can meet the specified requests, the Operator may fail to deploy.
|
||||||
|
resources: { }
|
||||||
|
###
|
||||||
|
# The Kubernetes `SecurityContext <https://kubernetes.io/docs/tasks/configure-pod-container/security-context/>`__ to use for deploying Tenant resources.
|
||||||
|
#
|
||||||
|
# You may need to modify these values to meet your cluster's security and access settings.
|
||||||
|
#
|
||||||
|
# We recommend disabling recursive permission changes by setting ``fsGroupChangePolicy`` to ``OnRootMismatch`` as those operations can be expensive for certain workloads (e.g. large volumes with many small files).
|
||||||
|
securityContext:
|
||||||
|
runAsUser: 1000
|
||||||
|
runAsGroup: 1000
|
||||||
|
fsGroup: 1000
|
||||||
|
fsGroupChangePolicy: "OnRootMismatch"
|
||||||
|
runAsNonRoot: true
|
||||||
|
###
|
||||||
|
# The Kubernetes `SecurityContext <https://kubernetes.io/docs/tasks/configure-pod-container/security-context/>`__ to use for deploying Tenant containers.
|
||||||
|
# You may need to modify these values to meet your cluster's security and access settings.
|
||||||
|
containerSecurityContext:
|
||||||
|
runAsUser: 1000
|
||||||
|
runAsGroup: 1000
|
||||||
|
runAsNonRoot: true
|
||||||
|
allowPrivilegeEscalation: false
|
||||||
|
capabilities:
|
||||||
|
drop:
|
||||||
|
- ALL
|
||||||
|
seccompProfile:
|
||||||
|
type: RuntimeDefault
|
||||||
|
###
|
||||||
|
#
|
||||||
|
# An array of `Topology Spread Constraints <https://kubernetes.io/docs/concepts/scheduling-eviction/topology-spread-constraints/>`__ to associate to Operator Console pods.
|
||||||
|
#
|
||||||
|
# These settings determine the distribution of pods across worker nodes.
|
||||||
|
topologySpreadConstraints: [ ]
|
||||||
|
###
|
||||||
|
#
|
||||||
|
# The name of a custom `Container Runtime <https://kubernetes.io/docs/concepts/containers/runtime-class/>`__ to use for the Operator Console pods.
|
||||||
|
# runtimeClassName: ""
|
||||||
|
###
|
||||||
|
# The mount path where Persistent Volumes are mounted inside Tenant container(s).
|
||||||
|
mountPath: /export
|
||||||
|
###
|
||||||
|
# The Sub path inside Mount path where MinIO stores data.
|
||||||
|
#
|
||||||
|
# .. warning::
|
||||||
|
#
|
||||||
|
# Treat the ``mountPath`` and ``subPath`` values as immutable once you deploy the Tenant.
|
||||||
|
# If you change these values post-deployment, then you may have different paths for new and pre-existing data.
|
||||||
|
# This can vastly increase operational complexity and may result in unpredictable data states.
|
||||||
|
subPath: /data
|
||||||
|
###
|
||||||
|
# Configures a Prometheus-compatible scraping endpoint at the specified port.
|
||||||
|
metrics:
|
||||||
|
enabled: false
|
||||||
|
port: 9000
|
||||||
|
protocol: http
|
||||||
|
###
|
||||||
|
# Configures external certificate settings for the Tenant.
|
||||||
|
certificate:
|
||||||
|
###
|
||||||
|
# Specify an array of Kubernetes TLS secrets, where each entry corresponds to a secret the TLS private key and public certificate pair.
|
||||||
|
#
|
||||||
|
# This is used by MinIO to verify TLS connections from clients using those CAs
|
||||||
|
# If you omit this and have clients using TLS certificates minted by an external CA, those connections may fail with warnings around certificate verification.
|
||||||
|
# See `Operator CRD: TenantSpec <https://min.io/docs/minio/kubernetes/upstream/reference/operator-crd.html#tenantspec>`__.
|
||||||
|
externalCaCertSecret: [ ]
|
||||||
|
###
|
||||||
|
# Specify an array of Kubernetes secrets, where each entry corresponds to a secret contains the TLS private key and public certificate pair.
|
||||||
|
#
|
||||||
|
# Omit this to use only the MinIO Operator autogenerated certificates.
|
||||||
|
#
|
||||||
|
# If you omit this field *and* set ``requestAutoCert`` to false, the Tenant starts without TLS.
|
||||||
|
#
|
||||||
|
# See `Operator CRD: TenantSpec <https://min.io/docs/minio/kubernetes/upstream/reference/operator-crd.html#tenantspec>`__.
|
||||||
|
#
|
||||||
|
# .. important::
|
||||||
|
#
|
||||||
|
# The MinIO Operator may output TLS connectivity errors if it cannot trust the Certificate Authority (CA) which minted the custom certificates.
|
||||||
|
#
|
||||||
|
# You can pass the CA to the Operator to allow it to trust that cert.
|
||||||
|
# See `Self-Signed, Internal, and Private Certificates <https://min.io/docs/minio/kubernetes/upstream/operations/network-encryption.html#self-signed-internal-and-private-certificates>`__ for more information.
|
||||||
|
# This step may also be necessary for globally trusted CAs where you must provide intermediate certificates to the Operator to help build the full chain of trust.
|
||||||
|
externalCertSecret: [ ]
|
||||||
|
###
|
||||||
|
# Enable automatic Kubernetes based `certificate generation and signing <https://kubernetes.io/docs/tasks/tls/managing-tls-in-a-cluster>`__
|
||||||
|
requestAutoCert: true
|
||||||
|
###
|
||||||
|
# The minimum number of days to expiry before an alert for an expiring certificate is fired.
|
||||||
|
# In the below example, if a given certificate will expire in 7 days then expiration events will only be triggered 1 day before expiry
|
||||||
|
# certExpiryAlertThreshold: 1
|
||||||
|
###
|
||||||
|
# This field is used only when ``requestAutoCert: true``.
|
||||||
|
# Use this field to set CommonName for the auto-generated certificate.
|
||||||
|
# MinIO defaults to using the internal Kubernetes DNS name for the pod
|
||||||
|
# The default DNS name format is typically ``*.minio.default.svc.cluster.local``.
|
||||||
|
#
|
||||||
|
# See `Operator CRD: CertificateConfig <https://min.io/docs/minio/kubernetes/upstream/reference/operator-crd.html#certificateconfig>`__
|
||||||
|
certConfig: { }
|
||||||
|
###
|
||||||
|
# MinIO features to enable or disable in the MinIO Tenant
|
||||||
|
# See `Operator CRD: Features <https://min.io/docs/minio/kubernetes/upstream/reference/operator-crd.html#features>`__.
|
||||||
|
features:
|
||||||
|
bucketDNS: false
|
||||||
|
domains: { }
|
||||||
|
enableSFTP: false
|
||||||
|
###
|
||||||
|
# Array of objects describing one or more buckets to create during tenant provisioning.
|
||||||
|
# Example:
|
||||||
|
#
|
||||||
|
# .. code-block:: yaml
|
||||||
|
#
|
||||||
|
# - name: my-minio-bucket
|
||||||
|
# objectLock: false # optional
|
||||||
|
# region: us-east-1 # optional
|
||||||
|
buckets: [ ]
|
||||||
|
###
|
||||||
|
# Array of Kubernetes secrets from which the Operator generates MinIO users during tenant provisioning.
|
||||||
|
#
|
||||||
|
# Each secret should specify the ``CONSOLE_ACCESS_KEY`` and ``CONSOLE_SECRET_KEY`` as the access key and secret key for that user.
|
||||||
|
users: [ ]
|
||||||
|
###
|
||||||
|
# The `PodManagement <https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/#pod-management-policy>`__ policy for MinIO Tenant Pods.
|
||||||
|
# Can be "OrderedReady" or "Parallel"
|
||||||
|
podManagementPolicy: Parallel
|
||||||
|
# The `Liveness Probe <https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes>`__ for monitoring Tenant pod liveness.
|
||||||
|
# Tenant pods will be restarted if the probe fails.
|
||||||
|
liveness: { }
|
||||||
|
###
|
||||||
|
# `Readiness Probe <https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/>`__ for monitoring Tenant container readiness.
|
||||||
|
# Tenant pods will be removed from service endpoints if the probe fails.
|
||||||
|
readiness: { }
|
||||||
|
###
|
||||||
|
# `Startup Probe <https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/>`__ for monitoring container startup.
|
||||||
|
# Tenant pods will be restarted if the probe fails.
|
||||||
|
# Refer
|
||||||
|
startup: { }
|
||||||
|
###
|
||||||
|
# The `Lifecycle hooks <https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/>`__ for container.
|
||||||
|
lifecycle: { }
|
||||||
|
###
|
||||||
|
# Directs the Operator to deploy the MinIO S3 API and Console services as LoadBalancer objects.
|
||||||
|
#
|
||||||
|
# If the Kubernetes cluster has a configured LoadBalancer, it can attempt to route traffic to those services automatically.
|
||||||
|
#
|
||||||
|
# - Specify ``minio: true`` to expose the MinIO S3 API.
|
||||||
|
# - Specify ``console: true`` to expose the Console.
|
||||||
|
#
|
||||||
|
# Both fields default to ``false``.
|
||||||
|
exposeServices:
|
||||||
|
minio: true
|
||||||
|
console: true
|
||||||
|
###
|
||||||
|
# The `Kubernetes Service Account <https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/>`__ associated with the Tenant.
|
||||||
|
serviceAccountName: ""
|
||||||
|
###
|
||||||
|
# Directs the Operator to add the Tenant's metric scrape configuration to an existing Kubernetes Prometheus deployment managed by the Prometheus Operator.
|
||||||
|
prometheusOperator: false
|
||||||
|
###
|
||||||
|
# Configure pod logging configuration for the MinIO Tenant.
|
||||||
|
#
|
||||||
|
# - Specify ``json`` for JSON-formatted logs.
|
||||||
|
# - Specify ``anonymous`` for anonymized logs.
|
||||||
|
# - Specify ``quiet`` to supress logging.
|
||||||
|
#
|
||||||
|
# An example of JSON-formatted logs is as follows:
|
||||||
|
#
|
||||||
|
# .. code-block:: shell
|
||||||
|
#
|
||||||
|
# $ k logs myminio-pool-0-0 -n default
|
||||||
|
# {"level":"INFO","errKind":"","time":"2022-04-07T21:49:33.740058549Z","message":"All MinIO sub-systems initialized successfully"}
|
||||||
|
logging: { }
|
||||||
|
###
|
||||||
|
# serviceMetadata allows passing additional labels and annotations to MinIO and Console specific
|
||||||
|
# services created by the operator.
|
||||||
|
serviceMetadata: { }
|
||||||
|
###
|
||||||
|
# Add environment variables to be set in MinIO container (https://github.com/minio/minio/tree/master/docs/config)
|
||||||
|
env: [ ]
|
||||||
|
###
|
||||||
|
# PriorityClassName indicates the Pod priority and hence importance of a Pod relative to other Pods.
|
||||||
|
# This is applied to MinIO pods only.
|
||||||
|
# Refer Kubernetes documentation for details https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass/
|
||||||
|
priorityClassName: ""
|
||||||
|
###
|
||||||
|
# An array of `Volumes <https://kubernetes.io/docs/concepts/storage/volumes/>`__ which the Operator can mount to Tenant pods.
|
||||||
|
#
|
||||||
|
# The volumes must exist *and* be accessible to the Tenant pods.
|
||||||
|
additionalVolumes: [ ]
|
||||||
|
###
|
||||||
|
# An array of volume mount points associated to each Tenant container.
|
||||||
|
#
|
||||||
|
# Specify each item in the array as follows:
|
||||||
|
#
|
||||||
|
# .. code-block:: yaml
|
||||||
|
#
|
||||||
|
# volumeMounts:
|
||||||
|
# - name: volumename
|
||||||
|
# mountPath: /path/to/mount
|
||||||
|
#
|
||||||
|
# The ``name`` field must correspond to an entry in the ``additionalVolumes`` array.
|
||||||
|
additionalVolumeMounts: [ ]
|
||||||
|
# Define configuration for KES (stateless and distributed key-management system)
|
||||||
|
# Refer https://github.com/minio/kes
|
||||||
|
#kes:
|
||||||
|
# ## Image field:
|
||||||
|
# # Image from tag (original behavior), for example:
|
||||||
|
# # image:
|
||||||
|
# # repository: quay.io/minio/kes
|
||||||
|
# # tag: 2024-11-25T13-44-31Z
|
||||||
|
# # Image from digest (added after original behavior), for example:
|
||||||
|
# # image:
|
||||||
|
# # repository: quay.io/minio/kes@sha256
|
||||||
|
# # digest: fb15af611149892f357a8a99d1bcd8bf5dae713bd64c15e6eb27fbdb88fc208b
|
||||||
|
# image:
|
||||||
|
# repository: quay.io/minio/kes
|
||||||
|
# tag: 2024-11-25T13-44-31Z
|
||||||
|
# pullPolicy: IfNotPresent
|
||||||
|
# env: [ ]
|
||||||
|
# replicas: 2
|
||||||
|
# configuration: |-
|
||||||
|
# address: :7373
|
||||||
|
# tls:
|
||||||
|
# key: /tmp/kes/server.key # Path to the TLS private key
|
||||||
|
# cert: /tmp/kes/server.crt # Path to the TLS certificate
|
||||||
|
# proxy:
|
||||||
|
# identities: []
|
||||||
|
# header:
|
||||||
|
# cert: X-Tls-Client-Cert
|
||||||
|
# admin:
|
||||||
|
# identity: ${MINIO_KES_IDENTITY}
|
||||||
|
# cache:
|
||||||
|
# expiry:
|
||||||
|
# any: 5m0s
|
||||||
|
# unused: 20s
|
||||||
|
# log:
|
||||||
|
# error: on
|
||||||
|
# audit: off
|
||||||
|
# keystore:
|
||||||
|
# # KES configured with fs (File System mode) doesn't work in Kubernetes environments and is not recommended
|
||||||
|
# # use a real KMS
|
||||||
|
# # fs:
|
||||||
|
# # path: "./keys" # Path to directory. Keys will be stored as files. Not Recommended for Production.
|
||||||
|
# vault:
|
||||||
|
# endpoint: "http://vault.default.svc.cluster.local:8200" # The Vault endpoint
|
||||||
|
# namespace: "" # An optional Vault namespace. See: https://www.vaultproject.io/docs/enterprise/namespaces/index.html
|
||||||
|
# prefix: "my-minio" # An optional K/V prefix. The server will store keys under this prefix.
|
||||||
|
# approle: # AppRole credentials. See: https://www.vaultproject.io/docs/auth/approle.html
|
||||||
|
# id: "<YOUR APPROLE ID HERE>" # Your AppRole Role ID
|
||||||
|
# secret: "<YOUR APPROLE SECRET ID HERE>" # Your AppRole Secret ID
|
||||||
|
# retry: 15s # Duration until the server tries to re-authenticate after connection loss.
|
||||||
|
# tls: # The Vault client TLS configuration for mTLS authentication and certificate verification
|
||||||
|
# key: "" # Path to the TLS client private key for mTLS authentication to Vault
|
||||||
|
# cert: "" # Path to the TLS client certificate for mTLS authentication to Vault
|
||||||
|
# ca: "" # Path to one or multiple PEM root CA certificates
|
||||||
|
# status: # Vault status configuration. The server will periodically reach out to Vault to check its status.
|
||||||
|
# ping: 10s # Duration until the server checks Vault's status again.
|
||||||
|
# # aws:
|
||||||
|
# # # The AWS SecretsManager key store. The server will store
|
||||||
|
# # # secret keys at the AWS SecretsManager encrypted with
|
||||||
|
# # # AWS-KMS. See: https://aws.amazon.com/secrets-manager
|
||||||
|
# # secretsmanager:
|
||||||
|
# # endpoint: "" # The AWS SecretsManager endpoint - e.g.: secretsmanager.us-east-2.amazonaws.com
|
||||||
|
# # region: "" # The AWS region of the SecretsManager - e.g.: us-east-2
|
||||||
|
# # kmskey: "" # The AWS-KMS key ID used to en/decrypt secrets at the SecretsManager. By default (if not set) the default AWS-KMS key will be used.
|
||||||
|
# # credentials: # The AWS credentials for accessing secrets at the AWS SecretsManager.
|
||||||
|
# # accesskey: "" # Your AWS Access Key
|
||||||
|
# # secretkey: "" # Your AWS Secret Key
|
||||||
|
# # token: "" # Your AWS session token (usually optional)
|
||||||
|
# imagePullPolicy: "IfNotPresent"
|
||||||
|
# externalCertSecret: null
|
||||||
|
# clientCertSecret: null
|
||||||
|
# # Key name to be created on the KMS, default is "my-minio-key"
|
||||||
|
# keyName: ""
|
||||||
|
# resources: { }
|
||||||
|
# nodeSelector: { }
|
||||||
|
# affinity:
|
||||||
|
# nodeAffinity: { }
|
||||||
|
# podAffinity: { }
|
||||||
|
# podAntiAffinity: { }
|
||||||
|
# tolerations: [ ]
|
||||||
|
# annotations: { }
|
||||||
|
# labels: { }
|
||||||
|
# serviceAccountName: ""
|
||||||
|
# securityContext:
|
||||||
|
# runAsUser: 1000
|
||||||
|
# runAsGroup: 1000
|
||||||
|
# runAsNonRoot: true
|
||||||
|
# fsGroup: 1000
|
||||||
|
# containerSecurityContext:
|
||||||
|
# runAsUser: 1000
|
||||||
|
# runAsGroup: 1000
|
||||||
|
# runAsNonRoot: true
|
||||||
|
# allowPrivilegeEscalation: false
|
||||||
|
# capabilities:
|
||||||
|
# drop:
|
||||||
|
# - ALL
|
||||||
|
# seccompProfile:
|
||||||
|
# type: RuntimeDefault
|
||||||
|
|
||||||
|
###
|
||||||
|
# Configures `Ingress <https://kubernetes.io/docs/concepts/services-networking/ingress/>`__ for the Tenant S3 API and Console.
|
||||||
|
#
|
||||||
|
# Set the keys to conform to the Ingress controller and configuration of your choice.
|
||||||
|
ingress:
|
||||||
|
api:
|
||||||
|
enabled: true
|
||||||
|
ingressClassName: ""
|
||||||
|
labels: { }
|
||||||
|
annotations: { }
|
||||||
|
tls: [ ]
|
||||||
|
host: minio.skrd.fun
|
||||||
|
path: /
|
||||||
|
pathType: Prefix
|
||||||
|
console:
|
||||||
|
enabled: false
|
||||||
|
ingressClassName: ""
|
||||||
|
labels: { }
|
||||||
|
annotations: { }
|
||||||
|
tls: [ ]
|
||||||
|
host: minio-console.skrd.fun
|
||||||
|
path: /
|
||||||
|
pathType: Prefix
|
||||||
|
# Use an extraResources template section to include additional Kubernetes resources
|
||||||
|
# with the Helm deployment.
|
||||||
|
#extraResources:
|
||||||
|
# - |
|
||||||
|
# apiVersion: v1
|
||||||
|
# kind: Secret
|
||||||
|
# type: Opaque
|
||||||
|
# metadata:
|
||||||
|
# name: {{ dig "tenant" "configSecret" "name" "" (.Values | merge (dict)) }}
|
||||||
|
# stringData:
|
||||||
|
# config.env: |-
|
||||||
|
# export MINIO_ROOT_USER='minio'
|
||||||
|
# export MINIO_ROOT_PASSWORD='minio123'
|
||||||
1
manifest/05-postgres/.gitignore
vendored
Normal file
1
manifest/05-postgres/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
secret.yml
|
||||||
9
manifest/05-postgres/backup.yml
Normal file
9
manifest/05-postgres/backup.yml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
apiVersion: postgresql.cnpg.io/v1
|
||||||
|
kind: ScheduledBackup
|
||||||
|
metadata:
|
||||||
|
name: daily-backup
|
||||||
|
spec:
|
||||||
|
schedule: "0 * * * * *"
|
||||||
|
backupOwnerReference: self
|
||||||
|
cluster:
|
||||||
|
name: cnpg-cluster
|
||||||
45
manifest/05-postgres/cnpg.yml
Normal file
45
manifest/05-postgres/cnpg.yml
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
apiVersion: postgresql.cnpg.io/v1
|
||||||
|
kind: Cluster
|
||||||
|
metadata:
|
||||||
|
name: cnpg-cluster
|
||||||
|
spec:
|
||||||
|
instances: 3
|
||||||
|
bootstrap:
|
||||||
|
initdb:
|
||||||
|
database: app
|
||||||
|
owner: app
|
||||||
|
secret:
|
||||||
|
name: cnpg-secret
|
||||||
|
storage:
|
||||||
|
pvcTemplate:
|
||||||
|
accessModes:
|
||||||
|
- ReadWriteOnce
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: 20Gi
|
||||||
|
storageClassName: cnpg-storage
|
||||||
|
affinity:
|
||||||
|
enablePodAntiAffinity: true
|
||||||
|
topologyKey: kubernetes.io/hostname
|
||||||
|
podAntiAffinityType: required
|
||||||
|
backup:
|
||||||
|
retentionPolicy: "7d"
|
||||||
|
barmanObjectStore:
|
||||||
|
destinationPath: "s3://backups/"
|
||||||
|
endpointURL: "https://minio-api.skrd.fun"
|
||||||
|
s3Credentials:
|
||||||
|
accessKeyId:
|
||||||
|
name: aws-creds
|
||||||
|
key: ACCESS_KEY
|
||||||
|
secretAccessKey:
|
||||||
|
name: aws-creds
|
||||||
|
key: SECRET_KEY
|
||||||
|
managed:
|
||||||
|
services:
|
||||||
|
additional:
|
||||||
|
- selectorType: rw
|
||||||
|
serviceTemplate:
|
||||||
|
metadata:
|
||||||
|
name: "cnpg-cluster-open"
|
||||||
|
spec:
|
||||||
|
type: LoadBalancer
|
||||||
10
manifest/05-postgres/operator.yml
Normal file
10
manifest/05-postgres/operator.yml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
apiVersion: helm.cattle.io/v1
|
||||||
|
kind: HelmChart
|
||||||
|
metadata:
|
||||||
|
name: postgres
|
||||||
|
namespace: kube-system
|
||||||
|
spec:
|
||||||
|
repo: https://cloudnative-pg.github.io/charts
|
||||||
|
chart: cloudnative-pg
|
||||||
|
targetNamespace: cnpg-system
|
||||||
|
createNamespace: true
|
||||||
17
manifest/05-postgres/secret.yml.example
Normal file
17
manifest/05-postgres/secret.yml.example
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: cnpg-secret
|
||||||
|
stringData:
|
||||||
|
username: EXAMPLE
|
||||||
|
password: EXAMPLE
|
||||||
|
type: kubernetes.io/basic-auth
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: aws-creds
|
||||||
|
type: Opaque
|
||||||
|
stringData:
|
||||||
|
ACCESS_KEY: EXAMPLE
|
||||||
|
SECRET_KEY: EXAMPLE
|
||||||
11
manifest/05-postgres/settings.yml
Normal file
11
manifest/05-postgres/settings.yml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
apiVersion: storage.k8s.io/v1
|
||||||
|
kind: StorageClass
|
||||||
|
metadata:
|
||||||
|
name: cnpg-storage
|
||||||
|
provisioner: driver.longhorn.io
|
||||||
|
allowVolumeExpansion: true
|
||||||
|
parameters:
|
||||||
|
numberOfReplicas: "1"
|
||||||
|
dataLocality: "strict-local"
|
||||||
|
staleReplicaTimeout: "2880"
|
||||||
|
---
|
||||||
221
manifest/06-external-ingress/certificates.yml
Normal file
221
manifest/06-external-ingress/certificates.yml
Normal file
@@ -0,0 +1,221 @@
|
|||||||
|
apiVersion: cert-manager.io/v1
|
||||||
|
kind: Certificate
|
||||||
|
metadata:
|
||||||
|
name: actual-certificate
|
||||||
|
namespace: external-services
|
||||||
|
spec:
|
||||||
|
secretName: actual-skrd-fun-tls
|
||||||
|
dnsNames:
|
||||||
|
- "actual.skrd.fun"
|
||||||
|
issuerRef:
|
||||||
|
name: letsencrypt-prod
|
||||||
|
kind: ClusterIssuer
|
||||||
|
---
|
||||||
|
apiVersion: cert-manager.io/v1
|
||||||
|
kind: Certificate
|
||||||
|
metadata:
|
||||||
|
name: haos-certificate
|
||||||
|
namespace: external-services
|
||||||
|
spec:
|
||||||
|
secretName: haos-skrd-fun-tls
|
||||||
|
dnsNames:
|
||||||
|
- "haos.skrd.fun"
|
||||||
|
issuerRef:
|
||||||
|
name: letsencrypt-prod
|
||||||
|
kind: ClusterIssuer
|
||||||
|
---
|
||||||
|
apiVersion: cert-manager.io/v1
|
||||||
|
kind: Certificate
|
||||||
|
metadata:
|
||||||
|
name: firefly-certificate
|
||||||
|
namespace: external-services
|
||||||
|
spec:
|
||||||
|
secretName: firefly-skrd-fun-tls
|
||||||
|
dnsNames:
|
||||||
|
- "firefly.skrd.fun"
|
||||||
|
issuerRef:
|
||||||
|
name: letsencrypt-prod
|
||||||
|
kind: ClusterIssuer
|
||||||
|
---
|
||||||
|
apiVersion: cert-manager.io/v1
|
||||||
|
kind: Certificate
|
||||||
|
metadata:
|
||||||
|
name: gametabs-certificate
|
||||||
|
namespace: external-services
|
||||||
|
spec:
|
||||||
|
secretName: gametabs-skrd-fun-tls
|
||||||
|
dnsNames:
|
||||||
|
- "gametabs.skrd.fun"
|
||||||
|
issuerRef:
|
||||||
|
name: letsencrypt-prod
|
||||||
|
kind: ClusterIssuer
|
||||||
|
---
|
||||||
|
apiVersion: cert-manager.io/v1
|
||||||
|
kind: Certificate
|
||||||
|
metadata:
|
||||||
|
name: git-certificate
|
||||||
|
namespace: external-services
|
||||||
|
spec:
|
||||||
|
secretName: git-skrd-fun-tls
|
||||||
|
dnsNames:
|
||||||
|
- "git.skrd.fun"
|
||||||
|
issuerRef:
|
||||||
|
name: letsencrypt-prod
|
||||||
|
kind: ClusterIssuer
|
||||||
|
---
|
||||||
|
apiVersion: cert-manager.io/v1
|
||||||
|
kind: Certificate
|
||||||
|
metadata:
|
||||||
|
name: jackett-certificate
|
||||||
|
namespace: external-services
|
||||||
|
spec:
|
||||||
|
secretName: jackett-skrd-fun-tls
|
||||||
|
dnsNames:
|
||||||
|
- "jackett.skrd.fun"
|
||||||
|
issuerRef:
|
||||||
|
name: letsencrypt-prod
|
||||||
|
kind: ClusterIssuer
|
||||||
|
---
|
||||||
|
apiVersion: cert-manager.io/v1
|
||||||
|
kind: Certificate
|
||||||
|
metadata:
|
||||||
|
name: jelly-certificate
|
||||||
|
namespace: external-services
|
||||||
|
spec:
|
||||||
|
secretName: jelly-skrd-fun-tls
|
||||||
|
dnsNames:
|
||||||
|
- "jelly.skrd.fun"
|
||||||
|
issuerRef:
|
||||||
|
name: letsencrypt-prod
|
||||||
|
kind: ClusterIssuer
|
||||||
|
---
|
||||||
|
apiVersion: cert-manager.io/v1
|
||||||
|
kind: Certificate
|
||||||
|
metadata:
|
||||||
|
name: navi-certificate
|
||||||
|
namespace: external-services
|
||||||
|
spec:
|
||||||
|
secretName: navi-skrd-fun-tls
|
||||||
|
dnsNames:
|
||||||
|
- "navi.skrd.fun"
|
||||||
|
issuerRef:
|
||||||
|
name: letsencrypt-prod
|
||||||
|
kind: ClusterIssuer
|
||||||
|
---
|
||||||
|
apiVersion: cert-manager.io/v1
|
||||||
|
kind: Certificate
|
||||||
|
metadata:
|
||||||
|
name: npm-certificate
|
||||||
|
namespace: external-services
|
||||||
|
spec:
|
||||||
|
secretName: npm-skrd-fun-tls
|
||||||
|
dnsNames:
|
||||||
|
- "npm.skrd.fun"
|
||||||
|
issuerRef:
|
||||||
|
name: letsencrypt-prod
|
||||||
|
kind: ClusterIssuer
|
||||||
|
---
|
||||||
|
apiVersion: cert-manager.io/v1
|
||||||
|
kind: Certificate
|
||||||
|
metadata:
|
||||||
|
name: omv-certificate
|
||||||
|
namespace: external-services
|
||||||
|
spec:
|
||||||
|
secretName: omv-skrd-fun-tls
|
||||||
|
dnsNames:
|
||||||
|
- "omv.skrd.fun"
|
||||||
|
issuerRef:
|
||||||
|
name: letsencrypt-prod
|
||||||
|
kind: ClusterIssuer
|
||||||
|
---
|
||||||
|
apiVersion: cert-manager.io/v1
|
||||||
|
kind: Certificate
|
||||||
|
metadata:
|
||||||
|
name: photos-certificate
|
||||||
|
namespace: external-services
|
||||||
|
spec:
|
||||||
|
secretName: photos-skrd-fun-tls
|
||||||
|
dnsNames:
|
||||||
|
- "photos.skrd.fun"
|
||||||
|
issuerRef:
|
||||||
|
name: letsencrypt-prod
|
||||||
|
kind: ClusterIssuer
|
||||||
|
---
|
||||||
|
apiVersion: cert-manager.io/v1
|
||||||
|
kind: Certificate
|
||||||
|
metadata:
|
||||||
|
name: pihole-certificate
|
||||||
|
namespace: external-services
|
||||||
|
spec:
|
||||||
|
secretName: pihole-skrd-fun-tls
|
||||||
|
dnsNames:
|
||||||
|
- "pihole.skrd.fun"
|
||||||
|
issuerRef:
|
||||||
|
name: letsencrypt-prod
|
||||||
|
kind: ClusterIssuer
|
||||||
|
---
|
||||||
|
apiVersion: cert-manager.io/v1
|
||||||
|
kind: Certificate
|
||||||
|
metadata:
|
||||||
|
name: portainer-certificate
|
||||||
|
namespace: external-services
|
||||||
|
spec:
|
||||||
|
secretName: portainer-skrd-fun-tls
|
||||||
|
dnsNames:
|
||||||
|
- "portainer.skrd.fun"
|
||||||
|
issuerRef:
|
||||||
|
name: letsencrypt-prod
|
||||||
|
kind: ClusterIssuer
|
||||||
|
---
|
||||||
|
apiVersion: cert-manager.io/v1
|
||||||
|
kind: Certificate
|
||||||
|
metadata:
|
||||||
|
name: radarr-certificate
|
||||||
|
namespace: external-services
|
||||||
|
spec:
|
||||||
|
secretName: radarr-skrd-fun-tls
|
||||||
|
dnsNames:
|
||||||
|
- "radarr.skrd.fun"
|
||||||
|
issuerRef:
|
||||||
|
name: letsencrypt-prod
|
||||||
|
kind: ClusterIssuer
|
||||||
|
---
|
||||||
|
apiVersion: cert-manager.io/v1
|
||||||
|
kind: Certificate
|
||||||
|
metadata:
|
||||||
|
name: sonarr-certificate
|
||||||
|
namespace: external-services
|
||||||
|
spec:
|
||||||
|
secretName: sonarr-skrd-fun-tls
|
||||||
|
dnsNames:
|
||||||
|
- "sonarr.skrd.fun"
|
||||||
|
issuerRef:
|
||||||
|
name: letsencrypt-prod
|
||||||
|
kind: ClusterIssuer
|
||||||
|
---
|
||||||
|
apiVersion: cert-manager.io/v1
|
||||||
|
kind: Certificate
|
||||||
|
metadata:
|
||||||
|
name: torrent-certificate
|
||||||
|
namespace: external-services
|
||||||
|
spec:
|
||||||
|
secretName: torrent-skrd-fun-tls
|
||||||
|
dnsNames:
|
||||||
|
- "torrent.skrd.fun"
|
||||||
|
issuerRef:
|
||||||
|
name: letsencrypt-prod
|
||||||
|
kind: ClusterIssuer
|
||||||
|
---
|
||||||
|
apiVersion: cert-manager.io/v1
|
||||||
|
kind: Certificate
|
||||||
|
metadata:
|
||||||
|
name: notes-certificate
|
||||||
|
namespace: external-services
|
||||||
|
spec:
|
||||||
|
secretName: notes-skrd-fun-tls
|
||||||
|
dnsNames:
|
||||||
|
- "notes.skrd.fun"
|
||||||
|
issuerRef:
|
||||||
|
name: letsencrypt-prod
|
||||||
|
kind: ClusterIssuer
|
||||||
|
---
|
||||||
4
manifest/06-external-ingress/namespace.yml
Normal file
4
manifest/06-external-ingress/namespace.yml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Namespace
|
||||||
|
metadata:
|
||||||
|
name: external-services
|
||||||
33
manifest/06-external-ingress/sites/firefly.yml
Normal file
33
manifest/06-external-ingress/sites/firefly.yml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
kind: Service
|
||||||
|
apiVersion: v1
|
||||||
|
metadata:
|
||||||
|
name: firefly
|
||||||
|
namespace: external-services
|
||||||
|
spec:
|
||||||
|
type: ExternalName
|
||||||
|
ports:
|
||||||
|
- port: 8080
|
||||||
|
externalName: 192.168.103.15
|
||||||
|
---
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: firefly-ingress
|
||||||
|
namespace: external-services
|
||||||
|
annotations:
|
||||||
|
traefik.ingress.kubernetes.io/router.middlewares: default-redirect-https@kubernetescrd
|
||||||
|
spec:
|
||||||
|
ingressClassName: traefik
|
||||||
|
rules:
|
||||||
|
- host: firefly.skrd.fun
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: firefly
|
||||||
|
port:
|
||||||
|
number: 8080
|
||||||
|
tls:
|
||||||
|
- secretName: firefly-skrd-fun-tls
|
||||||
33
manifest/06-external-ingress/sites/gametabs.yml
Normal file
33
manifest/06-external-ingress/sites/gametabs.yml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
kind: Service
|
||||||
|
apiVersion: v1
|
||||||
|
metadata:
|
||||||
|
name: gametabs
|
||||||
|
namespace: external-services
|
||||||
|
spec:
|
||||||
|
type: ExternalName
|
||||||
|
ports:
|
||||||
|
- port: 80
|
||||||
|
externalName: 192.168.103.6
|
||||||
|
---
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: gametabs-ingress
|
||||||
|
namespace: external-services
|
||||||
|
annotations:
|
||||||
|
traefik.ingress.kubernetes.io/router.middlewares: default-redirect-https@kubernetescrd
|
||||||
|
spec:
|
||||||
|
ingressClassName: traefik
|
||||||
|
rules:
|
||||||
|
- host: gametabs.skrd.fun
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: gametabs
|
||||||
|
port:
|
||||||
|
number: 80
|
||||||
|
tls:
|
||||||
|
- secretName: gametabs-skrd-fun-tls
|
||||||
33
manifest/06-external-ingress/sites/git.yml
Normal file
33
manifest/06-external-ingress/sites/git.yml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
kind: Service
|
||||||
|
apiVersion: v1
|
||||||
|
metadata:
|
||||||
|
name: git
|
||||||
|
namespace: external-services
|
||||||
|
spec:
|
||||||
|
type: ExternalName
|
||||||
|
ports:
|
||||||
|
- port: 80
|
||||||
|
externalName: 192.168.103.3
|
||||||
|
---
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: git-ingress
|
||||||
|
namespace: external-services
|
||||||
|
annotations:
|
||||||
|
traefik.ingress.kubernetes.io/router.middlewares: default-redirect-https@kubernetescrd
|
||||||
|
spec:
|
||||||
|
ingressClassName: traefik
|
||||||
|
rules:
|
||||||
|
- host: git.skrd.fun
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: git
|
||||||
|
port:
|
||||||
|
number: 80
|
||||||
|
tls:
|
||||||
|
- secretName: git-skrd-fun-tls
|
||||||
33
manifest/06-external-ingress/sites/hedgedoc.yml
Normal file
33
manifest/06-external-ingress/sites/hedgedoc.yml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
kind: Service
|
||||||
|
apiVersion: v1
|
||||||
|
metadata:
|
||||||
|
name: hedgedoc
|
||||||
|
namespace: external-services
|
||||||
|
spec:
|
||||||
|
type: ExternalName
|
||||||
|
ports:
|
||||||
|
- port: 3000
|
||||||
|
externalName: 192.168.103.19
|
||||||
|
---
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: hedgedoc-ingress
|
||||||
|
namespace: external-services
|
||||||
|
annotations:
|
||||||
|
traefik.ingress.kubernetes.io/router.middlewares: default-redirect-https@kubernetescrd
|
||||||
|
spec:
|
||||||
|
ingressClassName: traefik
|
||||||
|
rules:
|
||||||
|
- host: notes.skrd.fun
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: hedgedoc
|
||||||
|
port:
|
||||||
|
number: 3000
|
||||||
|
tls:
|
||||||
|
- secretName: notes-skrd-fun-tls
|
||||||
33
manifest/06-external-ingress/sites/home-assistant.yml
Normal file
33
manifest/06-external-ingress/sites/home-assistant.yml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
kind: Service
|
||||||
|
apiVersion: v1
|
||||||
|
metadata:
|
||||||
|
name: haos
|
||||||
|
namespace: external-services
|
||||||
|
spec:
|
||||||
|
type: ExternalName
|
||||||
|
ports:
|
||||||
|
- port: 8123
|
||||||
|
externalName: 192.168.3.6
|
||||||
|
---
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: haos-ingress
|
||||||
|
namespace: external-services
|
||||||
|
annotations:
|
||||||
|
traefik.ingress.kubernetes.io/router.middlewares: default-redirect-https@kubernetescrd
|
||||||
|
spec:
|
||||||
|
ingressClassName: traefik
|
||||||
|
rules:
|
||||||
|
- host: haos.skrd.fun
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: haos
|
||||||
|
port:
|
||||||
|
number: 8123
|
||||||
|
tls:
|
||||||
|
- secretName: haos-skrd-fun-tls
|
||||||
33
manifest/06-external-ingress/sites/jackett.yml
Normal file
33
manifest/06-external-ingress/sites/jackett.yml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
kind: Service
|
||||||
|
apiVersion: v1
|
||||||
|
metadata:
|
||||||
|
name: jackett
|
||||||
|
namespace: external-services
|
||||||
|
spec:
|
||||||
|
type: ExternalName
|
||||||
|
ports:
|
||||||
|
- port: 9117
|
||||||
|
externalName: 192.168.103.18
|
||||||
|
---
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: jackett-ingress
|
||||||
|
namespace: external-services
|
||||||
|
annotations:
|
||||||
|
traefik.ingress.kubernetes.io/router.middlewares: default-redirect-https@kubernetescrd
|
||||||
|
spec:
|
||||||
|
ingressClassName: traefik
|
||||||
|
rules:
|
||||||
|
- host: jackett.skrd.fun
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: jackett
|
||||||
|
port:
|
||||||
|
number: 9117
|
||||||
|
tls:
|
||||||
|
- secretName: jackett-skrd-fun-tls
|
||||||
33
manifest/06-external-ingress/sites/jelly.yml
Normal file
33
manifest/06-external-ingress/sites/jelly.yml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
kind: Service
|
||||||
|
apiVersion: v1
|
||||||
|
metadata:
|
||||||
|
name: jelly
|
||||||
|
namespace: external-services
|
||||||
|
spec:
|
||||||
|
type: ExternalName
|
||||||
|
ports:
|
||||||
|
- port: 8096
|
||||||
|
externalName: 192.168.103.11
|
||||||
|
---
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: jelly-ingress
|
||||||
|
namespace: external-services
|
||||||
|
annotations:
|
||||||
|
traefik.ingress.kubernetes.io/router.middlewares: default-redirect-https@kubernetescrd
|
||||||
|
spec:
|
||||||
|
ingressClassName: traefik
|
||||||
|
rules:
|
||||||
|
- host: jelly.skrd.fun
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: jelly
|
||||||
|
port:
|
||||||
|
number: 8096
|
||||||
|
tls:
|
||||||
|
- secretName: jelly-skrd-fun-tls
|
||||||
33
manifest/06-external-ingress/sites/navi.yml
Normal file
33
manifest/06-external-ingress/sites/navi.yml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
kind: Service
|
||||||
|
apiVersion: v1
|
||||||
|
metadata:
|
||||||
|
name: navi
|
||||||
|
namespace: external-services
|
||||||
|
spec:
|
||||||
|
type: ExternalName
|
||||||
|
ports:
|
||||||
|
- port: 4533
|
||||||
|
externalName: 192.168.103.10
|
||||||
|
---
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: navi-ingress
|
||||||
|
namespace: external-services
|
||||||
|
annotations:
|
||||||
|
traefik.ingress.kubernetes.io/router.middlewares: default-redirect-https@kubernetescrd
|
||||||
|
spec:
|
||||||
|
ingressClassName: traefik
|
||||||
|
rules:
|
||||||
|
- host: navi.skrd.fun
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: navi
|
||||||
|
port:
|
||||||
|
number: 4533
|
||||||
|
tls:
|
||||||
|
- secretName: navi-skrd-fun-tls
|
||||||
33
manifest/06-external-ingress/sites/npm.yml
Normal file
33
manifest/06-external-ingress/sites/npm.yml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
kind: Service
|
||||||
|
apiVersion: v1
|
||||||
|
metadata:
|
||||||
|
name: npm
|
||||||
|
namespace: external-services
|
||||||
|
spec:
|
||||||
|
type: ExternalName
|
||||||
|
ports:
|
||||||
|
- port: 81
|
||||||
|
externalName: 192.168.103.2
|
||||||
|
---
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: npm-ingress
|
||||||
|
namespace: external-services
|
||||||
|
annotations:
|
||||||
|
traefik.ingress.kubernetes.io/router.middlewares: default-redirect-https@kubernetescrd
|
||||||
|
spec:
|
||||||
|
ingressClassName: traefik
|
||||||
|
rules:
|
||||||
|
- host: npm.skrd.fun
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: npm
|
||||||
|
port:
|
||||||
|
number: 81
|
||||||
|
tls:
|
||||||
|
- secretName: npm-skrd-fun-tls
|
||||||
33
manifest/06-external-ingress/sites/omv.yml
Normal file
33
manifest/06-external-ingress/sites/omv.yml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
kind: Service
|
||||||
|
apiVersion: v1
|
||||||
|
metadata:
|
||||||
|
name: omv
|
||||||
|
namespace: external-services
|
||||||
|
spec:
|
||||||
|
type: ExternalName
|
||||||
|
ports:
|
||||||
|
- port: 3000
|
||||||
|
externalName: 192.168.102.1
|
||||||
|
---
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: omv-ingress
|
||||||
|
namespace: external-services
|
||||||
|
annotations:
|
||||||
|
traefik.ingress.kubernetes.io/router.middlewares: default-redirect-https@kubernetescrd
|
||||||
|
spec:
|
||||||
|
ingressClassName: traefik
|
||||||
|
rules:
|
||||||
|
- host: omv.skrd.fun
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: omv
|
||||||
|
port:
|
||||||
|
number: 3000
|
||||||
|
tls:
|
||||||
|
- secretName: omv-skrd-fun-tls
|
||||||
33
manifest/06-external-ingress/sites/photos.yml
Normal file
33
manifest/06-external-ingress/sites/photos.yml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
kind: Service
|
||||||
|
apiVersion: v1
|
||||||
|
metadata:
|
||||||
|
name: photos
|
||||||
|
namespace: external-services
|
||||||
|
spec:
|
||||||
|
type: ExternalName
|
||||||
|
ports:
|
||||||
|
- port: 2283
|
||||||
|
externalName: 192.168.103.12
|
||||||
|
---
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: photos-ingress
|
||||||
|
namespace: external-services
|
||||||
|
annotations:
|
||||||
|
traefik.ingress.kubernetes.io/router.middlewares: default-redirect-https@kubernetescrd
|
||||||
|
spec:
|
||||||
|
ingressClassName: traefik
|
||||||
|
rules:
|
||||||
|
- host: photos.skrd.fun
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: photos
|
||||||
|
port:
|
||||||
|
number: 2283
|
||||||
|
tls:
|
||||||
|
- secretName: photos-skrd-fun-tls
|
||||||
43
manifest/06-external-ingress/sites/pihole.yml
Normal file
43
manifest/06-external-ingress/sites/pihole.yml
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
kind: Service
|
||||||
|
apiVersion: v1
|
||||||
|
metadata:
|
||||||
|
name: pihole
|
||||||
|
namespace: external-services
|
||||||
|
spec:
|
||||||
|
type: ExternalName
|
||||||
|
ports:
|
||||||
|
- port: 80
|
||||||
|
externalName: 192.168.3.5
|
||||||
|
---
|
||||||
|
apiVersion: traefik.containo.us/v1alpha1
|
||||||
|
kind: Middleware
|
||||||
|
metadata:
|
||||||
|
name: pihole-rewrite
|
||||||
|
namespace: external-services
|
||||||
|
spec:
|
||||||
|
replacePathRegex:
|
||||||
|
regex: ^/$
|
||||||
|
replacement: /admin/
|
||||||
|
---
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: pihole-ingress
|
||||||
|
namespace: external-services
|
||||||
|
annotations:
|
||||||
|
traefik.ingress.kubernetes.io/router.middlewares: default-allow-local-only@kubernetescrd, default-redirect-https@kubernetescrd, external-services-pihole-rewrite@kubernetescrd
|
||||||
|
spec:
|
||||||
|
ingressClassName: traefik
|
||||||
|
rules:
|
||||||
|
- host: pihole.skrd.fun
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: pihole
|
||||||
|
port:
|
||||||
|
number: 80
|
||||||
|
tls:
|
||||||
|
- secretName: pihole-skrd-fun-tls
|
||||||
33
manifest/06-external-ingress/sites/portainer.yml
Normal file
33
manifest/06-external-ingress/sites/portainer.yml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
kind: Service
|
||||||
|
apiVersion: v1
|
||||||
|
metadata:
|
||||||
|
name: portainer
|
||||||
|
namespace: external-services
|
||||||
|
spec:
|
||||||
|
type: ExternalName
|
||||||
|
ports:
|
||||||
|
- port: 9000
|
||||||
|
externalName: 192.168.102.1
|
||||||
|
---
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: portainer-ingress
|
||||||
|
namespace: external-services
|
||||||
|
annotations:
|
||||||
|
traefik.ingress.kubernetes.io/router.middlewares: default-allow-local-only@kubernetescrd, default-redirect-https@kubernetescrd
|
||||||
|
spec:
|
||||||
|
ingressClassName: traefik
|
||||||
|
rules:
|
||||||
|
- host: portainer.skrd.fun
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: portainer
|
||||||
|
port:
|
||||||
|
number: 9000
|
||||||
|
tls:
|
||||||
|
- secretName: portainer-skrd-fun-tls
|
||||||
33
manifest/06-external-ingress/sites/radarr.yml
Normal file
33
manifest/06-external-ingress/sites/radarr.yml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
kind: Service
|
||||||
|
apiVersion: v1
|
||||||
|
metadata:
|
||||||
|
name: radarr
|
||||||
|
namespace: external-services
|
||||||
|
spec:
|
||||||
|
type: ExternalName
|
||||||
|
ports:
|
||||||
|
- port: 7878
|
||||||
|
externalName: 192.168.103.17
|
||||||
|
---
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: radarr-ingress
|
||||||
|
namespace: external-services
|
||||||
|
annotations:
|
||||||
|
traefik.ingress.kubernetes.io/router.middlewares: default-redirect-https@kubernetescrd
|
||||||
|
spec:
|
||||||
|
ingressClassName: traefik
|
||||||
|
rules:
|
||||||
|
- host: radarr.skrd.fun
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: radarr
|
||||||
|
port:
|
||||||
|
number: 7878
|
||||||
|
tls:
|
||||||
|
- secretName: radarr-skrd-fun-tls
|
||||||
33
manifest/06-external-ingress/sites/sonarr.yml
Normal file
33
manifest/06-external-ingress/sites/sonarr.yml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
kind: Service
|
||||||
|
apiVersion: v1
|
||||||
|
metadata:
|
||||||
|
name: sonarr
|
||||||
|
namespace: external-services
|
||||||
|
spec:
|
||||||
|
type: ExternalName
|
||||||
|
ports:
|
||||||
|
- port: 8989
|
||||||
|
externalName: 192.168.103.16
|
||||||
|
---
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: sonarr-ingress
|
||||||
|
namespace: external-services
|
||||||
|
annotations:
|
||||||
|
traefik.ingress.kubernetes.io/router.middlewares: default-redirect-https@kubernetescrd
|
||||||
|
spec:
|
||||||
|
ingressClassName: traefik
|
||||||
|
rules:
|
||||||
|
- host: sonarr.skrd.fun
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: sonarr
|
||||||
|
port:
|
||||||
|
number: 8989
|
||||||
|
tls:
|
||||||
|
- secretName: sonarr-skrd-fun-tls
|
||||||
33
manifest/06-external-ingress/sites/torrent.yml
Normal file
33
manifest/06-external-ingress/sites/torrent.yml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
kind: Service
|
||||||
|
apiVersion: v1
|
||||||
|
metadata:
|
||||||
|
name: torrent
|
||||||
|
namespace: external-services
|
||||||
|
spec:
|
||||||
|
type: ExternalName
|
||||||
|
ports:
|
||||||
|
- port: 80
|
||||||
|
externalName: 192.168.103.4
|
||||||
|
---
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: torrent-ingress
|
||||||
|
namespace: external-services
|
||||||
|
annotations:
|
||||||
|
traefik.ingress.kubernetes.io/router.middlewares: default-redirect-https@kubernetescrd
|
||||||
|
spec:
|
||||||
|
ingressClassName: traefik
|
||||||
|
rules:
|
||||||
|
- host: torrent.skrd.fun
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: torrent
|
||||||
|
port:
|
||||||
|
number: 80
|
||||||
|
tls:
|
||||||
|
- secretName: torrent-skrd-fun-tls
|
||||||
1
manifest/07-ddns/.gitignore
vendored
Normal file
1
manifest/07-ddns/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
secret.yml
|
||||||
44
manifest/07-ddns/ddns.yml
Normal file
44
manifest/07-ddns/ddns.yml
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: ddns
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: ddns
|
||||||
|
replicas: 1
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: ddns
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: ddns
|
||||||
|
image: favonia/cloudflare-ddns:latest
|
||||||
|
env:
|
||||||
|
- name: PUID
|
||||||
|
value: "1000"
|
||||||
|
- name: PGID
|
||||||
|
value: "1000"
|
||||||
|
- name: IP6_PROVIDER
|
||||||
|
value: "none"
|
||||||
|
- name: CF_API_TOKEN
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: ddns-secret
|
||||||
|
key: api_token
|
||||||
|
- name: DOMAINS
|
||||||
|
value: "local.skrd.fun,direct.skrd.fun"
|
||||||
|
- name: PROXIED
|
||||||
|
value: "false"
|
||||||
|
securityContext:
|
||||||
|
capabilities:
|
||||||
|
drop: ["ALL"]
|
||||||
|
add: ["SETUID", "SETGID"]
|
||||||
|
readOnlyRootFilesystem: true
|
||||||
|
allowPrivilegeEscalation: false
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
memory: '128Mi'
|
||||||
|
cpu: '10m'
|
||||||
|
|
||||||
7
manifest/07-ddns/secret.yml.example
Normal file
7
manifest/07-ddns/secret.yml.example
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: ddns-secret
|
||||||
|
type: Opaque
|
||||||
|
stringData:
|
||||||
|
api_token: EXAMPLE
|
||||||
50
manifest/99-hello-world/hello-world.yml
Normal file
50
manifest/99-hello-world/hello-world.yml
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: hello-world
|
||||||
|
spec:
|
||||||
|
ingressClassName: traefik
|
||||||
|
rules:
|
||||||
|
- http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: hello-world
|
||||||
|
port:
|
||||||
|
number: 80
|
||||||
|
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: hello-world
|
||||||
|
spec:
|
||||||
|
ports:
|
||||||
|
- port: 80
|
||||||
|
protocol: TCP
|
||||||
|
selector:
|
||||||
|
app: hello-world
|
||||||
|
|
||||||
|
---
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: hello-world
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: hello-world
|
||||||
|
replicas: 10
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: hello-world
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: nginx
|
||||||
|
image: nginx
|
||||||
|
ports:
|
||||||
|
- containerPort: 80
|
||||||
48
manifest/99-whoami/whoami.yml
Normal file
48
manifest/99-whoami/whoami.yml
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
---
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: whoami
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: whoami
|
||||||
|
replicas: 10
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: whoami
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: nginx
|
||||||
|
image: containous/whoami
|
||||||
|
ports:
|
||||||
|
- containerPort: 80
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: whoami
|
||||||
|
spec:
|
||||||
|
ports:
|
||||||
|
- port: 80
|
||||||
|
protocol: TCP
|
||||||
|
selector:
|
||||||
|
app: whoami
|
||||||
|
---
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: whoami
|
||||||
|
spec:
|
||||||
|
ingressClassName: traefik
|
||||||
|
rules:
|
||||||
|
- http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: whoami
|
||||||
|
port:
|
||||||
|
number: 80
|
||||||
2
stacks/.gitignore
vendored
Normal file
2
stacks/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
*.env
|
||||||
|
!*.env.example
|
||||||
13
stacks/actual.yml
Normal file
13
stacks/actual.yml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
services:
|
||||||
|
actual_server:
|
||||||
|
image: docker.io/actualbudget/actual-server:latest
|
||||||
|
networks:
|
||||||
|
macvlan_192_168_3_0:
|
||||||
|
ipv4_address: 192.168.3.13
|
||||||
|
volumes:
|
||||||
|
- /srv/dev-disk-by-uuid-1582b800-1f82-407a-a3aa-3460b3390127/docker/actual:/data
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
networks:
|
||||||
|
macvlan_192_168_3_0:
|
||||||
|
external: true
|
||||||
15
stacks/adguard.yml
Normal file
15
stacks/adguard.yml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
version: "3"
|
||||||
|
services:
|
||||||
|
adguard:
|
||||||
|
image: adguard/adguardhome
|
||||||
|
restart: unless-stopped
|
||||||
|
volumes:
|
||||||
|
- /srv/dev-disk-by-uuid-1582b800-1f82-407a-a3aa-3460b3390127/docker/adguard/data:/opt/adguardhome/work
|
||||||
|
- /srv/dev-disk-by-uuid-1582b800-1f82-407a-a3aa-3460b3390127/docker/adguard/config:/opt/adguardhome/conf
|
||||||
|
networks:
|
||||||
|
macvlan_192_168_3_0:
|
||||||
|
ipv4_address: 192.168.3.1
|
||||||
|
|
||||||
|
networks:
|
||||||
|
macvlan_192_168_3_0:
|
||||||
|
external: true
|
||||||
6
stacks/ddns.env.example
Normal file
6
stacks/ddns.env.example
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
PUID=1000
|
||||||
|
PGID=1000
|
||||||
|
IP6_PROVIDER=none
|
||||||
|
CF_API_TOKEN=EXAMPLE
|
||||||
|
DOMAINS=local.skrd.fun,direct.skrd.fun
|
||||||
|
PROXIED=false
|
||||||
14
stacks/ddns.yml
Normal file
14
stacks/ddns.yml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
version: "3"
|
||||||
|
services:
|
||||||
|
cloudflare-ddns:
|
||||||
|
image: favonia/cloudflare-ddns:latest
|
||||||
|
restart: always
|
||||||
|
cap_add:
|
||||||
|
- SETUID
|
||||||
|
- SETGID
|
||||||
|
cap_drop:
|
||||||
|
- all
|
||||||
|
read_only: true
|
||||||
|
security_opt:
|
||||||
|
- no-new-privileges:true
|
||||||
|
env_file: stack.env
|
||||||
6
stacks/feed-the-beast.env.example
Normal file
6
stacks/feed-the-beast.env.example
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
TYPE="AUTO_CURSEFORGE"
|
||||||
|
CF_API_KEY="SECRET"
|
||||||
|
CF_PAGE_URL="https://www.curseforge.com/minecraft/modpacks/create-astral"
|
||||||
|
MEMORY="10G"
|
||||||
|
EULA="TRUE"
|
||||||
|
ONLINE_MODE="TRUE"
|
||||||
18
stacks/feed-the-beast.yml
Normal file
18
stacks/feed-the-beast.yml
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
version: "3"
|
||||||
|
|
||||||
|
services:
|
||||||
|
feed_the_beast:
|
||||||
|
image: itzg/minecraft-server
|
||||||
|
tty: true
|
||||||
|
stdin_open: true
|
||||||
|
restart: unless-stopped
|
||||||
|
env_file: stack.env
|
||||||
|
volumes:
|
||||||
|
- /srv/dev-disk-by-uuid-1582b800-1f82-407a-a3aa-3460b3390127/docker/feed-the-beast/data:/data
|
||||||
|
networks:
|
||||||
|
macvlan_192_168_3_0:
|
||||||
|
ipv4_address: 192.168.3.5
|
||||||
|
|
||||||
|
networks:
|
||||||
|
macvlan_192_168_3_0:
|
||||||
|
external: true
|
||||||
43
stacks/fireflyiii.yml
Normal file
43
stacks/fireflyiii.yml
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
services:
|
||||||
|
app:
|
||||||
|
image: fireflyiii/core:latest
|
||||||
|
restart: unless-stopped
|
||||||
|
volumes:
|
||||||
|
- /srv/dev-disk-by-uuid-1582b800-1f82-407a-a3aa-3460b3390127/docker/firefly_iii/upload:/var/www/html/storage/upload
|
||||||
|
env_file: stack.env
|
||||||
|
networks:
|
||||||
|
firefly_iii:
|
||||||
|
macvlan_192_168_3_0:
|
||||||
|
ipv4_address: 192.168.3.15
|
||||||
|
depends_on:
|
||||||
|
- db
|
||||||
|
db:
|
||||||
|
image: mariadb:lts
|
||||||
|
restart: unless-stopped
|
||||||
|
env_file: stack.env
|
||||||
|
networks:
|
||||||
|
- firefly_iii
|
||||||
|
volumes:
|
||||||
|
- /srv/dev-disk-by-uuid-1582b800-1f82-407a-a3aa-3460b3390127/docker/firefly_iii/db:/var/lib/mysql
|
||||||
|
cron:
|
||||||
|
#
|
||||||
|
# To make this work, set STATIC_CRON_TOKEN in your .env file or as an environment variable and replace REPLACEME below
|
||||||
|
# The STATIC_CRON_TOKEN must be *exactly* 32 characters long
|
||||||
|
#
|
||||||
|
image: alpine
|
||||||
|
restart: unless-stopped
|
||||||
|
env_file: stack.env
|
||||||
|
command: sh -c "
|
||||||
|
apk add tzdata
|
||||||
|
&& ln -s /usr/share/zoneinfo/${TZ} /etc/localtime
|
||||||
|
| echo \"0 3 * * * wget -qO- http://app:8080/api/v1/cron/REPLACEME;echo\"
|
||||||
|
| crontab -
|
||||||
|
&& crond -f -L /dev/stdout"
|
||||||
|
networks:
|
||||||
|
- firefly_iii
|
||||||
|
|
||||||
|
networks:
|
||||||
|
firefly_iii:
|
||||||
|
macvlan_192_168_3_0:
|
||||||
|
external: true
|
||||||
|
|
||||||
14
stacks/gametabs.yml
Normal file
14
stacks/gametabs.yml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
version: "3"
|
||||||
|
|
||||||
|
services:
|
||||||
|
gametabs:
|
||||||
|
image: nginx
|
||||||
|
restart: unless-stopped
|
||||||
|
volumes:
|
||||||
|
- /srv/dev-disk-by-uuid-1582b800-1f82-407a-a3aa-3460b3390127/docker/gametabs:/usr/share/nginx/html
|
||||||
|
networks:
|
||||||
|
macvlan_192_168_3_0:
|
||||||
|
ipv4_address: 192.168.3.6
|
||||||
|
networks:
|
||||||
|
macvlan_192_168_3_0:
|
||||||
|
external: true
|
||||||
8
stacks/gitea.env.example
Normal file
8
stacks/gitea.env.example
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
CONFIG_FILE=/config/config.yaml
|
||||||
|
GITEA_INSTANCE_URL="https://git.skrd.fun"
|
||||||
|
GITEA_RUNNER_REGISTRATION_TOKEN="SECRET"
|
||||||
|
GITEA_RUNNER_NAME="gitea-runner-1"
|
||||||
|
|
||||||
|
POSTGRES_PASSWORD="SECRET"
|
||||||
|
POSTGRES_DB="gitea"
|
||||||
|
POSTGRES_USER="gitea"
|
||||||
46
stacks/gitea.yml
Normal file
46
stacks/gitea.yml
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
version: "3"
|
||||||
|
services:
|
||||||
|
gitea:
|
||||||
|
image: gitea/gitea:latest
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
- USER_UID=1000
|
||||||
|
- USER_GID=1000
|
||||||
|
networks:
|
||||||
|
gitea_network:
|
||||||
|
macvlan_192_168_3_0:
|
||||||
|
ipv4_address: 192.168.3.3
|
||||||
|
volumes:
|
||||||
|
- /srv/dev-disk-by-uuid-1582b800-1f82-407a-a3aa-3460b3390127/docker/gitea/data:/data
|
||||||
|
- /etc/timezone:/etc/timezone:ro
|
||||||
|
- /etc/localtime:/etc/localtime:ro
|
||||||
|
depends_on:
|
||||||
|
- gitea-db
|
||||||
|
|
||||||
|
runner:
|
||||||
|
image: gitea/act_runner:latest
|
||||||
|
restart: unless-stopped
|
||||||
|
env_file: stack.env
|
||||||
|
networks:
|
||||||
|
- gitea_network
|
||||||
|
volumes:
|
||||||
|
- /srv/dev-disk-by-uuid-1582b800-1f82-407a-a3aa-3460b3390127/docker/gitea/runner/config:/config
|
||||||
|
- /srv/dev-disk-by-uuid-1582b800-1f82-407a-a3aa-3460b3390127/docker/gitea/runner/data:/data
|
||||||
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
|
depends_on:
|
||||||
|
- gitea
|
||||||
|
|
||||||
|
gitea-db:
|
||||||
|
image: postgres:16
|
||||||
|
restart: unless-stopped
|
||||||
|
volumes:
|
||||||
|
- /srv/dev-disk-by-uuid-1582b800-1f82-407a-a3aa-3460b3390127/docker/gitea/db:/var/lib/postgresql/data
|
||||||
|
networks:
|
||||||
|
- gitea_network
|
||||||
|
env_file: stack.env
|
||||||
|
|
||||||
|
networks:
|
||||||
|
gitea_network:
|
||||||
|
macvlan_192_168_3_0:
|
||||||
|
external: true
|
||||||
|
|
||||||
8
stacks/immich.env.example
Normal file
8
stacks/immich.env.example
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
DB_PASSWORD=SECRET
|
||||||
|
DB_USERNAME=postgres
|
||||||
|
DB_DATABASE_NAME=immich
|
||||||
|
|
||||||
|
POSTGRES_PASSWORD=SECRET
|
||||||
|
POSTGRES_USER=postgres
|
||||||
|
POSTGRES_DB=immich
|
||||||
|
POSTGRES_INITDB_ARGS="--data-checksums"
|
||||||
51
stacks/immich.yml
Normal file
51
stacks/immich.yml
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
services:
|
||||||
|
immich-server:
|
||||||
|
image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
|
||||||
|
restart: unless-stopped
|
||||||
|
volumes:
|
||||||
|
- /srv/dev-disk-by-uuid-1582b800-1f82-407a-a3aa-3460b3390127/docker/immich/upload:/usr/src/app/upload
|
||||||
|
- /etc/localtime:/etc/localtime:ro
|
||||||
|
networks:
|
||||||
|
immich_network:
|
||||||
|
macvlan_192_168_3_0:
|
||||||
|
ipv4_address: 192.168.3.12
|
||||||
|
env_file: stack.env
|
||||||
|
depends_on:
|
||||||
|
- redis
|
||||||
|
- database
|
||||||
|
|
||||||
|
immich-machine-learning:
|
||||||
|
image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
immich_network:
|
||||||
|
volumes:
|
||||||
|
- /srv/dev-disk-by-uuid-1582b800-1f82-407a-a3aa-3460b3390127/docker/immich/model-cache:/cache
|
||||||
|
|
||||||
|
redis:
|
||||||
|
image: docker.io/redis:6.2-alpine@sha256:328fe6a5822256d065debb36617a8169dbfbd77b797c525288e465f56c1d392b
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
immich_network:
|
||||||
|
healthcheck:
|
||||||
|
test: redis-cli ping || exit 1
|
||||||
|
|
||||||
|
database:
|
||||||
|
image: docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
immich_network:
|
||||||
|
env_file: stack.env
|
||||||
|
volumes:
|
||||||
|
- /srv/dev-disk-by-uuid-1582b800-1f82-407a-a3aa-3460b3390127/docker/immich/postgres:/var/lib/postgresql/data
|
||||||
|
healthcheck:
|
||||||
|
test: pg_isready --dbname='immich' --username='postgres' || exit 1; Chksum="$$(psql --dbname='immich' --username='postgres' --tuples-only --no-align --command='SELECT COALESCE(SUM(checksum_failures), 0) FROM pg_stat_database')"; echo "checksum failure count is $$Chksum"; [ "$$Chksum" = '0' ] || exit 1
|
||||||
|
interval: 5m
|
||||||
|
start_interval: 30s
|
||||||
|
start_period: 5m
|
||||||
|
command: ["postgres", "-c" ,"shared_preload_libraries=vectors.so", "-c", 'search_path="$$user", public, vectors', "-c", "logging_collector=on", "-c", "max_wal_size=2GB", "-c", "shared_buffers=512MB", "-c", "wal_compression=on"]
|
||||||
|
|
||||||
|
networks:
|
||||||
|
immich_network:
|
||||||
|
macvlan_192_168_3_0:
|
||||||
|
external: true
|
||||||
21
stacks/jellyfin.yml
Normal file
21
stacks/jellyfin.yml
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
version: '3.5'
|
||||||
|
services:
|
||||||
|
jellyfin:
|
||||||
|
image: jellyfin/jellyfin
|
||||||
|
restart: 'unless-stopped'
|
||||||
|
user: 1000:1000
|
||||||
|
volumes:
|
||||||
|
- /srv/dev-disk-by-uuid-1582b800-1f82-407a-a3aa-3460b3390127/docker/jellyfin/config:/config
|
||||||
|
- /srv/dev-disk-by-uuid-1582b800-1f82-407a-a3aa-3460b3390127/docker/jellyfin/cache:/cache
|
||||||
|
- /srv/dev-disk-by-uuid-5392509c-5ccd-4d8f-8719-60064c4404d6/anime:/data/anime
|
||||||
|
- /srv/dev-disk-by-uuid-c7a96ee1-c08e-48b1-8afa-79c75380d142/movies:/data/movies
|
||||||
|
- /srv/dev-disk-by-uuid-c7a96ee1-c08e-48b1-8afa-79c75380d142/tv:/data/tv
|
||||||
|
environment:
|
||||||
|
- JELLYFIN_PublishedServerUrl=https://jelly.skrd.fun
|
||||||
|
networks:
|
||||||
|
macvlan_192_168_3_0:
|
||||||
|
ipv4_address: 192.168.3.11
|
||||||
|
networks:
|
||||||
|
macvlan_192_168_3_0:
|
||||||
|
external: true
|
||||||
|
|
||||||
24
stacks/minecraft.yml
Normal file
24
stacks/minecraft.yml
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
version: "3"
|
||||||
|
|
||||||
|
services:
|
||||||
|
mc:
|
||||||
|
image: itzg/minecraft-server
|
||||||
|
tty: true
|
||||||
|
stdin_open: true
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
type: "paper"
|
||||||
|
eula: "true"
|
||||||
|
online_mode: "false"
|
||||||
|
enable_autopause: "true"
|
||||||
|
jvm_dd_opts: "disable.watchdog:true"
|
||||||
|
debug_autopause: "true"
|
||||||
|
volumes:
|
||||||
|
- /srv/dev-disk-by-uuid-1582b800-1f82-407a-a3aa-3460b3390127/docker/minecraft/data:/data
|
||||||
|
networks:
|
||||||
|
macvlan_192_168_3_0:
|
||||||
|
ipv4_address: 192.168.3.9
|
||||||
|
|
||||||
|
networks:
|
||||||
|
macvlan_192_168_3_0:
|
||||||
|
external: true
|
||||||
22
stacks/navidrome.yml
Normal file
22
stacks/navidrome.yml
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
version: "3"
|
||||||
|
services:
|
||||||
|
navidrome:
|
||||||
|
image: deluan/navidrome:latest
|
||||||
|
user: 1000:1000
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
ND_MUSICFOLDER: "/store"
|
||||||
|
ND_BASEURL: "https:://navi.skrd.fun"
|
||||||
|
ND_AUTOIMPORTPLAYLISTS: false
|
||||||
|
ND_ENABLESHARING: true
|
||||||
|
networks:
|
||||||
|
macvlan_192_168_3_0:
|
||||||
|
ipv4_address: 192.168.3.10
|
||||||
|
volumes:
|
||||||
|
- /srv/dev-disk-by-uuid-1582b800-1f82-407a-a3aa-3460b3390127/docker/navidrome:/data
|
||||||
|
- /srv/dev-disk-by-uuid-1582b800-1f82-407a-a3aa-3460b3390127/music:/store/music:ro
|
||||||
|
- /srv/dev-disk-by-uuid-1582b800-1f82-407a-a3aa-3460b3390127/ost:/store/ost:ro
|
||||||
|
networks:
|
||||||
|
macvlan_192_168_3_0:
|
||||||
|
external: true
|
||||||
|
|
||||||
19
stacks/npm.yml
Normal file
19
stacks/npm.yml
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
version: '3.8'
|
||||||
|
services:
|
||||||
|
nginx-proxy-manager:
|
||||||
|
image: 'jc21/nginx-proxy-manager:latest'
|
||||||
|
restart: unless-stopped
|
||||||
|
volumes:
|
||||||
|
- /srv/dev-disk-by-uuid-1582b800-1f82-407a-a3aa-3460b3390127/docker/npm/data:/data
|
||||||
|
- /srv/dev-disk-by-uuid-1582b800-1f82-407a-a3aa-3460b3390127/docker/npm/letsencrypt:/etc/letsencrypt
|
||||||
|
- /srv/dev-disk-by-uuid-1582b800-1f82-407a-a3aa-3460b3390127/docker/npm/ca.crt:/etc/my_ca.crt
|
||||||
|
networks:
|
||||||
|
proxy_network:
|
||||||
|
macvlan_192_168_3_0:
|
||||||
|
ipv4_address: 192.168.103.2
|
||||||
|
|
||||||
|
networks:
|
||||||
|
proxy_network:
|
||||||
|
external: true
|
||||||
|
macvlan_192_168_3_0:
|
||||||
|
external: true
|
||||||
22
stacks/qbittorrent.yml
Normal file
22
stacks/qbittorrent.yml
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
version: '3'
|
||||||
|
|
||||||
|
services:
|
||||||
|
qbittorrent:
|
||||||
|
image: lscr.io/linuxserver/qbittorrent:latest
|
||||||
|
environment:
|
||||||
|
- PUID=1000
|
||||||
|
- PGID=1000
|
||||||
|
- TZ=America/Santiago
|
||||||
|
- WEBUI_PORT=80
|
||||||
|
- TORRENTING_PORT=6881
|
||||||
|
volumes:
|
||||||
|
- /srv/dev-disk-by-uuid-1582b800-1f82-407a-a3aa-3460b3390127/docker/qbittorrent:/config:/config
|
||||||
|
- /srv/dev-disk-by-uuid-1582b800-1f82-407a-a3aa-3460b3390127/downloads:/downloads
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
macvlan_192_168_3_0:
|
||||||
|
ipv4_address: 192.168.3.4
|
||||||
|
|
||||||
|
networks:
|
||||||
|
macvlan_192_168_3_0:
|
||||||
|
external: true
|
||||||
1
stacks/zenithar.env.example
Normal file
1
stacks/zenithar.env.example
Normal file
@@ -0,0 +1 @@
|
|||||||
|
MARIADB_ROOT_PASSWORD=SECRET
|
||||||
15
stacks/zenithar.yml
Normal file
15
stacks/zenithar.yml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
version: "3"
|
||||||
|
services:
|
||||||
|
db:
|
||||||
|
image: mariadb
|
||||||
|
restart: unless-stopped
|
||||||
|
env_file: stack.env
|
||||||
|
volumes:
|
||||||
|
- /srv/dev-disk-by-uuid-1582b800-1f82-407a-a3aa-3460b3390127/docker/zenithar:/var/lib/mysql:Z
|
||||||
|
networks:
|
||||||
|
macvlan_192_168_3_0:
|
||||||
|
ipv4_address: 192.168.3.7
|
||||||
|
|
||||||
|
networks:
|
||||||
|
macvlan_192_168_3_0:
|
||||||
|
external: true
|
||||||
41
terraform/k3s/.gitignore
vendored
Normal file
41
terraform/k3s/.gitignore
vendored
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
# Local .terraform directories
|
||||||
|
.terraform/
|
||||||
|
|
||||||
|
# .tfstate files
|
||||||
|
*.tfstate
|
||||||
|
*.tfstate.*
|
||||||
|
|
||||||
|
# Crash log files
|
||||||
|
crash.log
|
||||||
|
crash.*.log
|
||||||
|
|
||||||
|
# Exclude all .tfvars files, which are likely to contain sensitive data, such as
|
||||||
|
# password, private keys, and other secrets. These should not be part of version
|
||||||
|
# control as they are data points which are potentially sensitive and subject
|
||||||
|
# to change depending on the environment.
|
||||||
|
*.tfvars
|
||||||
|
*.tfvars.json
|
||||||
|
|
||||||
|
# Ignore override files as they are usually used to override resources locally and so
|
||||||
|
# are not checked in
|
||||||
|
override.tf
|
||||||
|
override.tf.json
|
||||||
|
*_override.tf
|
||||||
|
*_override.tf.json
|
||||||
|
|
||||||
|
# Ignore transient lock info files created by terraform apply
|
||||||
|
.terraform.tfstate.lock.info
|
||||||
|
|
||||||
|
# Include override files you do wish to add to version control using negated pattern
|
||||||
|
# !example_override.tf
|
||||||
|
|
||||||
|
# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan
|
||||||
|
# example: *tfplan*
|
||||||
|
|
||||||
|
# Ignore CLI configuration files
|
||||||
|
.terraformrc
|
||||||
|
terraform.rc
|
||||||
|
|
||||||
|
# Ignorando secrets
|
||||||
|
secrets.tfvars
|
||||||
|
!secrets.tfvars.example
|
||||||
44
terraform/k3s/.terraform.lock.hcl
generated
Normal file
44
terraform/k3s/.terraform.lock.hcl
generated
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
# This file is maintained automatically by "terraform init".
|
||||||
|
# Manual edits may be lost in future updates.
|
||||||
|
|
||||||
|
provider "registry.terraform.io/bpg/proxmox" {
|
||||||
|
version = "0.72.0"
|
||||||
|
constraints = "0.72.0"
|
||||||
|
hashes = [
|
||||||
|
"h1:LCNKZG6lVHdf9LTkHgM8CPUbiFxLI8k208Tz9ajz46c=",
|
||||||
|
"zh:031d0ade16874fe111055b9417b4f9c73efe7c755ba39aa28bd697ee77dc5e0e",
|
||||||
|
"zh:095320d9cfb1e1f1b42d0d31f7aef5380323ab5e0d428606c43c9a30bf3b40db",
|
||||||
|
"zh:11b9ccfc249e150a174f1aa0dd63b8f96296fcb94353902e807da2da20035822",
|
||||||
|
"zh:24aa2cb7362db5ffebdcc45b0f53897fdd102f322ec7d9e0e4ef60a87955c182",
|
||||||
|
"zh:334d6d6c2c12803b530ca7fcafe25def317333582dca531ae889bdc1dcbf966a",
|
||||||
|
"zh:383376b3ce17877f78168270f14a4401093cfee464adf85dd88214d09951e6a2",
|
||||||
|
"zh:762d16fefdf4af471fe11ba315c7a0a3e5ff04c4f6e8431cd541b2f78cd518ae",
|
||||||
|
"zh:7c455e70d262e26c3fda8859ed67b0118d12f72416397fc8fbf5b5b90f2f02c3",
|
||||||
|
"zh:8401a38d10e1aacc7c3f75ae41f42c88647ab7e0974010c616b69095c7a719c1",
|
||||||
|
"zh:b7bdc53cdd6a21f208fc15bbbd0502fd39bee268801fd2b9ce89e18b38138bc0",
|
||||||
|
"zh:c3741939ceb5fbd4c00f9aa541a3e9cb68222c39890ca5ed3602a0ca3fa98a53",
|
||||||
|
"zh:d0d49355b2d1dc847028c96328f8e0ffc4ce39c3641940f9136684a7177d008f",
|
||||||
|
"zh:ed137c25a20912962413ea1972aa15931f54dcb922a9c4451d08237b6cad2037",
|
||||||
|
"zh:f26e0763dbe6a6b2195c94b44696f2110f7f55433dc142839be16b9697fa5597",
|
||||||
|
"zh:f3e38e9c63ef9b295c7e4d2e302d85700f2e8dbff49285e364457b999b927a72",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
provider "registry.terraform.io/hashicorp/local" {
|
||||||
|
version = "2.5.2"
|
||||||
|
hashes = [
|
||||||
|
"h1:JlMZD6nYqJ8sSrFfEAH0Vk/SL8WLZRmFaMUF9PJK5wM=",
|
||||||
|
"zh:136299545178ce281c56f36965bf91c35407c11897f7082b3b983d86cb79b511",
|
||||||
|
"zh:3b4486858aa9cb8163378722b642c57c529b6c64bfbfc9461d940a84cd66ebea",
|
||||||
|
"zh:4855ee628ead847741aa4f4fc9bed50cfdbf197f2912775dd9fe7bc43fa077c0",
|
||||||
|
"zh:4b8cd2583d1edcac4011caafe8afb7a95e8110a607a1d5fb87d921178074a69b",
|
||||||
|
"zh:52084ddaff8c8cd3f9e7bcb7ce4dc1eab00602912c96da43c29b4762dc376038",
|
||||||
|
"zh:71562d330d3f92d79b2952ffdda0dad167e952e46200c767dd30c6af8d7c0ed3",
|
||||||
|
"zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3",
|
||||||
|
"zh:805f81ade06ff68fa8b908d31892eaed5c180ae031c77ad35f82cb7a74b97cf4",
|
||||||
|
"zh:8b6b3ebeaaa8e38dd04e56996abe80db9be6f4c1df75ac3cccc77642899bd464",
|
||||||
|
"zh:ad07750576b99248037b897de71113cc19b1a8d0bc235eb99173cc83d0de3b1b",
|
||||||
|
"zh:b9f1c3bfadb74068f5c205292badb0661e17ac05eb23bfe8bd809691e4583d0e",
|
||||||
|
"zh:cc4cbcd67414fefb111c1bf7ab0bc4beb8c0b553d01719ad17de9a047adff4d1",
|
||||||
|
]
|
||||||
|
}
|
||||||
96
terraform/k3s/main.tf
Normal file
96
terraform/k3s/main.tf
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
data "local_file" "ssh_public_key" {
|
||||||
|
filename = "/home/ryuuji/.ssh/id_rsa.pub"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "proxmox_virtual_environment_download_file" "ubuntu_cloud_image" {
|
||||||
|
content_type = "iso"
|
||||||
|
datastore_id = "storage"
|
||||||
|
node_name = "talos"
|
||||||
|
url = "https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img"
|
||||||
|
file_name = "k3s-noble-server-cloudimg-amd64.img"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "proxmox_virtual_environment_file" "k3s_user_data_cloud_config" {
|
||||||
|
for_each = var.k3s_vm_config
|
||||||
|
content_type = "snippets"
|
||||||
|
datastore_id = "storage"
|
||||||
|
node_name = "talos"
|
||||||
|
|
||||||
|
source_raw {
|
||||||
|
data = <<-EOF
|
||||||
|
#cloud-config
|
||||||
|
hostname: ${each.value.name}
|
||||||
|
users:
|
||||||
|
- default
|
||||||
|
- name: ubuntu
|
||||||
|
groups:
|
||||||
|
- sudo
|
||||||
|
shell: /bin/bash
|
||||||
|
ssh_authorized_keys:
|
||||||
|
- ${trimspace(data.local_file.ssh_public_key.content)}
|
||||||
|
sudo: ALL=(ALL) NOPASSWD:ALL
|
||||||
|
runcmd:
|
||||||
|
- apt update
|
||||||
|
- apt install -y qemu-guest-agent net-tools
|
||||||
|
- timedatectl set-timezone America/Santiago
|
||||||
|
- systemctl enable qemu-guest-agent
|
||||||
|
- systemctl start qemu-guest-agent
|
||||||
|
- echo "done" > /tmp/cloud-config.done
|
||||||
|
EOF
|
||||||
|
|
||||||
|
file_name = "${each.value.name}-k3s-cloud-config.yaml"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "proxmox_virtual_environment_vm" "k3s_ubuntu_vm" {
|
||||||
|
for_each = var.k3s_vm_config
|
||||||
|
name = each.value.name
|
||||||
|
node_name = "talos"
|
||||||
|
|
||||||
|
agent {
|
||||||
|
enabled = true
|
||||||
|
}
|
||||||
|
|
||||||
|
cpu {
|
||||||
|
cores = 4
|
||||||
|
type = "host"
|
||||||
|
}
|
||||||
|
|
||||||
|
memory {
|
||||||
|
dedicated = each.value.ram
|
||||||
|
}
|
||||||
|
|
||||||
|
disk {
|
||||||
|
datastore_id = "storage-lvm"
|
||||||
|
file_id = proxmox_virtual_environment_download_file.ubuntu_cloud_image.id
|
||||||
|
interface = "virtio0"
|
||||||
|
iothread = true
|
||||||
|
discard = "on"
|
||||||
|
size = 50
|
||||||
|
}
|
||||||
|
|
||||||
|
disk {
|
||||||
|
datastore_id = "storage-lvm"
|
||||||
|
iothread = true
|
||||||
|
interface = "virtio1"
|
||||||
|
discard = "on"
|
||||||
|
file_format = "raw"
|
||||||
|
size = 200
|
||||||
|
}
|
||||||
|
|
||||||
|
network_device {
|
||||||
|
bridge = "vmbr0"
|
||||||
|
}
|
||||||
|
|
||||||
|
initialization {
|
||||||
|
datastore_id = "storage-lvm"
|
||||||
|
ip_config {
|
||||||
|
ipv4 {
|
||||||
|
address = "${each.value.ip}/${each.value.cidr}"
|
||||||
|
gateway = "192.168.1.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
user_data_file_id = proxmox_virtual_environment_file.k3s_user_data_cloud_config[each.key].id
|
||||||
|
}
|
||||||
|
}
|
||||||
26
terraform/k3s/outputs.tf
Normal file
26
terraform/k3s/outputs.tf
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
locals {
|
||||||
|
ansible_master_lines = [
|
||||||
|
for name, config in var.k3s_vm_config :
|
||||||
|
"${config.ip} ansible_user=ubuntu ansible_ssh_private_key_file=/home/ryuuji/.ssh/id_rsa ansible_ssh_common_args='-o StrictHostKeyChecking=no'"
|
||||||
|
if config.role == "master"
|
||||||
|
]
|
||||||
|
ansible_worker_lines = [
|
||||||
|
for name, config in var.k3s_vm_config :
|
||||||
|
"${config.ip} ansible_user=ubuntu ansible_ssh_private_key_file=/home/ryuuji/.ssh/id_rsa ansible_ssh_common_args='-o StrictHostKeyChecking=no'"
|
||||||
|
if config.role == "worker"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
output "ansible_inventory_k3s" {
|
||||||
|
value = <<EOT
|
||||||
|
[k3s_master]
|
||||||
|
${join("\n", local.ansible_master_lines)}
|
||||||
|
|
||||||
|
[k3s_workers]
|
||||||
|
${join("\n", local.ansible_worker_lines)}
|
||||||
|
|
||||||
|
[k3s_cluster:children]
|
||||||
|
k3s_master
|
||||||
|
k3s_workers
|
||||||
|
EOT
|
||||||
|
}
|
||||||
20
terraform/k3s/providers.tf
Normal file
20
terraform/k3s/providers.tf
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
terraform {
|
||||||
|
required_providers {
|
||||||
|
proxmox = {
|
||||||
|
source = "bpg/proxmox"
|
||||||
|
version = "0.72.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
provider "proxmox" {
|
||||||
|
endpoint = var.proxmox_endpoint
|
||||||
|
username = var.proxmox_username
|
||||||
|
password = var.proxmox_password
|
||||||
|
insecure = true
|
||||||
|
ssh {
|
||||||
|
agent = true
|
||||||
|
username = var.proxmox_ssh_username
|
||||||
|
private_key = file(var.proxmox_ssh_private_key)
|
||||||
|
}
|
||||||
|
}
|
||||||
6
terraform/k3s/secrets.tfvars.example
Normal file
6
terraform/k3s/secrets.tfvars.example
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
proxmox_endpoint = "https://192.168.2.1:8006/"
|
||||||
|
proxmox_username = "username@pam"
|
||||||
|
proxmox_password = "SECRET"
|
||||||
|
|
||||||
|
proxmox_ssh_username = "username"
|
||||||
|
proxmox_ssh_private_key = "~/.ssh/id_rsa"
|
||||||
23
terraform/k3s/variables.tf
Normal file
23
terraform/k3s/variables.tf
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
variable "proxmox_endpoint" {}
|
||||||
|
variable "proxmox_username" {}
|
||||||
|
variable "proxmox_password" {}
|
||||||
|
variable "proxmox_ssh_username" {}
|
||||||
|
variable "proxmox_ssh_private_key" {}
|
||||||
|
|
||||||
|
|
||||||
|
variable "k3s_vm_config" {
|
||||||
|
type = map(object({
|
||||||
|
name = string
|
||||||
|
ip = string
|
||||||
|
cidr = string
|
||||||
|
ram = string
|
||||||
|
role = string
|
||||||
|
}))
|
||||||
|
|
||||||
|
default = {
|
||||||
|
"vm1" = { name = "k3s-node-1", ip = "192.168.3.1", cidr = "16", ram = "4096", role = "master" }
|
||||||
|
"vm2" = { name = "k3s-node-2", ip = "192.168.3.2", cidr = "16", ram = "4096", role = "worker" }
|
||||||
|
"vm3" = { name = "k3s-node-3", ip = "192.168.3.3", cidr = "16", ram = "4096", role = "worker" }
|
||||||
|
"vm4" = { name = "k3s-node-4", ip = "192.168.3.4", cidr = "16", ram = "4096", role = "worker" }
|
||||||
|
}
|
||||||
|
}
|
||||||
41
terraform/pihole/.gitignore
vendored
Normal file
41
terraform/pihole/.gitignore
vendored
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
# Local .terraform directories
|
||||||
|
.terraform/
|
||||||
|
|
||||||
|
# .tfstate files
|
||||||
|
*.tfstate
|
||||||
|
*.tfstate.*
|
||||||
|
|
||||||
|
# Crash log files
|
||||||
|
crash.log
|
||||||
|
crash.*.log
|
||||||
|
|
||||||
|
# Exclude all .tfvars files, which are likely to contain sensitive data, such as
|
||||||
|
# password, private keys, and other secrets. These should not be part of version
|
||||||
|
# control as they are data points which are potentially sensitive and subject
|
||||||
|
# to change depending on the environment.
|
||||||
|
*.tfvars
|
||||||
|
*.tfvars.json
|
||||||
|
|
||||||
|
# Ignore override files as they are usually used to override resources locally and so
|
||||||
|
# are not checked in
|
||||||
|
override.tf
|
||||||
|
override.tf.json
|
||||||
|
*_override.tf
|
||||||
|
*_override.tf.json
|
||||||
|
|
||||||
|
# Ignore transient lock info files created by terraform apply
|
||||||
|
.terraform.tfstate.lock.info
|
||||||
|
|
||||||
|
# Include override files you do wish to add to version control using negated pattern
|
||||||
|
# !example_override.tf
|
||||||
|
|
||||||
|
# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan
|
||||||
|
# example: *tfplan*
|
||||||
|
|
||||||
|
# Ignore CLI configuration files
|
||||||
|
.terraformrc
|
||||||
|
terraform.rc
|
||||||
|
|
||||||
|
# Ignorando secrets
|
||||||
|
secrets.tfvars
|
||||||
|
!secrets.tfvars.example
|
||||||
44
terraform/pihole/.terraform.lock.hcl
generated
Normal file
44
terraform/pihole/.terraform.lock.hcl
generated
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
# This file is maintained automatically by "terraform init".
|
||||||
|
# Manual edits may be lost in future updates.
|
||||||
|
|
||||||
|
provider "registry.terraform.io/bpg/proxmox" {
|
||||||
|
version = "0.72.0"
|
||||||
|
constraints = "0.72.0"
|
||||||
|
hashes = [
|
||||||
|
"h1:LCNKZG6lVHdf9LTkHgM8CPUbiFxLI8k208Tz9ajz46c=",
|
||||||
|
"zh:031d0ade16874fe111055b9417b4f9c73efe7c755ba39aa28bd697ee77dc5e0e",
|
||||||
|
"zh:095320d9cfb1e1f1b42d0d31f7aef5380323ab5e0d428606c43c9a30bf3b40db",
|
||||||
|
"zh:11b9ccfc249e150a174f1aa0dd63b8f96296fcb94353902e807da2da20035822",
|
||||||
|
"zh:24aa2cb7362db5ffebdcc45b0f53897fdd102f322ec7d9e0e4ef60a87955c182",
|
||||||
|
"zh:334d6d6c2c12803b530ca7fcafe25def317333582dca531ae889bdc1dcbf966a",
|
||||||
|
"zh:383376b3ce17877f78168270f14a4401093cfee464adf85dd88214d09951e6a2",
|
||||||
|
"zh:762d16fefdf4af471fe11ba315c7a0a3e5ff04c4f6e8431cd541b2f78cd518ae",
|
||||||
|
"zh:7c455e70d262e26c3fda8859ed67b0118d12f72416397fc8fbf5b5b90f2f02c3",
|
||||||
|
"zh:8401a38d10e1aacc7c3f75ae41f42c88647ab7e0974010c616b69095c7a719c1",
|
||||||
|
"zh:b7bdc53cdd6a21f208fc15bbbd0502fd39bee268801fd2b9ce89e18b38138bc0",
|
||||||
|
"zh:c3741939ceb5fbd4c00f9aa541a3e9cb68222c39890ca5ed3602a0ca3fa98a53",
|
||||||
|
"zh:d0d49355b2d1dc847028c96328f8e0ffc4ce39c3641940f9136684a7177d008f",
|
||||||
|
"zh:ed137c25a20912962413ea1972aa15931f54dcb922a9c4451d08237b6cad2037",
|
||||||
|
"zh:f26e0763dbe6a6b2195c94b44696f2110f7f55433dc142839be16b9697fa5597",
|
||||||
|
"zh:f3e38e9c63ef9b295c7e4d2e302d85700f2e8dbff49285e364457b999b927a72",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
provider "registry.terraform.io/hashicorp/local" {
|
||||||
|
version = "2.5.2"
|
||||||
|
hashes = [
|
||||||
|
"h1:JlMZD6nYqJ8sSrFfEAH0Vk/SL8WLZRmFaMUF9PJK5wM=",
|
||||||
|
"zh:136299545178ce281c56f36965bf91c35407c11897f7082b3b983d86cb79b511",
|
||||||
|
"zh:3b4486858aa9cb8163378722b642c57c529b6c64bfbfc9461d940a84cd66ebea",
|
||||||
|
"zh:4855ee628ead847741aa4f4fc9bed50cfdbf197f2912775dd9fe7bc43fa077c0",
|
||||||
|
"zh:4b8cd2583d1edcac4011caafe8afb7a95e8110a607a1d5fb87d921178074a69b",
|
||||||
|
"zh:52084ddaff8c8cd3f9e7bcb7ce4dc1eab00602912c96da43c29b4762dc376038",
|
||||||
|
"zh:71562d330d3f92d79b2952ffdda0dad167e952e46200c767dd30c6af8d7c0ed3",
|
||||||
|
"zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3",
|
||||||
|
"zh:805f81ade06ff68fa8b908d31892eaed5c180ae031c77ad35f82cb7a74b97cf4",
|
||||||
|
"zh:8b6b3ebeaaa8e38dd04e56996abe80db9be6f4c1df75ac3cccc77642899bd464",
|
||||||
|
"zh:ad07750576b99248037b897de71113cc19b1a8d0bc235eb99173cc83d0de3b1b",
|
||||||
|
"zh:b9f1c3bfadb74068f5c205292badb0661e17ac05eb23bfe8bd809691e4583d0e",
|
||||||
|
"zh:cc4cbcd67414fefb111c1bf7ab0bc4beb8c0b553d01719ad17de9a047adff4d1",
|
||||||
|
]
|
||||||
|
}
|
||||||
87
terraform/pihole/main.tf
Normal file
87
terraform/pihole/main.tf
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
data "local_file" "ssh_public_key" {
|
||||||
|
filename = "/home/ryuuji/.ssh/id_rsa.pub"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "proxmox_virtual_environment_download_file" "ubuntu_cloud_image" {
|
||||||
|
content_type = "iso"
|
||||||
|
datastore_id = "storage"
|
||||||
|
node_name = "talos"
|
||||||
|
url = "https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img"
|
||||||
|
file_name = "pihole-noble-server-cloudimg-amd64.img"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "proxmox_virtual_environment_file" "user_data_cloud_config" {
|
||||||
|
for_each = var.vms_config
|
||||||
|
content_type = "snippets"
|
||||||
|
datastore_id = "storage"
|
||||||
|
node_name = "talos"
|
||||||
|
|
||||||
|
source_raw {
|
||||||
|
data = <<-EOF
|
||||||
|
#cloud-config
|
||||||
|
hostname: ${each.value.name}
|
||||||
|
users:
|
||||||
|
- default
|
||||||
|
- name: ubuntu
|
||||||
|
groups:
|
||||||
|
- sudo
|
||||||
|
shell: /bin/bash
|
||||||
|
ssh_authorized_keys:
|
||||||
|
- ${trimspace(data.local_file.ssh_public_key.content)}
|
||||||
|
sudo: ALL=(ALL) NOPASSWD:ALL
|
||||||
|
runcmd:
|
||||||
|
- apt update
|
||||||
|
- apt install -y qemu-guest-agent net-tools
|
||||||
|
- timedatectl set-timezone America/Santiago
|
||||||
|
- systemctl enable qemu-guest-agent
|
||||||
|
- systemctl start qemu-guest-agent
|
||||||
|
- echo "done" > /tmp/cloud-config.done
|
||||||
|
EOF
|
||||||
|
|
||||||
|
file_name = "${each.value.name}-user-data-cloud-config.yaml"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "proxmox_virtual_environment_vm" "ubuntu_vm" {
|
||||||
|
for_each = var.vms_config
|
||||||
|
name = each.value.name
|
||||||
|
node_name = "talos"
|
||||||
|
|
||||||
|
agent {
|
||||||
|
enabled = true
|
||||||
|
}
|
||||||
|
|
||||||
|
cpu {
|
||||||
|
cores = 4
|
||||||
|
type = "host"
|
||||||
|
}
|
||||||
|
|
||||||
|
memory {
|
||||||
|
dedicated = each.value.ram
|
||||||
|
}
|
||||||
|
|
||||||
|
disk {
|
||||||
|
datastore_id = "storage-lvm"
|
||||||
|
file_id = proxmox_virtual_environment_download_file.ubuntu_cloud_image.id
|
||||||
|
interface = "virtio0"
|
||||||
|
iothread = true
|
||||||
|
discard = "on"
|
||||||
|
size = each.value.disk
|
||||||
|
}
|
||||||
|
|
||||||
|
network_device {
|
||||||
|
bridge = "vmbr0"
|
||||||
|
}
|
||||||
|
|
||||||
|
initialization {
|
||||||
|
datastore_id = "storage-lvm"
|
||||||
|
ip_config {
|
||||||
|
ipv4 {
|
||||||
|
address = "${each.value.ip}/${each.value.cidr}"
|
||||||
|
gateway = "192.168.1.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
user_data_file_id = proxmox_virtual_environment_file.user_data_cloud_config[each.key].id
|
||||||
|
}
|
||||||
|
}
|
||||||
15
terraform/pihole/outputs.tf
Normal file
15
terraform/pihole/outputs.tf
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
locals {
|
||||||
|
ansible_lines = [
|
||||||
|
for name, config in var.vms_config :
|
||||||
|
"${config.ip} ansible_user=ubuntu ansible_ssh_private_key_file=/home/ryuuji/.ssh/id_rsa ansible_ssh_common_args='-o StrictHostKeyChecking=no'"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
output "ansible_inventory" {
|
||||||
|
value = <<EOT
|
||||||
|
[pihole]
|
||||||
|
${join("\n", local.ansible_lines)}
|
||||||
|
EOT
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
20
terraform/pihole/providers.tf
Normal file
20
terraform/pihole/providers.tf
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
terraform {
|
||||||
|
required_providers {
|
||||||
|
proxmox = {
|
||||||
|
source = "bpg/proxmox"
|
||||||
|
version = "0.72.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
provider "proxmox" {
|
||||||
|
endpoint = var.proxmox_endpoint
|
||||||
|
username = var.proxmox_username
|
||||||
|
password = var.proxmox_password
|
||||||
|
insecure = true
|
||||||
|
ssh {
|
||||||
|
agent = true
|
||||||
|
username = var.proxmox_ssh_username
|
||||||
|
private_key = file(var.proxmox_ssh_private_key)
|
||||||
|
}
|
||||||
|
}
|
||||||
6
terraform/pihole/secrets.tfvars.example
Normal file
6
terraform/pihole/secrets.tfvars.example
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
proxmox_endpoint = "https://192.168.2.1:8006/"
|
||||||
|
proxmox_username = "username@pam"
|
||||||
|
proxmox_password = "SECRET"
|
||||||
|
|
||||||
|
proxmox_ssh_username = "username"
|
||||||
|
proxmox_ssh_private_key = "~/.ssh/id_rsa"
|
||||||
5
terraform/pihole/variables.tf
Normal file
5
terraform/pihole/variables.tf
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
variable "proxmox_endpoint" {}
|
||||||
|
variable "proxmox_username" {}
|
||||||
|
variable "proxmox_password" {}
|
||||||
|
variable "proxmox_ssh_username" {}
|
||||||
|
variable "proxmox_ssh_private_key" {}
|
||||||
Reference in New Issue
Block a user