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"