From 8bd4ee9dd253d9bdd7905dceef5e636667f83681 Mon Sep 17 00:00:00 2001 From: Bastian de Byl Date: Thu, 5 Oct 2023 12:08:22 -0400 Subject: [PATCH] noticket - added skudak cloud (nextcloud) --- ansible/roles/podman/defaults/main.yml | 2 + .../podman/tasks/configuration-nginx-http.yml | 2 + .../tasks/configuration-nginx-https.yml | 2 + .../podman/tasks/container-cloud-skudak.yml | 100 ++++++++++++++++++ .../roles/podman/tasks/container-cloud.yml | 4 +- ansible/roles/podman/tasks/main.yml | 6 ++ .../sites/cloud.skudakrennsport.com.conf.j2 | 16 +++ .../cloud.skudakrennsport.com.https.conf.j2 | 42 ++++++++ ansible/roles/ssl/tasks/certbot.yml | 1 + ansible/vars/vault.yml | Bin 11198 -> 12105 bytes 10 files changed, 173 insertions(+), 2 deletions(-) create mode 100644 ansible/roles/podman/tasks/container-cloud-skudak.yml create mode 100644 ansible/roles/podman/templates/nginx/sites/cloud.skudakrennsport.com.conf.j2 create mode 100644 ansible/roles/podman/templates/nginx/sites/cloud.skudakrennsport.com.https.conf.j2 diff --git a/ansible/roles/podman/defaults/main.yml b/ansible/roles/podman/defaults/main.yml index b470bf9..8c68086 100644 --- a/ansible/roles/podman/defaults/main.yml +++ b/ansible/roles/podman/defaults/main.yml @@ -1,6 +1,7 @@ --- bookstack_path: "{{ podman_volumes }}/bookstack" cloud_path: "{{ podman_volumes }}/cloud" +cloud_skudak_path: "{{ podman_volumes }}/skudakcloud" debyltech_path: "{{ podman_volumes }}/debyltech" drone_path: "{{ podman_volumes }}/drone" factorio_path: "{{ podman_volumes }}/factorio" @@ -23,6 +24,7 @@ assistant_server_name: assistant.bdebyl.net bookstack_server_name: wiki.skudakrennsport.com ci_server_name: ci.bdebyl.net cloud_server_name: cloud.bdebyl.net +cloud_skudak_server_name: cloud.skudakrennsport.com fulfillr_server_name: fulfillr.debyltech.com home_server_name: home.bdebyl.net logs_server_name: logs.bdebyl.net diff --git a/ansible/roles/podman/tasks/configuration-nginx-http.yml b/ansible/roles/podman/tasks/configuration-nginx-http.yml index 8900238..1e3a05d 100644 --- a/ansible/roles/podman/tasks/configuration-nginx-http.yml +++ b/ansible/roles/podman/tasks/configuration-nginx-http.yml @@ -65,6 +65,7 @@ - "{{ bookstack_server_name }}.conf" - "{{ ci_server_name }}.http.conf" - "{{ cloud_server_name }}.conf" + - "{{ cloud_skudak_server_name }}.conf" - "{{ fulfillr_server_name }}.conf" - "{{ home_server_name }}.conf" - "{{ logs_server_name }}.conf" @@ -88,6 +89,7 @@ - "{{ bookstack_server_name }}.conf" - "{{ ci_server_name }}.http.conf" - "{{ cloud_server_name }}.conf" + - "{{ cloud_skudak_server_name }}.conf" - "{{ fulfillr_server_name }}.conf" - "{{ home_server_name }}.conf" - "{{ logs_server_name }}.conf" diff --git a/ansible/roles/podman/tasks/configuration-nginx-https.yml b/ansible/roles/podman/tasks/configuration-nginx-https.yml index 5b3824a..15241a9 100644 --- a/ansible/roles/podman/tasks/configuration-nginx-https.yml +++ b/ansible/roles/podman/tasks/configuration-nginx-https.yml @@ -37,6 +37,7 @@ - "{{ bookstack_server_name }}.https.conf" - "{{ ci_server_name }}.https.conf" - "{{ cloud_server_name }}.https.conf" + - "{{ cloud_skudak_server_name }}.https.conf" - "{{ fulfillr_server_name }}.https.conf" - "{{ parts_server_name }}.https.conf" - "{{ photos_server_name }}.https.conf" @@ -57,6 +58,7 @@ - "{{ bookstack_server_name }}.https.conf" - "{{ ci_server_name }}.https.conf" - "{{ cloud_server_name }}.https.conf" + - "{{ cloud_skudak_server_name }}.https.conf" - "{{ fulfillr_server_name }}.https.conf" - "{{ parts_server_name }}.https.conf" - "{{ photos_server_name }}.https.conf" diff --git a/ansible/roles/podman/tasks/container-cloud-skudak.yml b/ansible/roles/podman/tasks/container-cloud-skudak.yml new file mode 100644 index 0000000..14be5bc --- /dev/null +++ b/ansible/roles/podman/tasks/container-cloud-skudak.yml @@ -0,0 +1,100 @@ +--- +- name: create required skudak cloud volumes + become: true + ansible.builtin.file: + path: "{{ item }}" + state: directory + owner: "{{ podman_subuid.stdout }}" + group: "{{ podman_subuid.stdout }}" + mode: 0755 + notify: restorecon podman + loop: + - "{{ cloud_skudak_path }}/apps" + - "{{ cloud_skudak_path }}/config" + - "{{ cloud_skudak_path }}/data" + - "{{ cloud_skudak_path }}/mysql" + +- name: unshare chown the skudak cloud volumes + become: true + become_user: "{{ podman_user }}" + changed_when: false + ansible.builtin.command: | + podman unshare chown -R 33:33 {{ cloud_skudak_path }}/apps {{ cloud_skudak_path }}/data {{ cloud_skudak_path}}/config + +- name: get user/group id from unshare + become: true + ansible.builtin.stat: + path: "{{ cloud_skudak_path }}/data" + register: cloud_skudak_owner + +- name: mount cloud cifs + become: true + ansible.posix.mount: + src: "{{ cloud_skudak_cifs_src }}" + path: "{{ cloud_skudak_path }}/data" + fstype: cifs + opts: "username=skucloud,password={{ cloud_skudak_cifs_pass }},uid={{ cloud_skudak_owner.stat.uid }},gid={{ cloud_skudak_owner.stat.uid }},file_mode=0770,dir_mode=0770" + state: mounted + +- name: flush handlers + ansible.builtin.meta: flush_handlers + +- import_tasks: podman/podman-check.yml + vars: + container_name: skudak-cloud-db + container_image: "{{ db_image }}" + +- name: create skudak-cloud-db container + become: true + become_user: "{{ podman_user }}" + containers.podman.podman_container: + name: skudak-cloud-db + image: "{{ db_image }}" + restart_policy: on-failure:3 + log_driver: journald + network: + - shared + env: + MYSQL_ROOT_PASSWORD: "{{ cloud_skudak_db_root_pass }}" + MYSQL_DATABASE: skucloud + MYSQL_PASSWORD: "{{ cloud_skudak_db_pass }}" + MYSQL_USER: skucloud + volumes: + - "{{ cloud_skudak_path }}/mysql:/var/lib/mysql" + +- name: create systemd startup job for skudak-cloud-db + include_tasks: podman/systemd-generate.yml + vars: + container_name: skudak-cloud-db + +- import_tasks: podman/podman-check.yml + vars: + container_name: skudak-cloud + container_image: "{{ image }}" + +- name: create skudak cloud container + become: true + become_user: "{{ podman_user }}" + containers.podman.podman_container: + name: skudak-cloud + image: "{{ image }}" + restart_policy: on-failure:3 + log_driver: journald + network: + - shared + env: + MYSQL_PASSWORD: "{{ cloud_skudak_db_pass }}" + MYSQL_DATABASE: skucloud + MYSQL_HOST: skudak-cloud-db + MYSQL_USER: skucloud + volumes: + - "{{ cloud_skudak_path }}/apps:/var/www/html/custom_apps" + - "{{ cloud_skudak_path }}/data:/var/www/html/data" + - "{{ cloud_skudak_path }}/config:/var/www/html/config" + ports: + - "8090:80" + +- name: create systemd startup job for cloud + include_tasks: podman/systemd-generate.yml + vars: + container_name: skudak-cloud diff --git a/ansible/roles/podman/tasks/container-cloud.yml b/ansible/roles/podman/tasks/container-cloud.yml index c393092..802fe53 100644 --- a/ansible/roles/podman/tasks/container-cloud.yml +++ b/ansible/roles/podman/tasks/container-cloud.yml @@ -19,7 +19,7 @@ become_user: "{{ podman_user }}" changed_when: false ansible.builtin.command: | - podman unshare chown -R 33:33 {{ cloud_path }}/data {{ cloud_path}}/config + podman unshare chown -R 33:33 {{ cloud_path }}/apps {{ cloud_path }}/data {{ cloud_path}}/config - name: get user/group id from unshare become: true @@ -33,7 +33,7 @@ src: "{{ cloud_cifs_src }}" path: "{{ cloud_path }}/data" fstype: cifs - opts: "username=cloud,password={{ cloud_cifs_pass }},uid={{ cloud_owner.stat.uid }},gid={{ cloud_owner.stat.uid }}" + opts: "username=cloud,password={{ cloud_cifs_pass }},uid={{ cloud_owner.stat.uid }},gid={{ cloud_owner.stat.uid }},file_mode=0770,dir_mode=0770" state: mounted - name: flush handlers diff --git a/ansible/roles/podman/tasks/main.yml b/ansible/roles/podman/tasks/main.yml index daa945b..f2faf89 100644 --- a/ansible/roles/podman/tasks/main.yml +++ b/ansible/roles/podman/tasks/main.yml @@ -49,6 +49,12 @@ image: docker.io/library/nextcloud:24.0.5-apache tags: cloud +- import_tasks: container-cloud-skudak.yml + vars: + db_image: docker.io/library/mariadb:10.5 + image: docker.io/library/nextcloud:24.0.5-apache + tags: skucloud + - import_tasks: container-fulfillr.yml vars: image: "{{ aws_ecr_endpoint }}/fulfillr:20231005.1415" diff --git a/ansible/roles/podman/templates/nginx/sites/cloud.skudakrennsport.com.conf.j2 b/ansible/roles/podman/templates/nginx/sites/cloud.skudakrennsport.com.conf.j2 new file mode 100644 index 0000000..0196336 --- /dev/null +++ b/ansible/roles/podman/templates/nginx/sites/cloud.skudakrennsport.com.conf.j2 @@ -0,0 +1,16 @@ +server { + modsecurity on; + modsecurity_rules_file /etc/nginx/modsec_includes.conf; + + listen 80; + server_name {{ cloud_skudak_server_name }}; + + location '/.well-known/acme-challenge' { + default_type "text/plain"; + root /srv/http/letsencrypt; + } + + location / { + return 302 https://$host$request_uri; + } +} \ No newline at end of file diff --git a/ansible/roles/podman/templates/nginx/sites/cloud.skudakrennsport.com.https.conf.j2 b/ansible/roles/podman/templates/nginx/sites/cloud.skudakrennsport.com.https.conf.j2 new file mode 100644 index 0000000..3a4f65c --- /dev/null +++ b/ansible/roles/podman/templates/nginx/sites/cloud.skudakrennsport.com.https.conf.j2 @@ -0,0 +1,42 @@ +upstream skucloud { + server 127.0.0.1:8090; +} + +server { + modsecurity on; + modsecurity_rules_file /etc/nginx/modsec_includes.conf; + + resolver 127.0.0.1 127.0.0.53 9.9.9.9 valid=60s; + + listen 443 ssl http2; + server_name {{ cloud_skudak_server_name }}; + client_max_body_size 500M; + + ssl_certificate /etc/letsencrypt/live/{{ cloud_skudak_server_name }}/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/{{ cloud_skudak_server_name }}/privkey.pem; + ssl_trusted_certificate /etc/letsencrypt/live/{{ cloud_skudak_server_name }}/fullchain.pem; + ssl_dhparam /etc/nginx/ssl/dhparam.pem; + + ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; + ssl_prefer_server_ciphers off; + ssl_protocols TLSv1.2 TLSv1.3; + ssl_session_cache shared:SSL:10m; + ssl_session_tickets off; + ssl_session_timeout 1d; + ssl_stapling on; + ssl_stapling_verify on; + + location / { + add_header Referrer-Policy "same-origin" always; + add_header Strict-Transport-Security "max-age=630720000; includeSubDomains" always; + add_header X-Content-Type-Options "nosniff" always; + + proxy_set_header Host $http_host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Upgrade $http_upgrade; + + proxy_buffering off; + proxy_http_version 1.1; + proxy_pass http://skucloud; + } +} \ No newline at end of file diff --git a/ansible/roles/ssl/tasks/certbot.yml b/ansible/roles/ssl/tasks/certbot.yml index 78c5f95..608d1ef 100644 --- a/ansible/roles/ssl/tasks/certbot.yml +++ b/ansible/roles/ssl/tasks/certbot.yml @@ -11,6 +11,7 @@ - "{{ bookstack_server_name }}" - "{{ ci_server_name }}" - "{{ cloud_server_name }}" + - "{{ cloud_skudak_server_name }}" - "{{ fulfillr_server_name }}" - "{{ parts_server_name }}" - "{{ photos_server_name }}" diff --git a/ansible/vars/vault.yml b/ansible/vars/vault.yml index 45d16289a45f77bc1f1ffda757063aea597ca81f..4c9763f1ec1439cbd85ab9030fec1c1e94cca2e7 100644 GIT binary patch literal 12105 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 literal 11198 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