nierdz.nextcloud

Nextcloud

Ce rôle ansible installe nextcloud de la manière capistrano. Cela signifie que la structure des dossiers ressemble à ceci :

/var/wwww
└── 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

Pour l’instant, ce rôle ne prend en charge que MySQL comme backend. Il utilise redis avec la configuration par défaut pour le cache local et distribué ainsi que pour le verrouillage de fichiers transactionnels.

Exigences

Nextcloud a besoin de PHP, d’un serveur web et d’un SGBD pour fonctionner. Pour satisfaire ces exigences, il est fortement recommandé d'utiliser ces 3 rôles :

Pourquoi ces rôles en particulier ? Parce qu'ils sont bien maintenus et certaines variables de ces rôles sont utilisées dans celui-ci, mais vous pouvez toujours utiliser d'autres rôles.

En production, vous aurez également besoin d'un certificat TLS, qui peut être obtenu en utilisant acme.sh.

Variables du rôle

nextcloud_version

Version de nextcloud à installer. Par défaut : "29.0.1"

nextcloud_domain

Nom de domaine à utiliser. Par défaut : ""

nextcloud_php_user

Tous les fichiers nextcloud seront la propriété de cet utilisateur. Généralement, vous devez définir cette valeur sur www-data. Par défaut : "{{ php_fpm_pool_user | default('www-data') }}"

nextcloud_php_version

Version majeure de PHP à utiliser. Par défaut : "{{ php_default_version_debian | default('8.2') }}"

nextcloud_php_bin_path

Chemin vers le binaire PHP. Par défaut : /usr/bin/php

nextcloud_keep_releases

Durée pendant laquelle vous souhaitez conserver les anciennes versions. Par défaut : "60d"

nextcloud_admin_user

Utilisateur admin par défaut créé lors de l'installation. Une fois l'installation terminée, vous pouvez créer un autre utilisateur avec le rôle d'administrateur et supprimer celui-ci. Par défaut : ""

nextcloud_admin_password

Mot de passe de nextcloud_admin_user. Il est fortement recommandé de le chiffrer avec ansible-vault Par défaut : ""

nextcloud_config_template

Modèle Jinja2 à utiliser pour le config.php de Nextcloud. Pour utiliser un modèle de configuration personnalisé, vous devez :

  • créer un répertoire templates/ au même niveau que votre playbook
  • créer un fichier templates/myconfig.php.j2 (choisissez juste un nom différent du modèle par défaut)
  • dans votre playbook, définir la variable nextcloud_config_template: myconfig.php.j2 Par défaut : "config.php.j2"

nextcloud_instanceid

ID d'instance unique. Générez-en un aléatoire et conservez-le tant que votre installation est active. Par défaut : ""

nextcloud_passwordsalt

Le sel utilisé pour hacher tous les mots de passe. Il est fortement recommandé de le chiffrer avec ansible-vault Par défaut : ""

nextcloud_secret

Secret utilisé par nextcloud à diverses fins, par exemple pour crypter des données. Si vous perdez cette chaîne, il y aura une corruption des données. Il est fortement recommandé de le chiffrer avec ansible-vault Par défaut : ""

nextcloud_dbhost

Hôte à utiliser pour se connecter à la base de données. Par défaut : "localhost"

nextcloud_dbname

Nom de la base de données nextcloud, qui est défini lors de l'installation. Par défaut : "nextcloud"

nextcloud_dbuser

L'utilisateur que nextcloud utilise pour lire et écrire dans la base de données. Par défaut : "nextcloud"

nextcloud_dbpassword

Mot de passe de nextcloud_dbuser. Il est fortement recommandé de le chiffrer avec ansible-vault Par défaut : ""

nextcloud_deploy_to

Dossier principal de votre installation nextcloud. Par défaut : "/var/www/{{ nextcloud_domain }}"

nextcloud_datadirectory

Emplacement où les fichiers des utilisateurs sont stockés. Par défaut : "{{ nextcloud_deploy_to }}/data"

nextcloud_php_packages

Paquets PHP supplémentaires nécessaires à nextcloud. Par défaut :

- 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

Paquets supplémentaires nécessaires à nextcloud. Par défaut :

- redis-server
- redis-tools
- unzip

nextcloud_apps

Liste des applications à installer et à activer. Par défaut : []

nextcloud_no_log

Masquer les données sensibles lors du déploiement. Par défaut : true

Exemple de travail

Voici ce que vous devriez avoir dans votre playbook.yml :

- name: Configurer les serveurs nextcloud
  become: true
  hosts: nextcloud
  vars_files:
    - vault_vars/nextcloud.yml
  roles:
    - {role: acme_sh, tags: [acme_sh]} (utilisez ce que vous voulez pour obtenir des certificats TLS)
    - {role: nginx, tags: ['nginx']}
    - {role: mysql, tags: ['mysql']}
    - {role: php, tags: ['php']}
    - {role: percona, tags: ['percona']}
    - {role: nextcloud, tags: ['nextcloud']}
  pre_tasks:
    - name: Installer la clé sury
      apt_key:
        url: "https://packages.sury.org/php/apt.gpg"
        state: present
    - name: Ajouter des dépôts sury
      apt_repository:
        repo: "deb https://packages.sury.org/php/ {{ ansible_distribution_release }} main"
        state: present
        update_cache: true
        filename: sury
    - name: Copier des fichiers de configuration nginx spécifiques
      copy:
        src: "{{ item }}"
        dest: /etc/nginx/
        owner: root
        mode: 0644
      with_fileglob:
        - nginx/*.conf
    - name: Copier /etc/nginx/dh4096.pem
      copy:
        src: nginx/dh4096.pem
        dest: /etc/nginx/dh4096.pem
        owner: www-data
        mode: 0400

Voici vos variables chiffrées dans 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

Et vos variables de groupe dans group_vars/nextcloud.yml :

# Nextcloud
nextcloud_domain: "votredomaine.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"

Documentation pour les développeurs

Documentation développeur

Licence

GPLv3

À propos du projet

Ansible role to install nextcloud

Installer
ansible-galaxy install nierdz.nextcloud
Licence
gpl-3.0
Téléchargements
1.4k
Propriétaire