GHP publish
This commit is contained in:
commit
b4b740a239
10
ansible.cfg
Normal file
10
ansible.cfg
Normal file
@ -0,0 +1,10 @@
|
||||
[defaults]
|
||||
host_key_checking = False
|
||||
pipelining = True
|
||||
callback_whitelist = timer, profile_tasks
|
||||
forks = 50
|
||||
roles_path = roles
|
||||
|
||||
[ssh_connection]
|
||||
pipelining = True
|
||||
ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o UserKnownHostsFile=/dev/null
|
128
inventory/ghp/sample/group_vars/all/all.yaml
Normal file
128
inventory/ghp/sample/group_vars/all/all.yaml
Normal file
@ -0,0 +1,128 @@
|
||||
# Common #
|
||||
namespace: ghp
|
||||
docker_registry: registry.ghp.0xace.cc
|
||||
domain: example.com
|
||||
mail_domain: "{{ domain }}"
|
||||
local_domain: lan
|
||||
dns_ip: YOUR_RFC2136_DNS_IP
|
||||
mail_proxy_public_ip: PUBLIC_VPS_IP
|
||||
mail_proxy_private_ip: "{{ dns_ip }}"
|
||||
web_proxy_internal_ip: INTERNAL_VPS_IP
|
||||
|
||||
# Core infrastructure #
|
||||
## Nginx Ingress ##
|
||||
### Internal ###
|
||||
internal_ingress_class: "ghp-internal-nginx"
|
||||
internal_loadbalancer_ip: "192.168.250.0"
|
||||
### External ###
|
||||
internal_ingress_class: "ghp-external-nginx"
|
||||
external_loadbalancer_ip: "192.168.250.10"
|
||||
### Local ###
|
||||
internal_ingress_class: "ghp-local-nginx"
|
||||
local_loadbalancer_ip: "192.168.250.20"
|
||||
|
||||
## External-dns ##
|
||||
dns_namespace: dns
|
||||
|
||||
# Shared infrastructure #
|
||||
## PostgreSQL ##
|
||||
postgres_enable: true
|
||||
postgres_db_namespace: "{{ namespace }}"
|
||||
|
||||
## OpenLDAP ##
|
||||
openldap_enabled: true
|
||||
#openldap_size: "10Gi"
|
||||
#openldap_storage: "nfs-ssd"
|
||||
openldap_loadbalancer_ip: "192.168.250.2"
|
||||
openldap_domain: "dc=example,dc=com"
|
||||
openldap_custom_users:
|
||||
- { name: myuser1 }
|
||||
- { name: myuser2 }
|
||||
openldap_simple_users:
|
||||
- { name: testuser1, sn: 6001, uid: 6001, gid: 6001 }
|
||||
- { name: testuser2, sn: 6002, uid: 6002, gid: 6002 }
|
||||
|
||||
## Docker-registry ##
|
||||
registry_enabled: true
|
||||
#registry_size: "100Gi"
|
||||
#registry_storage: "nfs-hdd"
|
||||
registry_publish: false
|
||||
|
||||
## ChartMuseum ##
|
||||
chartmuseum_enabled: true
|
||||
#chartmuseum_size: "10Gi"
|
||||
#chartmuseum_storage: "nfs-hdd"
|
||||
#chartmuseum_publish: false
|
||||
#chartmuseum_login: admin
|
||||
#chartmuseum_pass:
|
||||
|
||||
# End User Applications #
|
||||
## Email ##
|
||||
mail_enabled: true
|
||||
#mailbox_size: "50Gi"
|
||||
#mailbox_storage: "nfs-hdd"
|
||||
roundcube_enabled: true
|
||||
roundcube_publish: false
|
||||
postfix_loadbalancer_ip: "192.168.250.3"
|
||||
dovecot_loadbalancer_ip: "192.168.250.4"
|
||||
|
||||
## Nextcloud ##
|
||||
nextcloud_enabled: true
|
||||
#nextcloud_size: "20Gi"
|
||||
#nextcloud_storage: "nfs-ssd"
|
||||
#nextcloud_pass:
|
||||
#nextcloud_mail_pass:
|
||||
nextcloud_publish: true
|
||||
|
||||
## Bitwarden Password Manager ##
|
||||
bitwarden_enabled: true
|
||||
#bitwarden_size: "8Gi"
|
||||
#bitwarden_storage: "nfs-ssd"
|
||||
#bitwarden_smtp_pass:
|
||||
bitwarden_publish: false
|
||||
|
||||
## Gitea ##
|
||||
gitea_enabled: true
|
||||
#gitea_size: "20Gi"
|
||||
#gitea_storage: "nfs-ssd"
|
||||
#gitea_lfs: true
|
||||
#gitea_lfs_size: "50Gi"
|
||||
#gitea_lfs_storage: "nfs-hdd"
|
||||
gitea_publish_web: false
|
||||
gitea_publish_ssh: false
|
||||
gitea_loadbalancer_ip: "192.168.250.5"
|
||||
|
||||
## Drone ##
|
||||
drone_enabled: true
|
||||
#drone_size: "10Gi"
|
||||
#drone_storage: "nfs-ssd"
|
||||
#drone_gitea_client_id:
|
||||
#drone_gitea_client_secret:
|
||||
drone_publish: false
|
||||
|
||||
### WikiJS ###
|
||||
wikijs_enabled: true
|
||||
wikijs_publish: false
|
||||
|
||||
### Playmaker ###
|
||||
playmaker_enabled: false
|
||||
playmaker_publish: false
|
||||
|
||||
### Pypiserver ###
|
||||
pypiserver_enabled: false
|
||||
pypiserver_publish: false
|
||||
|
||||
### PeerTube ###
|
||||
peertube_enabled: false
|
||||
peertube_publish: false
|
||||
#peertube_size: "100Gi"
|
||||
#peertube_storage: "nfs-hdd"
|
||||
|
||||
### Adguard Home ###
|
||||
adguard_enabled: false
|
||||
adguard_publish: false
|
||||
adguard_loadbalancer_ip: "192.168.250.6"
|
||||
#adguard_config_size: "20Mi"
|
||||
#adguard_config_storage: "nfs-ssd"
|
||||
#adguard_work_size: "10Gi"
|
||||
#adguard_work_storage: "nfs-ssd"
|
0
inventory/ghp/sample/group_vars/all/passwords.yaml
Normal file
0
inventory/ghp/sample/group_vars/all/passwords.yaml
Normal file
36
inventory/ghp/sample/group_vars/ddclient.yaml
Normal file
36
inventory/ghp/sample/group_vars/ddclient.yaml
Normal file
@ -0,0 +1,36 @@
|
||||
ddclient_conf: |
|
||||
daemon=300
|
||||
syslog=yes
|
||||
mail-failure=root
|
||||
pid=/var/run/ddclient/ddclient.pid
|
||||
ssl=yes
|
||||
debug=yes
|
||||
verbose=yes
|
||||
|
||||
{% for host in ddclient_hosts %}
|
||||
{% if host != 'omitme' %}
|
||||
use=web
|
||||
web=checkip.dyndns.org
|
||||
protocol=nsupdate
|
||||
server={{ external_dns_ip | default(dns_ip) }}
|
||||
login=/usr/bin/nsupdate
|
||||
password=/config/Kvps.key
|
||||
zone={{ domain }}
|
||||
ttl=60
|
||||
{{ host }}
|
||||
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
|
||||
ddclient_hosts:
|
||||
- "{% if nextcloud_publish | default(false) %}nextcloud.{{ domain }}{% else %}omitme{% endif %}"
|
||||
- "{% if drone_publish | default(false) %}drone.{{ domain }}{% else %}omitme{% endif %}"
|
||||
- "{% if gitea_publish | default(false) %}gitea.{{ domain }}{% else %}omitme{% endif %}"
|
||||
- "{% if bitwarden_publish | default(false) %}bitwarden.{{ domain }}{% else %}omitme{% endif %}"
|
||||
- "{% if wikijs_publish | default(false) %}wikijs.{{ domain }}{% else %}omitme{% endif %}"
|
||||
- "{% if chartmuseum_publish | default(false) %}charts.{{ domain }}{% else %}omitme{% endif %}"
|
||||
- "{% if registry_publish | default(false) %}registry.{{ domain }}{% else %}omitme{% endif %}"
|
||||
- "{% if peertube_publish | default(false) %}peertube.{{ domain }}{% else %}omitme{% endif %}"
|
||||
- "{{ registry_readonly_ingress | default('omitme') }}"
|
||||
- "{{ chartmuseum_readonly_ingress | default('omitme') }}"
|
||||
- "{{ wikijs_readonly_ingress | default('omitme') }}"
|
1
inventory/ghp/sample/group_vars/k8s/adguard.yaml
Normal file
1
inventory/ghp/sample/group_vars/k8s/adguard.yaml
Normal file
@ -0,0 +1 @@
|
||||
adguard_values: {}
|
1
inventory/ghp/sample/group_vars/k8s/bitwarden.yaml
Normal file
1
inventory/ghp/sample/group_vars/k8s/bitwarden.yaml
Normal file
@ -0,0 +1 @@
|
||||
bitwarden_values: {}
|
1
inventory/ghp/sample/group_vars/k8s/cert-manager.yaml
Normal file
1
inventory/ghp/sample/group_vars/k8s/cert-manager.yaml
Normal file
@ -0,0 +1 @@
|
||||
cert_manager_values: {}
|
1
inventory/ghp/sample/group_vars/k8s/chartmuseum.yaml
Normal file
1
inventory/ghp/sample/group_vars/k8s/chartmuseum.yaml
Normal file
@ -0,0 +1 @@
|
||||
chartmuseum_values: {}
|
1
inventory/ghp/sample/group_vars/k8s/dovecot.yaml
Normal file
1
inventory/ghp/sample/group_vars/k8s/dovecot.yaml
Normal file
@ -0,0 +1 @@
|
||||
dovecot_values: {}
|
2
inventory/ghp/sample/group_vars/k8s/drone.yaml
Normal file
2
inventory/ghp/sample/group_vars/k8s/drone.yaml
Normal file
@ -0,0 +1,2 @@
|
||||
drone_values: {}
|
||||
drone_runner_kube_values: {}
|
1
inventory/ghp/sample/group_vars/k8s/external-dns.yaml
Normal file
1
inventory/ghp/sample/group_vars/k8s/external-dns.yaml
Normal file
@ -0,0 +1 @@
|
||||
external_dns_values: {}
|
@ -0,0 +1 @@
|
||||
external_ingress_nginx_values: {}
|
3
inventory/ghp/sample/group_vars/k8s/gitea.yaml
Normal file
3
inventory/ghp/sample/group_vars/k8s/gitea.yaml
Normal file
@ -0,0 +1,3 @@
|
||||
gitea_values: {}
|
||||
gitea_ingress_nginx_values: {}
|
||||
gitea_dns_values: {}
|
1
inventory/ghp/sample/group_vars/k8s/internal-dns.yaml
Normal file
1
inventory/ghp/sample/group_vars/k8s/internal-dns.yaml
Normal file
@ -0,0 +1 @@
|
||||
internal_dns_values: {}
|
@ -0,0 +1 @@
|
||||
internal_ingress_nginx_values: {}
|
1
inventory/ghp/sample/group_vars/k8s/local-dns.yaml
Normal file
1
inventory/ghp/sample/group_vars/k8s/local-dns.yaml
Normal file
@ -0,0 +1 @@
|
||||
local_dns_values: {}
|
@ -0,0 +1 @@
|
||||
local_ingress_nginx_values: {}
|
13
inventory/ghp/sample/group_vars/k8s/metallb.yaml
Normal file
13
inventory/ghp/sample/group_vars/k8s/metallb.yaml
Normal file
@ -0,0 +1,13 @@
|
||||
metallb_values:
|
||||
configInline:
|
||||
peers:
|
||||
- peer-address: 192.168.5.1
|
||||
peer-asn: 64601
|
||||
my-asn: 65500
|
||||
address-pools:
|
||||
- name: default
|
||||
protocol: bgp
|
||||
bgp-advertisements:
|
||||
- aggregation-length: 24
|
||||
addresses:
|
||||
- 192.168.250.0/24
|
1
inventory/ghp/sample/group_vars/k8s/metrics-server.yaml
Normal file
1
inventory/ghp/sample/group_vars/k8s/metrics-server.yaml
Normal file
@ -0,0 +1 @@
|
||||
metrics_server_values: {}
|
43
inventory/ghp/sample/group_vars/k8s/nextcloud.yaml
Normal file
43
inventory/ghp/sample/group_vars/k8s/nextcloud.yaml
Normal file
@ -0,0 +1,43 @@
|
||||
nextcloud_values:
|
||||
nextcloud:
|
||||
configs:
|
||||
mail.fix.config.php: |-
|
||||
<?php
|
||||
$CONFIG = array (
|
||||
"mail_smtptimeout" => 60,
|
||||
);
|
||||
fix.config.php: |-
|
||||
<?php
|
||||
$CONFIG = array (
|
||||
'trusted_proxies' => ['{{ web_proxy_internal_ip }}'],
|
||||
'overwriteprotocol' => 'https',
|
||||
'overwrite.cli.url' => 'https://nextcloud.{{ domain }}',
|
||||
'mail_smtpstreamoptions' =>
|
||||
array (
|
||||
'ssl' =>
|
||||
array (
|
||||
'allow_self_signed' => true,
|
||||
'verify_peer' => false,
|
||||
'verify_peer_name' => false,
|
||||
),
|
||||
),
|
||||
);
|
||||
rgw.config.php: |-
|
||||
<?php
|
||||
$CONFIG = array (
|
||||
'objectstore_multibucket' => array(
|
||||
'class' => '\\OC\\Files\\ObjectStore\\S3',
|
||||
'arguments' => array(
|
||||
'bucket' => 'nextcloud',
|
||||
'autocreate' => true,
|
||||
'key' => 'K4PNZLSTLIDQJMZUV27P',
|
||||
'secret' => 'iPScsni8RS2aT9MFymfQYLPD7W8dVrRqFpafBKDc',
|
||||
'hostname' => 'sds1-osd1.lan',
|
||||
'port' => 8080,
|
||||
'use_ssl' => false,
|
||||
'num_buckets' => 16,
|
||||
'region' => 'us-east-1',
|
||||
'use_path_style' => true
|
||||
),
|
||||
),
|
||||
);
|
@ -0,0 +1,15 @@
|
||||
nfs_client_provisioner_hdd_values:
|
||||
replicaCount: 1
|
||||
strategyType: Recreate
|
||||
nfs:
|
||||
server: <nfs server dns or ip>
|
||||
path: <full path from exportfs>
|
||||
defaultClass: false
|
||||
|
||||
nfs_client_provisioner_ssd_values:
|
||||
replicaCount: 1
|
||||
strategyType: Recreate
|
||||
nfs:
|
||||
server: <nfs server dns or ip>
|
||||
path: <full path from exportfs>
|
||||
defaultClass: true
|
1
inventory/ghp/sample/group_vars/k8s/opendkim.yaml
Normal file
1
inventory/ghp/sample/group_vars/k8s/opendkim.yaml
Normal file
@ -0,0 +1 @@
|
||||
opendkim_values: {}
|
1
inventory/ghp/sample/group_vars/k8s/opendmarc.yaml
Normal file
1
inventory/ghp/sample/group_vars/k8s/opendmarc.yaml
Normal file
@ -0,0 +1 @@
|
||||
opendmarc_values: {}
|
58
inventory/ghp/sample/group_vars/k8s/openldap.yaml
Normal file
58
inventory/ghp/sample/group_vars/k8s/openldap.yaml
Normal file
@ -0,0 +1,58 @@
|
||||
openldap_values:
|
||||
customLdifFiles:
|
||||
04-custom-users.ldif: |-
|
||||
dn: uid=myuser1,ou=users,{{ openldap_domain }}
|
||||
changetype: add
|
||||
uid: myuser1
|
||||
cn: myuser1
|
||||
sn: 5001
|
||||
objectClass: top
|
||||
objectClass: posixAccount
|
||||
objectClass: inetOrgPerson
|
||||
loginShell: /bin/bash
|
||||
homeDirectory: /home/myuser1
|
||||
uidNumber: 5001
|
||||
gidNumber: 5001
|
||||
userPassword: {{ myuser1_pbkdf2_sha512_hash }}
|
||||
mail: myuser1@{{ domain }}
|
||||
mail: myuser1_second_mail@{{ domain }}
|
||||
gecos: myuser1 description
|
||||
|
||||
dn: uid=myuser2,ou=users,{{ openldap_domain }}
|
||||
changetype: add
|
||||
uid: myuser2
|
||||
cn: myuser2
|
||||
sn: 5002
|
||||
objectClass: top
|
||||
objectClass: posixAccount
|
||||
objectClass: inetOrgPerson
|
||||
loginShell: /bin/bash
|
||||
homeDirectory: /home/myuser2
|
||||
uidNumber: 5002
|
||||
gidNumber: 5002
|
||||
userPassword: {{ myuser2_pbkdf2_sha512_hash }}
|
||||
mail: myuser2@{{ domain }}
|
||||
mail: myuser2_second_mail@{{ domain }}
|
||||
gecos: myuser2 description
|
||||
|
||||
|
||||
05-autogen-simple-users.ldif: |-
|
||||
{% for user in openldap_simple_users %}
|
||||
dn: uid={{ user.name }},ou=users,{{ openldap_domain }}
|
||||
changetype: add
|
||||
uid: {{ user.name }}
|
||||
cn: {{ user.name }}
|
||||
sn: {{ user.sn }}
|
||||
objectClass: top
|
||||
objectClass: posixAccount
|
||||
objectClass: inetOrgPerson
|
||||
loginShell: /bin/bash
|
||||
homeDirectory: /home/{{ user.name }}
|
||||
uidNumber: {{ user.uid }}
|
||||
gidNumber: {{ user.gid }}
|
||||
userPassword: {{ hostvars[inventory_hostname][user.name + '_pbkdf2_sha512_hash'] | default('nopass') }}
|
||||
mail: {{ user.name }}@{{ domain }}
|
||||
gecos: {{ user.name }} user
|
||||
|
||||
{% endfor %}
|
||||
|
1
inventory/ghp/sample/group_vars/k8s/peertube.yaml
Normal file
1
inventory/ghp/sample/group_vars/k8s/peertube.yaml
Normal file
@ -0,0 +1 @@
|
||||
peertube_values: {}
|
1
inventory/ghp/sample/group_vars/k8s/postfix.yaml
Normal file
1
inventory/ghp/sample/group_vars/k8s/postfix.yaml
Normal file
@ -0,0 +1 @@
|
||||
postfix_values: {}
|
2
inventory/ghp/sample/group_vars/k8s/postgres.yaml
Normal file
2
inventory/ghp/sample/group_vars/k8s/postgres.yaml
Normal file
@ -0,0 +1,2 @@
|
||||
postgres_operator_values: {}
|
||||
postgres_operator_ui_values: {}
|
1
inventory/ghp/sample/group_vars/k8s/registry.yaml
Normal file
1
inventory/ghp/sample/group_vars/k8s/registry.yaml
Normal file
@ -0,0 +1 @@
|
||||
registry_values: {}
|
1
inventory/ghp/sample/group_vars/k8s/roundcube.yaml
Normal file
1
inventory/ghp/sample/group_vars/k8s/roundcube.yaml
Normal file
@ -0,0 +1 @@
|
||||
roundcube_values: {}
|
1
inventory/ghp/sample/group_vars/k8s/rspamd.yaml
Normal file
1
inventory/ghp/sample/group_vars/k8s/rspamd.yaml
Normal file
@ -0,0 +1 @@
|
||||
rspamd_values: {}
|
1
inventory/ghp/sample/group_vars/k8s/service-dns.yaml
Normal file
1
inventory/ghp/sample/group_vars/k8s/service-dns.yaml
Normal file
@ -0,0 +1 @@
|
||||
service_dns_values: {}
|
1
inventory/ghp/sample/group_vars/k8s/wikijs.yaml
Normal file
1
inventory/ghp/sample/group_vars/k8s/wikijs.yaml
Normal file
@ -0,0 +1 @@
|
||||
wikijs_values: {}
|
87
inventory/ghp/sample/group_vars/knot_dns.yaml
Normal file
87
inventory/ghp/sample/group_vars/knot_dns.yaml
Normal file
@ -0,0 +1,87 @@
|
||||
knot_conf: |
|
||||
# This is a sample of a minimal configuration file for Knot DNS.
|
||||
# See knot.conf(5) or refer to the server documentation.
|
||||
|
||||
server:
|
||||
rundir: "/run/knot"
|
||||
user: knot:knot
|
||||
listen: [ 0.0.0.0@53, ::@53 ]
|
||||
udp-max-payload: 1232
|
||||
|
||||
log:
|
||||
- target: syslog
|
||||
any: debug
|
||||
|
||||
key:
|
||||
- id: k8s
|
||||
algorithm: hmac-sha512
|
||||
secret: {{ k8s_tsig }}
|
||||
|
||||
- id: vps
|
||||
algorithm: hmac-sha512
|
||||
secret: {{ ddclient_tsig }}
|
||||
|
||||
remote:
|
||||
# - id: slave
|
||||
# address: 192.168.1.1@53
|
||||
#
|
||||
# - id: master
|
||||
# address: 192.168.2.1@53
|
||||
remote:
|
||||
- id: dns_server
|
||||
address: 127.0.0.1@53
|
||||
|
||||
submission:
|
||||
- id: dns_zone_sbm
|
||||
parent: [dns_server]
|
||||
|
||||
|
||||
acl:
|
||||
- id: deny_all
|
||||
deny: on # no action specified and deny on implies denial of all actions
|
||||
|
||||
- id: key_rule
|
||||
key: [vps, k8s] # Access based just on TSIG key
|
||||
address: 192.168.0.0/16
|
||||
action: [transfer, notify, update]
|
||||
|
||||
# - id: acl_slave
|
||||
# address: 192.168.1.1
|
||||
# action: transfer
|
||||
|
||||
# - id: acl_master
|
||||
# address: 192.168.2.1
|
||||
# action: notify
|
||||
|
||||
template:
|
||||
- id: default
|
||||
storage: "/var/lib/knot"
|
||||
file: "%s.zone"
|
||||
|
||||
policy:
|
||||
- id: rsa
|
||||
algorithm: RSASHA512
|
||||
ksk-size: 4096
|
||||
zsk-size: 2048
|
||||
nsec3: on
|
||||
ksk-submission: dns_zone_sbm
|
||||
|
||||
zone:
|
||||
- domain: "{{ domain }}"
|
||||
storage: "/var/lib/knot/zones/"
|
||||
file: "{{ domain }}.zone"
|
||||
acl: [deny_all, key_rule]
|
||||
dnssec-signing: on
|
||||
dnssec-policy: rsa
|
||||
zonefile-load: difference
|
||||
|
||||
# # Master zone
|
||||
# - domain: example.com
|
||||
# notify: slave
|
||||
# acl: acl_slave
|
||||
|
||||
# # Slave zone
|
||||
# - domain: example.net
|
||||
# master: master
|
||||
# acl: acl_master
|
||||
|
102
inventory/ghp/sample/group_vars/mail_proxy.yaml
Normal file
102
inventory/ghp/sample/group_vars/mail_proxy.yaml
Normal file
@ -0,0 +1,102 @@
|
||||
haproxy_config: |
|
||||
global
|
||||
chroot /var/lib/haproxy
|
||||
daemon
|
||||
group haproxy
|
||||
maxconn 200000
|
||||
nbproc {{ ansible_processor_count }}
|
||||
pidfile /var/run/haproxy.pid
|
||||
user haproxy
|
||||
stats socket /var/run/haproxy.stat
|
||||
stats bind-process 1
|
||||
log 127.0.0.1 local0
|
||||
|
||||
defaults
|
||||
log global
|
||||
maxconn 200000
|
||||
option redispatch
|
||||
retries 3
|
||||
timeout http-request 10s
|
||||
timeout queue 1m
|
||||
timeout connect 10s
|
||||
timeout client 10m
|
||||
timeout server 10m
|
||||
timeout check 10s
|
||||
|
||||
frontend ft_smtp
|
||||
bind {{ mail_proxy_public_ip }}:25
|
||||
bind {{ mail_proxy_private_ip }}:25
|
||||
mode tcp
|
||||
timeout client 1m
|
||||
log global
|
||||
option tcplog
|
||||
default_backend bk_smtp
|
||||
|
||||
backend bk_smtp
|
||||
mode tcp
|
||||
log global
|
||||
option tcplog
|
||||
timeout server 1m
|
||||
timeout connect 7s
|
||||
server postfix {{ postfix_loadbalancer_ip }}:2525 send-proxy
|
||||
|
||||
frontend ft_submission
|
||||
bind {{ mail_proxy_public_ip }}:587
|
||||
bind {{ mail_proxy_private_ip }}:587
|
||||
mode tcp
|
||||
timeout client 1m
|
||||
log global
|
||||
option tcplog
|
||||
default_backend bk_submission
|
||||
|
||||
backend bk_submission
|
||||
mode tcp
|
||||
log global
|
||||
option tcplog
|
||||
timeout server 1m
|
||||
timeout connect 7s
|
||||
server postfix {{ postfix_loadbalancer_ip }}:10587 send-proxy
|
||||
|
||||
frontend ft_submissions
|
||||
bind {{ mail_proxy_public_ip }}:465
|
||||
bind {{ mail_proxy_private_ip }}:465
|
||||
mode tcp
|
||||
timeout client 1m
|
||||
log global
|
||||
option tcplog
|
||||
default_backend bk_submissions
|
||||
|
||||
backend bk_submissions
|
||||
mode tcp
|
||||
log global
|
||||
option tcplog
|
||||
timeout server 1m
|
||||
timeout connect 7s
|
||||
server postfix {{ postfix_loadbalancer_ip }}:10465 send-proxy
|
||||
|
||||
frontend ft_imap
|
||||
bind {{ mail_proxy_public_ip }}:143
|
||||
bind {{ mail_proxy_private_ip }}:143
|
||||
mode tcp
|
||||
default_backend bk_imap
|
||||
|
||||
backend bk_imap
|
||||
mode tcp
|
||||
balance leastconn
|
||||
stick store-request src
|
||||
stick-table type ip size 200k expire 30m
|
||||
server imap1 {{ dovecot_loadbalancer_ip }}:1109 send-proxy-v2
|
||||
|
||||
frontend ft_imaps
|
||||
bind {{ mail_proxy_public_ip }}:993
|
||||
bind {{ mail_proxy_private_ip }}:993
|
||||
mode tcp
|
||||
default_backend bk_imaps
|
||||
|
||||
backend bk_imaps
|
||||
mode tcp
|
||||
balance leastconn
|
||||
stick store-request src
|
||||
stick-table type ip size 200k expire 30m
|
||||
server imaps1 {{ dovecot_loadbalancer_ip }}:10993 send-proxy-v2
|
||||
|
97
inventory/ghp/sample/group_vars/web_proxy.yaml
Normal file
97
inventory/ghp/sample/group_vars/web_proxy.yaml
Normal file
@ -0,0 +1,97 @@
|
||||
nginx:
|
||||
nginx.conf: |
|
||||
user nginx;
|
||||
worker_processes {{ ansible_processor_count }};
|
||||
error_log /var/log/nginx/error.log debug;
|
||||
pid /var/run/nginx.pid;
|
||||
|
||||
events {
|
||||
worker_connections 4096;
|
||||
}
|
||||
|
||||
http {
|
||||
include /etc/nginx/mime.types;
|
||||
default_type application/octet-stream;
|
||||
|
||||
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
|
||||
'$status $body_bytes_sent "$http_referer" '
|
||||
'"$http_user_agent" "$http_x_forwarded_for"';
|
||||
|
||||
access_log /var/log/nginx/access.log main;
|
||||
sendfile on;
|
||||
#tcp_nopush on;
|
||||
keepalive_timeout 65;
|
||||
#gzip on;
|
||||
include /etc/nginx/conf.d/*.conf;
|
||||
}
|
||||
stream {
|
||||
server {
|
||||
listen 443;
|
||||
proxy_pass $upstream;
|
||||
ssl_preread on;
|
||||
proxy_protocol on;
|
||||
}
|
||||
map $ssl_preread_server_name $upstream {
|
||||
include /etc/nginx/stream.d/*.map;
|
||||
}
|
||||
|
||||
include /etc/nginx/stream.d/*.conf;
|
||||
}
|
||||
|
||||
stream.d:
|
||||
- name: "k8s-ghp-{{ namespace }}.map"
|
||||
data: |
|
||||
{% if gitea_publish_ssh %}
|
||||
default gitea_ssh_{{ namespace }};
|
||||
{% endif %}
|
||||
{% if gitea_publish_web %}
|
||||
gitea.{{ domain }} gitea_web_{{ namespace }};
|
||||
{% endif %}
|
||||
{% if bitwarden_publish %}
|
||||
bitwarden.{{ domain }} https_{{ namespace }};
|
||||
{% endif %}
|
||||
{% if wikijs_publish %}
|
||||
wikijs.{{ domain }} https_{{ namespace }};
|
||||
{% endif %}
|
||||
{% if drone_publish %}
|
||||
drone.{{ domain }} https_{{ namespace }};
|
||||
{% endif %}
|
||||
{% if nextcloud_publish %}
|
||||
nextcloud.{{ domain }} https_{{ namespace }};
|
||||
{% endif %}
|
||||
{% if registry_publish %}
|
||||
registry.{{ domain }} https_{{ namespace }};
|
||||
{% endif %}
|
||||
{% if registry_readonly_ingress %}
|
||||
{{ registry_readonly_ingress }} https_{{ namespace }};
|
||||
{% endif %}
|
||||
{% if chartmuseum_publish %}
|
||||
charts.{{ domain }} https_{{ namespace }};
|
||||
{% endif %}
|
||||
{% if chartmuseum_readonly_ingress %}
|
||||
{{ chartmuseum_readonly_ingress }} https_{{ namespace }};
|
||||
{% endif %}
|
||||
{% if wikijs_readonly_ingress %}
|
||||
{{ wikijs_readonly_ingress }} https_{{ namespace }};
|
||||
{% endif %}
|
||||
{% if peertube_publish %}
|
||||
peertube.{{ domain }} https_{{ namespace }};
|
||||
{% endif %}
|
||||
- name: "k8s-ghp-{{ namespace }}.conf"
|
||||
data: |-
|
||||
{% if gitea_publish_ssh %}
|
||||
upstream gitea_ssh_{{ namespace }} {
|
||||
server {{ gitea_loadbalancer_ip }}:22;
|
||||
}
|
||||
{% endif %}
|
||||
|
||||
{% if gitea_publish_web %}
|
||||
upstream gitea_web_{{ namespace }} {
|
||||
server {{ gitea_loadbalancer_ip }}:443;
|
||||
}
|
||||
{% endif %}
|
||||
|
||||
upstream https_{{ namespace }} {
|
||||
server {{ external_loadbalancer_ip }}:443;
|
||||
}
|
||||
|
16
inventory/ghp/sample/hosts
Normal file
16
inventory/ghp/sample/hosts
Normal file
@ -0,0 +1,16 @@
|
||||
[vps:children]
|
||||
knot_dns
|
||||
web_proxy
|
||||
mail_proxy
|
||||
ddclient
|
||||
|
||||
[ddclient]
|
||||
|
||||
[web_proxy]
|
||||
|
||||
[mail_proxy]
|
||||
|
||||
[knot_dns]
|
||||
|
||||
[k8s]
|
||||
localhost ansible_python_interpreter="python"
|
27
playbooks/ghp/bootstrap.yaml
Normal file
27
playbooks/ghp/bootstrap.yaml
Normal file
@ -0,0 +1,27 @@
|
||||
- hosts: localhost
|
||||
connection: local
|
||||
pre_tasks:
|
||||
- name: Check docker is working
|
||||
shell: docker info
|
||||
register: docker_info
|
||||
changed_when: "docker_info.rc != 0"
|
||||
failed_when: "docker_info.rc != 0"
|
||||
- name: Check Helm installed
|
||||
shell: helm version
|
||||
register: helm_version
|
||||
changed_when: "helm_version.rc != 0"
|
||||
failed_when: "helm_version.rc != 0"
|
||||
- name: Helm version
|
||||
debug:
|
||||
msg: "{{ helm_version.stdout }}"
|
||||
- name: Check kubectl installed and have access to cluster
|
||||
shell: kubectl get nodes
|
||||
register: kubectl_cluster_nodes
|
||||
changed_when: "kubectl_cluster_nodes.rc != 0"
|
||||
failed_when: "kubectl_cluster_nodes.rc != 0"
|
||||
- name: Kubectl nodes output
|
||||
debug:
|
||||
msg: "{{ kubectl_cluster_nodes.stdout.split('\n') }}"
|
||||
roles:
|
||||
- helm-repos
|
||||
- pwgen
|
5
playbooks/ghp/cert-manager.yaml
Normal file
5
playbooks/ghp/cert-manager.yaml
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
- hosts: k8s
|
||||
connection: local
|
||||
roles:
|
||||
- cert-manager
|
5
playbooks/ghp/chartmuseum.yaml
Normal file
5
playbooks/ghp/chartmuseum.yaml
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
- hosts: k8s
|
||||
connection: local
|
||||
roles:
|
||||
- chartmuseum
|
75
playbooks/ghp/core-infra.yaml
Normal file
75
playbooks/ghp/core-infra.yaml
Normal file
@ -0,0 +1,75 @@
|
||||
---
|
||||
- hosts: k8s
|
||||
connection: local
|
||||
tasks:
|
||||
- name: Deploy MetalLB
|
||||
import_role:
|
||||
name: metallb
|
||||
when: metallb_enabled | default(true)
|
||||
tags: metallb
|
||||
|
||||
- name: Deploy External Ingress Nginx
|
||||
import_role:
|
||||
name: external-ingress-nginx
|
||||
when: external_ingress_nginx_enabled | default(true)
|
||||
tags:
|
||||
- external-ingress-nginx
|
||||
- ingress-nginx
|
||||
|
||||
- name: Deploy Internal Ingress Nginx
|
||||
import_role:
|
||||
name: internal-ingress-nginx
|
||||
when: internal_ingress_nginx_enabled | default(true)
|
||||
tags:
|
||||
- internal-ingress-nginx
|
||||
- ingress-nginx
|
||||
|
||||
- name: Deploy Local Ingress Nginx
|
||||
import_role:
|
||||
name: internal-ingress-nginx
|
||||
when: local_ingress_nginx_enabled | default(true)
|
||||
tags:
|
||||
- local-ingress-nginx
|
||||
- ingress-nginx
|
||||
|
||||
- name: Deploy Internal DNS
|
||||
import_role:
|
||||
name: internal-dns
|
||||
when: internal_dns_enabled | default(true)
|
||||
tags:
|
||||
- internal-dns
|
||||
- dns
|
||||
|
||||
- name: Deploy Local DNS
|
||||
import_role:
|
||||
name: local-dns
|
||||
when: local_dns_enabled | default(true)
|
||||
tags:
|
||||
- local-dns
|
||||
- dns
|
||||
|
||||
- name: Deploy Service DNS
|
||||
import_role:
|
||||
name: service-dns
|
||||
when: service_dns_enabled | default(true)
|
||||
tags:
|
||||
- service-dns
|
||||
- dns
|
||||
|
||||
- name: Deploy Cert-manager
|
||||
import_role:
|
||||
name: cert-manager
|
||||
when: cert_manager_enabled | default(true)
|
||||
tags: cert-manager
|
||||
|
||||
- name: Deploy NFS-client-provisioner
|
||||
import_role:
|
||||
name: nfs-client-provisioner
|
||||
when: nfs_client_provisioner_enabled | default(true)
|
||||
tags: nfs-client-provisioner
|
||||
|
||||
- name: Deploy Metrics-server
|
||||
import_role:
|
||||
name: metrics-server
|
||||
when: metrics_server_enabled | default(true)
|
||||
tags: metrics-server
|
4
playbooks/ghp/dns.yaml
Normal file
4
playbooks/ghp/dns.yaml
Normal file
@ -0,0 +1,4 @@
|
||||
---
|
||||
- hosts: knot_dns
|
||||
roles:
|
||||
- knot
|
5
playbooks/ghp/dovecot.yaml
Normal file
5
playbooks/ghp/dovecot.yaml
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
- hosts: k8s
|
||||
connection: local
|
||||
roles:
|
||||
- dovecot
|
5
playbooks/ghp/drone.yaml
Normal file
5
playbooks/ghp/drone.yaml
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
- hosts: k8s
|
||||
connection: local
|
||||
roles:
|
||||
- drone
|
5
playbooks/ghp/external-ingress-nginx.yaml
Normal file
5
playbooks/ghp/external-ingress-nginx.yaml
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
- hosts: k8s
|
||||
connection: local
|
||||
roles:
|
||||
- external-ingress-nginx
|
5
playbooks/ghp/gitea.yaml
Normal file
5
playbooks/ghp/gitea.yaml
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
- hosts: k8s
|
||||
connection: local
|
||||
roles:
|
||||
- gitea
|
5
playbooks/ghp/internal-dns.yaml
Normal file
5
playbooks/ghp/internal-dns.yaml
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
- hosts: k8s
|
||||
connection: local
|
||||
roles:
|
||||
- internal-dns
|
5
playbooks/ghp/internal-ingress-nginx.yaml
Normal file
5
playbooks/ghp/internal-ingress-nginx.yaml
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
- hosts: k8s
|
||||
connection: local
|
||||
roles:
|
||||
- internal-ingress-nginx
|
5
playbooks/ghp/local-dns.yaml
Normal file
5
playbooks/ghp/local-dns.yaml
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
- hosts: k8s
|
||||
connection: local
|
||||
roles:
|
||||
- local-dns
|
5
playbooks/ghp/local-ingress-nginx.yaml
Normal file
5
playbooks/ghp/local-ingress-nginx.yaml
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
- hosts: k8s
|
||||
connection: local
|
||||
roles:
|
||||
- local-ingress-nginx
|
5
playbooks/ghp/mail.yaml
Normal file
5
playbooks/ghp/mail.yaml
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
- hosts: k8s
|
||||
connection: local
|
||||
roles:
|
||||
- mail
|
5
playbooks/ghp/metallb.yaml
Normal file
5
playbooks/ghp/metallb.yaml
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
- hosts: k8s
|
||||
connection: local
|
||||
roles:
|
||||
- metallb
|
5
playbooks/ghp/metrics-server.yaml
Normal file
5
playbooks/ghp/metrics-server.yaml
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
- hosts: k8s
|
||||
connection: local
|
||||
roles:
|
||||
- metrics-server
|
5
playbooks/ghp/nextcloud.yaml
Normal file
5
playbooks/ghp/nextcloud.yaml
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
- hosts: k8s
|
||||
connection: local
|
||||
roles:
|
||||
- nextcloud
|
5
playbooks/ghp/nfs-client-provisioner.yaml
Normal file
5
playbooks/ghp/nfs-client-provisioner.yaml
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
- hosts: k8s
|
||||
connection: local
|
||||
roles:
|
||||
- nfs-client-provisioner
|
5
playbooks/ghp/opendkim.yaml
Normal file
5
playbooks/ghp/opendkim.yaml
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
- hosts: k8s
|
||||
connection: local
|
||||
roles:
|
||||
- opendkim
|
5
playbooks/ghp/opendmarc.yaml
Normal file
5
playbooks/ghp/opendmarc.yaml
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
- hosts: k8s
|
||||
connection: local
|
||||
roles:
|
||||
- opendmarc
|
5
playbooks/ghp/openldap.yaml
Normal file
5
playbooks/ghp/openldap.yaml
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
- hosts: k8s
|
||||
connection: local
|
||||
roles:
|
||||
- openldap
|
5
playbooks/ghp/playmaker.yaml
Normal file
5
playbooks/ghp/playmaker.yaml
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
- hosts: k8s
|
||||
connection: local
|
||||
roles:
|
||||
- playmaker
|
5
playbooks/ghp/postfix.yaml
Normal file
5
playbooks/ghp/postfix.yaml
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
- hosts: k8s
|
||||
connection: local
|
||||
roles:
|
||||
- postfix
|
5
playbooks/ghp/postgres.yaml
Normal file
5
playbooks/ghp/postgres.yaml
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
- hosts: k8s
|
||||
connection: local
|
||||
roles:
|
||||
- postgres
|
5
playbooks/ghp/pypiserver.yaml
Normal file
5
playbooks/ghp/pypiserver.yaml
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
- hosts: k8s
|
||||
connection: local
|
||||
roles:
|
||||
- pypiserver
|
5
playbooks/ghp/registry.yaml
Normal file
5
playbooks/ghp/registry.yaml
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
- hosts: k8s
|
||||
connection: local
|
||||
roles:
|
||||
- registry
|
5
playbooks/ghp/roundcube.yaml
Normal file
5
playbooks/ghp/roundcube.yaml
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
- hosts: k8s
|
||||
connection: local
|
||||
roles:
|
||||
- roundcube
|
5
playbooks/ghp/rspamd.yaml
Normal file
5
playbooks/ghp/rspamd.yaml
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
- hosts: k8s
|
||||
connection: local
|
||||
roles:
|
||||
- rspamd
|
27
playbooks/ghp/shared-infra.yaml
Normal file
27
playbooks/ghp/shared-infra.yaml
Normal file
@ -0,0 +1,27 @@
|
||||
---
|
||||
- hosts: k8s
|
||||
connection: local
|
||||
tasks:
|
||||
- name: Deploy PostgreSQL
|
||||
import_role:
|
||||
name: postgres
|
||||
when: postgres_enabled | default(true)
|
||||
tags: postgres
|
||||
|
||||
- name: Deploy OpenLDAP
|
||||
import_role:
|
||||
name: openldap
|
||||
when: openldap_enabled | default(true)
|
||||
tags: openldap
|
||||
|
||||
- name: Deploy Docker registry
|
||||
import_role:
|
||||
name: registry
|
||||
when: registry_enabled | default(true)
|
||||
tags: registry
|
||||
|
||||
- name: Deploy ChartMuseum
|
||||
import_role:
|
||||
name: chartmuseum
|
||||
when: chartmuseum_enabled | default(true)
|
||||
tags: chartmuseum
|
12
playbooks/ghp/site.yaml
Normal file
12
playbooks/ghp/site.yaml
Normal file
@ -0,0 +1,12 @@
|
||||
---
|
||||
- name: Deploy Core Infrastructure
|
||||
import_playbook: core-infra.yaml
|
||||
tags: core-infra
|
||||
|
||||
- name: Deploy Shared Infrastructure
|
||||
import_playbook: shared-infra.yaml
|
||||
tags: shared-infra
|
||||
|
||||
- name: Deploy End User Applications
|
||||
import_playbook: user-apps.yaml
|
||||
tags: user-apps
|
63
playbooks/ghp/user-apps.yaml
Normal file
63
playbooks/ghp/user-apps.yaml
Normal file
@ -0,0 +1,63 @@
|
||||
---
|
||||
- hosts: k8s
|
||||
connection: local
|
||||
tasks:
|
||||
- name: Deploy Mail
|
||||
import_role:
|
||||
name: mail
|
||||
when: mail_enabled | default(true)
|
||||
tags: mail
|
||||
|
||||
- name: Deploy Nextcloud
|
||||
import_role:
|
||||
name: nextcloud
|
||||
when: nextcloud_enabled | default(true)
|
||||
tags: nextcloud
|
||||
|
||||
- name: Deploy Bitwarden
|
||||
import_role:
|
||||
name: bitwarden
|
||||
when: bitwarden_enabled | default(true)
|
||||
tags: bitwarden
|
||||
|
||||
- name: Deploy Gitea
|
||||
import_role:
|
||||
name: gitea
|
||||
when: gitea_enabled | default(true)
|
||||
tags: gitea
|
||||
|
||||
- name: Deploy Drone
|
||||
import_role:
|
||||
name: drone
|
||||
when: drone_enabled | default(true)
|
||||
tags: drone
|
||||
|
||||
- name: Deploy WikiJS
|
||||
import_role:
|
||||
name: wikijs
|
||||
when: wikijs_enabled | default(true)
|
||||
tags: wikijs
|
||||
|
||||
- name: Deploy Playmaker
|
||||
import_role:
|
||||
name: playmaker
|
||||
when: playmaker_enabled | default(false)
|
||||
tags: playmaker
|
||||
|
||||
- name: Deploy Pypiserver
|
||||
import_role:
|
||||
name: pypiserver
|
||||
when: pypiserver_enabled | default(false)
|
||||
tags: pypiserver
|
||||
|
||||
- name: Deploy PeerTube
|
||||
import_role:
|
||||
name: peertube
|
||||
when: peertube_enabled | default(false)
|
||||
tags: peertube
|
||||
|
||||
- name: Deploy Adguard Home
|
||||
import_role:
|
||||
name: adguard-home
|
||||
when: adguard_enabled | default(false)
|
||||
tags: adguard
|
17
playbooks/ghp/vps.yaml
Normal file
17
playbooks/ghp/vps.yaml
Normal file
@ -0,0 +1,17 @@
|
||||
---
|
||||
- hosts: web_proxy
|
||||
roles:
|
||||
- nginx
|
||||
tags: web-proxy
|
||||
|
||||
- hosts: mail_proxy
|
||||
roles:
|
||||
- haproxy
|
||||
tags: mail-proxy
|
||||
|
||||
- hosts: ddclient
|
||||
roles:
|
||||
- docker
|
||||
- role: ddclient
|
||||
dockerize: true
|
||||
tags: ddclient
|
5
playbooks/ghp/wikijs.yaml
Normal file
5
playbooks/ghp/wikijs.yaml
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
- hosts: k8s
|
||||
connection: local
|
||||
roles:
|
||||
- wikijs
|
37
requirements.txt
Normal file
37
requirements.txt
Normal file
@ -0,0 +1,37 @@
|
||||
ansible==2.10.3
|
||||
ansible-base==2.10.3
|
||||
attrs==20.3.0
|
||||
cachetools==4.1.1
|
||||
certifi==2020.6.20
|
||||
cffi==1.14.3
|
||||
chardet==3.0.4
|
||||
cryptography==3.2.1
|
||||
docker==4.3.1
|
||||
google-auth==1.23.0
|
||||
idna==2.10
|
||||
importlib-metadata==2.0.0
|
||||
Jinja2==2.11.2
|
||||
jsonschema==3.2.0
|
||||
kubernetes==11.0.0
|
||||
kubernetes-validate==1.18.0
|
||||
MarkupSafe==1.1.1
|
||||
oauthlib==3.1.0
|
||||
openshift==0.11.2
|
||||
packaging==20.4
|
||||
pyasn1==0.4.8
|
||||
pyasn1-modules==0.2.8
|
||||
pycparser==2.20
|
||||
pyparsing==2.4.7
|
||||
pyrsistent==0.17.3
|
||||
python-dateutil==2.8.1
|
||||
python-string-utils==1.0.0
|
||||
PyYAML==5.3.1
|
||||
requests==2.24.0
|
||||
requests-oauthlib==1.3.0
|
||||
rsa==4.6
|
||||
ruamel.yaml==0.16.12
|
||||
ruamel.yaml.clib==0.2.2
|
||||
six==1.15.0
|
||||
urllib3==1.25.11
|
||||
websocket-client==0.57.0
|
||||
zipp==3.4.0
|
276
roles/adguard-home/defaults/main.yaml
Normal file
276
roles/adguard-home/defaults/main.yaml
Normal file
@ -0,0 +1,276 @@
|
||||
adguard_enabled: false
|
||||
adguard_publish: false
|
||||
adguard_default_values:
|
||||
# upgrade strategy type (e.g. Recreate or RollingUpdate)
|
||||
strategyType: RollingUpdate
|
||||
configAsCode:
|
||||
enabled: true
|
||||
resources: {}
|
||||
# requests:
|
||||
# memory: 128Mi
|
||||
# cpu: 100m
|
||||
image:
|
||||
repository: busybox
|
||||
tag: latest
|
||||
pullPolicy: Always
|
||||
config:
|
||||
bind_host: 0.0.0.0
|
||||
bind_port: 3000
|
||||
users:
|
||||
- name: admin
|
||||
password: "{{ adguard_admin_htpasswd_hash }}"
|
||||
http_proxy: ""
|
||||
language: "en"
|
||||
rlimit_nofile: 0
|
||||
debug_pprof: false
|
||||
web_session_ttl: 720
|
||||
dns:
|
||||
bind_host: 0.0.0.0
|
||||
port: 53
|
||||
statistics_interval: 1
|
||||
querylog_enabled: true
|
||||
querylog_interval: 90
|
||||
querylog_size_memory: 1000
|
||||
anonymize_client_ip: false
|
||||
protection_enabled: true
|
||||
blocking_mode: default
|
||||
blocking_ipv4: ""
|
||||
blocking_ipv6: ""
|
||||
blocked_response_ttl: 10
|
||||
parental_block_host: family-block.dns.adguard.com
|
||||
safebrowsing_block_host: standard-block.dns.adguard.com
|
||||
ratelimit: 0
|
||||
ratelimit_whitelist: []
|
||||
refuse_any: true
|
||||
upstream_dns:
|
||||
- https://dns10.quad9.net/dns-query
|
||||
bootstrap_dns:
|
||||
- 9.9.9.10
|
||||
- 149.112.112.10
|
||||
- 2620:fe::10
|
||||
- 2620:fe::fe:10
|
||||
all_servers: false
|
||||
fastest_addr: false
|
||||
allowed_clients: []
|
||||
# - 10.0.0.1
|
||||
# - 10.0.1.1/24
|
||||
disallowed_clients: []
|
||||
# - 10.0.1.1
|
||||
# - 10.0.11.1/24
|
||||
blocked_hosts: []
|
||||
# - example.org
|
||||
# - '*.example.org'
|
||||
# - '||example.org^'
|
||||
cache_size: 4194304
|
||||
cache_ttl_min: 0
|
||||
cache_ttl_max: 0
|
||||
bogus_nxdomain: []
|
||||
aaaa_disabled: false
|
||||
enable_dnssec: false
|
||||
edns_client_subnet: false
|
||||
filtering_enabled: true
|
||||
filters_update_interval: 8
|
||||
parental_enabled: false
|
||||
safesearch_enabled: false
|
||||
safebrowsing_enabled: false
|
||||
safebrowsing_cache_size: 1048576
|
||||
safesearch_cache_size: 1048576
|
||||
parental_cache_size: 1048576
|
||||
cache_time: 30
|
||||
rewrites: []
|
||||
# - domain: example.org
|
||||
# answer: 127.0.0.1
|
||||
# - domain: '*.example.org'
|
||||
# answer: 127.0.0.1
|
||||
blocked_services:
|
||||
- facebook
|
||||
- origin
|
||||
- twitter
|
||||
- snapchat
|
||||
- skype
|
||||
- whatsapp
|
||||
- instagram
|
||||
- youtube
|
||||
- netflix
|
||||
- twitch
|
||||
- discord
|
||||
- amazon
|
||||
- ebay
|
||||
- cloudflare
|
||||
- steam
|
||||
- epic_games
|
||||
- reddit
|
||||
- ok
|
||||
- vk
|
||||
- mail_ru
|
||||
- tiktok
|
||||
tls:
|
||||
enabled: true
|
||||
server_name: "{{ adguard_dns_name | default('dns.' + domain) }}"
|
||||
force_https: false
|
||||
port_https: 443
|
||||
port_dns_over_tls: 853
|
||||
allow_unencrypted_doh: false
|
||||
strict_sni_check: false
|
||||
certificate_chain: ""
|
||||
private_key: ""
|
||||
certificate_path: "/certs/tls.crt"
|
||||
private_key_path: "/certs/tls.key"
|
||||
filters:
|
||||
- enabled: true
|
||||
url: https://adguardteam.github.io/AdGuardSDNSFilter/Filters/filter.txt
|
||||
name: AdGuard DNS filter
|
||||
id: 1
|
||||
- enabled: false
|
||||
url: https://adaway.org/hosts.txt
|
||||
name: AdAway
|
||||
id: 2
|
||||
- enabled: false
|
||||
url: https://www.malwaredomainlist.com/hostslist/hosts.txt
|
||||
name: MalwareDomainList.com Hosts List
|
||||
id: 4
|
||||
whitelist_filters: []
|
||||
# - enabled: true
|
||||
# url: https://easylist-downloads.adblockplus.org/exceptionrules.txt
|
||||
# name: Allow nonintrusive advertising
|
||||
# id: 1595760241
|
||||
user_rules: []
|
||||
# - '||example.org^'
|
||||
# - '@@||example.org^'
|
||||
# - 127.0.0.1 example.org
|
||||
# - '! Here goes a comment'
|
||||
# - '# Also a comment'
|
||||
dhcp:
|
||||
enabled: false
|
||||
interface_name: ""
|
||||
gateway_ip: ""
|
||||
subnet_mask: ""
|
||||
range_start: ""
|
||||
range_end: ""
|
||||
lease_duration: 86400
|
||||
icmp_timeout_msec: 1000
|
||||
clients: []
|
||||
# - name: myuser
|
||||
# tags:
|
||||
# - user_admin
|
||||
# ids:
|
||||
# - 192.168.91.1
|
||||
# use_global_settings: true
|
||||
# filtering_enabled: false
|
||||
# parental_enabled: false
|
||||
# safesearch_enabled: false
|
||||
# safebrowsing_enabled: false
|
||||
# use_global_blocked_services: true
|
||||
# blocked_services: []
|
||||
# upstreams: []
|
||||
log_file: ""
|
||||
verbose: false
|
||||
schema_version: 6
|
||||
|
||||
tlsSecretName: "{{ adguard_dns_name | default('dns.' + domain) }}-secret"
|
||||
timezone: "UTC"
|
||||
ingress:
|
||||
enabled: true
|
||||
annotations:
|
||||
cert-manager.io/acme-challenge-type: dns01
|
||||
cert-manager.io/acme-dns01-provider: rfc2136
|
||||
cert-manager.io/cluster-issuer: letsencrypt-prod
|
||||
kubernetes.io/ingress.class: "{{ external_ingress_class if adguard_publish else internal_ingress_class }}"
|
||||
kubernetes.io/tls-acme: "true"
|
||||
path: /
|
||||
hosts:
|
||||
- adguard.{{ domain }}
|
||||
tls:
|
||||
- secretName: adguard.{{ domain }}-tls
|
||||
hosts:
|
||||
- adguard.{{ domain }}
|
||||
|
||||
service:
|
||||
type: ClusterIP
|
||||
# externalTrafficPolicy: Local
|
||||
# externalIPs: []
|
||||
# loadBalancerIP: ""
|
||||
# a fixed LoadBalancer IP
|
||||
# loadBalancerSourceRanges: []
|
||||
annotations:
|
||||
# metallb.universe.tf/address-pool: network-services
|
||||
# metallb.universe.tf/allow-shared-ip: adguard-home-svc
|
||||
|
||||
serviceTCP:
|
||||
enabled: true
|
||||
type: LoadBalancer
|
||||
# externalTrafficPolicy: Local
|
||||
# externalIPs: []
|
||||
loadBalancerIP: "{{ adguard_loadbalancer_ip }}"
|
||||
# a fixed LoadBalancer IP
|
||||
# loadBalancerSourceRanges: []
|
||||
annotations:
|
||||
# metallb.universe.tf/address-pool: network-services
|
||||
metallb.universe.tf/allow-shared-ip: adguard-home-svc
|
||||
|
||||
serviceUDP:
|
||||
enabled: true
|
||||
type: LoadBalancer
|
||||
# externalTrafficPolicy: Local
|
||||
# externalIPs: []
|
||||
loadBalancerIP: "{{ adguard_loadbalancer_ip }}"
|
||||
# a fixed LoadBalancer IP
|
||||
# loadBalancerSourceRanges: []
|
||||
annotations:
|
||||
# metallb.universe.tf/address-pool: network-services
|
||||
metallb.universe.tf/allow-shared-ip: adguard-home-svc
|
||||
|
||||
serviceDNSOverTLS:
|
||||
enabled: true
|
||||
## Enable if you use AdGuard as a DNS over TLS/HTTPS server
|
||||
type: LoadBalancer
|
||||
# externalTrafficPolicy: Local
|
||||
# externalIPs: []
|
||||
loadBalancerIP: "{{ adguard_loadbalancer_ip }}"
|
||||
# a fixed LoadBalancer IP
|
||||
# loadBalancerSourceRanges: []
|
||||
annotations:
|
||||
# metallb.universe.tf/address-pool: network-services
|
||||
metallb.universe.tf/allow-shared-ip: adguard-home-svc
|
||||
|
||||
serviceDNSOverHTTPS:
|
||||
enabled: true
|
||||
## Enable if you use AdGuard as a DNS over TLS/HTTPS server
|
||||
type: LoadBalancer
|
||||
# externalTrafficPolicy: Local
|
||||
# externalIPs: []
|
||||
loadBalancerIP: "{{ adguard_loadbalancer_ip }}"
|
||||
# a fixed LoadBalancer IP
|
||||
# loadBalancerSourceRanges: []
|
||||
annotations:
|
||||
# metallb.universe.tf/address-pool: network-services
|
||||
metallb.universe.tf/allow-shared-ip: adguard-home-svc
|
||||
external-dns.alpha.kubernetes.io/hostname: "{{ adguard_dns_name | default('dns.' + domain) }}"
|
||||
|
||||
serviceDHCP:
|
||||
enabled: false
|
||||
## Enable if you use AdGuard as a DHCP Server
|
||||
type: NodePort
|
||||
# externalTrafficPolicy: Local
|
||||
# externalIPs: []
|
||||
loadBalancerIP: ""
|
||||
# a fixed LoadBalancer IP
|
||||
annotations: {}
|
||||
# metallb.universe.tf/address-pool: network-services
|
||||
# metallb.universe.tf/allow-shared-ip: adguard-home-svc
|
||||
|
||||
persistence:
|
||||
config:
|
||||
enabled: true
|
||||
accessMode: "{{ adguard_config_storage_mode | default('ReadWriteMany') }}"
|
||||
size: "{{ adguard_config_size | default('20Mi') }}"
|
||||
storageClass: "{{ adguard_config_storage | default('nfs-ssd') }}"
|
||||
## Do not delete the pvc upon helm uninstall
|
||||
skipuninstall: false
|
||||
work:
|
||||
enabled: true
|
||||
accessMode: "{{ adguard_work_storage_mode | default('ReadWriteMany') }}"
|
||||
size: "{{ adguard_work_size | default('10Gi') }}"
|
||||
storageClass: "{{ adguard_work_storage | default('nfs-ssd') }}"
|
||||
## Do not delete the pvc upon helm uninstall
|
||||
skipuninstall: false
|
32
roles/adguard-home/tasks/main.yaml
Normal file
32
roles/adguard-home/tasks/main.yaml
Normal file
@ -0,0 +1,32 @@
|
||||
- name: Request cert for Adguard Home
|
||||
k8s:
|
||||
state: present
|
||||
definition:
|
||||
apiVersion: cert-manager.io/v1
|
||||
kind: Certificate
|
||||
metadata:
|
||||
name: "{{ adguard_dns_name | default('dns.' + domain) }}-crt"
|
||||
namespace: "{{ adguard_namespace | default(namespace) }}"
|
||||
spec:
|
||||
secretName: "{{ adguard_dns_name | default('dns.' + domain) }}-secret"
|
||||
dnsNames:
|
||||
- "{{ adguard_dns_name | default('dns.' + domain) }}"
|
||||
issuerRef:
|
||||
name: letsencrypt-prod
|
||||
# We can reference ClusterIssuers by changing the kind here.
|
||||
# The default value is Issuer (i.e. a locally namespaced Issuer)
|
||||
kind: ClusterIssuer
|
||||
group: cert-manager.io
|
||||
|
||||
- set_fact:
|
||||
adguard_combined_values: "{{ adguard_default_values | combine(adguard_values, recursive=true) }}"
|
||||
|
||||
- name: Deploy Adguard Home
|
||||
community.kubernetes.helm:
|
||||
create_namespace: true
|
||||
release_namespace: "{{ adguard_namespace | default(namespace) }}"
|
||||
release_name: "{{ adguard_name | default('adguard') }}"
|
||||
chart_ref: "{{ adguard_chart | default('ghp/adguard-home') }}"
|
||||
chart_version: "{{ adguard_version | default(omit) }}"
|
||||
release_values: "{{ adguard_combined_values | from_yaml }}"
|
||||
|
40
roles/bitwarden/defaults/main.yaml
Normal file
40
roles/bitwarden/defaults/main.yaml
Normal file
@ -0,0 +1,40 @@
|
||||
bitwarden_enabled: true
|
||||
bitwarden_publish: false
|
||||
bitwarden_use_external_db: true
|
||||
bitwarden_default_values:
|
||||
env:
|
||||
SIGNUPS_ALLOWED: true
|
||||
INVITATIONS_ALLOWED: true
|
||||
DATABASE_URL: "postgresql://{{ bitwarden_db_username }}:{{ bitwarden_db_password }}@{{ postgres_db_team | default(namespace) }}-postgres.{{ postgres_db_namespace | default(namespace) }}.svc.cluster.local:5432/bitwarden?sslmode=require"
|
||||
DOMAIN: "https://bitwarden.{{ domain }}"
|
||||
SMTP_FROM: "bitwarden@{{ domain }}"
|
||||
SMTP_HOST: "mail.{{ domain }}"
|
||||
SMTP_PASSWORD: "{{ bitwarden_ldap_pass | default(bitwarden_ldap_password) }}"
|
||||
SMTP_SSL: "true"
|
||||
SMTP_EXPLICIT_TLS: "true"
|
||||
SMTP_PORT: "465"
|
||||
SMTP_USERNAME: "bitwarden@{{ domain }}"
|
||||
SMTP_TIMEOUT: "120"
|
||||
LOG_LEVEL: "debug"
|
||||
EXTENDED_LOGGING: "true"
|
||||
ingress:
|
||||
enabled: true
|
||||
annotations:
|
||||
kubernetes.io/ingress.class: "{{ external_ingress_class if bitwarden_publish else internal_ingress_class }}"
|
||||
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
||||
cert-manager.io/acme-dns01-provider: "rfc2136"
|
||||
cert-manager.io/acme-challenge-type: "dns01"
|
||||
kubernetes.io/tls-acme: "true"
|
||||
path: /
|
||||
hosts:
|
||||
- "bitwarden.{{ domain }}"
|
||||
tls:
|
||||
- secretName: "bitwarden.{{ domain }}-tls"
|
||||
hosts:
|
||||
- "bitwarden.{{ domain }}"
|
||||
persistence:
|
||||
enabled: true
|
||||
accessMode: "{{ bitwarden_storage_mode | default('ReadWriteMany') }}"
|
||||
size: "{{ bitwarden_size | default('8Gi') }}"
|
||||
storageClass: "{{ bitwarden_storage | default('nfs-ssd') }}"
|
||||
|
19
roles/bitwarden/tasks/main.yaml
Normal file
19
roles/bitwarden/tasks/main.yaml
Normal file
@ -0,0 +1,19 @@
|
||||
- name: Import secret.yaml to obtain secrets
|
||||
include_tasks: secrets.yaml
|
||||
when:
|
||||
- bitwarden_use_external_db
|
||||
- postgres_enable
|
||||
|
||||
- set_fact:
|
||||
bitwarden_combined_values: "{{ bitwarden_default_values | combine(bitwarden_values, recursive=true) }}"
|
||||
|
||||
- name: Deploy Bitwarden
|
||||
community.kubernetes.helm:
|
||||
create_namespace: true
|
||||
release_namespace: "{{ bitwarden_namespace | default(namespace) }}"
|
||||
release_name: "{{ bitwarden_name | default('bitwarden') }}"
|
||||
chart_ref: "{{ bitwarden_chart | default('ghp/bitwarden') }}"
|
||||
chart_version: "{{ bitwarden_version | default(omit) }}"
|
||||
release_values: "{{ bitwarden_combined_values | from_yaml }}"
|
||||
wait: true
|
||||
|
25
roles/bitwarden/tasks/secrets.yaml
Normal file
25
roles/bitwarden/tasks/secrets.yaml
Normal file
@ -0,0 +1,25 @@
|
||||
- block:
|
||||
- name: Set DB namespace for secret lookup
|
||||
set_fact:
|
||||
db_namespace: "{{ bitwarden_db_namespace | default(postgres_db_namespace) | default(postgres_namespace) | default(postgres_operator_namespace) | default(namespace) }}"
|
||||
|
||||
- name: Set DB secret name for lookup
|
||||
set_fact:
|
||||
db_secret_name: "bitwarden.{{ postgres_db_team | default(namespace) }}-postgres.credentials.postgresql.acid.zalan.do"
|
||||
|
||||
- name: Lookup Bitwarden DB secret
|
||||
set_fact:
|
||||
bitwarden_db_secret: "{{ lookup('k8s', kind='Secret', namespace=db_namespace, resource_name=db_secret_name) }}"
|
||||
|
||||
- debug:
|
||||
msg: "{{ bitwarden_db_secret }}"
|
||||
verbosity: 2
|
||||
|
||||
- name: Set Bitwarden DB username
|
||||
set_fact:
|
||||
bitwarden_db_username: "{{ bitwarden_db_secret.data.username | b64decode }}"
|
||||
|
||||
- name: Set Bitwarden DB password
|
||||
set_fact:
|
||||
bitwarden_db_password: "{{ bitwarden_db_secret.data.password | b64decode }}"
|
||||
|
6
roles/cert-manager/defaults/main.yaml
Normal file
6
roles/cert-manager/defaults/main.yaml
Normal file
@ -0,0 +1,6 @@
|
||||
cert_manager_version: v1.1.0
|
||||
cert_manager_namespace: cert-manager
|
||||
lets_encrypt_mailbox: "admin@{{ domain }}"
|
||||
cert_manager_base64_tsig_key: "{{ k8s_tsig | b64encode }}"
|
||||
cert_manager_default_values:
|
||||
installCRDs: true
|
88
roles/cert-manager/tasks/main.yaml
Normal file
88
roles/cert-manager/tasks/main.yaml
Normal file
@ -0,0 +1,88 @@
|
||||
- set_fact:
|
||||
cert_manager_combined_values: "{{ cert_manager_default_values | combine(cert_manager_values, recursive=true) }}"
|
||||
|
||||
- name: Deploy Cert-manager {{ cert_manager_version }}
|
||||
community.kubernetes.helm:
|
||||
create_namespace: true
|
||||
release_namespace: "{{ cert_manager_namespace | default('cert-manager') }}"
|
||||
release_name: "{{ cert_manager_name | default('cert-manager') }}"
|
||||
chart_ref: "{{ cert_manager_chart | default('jetstack/cert-manager') }}"
|
||||
chart_version: "{{ cert_manager_version }}"
|
||||
release_values: "{{ cert_manager_combined_values | from_yaml | default(omit) }}"
|
||||
wait: true
|
||||
|
||||
- name: Create secret for DNS RFC2136 (NSUPDATE)
|
||||
k8s:
|
||||
state: present
|
||||
definition:
|
||||
apiVersion: v1
|
||||
data:
|
||||
tsig-secret-key: "{{ cert_manager_base64_tsig_key }}"
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: tsig-secret
|
||||
namespace: cert-manager
|
||||
type: Opaque
|
||||
|
||||
- name: Create Production ClusterIssuer for Let's Encrypt
|
||||
k8s:
|
||||
state: present
|
||||
definition:
|
||||
apiVersion: cert-manager.io/v1alpha2
|
||||
kind: ClusterIssuer
|
||||
metadata:
|
||||
name: letsencrypt-prod
|
||||
spec:
|
||||
acme:
|
||||
# The ACME server URL
|
||||
server: https://acme-v02.api.letsencrypt.org/directory
|
||||
# Email address used for ACME registration
|
||||
email: "{{ lets_encrypt_mailbox }}"
|
||||
# Name of a secret used to store the ACME account private key
|
||||
privateKeySecretRef:
|
||||
name: letsencrypt-prod
|
||||
# Enable the HTTP-01 challenge provider
|
||||
solvers:
|
||||
#- http01:
|
||||
# ingress:
|
||||
# class: nginx
|
||||
- dns01:
|
||||
rfc2136:
|
||||
nameserver: "{{ external_dns_ip | default(dns_ip) }}:53"
|
||||
tsigAlgorithm: HMACSHA512
|
||||
tsigKeyName: k8s
|
||||
tsigSecretSecretRef:
|
||||
key: tsig-secret-key
|
||||
name: tsig-secret
|
||||
|
||||
- name: Create Staging ClusterIssuer for Let's Encrypt
|
||||
k8s:
|
||||
state: present
|
||||
definition:
|
||||
apiVersion: cert-manager.io/v1alpha2
|
||||
kind: ClusterIssuer
|
||||
metadata:
|
||||
name: letsencrypt-staging
|
||||
spec:
|
||||
acme:
|
||||
# The ACME server URL
|
||||
server: https://acme-staging-v02.api.letsencrypt.org/directory
|
||||
# Email address used for ACME registration
|
||||
email: "{{ lets_encrypt_mailbox }}"
|
||||
# Name of a secret used to store the ACME account private key
|
||||
privateKeySecretRef:
|
||||
name: letsencrypt-staging
|
||||
# Enable the HTTP-01 challenge provider
|
||||
solvers:
|
||||
#- http01:
|
||||
# ingress:
|
||||
# class: nginx
|
||||
- dns01:
|
||||
rfc2136:
|
||||
nameserver: "{{ external_dns_ip | default(dns_ip) }}:53"
|
||||
tsigAlgorithm: HMACSHA512
|
||||
tsigKeyName: k8s
|
||||
tsigSecretSecretRef:
|
||||
key: tsig-secret-key
|
||||
name: tsig-secret
|
||||
|
86
roles/chartmuseum/defaults/main.yaml
Normal file
86
roles/chartmuseum/defaults/main.yaml
Normal file
@ -0,0 +1,86 @@
|
||||
chartmuseum_enabled: true
|
||||
chartmuseum_publish: false
|
||||
chartmuseum_default_values:
|
||||
env:
|
||||
open:
|
||||
# storage backend, can be one of: local, alibaba, amazon, google, microsoft, oracle
|
||||
STORAGE: local
|
||||
# levels of nested repos for multitenancy. The default depth is 0 (singletenant server)
|
||||
DEPTH: 0
|
||||
# sets the base context path
|
||||
CONTEXT_PATH: /
|
||||
# show debug messages
|
||||
DEBUG: false
|
||||
# output structured logs as json
|
||||
LOG_JSON: true
|
||||
# disable use of index-cache.yaml
|
||||
DISABLE_STATEFILES: false
|
||||
# disable Prometheus metrics
|
||||
DISABLE_METRICS: true
|
||||
# disable all routes prefixed with /api
|
||||
DISABLE_API: false
|
||||
# allow chart versions to be re-uploaded
|
||||
ALLOW_OVERWRITE: true
|
||||
# allow anonymous GET operations when auth is used
|
||||
AUTH_ANONYMOUS_GET: true
|
||||
secret:
|
||||
# username for basic http authentication
|
||||
BASIC_AUTH_USER: "{{ chartmuseum_admin_login | default('admin') }}"
|
||||
# password for basic http authentication
|
||||
BASIC_AUTH_PASS: "{{ chartmuseum_admin_pass | default(chartmuseum_admin_password) }}"
|
||||
|
||||
persistence:
|
||||
enabled: true
|
||||
accessMode: "{{ chartmuseum_storage_mode | default('ReadWriteMany') }}"
|
||||
size: "{{ chartmuseum_size | default('10Gi') }}"
|
||||
labels: {}
|
||||
path: /storage
|
||||
storageClass: "{{ chartmuseum_storage | default('nfs-hdd') }}"
|
||||
|
||||
## Ingress for load balancer
|
||||
ingress:
|
||||
enabled: true
|
||||
annotations:
|
||||
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
||||
cert-manager.io/acme-dns01-provider: "rfc2136"
|
||||
cert-manager.io/acme-challenge-type: "dns01"
|
||||
kubernetes.io/ingress.class: "{{ external_ingress_class if chartmuseum_publish else internal_ingress_class }}"
|
||||
kubernetes.io/tls-acme: "true"
|
||||
hosts:
|
||||
- name: charts.{{ domain }}
|
||||
path: /
|
||||
tls: true
|
||||
tlsSecret: charts.{{ domain }}-tls
|
||||
|
||||
chartmuseum_readonly_ingress_definition: |
|
||||
apiVersion: extensions/v1beta1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
annotations:
|
||||
cert-manager.io/acme-challenge-type: dns01
|
||||
cert-manager.io/acme-dns01-provider: rfc2136
|
||||
cert-manager.io/cluster-issuer: letsencrypt-prod
|
||||
kubernetes.io/ingress.class: "{{ external_ingress_class }}"
|
||||
nginx.ingress.kubernetes.io/proxy-body-size: "0"
|
||||
nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
|
||||
nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
|
||||
nginx.ingress.kubernetes.io/configuration-snippet: |-
|
||||
limit_except GET {
|
||||
deny all;
|
||||
}
|
||||
name: chartmuseum-public
|
||||
namespace: "{{ chartmuseum_namespace | default(namespace) }}"
|
||||
spec:
|
||||
rules:
|
||||
- host: "{{ chartmuseum_readonly_ingress }}"
|
||||
http:
|
||||
paths:
|
||||
- backend:
|
||||
serviceName: chartmuseum-chartmuseum
|
||||
servicePort: 8080
|
||||
path: /
|
||||
tls:
|
||||
- hosts:
|
||||
- "{{ chartmuseum_readonly_ingress }}"
|
||||
secretName: "{{ chartmuseum_readonly_ingress }}-tls"
|
||||
|
20
roles/chartmuseum/tasks/main.yaml
Normal file
20
roles/chartmuseum/tasks/main.yaml
Normal file
@ -0,0 +1,20 @@
|
||||
- set_fact:
|
||||
chartmuseum_combined_values: "{{ chartmuseum_default_values | combine(chartmuseum_values, recursive=true) }}"
|
||||
|
||||
- name: Deploy ChartMuseum
|
||||
community.kubernetes.helm:
|
||||
create_namespace: true
|
||||
release_namespace: "{{ chartmuseum_namespace | default(namespace) }}"
|
||||
release_name: "{{ chartmuseum_name | default('chartmuseum') }}"
|
||||
chart_ref: "{{ chartmuseum_chart | default('ghp/chartmuseum') }}"
|
||||
chart_version: "{{ chartmuseum_version | default(omit) }}"
|
||||
release_values: "{{ chartmuseum_combined_values | from_yaml }}"
|
||||
wait: true
|
||||
|
||||
- name: Deploy readonly public ingress for ChartMuseum
|
||||
when: chartmuseum_readonly_ingress is defined
|
||||
k8s:
|
||||
state: present
|
||||
definition:
|
||||
"{{ chartmuseum_readonly_ingress_definition }}"
|
||||
|
3
roles/ddclient/defaults/main.yml
Normal file
3
roles/ddclient/defaults/main.yml
Normal file
@ -0,0 +1,3 @@
|
||||
dockerize: false
|
||||
namespace: ddclient
|
||||
ddclient_image_tag: v3.9.1-ls45
|
27
roles/ddclient/handlers/main.yml
Normal file
27
roles/ddclient/handlers/main.yml
Normal file
@ -0,0 +1,27 @@
|
||||
---
|
||||
- name: start ddclient
|
||||
systemd:
|
||||
name: ddclient
|
||||
state: started
|
||||
enabled: yes
|
||||
|
||||
- name: restart ddclient
|
||||
systemd:
|
||||
name: ddclient
|
||||
state: restarted
|
||||
enabled: yes
|
||||
|
||||
- name: restart docker ddclient
|
||||
community.general.docker_container:
|
||||
name: "{{ namespace }}-ddclient"
|
||||
image: "{{ docker_registry }}/ddclient:{{ ddclient_image_tag | default('v3.9.1-ls45') }}"
|
||||
state: started
|
||||
restart: yes
|
||||
container_default_behavior: no_defaults
|
||||
detach: true
|
||||
restart_policy: unless-stopped
|
||||
volumes:
|
||||
- "/opt/{{ namespace }}/ddclient.conf:/config/ddclient.conf"
|
||||
- "/opt/{{ namespace }}/Kvps.key:/config/Kvps.key"
|
||||
- "/opt/{{ namespace }}/Kvps.private:/config/Kvps.private"
|
||||
|
18
roles/ddclient/tasks/configure.yml
Normal file
18
roles/ddclient/tasks/configure.yml
Normal file
@ -0,0 +1,18 @@
|
||||
---
|
||||
- block:
|
||||
- name: copy public key for ddclient
|
||||
copy:
|
||||
dest: /etc/Kvps.key
|
||||
src: files/Kvps.key
|
||||
|
||||
- name: copy private key for ddclient
|
||||
copy:
|
||||
dest: /etc/Kvps.private
|
||||
src: files/Kvps.private
|
||||
|
||||
- name: configure ddlient.conf
|
||||
copy:
|
||||
content: "{{ ddclient_conf }}"
|
||||
dest: "/etc/ddclient.conf"
|
||||
notify: restart ddclient
|
||||
|
35
roles/ddclient/tasks/docker.yml
Normal file
35
roles/ddclient/tasks/docker.yml
Normal file
@ -0,0 +1,35 @@
|
||||
---
|
||||
- name: Create configuration dir for {{ namespace }}
|
||||
file:
|
||||
name: "/opt/{{ namespace }}"
|
||||
state: directory
|
||||
|
||||
- name: Copy ddclient configuration for {{ namespace }}
|
||||
copy:
|
||||
dest: "/opt/{{ namespace }}/ddclient.conf"
|
||||
content: "{{ ddclient_conf }}"
|
||||
notify: restart docker ddclient
|
||||
|
||||
- name: Copy Kvps.key for {{ namespace }}
|
||||
copy:
|
||||
dest: "/opt/{{ namespace }}/Kvps.key"
|
||||
content: "{{ ddclient_tsig_public_key_base64 | b64decode }}"
|
||||
notify: restart docker ddclient
|
||||
|
||||
- name: Copy Kvps.private for {{ namespace }}
|
||||
copy:
|
||||
dest: "/opt/{{ namespace }}/Kvps.private"
|
||||
content: "{{ ddclient_tsig_private_key_base64 | b64decode }}"
|
||||
notify: restart docker ddclient
|
||||
|
||||
- name: Start ddclient in docker for {{ namespace }}
|
||||
docker_container:
|
||||
name: "{{ namespace }}-ddclient"
|
||||
image: "{{ docker_registry }}/ddclient:{{ ddclient_image_tag }}"
|
||||
state: started
|
||||
container_default_behavior: no_defaults
|
||||
restart_policy: unless-stopped
|
||||
volumes:
|
||||
- "/opt/{{ namespace }}/ddclient.conf:/config/ddclient.conf"
|
||||
- "/opt/{{ namespace }}/Kvps.key:/config/Kvps.key"
|
||||
- "/opt/{{ namespace }}/Kvps.private:/config/Kvps.private"
|
11
roles/ddclient/tasks/install.yml
Normal file
11
roles/ddclient/tasks/install.yml
Normal file
@ -0,0 +1,11 @@
|
||||
---
|
||||
- block:
|
||||
- name: installing ddclient
|
||||
package:
|
||||
name:
|
||||
- ddclient
|
||||
state: present
|
||||
notify: start ddclient
|
||||
register: install_ddlient_result
|
||||
tags:
|
||||
- ddclient-install
|
12
roles/ddclient/tasks/main.yml
Normal file
12
roles/ddclient/tasks/main.yml
Normal file
@ -0,0 +1,12 @@
|
||||
---
|
||||
- block:
|
||||
- import_tasks: install.yml
|
||||
when: not dockerize
|
||||
- import_tasks: configure.yml
|
||||
when: not dockerize
|
||||
become: true
|
||||
|
||||
- block:
|
||||
- import_tasks: docker.yml
|
||||
when: dockerize
|
||||
become: true
|
1
roles/docker/defaults/main.yml
Normal file
1
roles/docker/defaults/main.yml
Normal file
@ -0,0 +1 @@
|
||||
install_docker_ce_repo: 'yes'
|
54
roles/docker/tasks/docker.yml
Normal file
54
roles/docker/tasks/docker.yml
Normal file
@ -0,0 +1,54 @@
|
||||
---
|
||||
- block:
|
||||
- name: Install packages for Docker
|
||||
yum:
|
||||
name:
|
||||
- device-mapper-persistent-data
|
||||
- lvm2
|
||||
- libselinux-python
|
||||
state: present
|
||||
|
||||
- name: add docker-ce repo
|
||||
yum_repository:
|
||||
name: docker-ce-stable
|
||||
file: docker-ce
|
||||
description: Docker CE Stable - $basearch
|
||||
enabled: yes
|
||||
baseurl: https://download.docker.com/linux/centos/7/$basearch/stable
|
||||
gpgkey: https://download.docker.com/linux/centos/gpg
|
||||
gpgcheck: yes
|
||||
when: install_docker_ce_repo == 'yes'
|
||||
become: yes
|
||||
|
||||
- name: Install Docker
|
||||
package:
|
||||
name: docker-ce
|
||||
state: present
|
||||
become: yes
|
||||
|
||||
- name: Create /etc/docker directory
|
||||
file:
|
||||
path: /etc/docker
|
||||
state: directory
|
||||
|
||||
- name: Deploy Docker daemon.json
|
||||
template:
|
||||
src: daemon.json.j2
|
||||
dest: /etc/docker/daemon.json
|
||||
register: daemon_config_result
|
||||
|
||||
- name: Start Docker service
|
||||
service:
|
||||
name: docker
|
||||
state: started
|
||||
enabled: yes
|
||||
become: yes
|
||||
|
||||
- name: Restart Docker
|
||||
systemd:
|
||||
state: restarted
|
||||
name: docker
|
||||
when: daemon_config_result.changed
|
||||
|
||||
tags:
|
||||
- docker
|
5
roles/docker/tasks/main.yml
Normal file
5
roles/docker/tasks/main.yml
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
- block:
|
||||
- import_tasks: docker.yml
|
||||
tags:
|
||||
- docker
|
18
roles/docker/templates/daemon.json.j2
Normal file
18
roles/docker/templates/daemon.json.j2
Normal file
@ -0,0 +1,18 @@
|
||||
{% if docker is defined %}
|
||||
|
||||
{% if docker.insecure_registries is defined %}
|
||||
{% set insecure_registries = docker.insecure_registries %}
|
||||
{% endif %}
|
||||
|
||||
{% endif %}
|
||||
{
|
||||
"exec-opts": ["native.cgroupdriver=systemd"],
|
||||
"log-driver": "json-file",
|
||||
{% if insecure_registries is defined %}
|
||||
"insecure-registries" : ["{{ insecure_registries }}"],
|
||||
{% endif %}
|
||||
"log-opts": {
|
||||
"max-size": "100m"
|
||||
}
|
||||
}
|
||||
|
201
roles/dovecot/defaults/main.yaml
Normal file
201
roles/dovecot/defaults/main.yaml
Normal file
@ -0,0 +1,201 @@
|
||||
dovecot_default_values:
|
||||
replicaCount: 1
|
||||
persistence:
|
||||
enabled: true
|
||||
existingClaim: mailboxes
|
||||
|
||||
tls:
|
||||
enabled: true
|
||||
existingSecret: mail.{{ domain }}-secret
|
||||
|
||||
dovecot:
|
||||
image:
|
||||
repository: "{{ docker_registry }}/dovecot"
|
||||
tag: latest
|
||||
pullPolicy: Always
|
||||
configmaps:
|
||||
dovecot:
|
||||
dovecot: |
|
||||
protocols = imap lmtp sieve
|
||||
mail_max_userip_connections = 1000
|
||||
mail_plugins = virtual
|
||||
|
||||
haproxy_trusted_networks = 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16
|
||||
haproxy_timeout = 30s
|
||||
dict {
|
||||
#quota = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext
|
||||
#expire = sqlite:/etc/dovecot/dovecot-dict-sql.conf.ext
|
||||
}
|
||||
|
||||
# Most of the actual configuration gets included below. The filenames are
|
||||
# first sorted by their ASCII value and parsed in that order. The 00-prefixes
|
||||
# in filenames are intended to make it easier to understand the ordering.
|
||||
!include conf.d/*.conf
|
||||
|
||||
# A config file can also tried to be included without giving an error if
|
||||
# it's not found:
|
||||
!include_try local.conf
|
||||
ldap: |
|
||||
uris = ldaps://openldap.{{ domain }}
|
||||
dn = uid=ldapbind,ou=services,{{ openldap_domain }}
|
||||
dnpass = {{ ldapbind_pass | default(ldapbind_password) }}
|
||||
auth_bind = yes
|
||||
auth_bind_userdn = uid=%n,ou=users,{{ openldap_domain }}
|
||||
tls = no
|
||||
ldap_version = 3
|
||||
base = ou=users,{{ openldap_domain }}
|
||||
deref = never
|
||||
scope = subtree
|
||||
user_filter = (&(objectClass=posixAccount)(mail=%u))
|
||||
user_attrs = cn=home=/home/vmail/%$
|
||||
pass_filter = (&(objectClass=posixAccount)(mail=%u))
|
||||
pass_attrs = uid=user,userPassword=password
|
||||
#default_pass_scheme = CRYPT
|
||||
confd:
|
||||
auth-ldap: |
|
||||
passdb {
|
||||
driver = ldap
|
||||
|
||||
# Path for LDAP configuration file, see example-config/dovecot-ldap.conf.ext
|
||||
args = /etc/dovecot/ldap.conf
|
||||
}
|
||||
userdb {
|
||||
driver = ldap
|
||||
args = /etc/dovecot/ldap.conf
|
||||
|
||||
}
|
||||
10-auth: |
|
||||
auth_default_realm = {{ domain }}
|
||||
auth_username_format = %Lu
|
||||
auth_mechanisms = plain login
|
||||
10-mail: |
|
||||
mail_location = maildir:%h
|
||||
namespace inbox {
|
||||
inbox = yes
|
||||
}
|
||||
mail_uid = vmail
|
||||
mail_gid = vmail
|
||||
first_valid_uid = 1000
|
||||
last_valid_uid = 1000
|
||||
first_valid_gid = 1000
|
||||
last_valid_gid = 1000
|
||||
protocol !indexer-worker {
|
||||
}
|
||||
mbox_write_locks = fcntl
|
||||
10-master: |
|
||||
protocol imap {
|
||||
mail_plugins = virtual
|
||||
}
|
||||
service imap-login {
|
||||
inet_listener imap {
|
||||
#port = 143
|
||||
}
|
||||
inet_listener imaps {
|
||||
#port = 993
|
||||
#ssl = yes
|
||||
}
|
||||
inet_listener imap_haproxy {
|
||||
port = 1109
|
||||
haproxy = yes
|
||||
}
|
||||
inet_listener imaps_haproxy {
|
||||
port = 10993
|
||||
ssl = yes
|
||||
haproxy = yes
|
||||
}
|
||||
}
|
||||
|
||||
service pop3-login {
|
||||
inet_listener pop3 {
|
||||
#port = 110
|
||||
}
|
||||
inet_listener pop3s {
|
||||
#port = 995
|
||||
#ssl = yes
|
||||
}
|
||||
}
|
||||
|
||||
service lmtp {
|
||||
inet_listener lmtp {
|
||||
port = 24
|
||||
}
|
||||
unix_listener /var/spool/postfix/private/dovecot-lmtp {
|
||||
mode = 0600
|
||||
group = postfix
|
||||
user = postfix
|
||||
}
|
||||
user = vmail
|
||||
}
|
||||
|
||||
service imap {
|
||||
}
|
||||
|
||||
service pop3 {
|
||||
}
|
||||
|
||||
service auth {
|
||||
inet_listener {
|
||||
port = 12345
|
||||
}
|
||||
unix_listener auth-userdb {
|
||||
mode = 0660
|
||||
user = vmail
|
||||
#group =
|
||||
}
|
||||
|
||||
# Postfix smtp-auth
|
||||
unix_listener /var/spool/postfix/private/auth {
|
||||
mode = 0660
|
||||
user = postfix
|
||||
group = postfix
|
||||
}
|
||||
}
|
||||
|
||||
service auth-worker {
|
||||
}
|
||||
|
||||
service dict {
|
||||
unix_listener dict {
|
||||
}
|
||||
}
|
||||
10-ssl: |
|
||||
ssl = required
|
||||
#verbose_ssl = yes
|
||||
ssl_prefer_server_ciphers = yes
|
||||
ssl_min_protocol = TLSv1.2
|
||||
ssl_cert = </tls/tls.crt
|
||||
ssl_key = </tls/tls.key
|
||||
10-logging: |
|
||||
log_path = /dev/stderr
|
||||
info_log_path = /dev/stdout
|
||||
debug_log_path = /dev/stdout
|
||||
15-lda: |
|
||||
postmaster_address = postmaster@{{ domain }}
|
||||
hostname = {{ domain }}
|
||||
rejection_reason = Your message to was automatically rejected:%n%r
|
||||
protocol lda {
|
||||
mail_plugins = virtual sieve
|
||||
}
|
||||
20-lmtp: |
|
||||
protocol lmtp {
|
||||
mail_plugins = virtual sieve
|
||||
postmaster_address = postmaster@{{ domain }}
|
||||
}
|
||||
20-managesieve: |
|
||||
service managesieve-login {
|
||||
inet_listener sieve {
|
||||
port = 4190
|
||||
ssl = yes
|
||||
}
|
||||
service_count = 1
|
||||
vsz_limit = 64M
|
||||
}
|
||||
|
||||
service managesieve {
|
||||
process_limit = 1024
|
||||
}
|
||||
|
||||
service:
|
||||
type: LoadBalancer
|
||||
loadBalancerIP: "{{ dovecot_loadbalancer_ip | default(omit) }}"
|
||||
|
13
roles/dovecot/tasks/main.yaml
Normal file
13
roles/dovecot/tasks/main.yaml
Normal file
@ -0,0 +1,13 @@
|
||||
- set_fact:
|
||||
dovecot_combined_values: "{{ dovecot_default_values | combine(dovecot_values, recursive=true) }}"
|
||||
|
||||
- name: Deploy Dovecot
|
||||
community.kubernetes.helm:
|
||||
create_namespace: true
|
||||
release_namespace: "{{ dovecot_namespace | default(mail_namespace) | default(namespace) }}"
|
||||
release_name: "{{ dovecot_name | default('dovecot') }}"
|
||||
chart_ref: "{{ dovecot_chart | default('ghp/dovecot') }}"
|
||||
chart_version: "{{ dovecot_version | default(omit) }}"
|
||||
release_values: "{{ dovecot_combined_values | from_yaml }}"
|
||||
wait: true
|
||||
|
50
roles/drone/defaults/main.yaml
Normal file
50
roles/drone/defaults/main.yaml
Normal file
@ -0,0 +1,50 @@
|
||||
drone_enabled: true
|
||||
drone_publish: false
|
||||
drone_use_external_db: true
|
||||
drone_default_values:
|
||||
service:
|
||||
type: ClusterIP
|
||||
port: 80
|
||||
ingress:
|
||||
enabled: true
|
||||
annotations:
|
||||
kubernetes.io/ingress.class: "{{ external_ingress_class if drone_publish else internal_ingress_class }}"
|
||||
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
||||
cert-manager.io/acme-dns01-provider: "rfc2136"
|
||||
cert-manager.io/acme-challenge-type: "dns01"
|
||||
hosts:
|
||||
- host: "drone.{{ domain }}"
|
||||
paths:
|
||||
- "/"
|
||||
tls:
|
||||
- secretName: "drone.{{ domain }}-tls"
|
||||
hosts:
|
||||
- "drone.{{ domain }}"
|
||||
persistentVolume:
|
||||
enabled: true
|
||||
accessModes:
|
||||
- "{{ drone_storage_mode | default('ReadWriteMany') }}"
|
||||
mountPath: /data
|
||||
size: "{{ drone_size | default('8Gi') }}"
|
||||
storageClass: "{{ drone_storage | default('nfs-ssd') }}"
|
||||
env:
|
||||
DRONE_SERVER_HOST: "drone.{{ domain }}"
|
||||
DRONE_SERVER_PROTO: https
|
||||
DRONE_RPC_SECRET: "{{ drone_rpc_secret | default(omit) }}"
|
||||
DRONE_DATABASE_DRIVER: "postgres"
|
||||
DRONE_DATABASE_DATASOURCE: "postgres://{{ drone_db_username }}:{{ drone_db_password }}@{{ postgres_db_team | default(namespace) }}-postgres.{{ postgres_db_namespace | default(namespace) }}.svc.cluster.local:5432/drone?sslmode=disable"
|
||||
DRONE_DATABASE_SECRET: "{{ drone_database_secret | default(omit) }}"
|
||||
DRONE_GITEA_CLIENT_ID: "{{ drone_gitea_client_id | default(omit) }}"
|
||||
DRONE_GITEA_CLIENT_SECRET: "{{ drone_gitea_client_secret | default(omit) }}"
|
||||
DRONE_GITEA_SERVER: "https://gitea.{{ domain }}"
|
||||
|
||||
drone_runner_kube_default_values:
|
||||
rbac:
|
||||
buildNamespaces:
|
||||
- "{{ drone_namespace | default(namespace) }}"
|
||||
env:
|
||||
DRONE_RPC_SECRET: "{{ drone_rpc_secret }}"
|
||||
DRONE_RPC_HOST: "drone.{{ domain }}"
|
||||
DRONE_RPC_PROTO: https
|
||||
DRONE_NAMESPACE_DEFAULT: "{{ drone_namespace | default(namespace) }}"
|
||||
|
31
roles/drone/tasks/main.yaml
Normal file
31
roles/drone/tasks/main.yaml
Normal file
@ -0,0 +1,31 @@
|
||||
- name: Import secret.yaml to obtain secrets
|
||||
include_tasks: secrets.yaml
|
||||
when:
|
||||
- drone_use_external_db
|
||||
- postgres_enable
|
||||
|
||||
- set_fact:
|
||||
drone_combined_values: "{{ drone_default_values | combine(drone_values, recursive=true) }}"
|
||||
|
||||
- set_fact:
|
||||
drone_runner_kube_combined_values: "{{ drone_runner_kube_default_values | combine(drone_runner_kube_values, recursive=true) }}"
|
||||
|
||||
- name: Deploy Drone Server
|
||||
community.kubernetes.helm:
|
||||
create_namespace: true
|
||||
release_namespace: "{{ drone_namespace | default(namespace) }}"
|
||||
release_name: "{{ drone_name | default('drone') }}"
|
||||
chart_ref: "{{ drone_chart | default('drone/drone') }}"
|
||||
chart_version: "{{ drone_version | default(omit) }}"
|
||||
release_values: "{{ drone_combined_values | from_yaml }}"
|
||||
wait: true
|
||||
|
||||
- name: Deploy Drone Runner Kube
|
||||
community.kubernetes.helm:
|
||||
create_namespace: true
|
||||
release_namespace: "{{ drone_runner_kube_namespace | default(namespace) }}"
|
||||
release_name: "{{ drone_runner_kube_name | default('drone-runner-kube') }}"
|
||||
chart_ref: "{{ drone_runner_kube_chart | default('drone/drone-runner-kube') }}"
|
||||
chart_version: "{{ drone_runner_kube_version | default(omit) }}"
|
||||
release_values: "{{ drone_runner_kube_combined_values | from_yaml }}"
|
||||
wait: true
|
25
roles/drone/tasks/secrets.yaml
Normal file
25
roles/drone/tasks/secrets.yaml
Normal file
@ -0,0 +1,25 @@
|
||||
- block:
|
||||
- name: Set DB namespace for secret lookup
|
||||
set_fact:
|
||||
db_namespace: "{{ drone_db_namespace | default(postgres_db_namespace) | default(postgres_namespace) | default(postgres_operator_namespace) | default(namespace) }}"
|
||||
|
||||
- name: Set DB secret name for lookup
|
||||
set_fact:
|
||||
db_secret_name: "drone.{{ postgres_db_team | default(namespace) }}-postgres.credentials.postgresql.acid.zalan.do"
|
||||
|
||||
- name: Lookup Drone DB secret
|
||||
set_fact:
|
||||
drone_db_secret: "{{ lookup('k8s', kind='Secret', namespace=db_namespace, resource_name=db_secret_name) }}"
|
||||
|
||||
- debug:
|
||||
msg: "{{ drone_db_secret }}"
|
||||
verbosity: 2
|
||||
|
||||
- name: Set Drone DB username
|
||||
set_fact:
|
||||
drone_db_username: "{{ drone_db_secret.data.username | b64decode }}"
|
||||
|
||||
- name: Set Drone DB password
|
||||
set_fact:
|
||||
drone_db_password: "{{ drone_db_secret.data.password | b64decode }}"
|
||||
|
15
roles/external-dns/defaults/main.yaml
Normal file
15
roles/external-dns/defaults/main.yaml
Normal file
@ -0,0 +1,15 @@
|
||||
external_dns_default_values:
|
||||
fullnameOverride: "{{ external_dns_name | default(namespace + '-external-dns') }}"
|
||||
annotationFilter: "kubernetes.io/ingress.class={{ external_ingress_class }}"
|
||||
domainFilters: ["{{ external_domain | default(domain) }}"]
|
||||
provider: rfc2136
|
||||
rfc2136:
|
||||
host: "{{ external_dns_ip | default(dns_ip) }}"
|
||||
port: 53
|
||||
zone: "{{ external_domain | default(domain) }}"
|
||||
tsigSecret: "{{ k8s_tsig }}"
|
||||
tsigSecretAlg: "{{ external_dns_tsigSecretAlg | default('hmac-sha512') }}"
|
||||
tsigKeyname: "{{ external_dns_tsigKeyname | default('k8s') }}"
|
||||
tsigAxfr: true
|
||||
## Possible units [ns, us, ms, s, m, h], see more https://golang.org/pkg/time/#ParseDuration
|
||||
minTTL: "30s"
|
12
roles/external-dns/tasks/main.yaml
Normal file
12
roles/external-dns/tasks/main.yaml
Normal file
@ -0,0 +1,12 @@
|
||||
- set_fact:
|
||||
external_dns_combined_values: "{{ external_dns_default_values | combine(external_dns_values, recursive=true) }}"
|
||||
|
||||
- name: Deploy external DNS
|
||||
community.kubernetes.helm:
|
||||
create_namespace: true
|
||||
release_namespace: "{{ external_dns_namespace | default(dns_namespace) | default(namespace) }}"
|
||||
release_name: "{{ external_dns_name | default(namespace + '-external-dns') }}"
|
||||
chart_ref: "{{ external_dns_chart | default('bitnami/external-dns') }}"
|
||||
chart_version: "{{ external_dns_version | default(omit) }}"
|
||||
release_values: "{{ external_dns_combined_values | from_yaml }}"
|
||||
wait: true
|
14
roles/external-ingress-nginx/defaults/main.yaml
Normal file
14
roles/external-ingress-nginx/defaults/main.yaml
Normal file
@ -0,0 +1,14 @@
|
||||
external_ingress_nginx_default_values:
|
||||
controller:
|
||||
config:
|
||||
use-proxy-protocol: true
|
||||
use-forward-headers: true
|
||||
compute-full-forward-for: true
|
||||
publishService:
|
||||
enabled: true
|
||||
scope:
|
||||
enabled: false
|
||||
service:
|
||||
loadBalancerIP: "{{ external_loadbalancer_ip | default(omit) }}"
|
||||
externalTrafficPolicy: Local
|
||||
ingressClass: "{{ external_ingress_class }}"
|
13
roles/external-ingress-nginx/tasks/main.yaml
Normal file
13
roles/external-ingress-nginx/tasks/main.yaml
Normal file
@ -0,0 +1,13 @@
|
||||
- set_fact:
|
||||
external_ingress_nginx_combined_values: "{{ external_ingress_nginx_default_values | combine(external_ingress_nginx_values, recursive=true) }}"
|
||||
|
||||
- name: Deploy external Nginx Ingress
|
||||
community.kubernetes.helm:
|
||||
create_namespace: true
|
||||
release_namespace: "{{ external_ingress_nginx_namespace | default(ingress_namespace) | default(namespace) }}"
|
||||
release_name: "{{ external_ingress_nginx_name | default(namespace + '-external-ingress-nginx') }}"
|
||||
chart_ref: "{{ external_ingress_nginx_chart | default('ingress-nginx/ingress-nginx') }}"
|
||||
chart_version: "{{ external_ingress_nginx_version | default(omit) }}"
|
||||
release_values: "{{ external_ingress_nginx_combined_values | from_yaml }}"
|
||||
wait: true
|
||||
when: external_ingress_nginx_enabled | default(true)
|
137
roles/gitea/defaults/main.yaml
Normal file
137
roles/gitea/defaults/main.yaml
Normal file
@ -0,0 +1,137 @@
|
||||
gitea_enabled: true
|
||||
gitea_publish_web: false
|
||||
gitea_publish_ssh: false
|
||||
gitea_use_external_db: true
|
||||
gitea_ingress_class: "{{ gitea_namespace | default(namespace) }}-{{ 'public' if gitea_publish_web else 'private' }}-gitea-ingress-nginx"
|
||||
gitea_default_values:
|
||||
config:
|
||||
disableInstaller: true
|
||||
admin_user: "{{ gitea_admin_user | default('gitea') }}"
|
||||
admin_pass: "{{ gitea_admin_pass | default(gitea_admin_password) }}"
|
||||
mailer:
|
||||
domain: "{{ mail_domain | default(domain) }}"
|
||||
enabled: true
|
||||
host: "mail.{{ mail_domain | default(domain) }}:465"
|
||||
skip_verify: false
|
||||
is_tls_enabled: true
|
||||
from: "gitea@{{ mail_domain | default(domain) }}"
|
||||
user: "{{ gitea_ldap_user | default('gitea') }}"
|
||||
passwd: "{{ gitea_ldap_pass | default(gitea_ldap_password) }}"
|
||||
ingress:
|
||||
## Set to true to enable ingress record generation
|
||||
enabled: true
|
||||
## When the ingress is enabled, a host pointing to this will be created
|
||||
hostname: "gitea.{{ domain }}"
|
||||
annotations:
|
||||
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
||||
cert-manager.io/acme-dns01-provider: "rfc2136"
|
||||
cert-manager.io/acme-challenge-type: "dns01"
|
||||
kubernetes.io/ingress.class: "{{ gitea_ingress_class }}"
|
||||
nginx.ingress.kubernetes.io/proxy-body-size: "0"
|
||||
nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
|
||||
nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
|
||||
kubernetes.io/tls-acme: "true"
|
||||
#
|
||||
## The list of additional hostnames to be covered with this ingress record.
|
||||
## Most likely the hostname above will be enough, but in the event more hosts are needed, this is an array
|
||||
# hosts:
|
||||
# - name: git.example.com
|
||||
# path: /
|
||||
tls:
|
||||
- hosts:
|
||||
- "gitea.{{ domain }}"
|
||||
secretName: "gitea.{{ domain }}-tls"
|
||||
service:
|
||||
type: ClusterIP
|
||||
## This can stay as ClusterIP as (by default) we use ingress
|
||||
http:
|
||||
port: 3000
|
||||
## Make the external port available
|
||||
# externalPort: 8082
|
||||
# externalHost: gitea.local
|
||||
## SSH is commonly on port 22
|
||||
ssh:
|
||||
port: 22
|
||||
## If serving on a different external port used for determining the ssh url in the gui
|
||||
# externalPort: 22
|
||||
# externalHost: gitea.local
|
||||
# externalIPs: []
|
||||
persistence:
|
||||
enabled: true
|
||||
# existingGiteaClaim: gitea-gitea
|
||||
accessMode: "{{ gitea_storage_mode | default('ReadWriteMany') }}"
|
||||
size: "{{ gitea_size | default('20Gi') }}"
|
||||
storageClass: "{{ gitea_storage | default('nfs-ssd') }}"
|
||||
## addtional annotations for PVCs. Uncommenting will prevent the PVC from being deleted.
|
||||
annotations:
|
||||
"helm.sh/resource-policy": keep
|
||||
lfs:
|
||||
enabled: "{{ gitea_lfs | default(true) }}"
|
||||
accessMode: "{{ gitea_lfs_storage_mode | default('ReadWriteMany') }}"
|
||||
size: "{{ gitea_lfs_size | default('50Gi') }}"
|
||||
storageClass: "{{ gitea_lfs_storage | default('nfs-hdd') }}"
|
||||
annotations:
|
||||
"helm.sh/resource-policy": keep
|
||||
mariadb:
|
||||
enabled: false
|
||||
externalDB:
|
||||
enabled: true
|
||||
dbType: "postgres"
|
||||
dbHost: "{{ postgres_db_team | default(namespace) }}-postgres.{{ postgres_db_namespace | default(namespace) }}.svc.cluster.local"
|
||||
dbPort: "5432"
|
||||
dbDatabase: "gitea"
|
||||
dbUser: "{{ gitea_db_username | default(omit)}}"
|
||||
dbPassword: "{{ gitea_db_password | default(omit) }}"
|
||||
|
||||
gitea_publush_ingress_nginx_values:
|
||||
controller:
|
||||
config:
|
||||
use-proxy-protocol: true
|
||||
use-forward-headers: true
|
||||
compute-full-forward-for: true
|
||||
service:
|
||||
externalTrafficPolicy: Local
|
||||
|
||||
gitea_ingress_nginx_default_values:
|
||||
controller:
|
||||
containerPort:
|
||||
ssh: 22
|
||||
http: 80
|
||||
https: 443
|
||||
publishService:
|
||||
enabled: true
|
||||
scope:
|
||||
enabled: true
|
||||
extraArgs:
|
||||
tcp-services-configmap: "{{ gitea_namespace | default(namespace) }}/{{ gitea_ingress_nginx_name | default(namespace + '-gitea-ingress-nginx') }}-tcp"
|
||||
service:
|
||||
enabled: true
|
||||
type: LoadBalancer
|
||||
loadBalancerIP: "{{ gitea_loadbalancer_ip | default(omit) }}"
|
||||
ports:
|
||||
ssh: 22
|
||||
http: 80
|
||||
https: 443
|
||||
targetPorts:
|
||||
ssh: ssh
|
||||
http: http
|
||||
https: https
|
||||
ingressClass: "{{ gitea_ingress_class }}"
|
||||
tcp:
|
||||
22: "{{ gitea_namespace | default(namespace) }}/gitea-gitea-svc:22"
|
||||
|
||||
gitea_dns_default_values:
|
||||
fullnameOverride: "{{ gitea_dns_name | default(namespace + '-gitea-internal-dns') }}"
|
||||
annotationFilter: "kubernetes.io/ingress.class={{ gitea_ingress_class }}"
|
||||
domainFilters: ["{{ domain }}"]
|
||||
provider: rfc2136
|
||||
rfc2136:
|
||||
host: "{{ dns_ip }}"
|
||||
port: 53
|
||||
zone: "{{ domain }}"
|
||||
tsigSecret: "{{ k8s_tsig }}"
|
||||
tsigSecretAlg: "{{ gitea_dns_tsigSecretAlg | default('hmac-sha512') }}"
|
||||
tsigKeyname: "{{ gitea_dns_tsigKeyname | default('k8s') }}"
|
||||
tsigAxfr: true
|
||||
## Possible units [ns, us, ms, s, m, h], see more https://golang.org/pkg/time/#ParseDuration
|
||||
minTTL: "30s"
|
50
roles/gitea/tasks/main.yaml
Normal file
50
roles/gitea/tasks/main.yaml
Normal file
@ -0,0 +1,50 @@
|
||||
- name: Import secret.yaml to obtain secrets
|
||||
include_tasks: secrets.yaml
|
||||
when:
|
||||
- gitea_use_external_db
|
||||
- postgres_enable
|
||||
|
||||
- set_fact:
|
||||
gitea_combined_values: "{{ gitea_default_values | combine(gitea_values, recursive=true) }}"
|
||||
|
||||
- set_fact:
|
||||
gitea_dns_combined_values: "{{ gitea_dns_default_values | combine(gitea_dns_values, recursive=true) }}"
|
||||
|
||||
- set_fact:
|
||||
gitea_ingress_nginx_combined_values: "{{ gitea_ingress_nginx_default_values | combine(gitea_ingress_nginx_values, recursive=true) }}"
|
||||
|
||||
- set_fact:
|
||||
gitea_ingress_nginx_combined_values: "{{ gitea_ingress_nginx_combined_values | combine(gitea_publush_ingress_nginx_values, recursive=true) }}"
|
||||
when: gitea_publish_web
|
||||
|
||||
- name: Deploy Nginx Ingress for Gitea
|
||||
community.kubernetes.helm:
|
||||
create_namespace: true
|
||||
release_namespace: "{{ gitea_ingress_nginx_namespace | default(namespace) }}"
|
||||
release_name: "{{ gitea_ingress_nginx_name | default(namespace + '-gitea-ingress-nginx') }}"
|
||||
chart_ref: "{{ gitea_ingress_nginx_chart | default('ingress-nginx/ingress-nginx') }}"
|
||||
chart_version: "{{ gitea_ingress_nginx_version | default(omit) }}"
|
||||
release_values: "{{ gitea_ingress_nginx_combined_values | from_yaml }}"
|
||||
wait: true
|
||||
|
||||
- name: Deploy DNS for Gitea
|
||||
community.kubernetes.helm:
|
||||
create_namespace: true
|
||||
release_namespace: "{{ gitea_dns_namespace | default(namespace) }}"
|
||||
release_name: "{{ gitea_dns_name | default('gitea-internal-dns') }}"
|
||||
chart_ref: "{{ gitea_dns_chart | default('bitnami/external-dns') }}"
|
||||
chart_version: "{{ gitea_dns_version | default(omit) }}"
|
||||
release_values: "{{ gitea_dns_combined_values | from_yaml }}"
|
||||
wait: true
|
||||
when: gitea_publish_web == false
|
||||
|
||||
- name: Deploy Gitea
|
||||
community.kubernetes.helm:
|
||||
create_namespace: true
|
||||
release_namespace: "{{ gitea_namespace | default(namespace) }}"
|
||||
release_name: "{{ gitea_name | default('gitea') }}"
|
||||
chart_ref: "{{ gitea_chart | default('ghp/gitea') }}"
|
||||
chart_version: "{{ gitea_version | default(omit) }}"
|
||||
release_values: "{{ gitea_combined_values | from_yaml }}"
|
||||
wait: true
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user