From bf9c98fd3f4f8ec8e4fa2c9a8ca765ea9f30bd1a Mon Sep 17 00:00:00 2001 From: Kris Lamoureux Date: Thu, 24 Nov 2022 02:00:52 -0500 Subject: [PATCH] Automated Nextcloud installation --- README.md | 1 + Vagrantfile | 10 +++++++- dev/vars/webserver.yml | 14 +++++++++-- roles/common/defaults/main.yml | 2 +- roles/common/tasks/main.yml | 2 +- roles/webserver/defaults/main.yml | 1 + roles/webserver/handlers/main.yml | 35 ++++++++++++++++++++++---- roles/webserver/handlers/nextcloud.yml | 35 ++++++++++++++++++++++++++ 8 files changed, 90 insertions(+), 10 deletions(-) create mode 100644 roles/webserver/handlers/nextcloud.yml diff --git a/README.md b/README.md index 2767a71..4b99969 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ and services operated by Free I.T. Athens (FRITA). 3. Go to - [Traefik Dashboard](https://traefik.local.freeitathens.org:8443/dashboard/#/) - [WordPress](https://www.local.freeitathens.org) + - [Nextcloud](https://cloud.local.freeitathens.org) 4. Click through the HTTPS security warning ## Production diff --git a/Vagrantfile b/Vagrantfile index a4265f5..51925a0 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -24,11 +24,19 @@ Vagrant.configure("2") do |config| config.vm.define :frita do |frita| # end - # Disable Machine Name Prefix + # Set libvirt settings config.vm.provider :libvirt do |libvirt| + libvirt.cpus = 2 + libvirt.memory = 4096 libvirt.default_prefix = "" end + # Set VirtualBox settings + config.vm.provider "virtualbox" do |vbox| + vbox.cpus = 2 + vbox.memory = 4096 + end + # Provision with Ansible config.vm.provision "ansible" do |ansible| ENV['ANSIBLE_ROLES_PATH'] = File.dirname(__FILE__) + "/roles" diff --git a/dev/vars/webserver.yml b/dev/vars/webserver.yml index 7623e56..3c7f583 100644 --- a/dev/vars/webserver.yml +++ b/dev/vars/webserver.yml @@ -3,9 +3,10 @@ ############### # These are sample public passwords not encrypted in Ansible Vault, unlike production secret: - WORDPRESS_DB_PASSWORD: WPpa55w0rd! - NEXTCLOUD_MYSQL_PASSWORD: NCpa55w0rd! TRAEFIK_DREAMHOST_APIKEY: DHap1pa55w0rd! + WORDPRESS_DB_PASSWORD: WPpa55w0rd! + NEXTCLOUD_MYSQL_PASSWORD: NCdbpa55w0rd! + NEXTCLOUD_ADMIN_PASSWORD: NCadm1npa55w0rd! ############## ### Docker ### @@ -49,9 +50,18 @@ webserver: #WORDPRESS_DB_HOST: host.docker.internal #WORDPRESS_DB_NAME: wordpress #WORDPRESS_DB_USER: wordpress + #WORDPRESS_WEB_ENABLED: true WORDPRESS_DB_PASSWORD: "{{ secret.WORDPRESS_DB_PASSWORD }}" ################# ### Nextcloud ### ################# + #NEXTCLOUD_VERSION: stable + #NEXTCLOUD_DOMAIN: cloud.local.freeitathens.org + #NEXTCLOUD_MYSQL_HOST: host.docker.internal + #NEXTCLOUD_MYSQL_DATABASE: nextcloud + #NEXTCLOUD_MYSQL_USER: nextcloud + #NEXTCLOUD_WEB_ENABLED: true + #NEXTCLOUD_ADMIN: admin + NEXTCLOUD_ADMIN_PASSWORD: "{{ secret.NEXTCLOUD_ADMIN_PASSWORD }}" NEXTCLOUD_MYSQL_PASSWORD: "{{ secret.NEXTCLOUD_MYSQL_PASSWORD }}" diff --git a/roles/common/defaults/main.yml b/roles/common/defaults/main.yml index f467896..45bd2cc 100644 --- a/roles/common/defaults/main.yml +++ b/roles/common/defaults/main.yml @@ -1,2 +1,2 @@ packages: - - dnsutils \ No newline at end of file + - dnsutils diff --git a/roles/common/tasks/main.yml b/roles/common/tasks/main.yml index 6ba118f..8a6a01c 100644 --- a/roles/common/tasks/main.yml +++ b/roles/common/tasks/main.yml @@ -5,7 +5,7 @@ mode: 0700 - name: Install useful software - apt: + ansible.builtin.apt: name: "{{ packages }}" state: present update_cache: true diff --git a/roles/webserver/defaults/main.yml b/roles/webserver/defaults/main.yml index a5c7236..128f7a7 100644 --- a/roles/webserver/defaults/main.yml +++ b/roles/webserver/defaults/main.yml @@ -1,4 +1,5 @@ webserver_root: "{{ docker_compose_root }}/webserver" +nextcloud_autoinstall: true mariadb_trust: - "172.16.0.0/12" - "192.168.0.0/16" diff --git a/roles/webserver/handlers/main.yml b/roles/webserver/handlers/main.yml index 0b55930..0bc6198 100644 --- a/roles/webserver/handlers/main.yml +++ b/roles/webserver/handlers/main.yml @@ -1,11 +1,36 @@ +- name: Restart MariaDB + ansible.builtin.service: + name: mariadb + state: restarted + listen: restart_mariadb + - name: Compose up on webserver stack ansible.builtin.command: "docker-compose up -d" args: chdir: "{{ webserver_root }}" listen: composeup_webserver -- name: Restart MariaDB - ansible.builtin.service: - name: mariadb - state: restarted - listen: restart_mariadb +- name: Grab Nextcloud container information + community.docker.docker_container_info: + name: "{{ webserver_root | basename }}_nextcloud_1" + listen: composeup_webserver + register: nextcloud_info + +- name: Wait for Nextcloud to become available + ansible.builtin.wait_for: + host: "{{ nextcloud_info.container.NetworkSettings.Networks.traefik.IPAddress }}" + port: 80 + listen: composeup_webserver + +- name: Check Nextcloud status + ansible.builtin.command: "docker exec --user www-data {{ webserver_root | basename }}_nextcloud_1 + php occ status" + listen: composeup_webserver + register: nextcloud_status + +- name: Import Nextcloud installation handlers + ansible.builtin.import_tasks: nextcloud.yml + listen: composeup_webserver + when: + - nextcloud_status.stderr[:26] == "Nextcloud is not installed" + - nextcloud_autoinstall diff --git a/roles/webserver/handlers/nextcloud.yml b/roles/webserver/handlers/nextcloud.yml new file mode 100644 index 0000000..a5b7c36 --- /dev/null +++ b/roles/webserver/handlers/nextcloud.yml @@ -0,0 +1,35 @@ +- name: Install Nextcloud + ansible.builtin.command: 'docker exec --user www-data {{ webserver_root | basename }}_nextcloud_1 + php occ maintenance:install + --database "mysql" + --database-host "{{ webserver.NEXTCLOUD_MYSQL_HOST | default("host.docker.internal") }}" + --database-name "{{ webserver.NEXTCLOUD_MYSQL_DATABASE | default("nextcloud") }}" + --database-user "{{ webserver.NEXTCLOUD_MYSQL_USER | default("nextcloud") }}" + --database-pass "{{ webserver.NEXTCLOUD_MYSQL_PASSWORD }}" + --admin-user "{{ webserver.NEXTCLOUD_ADMIN | default("admin") }}" + --admin-pass "{{ webserver.NEXTCLOUD_ADMIN_PASSWORD }}"' + register: nextcloud_install + listen: composeup_webserver + +- name: Set Nextcloud's Trusted Domain + ansible.builtin.command: 'docker exec --user www-data {{ webserver_root | basename }}_nextcloud_1 + php occ config:system:set trusted_domains 0 + --value="{{ webserver.NEXTCLOUD_DOMAIN | default("cloud.local.freeitathens.org") }}"' + listen: composeup_webserver + when: nextcloud_install.changed + +- name: Set Nextcloud's Trusted Proxy + ansible.builtin.command: 'docker exec --user www-data {{ webserver_root | basename }}_nextcloud_1 + php occ config:system:set trusted_proxies 0 --value="traefik"' + listen: composeup_webserver + when: nextcloud_install.changed + +- name: Preform Nextcloud database maintenance + ansible.builtin.command: "docker exec --user www-data {{ webserver_root | basename }}_nextcloud_1 {{ item }}" + loop: + - "php occ maintenance:mode --on" + - "php occ db:add-missing-indices" + - "php occ db:convert-filecache-bigint" + - "php occ maintenance:mode --off" + listen: composeup_webserver + when: "' - needsDbUpgrade: true' in nextcloud_status.stdout_lines"