nierdz.nextcloud
Nextcloud
このansibleロールは、nextcloudをキャピストラーノ方式でインストールします。これは、フォルダー構造が次のようになることを意味します:
/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
現在のところ、このロールはMySQLのみをバックエンドとしてサポートしています。デフォルト設定のredisを使用して、ローカルおよび分散キャッシング、ならびにトランザクションファイルロックを行います。
必要条件
Nextcloudを動かすためには、PHP、ウェブサーバー、DBMSが必要です。これらの要件を満たすために、以下の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
Nextcloudのconfig.php
に使用するJinja2テンプレート。カスタム設定テンプレートを使用するには:
- プレイブックと同じレベルに
templates/
ディレクトリを作成 templates/myconfig.php.j2
ファイルを作成(デフォルトテンプレートとは異なる名前を選択)- プレイブックで
nextcloud_config_template: myconfig.php.j2
を設定 デフォルト:"config.php.j2"
nextcloud_instanceid
ユニークなインスタンスID。ランダムに生成して、インストールが生きている限り保持します。
デフォルト: ""
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
nextcloudに必要な追加のPHPパッケージ。 デフォルト:
- 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"