feat(nextcloud): add role for deploying nextcloud with fpm

This commit is contained in:
transcaffeine 2021-10-13 15:46:46 +02:00 committed by transcaffeine
commit ad703dbee4
Signed by untrusted user: transcaffeine
GPG Key ID: 03624C433676E465
10 changed files with 334 additions and 0 deletions

View File

@ -0,0 +1,58 @@
---
nextcloud_version: 22.2.0
nextcloud_user: nextcloud
nextcloud_basepath: /opt/nextcloud
nextcloud_config_path: "{{ nextcloud_basepath }}/config"
# Where data from nextcloud like apps etc are persisted
nextcloud_data_path: "{{ nextcloud_basepath }}/data"
# Where user data like media, documents etc are persisted
nextcloud_storage_path: "{{ nextcloud_basepath }}/storage"
nextcloud_fpm_config_path: "{{ nextcloud_basepath }}/fpm-config"
nextcloud_database_type: sqlite
nextcloud_database_name: nextcloud
nextcloud_database_user: nextcloud
nextcloud_database_pass: ~
nextcloud_database_host: localhost
nextcloud_container_name: nextcloud
nextcloud_container_image: docker.io/library/nextcloud
nextcloud_container_image_variant: "-fpm-alpine"
nextcloud_container_image_ref: "{{ nextcloud_container_name }}:{{ nextcloud_version }}{{ nextcloud_container_image_variant }}"
nextcloud_container_image_force_source: false
nextcloud_container_restart_policy: "unless-stopped"
# in defaults so it can be unset if needed
nextcloud_container_base_volumes:
- "{{ nextcloud_config_path }}:/var/www/html/config:z"
- "{{ nextcloud_storage_path }}:/var/www/html/data:z"
- "{{ nextcloud_data_path }}:/var/www/html:z"
- "{{ nextcloud_fpm_config_path }}/opcache.ini:/usr/local/etc/php/conf.d/opcache-recommended.ini:z"
- "{{ nextcloud_fpm_config_path }}/fpm.ini:/usr/local/etc/php-fpm.d/www.conf:z"
- "{{ nextcloud_basepath }}/nextcloud-passwd:/etc/passwd:z"
- "{{ nextcloud_basepath }}/nextcloud-group:/etc/group:z"
nextcloud_container_extra_volumes: []
nextcloud_container_extra_labels: {}
nextcloud_container_extra_environment: {}
nextcloud_container_networks: ~
nextcloud_container_purge_other_networks: true
nextcloud_paths:
- path: "{{ nextcloud_config_path }}"
mode: "0755"
owner: "{{ nextcloud_user_info.uid|default(nextcloud_user) }}"
group: "root"
- path: "{{ nextcloud_data_path }}"
mode: "0755"
owner: "{{ nextcloud_user_info.uid|default(nextcloud_user) }}"
group: "{{ nextcloud_user_info.uid|default(nextcloud_user) }}"
- path: "{{ nextcloud_fpm_config_path }}"
mode: "0750"
owner: root
group: root
- path: "{{ nextcloud_storage_path }}"
mode: "0770"
owner: "{{ nextcloud_user_info.uid|default(nextcloud_user) }}"
group: "root"

View File

@ -0,0 +1,13 @@
---
- name: reload-systemd
systemd:
daemon_reload: yes
- name: reload-nextcloud
docker_container:
name: "{{ nextcloud_container_name }}"
state: started
restart: yes
force_kill: yes
kill_signal: HUP

View File

@ -0,0 +1,109 @@
---
- name: Create nextcloud user
user:
name: "{{ nextcloud_user }}"
state: present
system: yes
register: nextcloud_user_info
- name: Ensure nextcloud directories exist and have correct permissions
file:
path: "{{ item.path }}"
state: directory
mode: "{{ item.mode }}"
owner: "{{ item.owner }}"
group: "{{ item.group }}"
loop: "{{ nextcloud_paths }}"
- name: Ensure docker container for nextcloud is pulled
docker_image:
name: "{{ nextcloud_container_image_ref }}"
state: present
source: pull
force_source: "{{ nextcloud_container_image_force_source }}"
- name: Template OpCache configuration
template:
src: nextcloud-fpm-opcache.ini.j2
dest: "{{ nextcloud_fpm_config_path }}/opcache.ini"
mode: "0640"
owner: "root"
group: "root"
notify:
- reload-nextcloud
- name: Template PHP FPM configuration
template:
src: nextcloud-fpm.ini.j2
dest: "{{ nextcloud_fpm_config_path }}/fpm.ini"
mode: "0640"
owner: "root"
group: "root"
notify:
- reload-nextcloud
- name: Template modified /etc/passwd for nextcloud container
template:
src: nextcloud-passwd.j2
dest: "{{ nextcloud_basepath }}/nextcloud-passwd"
mode: "0640"
owner: "root"
group: "root"
notify:
- reload-nextcloud
- name: Template modified /etc/passwd for nextcloud container
template:
src: nextcloud-group.j2
dest: "{{ nextcloud_basepath }}/nextcloud-group"
mode: "0640"
owner: "root"
group: "root"
notify:
- reload-nextcloud
- name: Template systemd service for nextcloud's cron job
template:
src: systemd-nextcloud-cron.service.j2
dest: /etc/systemd/system/nextcloud-cron.service
mode: "0640"
owner: root
group: root
notify:
- reload-systemd
- name: Template timer for nextcloud's cron job
template:
src: systemd-nextcloud-cron.timer.j2
dest: /etc/systemd/system/nextcloud-cron.timer
mode: "0640"
owner: root
group: root
notify:
- reload-systemd
- meta: flush_handlers
- name: Enable systemd timer for nextcloud cron
systemd:
name: "nextcloud-cron.timer"
enabled: yes
- name: Ensure systemd timer for nextcloud cron is started
systemd:
name: "nextcloud-cron.timer"
state: started
- name: Ensure docker container for nextcloud is running
docker_container:
name: "{{ nextcloud_container_name }}"
image: "{{ nextcloud_container_image_ref }}"
volumes: "{{ nextcloud_container_volumes }}"
labels: "{{ nextcloud_container_labels }}"
env: "{{ nextcloud_container_env }}"
networks: "{{ nextcloud_container_networks | default(omit, true) }}"
purge_networks: "{{ nextcloud_container_purge_other_networks }}"
restart_policy: "{{ nextcloud_container_restart_policy }}"
state: started

View File

@ -0,0 +1,14 @@
opcache.enable=1
opcache.interned_strings_buffer=32
; next prime in the set which is suitable for large installations
; default for this setting is 10000 which picks the prime 7963,
; but default installation of nextcloud has already ~9k php files
; see https://www.php.net/manual/en/opcache.configuration.php#ini.opcache.max-accelerated-files
opcache.max_accelerated_files=32531
opcache.memory_consumption=256
; deconstructor optimizations
opcache.fast_shutdown=1
;opcache.save_comments=1
; not used if validate_timestamps=0
;opcache.revalidate_freq=1
opcache.validate_timestamps=0

View File

@ -0,0 +1,14 @@
[www]
user = www-data
group = www-data
listen = 127.0.0.1:9000
pm = dynamic
pm.max_children = 64
pm.start_servers = 32
pm.min_spare_servers = 24
pm.max_spare_servers = 48
;pm.max_requests=500

View File

@ -0,0 +1,48 @@
root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
sys:x:3:root,bin,adm
adm:x:4:root,adm,daemon
tty:x:5:
disk:x:6:root,adm
lp:x:7:lp
mem:x:8:
kmem:x:9:
wheel:x:10:root
floppy:x:11:root
mail:x:12:mail
news:x:13:news
uucp:x:14:uucp
man:x:15:man
cron:x:16:cron
console:x:17:
audio:x:18:
cdrom:x:19:
dialout:x:20:root
ftp:x:21:
sshd:x:22:
input:x:23:
at:x:25:at
tape:x:26:root
video:x:27:root
netdev:x:28:
readproc:x:30:
squid:x:31:squid
xfs:x:33:xfs
kvm:x:34:kvm
games:x:35:
shadow:x:42:
cdrw:x:80:
www-data:x:{{ nextcloud_user_info.group }}:www-data
usb:x:85:
vpopmail:x:89:
users:x:100:games
ntp:x:123:
nofiles:x:200:
smmsp:x:209:smmsp
locate:x:245:
abuild:x:300:
utmp:x:406:utmp
ping:x:999:
nogroup:x:65533:
nobody:x:65534:

View File

@ -0,0 +1,29 @@
root:x:0:0:root:/root:/bin/ash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/mail:/sbin/nologin
news:x:9:13:news:/usr/lib/news:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucppublic:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
man:x:13:15:man:/usr/man:/sbin/nologin
postmaster:x:14:12:postmaster:/var/mail:/sbin/nologin
cron:x:16:16:cron:/var/spool/cron:/sbin/nologin
ftp:x:21:21::/var/lib/ftp:/sbin/nologin
sshd:x:22:22:sshd:/dev/null:/sbin/nologin
at:x:25:25:at:/var/spool/cron/atjobs:/sbin/nologin
squid:x:31:31:Squid:/var/cache/squid:/sbin/nologin
xfs:x:33:33:X Font Server:/etc/X11/fs:/sbin/nologin
games:x:35:35:games:/usr/games:/sbin/nologin
cyrus:x:85:12::/usr/cyrus:/sbin/nologin
vpopmail:x:89:89::/var/vpopmail:/sbin/nologin
ntp:x:123:123:NTP:/var/empty:/sbin/nologin
smmsp:x:209:209:smmsp:/var/spool/mqueue:/sbin/nologin
guest:x:405:100:guest:/dev/null:/sbin/nologin
nobody:x:65534:65534:nobody:/:/sbin/nologin
www-data:x:{{ nextcloud_user_info.uid }}:{{ nextcloud_user_info.group }}:Linux User,,,:/home/www-data:/sbin/nologin
utmp:x:100:406:utmp:/home/utmp:/bin/false

View File

@ -0,0 +1,15 @@
[Unit]
Description=Nextcloud cron.php job
Requires=docker.service
After=docker.service
[Service]
Type=oneshot
User=root
WorkingDirectory={{ nextcloud_basepath }}
SyslogIdentifier={{ nextcloud_user }}
ExecStart=/usr/bin/docker exec -t --user={{ nextcloud_user_info.uid }} {{ nextcloud_container_name }} /usr/local/bin/php -f /var/www/html/cron.php
[Install]
WantedBy=multi-user.target

View File

@ -0,0 +1,10 @@
[Unit]
Description=Run Nextcloud cron.php every 5min
[Timer]
OnBootSec=5min
OnUnitActiveSec=5min
Unit=nextcloud-cron.service
[Install]
WantedBy=timers.target

View File

@ -0,0 +1,24 @@
---
nextcloud_container_volumes: "{{ nextcloud_container_base_volumes + nextcloud_container_extra_volumes }}"
nextcloud_container_env: "{{ nextcloud_container_base_environment | combine(nextcloud_container_extra_environment) }}"
nextcloud_container_base_labels:
version: "{{ nextcloud_version }}"
nextcloud_container_labels: "{{ nextcloud_container_base_labels | combine(nextcloud_container_extra_labels) }}"
nextcloud_container_base_environment: "{{ nextcloud_container_base_environment_yaml | from_yaml }}"
nextcloud_container_base_environment_yaml: |+2
{% if nextcloud_database_type == 'postgres' %}
POSTGRES_DB: "{{ nextcloud_database_name }}"
POSTGRES_USER: "{{ nextcloud_database_user }}"
POSTGRES_PASSWORD: "{{ nextcloud_database_pass }}"
POSTGRES_HOST: "{{ nextcloud_database_host }}"
{% elif nextcloud_database_type in ['mysql', 'mariadb'] %}
MYSQL_DATABASE: "{{ nextcloud_database_name }}"
MYSQL_USER: "{{ nextcloud_database_user }}"
MYSQL_PASSWORD: "{{ nextcloud_database_pass }}"
MYSQL_HOST: "{{ nextcloud_database_host }}"
{% elif nextcloud_database_type == 'sqlite' %}
SQLITE_DATABASE: "{{ nextcloud_database_name }}"
{% endif %}