Compare commits
6 Commits
6fa5a8940b
...
197ca0d3ca
Author | SHA1 | Date | |
---|---|---|---|
|
197ca0d3ca | ||
|
3332c3ff9c | ||
|
86b55d67d0 | ||
|
fa5e2869ec | ||
|
eed4145553 | ||
|
4f6ee18495 |
214
dsmr/postgreshelmconfig.yaml
Normal file
214
dsmr/postgreshelmconfig.yaml
Normal file
@ -0,0 +1,214 @@
|
||||
---
|
||||
## Set default image, imageTag, and imagePullPolicy.
|
||||
## ref: https://hub.docker.com/_/postgres
|
||||
##
|
||||
image:
|
||||
repository: postgres
|
||||
tag: "11.5"
|
||||
pullPolicy: IfNotPresent
|
||||
|
||||
## Optionally specify an imagePullSecret.
|
||||
## Secret must be manually created in the namespace.
|
||||
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||
##
|
||||
# pullSecret: myRegistrKeySecretName
|
||||
|
||||
## Expose the nifi service to be accessed from outside the cluster (LoadBalancer service).
|
||||
## or access it from within the cluster (ClusterIP service). Set the service type and the port to serve it.
|
||||
## ref: http://kubernetes.io/docs/user-guide/services/
|
||||
##
|
||||
service:
|
||||
type: ClusterIP
|
||||
annotations: {}
|
||||
## clusterIP:
|
||||
|
||||
## Set the LoadBalancer service type to internal only.
|
||||
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer
|
||||
##
|
||||
# loadBalancerIP:
|
||||
|
||||
## Load Balancer sources
|
||||
## https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service
|
||||
##
|
||||
# loadBalancerSourceRanges:
|
||||
# - 10.10.10.0/24
|
||||
|
||||
## Postgresql values
|
||||
postgresql:
|
||||
username: dsmr
|
||||
password: dsmr
|
||||
database: dsmr
|
||||
port: 5432
|
||||
# initdbArgs
|
||||
# initdbWalDir
|
||||
dataDir: /var/lib/postgresql/data
|
||||
# extraEnv
|
||||
|
||||
## PostgreSQL configuration
|
||||
## Specify runtime configuration parameters as a dict, using camelCase, e.g.
|
||||
## {"sharedBuffers": "500MB"}
|
||||
## Alternatively, you can put your postgresql.conf under the configs/ directory
|
||||
## ref: https://www.postgresql.org/docs/current/static/runtime-config.html
|
||||
##
|
||||
# config: {"sharedBuffers": "500MB"}
|
||||
## PostgreSQL client authentication configuration
|
||||
## Specify content for pg_hba.conf
|
||||
## Default: do not create pg_hba.conf
|
||||
## Alternatively, you can put your pg_hba.conf under the files/ directory
|
||||
# pghba: |-
|
||||
# local all all trust
|
||||
# host all all localhost trust
|
||||
# host mydatabase mysuser 192.168.0.0/24 md5
|
||||
#initdbscripts: |-
|
||||
#!/bin/sh
|
||||
#echo "helloworld"
|
||||
## ConfigMap with PostgreSQL configuration
|
||||
## NOTE: This will override postgresql.config and postgresql.pghba
|
||||
# configMap:
|
||||
|
||||
##
|
||||
## Init containers parameters:
|
||||
## volumePermissions: Change the owner of the persist volume mountpoint to RunAsUser:fsGroup
|
||||
##
|
||||
volumePermissions:
|
||||
enabled: true
|
||||
image:
|
||||
registry: docker.io
|
||||
repository: debian
|
||||
tag: buster-slim
|
||||
## Specify a imagePullPolicy
|
||||
## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'
|
||||
## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images
|
||||
##
|
||||
pullPolicy: Always
|
||||
## Optionally specify an array of imagePullSecrets.
|
||||
## Secrets must be manually created in the namespace.
|
||||
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
|
||||
##
|
||||
# pullSecrets:
|
||||
# - myRegistryKeySecretName
|
||||
## Init container Security Context
|
||||
securityContext:
|
||||
runAsUser: 0
|
||||
|
||||
## Pod Security Context
|
||||
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/
|
||||
##
|
||||
securityContext:
|
||||
enabled: true
|
||||
fsGroup: 1001
|
||||
runAsUser: 1001
|
||||
|
||||
ldap:
|
||||
enabled: false
|
||||
pgldapconfig: |-
|
||||
# Reference: https://github.com/larskanis/pg-ldap-sync/blob/master/config/sample-config.yaml
|
||||
# Connection parameters to LDAP server
|
||||
ldap_connection:
|
||||
host: example.com
|
||||
port: 389
|
||||
auth:
|
||||
method: :simple
|
||||
username: cn=admin,dc=example,dc=com
|
||||
password: -password-goes-here-
|
||||
|
||||
# Search parameters for LDAP users which should be synchronized
|
||||
ldap_users:
|
||||
base: OU=People,dc=example,dc=com
|
||||
# LDAP filter (according to RFC 2254)
|
||||
# defines to users in LDAP to be synchronized
|
||||
filter: (&(objectClass=person)(objectClass=organizationalPerson)(givenName=*)(sn=*))
|
||||
# this attribute is used as PG role name
|
||||
name_attribute: sAMAccountName
|
||||
# lowercase name for use as PG role name
|
||||
lowercase_name: true
|
||||
ldap_groups:
|
||||
base: OU=people,dc=example,dc=com
|
||||
filter: (|(cn=group1)(cn=group2)(cn=group3))
|
||||
# this attribute is used as PG role name
|
||||
name_attribute: cn
|
||||
# this attribute must reference to all member DN's of the given group
|
||||
member_attribute: member
|
||||
# Connection parameters to PostgreSQL server
|
||||
# see also: http://rubydoc.info/gems/pg/PG/Connection#initialize-instance_method
|
||||
pg_connection:
|
||||
host:
|
||||
dbname: postgres # the db name is usually "postgres"
|
||||
user: postgres # the user name is usually "postgres"
|
||||
password: postgres # kubectl get secret --namespace fadi <pod_name> -o jsonpath="{.data.postgresql-password}" | base64 --decode
|
||||
pg_users:
|
||||
# Filter for identifying LDAP generated users in the database.
|
||||
# It's the WHERE-condition to "SELECT rolname, oid FROM pg_roles"
|
||||
filter: rolcanlogin AND NOT rolsuper
|
||||
# Options for CREATE RULE statements
|
||||
create_options: LOGIN
|
||||
pg_groups:
|
||||
# Filter for identifying LDAP generated groups in the database.
|
||||
# It's the WHERE-condition to "SELECT rolname, oid FROM pg_roles"
|
||||
filter: NOT rolcanlogin AND NOT rolsuper
|
||||
# Options for CREATE RULE statements
|
||||
create_options: NOLOGIN
|
||||
grant_options:
|
||||
|
||||
cron:
|
||||
schedule: "*/1 * * * *"
|
||||
repo: ceticasbl/pg-ldap-sync
|
||||
tag: latest
|
||||
restartPolicy: Never
|
||||
mountPath: /workspace
|
||||
subPath: ""
|
||||
|
||||
## Enable persistence using Persistent Volume Claims
|
||||
## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
|
||||
##
|
||||
persistence:
|
||||
enabled: true
|
||||
mountPath: /var/lib/postgresql
|
||||
subPath: ""
|
||||
accessModes: [ReadWriteOnce]
|
||||
## Storage Capacity for persistent volume
|
||||
size: 10Gi
|
||||
annotations: {}
|
||||
existingClaim: nfs-postgres-claim
|
||||
|
||||
## Configure liveness and readiness probes
|
||||
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/
|
||||
##
|
||||
#readinessProbe:
|
||||
# httpGet:
|
||||
# path: /
|
||||
# port: http
|
||||
# initialDelaySeconds: 60
|
||||
# periodSeconds: 15
|
||||
# timeoutSeconds: 10
|
||||
#livenessProbe:
|
||||
# httpGet:
|
||||
# path: /
|
||||
# port: http
|
||||
# initialDelaySeconds: 60
|
||||
# periodSeconds: 30
|
||||
# timeoutSeconds: 10
|
||||
|
||||
## Configure resource requests and limits
|
||||
## ref: http://kubernetes.io/docs/user-guide/compute-resources/
|
||||
##
|
||||
|
||||
## initdb scripts
|
||||
## Specify dictionary of scripts to be run at first boot
|
||||
## Alternatively, you can put your scripts under the files/docker-entrypoint-initdb.d directory
|
||||
##
|
||||
resources: {}
|
||||
# We usually recommend not to specify default resources and to leave this as a conscious
|
||||
# choice for the user. This also increases chances charts run on environments with little
|
||||
# resources, such as Minikube. If you do want to specify resources, uncomment the following
|
||||
# lines, adjust them as necessary, and remove the curly braces after 'resources:'.
|
||||
# limits:
|
||||
# cpu: 100m
|
||||
# memory: 128Mi
|
||||
# requests:
|
||||
# cpu: 100m
|
||||
# memory: 128Mi
|
||||
|
||||
nodeSelector: {}
|
||||
tolerations: []
|
||||
|
32
esphome/deurbel.yml
Normal file
32
esphome/deurbel.yml
Normal file
@ -0,0 +1,32 @@
|
||||
esphome:
|
||||
name: deurbel
|
||||
|
||||
esp8266:
|
||||
board: d1_mini
|
||||
|
||||
# Enable logging
|
||||
logger:
|
||||
|
||||
# Enable Home Assistant API
|
||||
api:
|
||||
password: "ncc1701D"
|
||||
|
||||
ota:
|
||||
password: "ncc1701D"
|
||||
|
||||
wifi:
|
||||
ssid: "BARTANIET"
|
||||
password: "ncc1701D"
|
||||
|
||||
# Enable fallback hotspot (captive portal) in case wifi connection fails
|
||||
ap:
|
||||
ssid: "Deurbel Fallback Hotspot"
|
||||
password: "jeXv60iAylaV"
|
||||
|
||||
captive_portal:
|
||||
|
||||
binary_sensor:
|
||||
- platform: gpio
|
||||
pin: D3
|
||||
name: "deurbelsignaal"
|
||||
device_class: opening
|
88
esphome/nibemodbus.yaml
Normal file
88
esphome/nibemodbus.yaml
Normal file
@ -0,0 +1,88 @@
|
||||
esphome:
|
||||
name: nibemodbus
|
||||
|
||||
esp32:
|
||||
board: esp32dev
|
||||
framework:
|
||||
type: arduino
|
||||
|
||||
# Enable logging
|
||||
logger:
|
||||
|
||||
# Enable Home Assistant API
|
||||
api:
|
||||
password: ""
|
||||
|
||||
ota:
|
||||
password: ""
|
||||
|
||||
wifi:
|
||||
power_save_mode: none
|
||||
ssid: "BARTANIET"
|
||||
password: "ncc1701D"
|
||||
|
||||
# Enable fallback hotspot (captive portal) in case wifi connection fails
|
||||
ap:
|
||||
ssid: "Nibemodbus Fallback Hotspot"
|
||||
password: "UgU5PVw37Yec"
|
||||
|
||||
captive_portal:
|
||||
|
||||
# Load nibe component
|
||||
external_components:
|
||||
- source: github://elupus/esphome-nibe
|
||||
|
||||
# Set pins required for LilyGo T-CAN485 board
|
||||
output:
|
||||
- platform: gpio
|
||||
id: ENABLE_PIN # Enable the chip
|
||||
pin:
|
||||
number: GPIO19
|
||||
inverted: true
|
||||
- platform: gpio
|
||||
id: SE_PIN # Enable autodirection
|
||||
pin:
|
||||
number: GPIO17
|
||||
inverted: true
|
||||
- platform: gpio
|
||||
id: ENABLE_5V_PIN # Enable 5V pin for RS485 chip
|
||||
pin:
|
||||
number: GPIO16
|
||||
inverted: true
|
||||
|
||||
# Configure uart that will be used
|
||||
uart:
|
||||
rx_pin: GPIO21
|
||||
tx_pin: GPIO22
|
||||
baud_rate: 9600
|
||||
|
||||
# Configure NibeGW
|
||||
nibegw:
|
||||
udp:
|
||||
# The target address(s) to send data to. May be a multicast address.
|
||||
target:
|
||||
- ip: 10.86.0.108
|
||||
port: 10090
|
||||
|
||||
# List of source address to accept data from, may be empty for no filter
|
||||
source:
|
||||
|
||||
acknowledge:
|
||||
- MODBUS40
|
||||
|
||||
# Constant replies to certain requests cabe made
|
||||
constants:
|
||||
- address: MODBUS40
|
||||
token: ACCESSORY
|
||||
data: [
|
||||
0x0A, # MODBUS version low
|
||||
0x00, # MODBUS version high
|
||||
0x01, # MODBUS address?
|
||||
]
|
||||
|
||||
# Some helper functions to restart ESPHome from HA
|
||||
button:
|
||||
- platform: restart
|
||||
name: Nibegw Restart
|
||||
- platform: safe_mode
|
||||
name: Nibegw Safe Mode Boot
|
154
hass/configuration.yaml.backup
Normal file
154
hass/configuration.yaml.backup
Normal file
@ -0,0 +1,154 @@
|
||||
|
||||
# Configure a default setup of Home Assistant (frontend, api, etc)
|
||||
default_config:
|
||||
|
||||
config:
|
||||
|
||||
rflink:
|
||||
host: 192.168.86.129
|
||||
port: 20000
|
||||
#
|
||||
light:
|
||||
- platform: rflink
|
||||
automatic_add: true
|
||||
device_defaults:
|
||||
fire_event: true
|
||||
signal_repetitions: 5
|
||||
devices:
|
||||
newkaku_01a3770e_1:
|
||||
name: schemerlamp
|
||||
type: switchable
|
||||
ansluta_6cf2_0:
|
||||
name: boekenkast
|
||||
type: hybrid
|
||||
|
||||
sensor:
|
||||
- platform: rflink
|
||||
automatic_add: true
|
||||
- platform: saj
|
||||
name: inverter
|
||||
host: 10.111.222.145
|
||||
- platform: greenchoice
|
||||
name: meterstanden
|
||||
password: ncc1701D
|
||||
username: anitajurgens@hotmail.com
|
||||
|
||||
afvalbeheer:
|
||||
wastecollector: ACV
|
||||
resources:
|
||||
- restafval
|
||||
- gft
|
||||
- papier
|
||||
- pmd
|
||||
postcode: 6707JB
|
||||
streetnumber: 43
|
||||
suffix: D # (optional)
|
||||
upcomingsensor: 1 # (optional)
|
||||
dateformat: '%d-%m-%Y' # (optional)
|
||||
dateonly: 0 # (optional)
|
||||
name: "" # (optional)
|
||||
nameprefix: 1 # (optional)
|
||||
builtiniconsnew: 1 # (optional)
|
||||
dutch: 1
|
||||
|
||||
# Uncomment this if you are using SSL/TLS, running in Docker container, etc.
|
||||
http:
|
||||
trusted_proxies:
|
||||
- 10.0.0.0/8
|
||||
- 192.168.86.0/24
|
||||
base_url: https://home.geesink.org
|
||||
use_x_forwarded_for: true
|
||||
|
||||
# Text to speech
|
||||
tts:
|
||||
- platform: google_translate
|
||||
|
||||
|
||||
group: !include groups.yaml
|
||||
automation: !include automations.yaml
|
||||
script: !include scripts.yaml
|
||||
scene: !include scenes.yaml
|
||||
|
||||
logger:
|
||||
default: error
|
||||
logs:
|
||||
rflink: debug
|
||||
homeassistant.components.rflink: debug
|
||||
|
||||
mqtt:
|
||||
light:
|
||||
- schema: json
|
||||
name: Keuken spotjes
|
||||
command_topic: "zigbee2mqtt/keuken_leds/set"
|
||||
state_topic: "zigbee2mqtt/keuken_leds"
|
||||
color_temp: true
|
||||
brightness: true
|
||||
- schema: json
|
||||
name: Woonkamer spotjes
|
||||
command_topic: "zigbee2mqtt/woonkamer_plafond/set"
|
||||
state_topic: "zigbee2mqtt/woonkamer_plafond"
|
||||
color_temp: true
|
||||
brightness: true
|
||||
sensor:
|
||||
- name: "Shelly sensor state"
|
||||
state_topic: "shellies/shellydw-FABA15/sensor/state"
|
||||
- name: "Lux"
|
||||
state_topic: "shellies/shellydw-FABA15/sensor/lux"
|
||||
- name: "Shelly sensor battery"
|
||||
state_topic: "shellies/shellydw-FABA15/sensor/battery"
|
||||
unit_of_measurement: "%"
|
||||
|
||||
recorder:
|
||||
purge_keep_days: 5
|
||||
|
||||
zone:
|
||||
- name: Home
|
||||
latitude: 51.972899
|
||||
longitude: 5.671515
|
||||
radius: 150
|
||||
|
||||
vacuum:
|
||||
- platform: roomba
|
||||
host: 192.168.86.104
|
||||
username: 69F7410851041790
|
||||
password: ':1:1578481444:ZUR9Ill9x9bqsY5e'
|
||||
|
||||
google_assistant:
|
||||
project_id: thuis-assistant
|
||||
|
||||
shopping_list:
|
||||
|
||||
#binary_sensor:
|
||||
# - platform: rflink
|
||||
# devices:
|
||||
# eurodomest_0556f1_06:
|
||||
# name: Afstandsbediening A
|
||||
# off_delay: 5
|
||||
# force_update: true
|
||||
# ev1527_0aa90e_08:
|
||||
# name: Afstandsbediening B
|
||||
# off_delay: 5
|
||||
# force_update: true
|
||||
#
|
||||
#media_player:
|
||||
# - platform: samsungtv_tizen
|
||||
# host: 192.168.86.116
|
||||
# port: 8002
|
||||
# mac: 44:5C:E9:7B:F5:4A
|
||||
|
||||
|
||||
nibe:
|
||||
systems:
|
||||
- system: "87950"
|
||||
units:
|
||||
- unit: 0
|
||||
categories: True
|
||||
- unit: 1
|
||||
categories: True
|
||||
sensors:
|
||||
- indoor_temperature
|
||||
- hot_water_temperature
|
||||
|
||||
webhook:
|
||||
|
||||
my:
|
70
hass/configuration.yml
Normal file
70
hass/configuration.yml
Normal file
@ -0,0 +1,70 @@
|
||||
default_config:
|
||||
|
||||
http:
|
||||
trusted_proxies:
|
||||
- "10.233.0.0/16"
|
||||
use_x_forwarded_for: true
|
||||
|
||||
frontend:
|
||||
themes: !include_dir_merge_named themes
|
||||
|
||||
tts:
|
||||
- platform: google_translate
|
||||
|
||||
recorder:
|
||||
db_url: mysql://hass:Ier9Xi6toaquah1ohto3@galera-mariadb-galera/hass?charset=utf8mb4
|
||||
|
||||
group: !include groups.yaml
|
||||
automation: !include automations.yaml
|
||||
script: !include scripts.yaml
|
||||
scene: !include scenes.yaml
|
||||
|
||||
|
||||
rflink:
|
||||
host: 192.168.86.128
|
||||
port: 20000
|
||||
#
|
||||
light:
|
||||
- platform: rflink
|
||||
automatic_add: true
|
||||
device_defaults:
|
||||
fire_event: true
|
||||
signal_repetitions: 5
|
||||
devices:
|
||||
newkaku_01a3770e_1:
|
||||
name: schemerlamp
|
||||
type: switchable
|
||||
ansluta_6cf2_0:
|
||||
name: boekenkast
|
||||
type: hybrid
|
||||
|
||||
sensor:
|
||||
- platform: rflink
|
||||
automatic_add: true
|
||||
- platform: saj
|
||||
name: inverter
|
||||
host: 10.111.222.145
|
||||
|
||||
mqtt:
|
||||
light:
|
||||
- schema: json
|
||||
name: Keuken spotjes
|
||||
command_topic: "zigbee2mqtt/keuken_leds/set"
|
||||
state_topic: "zigbee2mqtt/keuken_leds"
|
||||
color_temp: true
|
||||
brightness: true
|
||||
- schema: json
|
||||
name: Woonkamer spotjes
|
||||
command_topic: "zigbee2mqtt/woonkamer_plafond/set"
|
||||
state_topic: "zigbee2mqtt/woonkamer_plafond"
|
||||
color_temp: true
|
||||
brightness: true
|
||||
sensor:
|
||||
- name: "Shelly sensor state"
|
||||
state_topic: "shellies/shellydw-FABA15/sensor/state"
|
||||
- name: "Lux"
|
||||
state_topic: "shellies/shellydw-FABA15/sensor/lux"
|
||||
- name: "Shelly sensor battery"
|
||||
state_topic: "shellies/shellydw-FABA15/sensor/battery"
|
||||
unit_of_measurement: "%"
|
||||
|
25
hass/hassingress.yaml
Normal file
25
hass/hassingress.yaml
Normal file
@ -0,0 +1,25 @@
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: hassingress
|
||||
annotations:
|
||||
cert-manager.io/cluster-issuer: letsencrypt-prod
|
||||
haproxy.org/whitelist: "192.168.86.0/24,10.233.71.0/24"
|
||||
spec:
|
||||
ingressClassName: haproxy
|
||||
rules:
|
||||
- host: "home.geesink.org"
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: hasssvc
|
||||
port:
|
||||
number: 8123
|
||||
tls:
|
||||
-
|
||||
secretName: hass-cert-prod
|
||||
hosts:
|
||||
- home.geesink.org
|
20
hass/hassingress2.yaml
Normal file
20
hass/hassingress2.yaml
Normal file
@ -0,0 +1,20 @@
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: test
|
||||
annotations:
|
||||
cert-manager.io/cluster-issuer: letsencrypt-prod
|
||||
haproxy.org/whitelist: "192.168.86.0/24,10.233.71.0/24"
|
||||
spec:
|
||||
ingressClassName: haproxy
|
||||
rules:
|
||||
- host: "test.geesink.org"
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: hasssvc
|
||||
port:
|
||||
number: 8123
|
28
hass/homeass.yml
Normal file
28
hass/homeass.yml
Normal file
@ -0,0 +1,28 @@
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: hass
|
||||
labels:
|
||||
app: hass
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: hass
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: hass
|
||||
spec:
|
||||
containers:
|
||||
- name: hass
|
||||
image: homeassistant/home-assistant:stable
|
||||
ports:
|
||||
- containerPort: 8123
|
||||
volumeMounts:
|
||||
- name: datadiskhass
|
||||
mountPath: "/config"
|
||||
volumes:
|
||||
- name: datadiskhass
|
||||
persistentVolumeClaim:
|
||||
claimName: poddata
|
13
hass/old/hassingress.yaml
Normal file
13
hass/old/hassingress.yaml
Normal file
@ -0,0 +1,13 @@
|
||||
kind: Ingress
|
||||
apiVersion: extensions/v1beta1
|
||||
metadata:
|
||||
name: ingress-hass80
|
||||
spec:
|
||||
rules:
|
||||
- host: home.geesink.org
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
backend:
|
||||
serviceName: hass
|
||||
servicePort: 8123
|
14
hass/old/hassingressroute.yml
Normal file
14
hass/old/hassingressroute.yml
Normal file
@ -0,0 +1,14 @@
|
||||
---
|
||||
apiVersion: traefik.containo.us/v1alpha1
|
||||
kind: IngressRoute
|
||||
metadata:
|
||||
name: hassingress80
|
||||
spec:
|
||||
entryPoints:
|
||||
- web
|
||||
routes:
|
||||
- match: Host(`home.geesink.org`)
|
||||
kind: Rule
|
||||
services:
|
||||
- name: hass
|
||||
port: 8123
|
15
hass/old/hassingresssecure.yaml
Normal file
15
hass/old/hassingresssecure.yaml
Normal file
@ -0,0 +1,15 @@
|
||||
apiVersion: traefik.containo.us/v1alpha1
|
||||
kind: IngressRoute
|
||||
metadata:
|
||||
name: hassingress443
|
||||
spec:
|
||||
entryPoints:
|
||||
- websecure
|
||||
routes:
|
||||
- match: Host(`home.geesink.org`)
|
||||
kind: Rule
|
||||
services:
|
||||
- name: hass
|
||||
port: 8123
|
||||
tls: # This route uses TLS
|
||||
certResolver: myresolver
|
12
hass/old/pv.yaml
Normal file
12
hass/old/pv.yaml
Normal file
@ -0,0 +1,12 @@
|
||||
apiVersion: v1
|
||||
kind: PersistentVolume
|
||||
metadata:
|
||||
name: nfs
|
||||
spec:
|
||||
capacity:
|
||||
storage: 1Mi
|
||||
accessModes:
|
||||
- ReadWriteMany
|
||||
nfs:
|
||||
server: 192.168.86.86
|
||||
path: "/volume1/nfs_k3s/hass/"
|
11
hass/old/pvc.yaml
Normal file
11
hass/old/pvc.yaml
Normal file
@ -0,0 +1,11 @@
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: nfs
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteMany
|
||||
storageClassName: ""
|
||||
resources:
|
||||
requests:
|
||||
storage: 1Mi
|
13
hass/old/servicehass.yml
Normal file
13
hass/old/servicehass.yml
Normal file
@ -0,0 +1,13 @@
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: hass
|
||||
spec:
|
||||
selector:
|
||||
app: hass
|
||||
ports:
|
||||
- name: hass
|
||||
port: 8123
|
||||
- name: udpnibe
|
||||
port: 10090
|
||||
protocol: UDP
|
10
hass/servicehass.yml
Normal file
10
hass/servicehass.yml
Normal file
@ -0,0 +1,10 @@
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: hasssvc
|
||||
spec:
|
||||
selector:
|
||||
app: hass
|
||||
ports:
|
||||
- name: hass
|
||||
port: 8123
|
13
hass/servicehassloadbalancer.yml
Normal file
13
hass/servicehassloadbalancer.yml
Normal file
@ -0,0 +1,13 @@
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: hasssvcudptraffic
|
||||
spec:
|
||||
type: LoadBalancer
|
||||
loadBalancerIP: 10.86.0.108
|
||||
selector:
|
||||
app: hass
|
||||
ports:
|
||||
- name: udpnibe
|
||||
port: 10090
|
||||
protocol: UDP
|
25
jellyfin/jellyingress.yml
Normal file
25
jellyfin/jellyingress.yml
Normal file
@ -0,0 +1,25 @@
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: jellyfin
|
||||
annotations:
|
||||
cert-manager.io/cluster-issuer: letsencrypt-prod
|
||||
haproxy.org/whitelist: "192.168.86.0/24,10.233.71.0/24"
|
||||
spec:
|
||||
ingressClassName: haproxy
|
||||
rules:
|
||||
- host: "jellyfin.geesink.org"
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: jellyfin
|
||||
port:
|
||||
number: 8096
|
||||
tls:
|
||||
- hosts:
|
||||
- home.geesink.org
|
||||
secretName: jelly-cert-prod
|
||||
|
11
jellyfin/pvc.yaml
Normal file
11
jellyfin/pvc.yaml
Normal file
@ -0,0 +1,11 @@
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: jellyfin-config
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
storageClassName: longhorn
|
||||
resources:
|
||||
requests:
|
||||
storage: 1Gi
|
25
portainer/hassingress.yaml
Normal file
25
portainer/hassingress.yaml
Normal file
@ -0,0 +1,25 @@
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: hassingress
|
||||
annotations:
|
||||
cert-manager.io/cluster-issuer: letsencrypt-prod
|
||||
haproxy.org/whitelist: "192.168.86.0/24,10.233.71.0/24"
|
||||
spec:
|
||||
ingressClassName: haproxy
|
||||
rules:
|
||||
- host: "home.geesink.org"
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: hasssvc
|
||||
port:
|
||||
number: 8123
|
||||
tls:
|
||||
-
|
||||
secretName: hass-cert-prod
|
||||
hosts:
|
||||
- home.geesink.org
|
45
portainer/ingress_zoals_het_werkt
Normal file
45
portainer/ingress_zoals_het_werkt
Normal file
@ -0,0 +1,45 @@
|
||||
# Please edit the object below. Lines beginning with a '#' will be ignored,
|
||||
# and an empty file will abort the edit. If an error occurs while saving this file will be
|
||||
# reopened with the relevant failures.
|
||||
#
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
annotations:
|
||||
cert-manager.io/cluster-issuer: letsencrypt-prod
|
||||
kubernetes.io/ingress.class: haproxy
|
||||
meta.helm.sh/release-name: portainer
|
||||
meta.helm.sh/release-namespace: portainer
|
||||
creationTimestamp: "2023-05-31T18:17:22Z"
|
||||
generation: 7
|
||||
labels:
|
||||
app.kubernetes.io/instance: portainer
|
||||
app.kubernetes.io/managed-by: Helm
|
||||
app.kubernetes.io/name: portainer
|
||||
app.kubernetes.io/version: ce-latest-ee-2.18.3
|
||||
helm.sh/chart: portainer-1.0.43
|
||||
name: portainer
|
||||
namespace: portainer
|
||||
resourceVersion: "17547843"
|
||||
uid: 2471a902-9fad-49af-a56b-9d4173b562c9
|
||||
spec:
|
||||
ingressClassName: haproxy
|
||||
rules:
|
||||
- host: portainer.geesink.org
|
||||
http:
|
||||
paths:
|
||||
- backend:
|
||||
service:
|
||||
name: portainer
|
||||
port:
|
||||
number: 9443
|
||||
path: /
|
||||
pathType: Prefix
|
||||
tls:
|
||||
- hosts:
|
||||
- portainer.geesink.org
|
||||
secretName: portainer-cert-prod
|
||||
status:
|
||||
loadBalancer:
|
||||
ingress:
|
||||
- ip: 10.86.0.100
|
6
portainer/install
Normal file
6
portainer/install
Normal file
@ -0,0 +1,6 @@
|
||||
helm upgrade --install --create-namespace -n portainer portainer portainer/portainer \
|
||||
--set service.type=ClusterIP \
|
||||
--set tls.force=true \
|
||||
--set ingress.enabled=true \
|
||||
--set ingress.ingressClassName=haproxy
|
||||
|
BIN
portainer/portainer-1.0.43.tgz
Normal file
BIN
portainer/portainer-1.0.43.tgz
Normal file
Binary file not shown.
22
portainer/portainer/.helmignore
Normal file
22
portainer/portainer/.helmignore
Normal file
@ -0,0 +1,22 @@
|
||||
# Patterns to ignore when building packages.
|
||||
# This supports shell glob matching, relative path matching, and
|
||||
# negation (prefixed with !). Only one pattern per line.
|
||||
.DS_Store
|
||||
# Common VCS dirs
|
||||
.git/
|
||||
.gitignore
|
||||
.bzr/
|
||||
.bzrignore
|
||||
.hg/
|
||||
.hgignore
|
||||
.svn/
|
||||
# Common backup files
|
||||
*.swp
|
||||
*.bak
|
||||
*.tmp
|
||||
*~
|
||||
# Various IDEs
|
||||
.project
|
||||
.idea/
|
||||
*.tmproj
|
||||
.vscode/
|
14
portainer/portainer/Chart.yaml
Normal file
14
portainer/portainer/Chart.yaml
Normal file
@ -0,0 +1,14 @@
|
||||
apiVersion: v2
|
||||
appVersion: ce-latest-ee-2.18.3
|
||||
description: Helm chart used to deploy the Portainer for Kubernetes
|
||||
home: https://www.portainer.io
|
||||
icon: https://github.com/portainer/portainer/raw/develop/app/assets/ico/apple-touch-icon.png
|
||||
maintainers:
|
||||
- email: platform-team@portainer.io
|
||||
name: Portainer
|
||||
url: https://www.portainer.io
|
||||
name: portainer
|
||||
sources:
|
||||
- https://github.com/portainer/k8s
|
||||
type: application
|
||||
version: 1.0.43
|
92
portainer/portainer/README.md
Normal file
92
portainer/portainer/README.md
Normal file
@ -0,0 +1,92 @@
|
||||
# Deploy Portainer using Helm Chart
|
||||
|
||||
Before proceeding, ensure to create a namespace in advance.
|
||||
For instance:
|
||||
```bash
|
||||
kubectl create namespace portainer
|
||||
```
|
||||
|
||||
# Install the chart repository
|
||||
|
||||
```bash
|
||||
helm repo add portainer https://portainer.github.io/k8s/
|
||||
helm repo update
|
||||
```
|
||||
|
||||
# Testing the Chart
|
||||
Execute the following for testing the chart:
|
||||
|
||||
```bash
|
||||
helm install --dry-run --debug portainer -n portainer deploy/helm/portainer
|
||||
```
|
||||
|
||||
# Installing the Chart
|
||||
Execute the following for installing the chart:
|
||||
|
||||
```bash
|
||||
helm upgrade -i -n portainer portainer portainer/portainer
|
||||
|
||||
## Refer to the output NOTES on how-to access Portainer web
|
||||
## An example is attached below
|
||||
|
||||
NOTES:
|
||||
1. Get the application URL by running these commands:
|
||||
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
|
||||
You can watch the status of by running 'kubectl get --namespace portainer svc -w portainer'
|
||||
|
||||
export SERVICE_IP=$(kubectl get svc --namespace portainer portainer --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}")
|
||||
echo http://$SERVICE_IP:9000
|
||||
http://20.40.176.8:9000
|
||||
```
|
||||
|
||||
# Deleting the Chart
|
||||
Execute the following for deleting the chart:
|
||||
|
||||
```bash
|
||||
## Delete the Helm Chart
|
||||
helm delete -n portainer portainer
|
||||
## Delete the Namespace
|
||||
kubectl delete namespace portainer
|
||||
```
|
||||
|
||||
# Chart Configuration
|
||||
The following table lists the configurable parameters of the Portainer chart and their default values. The values file can be found under `deploy/helm/portainer/values.yaml`.
|
||||
|
||||
*The parameters will be keep updating.*
|
||||
|
||||
| Parameter | Description | Default |
|
||||
| - | - | - |
|
||||
| `replicaCount` | Number of Portainer service replicas (ALWAYS set to 1) | `1` |
|
||||
| `image.repository` | Portainer Docker Hub repository | `portainer/portainer-ce` |
|
||||
| `image.tag` | Tag for the Portainer image | `latest` |
|
||||
| `image.pullPolicy` | Portainer image pulling policy | `IfNotPresent` |
|
||||
| `imagePullSecrets` | If Portainer image requires to be in a private repository | `nil` |
|
||||
| `nodeSelector` | Used to apply a nodeSelector to the deployment | `{}` |
|
||||
| `serviceAccount.annotations` | Annotations to add to the service account | `null` |
|
||||
| `serviceAccount.name` | The name of the service account to use | `portainer-sa-clusteradmin` |
|
||||
| `service.type` | Service Type for the main Portainer Service; ClusterIP, NodePort and LoadBalancer | `LoadBalancer` |
|
||||
| `service.httpPort` | HTTP port for accessing Portainer Web | `9000` |
|
||||
| `service.httpNodePort` | Static NodePort for accessing Portainer Web. Specify only if the type is NodePort | `30777` |
|
||||
| `service.edgePort` | TCP port for accessing Portainer Edge | `8000` |
|
||||
| `service.edgeNodePort` | Static NodePort for accessing Portainer Edge. Specify only if the type is NodePort | `30776` |
|
||||
| `service.annotations` | Annotations to add to the service | `{}` |
|
||||
| `feature.flags` | Enable one or more features separated by spaces. For instance, `--feat=open-amt` | `nil` |
|
||||
| `ingress.enabled` | Create an ingress for Portainer | `false` |
|
||||
| `ingress.ingressClassName` | For Kubernetes >= 1.18 you should specify the ingress-controller via the field `ingressClassName`. For instance, `nginx` | `nil` |
|
||||
| `ingress.annotations` | Annotations to add to the ingress. For instane, `kubernetes.io/ingress.class: nginx` | `{}` |
|
||||
| `ingress.hosts.host` | URL for Portainer Web. For instance, `portainer.example.io` | `nil` |
|
||||
| `ingress.hosts.paths.path` | Path for the Portainer Web. | `/` |
|
||||
| `ingress.hosts.paths.port` | Port for the Portainer Web. | `9000` |
|
||||
| `ingress.tls` | TLS support on ingress. Must create a secret with TLS certificates in advance | `[]` |
|
||||
| `resources` | Portainer resource requests and limits | `{}` |
|
||||
| `tls.force` | Force Portainer to be configured to use TLS only | `false` |
|
||||
| `tls.existingSecret` | Mount the existing TLS secret into the pod | `""` |
|
||||
| `mtls.enable` | Option to specicy mtls Certs to be used by Portainer | `false` |
|
||||
| `mtls.existingSecret` | Mount the existing mtls secret into the pod | `""` |
|
||||
| `persistence.enabled` | Whether to enable data persistence | `true` |
|
||||
| `persistence.existingClaim` | Name of an existing PVC to use for data persistence | `nil` |
|
||||
| `persistence.size` | Size of the PVC used for persistence | `10Gi` |
|
||||
| `persistence.annotations` | Annotations to apply to PVC used for persistence | `{}` |
|
||||
| `persistence.storageClass` | StorageClass to apply to PVC used for persistence | `default` |
|
||||
| `persistence.accessMode` | AccessMode for persistence | `ReadWriteOnce` |
|
||||
| `persistence.selector` | Selector for persistence | `nil` |
|
27
portainer/portainer/templates/NOTES.txt
Normal file
27
portainer/portainer/templates/NOTES.txt
Normal file
@ -0,0 +1,27 @@
|
||||
{{- if .Values.ingress.enabled }}
|
||||
{{- range $host := .Values.ingress.hosts }}
|
||||
{{- range .paths }}
|
||||
Use the URL below to access the application
|
||||
http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ if .port }}:{{ .port }}{{ else }}{{ end }}{{.path}}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- else if contains "NodePort" .Values.service.type }}
|
||||
Get the application URL by running these commands:
|
||||
{{- if .Values.tls.force }}
|
||||
export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "portainer.fullname" . }})
|
||||
{{- else }}
|
||||
export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[1].nodePort}" services {{ include "portainer.fullname" . }})
|
||||
{{- end}}
|
||||
export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
|
||||
echo https://$NODE_IP:$NODE_PORT
|
||||
{{- else if contains "LoadBalancer" .Values.service.type }}
|
||||
Get the application URL by running these commands:
|
||||
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
|
||||
You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "portainer.fullname" . }}'
|
||||
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "portainer.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
|
||||
echo https://$SERVICE_IP:{{ .Values.service.httpsPort }}
|
||||
{{- else if contains "ClusterIP" .Values.service.type }}
|
||||
Get the application URL by running these commands:
|
||||
export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "portainer.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].me$ echo "Visit http://127.0.0.1:9443 to use your application"
|
||||
kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 9443:9443
|
||||
{{- end }}
|
87
portainer/portainer/templates/_helpers.tpl
Normal file
87
portainer/portainer/templates/_helpers.tpl
Normal file
@ -0,0 +1,87 @@
|
||||
{{/* vim: set filetype=mustache: */}}
|
||||
{{/*
|
||||
Expand the name of the chart.
|
||||
*/}}
|
||||
{{- define "portainer.name" -}}
|
||||
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Create a default fully qualified app name.
|
||||
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
||||
If release name contains chart name it will be used as a full name.
|
||||
*/}}
|
||||
{{- define "portainer.fullname" -}}
|
||||
{{- if .Values.fullnameOverride -}}
|
||||
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
|
||||
{{- else -}}
|
||||
{{- $name := default .Chart.Name .Values.nameOverride -}}
|
||||
{{- if contains $name .Release.Name -}}
|
||||
{{- .Release.Name | trunc 63 | trimSuffix "-" -}}
|
||||
{{- else -}}
|
||||
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Create chart name and version as used by the chart label.
|
||||
*/}}
|
||||
{{- define "portainer.chart" -}}
|
||||
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Common labels
|
||||
*/}}
|
||||
{{- define "portainer.labels" -}}
|
||||
helm.sh/chart: {{ include "portainer.chart" . }}
|
||||
{{ include "portainer.selectorLabels" . }}
|
||||
{{- if .Chart.AppVersion }}
|
||||
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
|
||||
{{- end }}
|
||||
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Selector labels
|
||||
*/}}
|
||||
{{- define "portainer.selectorLabels" -}}
|
||||
app.kubernetes.io/name: {{ include "portainer.name" . }}
|
||||
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Create the name of the service account to use
|
||||
*/}}
|
||||
{{- define "portainer.serviceAccountName" -}}
|
||||
{{- if .Values.serviceAccount.create -}}
|
||||
{{ default (include "portainer.fullname" .) .Values.serviceAccount.name }}
|
||||
{{- else -}}
|
||||
{{ default "default" .Values.serviceAccount.name }}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Provide a pre-defined claim or a claim based on the Release
|
||||
*/}}
|
||||
{{- define "portainer.pvcName" -}}
|
||||
{{- if .Values.persistence.existingClaim }}
|
||||
{{- .Values.persistence.existingClaim }}
|
||||
{{- else -}}
|
||||
{{- template "portainer.fullname" . }}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Generate a right Ingress apiVersion
|
||||
*/}}
|
||||
{{- define "ingress.apiVersion" -}}
|
||||
{{- if semverCompare ">=1.20-0" .Capabilities.KubeVersion.GitVersion -}}
|
||||
networking.k8s.io/v1
|
||||
{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
|
||||
networking.k8s.io/v1beta1
|
||||
{{- else -}}
|
||||
extensions/v1
|
||||
{{- end }}
|
||||
{{- end -}}
|
193
portainer/portainer/templates/deployment.yaml
Normal file
193
portainer/portainer/templates/deployment.yaml
Normal file
@ -0,0 +1,193 @@
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: {{ include "portainer.fullname" . }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
io.portainer.kubernetes.application.stack: portainer
|
||||
{{- include "portainer.labels" . | nindent 4 }}
|
||||
spec:
|
||||
replicas: {{ .Values.replicaCount }}
|
||||
strategy:
|
||||
type: "Recreate"
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "portainer.selectorLabels" . | nindent 6 }}
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
{{- include "portainer.selectorLabels" . | nindent 8 }}
|
||||
spec:
|
||||
nodeSelector: {{- toYaml .Values.nodeSelector | nindent 8 -}}
|
||||
{{- with .Values.imagePullSecrets }}
|
||||
imagePullSecrets:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
serviceAccountName: {{ include "portainer.serviceAccountName" . }}
|
||||
volumes:
|
||||
{{- if .Values.persistence.enabled }}
|
||||
- name: "data"
|
||||
persistentVolumeClaim:
|
||||
claimName: {{ template "portainer.pvcName" . }}
|
||||
{{- end }}
|
||||
{{- if .Values.tls.existingSecret }}
|
||||
- name: certs
|
||||
secret:
|
||||
secretName: {{ .Values.tls.existingSecret }}
|
||||
{{- end }}
|
||||
{{- if .Values.mtls.existingSecret }}
|
||||
- name: mtlscerts
|
||||
secret:
|
||||
secretName: {{ .Values.mtls.existingSecret }}
|
||||
{{- end }}
|
||||
containers:
|
||||
- name: {{ .Chart.Name }}
|
||||
{{- if .Values.enterpriseEdition.enabled }}
|
||||
image: "{{ .Values.enterpriseEdition.image.repository }}:{{ .Values.enterpriseEdition.image.tag }}"
|
||||
imagePullPolicy: {{ .Values.enterpriseEdition.image.pullPolicy }}
|
||||
{{- else }}
|
||||
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
|
||||
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||
{{- end }}
|
||||
args:
|
||||
{{- if .Values.tls.force }}
|
||||
- --http-disabled
|
||||
{{- end }}
|
||||
{{- if .Values.tls.existingSecret }}
|
||||
- --sslcert=/certs/tls.crt
|
||||
- --sslkey=/certs/tls.key
|
||||
{{- end }}
|
||||
{{- if .Values.mtls.existingSecret }}
|
||||
- --mtlscacert=/certs/mtls/mtlsca.crt
|
||||
- --mtlscert=/certs/mtls/mtlscert.crt
|
||||
- --mtlskey=/certs/mtls/mtlskey.key
|
||||
{{- end }}
|
||||
{{- if (and (eq .Values.service.type "NodePort") (not (empty .Values.service.edgeNodePort))) }}
|
||||
- '--tunnel-port={{ .Values.service.edgeNodePort }}'
|
||||
{{- end }}
|
||||
{{- if (not (empty .Values.feature.flags)) }}
|
||||
- '{{ .Values.feature.flags }}'
|
||||
{{- end }}
|
||||
volumeMounts:
|
||||
{{- if .Values.persistence.enabled }}
|
||||
- name: data
|
||||
mountPath: /data
|
||||
{{- end }}
|
||||
{{- if .Values.tls.existingSecret }}
|
||||
- name: certs
|
||||
mountPath: /certs
|
||||
readOnly: true
|
||||
{{- end }}
|
||||
{{- if .Values.mtls.existingSecret }}
|
||||
- name: mtlscerts
|
||||
mountPath: /certs/mtls
|
||||
readOnly: true
|
||||
{{- end }}
|
||||
ports:
|
||||
{{- if not .Values.tls.force }}
|
||||
- name: http
|
||||
containerPort: 9000
|
||||
protocol: TCP
|
||||
{{- end }}
|
||||
- name: https
|
||||
containerPort: 9443
|
||||
protocol: TCP
|
||||
- name: tcp-edge
|
||||
containerPort: 8000
|
||||
protocol: TCP
|
||||
livenessProbe:
|
||||
failureThreshold: 3
|
||||
initialDelaySeconds: 45
|
||||
httpGet:
|
||||
path: /
|
||||
{{- if .Values.tls.force }}
|
||||
port: 9443
|
||||
scheme: HTTPS
|
||||
{{- else }}
|
||||
{{- if .Values.enterpriseEdition.enabled }}
|
||||
{{- if regexMatch "^[0-9]+\\.[0-9]+\\.[0-9]+$" .Values.enterpriseEdition.image.tag }}
|
||||
{{- if eq (semver .Values.enterpriseEdition.image.tag | (semver "2.7.0").Compare) -1 }}
|
||||
port: 9443
|
||||
scheme: HTTPS
|
||||
{{- else }}
|
||||
port: 9000
|
||||
scheme: HTTP
|
||||
{{- end }}
|
||||
{{- else }}
|
||||
{{- if eq .Values.enterpriseEdition.image.tag "latest" }}
|
||||
port: 9443
|
||||
scheme: HTTPS
|
||||
{{- else }}
|
||||
port: 9000
|
||||
scheme: HTTP
|
||||
{{- end }}
|
||||
{{- end}}
|
||||
{{- else }}
|
||||
{{- if regexMatch "^[0-9]+\\.[0-9]+\\.[0-9]+$" .Values.image.tag }}
|
||||
{{- if eq (semver .Values.image.tag | (semver "2.6.0").Compare) -1 }}
|
||||
port: 9443
|
||||
scheme: HTTPS
|
||||
{{- else }}
|
||||
port: 9000
|
||||
scheme: HTTP
|
||||
{{- end}}
|
||||
{{- else }}
|
||||
{{- if eq .Values.image.tag "latest" }}
|
||||
port: 9443
|
||||
scheme: HTTPS
|
||||
{{- else }}
|
||||
port: 9000
|
||||
scheme: HTTP
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
readinessProbe:
|
||||
failureThreshold: 3
|
||||
initialDelaySeconds: 45
|
||||
httpGet:
|
||||
path: /
|
||||
{{- if .Values.tls.force }}
|
||||
port: 9443
|
||||
scheme: HTTPS
|
||||
{{- else }}
|
||||
{{- if .Values.enterpriseEdition.enabled }}
|
||||
{{- if regexMatch "^[0-9]+\\.[0-9]+\\.[0-9]+$" .Values.enterpriseEdition.image.tag }}
|
||||
{{- if eq (semver .Values.enterpriseEdition.image.tag | (semver "2.7.0").Compare) -1 }}
|
||||
port: 9443
|
||||
scheme: HTTPS
|
||||
{{- else }}
|
||||
port: 9000
|
||||
scheme: HTTP
|
||||
{{- end }}
|
||||
{{- else }}
|
||||
{{- if eq .Values.enterpriseEdition.image.tag "latest" }}
|
||||
port: 9443
|
||||
scheme: HTTPS
|
||||
{{- else }}
|
||||
port: 9000
|
||||
scheme: HTTP
|
||||
{{- end }}
|
||||
{{- end}}
|
||||
{{- else }}
|
||||
{{- if regexMatch "^[0-9]+\\.[0-9]+\\.[0-9]+$" .Values.image.tag }}
|
||||
{{- if eq (semver .Values.image.tag | (semver "2.6.0").Compare) -1 }}
|
||||
port: 9443
|
||||
scheme: HTTPS
|
||||
{{- else }}
|
||||
port: 9000
|
||||
scheme: HTTP
|
||||
{{- end}}
|
||||
{{- else }}
|
||||
{{- if eq .Values.image.tag "latest" }}
|
||||
port: 9443
|
||||
scheme: HTTPS
|
||||
{{- else }}
|
||||
port: 9000
|
||||
scheme: HTTP
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
resources:
|
||||
{{- toYaml .Values.resources | nindent 12 }}
|
60
portainer/portainer/templates/ingress.yaml
Normal file
60
portainer/portainer/templates/ingress.yaml
Normal file
@ -0,0 +1,60 @@
|
||||
{{- if .Values.ingress.enabled -}}
|
||||
{{- $fullName := include "portainer.fullname" . -}}
|
||||
{{- $tlsforced := .Values.tls.force -}}
|
||||
{{- $apiVersion := include "ingress.apiVersion" . -}}
|
||||
apiVersion: {{ $apiVersion }}
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: {{ $fullName }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "portainer.labels" . | nindent 4 }}
|
||||
{{- with .Values.ingress.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
{{- with .Values.ingress.ingressClassName }}
|
||||
ingressClassName: {{ . }}
|
||||
{{- end }}
|
||||
{{- if .Values.ingress.tls }}
|
||||
tls:
|
||||
{{- range .Values.ingress.tls }}
|
||||
- hosts:
|
||||
{{- range .hosts }}
|
||||
- {{ . | quote }}
|
||||
{{- end }}
|
||||
secretName: {{ .secretName }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
rules:
|
||||
{{- range .Values.ingress.hosts }}
|
||||
- host: {{ .host | quote }}
|
||||
http:
|
||||
paths:
|
||||
{{- range .paths }}
|
||||
- path: {{ .path | default "/" }}
|
||||
{{- if eq $apiVersion "networking.k8s.io/v1" }}
|
||||
pathType: Prefix
|
||||
{{- end }}
|
||||
backend:
|
||||
{{- if eq $apiVersion "networking.k8s.io/v1" }}
|
||||
service:
|
||||
name: {{ $fullName }}
|
||||
port:
|
||||
{{- if $tlsforced }}
|
||||
number: {{ .port | default 9443 }}
|
||||
{{- else }}
|
||||
number: {{ .port | default 9000 }}
|
||||
{{- end }}
|
||||
{{- else }}
|
||||
serviceName: {{ $fullName }}
|
||||
{{- if $tlsforced }}
|
||||
servicePort: {{ .port | default 9443 }}
|
||||
{{- else }}
|
||||
servicePort: {{ .port | default 9000 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
6
portainer/portainer/templates/namespace.yaml
Normal file
6
portainer/portainer/templates/namespace.yaml
Normal file
@ -0,0 +1,6 @@
|
||||
{{ if .Values.createNamespace }}
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: portainer
|
||||
{{ end }}
|
32
portainer/portainer/templates/pvc.yaml
Normal file
32
portainer/portainer/templates/pvc.yaml
Normal file
@ -0,0 +1,32 @@
|
||||
{{- if .Values.persistence.enabled -}}
|
||||
{{- if not .Values.persistence.existingClaim -}}
|
||||
---
|
||||
kind: "PersistentVolumeClaim"
|
||||
apiVersion: "v1"
|
||||
metadata:
|
||||
name: {{ template "portainer.fullname" . }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
annotations:
|
||||
{{- if .Values.persistence.storageClass }}
|
||||
volume.beta.kubernetes.io/storage-class: {{ .Values.persistence.storageClass | quote }}
|
||||
{{- else }}
|
||||
volume.alpha.kubernetes.io/storage-class: "generic"
|
||||
{{- end }}
|
||||
{{- if .Values.persistence.annotations }}
|
||||
{{ toYaml .Values.persistence.annotations | indent 2 }}
|
||||
{{ end }}
|
||||
labels:
|
||||
io.portainer.kubernetes.application.stack: portainer
|
||||
{{- include "portainer.labels" . | nindent 4 }}
|
||||
spec:
|
||||
accessModes:
|
||||
- {{ default "ReadWriteOnce" .Values.persistence.accessMode | quote }}
|
||||
resources:
|
||||
requests:
|
||||
storage: {{ .Values.persistence.size | quote }}
|
||||
{{- if .Values.persistence.selector }}
|
||||
selector:
|
||||
{{ toYaml .Values.persistence.selector | indent 4 }}
|
||||
{{ end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
14
portainer/portainer/templates/rbac.yaml
Normal file
14
portainer/portainer/templates/rbac.yaml
Normal file
@ -0,0 +1,14 @@
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRoleBinding
|
||||
metadata:
|
||||
name: {{ include "portainer.fullname" . }}
|
||||
labels:
|
||||
{{- include "portainer.labels" . | nindent 4 }}
|
||||
roleRef:
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
kind: ClusterRole
|
||||
name: cluster-admin
|
||||
subjects:
|
||||
- kind: ServiceAccount
|
||||
namespace: {{ .Release.Namespace }}
|
||||
name: {{ include "portainer.serviceAccountName" . }}
|
47
portainer/portainer/templates/service.yaml
Normal file
47
portainer/portainer/templates/service.yaml
Normal file
@ -0,0 +1,47 @@
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ include "portainer.fullname" . }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
io.portainer.kubernetes.application.stack: portainer
|
||||
{{- include "portainer.labels" . | nindent 4 }}
|
||||
{{- if .Values.service.annotations }}
|
||||
annotations:
|
||||
{{- range $key, $value := .Values.service.annotations }}
|
||||
{{ $key }}: {{ $value | quote }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
spec:
|
||||
type: {{ .Values.service.type }}
|
||||
ports:
|
||||
{{- if not .Values.tls.force }}
|
||||
- port: {{ .Values.service.httpPort }}
|
||||
targetPort: 9000
|
||||
protocol: TCP
|
||||
name: http
|
||||
{{- if (and (eq .Values.service.type "NodePort") (not (empty .Values.service.httpNodePort))) }}
|
||||
nodePort: {{ .Values.service.httpNodePort}}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
- port: {{ .Values.service.httpsPort }}
|
||||
targetPort: 9443
|
||||
protocol: TCP
|
||||
name: https
|
||||
{{- if (and (eq .Values.service.type "NodePort") (not (empty .Values.service.httpsNodePort))) }}
|
||||
nodePort: {{ .Values.service.httpsNodePort}}
|
||||
{{- end }}
|
||||
{{- if (eq .Values.service.type "NodePort") }}
|
||||
- port: {{ .Values.service.edgeNodePort }}
|
||||
targetPort: {{ .Values.service.edgeNodePort }}
|
||||
{{- else }}
|
||||
- port: {{ .Values.service.edgePort }}
|
||||
targetPort: {{ .Values.service.edgePort }}
|
||||
{{- end }}
|
||||
protocol: TCP
|
||||
name: edge
|
||||
{{- if (and (eq .Values.service.type "NodePort") (not (empty .Values.service.edgeNodePort))) }}
|
||||
nodePort: {{ .Values.service.edgeNodePort }}
|
||||
{{- end }}
|
||||
selector:
|
||||
{{- include "portainer.selectorLabels" . | nindent 4 }}
|
11
portainer/portainer/templates/serviceaccount.yaml
Normal file
11
portainer/portainer/templates/serviceaccount.yaml
Normal file
@ -0,0 +1,11 @@
|
||||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
name: {{ include "portainer.serviceAccountName" . }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "portainer.labels" . | nindent 4 }}
|
||||
{{- with .Values.serviceAccount.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
18
portainer/portainer/templates/tests/test-connection.yaml
Normal file
18
portainer/portainer/templates/tests/test-connection.yaml
Normal file
@ -0,0 +1,18 @@
|
||||
{{- if not .Values.disableTest -}}
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: "{{ include "portainer.fullname" . }}-test-connection"
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "portainer.labels" . | nindent 4 }}
|
||||
annotations:
|
||||
"helm.sh/hook": test
|
||||
spec:
|
||||
containers:
|
||||
- name: wget
|
||||
image: busybox
|
||||
command: ['wget']
|
||||
args: ['{{ include "portainer.fullname" . }}:{{ .Values.service.httpPort }}']
|
||||
restartPolicy: Never
|
||||
{{ end }}
|
77
portainer/portainer/values.yaml
Normal file
77
portainer/portainer/values.yaml
Normal file
@ -0,0 +1,77 @@
|
||||
# Default values for portainer.
|
||||
# This is a YAML-formatted file.
|
||||
# Declare variables to be passed into your templates.
|
||||
|
||||
replicaCount: 1
|
||||
|
||||
# If enterpriseEdition is enabled, then use the values below _instead_ of those in .image
|
||||
enterpriseEdition:
|
||||
enabled: false
|
||||
image:
|
||||
repository: portainer/portainer-ee
|
||||
tag: 2.18.3
|
||||
pullPolicy: Always
|
||||
|
||||
image:
|
||||
repository: portainer/portainer-ce
|
||||
tag: 2.18.3
|
||||
pullPolicy: Always
|
||||
|
||||
imagePullSecrets: []
|
||||
|
||||
nodeSelector: {}
|
||||
|
||||
serviceAccount:
|
||||
annotations: {}
|
||||
name: portainer-sa-clusteradmin
|
||||
|
||||
service:
|
||||
# Set the httpNodePort and edgeNodePort only if the type is NodePort
|
||||
# For Ingress, set the type to be ClusterIP and set ingress.enabled to true
|
||||
# For Cloud Providers, set the type to be LoadBalancer
|
||||
type: NodePort
|
||||
httpPort: 9000
|
||||
httpsPort: 9443
|
||||
httpNodePort: 30777
|
||||
httpsNodePort: 30779
|
||||
edgePort: 8000
|
||||
edgeNodePort: 30776
|
||||
annotations: {}
|
||||
|
||||
tls:
|
||||
# If set, Portainer will be configured to use TLS only
|
||||
force: false
|
||||
# If set, will mount the existing secret into the pod
|
||||
existingSecret: ""
|
||||
|
||||
mtls:
|
||||
# If set, Portainer will be configured to use mTLS only
|
||||
enable: false
|
||||
# If set, will mount the existing secret into the pod
|
||||
existingSecret: ""
|
||||
|
||||
feature:
|
||||
flags: ""
|
||||
|
||||
ingress:
|
||||
enabled: false
|
||||
ingressClassName: ""
|
||||
annotations: {}
|
||||
# kubernetes.io/ingress.class: nginx
|
||||
# Only use below if tls.force=true
|
||||
# nginx.ingress.kubernetes.io/backend-protocol: HTTPS
|
||||
# Note: Hosts and paths are of type array
|
||||
hosts:
|
||||
- host:
|
||||
paths: []
|
||||
# - path: "/"
|
||||
tls: []
|
||||
|
||||
resources: {}
|
||||
|
||||
persistence:
|
||||
enabled: true
|
||||
size: "10Gi"
|
||||
annotations: {}
|
||||
storageClass:
|
||||
existingClaim:
|
81
portainer/values.yaml
Normal file
81
portainer/values.yaml
Normal file
@ -0,0 +1,81 @@
|
||||
# Default values for portainer.
|
||||
# This is a YAML-formatted file.
|
||||
# Declare variables to be passed into your templates.
|
||||
|
||||
replicaCount: 1
|
||||
|
||||
# If enterpriseEdition is enabled, then use the values below _instead_ of those in .image
|
||||
enterpriseEdition:
|
||||
enabled: true
|
||||
image:
|
||||
repository: portainer/portainer-ee
|
||||
tag: 2.18.3
|
||||
pullPolicy: Always
|
||||
|
||||
image:
|
||||
repository: portainer/portainer-ce
|
||||
tag: 2.18.3
|
||||
pullPolicy: Always
|
||||
|
||||
imagePullSecrets: []
|
||||
|
||||
nodeSelector: {}
|
||||
|
||||
serviceAccount:
|
||||
annotations: {}
|
||||
name: portainer-sa-clusteradmin
|
||||
|
||||
service:
|
||||
# Set the httpNodePort and edgeNodePort only if the type is NodePort
|
||||
# For Ingress, set the type to be ClusterIP and set ingress.enabled to true
|
||||
# For Cloud Providers, set the type to be LoadBalancer
|
||||
type: ClusterIP
|
||||
httpPort: 9000
|
||||
httpsPort: 9443
|
||||
annotations:
|
||||
haproxy.org/server-ssl: "true"
|
||||
|
||||
|
||||
tls:
|
||||
# If set, Portainer will be configured to use TLS only
|
||||
force: true
|
||||
# If set, will mount the existing secret into the pod
|
||||
existingSecret: ""
|
||||
|
||||
mtls:
|
||||
# If set, Portainer will be configured to use mTLS only
|
||||
enable: false
|
||||
# If set, will mount the existing secret into the pod
|
||||
existingSecret: ""
|
||||
|
||||
feature:
|
||||
flags: ""
|
||||
|
||||
ingress:
|
||||
enabled: true
|
||||
ingressClassName: haproxy
|
||||
annotations:
|
||||
cert-manager.io/cluster-issuer: letsencrypt-prod
|
||||
kubernetes.io/ingress.class: haproxy
|
||||
|
||||
# kubernetes.io/ingress.class: nginx
|
||||
# Only use below if tls.force=true
|
||||
# nginx.ingress.kubernetes.io/backend-protocol: HTTPS
|
||||
# Note: Hosts and paths are of type array
|
||||
hosts:
|
||||
- host: portainer.geesink.org
|
||||
paths:
|
||||
- path: "/"
|
||||
tls:
|
||||
- hosts:
|
||||
- portainer.geesink.org
|
||||
secretName: portainer-cert-prod
|
||||
|
||||
resources: {}
|
||||
|
||||
persistence:
|
||||
enabled: true
|
||||
size: "10Gi"
|
||||
annotations: {}
|
||||
storageClass:
|
||||
existingClaim:
|
15
portainer/values.yaml.old
Normal file
15
portainer/values.yaml.old
Normal file
@ -0,0 +1,15 @@
|
||||
USER-SUPPLIED VALUES:
|
||||
enterpriseEdition:
|
||||
enabled: true
|
||||
ingress:
|
||||
annotations:
|
||||
kubernetes.io/ingress.class: haproxy
|
||||
enabled: true
|
||||
hosts:
|
||||
- host: portainer.geesink.org
|
||||
paths:
|
||||
- path: '"/"'
|
||||
service:
|
||||
type: ClusterIP
|
||||
tls:
|
||||
force: true
|
15
portainer/values2.yaml
Normal file
15
portainer/values2.yaml
Normal file
@ -0,0 +1,15 @@
|
||||
USER-SUPPLIED VALUES:
|
||||
enterpriseEdition:
|
||||
enabled: true
|
||||
ingress:
|
||||
annotations:
|
||||
kubernetes.io/ingress.class: haproxy
|
||||
enabled: true
|
||||
hosts:
|
||||
- host: portainer.geesink.org
|
||||
paths:
|
||||
- path: '"/"'
|
||||
service:
|
||||
type: ClusterIP
|
||||
tls:
|
||||
force: true
|
41
postgres_backup/job.yml
Normal file
41
postgres_backup/job.yml
Normal file
@ -0,0 +1,41 @@
|
||||
apiVersion: batch/v1
|
||||
kind: Job
|
||||
metadata:
|
||||
name: mysql-backup
|
||||
spec:
|
||||
template:
|
||||
spec:
|
||||
containers:
|
||||
- name: mysql-backup
|
||||
image: mariadb:latest
|
||||
command: [ "/bin/sh" ]
|
||||
args: [ "-c", "sleep 3600" ]
|
||||
env:
|
||||
- name: MYSQL_HOST
|
||||
value: galera-mariadb-galera
|
||||
- name: MYSQL_USER
|
||||
value: backupuser
|
||||
- name: MYSQL_PASSWORD
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: backupscrets
|
||||
key: backupsecret
|
||||
volumeMounts:
|
||||
- name: backup-volume
|
||||
mountPath: /backup
|
||||
subPath: mysql
|
||||
- name: backup-script
|
||||
mountPath: /backup-script.sh
|
||||
subPath: backup-script.sh
|
||||
readOnly: true
|
||||
restartPolicy: OnFailure
|
||||
volumes:
|
||||
- name: backup-volume
|
||||
nfs:
|
||||
server: 192.168.86.86
|
||||
path: /volume1/backupk8s
|
||||
- name: backup-script
|
||||
configMap:
|
||||
name: backup-script
|
||||
backoffLimit: 1
|
||||
|
13
postgres_backup/pv_nas.yml
Normal file
13
postgres_backup/pv_nas.yml
Normal file
@ -0,0 +1,13 @@
|
||||
apiVersion: v1
|
||||
kind: PersistentVolume
|
||||
metadata:
|
||||
name: nfs-backup-mysql
|
||||
spec:
|
||||
capacity:
|
||||
storage: 1Mi
|
||||
accessModes:
|
||||
- ReadWriteMany
|
||||
nfs:
|
||||
server: 192.168.86.86
|
||||
path: "/volume1/backupk8s/mysql/"
|
||||
storageClassName: nfs
|
45
postgres_backup/script.sh
Normal file
45
postgres_backup/script.sh
Normal file
@ -0,0 +1,45 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Set default values
|
||||
PG_USER=${PG_USER:-postgres}
|
||||
PG_PASSWORD=${PG_PASSWORD:-postgres}
|
||||
PG_HOST=${PG_HOST:-localhost}
|
||||
PG_PORT=${PG_PORT:-5432}
|
||||
|
||||
# Set backup directory
|
||||
BACKUP_DIR="/data/backups/postgres"
|
||||
|
||||
# Generate backup timestamp with format "YYYY-MM-DD_HH-MM-SS"
|
||||
TIMESTAMP=$(date +"%Y-%m-%d_%H-%M-%S")
|
||||
|
||||
# Set backup file name with timestamp
|
||||
BACKUP_FILE="${BACKUP_DIR}/pg_dump_all_${TIMESTAMP}.sql.gz"
|
||||
|
||||
# Dump all databases to backup file
|
||||
pg_dumpall --clean --if-exists --dbname=postgres --username="${PG_USER}" --host="${PG_HOST}" --port="${PG_PORT}" | gzip >"${BACKUP_FILE}"
|
||||
|
||||
# Set retention periods
|
||||
WEEKLY_THRESHOLD=$(date --date="-1 week" +"%s")
|
||||
MONTHLY_THRESHOLD=$(date --date="-1 month" +"%s")
|
||||
YEARLY_THRESHOLD=$(date --date="-1 year" +"%s")
|
||||
|
||||
# Rename backups that are old enough to weekly, monthly, or yearly
|
||||
find $BACKUP_DIR -maxdepth 1 -type f -name "*.gz" -not -name "*weekly*" \
|
||||
-not -name "*monthly*" -not -name "*yearly*" \
|
||||
-mtime +7 -mtime -28 -exec mv -f {} ${BACKUP_DIR}/pg_dump_all_weekly.sql.gz \; # move daily backups older than 7 days to weekly backups
|
||||
find $BACKUP_DIR -maxdepth 1 -type f -name "*.gz" -not -name "*monthly*" \
|
||||
-not -name "*yearly*" -mtime +28 -mtime -365 \
|
||||
-exec mv -f {} ${BACKUP_DIR}/pg_dump_all_monthly.sql.gz \; # move weekly backups older than 28 days to monthly backups
|
||||
find $BACKUP_DIR -maxdepth 1 -type f -name "*.gz" -not -name "*yearly*" \
|
||||
-mtime +365 -exec mv -f {} ${BACKUP_DIR}/pg_dump_all_yearly.sql.gz \; # move monthly backups older than 365 days to yearly backups
|
||||
|
||||
# Clean up backups older than retention periods
|
||||
find $BACKUP_DIR -maxdepth 1 -type f -name "*.gz" \
|
||||
-mtime +7 -mtime -28 -not -name "*weekly*" -not -name "*monthly*" -exec rm -f {} + # remove daily backups older than 7 days but exclude those that are weekly or monthly backups
|
||||
find $BACKUP_DIR -maxdepth 1 -type f -name "*.gz" \
|
||||
-mtime +28 -mtime -365 -not -name "*monthly*" -not -name "*yearly*" -exec rm -f {} + # remove weekly backups older than 28 days but exclude those that are monthly or yearly backups
|
||||
find $BACKUP_DIR -maxdepth 1 -type f -name "*.gz" \
|
||||
-mtime +365 -not -name "*yearly*" -exec rm -f {} + # remove monthly backups older than 365 days but exclude those that are yearly backups
|
||||
|
||||
# Print confirmation message
|
||||
echo "Done. Backup file: ${BACKUP_FILE}"
|
Loading…
Reference in New Issue
Block a user