diff --git a/.idea/jsonSchemas.xml b/.idea/jsonSchemas.xml
index 90b1880..f779688 100644
--- a/.idea/jsonSchemas.xml
+++ b/.idea/jsonSchemas.xml
@@ -74,6 +74,9 @@
-
+ -
+
+
diff --git a/README.md b/README.md
index 44ed2b5..eb44bd2 100644
--- a/README.md
+++ b/README.md
@@ -45,3 +45,15 @@ password hashes. This can be done by running the following command:
```bash
docker compose exec -it psql -U -c "\password"
```
+
+## Nextcloud
+Nextcloud requires some additional work to set up notify_push.
+
+- Initially, comment out the notify_push service in the docker compose.
+- Set up nextcloud and install the Client Push (notify_push) app.
+- Uncomment the notify_push service in the docker compose and `up -d` the stack.
+- ```bash
+ docker compose exec app ./occ notify_push:setup https://nc./push
+ ```
+
+I should probably get around to automating this at some point.
diff --git a/roles/alpina/templates/apps/nextcloud/.env.j2 b/roles/alpina/templates/apps/nextcloud/.env.j2
index b3a1e38..4bf5055 100644
--- a/roles/alpina/templates/apps/nextcloud/.env.j2
+++ b/roles/alpina/templates/apps/nextcloud/.env.j2
@@ -1 +1 @@
-NEXTCLOUD_VERSION=29-fpm-alpine
+NEXTCLOUD_VERSION=29-apache
diff --git a/roles/alpina/templates/apps/nextcloud/.env.nextcloud.j2 b/roles/alpina/templates/apps/nextcloud/.env.nextcloud.j2
index 1400b0a..a61fa6c 100644
--- a/roles/alpina/templates/apps/nextcloud/.env.nextcloud.j2
+++ b/roles/alpina/templates/apps/nextcloud/.env.nextcloud.j2
@@ -17,7 +17,8 @@ SMTP_PASSWORD={{ nextcloud_sendgrid_api_key }}
MAIL_FROM_ADDRESS=nc
MAIL_DOMAIN=cazzzer.com
-TRUSTED_PROXIES={{ traefik_subnet }}
+# host IPv4 and IPv6 addresses, loopback for notify_push
+TRUSTED_PROXIES={{ hostvars[inventory_hostname]['ansible_default_ipv4']['address'] }} {{ hostvars[inventory_hostname]['ansible_default_ipv6']['address'] }} 127.0.0.1 ::1
OVERWRITEHOST=nc.{{ domain }}
OVERWRITEPROTOCOL=https
OVERWRITECLIURL=https://nc.{{ domain }}
diff --git a/roles/alpina/templates/apps/nextcloud/.env.notify_push b/roles/alpina/templates/apps/nextcloud/.env.notify_push
new file mode 100644
index 0000000..8221c22
--- /dev/null
+++ b/roles/alpina/templates/apps/nextcloud/.env.notify_push
@@ -0,0 +1,4 @@
+DATABASE_URL=postgres://nextcloud:{{ nextcloud_db_password }}@db/nextcloud
+DATABASE_PREFIX=oc_
+REDIS_URL=redis://:{{ redis_password }}@redis
+NEXTCLOUD_URL=http://localhost
diff --git a/roles/alpina/templates/apps/nextcloud/docker-compose.yml.j2 b/roles/alpina/templates/apps/nextcloud/docker-compose.yml.j2
index 9a75151..40a87e2 100644
--- a/roles/alpina/templates/apps/nextcloud/docker-compose.yml.j2
+++ b/roles/alpina/templates/apps/nextcloud/docker-compose.yml.j2
@@ -10,6 +10,8 @@ services:
app:
image: nextcloud:${NEXTCLOUD_VERSION}
container_name: nextcloud_app
+ labels:
+ - {{ helpers.traefik_labels('nc', port='80') | indent(6) }}
restart: unless-stopped
depends_on:
- db
@@ -40,18 +42,25 @@ services:
notify_push:
image: nextcloud:${NEXTCLOUD_VERSION}
container_name: nextcloud_notify_push
+ {# TODO: Refactor this and minio -#}
+ labels:
+ - traefik.enable=true
+ - traefik.http.routers.nc-notify.rule=Host(`nc.{{ domain }}`) && PathPrefix(`/push`)
+ - traefik.http.routers.nc-notify.entrypoints=websecure
+ - traefik.http.routers.nc-notify.tls=true
+ - traefik.http.routers.nc-notify.tls.certresolver=letsencrypt
+ - traefik.http.routers.nc-notify.tls.domains.0.main={{ domain }}
+ - traefik.http.routers.nc-notify.tls.domains.0.sans=*.{{ domain }}
+ - traefik.http.services.nc-notify.loadbalancer.server.port=7867
restart: unless-stopped
- depends_on:
- - app
+ user: www-data
+ env_file:
+ - .env.notify_push
+ network_mode: service:app
entrypoint:
- /var/www/html/custom_apps/notify_push/bin/x86_64/notify_push
- - /var/www/html/config/config.php
- networks:
- - default
volumes:
- {{ base_volume_path }}/nextcloud/nextcloud:/var/www/html
- - {{ base_volume_path }}/nextcloud/nextcloud_config:/var/www/html/config
- - {{ base_volume_path }}/nextcloud/nextcloud_data:/var/www/html/data
db:
image: postgres:16-alpine
@@ -65,7 +74,7 @@ services:
- {{ base_volume_path }}/nextcloud/db:/var/lib/postgresql/data
redis:
- image: redis:7-alpine
+ image: redis:alpine
container_name: nextcloud_redis
restart: unless-stopped
env_file:
@@ -76,20 +85,3 @@ services:
- sh
- -c
- redis-server --requirepass $$REDIS_PASSWORD
-
- web:
- image: nginx:1.23-alpine
- container_name: nextcloud_web
- labels:
- - {{ helpers.traefik_labels('nc') | indent(6) }}
- restart: unless-stopped
- links:
- - app
- networks:
- - traefik_traefik
- - default
- volumes:
- - ./nginx.conf:/etc/nginx/nginx.conf:ro
- - {{ base_volume_path }}/nextcloud/nextcloud:/var/www/html
- - {{ base_volume_path }}/nextcloud/nextcloud_config:/var/www/html/config
- - {{ base_volume_path }}/nextcloud/nextcloud_data:/var/www/html/data
diff --git a/roles/alpina/templates/apps/nextcloud/nginx.conf.j2 b/roles/alpina/templates/apps/nextcloud/nginx.conf.j2
deleted file mode 100644
index 75deb05..0000000
--- a/roles/alpina/templates/apps/nextcloud/nginx.conf.j2
+++ /dev/null
@@ -1,182 +0,0 @@
-# https://github.com/nextcloud/docker/blob/master/.examples/docker-compose/with-nginx-proxy/postgres/fpm/web/nginx.conf
-
-worker_processes auto;
-
-error_log /var/log/nginx/error.log warn;
-pid /var/run/nginx.pid;
-
-
-events {
- worker_connections 1024;
-}
-
-
-http {
- include /etc/nginx/mime.types;
- default_type application/octet-stream;
-
- log_format main '$remote_addr - $remote_user [$time_local] "$request" '
- '$status $body_bytes_sent "$http_referer" '
- '"$http_user_agent" "$http_x_forwarded_for"';
-
- access_log /var/log/nginx/access.log main;
-
- sendfile on;
- #tcp_nopush on;
-
- # Prevent nginx HTTP Server Detection
- server_tokens off;
-
- keepalive_timeout 65;
-
- upstream php-handler {
- server app:9000;
- }
-
- server {
- listen 80;
-
- # HSTS settings
- # WARNING: Only add the preload option once you read about
- # the consequences in https://hstspreload.org/. This option
- # will add the domain to a hardcoded list that is shipped
- # in all major browsers and getting removed from this list
- # could take several months.
- #add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;
-
- # set max upload size
- client_max_body_size 512M;
- fastcgi_buffers 64 4K;
-
- # Enable gzip but do not remove ETag headers
- gzip on;
- gzip_vary on;
- gzip_comp_level 4;
- gzip_min_length 256;
- gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
- gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
-
- # Pagespeed is not supported by Nextcloud, so if your server is built
- # with the `ngx_pagespeed` module, uncomment this line to disable it.
- #pagespeed off;
-
- # HTTP response headers borrowed from Nextcloud `.htaccess`
- 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;
-
- # Remove X-Powered-By, which is an information leak
- fastcgi_hide_header X-Powered-By;
-
- # Path to the root of your installation
- root /var/www/html;
-
- # Specify how to handle directories -- specifying `/index.php$request_uri`
- # here as the fallback means that Nginx always exhibits the desired behaviour
- # when a client requests a path that corresponds to a directory that exists
- # on the server. In particular, if that directory contains an index.php file,
- # that file is correctly served; if it doesn't, then the request is passed to
- # the front-end controller. This consistent behaviour means that we don't need
- # to specify custom rules for certain paths (e.g. images and other assets,
- # `/updater`, `/ocm-provider`, `/ocs-provider`), and thus
- # `try_files $uri $uri/ /index.php$request_uri`
- # always provides the desired behaviour.
- index index.php index.html /index.php$request_uri;
-
- # Rule borrowed from `.htaccess` to handle Microsoft DAV clients
- location = / {
- if ( $http_user_agent ~ ^DavClnt ) {
- return 302 /remote.php/webdav/$is_args$args;
- }
- }
-
- location = /robots.txt {
- allow all;
- log_not_found off;
- access_log off;
- }
-
- # Make a regex exception for `/.well-known` so that clients can still
- # access it despite the existence of the regex rule
- # `location ~ /(\.|autotest|...)` which would otherwise handle requests
- # for `/.well-known`.
- location ^~ /.well-known {
- # The rules in this block are an adaptation of the rules
- # in `.htaccess` that concern `/.well-known`.
-
- location = /.well-known/carddav { return 301 /remote.php/dav/; }
- location = /.well-known/caldav { return 301 /remote.php/dav/; }
-
- location /.well-known/acme-challenge { try_files $uri $uri/ =404; }
- location /.well-known/pki-validation { try_files $uri $uri/ =404; }
-
- # Let Nextcloud's API for `/.well-known` URIs handle all other
- # requests by passing them to the front-end controller.
- return 301 /index.php$request_uri;
- }
-
- # Rules borrowed from `.htaccess` to hide certain paths from clients
- location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/) { return 404; }
- location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) { return 404; }
-
- # Ensure this block, which passes PHP files to the PHP process, is above the blocks
- # which handle static assets (as seen below). If this block is not declared first,
- # then Nginx will encounter an infinite rewriting loop when it prepends `/index.php`
- # to the URI, resulting in a HTTP 500 error response.
- location ~ \.php(?:$|/) {
- # Required for legacy support
- rewrite ^/(?!index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+|.+\/richdocumentscode\/proxy) /index.php$request_uri;
-
- 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; # Avoid sending the security headers twice
- fastcgi_param front_controller_active true; # Enable pretty urls
- fastcgi_pass php-handler;
-
- fastcgi_intercept_errors on;
- fastcgi_request_buffering off;
- }
-
- location ~ \.(?:css|js|svg|gif)$ {
- try_files $uri /index.php$request_uri;
- expires 6M; # Cache-Control policy borrowed from `.htaccess`
- access_log off; # Optional: Don't log access to assets
- }
-
- location ~ \.woff2?$ {
- try_files $uri /index.php$request_uri;
- expires 7d; # Cache-Control policy borrowed from `.htaccess`
- access_log off; # Optional: Don't log access to assets
- }
-
- # Rule borrowed from `.htaccess`
- location /remote {
- return 301 /remote.php$request_uri;
- }
-
- location / {
- try_files $uri $uri/ /index.php$request_uri;
- }
-
- location ^~ /push/ {
- proxy_pass http://notify_push:7867/;
- proxy_http_version 1.1;
- proxy_set_header Upgrade $http_upgrade;
- proxy_set_header Connection "Upgrade";
- proxy_set_header Host $host;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- }
- }
-}