diff options
| -rw-r--r-- | group_vars/all.yml | 20 | ||||
| -rw-r--r-- | roles/nextcloud/defaults/main.yml | 101 | ||||
| -rw-r--r-- | roles/nextcloud/meta/main.yml | 66 | ||||
| -rw-r--r-- | roles/nextcloud/occ.yml | 80 | ||||
| -rw-r--r-- | roles/nextcloud/tasks/database.yml | 18 | ||||
| -rw-r--r-- | roles/nextcloud/tasks/main.yml | 99 | ||||
| -rw-r--r-- | roles/nextcloud/tasks/php.yml | 17 | ||||
| -rw-r--r-- | roles/nextcloud/templates/datadirectory.config.php.j2 | 8 | ||||
| -rw-r--r-- | roles/nextcloud/templates/etc-php-7.3.ini.j2 | 198 | ||||
| -rw-r--r-- | roles/nextcloud/templates/var-www-nextcloud-config-custom.config.php.j2 | 4 | 
10 files changed, 360 insertions, 251 deletions
diff --git a/group_vars/all.yml b/group_vars/all.yml index ca98ea6..ee658c1 100644 --- a/group_vars/all.yml +++ b/group_vars/all.yml @@ -35,6 +35,16 @@ __global_services:  # roles overrides +nextcloud__db_password: "{{ lookup( +  'ansible.builtin.password', +  'secrets/files/passwords/' + inventory_hostname + '_nextcloud__db.txt', +  )}}" +nextcloud__admin_password: "{{ lookup( +  'ansible.builtin.password', +  'secrets/files/passwords/' + inventory_hostname + '_nextcloud__admin.txt', +  )}}" +nextcloud__admin_email: contact@rgoncalves.se +  httpd__log_format: forwarded  wireguard_domain_controller: "{{ __global_domain_controller }}" @@ -82,3 +92,13 @@ sshd_keys__users: "[        {{ user.username }},      {% endfor %}    ]" + +nextcloud__users: "[ +    {% for user in __users %} +    {{ { +        'username': user.username, +        'fullname': user.firstname + ' ' + user.lastname, +        'email': user.email, +    } }}, +    {% endfor %} +  ]" diff --git a/roles/nextcloud/defaults/main.yml b/roles/nextcloud/defaults/main.yml index f1835cf..2dc20c7 100644 --- a/roles/nextcloud/defaults/main.yml +++ b/roles/nextcloud/defaults/main.yml @@ -5,7 +5,104 @@ nextcloud__package_dependencies:    - php-pgsql-8.1.27    - php-pdo_pgsql-8.1.27 -nextcloud__user: nextcloud -nextcloud__group: nextcloud +nextcloud__db_name: nextcloud +nextcloud__db_user: nextcloud +nextcloud__db_host: 127.0.0.1 +nextcloud__db_password: "{{ lookup('ansible.builtin.password', '/dev/null') }}" + +nextcloud__admin_name: admin +nextcloud__admin_password: "{{ lookup( +  'ansible.builtin.password', '/dev/null' +  ) }}" + +nextcloud__chroot_dir: "{{ httpd_pre__chroot_dir }}/nextcloud" +nextcloud__chroot_data_dir: /nextcloud/data + +nextcloud__data_dir: "{{ httpd_pre__chroot_dir }}{{ nextcloud__chroot_data_dir }}" + +nextcloud__owned_directories: +  - apps +  - data +  - updater  nextcloud__php_service_name: php81_fpm +nextcloud__php_configuration_file: /etc/php-8.1.ini +nextcloud__php_fpm_configuration_file: /etc/php-fpm.ini + +nextcloud__occ_system_settings: +  - option: trusted_domains +    value: "1 --value={{ nextcloud__domain_name }}" +  - option: skeletondirectory +    value: "" + +nextcloud__disabled_apps: +  - firstrunwizard +  - sharebymail + +nextcloud__enabled_apps: +  - encryption + +nextcloud__php_fpm_settings: +  # PHP +  - section: www +    option: clear_env +    value: 0 + +nextcloud__php_settings: +  # PHP +  - section: PHP +    option: post_max_size +    value: 513M +  - section: PHP +    option: upload_max_filesize +    value: 513M +  - section: PHP +    option: allow_url_fopen +    value: 1 +  - section: PHP +    option: memory_limit +    value: 513M +  # opcache +  - section: opcache +    option: opcache.enable +    value: 1 +  - section: opcache +    option: opcache_enable_cli +    value: 1 +  - section: opcache +    option: opcache.memory_consumption +    value: 512 +  - section: opcache +    option: opcache.interned_strings_buffer +    value: 8 +  - section: opcache +    option: opcache.max_accelerated_files +    value: 10000 +  - section: opcache +    option: opcache.revalidate_freq +    value: 1 +  - section: opcache +    option: opcache.save_comments +    value: 1 +  # modules +  - section: zip +    option: extension +    value: zip.so +  - section: gd +    option: extension +    value: gd.so +  - section: pgsql +    option: extension +    value: pgsql.so +  - section: pdo_pgsql +    option: extension +    value: pdo_pgsql.so +  - section: curl +    option: extension +    value: curl.so +  - section: intl +    option: extension +    value: intl.so +  - section: opcache +    option: extension +    value: opcache.so diff --git a/roles/nextcloud/meta/main.yml b/roles/nextcloud/meta/main.yml index 246fc09..0ad3396 100644 --- a/roles/nextcloud/meta/main.yml +++ b/roles/nextcloud/meta/main.yml @@ -2,6 +2,8 @@  dependencies:    - role: httpd_pre +  - role: redis +  - role: postgresql  argument_specs:    main: @@ -18,7 +20,71 @@ argument_specs:          required: true          description: Package name to be installed +      nextcloud__package_dependencies: +        type: list +        elements: str +        required: true +        description: Extra packages +        nextcloud__domain_name:          type: str          required: true          description: Domain name + +      nextcloud__db_name: +        type: str +        required: true + +      nextcloud__db_password: +        type: str +        required: true + +      nextcloud__db_user: +        type: str +        required: true + +      nextcloud__db_host: +        type: str +        required: true + +      nextcloud__data_dir: +        type: str +        required: true + +      nextcloud__owned_directories: +        type: str +        required: true + +      nextcloud__admin_password: +        type: str +        required: true + +      nextcloud__admin_name: +        type: str +        required: true + +      nextcloud__admin_email: +        type: str +        required: true + +      nextcloud__php_service_name: +        type: str +        required: true + +      nextcloud__php_configuration_file: +        type: str +        required: true + +      nextcloud__php_settings: +        type: list +        elements: dict +        options: +          section: +            type: str +            required: true +          option: +            type: str +            required: true +          value: +            type: str +            required: true diff --git a/roles/nextcloud/occ.yml b/roles/nextcloud/occ.yml new file mode 100644 index 0000000..04c9539 --- /dev/null +++ b/roles/nextcloud/occ.yml @@ -0,0 +1,80 @@ +--- + +- name: maintenance:install nextcloud +  ansible.builtin.command: +    argv: +      - php +      - occ +      - maintenance:install +      - --database=pgsql +      - "--database-name={{ nextcloud__db_name }}" +      - "--database-port={{ postgresql__port }}" +      - "--database-user={{ nextcloud__db_user }}" +      - "--database-pass={{ nextcloud__db_password }}" +      - "--database-host={{ nextcloud__db_host }}" +      - "--admin-email={{ nextcloud__admin_email }}" +      - "--admin-user={{ nextcloud__admin_name }}" +      - "--admin-pass={{ nextcloud__admin_password }}" +    chdir: "{{ httpd_pre__chroot_dir }}/nextcloud" +    creates: "{{ nextcloud__data_dir }}/appdata_*" +  register: nextcloud__result_maintenance_install +  failed_when: +    - nextcloud__result_maintenance_install.rc != 0 +    - '"is not defined" is not in nextcloud__result_maintenance_install.stderr' +  changed_when: +    - '"is not defined" is not in nextcloud__result_maintenance_install.stderr' + +- name: set system settings +  ansible.builtin.command: +    cmd: "php occ config:system:set {{ item.option }} {{ item.value }}" +    chdir: "{{ httpd_pre__chroot_dir }}/nextcloud" +  loop: "{{ nextcloud__occ_system_settings }}" + +- name: disable applications +  ansible.builtin.command: +    cmd: "php occ app:enable {{ item }}" +    chdir: "{{ httpd_pre__chroot_dir }}/nextcloud" +  loop: "{{ nextcloud__disabled_apps }}" +  register: nextcloud__result_disable_applications +  changed_when: +    - "'already disabled' not in nextcloud__result_disable_applications.stdout" + +- name: enable applications +  ansible.builtin.command: +    cmd: "php occ app:enable {{ item }}" +    chdir: "{{ httpd_pre__chroot_dir }}/nextcloud" +  loop: "{{ nextcloud__enabled_apps }}" +  register: nextcloud__result_enable_applications +  changed_when: +    - "'already enabled' not in nextcloud__result_enable_applications.stdout" + +- name: enable encryption +  ansible.builtin.command: +    cmd: php occ encryption:enable +    chdir: "{{ httpd_pre__chroot_dir }}/nextcloud" +  register: nextcloud__result_enable_encryption +  changed_when: +    - "'already enabled' not in nextcloud__result_enable_encryption.stdout" + +- name: create application users +  ansible.builtin.command: +    argv: +      - php +      - occ +      - user:add +      - --password-from-env +      - "--display-name={{ item.fullname }}" +      - "{{ item.username }}" +    chdir: "{{ httpd_pre__chroot_dir }}/nextcloud" +  environment: +    OC_PASS: "{{ lookup( +      'ansible.builtin.password', +      'secrets/files/passwords/' + inventory_hostname + '_nextcloud__user_' + item.username + '.txt', +        )}}" +  loop: "{{ nextcloud__users }}" +  register: nextcloud__result_create_application_users +  failed_when: +    - nextcloud__result_create_application_users.rc == 1 +    - '"already exists" not in nextcloud__result_create_application_users.stdout' +  changed_when: +    - '"already exists" not in nextcloud__result_create_application_users.stdout' diff --git a/roles/nextcloud/tasks/database.yml b/roles/nextcloud/tasks/database.yml new file mode 100644 index 0000000..601ee9d --- /dev/null +++ b/roles/nextcloud/tasks/database.yml @@ -0,0 +1,18 @@ +--- + +- name: create nextcloud database +  community.postgresql.postgresql_db: +    name: "{{ nextcloud__db_name }}" +    encoding: UTF-8 + +- name: create nextcloud database user +  community.postgresql.postgresql_user: +    db: "{{ nextcloud__db_name }}" +    name: "{{ nextcloud__db_user }}" +    password: "{{ nextcloud__db_password }}" + +- name: add nextcloud db user permissions +  community.postgresql.postgresql_schema: +    db: "{{ nextcloud__db_name }}" +    name: "{{ nextcloud__db_user }}" +    owner: "{{ nextcloud__db_user }}" diff --git a/roles/nextcloud/tasks/main.yml b/roles/nextcloud/tasks/main.yml index bb744e7..2a1a0bc 100644 --- a/roles/nextcloud/tasks/main.yml +++ b/roles/nextcloud/tasks/main.yml @@ -20,10 +20,60 @@      name: "{{ nextcloud__package_dependencies }}"      state: present -- name: start and enable php-service +- name: chown directories to www user +  file: +    path: "{{ httpd_pre__chroot_dir }}/nextcloud/{{ item }}" +    owner: "{{ httpd_pre__user }}" +    group: "{{ httpd_pre__group }}" +    recurse: true +  loop: "{{ nextcloud__owned_directories }}" + +- name: create .ocdata file +  ansible.builtin.file: +    path: "{{ nextcloud__data_dir }}/.ocdata" +    owner: "{{ httpd_pre__user }}" +    group: "{{ httpd_pre__group }}" +    mode: "0600" +    state: touch + +- name: generate datadirectory workaround configuration +  ansible.builtin.template: +    src: datadirectory.config.php.j2 +    dest: "{{ nextcloud__chroot_dir }}/config/datadirectory.config.php" +    owner: "{{ httpd_pre__user }}" +    group: "{{ httpd_pre__group }}" +    mode: "0644" + +- name: import php tasks +  ansible.builtin.import_tasks: +    file: database.yml + +- name: import database tasks +  ansible.builtin.import_tasks: +    file: database.yml +  become: true +  become_user: "{{ postgresql__user }}" + +- name: import occ tasks +  ansible.builtin.import_tasks: +    file: occ.yml +  become: true +  become_user: "{{ httpd_pre__user }}" +  become_method: su +  become_flags: -s /bin/sh + +- name: enable nextcloud background jobs +  ansible.builtin.cron: +    name: nextcloud background jobs +    minute: "*/5" +    job: "php  -f {{ nextcloud__chroot_dir }}/cron.php" +    user: "{{ httpd_pre__user }}" + + +- name: start and enable php-fpm service    ansible.builtin.service:      name: "{{ nextcloud__php_service_name }}" -    state: started +    state: restarted      enabled: true  - name: generate nextcloud httpd configuration @@ -33,48 +83,3 @@      owner: 0      group: 0      mode: "0644" - -# - name: generate nextcloud php config -#   template: -#     src: etc-php-7.3.ini.j2 -#     dest: /etc/php-7.3.ini -#     owner: "www" -#     group: "www" -#     mode: "0644" - -# - name: generate nextcloud custom config -#   template: -#     src: var-www-nextcloud-config-custom.config.php.j2 -#     dest: /var/www/nextcloud/config/custom.config.php -#     owner: "www" -#     group: "www" -#     mode: "0644" - -# - name: copy configuration for domain name and tls in chroot -#   shell: | -#     mkdir -p /var/www/etc/ssl -#     install -m 444 -o root -g bin /etc/resolv.conf /var/www/etc -#     install -m 444 -o root -g bin /etc/ssl/cert.pem /etc/ssl/openssl.cnf /var/www/etc/ssl/ - -# - name: enable cron job for nextcloud indexing and housekeeping -#   cron: -#     name: "nextcloud indexing" -#     minute: "*/5" -#     job: "php -f /var/www/nextcloud/cron.php" -#     user: www - -# - name: ensure directories are chown to www -#   file: -#     path: "/var/www/nextcloud/{{ item }}" -#     owner: "www" -#     group: "www" -#     recurse: true -#   loop: -#     - "apps" -#     - "updater" -#  -# - name: ensure php-fpm is restarted and enabled -#   service: -#     name: php73_fpm -#     state: restarted -#     enabled: true diff --git a/roles/nextcloud/tasks/php.yml b/roles/nextcloud/tasks/php.yml new file mode 100644 index 0000000..9721e8f --- /dev/null +++ b/roles/nextcloud/tasks/php.yml @@ -0,0 +1,17 @@ +--- + +- name: apply php settings +  community.general.ini_file: +    path: "{{ nextcloud__php_configuration_file }}" +    section: "{{ item.section }}" +    option: "{{ item.option }}" +    value: "{{ item.value }}" +  loop: "{{ nextcloud__php_settings }}" + +- name: apply php-fpm settings +  community.general.ini_file: +    path: "{{ nextcloud__php_fpm_configuration_file }}" +    section: "{{ item.section }}" +    option: "{{ item.option }}" +    value: "{{ item.value }}" +  loop: "{{ nextcloud__php_fpm_settings }}" diff --git a/roles/nextcloud/templates/datadirectory.config.php.j2 b/roles/nextcloud/templates/datadirectory.config.php.j2 new file mode 100644 index 0000000..d5af69a --- /dev/null +++ b/roles/nextcloud/templates/datadirectory.config.php.j2 @@ -0,0 +1,8 @@ +<?php + +if (\OC::$CLI) { +        $CONFIG['datadirectory'] = '{{ nextcloud__data_dir }}'; +} else { +        $CONFIG['datadirectory'] = '{{ nextcloud__chroot_data_dir }}'; +} + diff --git a/roles/nextcloud/templates/etc-php-7.3.ini.j2 b/roles/nextcloud/templates/etc-php-7.3.ini.j2 deleted file mode 100644 index 0e79971..0000000 --- a/roles/nextcloud/templates/etc-php-7.3.ini.j2 +++ /dev/null @@ -1,198 +0,0 @@ -[PHP] -auto_append_file= -auto_globals_jit=On -auto_prepend_file= -default_charset="UTF-8" -default_mimetype="text/html" -disable_classes= -disable_functions= -display_errors=Off -display_startup_errors=Off -doc_root= -enable_dl=Off -engine=On -error_reporting=E_ALL & ~E_DEPRECATED & ~E_STRICT -expose_php=On -extension_dir="/usr/local/lib/php-7.3/modules" -html_errors=On -ignore_repeated_errors=Off -ignore_repeated_source=Off -implicit_flush=Off -include_path=".:/pear/lib:/var/www/pear/lib" -log_errors=On -log_errors_max_len=1024 -max_execution_time=30 -output_buffering=4096 -precision=14 -register_argc_argv=Off -report_memleaks=On -request_order="GP" -serialize_precision=-1 -short_open_tag=Off -unserialize_callback_func= -user_dir= -variables_order="GPCS" -zend.enable_gc=On -zlib.output_compression=Off - -allow_url_fopen=On -allow_url_include=Off -default_socket_timeout=60 -file_uploads=On -max_file_uploads=20 - -memory_limit={{ nextcloud_php_memory_limit }} -max_input_time={{ nextcloud_php_max_inputtime }} -post_max_size={{ nextcloud_php_upload_maxsize }} -upload_max_filesize={{ nextcloud_php_upload_maxsize }} - -pm=dynamic -pm.maxchildren=120 -pm.start_servers=12 -pm.min_spare_servers=6 -pm.max_spare_servers=18 - -extension=curl -extension=gd -extension=intl -extension=pdo_pgsql -extension=zip - -[CLI Server] -cli_server.color=On - -[Date] -date.timezone=UTC - -[iconv] - -[imap] - -[intl] - -[sqlite3] - -[Pcre] - -[Pdo] - -[Pdo_mysql] -pdo_mysql.default_socket= - -[Phar] - -[mail function] -SMTP=localhost -smtp_port=25 -mail.add_x_header=Off - -[ODBC] -odbc.allow_persistent=On -odbc.check_persistent=On -odbc.max_persistent=-1 -odbc.max_links=-1 -odbc.defaultlrl=4096 -odbc.defaultbinmode=1 - -[Interbase] -ibase.allow_persistent=1 -ibase.max_persistent=-1 -ibase.max_links=-1 -ibase.timestampformat="%Y-%m-%d %H:%M:%S" -ibase.dateformat="%Y-%m-%d" -ibase.timeformat="%H:%M:%S" - -[MySQLi] -mysqli.max_persistent=-1 -mysqli.allow_persistent=On -mysqli.max_links=-1 -mysqli.default_port=3306 -mysqli.default_socket= -mysqli.default_host= -mysqli.default_user= -mysqli.default_pw= -mysqli.reconnect=Off - -[mysqlnd] -mysqlnd.collect_statistics=On -mysqlnd.collect_memory_statistics=Off - -[OCI8] - -[PostgreSQL] -pgsql.allow_persistent=On -pgsql.auto_reset_persistent=Off -pgsql.max_persistent=-1 -pgsql.max_links=-1 -pgsql.ignore_notice=0 -pgsql.log_notice=0 - -[bcmath] -bcmath.scale=0 - -[browscap] - -[Session] -session.save_handler=files -session.use_strict_mode=0 -session.use_cookies=1 -session.use_only_cookies=1 -session.name=PHPSESSID -session.auto_start=0 -session.cookie_lifetime=0 -session.cookie_path=/ -session.cookie_domain= -session.cookie_httponly= -session.cookie_samesite= -session.serialize_handler=php -session.gc_probability=1 -session.gc_divisor=1000 -session.gc_maxlifetime=1440 -session.referer_check= -session.cache_limiter=nocache -session.cache_expire=180 -session.use_trans_sid=0 -session.sid_length=26 -session.trans_sid_tags="a=href,area=href,frame=src,form=" -session.sid_bits_per_character=5 - -[Assertion] -zend.assertions=-1 - -[COM] - -[mbstring] - -[gd] - -[exif] - -[Tidy] - -tidy.clean_output=Off - -[soap] -soap.wsdl_cache_enabled=1 -soap.wsdl_cache_dir="/tmp" -soap.wsdl_cache_ttl=86400 -soap.wsdl_cache_limit=5 - -[sysvshm] - -[ldap] -ldap.max_links=-1 - -[dba] - -[opcache] -opcache.enable=1 -opcache.enable_cli=1 -opcache.memory_consumption=128 -opcache.interned_strings_buffer=8 -opcache.max_accelerated_files=10000 -opcache.revalidate_freq=1 -opcache.save_comments=1 - -[curl] - -[openssl] diff --git a/roles/nextcloud/templates/var-www-nextcloud-config-custom.config.php.j2 b/roles/nextcloud/templates/var-www-nextcloud-config-custom.config.php.j2 deleted file mode 100644 index 15df079..0000000 --- a/roles/nextcloud/templates/var-www-nextcloud-config-custom.config.php.j2 +++ /dev/null @@ -1,4 +0,0 @@ -<?php -$CONFIG = array ( -	'datadirectory' => ((php_sapi_name() == 'cli') ? '/var/www' : '') . '/nextcloud/data', -);  |