untested: nextcloud with ansibke
This commit is contained in:
parent
03083b0ade
commit
e83feaddb8
22
defaults/main.yml
Normal file
22
defaults/main.yml
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
path: /srv/{{ role_name }}
|
||||||
|
|
||||||
|
nextcloud_override: {}
|
||||||
|
nextcloud_defaults:
|
||||||
|
url: ""
|
||||||
|
data_path: ""
|
||||||
|
db_password: ""
|
||||||
|
secret: ""
|
||||||
|
secret_salt: ""
|
||||||
|
mail: {}
|
||||||
|
oidc:
|
||||||
|
issuer: ""
|
||||||
|
client_id: ""
|
||||||
|
client_secret: ""
|
||||||
|
id_attribute: "user_id"
|
||||||
|
quota_attribute: "quota"
|
||||||
|
|
||||||
|
collabora:
|
||||||
|
password: ""
|
||||||
|
url: ""
|
||||||
|
drawio:
|
||||||
|
url: ""
|
||||||
9
handlers/main.yml
Normal file
9
handlers/main.yml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
- name: restart container
|
||||||
|
community.docker.docker_compose_v2:
|
||||||
|
project_src: "{{ path }}"
|
||||||
|
project_name: "{{ role_name }}"
|
||||||
|
recreate: "always"
|
||||||
|
services: ["nextcloud"]
|
||||||
|
state: "restarted"
|
||||||
|
when: not _nextcloud_already_restarted
|
||||||
|
|
||||||
20
meta/main.yml
Normal file
20
meta/main.yml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
galaxy_info:
|
||||||
|
author: "Niklas Freese <niklas@urmel.de>"
|
||||||
|
description: nextcloud
|
||||||
|
company: "Urmel Services"
|
||||||
|
license: AGPL-3.0-or-later
|
||||||
|
min_ansible_version: 2.1
|
||||||
|
# If this a Container Enabled role, provide the minimum Ansible Container version.
|
||||||
|
# min_ansible_container_version:
|
||||||
|
|
||||||
|
galaxy_tags: []
|
||||||
|
# List tags for your role here, one per line. A tag is a keyword that describes
|
||||||
|
# and categorizes the role. Users find roles by searching for tags. Be sure to
|
||||||
|
# remove the '[]' above, if you add tags to this list.
|
||||||
|
#
|
||||||
|
# NOTE: A tag is limited to a single word comprised of alphanumeric characters.
|
||||||
|
# Maximum 20 tags per role.
|
||||||
|
|
||||||
|
# dependencies:
|
||||||
|
# - role: base
|
||||||
59
tasks/main.yml
Normal file
59
tasks/main.yml
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
---
|
||||||
|
- name: "set local variables from overrides and defaults"
|
||||||
|
set_fact:
|
||||||
|
nextcloud: "{{ (nextcloud_defaults | combine(nextcloud_override, recursive=True)) if nextcloud_override else nextcloud_defaults }}"
|
||||||
|
|
||||||
|
- name: ensure that path exists
|
||||||
|
file:
|
||||||
|
path: "{{ path }}/config/nextcloud"
|
||||||
|
state: directory
|
||||||
|
|
||||||
|
- name: template compose
|
||||||
|
template:
|
||||||
|
src: compose.yml.j2
|
||||||
|
dest: "{{ path }}/compose.yml"
|
||||||
|
|
||||||
|
- name: template nc config
|
||||||
|
template:
|
||||||
|
src: importconfig.json.j2
|
||||||
|
dest: "{{ path }}/config/nextcloud/importconfig.json"
|
||||||
|
register: _importconfig
|
||||||
|
|
||||||
|
- block:
|
||||||
|
- name: recreate nextcloud so the configfile gets updated
|
||||||
|
community.docker.docker_compose_v2:
|
||||||
|
project_src: "{{ path }}"
|
||||||
|
project_name: "{{ role_name }}"
|
||||||
|
state: present
|
||||||
|
recreate: always
|
||||||
|
services: "nextcloud"
|
||||||
|
wait: true
|
||||||
|
|
||||||
|
- name: import config
|
||||||
|
community.docker.docker_container_exec:
|
||||||
|
container: "{{ nextcloud_container }}"
|
||||||
|
chdir: "/var/www/html/"
|
||||||
|
user: "www-data"
|
||||||
|
command: "php occ config:import /tmp/importconfig.json"
|
||||||
|
when: "_importconfig.changed or 'installed: false' in nextcloud_status_check.stdout"
|
||||||
|
|
||||||
|
- name: ensure containers are running
|
||||||
|
community.docker.docker_compose_v2:
|
||||||
|
project_src: "{{ path }}"
|
||||||
|
project_name: "{{ role_name }}"
|
||||||
|
state: "present"
|
||||||
|
pull: "always"
|
||||||
|
wait: true
|
||||||
|
services: >-
|
||||||
|
{{ ['db', 'redis', 'nextcloud'] +
|
||||||
|
(['collabora'] if nextcloud.collabora.url | default('') else []) +
|
||||||
|
(['drawio'] if nextcloud.drawio.url | default('') else []) }}
|
||||||
|
register: _compose_result
|
||||||
|
|
||||||
|
- name: import config
|
||||||
|
community.docker.docker_container_exec:
|
||||||
|
container: "{{ nextcloud_container }}"
|
||||||
|
chdir: "/var/www/html/"
|
||||||
|
user: "www-data"
|
||||||
|
command: "php occ config:import /tmp/importconfig.json"
|
||||||
|
when: "_importconfig.changed or 'installed: false' in nextcloud_status_check.stdout"
|
||||||
@ -1,4 +1,3 @@
|
|||||||
version: '2'
|
|
||||||
services:
|
services:
|
||||||
db:
|
db:
|
||||||
image: mariadb:10.6
|
image: mariadb:10.6
|
||||||
@ -6,28 +5,47 @@ services:
|
|||||||
hostname: maria-db
|
hostname: maria-db
|
||||||
command: --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROW
|
command: --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROW
|
||||||
networks:
|
networks:
|
||||||
- db-con
|
- internal
|
||||||
volumes:
|
volumes:
|
||||||
- db:/var/lib/mysql
|
- ./data/db:/var/lib/mysql
|
||||||
environment:
|
environment:
|
||||||
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
|
- MYSQL_ROOT_PASSWORD={{ nextcloud.db_password }}
|
||||||
- MYSQL_PASSWORD=${MYSQL_ROOT_PASSWORD}
|
- MYSQL_PASSWORD={{ nextcloud.db_password }}
|
||||||
- MYSQL_DATABASE=nextcloud
|
- MYSQL_DATABASE=nextcloud
|
||||||
- MYSQL_USER=nextcloud
|
- MYSQL_USER=nextcloud
|
||||||
|
|
||||||
app:
|
redis:
|
||||||
|
image: redis:latest
|
||||||
|
restart: always
|
||||||
|
networks:
|
||||||
|
- internal
|
||||||
|
command: >
|
||||||
|
--appendonly yes
|
||||||
|
--tcp-backlog 511 --databases 16
|
||||||
|
--save 900 1 --save 300 10 --save 60 10000
|
||||||
|
--maxclients 512
|
||||||
|
volumes:
|
||||||
|
- "./data/redis:/data"
|
||||||
|
healthcheck:
|
||||||
|
test: [ "CMD", "redis-cli", "ping" ]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
|
||||||
|
nextcloud:
|
||||||
image: nextcloud:32.0.5
|
image: nextcloud:32.0.5
|
||||||
hostname: nextcloud
|
hostname: nextcloud
|
||||||
restart: always
|
restart: always
|
||||||
networks:
|
networks:
|
||||||
- proxy
|
- proxy
|
||||||
- db-con
|
- internal
|
||||||
volumes:
|
volumes:
|
||||||
- nextcloud:/var/www/html
|
- {{ nextcloud.data_path }}:/var/www/html
|
||||||
- nextcloud_hooks:/docker-entrypoint-hooks.d
|
- ./config/hooks:/docker-entrypoint-hooks.d
|
||||||
- /etc/localtime:/etc/localtime:ro
|
- "./config/nextcloud-importconfig.json:/tmp/importconfig.json:ro"
|
||||||
|
- /etc/localtime:/etc/localtime:ro
|
||||||
environment:
|
environment:
|
||||||
- MYSQL_PASSWORD=${MYSQL_ROOT_PASSWORD}
|
- MYSQL_PASSWORD={{ nextcloud.db_password }}
|
||||||
- MYSQL_DATABASE=nextcloud
|
- MYSQL_DATABASE=nextcloud
|
||||||
- MYSQL_USER=nextcloud
|
- MYSQL_USER=nextcloud
|
||||||
- MYSQL_HOST=maria-db
|
- MYSQL_HOST=maria-db
|
||||||
@ -35,7 +53,7 @@ services:
|
|||||||
- PHP_UPLOAD_LIMIT=5120M
|
- PHP_UPLOAD_LIMIT=5120M
|
||||||
labels:
|
labels:
|
||||||
traefik.enable: true
|
traefik.enable: true
|
||||||
traefik.http.routers.nextcloud.rule: "Host(`nextcloud.urmel.de`)"
|
traefik.http.routers.nextcloud.rule: "Host(`{{ nextcloud.url }}`)"
|
||||||
traefik.http.routers.nextcloud.tls: true
|
traefik.http.routers.nextcloud.tls: true
|
||||||
traefik.http.routers.nextcloud.tls.certResolver: hetzner
|
traefik.http.routers.nextcloud.tls.certResolver: hetzner
|
||||||
traefik.http.services.nextcloud-https.loadbalancer.server.port: 80
|
traefik.http.services.nextcloud-https.loadbalancer.server.port: 80
|
||||||
@ -46,24 +64,20 @@ services:
|
|||||||
traefik.http.middlewares.nextcloud-dav.redirectRegex.replacement: https://$${1}/remote.php/dav/
|
traefik.http.middlewares.nextcloud-dav.redirectRegex.replacement: https://$${1}/remote.php/dav/
|
||||||
traefik.http.middlewares.nextcloud-dav.redirectRegex.permanent: true
|
traefik.http.middlewares.nextcloud-dav.redirectRegex.permanent: true
|
||||||
traefik.http.middlewares.nextcloud-header.headers.stsSeconds: "15552000"
|
traefik.http.middlewares.nextcloud-header.headers.stsSeconds: "15552000"
|
||||||
# traefik.http.middlewares.nextcloud-header.headers.referrerPolicy: no-referrer
|
|
||||||
# traefik.http.middlewares.nextcloud-header.headers.forceSTSHeader: true
|
{% if nextcloud.collabora.url %}
|
||||||
# traefik.http.middlewares.nextcloud-header.headers.stsPreload: true
|
|
||||||
# traefik.http.middlewares.nextcloud-header.headers.stsIncludeSubdomains: true
|
|
||||||
# traefik.http.middlewares.nextcloud-header.headers.browserXssFilter: true
|
|
||||||
# traefik.http.middlewares.nextcloud-header.headers.customRequestHeaders.X-Forwarded-Proto: https
|
|
||||||
collabora:
|
collabora:
|
||||||
image: collabora/code:25.04.8.1.1
|
image: collabora/code:25.04.8.1.1
|
||||||
hostname: collabora
|
hostname: collabora
|
||||||
networks:
|
networks:
|
||||||
- proxy
|
- proxy
|
||||||
environment:
|
environment:
|
||||||
- aliasgroup1=https://nextcloud.urmel.de
|
- aliasgroup1="https://{{ nextcloud.url }}"
|
||||||
- DONT_GEN_SSL_CERT=YES
|
- DONT_GEN_SSL_CERT=YES
|
||||||
- domain=collabora.urmel.de
|
- domain="{{ nextcloud.collabora.url }}"
|
||||||
- VIRTUAL_HOST=collabora.urmel.de
|
- VIRTUAL_HOST="{{ nextcloud.collabora.url }}"
|
||||||
- username=someAdmin
|
- username=someAdmin
|
||||||
- password=${COLLABORA_PASSWORD}
|
- password="{{ nextcloud.collabora.password }}"
|
||||||
- extra_params=--o:ssl.enable=false --o:ssl.termination=true --o:net.wopi.host=nextcloud.urmel.de --o:logging.disable_server_audit=true
|
- extra_params=--o:ssl.enable=false --o:ssl.termination=true --o:net.wopi.host=nextcloud.urmel.de --o:logging.disable_server_audit=true
|
||||||
cap_add:
|
cap_add:
|
||||||
- CHOWN
|
- CHOWN
|
||||||
@ -84,24 +98,15 @@ services:
|
|||||||
retries: 5
|
retries: 5
|
||||||
labels:
|
labels:
|
||||||
traefik.enable: true
|
traefik.enable: true
|
||||||
traefik.http.routers.collabora.rule: "Host(`collabora.urmel.de`)"
|
traefik.http.routers.collabora.rule: "Host(`{{ nextcloud.collabora.url }}`)"
|
||||||
traefik.http.routers.collabora.tls: true
|
traefik.http.routers.collabora.tls: true
|
||||||
traefik.http.routers.collabora.tls.certResolver: hetzner
|
traefik.http.routers.collabora.tls.certResolver: hetzner
|
||||||
traefik.http.services.collabora-https.loadbalancer.server.port: 9980
|
traefik.http.services.collabora-https.loadbalancer.server.port: 9980
|
||||||
traefik.http.services.collabora-https.loadbalancer.passHostHeader: true
|
traefik.http.services.collabora-https.loadbalancer.passHostHeader: true
|
||||||
|
|
||||||
# traefik.http.middlewares.collabora-headers.headers.customrequestheaders.Connection: Upgrade
|
{% endif %}
|
||||||
# traefik.http.middlewares.collabora-headers.headers.customrequestheaders.Upgrade: websocket
|
|
||||||
# traefik.http.middlewares.collabora-headers.headers.customrequestheaders.X-Forwarded-Proto: https
|
{% if nextcloud.drawio.url %}
|
||||||
# traefik.http.middlewares.collabora-headers.headers.customrequestheaders.X-Forwarded-Host: collabora.urmel.de
|
|
||||||
# traefik.http.middlewares.collabora-headers.headers.referrerPolicy: no-referrer
|
|
||||||
# traefik.http.middlewares.collabora-headers.headers.stsSeconds: 15552000
|
|
||||||
# traefik.http.middlewares.collabora-headers.headers.forceSTSHeader: true
|
|
||||||
# traefik.http.middlewares.collabora-headers.headers.stsPreload: true
|
|
||||||
# traefik.http.middlewares.collabora-headers.headers.stsIncludeSubdomains: true
|
|
||||||
# traefik.http.middlewares.collabora-headers.headers.browserXssFilter: true
|
|
||||||
# traefik.http.middlewares.collabora-headers.headers.customRequestHeaders.X-Forwarded-Proto: https
|
|
||||||
# traefik.http.routers.collabora.middlewares: collabora-headers
|
|
||||||
drawio:
|
drawio:
|
||||||
image: jgraph/drawio:29.3.5
|
image: jgraph/drawio:29.3.5
|
||||||
hostname: drawio
|
hostname: drawio
|
||||||
@ -109,24 +114,14 @@ services:
|
|||||||
- proxy
|
- proxy
|
||||||
labels:
|
labels:
|
||||||
traefik.enable: true
|
traefik.enable: true
|
||||||
traefik.http.routers.drawio.rule: "Host(`drawio.urmel.de`)"
|
traefik.http.routers.drawio.rule: "Host(`{{ nextcloud.drawio.url }}`)"
|
||||||
traefik.http.routers.drawio.tls: true
|
traefik.http.routers.drawio.tls: true
|
||||||
traefik.http.routers.drawio.tls.certResolver: hetzner
|
traefik.http.routers.drawio.tls.certResolver: hetzner
|
||||||
traefik.http.services.drawio-https.loadbalancer.server.port: 8080
|
traefik.http.services.drawio-https.loadbalancer.server.port: 8080
|
||||||
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
nextcloud:
|
|
||||||
driver_opts:
|
|
||||||
type: nfs4
|
|
||||||
o: addr=217.100.0.2,rw,noatime,tcp
|
|
||||||
device: ":/mnt/Main/nextcloudData"
|
|
||||||
nextcloud_hooks:
|
|
||||||
db:
|
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
proxy:
|
proxy:
|
||||||
name: traefik_exposed
|
name: traefik_exposed
|
||||||
external: true
|
external: true
|
||||||
db-con:
|
internal:
|
||||||
internal: true
|
internal: true
|
||||||
92
templates/importconfig.json.j2
Normal file
92
templates/importconfig.json.j2
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
{
|
||||||
|
"system": {
|
||||||
|
"htaccess.RewriteBase": "/",
|
||||||
|
"memcache.local": "\\OC\\Memcache\\APCu",
|
||||||
|
"memcache.locking": "\\OC\\Memcache\\Redis",
|
||||||
|
"memcache.distributed": "\\OC\\Memcache\\Redis",
|
||||||
|
"redis": {
|
||||||
|
"host": "redis",
|
||||||
|
"port": "6379"
|
||||||
|
},
|
||||||
|
"upgrade.disable-web": true,
|
||||||
|
"instanceid": "ocm6kh4i5s9r",
|
||||||
|
"passwordsalt": "{{ nextcloud.secretsalt }}",
|
||||||
|
"secret": "{{ nextcloud.secret }}",
|
||||||
|
"apache_disable_rewrite_ip": true,
|
||||||
|
"trusted_proxies": [
|
||||||
|
"172.18.0.0/16"
|
||||||
|
],
|
||||||
|
"trusted_domains": [
|
||||||
|
"{{ nextcloud.url }}"
|
||||||
|
],
|
||||||
|
"overwrite.cli.url": "https://{{ nextcloud.url }}",
|
||||||
|
"overwriteprotocol": "https",
|
||||||
|
|
||||||
|
{% if nextcloud.oidc.issuer -%}
|
||||||
|
"oidc_login_provider_url": "{{ nextcloud.oidc.issuer }}",
|
||||||
|
"oidc_login_client_id": "{{ nextcloud.oidc.client_id }}",
|
||||||
|
"oidc_login_client_secret": "{{ nextcloud.oidc.client_secret }}",
|
||||||
|
"oidc_login_auto_redirect": true,
|
||||||
|
"oidc_login_logout_url": "{{ nextcloud.oidc.issuer }}",
|
||||||
|
"oidc_login_end_session_redirect": true,
|
||||||
|
"oidc_login_hide_password_form": false,
|
||||||
|
"oidc_login_use_id_token": false,
|
||||||
|
|
||||||
|
"oidc_login_attributes": {
|
||||||
|
"id": "{{ nextcloud.oidc.id_attribute }}",
|
||||||
|
"name": "name",
|
||||||
|
"mail": "email",
|
||||||
|
"quota": "{{ nextcloud.oidc.id_attribute }}",
|
||||||
|
},
|
||||||
|
"oidc_login_scope": "email profile nextcloud openid",
|
||||||
|
|
||||||
|
"oidc_login_proxy_ldap": false,
|
||||||
|
"oidc_login_disable_registration": false,
|
||||||
|
"oidc_login_password_authentication": true,
|
||||||
|
"oidc_login_update_avatar": true,
|
||||||
|
"oidc_create_groups": true,
|
||||||
|
{%- endif %}
|
||||||
|
|
||||||
|
"datadirectory": "/var/www/html/data",
|
||||||
|
"dbtype": "mysql",
|
||||||
|
"version": "32.0.5.0",
|
||||||
|
"dbname": "nextcloud",
|
||||||
|
"dbhost": "db",
|
||||||
|
"dbport": "",
|
||||||
|
"dbtableprefix": "oc_",
|
||||||
|
"mysql.utf8mb4": true,
|
||||||
|
"dbuser": "nextcloud",
|
||||||
|
"dbpassword": "{{ nextcloud.db_password }}",
|
||||||
|
"installed": true,
|
||||||
|
"maintenance_window_start": 100,
|
||||||
|
"enabledPreviewProviders": [
|
||||||
|
"OC\\Preview\\Image",
|
||||||
|
"OC\\Preview\\HEIC",
|
||||||
|
"OC\\Preview\\TIFF",
|
||||||
|
"OC\\Preview\\Movie"
|
||||||
|
],
|
||||||
|
"preview_max_x": 2048,
|
||||||
|
"preview_max_y": 2048,
|
||||||
|
"loglevel": 2,
|
||||||
|
"opcache.memory_consumption": 512,
|
||||||
|
"opcache.revalidate_freq": 60,
|
||||||
|
"default_phone_region": "DE",
|
||||||
|
"memories.gis_type": 1,
|
||||||
|
"mail_domain": "{{ mail.domain }}",
|
||||||
|
"mail_from_address": "noreply",
|
||||||
|
"mail_smtpmode": "smtp",
|
||||||
|
"mail_smtphost": "{{ mail.host }}",
|
||||||
|
"mail_smtpport": "587",
|
||||||
|
"mail_sendmailmode": "smtp",
|
||||||
|
"mail_smtpauth": true,
|
||||||
|
"mail_smtpname": "{{ mail.address }}",
|
||||||
|
"mail_smtppassword": "{{ mail.password }}",
|
||||||
|
"user_oidc": {
|
||||||
|
"auto_provision": true
|
||||||
|
},
|
||||||
|
"forwarded_for_headers": [
|
||||||
|
"HTTP_X_FORWARDED_FOR"
|
||||||
|
],
|
||||||
|
"allow_local_remote_servers": true
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user