stacks env
This commit is contained in:
167
nextcloud/docker-compose.yml
Normal file
167
nextcloud/docker-compose.yml
Normal file
@@ -0,0 +1,167 @@
|
|||||||
|
services:
|
||||||
|
nextcloud-db:
|
||||||
|
image: mariadb:lts
|
||||||
|
container_name: nextcloud-db
|
||||||
|
restart: unless-stopped
|
||||||
|
command: >
|
||||||
|
--transaction-isolation=READ-COMMITTED
|
||||||
|
--binlog-format=ROW
|
||||||
|
--character-set-server=utf8mb4
|
||||||
|
--collation-server=utf8mb4_general_ci
|
||||||
|
environment:
|
||||||
|
TZ: ${TZ}
|
||||||
|
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
|
||||||
|
MYSQL_DATABASE: ${MYSQL_DATABASE}
|
||||||
|
MYSQL_USER: ${MYSQL_USER}
|
||||||
|
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
|
||||||
|
volumes:
|
||||||
|
- /opt/nextcloud/db:/var/lib/mysql:Z
|
||||||
|
networks:
|
||||||
|
- nextcloud_internal
|
||||||
|
|
||||||
|
nextcloud-redis:
|
||||||
|
image: redis:7-alpine
|
||||||
|
container_name: nextcloud-redis
|
||||||
|
restart: unless-stopped
|
||||||
|
command: redis-server --save 60 1 --loglevel warning
|
||||||
|
environment:
|
||||||
|
TZ: ${TZ}
|
||||||
|
volumes:
|
||||||
|
- /opt/nextcloud/redis:/data:Z
|
||||||
|
networks:
|
||||||
|
- nextcloud_internal
|
||||||
|
|
||||||
|
nextcloud:
|
||||||
|
image: nextcloud:33-apache
|
||||||
|
container_name: nextcloud
|
||||||
|
restart: unless-stopped
|
||||||
|
depends_on:
|
||||||
|
- nextcloud-db
|
||||||
|
- nextcloud-redis
|
||||||
|
environment:
|
||||||
|
TZ: ${TZ}
|
||||||
|
MYSQL_HOST: nextcloud-db
|
||||||
|
MYSQL_DATABASE: ${MYSQL_DATABASE}
|
||||||
|
MYSQL_USER: ${MYSQL_USER}
|
||||||
|
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
|
||||||
|
REDIS_HOST: nextcloud-redis
|
||||||
|
|
||||||
|
NEXTCLOUD_ADMIN_USER: ${NEXTCLOUD_ADMIN_USER}
|
||||||
|
NEXTCLOUD_ADMIN_PASSWORD: ${NEXTCLOUD_ADMIN_PASSWORD}
|
||||||
|
NEXTCLOUD_TRUSTED_DOMAINS: ${NC_DOMAIN} nextcloud localhost
|
||||||
|
|
||||||
|
TRUSTED_PROXIES: ${TRUSTED_PROXIES}
|
||||||
|
OVERWRITEHOST: ${NC_DOMAIN}
|
||||||
|
OVERWRITEPROTOCOL: https
|
||||||
|
OVERWRITECLIURL: https://${NC_DOMAIN}
|
||||||
|
|
||||||
|
PHP_MEMORY_LIMIT: 2048M
|
||||||
|
PHP_UPLOAD_LIMIT: 16G
|
||||||
|
volumes:
|
||||||
|
- /opt/nextcloud/html:/var/www/html:Z
|
||||||
|
- /opt/nextcloud/config:/var/www/html/config:Z
|
||||||
|
- /opt/nextcloud/data:/var/www/html/data:Z
|
||||||
|
- /opt/nextcloud/custom_apps:/var/www/html/custom_apps:Z
|
||||||
|
- /opt/nextcloud/themes:/var/www/html/themes:Z
|
||||||
|
|
||||||
|
# Opcional: exponer archivo final de Paperless en Nextcloud como solo lectura
|
||||||
|
- /opt/paperless/media:/mnt/paperless-media:ro,Z
|
||||||
|
networks:
|
||||||
|
- nextcloud_internal
|
||||||
|
- proxy
|
||||||
|
labels:
|
||||||
|
- traefik.enable=true
|
||||||
|
- traefik.docker.network=proxy
|
||||||
|
|
||||||
|
- traefik.http.routers.nextcloud.rule=Host(`${NC_DOMAIN}`)
|
||||||
|
- traefik.http.routers.nextcloud.entrypoints=websecure
|
||||||
|
- traefik.http.routers.nextcloud.tls=true
|
||||||
|
- traefik.http.routers.nextcloud.tls.certresolver=${TRAEFIK_CERTRESOLVER}
|
||||||
|
- traefik.http.routers.nextcloud.middlewares=nc-dav,nc-secure-headers
|
||||||
|
|
||||||
|
- traefik.http.middlewares.nc-dav.redirectregex.permanent=true
|
||||||
|
- traefik.http.middlewares.nc-dav.redirectregex.regex=https://(.*)/.well-known/(?:card|cal)dav
|
||||||
|
- traefik.http.middlewares.nc-dav.redirectregex.replacement=https://$${1}/remote.php/dav
|
||||||
|
|
||||||
|
- traefik.http.middlewares.nc-secure-headers.headers.stsSeconds=31536000
|
||||||
|
- traefik.http.middlewares.nc-secure-headers.headers.stsIncludeSubdomains=true
|
||||||
|
- traefik.http.middlewares.nc-secure-headers.headers.stsPreload=true
|
||||||
|
- traefik.http.middlewares.nc-secure-headers.headers.contentTypeNosniff=true
|
||||||
|
- traefik.http.middlewares.nc-secure-headers.headers.browserXssFilter=true
|
||||||
|
|
||||||
|
- traefik.http.services.nextcloud.loadbalancer.server.port=80
|
||||||
|
|
||||||
|
nextcloud-cron:
|
||||||
|
image: nextcloud:33-apache
|
||||||
|
container_name: nextcloud-cron
|
||||||
|
restart: unless-stopped
|
||||||
|
depends_on:
|
||||||
|
- nextcloud
|
||||||
|
entrypoint: /cron.sh
|
||||||
|
environment:
|
||||||
|
TZ: ${TZ}
|
||||||
|
MYSQL_HOST: nextcloud-db
|
||||||
|
MYSQL_DATABASE: ${MYSQL_DATABASE}
|
||||||
|
MYSQL_USER: ${MYSQL_USER}
|
||||||
|
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
|
||||||
|
REDIS_HOST: nextcloud-redis
|
||||||
|
volumes:
|
||||||
|
- /opt/nextcloud/html:/var/www/html:Z
|
||||||
|
- /opt/nextcloud/config:/var/www/html/config:Z
|
||||||
|
- /opt/nextcloud/data:/var/www/html/data:Z
|
||||||
|
- /opt/nextcloud/custom_apps:/var/www/html/custom_apps:Z
|
||||||
|
- /opt/nextcloud/themes:/var/www/html/themes:Z
|
||||||
|
|
||||||
|
# Opcional: exponer archivo final de Paperless en Nextcloud como solo lectura
|
||||||
|
- /opt/paperless/media:/mnt/paperless-media:ro,Z
|
||||||
|
networks:
|
||||||
|
- nextcloud_internal
|
||||||
|
|
||||||
|
onlyoffice-documentserver:
|
||||||
|
image: onlyoffice/documentserver:9.3.1
|
||||||
|
container_name: onlyoffice-documentserver
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
TZ: ${TZ}
|
||||||
|
JWT_ENABLED: "true"
|
||||||
|
JWT_SECRET: ${OO_JWT_SECRET}
|
||||||
|
JWT_HEADER: Authorization
|
||||||
|
SECURE_LINK_SECRET: ${OO_SECURE_LINK_SECRET}
|
||||||
|
ALLOW_PRIVATE_IP_ADDRESS: "true"
|
||||||
|
volumes:
|
||||||
|
- /opt/onlyoffice/logs:/var/log/onlyoffice:Z
|
||||||
|
- /opt/onlyoffice/data:/var/www/onlyoffice/Data:Z
|
||||||
|
- /opt/onlyoffice/lib:/var/lib/onlyoffice:Z
|
||||||
|
- /opt/onlyoffice/postgresql:/var/lib/postgresql:Z
|
||||||
|
#- /opt/onlyoffice/plugins:/var/www/onlyoffice/documentserver/sdkjs-plugins:Z
|
||||||
|
networks:
|
||||||
|
- nextcloud_internal
|
||||||
|
- proxy
|
||||||
|
labels:
|
||||||
|
- traefik.enable=true
|
||||||
|
- traefik.docker.network=proxy
|
||||||
|
|
||||||
|
- traefik.http.routers.onlyoffice.rule=Host(`${OO_DOMAIN}`)
|
||||||
|
- traefik.http.routers.onlyoffice.entrypoints=websecure
|
||||||
|
- traefik.http.routers.onlyoffice.tls=true
|
||||||
|
- traefik.http.routers.onlyoffice.tls.certresolver=${TRAEFIK_CERTRESOLVER}
|
||||||
|
- traefik.http.routers.onlyoffice.middlewares=oo-secure-headers,oo-forwarded
|
||||||
|
|
||||||
|
- traefik.http.middlewares.oo-secure-headers.headers.stsSeconds=31536000
|
||||||
|
- traefik.http.middlewares.oo-secure-headers.headers.stsIncludeSubdomains=true
|
||||||
|
- traefik.http.middlewares.oo-secure-headers.headers.stsPreload=true
|
||||||
|
- traefik.http.middlewares.oo-secure-headers.headers.contentTypeNosniff=true
|
||||||
|
|
||||||
|
- traefik.http.middlewares.oo-forwarded.headers.customRequestHeaders.X-Forwarded-Proto=https
|
||||||
|
- traefik.http.middlewares.oo-forwarded.headers.customRequestHeaders.X-Forwarded-Host=${OO_DOMAIN}
|
||||||
|
- traefik.http.middlewares.oo-forwarded.headers.customRequestHeaders.X-Forwarded-Port=443
|
||||||
|
- traefik.http.middlewares.oo-forwarded.headers.customRequestHeaders.X-Forwarded-Ssl=on
|
||||||
|
|
||||||
|
- traefik.http.services.onlyoffice.loadbalancer.server.port=80
|
||||||
|
|
||||||
|
networks:
|
||||||
|
nextcloud_internal:
|
||||||
|
driver: bridge
|
||||||
|
|
||||||
|
proxy:
|
||||||
|
external: true
|
||||||
13
nextcloud/stack.env
Normal file
13
nextcloud/stack.env
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
TZ=Europe/Madrid
|
||||||
|
NC_DOMAIN=nextcloud.example.com
|
||||||
|
OO_DOMAIN=onlyoffice.example.com
|
||||||
|
TRAEFIK_CERTRESOLVER=letsencrypt
|
||||||
|
TRUSTED_PROXIES=10.0.0.0/8 172.16.0.0/12 192.168.0.0/16
|
||||||
|
MYSQL_ROOT_PASSWORD=change_me_mysql_root_password_long_and_secure
|
||||||
|
MYSQL_DATABASE=nextcloud
|
||||||
|
MYSQL_USER=nextcloud
|
||||||
|
MYSQL_PASSWORD=change_me_nextcloud_db_password_long_and_secure
|
||||||
|
NEXTCLOUD_ADMIN_USER=admin
|
||||||
|
NEXTCLOUD_ADMIN_PASSWORD=change_me_nextcloud_admin_password_long_and_secure
|
||||||
|
OO_JWT_SECRET=change_me_onlyoffice_jwt_secret_long_and_random
|
||||||
|
OO_SECURE_LINK_SECRET=change_me_onlyoffice_secure_link_secret_long_and_random
|
||||||
167
paperless/docker-compose.yml
Normal file
167
paperless/docker-compose.yml
Normal file
@@ -0,0 +1,167 @@
|
|||||||
|
services:
|
||||||
|
paperless-db:
|
||||||
|
image: postgres:18
|
||||||
|
container_name: paperless-db
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
TZ: ${TZ}
|
||||||
|
POSTGRES_DB: ${PAPERLESS_DBNAME}
|
||||||
|
POSTGRES_USER: ${PAPERLESS_DBUSER}
|
||||||
|
POSTGRES_PASSWORD: ${PAPERLESS_DBPASS}
|
||||||
|
volumes:
|
||||||
|
- /opt/paperless/pgdata:/var/lib/postgresql:Z
|
||||||
|
networks:
|
||||||
|
- paperless_internal
|
||||||
|
|
||||||
|
paperless-redis:
|
||||||
|
image: redis:8
|
||||||
|
container_name: paperless-redis
|
||||||
|
restart: unless-stopped
|
||||||
|
volumes:
|
||||||
|
- /opt/paperless/redis:/data:Z
|
||||||
|
networks:
|
||||||
|
- paperless_internal
|
||||||
|
|
||||||
|
paperless-gotenberg:
|
||||||
|
image: gotenberg/gotenberg:8.27
|
||||||
|
container_name: paperless-gotenberg
|
||||||
|
restart: unless-stopped
|
||||||
|
command:
|
||||||
|
- "gotenberg"
|
||||||
|
- "--chromium-disable-javascript=true"
|
||||||
|
- "--chromium-allow-list=file:///tmp/.*"
|
||||||
|
networks:
|
||||||
|
- paperless_internal
|
||||||
|
|
||||||
|
paperless-tika:
|
||||||
|
image: apache/tika:latest
|
||||||
|
container_name: paperless-tika
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- paperless_internal
|
||||||
|
|
||||||
|
paperless:
|
||||||
|
image: ghcr.io/paperless-ngx/paperless-ngx:latest
|
||||||
|
container_name: paperless
|
||||||
|
restart: unless-stopped
|
||||||
|
depends_on:
|
||||||
|
- paperless-db
|
||||||
|
- paperless-redis
|
||||||
|
- paperless-gotenberg
|
||||||
|
- paperless-tika
|
||||||
|
environment:
|
||||||
|
TZ: ${TZ}
|
||||||
|
|
||||||
|
PAPERLESS_REDIS: redis://paperless-redis:6379
|
||||||
|
PAPERLESS_DBHOST: paperless-db
|
||||||
|
PAPERLESS_DBENGINE: postgresql
|
||||||
|
PAPERLESS_DBNAME: ${PAPERLESS_DBNAME}
|
||||||
|
PAPERLESS_DBUSER: ${PAPERLESS_DBUSER}
|
||||||
|
PAPERLESS_DBPASS: ${PAPERLESS_DBPASS}
|
||||||
|
|
||||||
|
PAPERLESS_URL: https://${PAPERLESS_DOMAIN}
|
||||||
|
PAPERLESS_SECRET_KEY: ${PAPERLESS_SECRET_KEY}
|
||||||
|
PAPERLESS_ALLOWED_HOSTS: ${PAPERLESS_ALLOWED_HOSTS}
|
||||||
|
PAPERLESS_CSRF_TRUSTED_ORIGINS: https://${PAPERLESS_DOMAIN}
|
||||||
|
PAPERLESS_TRUSTED_PROXIES: ${TRUSTED_PROXIES}
|
||||||
|
|
||||||
|
PAPERLESS_ADMIN_USER: ${PAPERLESS_ADMIN_USER}
|
||||||
|
PAPERLESS_ADMIN_PASSWORD: ${PAPERLESS_ADMIN_PASSWORD}
|
||||||
|
PAPERLESS_ADMIN_MAIL: ${PAPERLESS_ADMIN_MAIL}
|
||||||
|
|
||||||
|
PAPERLESS_TIKA_ENABLED: 1
|
||||||
|
PAPERLESS_TIKA_ENDPOINT: http://paperless-tika:9998
|
||||||
|
PAPERLESS_TIKA_GOTENBERG_ENDPOINT: http://paperless-gotenberg:3000
|
||||||
|
|
||||||
|
# Más robusto cuando los ficheros llegan por sync/mount y no por inotify puro
|
||||||
|
PAPERLESS_CONSUMER_POLLING: ${PAPERLESS_CONSUMER_POLLING}
|
||||||
|
volumes:
|
||||||
|
- /opt/paperless/data:/usr/src/paperless/data:Z
|
||||||
|
- /opt/paperless/media:/usr/src/paperless/media:Z
|
||||||
|
- /opt/paperless/export:/usr/src/paperless/export:Z
|
||||||
|
- /opt/paperless/consume:/usr/src/paperless/consume:Z
|
||||||
|
networks:
|
||||||
|
- paperless_internal
|
||||||
|
- proxy
|
||||||
|
labels:
|
||||||
|
- traefik.enable=true
|
||||||
|
- traefik.docker.network=proxy
|
||||||
|
|
||||||
|
- traefik.http.routers.paperless.rule=Host(`${PAPERLESS_DOMAIN}`)
|
||||||
|
- traefik.http.routers.paperless.entrypoints=websecure
|
||||||
|
- traefik.http.routers.paperless.tls=true
|
||||||
|
- traefik.http.routers.paperless.tls.certresolver=${TRAEFIK_CERTRESOLVER}
|
||||||
|
- traefik.http.routers.paperless.middlewares=paperless-secure-headers
|
||||||
|
|
||||||
|
- traefik.http.middlewares.paperless-secure-headers.headers.stsSeconds=31536000
|
||||||
|
- traefik.http.middlewares.paperless-secure-headers.headers.stsIncludeSubdomains=true
|
||||||
|
- traefik.http.middlewares.paperless-secure-headers.headers.stsPreload=true
|
||||||
|
- traefik.http.middlewares.paperless-secure-headers.headers.contentTypeNosniff=true
|
||||||
|
- traefik.http.middlewares.paperless-secure-headers.headers.browserXssFilter=true
|
||||||
|
|
||||||
|
- traefik.http.services.paperless.loadbalancer.server.port=8000
|
||||||
|
|
||||||
|
paperless-ai:
|
||||||
|
image: clusterzx/paperless-ai:latest
|
||||||
|
container_name: paperless-ai
|
||||||
|
restart: unless-stopped
|
||||||
|
depends_on:
|
||||||
|
- paperless
|
||||||
|
environment:
|
||||||
|
TZ: ${TZ}
|
||||||
|
volumes:
|
||||||
|
- /opt/paperless-ai/data:/app/data:Z
|
||||||
|
networks:
|
||||||
|
- paperless_internal
|
||||||
|
- proxy
|
||||||
|
labels:
|
||||||
|
- traefik.enable=true
|
||||||
|
- traefik.docker.network=proxy
|
||||||
|
|
||||||
|
- traefik.http.routers.paperless-ai.rule=Host(`${PAPERLESS_AI_DOMAIN}`)
|
||||||
|
- traefik.http.routers.paperless-ai.entrypoints=websecure
|
||||||
|
- traefik.http.routers.paperless-ai.tls=true
|
||||||
|
- traefik.http.routers.paperless-ai.tls.certresolver=${TRAEFIK_CERTRESOLVER}
|
||||||
|
- traefik.http.routers.paperless-ai.middlewares=paperless-ai-secure-headers
|
||||||
|
|
||||||
|
- traefik.http.middlewares.paperless-ai-secure-headers.headers.stsSeconds=31536000
|
||||||
|
- traefik.http.middlewares.paperless-ai-secure-headers.headers.stsIncludeSubdomains=true
|
||||||
|
- traefik.http.middlewares.paperless-ai-secure-headers.headers.stsPreload=true
|
||||||
|
- traefik.http.middlewares.paperless-ai-secure-headers.headers.contentTypeNosniff=true
|
||||||
|
|
||||||
|
- traefik.http.services.paperless-ai.loadbalancer.server.port=3000
|
||||||
|
|
||||||
|
# Sync unidireccional: Nextcloud/Paperless-Inbox -> paperless/consume
|
||||||
|
paperless-inbox-sync:
|
||||||
|
image: rclone/rclone:latest
|
||||||
|
container_name: paperless-inbox-sync
|
||||||
|
restart: unless-stopped
|
||||||
|
depends_on:
|
||||||
|
- paperless
|
||||||
|
entrypoint:
|
||||||
|
- /bin/sh
|
||||||
|
- /rclone-sync.sh
|
||||||
|
environment:
|
||||||
|
TZ: ${TZ}
|
||||||
|
|
||||||
|
RCLONE_CONFIG_NC_TYPE: webdav
|
||||||
|
RCLONE_CONFIG_NC_URL: https://${NC_DOMAIN}/remote.php/dav/files/${NC_WEBDAV_USER}
|
||||||
|
RCLONE_CONFIG_NC_VENDOR: nextcloud
|
||||||
|
RCLONE_CONFIG_NC_USER: ${NC_WEBDAV_USER}
|
||||||
|
RCLONE_CONFIG_NC_PASS: ${NC_WEBDAV_PASS}
|
||||||
|
|
||||||
|
RCLONE_SYNC_INTERVAL: ${RCLONE_SYNC_INTERVAL}
|
||||||
|
PAPERLESS_INBOX_DIR: ${PAPERLESS_INBOX_DIR}
|
||||||
|
volumes:
|
||||||
|
- /opt/paperless/consume:/consume:Z
|
||||||
|
- /opt/rclone:/config/rclone:Z
|
||||||
|
- /opt/paperless/rclone-sync.sh:/rclone-sync.sh:ro,Z
|
||||||
|
networks:
|
||||||
|
- paperless_internal
|
||||||
|
|
||||||
|
networks:
|
||||||
|
paperless_internal:
|
||||||
|
driver: bridge
|
||||||
|
|
||||||
|
proxy:
|
||||||
|
external: true
|
||||||
19
paperless/stack.env
Normal file
19
paperless/stack.env
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
TZ=Europe/Madrid
|
||||||
|
NC_DOMAIN=nextcloud.example.com
|
||||||
|
PAPERLESS_DOMAIN=paperless.example.com
|
||||||
|
PAPERLESS_AI_DOMAIN=paperless-ai.example.com
|
||||||
|
TRAEFIK_CERTRESOLVER=letsencrypt
|
||||||
|
TRUSTED_PROXIES=10.0.0.0/8 172.16.0.0/12 192.168.0.0/16
|
||||||
|
PAPERLESS_DBNAME=paperless
|
||||||
|
PAPERLESS_DBUSER=paperless
|
||||||
|
PAPERLESS_DBPASS=change_me_paperless_db_password_long_and_secure
|
||||||
|
PAPERLESS_SECRET_KEY=change_me_paperless_secret_key_long_and_random_string
|
||||||
|
PAPERLESS_ADMIN_USER=admin
|
||||||
|
PAPERLESS_ADMIN_PASSWORD=change_me_paperless_admin_password_long_and_secure
|
||||||
|
PAPERLESS_ADMIN_MAIL=admin@example.com
|
||||||
|
PAPERLESS_CONSUMER_POLLING=60
|
||||||
|
PAPERLESS_ALLOWED_HOSTS=paperless.example.com,paperless,localhost
|
||||||
|
NC_WEBDAV_USER=paperless
|
||||||
|
NC_WEBDAV_PASS=change_me_nextcloud_webdav_password_long_and_random
|
||||||
|
PAPERLESS_INBOX_DIR=Paperless-Inbox
|
||||||
|
RCLONE_SYNC_INTERVAL=60
|
||||||
Reference in New Issue
Block a user