nextcloud

Статус CI Ansible Роль Оценка качества Ansible Ansible Роль Лицензия: GPL v3

Nextcloud

Эта ansible роль устанавливает nextcloud по методике capistrano. Это означает, что структура папок выглядит следующим образом:

/var/www
└── nextcloud.local
    ├── current -> /var/www/nextcloud.local/releases/20.0.7
    │   └── nextcloud
    │       └── config
    │          └── config.php -> /var/www/shared/config.php
    ├── data
    │   ├── admin
    │   ├── appdata_somerandomshit
    │   ├── files_external
    │   ├── index.html
    │   └── nextcloud.log
    ├── releases
    │   ├── 20.0.5
    │   ├── 20.0.6
    │   └── 20.0.7
    └── shared
        └── config.php

На данный момент, эта роль поддерживает только MySQL в качестве базы данных. Используется redis с конфигурацией по умолчанию для локального и распределенного кэширования, а также для транзакционной блокировки файлов.

Требования

Nextcloud требует PHP, веб-сервер и СУБД для работы. Для удовлетворения этих требований настоятельно рекомендуется использовать эти 3 роли:

Почему именно эти роли? Потому что они хорошо поддерживаются, и некоторые переменные из этих ролей используются в данной, но можно использовать и другие роли.

В производственной среде также потребуется сертификат TLS, который можно получить с помощью acme.sh.

Переменные роли

nextcloud_version

Версия nextcloud для установки. По умолчанию: "29.0.1"

nextcloud_domain

Доменное имя для использования. По умолчанию: ""

nextcloud_php_user

Все файлы nextcloud будут принадлежать этому пользователю. Обычно нужно установить это значение на www-data. По умолчанию: "{{ php_fpm_pool_user | default('www-data') }}"

nextcloud_php_version

Основная версия PHP для использования. По умолчанию: "{{ php_default_version_debian | default('8.2') }}"

nextcloud_php_bin_path

Путь к бинарному файлу PHP. По умолчанию: /usr/bin/php

nextcloud_keep_releases

Как долго вы хотите сохранять старые версии. По умолчанию: "60d"

nextcloud_admin_user

Имя пользователя администратора, создаваемое во время установки. После завершения установки вы можете создать другого пользователя с ролью администратора и удалить этого. По умолчанию: ""

nextcloud_admin_password

Пароль для nextcloud_admin_user. Рекомендуется шифровать его с помощью ansible-vault По умолчанию: ""

nextcloud_config_template

Шаблон Jinja2 для использования в config.php Nextcloud. Чтобы использовать настраиваемый шаблон конфигурации, вам нужно:

  • создать директорию templates/ на том же уровне, что и ваш playbook
  • создать файл templates/myconfig.php.j2 (просто выберите другое имя вместо шаблона по умолчанию)
  • в вашем playbook установить переменную nextcloud_config_template: myconfig.php.j2 По умолчанию: "config.php.j2"

nextcloud_instanceid

Уникальный идентификатор инстанса. Сгенерируйте случайный идентификатор и храните его, пока ваша установка активна. По умолчанию: ""

nextcloud_passwordsalt

Соль, используемая для хеширования всех паролей. Рекомендуется шифровать это с помощью ansible-vault По умолчанию: ""

nextcloud_secret

Секрет, используемый nextcloud для различных целей, например, для шифрования данных. Если вы потеряете эту строку, произойдет повреждение данных. Рекомендуется шифровать это с помощью ansible-vault По умолчанию: ""

nextcloud_dbhost

Хост для подключения к базе данных. По умолчанию: "localhost"

nextcloud_dbname

Имя базы данных nextcloud, которое устанавливается во время установки. По умолчанию: "nextcloud"

nextcloud_dbuser

Пользователь, которого nextcloud использует для чтения и записи в базу данных. По умолчанию: "nextcloud"

nextcloud_dbpassword

Пароль пользователя nextcloud_dbuser. Рекомендуется шифровать его с помощью ansible-vault По умолчанию: ""

nextcloud_deploy_to

Основная папка вашей установки nextcloud. По умолчанию: "/var/www/{{ nextcloud_domain }}"

nextcloud_datadirectory:

Где хранятся файлы пользователей. По умолчанию: "{{ nextcloud_deploy_to }}/data"

nextcloud_php_packages

Дополнительные пакеты PHP, необходимые для nextcloud. По умолчанию:

- php-pear
- php{{ nextcloud_php_version }}-bcmath
- php{{ nextcloud_php_version }}-bz2
- php{{ nextcloud_php_version }}-curl
- php{{ nextcloud_php_version }}-gd
- php{{ nextcloud_php_version }}-gmp
- php{{ nextcloud_php_version }}-imagick
- php{{ nextcloud_php_version }}-intl
- php{{ nextcloud_php_version }}-json
- php{{ nextcloud_php_version }}-mbstring
- php{{ nextcloud_php_version }}-mysql
- php{{ nextcloud_php_version }}-redis
- php{{ nextcloud_php_version }}-xml
- php{{ nextcloud_php_version }}-zip

nextcloud_packages

Дополнительные пакеты, необходимые для nextcloud. По умолчанию:

- redis-server
- redis-tools
- unzip

nextcloud_apps

Список приложений для установки и активации. По умолчанию: []

nextcloud_no_log

Скрыть конфиденциальные данные во время развертывания. По умолчанию: true

Рабочий пример

Вот что должно быть в вашем playbook.yml:

- name: Настроить серверы nextcloud
  become: true
  hosts: nextcloud
  vars_files:
    - vault_vars/nextcloud.yml
  roles:
    - {role: acme_sh, tags: ['acme_sh']} (используйте то, что хотите, чтобы получить TLS сертификаты)
    - {role: nginx, tags: ['nginx']}
    - {role: mysql, tags: ['mysql']}
    - {role: php, tags: ['php']}
    - {role: percona, tags: ['percona']}
    - {role: nextcloud, tags: ['nextcloud']}
  pre_tasks:
    - name: Установить ключ sury
      apt_key:
        url: "https://packages.sury.org/php/apt.gpg"
        state: present
    - name: Добавить репозитории sury
      apt_repository:
        repo: "deb https://packages.sury.org/php/ {{ ansible_distribution_release }} main"
        state: present
        update_cache: true
        filename: sury
    - name: Копировать конкретные файлы конфигурации nginx
      copy:
        src: "{{ item }}"
        dest: /etc/nginx/
        owner: root
        mode: 0644
      with_fileglob:
        - nginx/*.conf
    - name: Копировать /etc/nginx/dh4096.pem
      copy:
        src: nginx/dh4096.pem
        dest: /etc/nginx/dh4096.pem
        owner: www-data
        mode: 0400

Вот ваши зашифрованные переменные в vault_vars/nextcloud.yml:

mysql_root_password_vault: vaultmeplease
nextcloud_dbpassword_vault: vaultmeplease
nextcloud_passwordsalt_vault: vaultmeplease
nextcloud_secret_vault: vaultmeplease
nextcloud_instanceid_vault: vaultmeplease
nextcloud_admin_user_vault: admin
nextcloud_admin_password_vault: vaultmeplease

И ваши групповые переменные в group_vars/nextcloud.yml:

# Nextcloud
nextcloud_domain: "yourdomain.com"
nextcloud_admin_user: "{{ nextcloud_admin_user_vault }}"
nextcloud_admin_password: "{{ nextcloud_admin_password_vault }}"
nextcloud_instanceid: "{{ nextcloud_instanceid_vault }}"
nextcloud_passwordsalt: "{{ nextcloud_passwordsalt_vault }}"
nextcloud_secret: "{{ nextcloud_secret_vault }}"
nextcloud_dbpassword: "{{ nextcloud_dbpassword_vault }}"
nextcloud_apps: [calendar]

# MySQL
mysql_root_password: "{{ mysql_root_password_vault }}"
mysql_bind_address: 127.0.0.1
mysql_packages:
  - mariadb-client
  - mariadb-server
  - python-mysqldb
mysql_databases:
  - name: nextcloud
    encoding: utf8mb4
    collation: utf8mb4_general_ci
mysql_users:
  - name: nextcloud
    host: "localhost"
    password: "{{ nextcloud_dbpassword }}"
    priv: "nextcloud.*:ALL"
    state: present

# Nginx
nginx_remove_default_vhost: true
nginx_service_enabled: true
nginx_service_state: started
nginx_listen_ipv6: false
nginx_vhosts:
  - listen: {{ hostvars[inventory_hostname]['ansible_default_ipv4']['address'] }}:443 ssl http2 default_server
    server_name: "{{ nextcloud_domain }}"
    state: "present"
    root: "/var/www/{{ nextcloud_domain }}/current/nextcloud"
    index: index.php
    extra_parameters: |
      add_header Referrer-Policy "no-referrer" always;
      add_header X-Content-Type-Options "nosniff" always;
      add_header X-Download-Options "noopen" always;
      add_header X-Frame-Options "SAMEORIGIN" always;
      add_header X-Permitted-Cross-Domain-Policies "none" always;
      add_header X-Robots-Tag "none" always;
      add_header X-XSS-Protection "1; mode=block" always;

      ssl_certificate /root/.acme.sh/{{ nextcloud_domain }}/fullchain.cer;
      ssl_certificate_key /root/.acme.sh/{{ nextcloud_domain }}/{{ nextcloud_domain }}.key;
      include /etc/nginx/generic.conf;
      include /etc/nginx/gzip.conf;
      include /etc/nginx/security.conf;
      include /etc/nginx/ssl.conf;

      location = /.well-known/carddav {
        return 301 $scheme://$host/remote.php/dav;
      }

      location = /.well-known/caldav {
        return 301 $scheme://$host/remote.php/dav;
      }

      client_max_body_size 512M;
      fastcgi_buffers 64 4K;

      location / {
        rewrite ^ /index.php;
      }

      location ~ ^\/(?:build|tests|config|lib|3rdparty|templates|data)\/ {
          deny all;
      }
      location ~ ^\/(?:\.|autotest|occ|issue|indie|db_|console) {
          deny all;
      }

      location ~ ^\/(?:index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+)\.php(?:$|\/) {
        fastcgi_split_path_info ^(.+?\.php)(\/.*|)$;
        set $path_info $fastcgi_path_info;
        try_files $fastcgi_script_name =404;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $path_info;
        fastcgi_param HTTPS on;
        fastcgi_param modHeadersAvailable true;
        fastcgi_param front_controller_active true;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_intercept_errors on;
        fastcgi_request_buffering off;
      }

      location ~ ^\/(?:updater|oc[ms]-provider)(?:$|\/) {
        try_files $uri/ =404;
        index index.php;
      }

      location ~ \.(?:css|js|woff2?|svg|gif|map)$ {
        try_files $uri /index.php$request_uri;
        add_header Cache-Control "public, max-age=15778463";
        add_header Referrer-Policy "no-referrer" always;
        add_header X-Content-Type-Options "nosniff" always;
        add_header X-Download-Options "noopen" always;
        add_header X-Frame-Options "SAMEORIGIN" always;
        add_header X-Permitted-Cross-Domain-Policies "none" always;
        add_header X-Robots-Tag "none" always;
        add_header X-XSS-Protection "1; mode=block" always;
        access_log off;
      }

      location ~ \.(?:png|html|ttf|ico|jpg|jpeg|bcmap)$ {
        try_files $uri /index.php$request_uri;
        access_log off;
      }

# PHP
php_default_version_debian: "8.2"
php_packages:
  - php8.2-cli
  - php8.2-fpm
php_install_recommends: false
php_enable_webserver: false
php_enable_php_fpm: true
php_enable_apc: false
php_memory_limit: "512M"
php_upload_max_filesize: "512M"
php_post_max_size: "512M"
php_date_timezone: "Europe/Paris"
php_opcache_zend_extension: "opcache.so"
php_opcache_enable: "1"
php_opcache_enable_cli: "0"
php_opcache_memory_consumption: "128"
php_opcache_interned_strings_buffer: "16"
php_opcache_max_accelerated_files: "10000"
php_opcache_max_wasted_percentage: "5"
php_opcache_validate_timestamps: "0"
php_opcache_revalidate_path: "0"
php_opcache_revalidate_freq: "1"
php_opcache_max_file_size: "0"

Документация для разработчиков

Документация для разработчиков

Лицензия

GPLv3

О проекте

Ansible role to install nextcloud

Установить
ansible-galaxy install nierdz/ansible-role-nextcloud
Лицензия
gpl-3.0
Загрузки
1332
Владелец