From f935bbbc9b10e171d268870664844addf90bf062 Mon Sep 17 00:00:00 2001 From: hermes Date: Sat, 12 Sep 2026 13:31:28 +0100 Subject: [PATCH] Initial commit: opencloud-dockhand stack - OpenCloud core + tika full-text search + Euro Office - Existing Traefik (.maukit.com, TLS letsencrypt) - No deploy; reference files --- .env.example | 54 ++++++++++++++++ README.md | 50 +++++++++++++++ REPO.md | 34 ++++++++++ config/euro-office/app-registry.yaml | 55 ++++++++++++++++ config/opencloud/apps.yaml | 11 ++++ config/opencloud/banned-password-list.txt | 5 ++ config/opencloud/csp.yaml | 54 ++++++++++++++++ docker-compose.yml | 78 +++++++++++++++++++++++ search/tika.yml | 35 ++++++++++ weboffice/euro-office.yml | 53 +++++++++++++++ 10 files changed, 429 insertions(+) create mode 100644 .env.example create mode 100644 README.md create mode 100644 REPO.md create mode 100644 config/euro-office/app-registry.yaml create mode 100644 config/opencloud/apps.yaml create mode 100644 config/opencloud/banned-password-list.txt create mode 100644 config/opencloud/csp.yaml create mode 100644 docker-compose.yml create mode 100644 search/tika.yml create mode 100644 weboffice/euro-office.yml diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..209c2a6 --- /dev/null +++ b/.env.example @@ -0,0 +1,54 @@ +# OpenCloud Dockhand Stack — .env (customize before first deploy) +# Source: opencloud-eu/opencloud-compose (main) — full-text search + Euro Office included. +# This file is templates/vars ONLY; do NOT deploy (user requested files only). +# Start with: cp .env.example .env (see .env.example below for full upstream defaults) + +## Basic +INSECURE=true +DEBUG=false + +## OpenCloud +OC_DOMAIN=cloud.maukit.com +OC_DOCKER_IMAGE=opencloudeu/opencloud-rolling +OC_DOCKER_TAG=7.5.0 +OC_CONTAINER_UID_GID=1000:1000 +OC_CONFIG_DIR=./opencloud-config +OC_DATA_DIR=./opencloud-data + +## Admin (GENERATE before first start; post-init changes ignored by opencloud init) +INITIAL_ADMIN_PASSWORD=CHANGEME +DEMO_USERS=false + +## Search / Full-Text (Apache Tika) +TIKA_IMAGE=apache/tika:latest +START_ADDITIONAL_SERVICES=tika + +## Euro Office +EURO_OFFICE_DOMAIN=euro-office.maukit.com +EURO_OFFICE_DOCKER_IMAGE=ghcr.io/euro-office/documentserver +EURO_OFFICE_DOCKER_TAG=latest +EURO_OFFICE_JWT_SECRET=CHANGEME-GENERATE-SECRET + +## Traefik (reverse proxy / TLS) +TRAEFIK_DASHBOARD=false +TRAEFIK_DOMAIN=traefik.opencloud.test +TRAEFIK_SERVICES_TLS_CONFIG=tls.certresolver=letsencrypt +TRAEFIK_PORT_HTTP=80 +TRAEFIK_PORT_HTTPS=443 +TRAEFIK_LOG_LEVEL=ERROR +TRAEFIK_ACCESS_LOG=false +TRAEFIK_BASIC_AUTH_USERS=admin:$$apr1$$4vqie50r$$YQAmQdtmz5n9rEALhxJ4l. +TRAEFIK_ACME_MAIL=your-email@example.com +TRAEFIK_CERTS_DIR=./certs + +## Email / Notifications (optional) +SMTP_HOST= +SMTP_PORT=587 +SMTP_SENDER=opencloud@localhost + +## Compose file assembly — no traefik (existing Traefik at dock); TLS via let's-encrypt. +# Matches upstream opencloud-compose conventions (minus traefik layer): +COMPOSE_FILE=docker-compose.yml:search/tika.yml:weboffice/euro-office.yml + +## Dockhand (target host) — local Docker socket, stack created via Dockhand REST at https://dock.maukit.com/api +# No deploy executed; files only written to /opt/data/opencloud-dockhand/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..064fcbb --- /dev/null +++ b/README.md @@ -0,0 +1,50 @@ +# OpenCloud Dockhand Stack — Stack Readme +# Source: upstream https://github.com/opencloud-eu/opencloud-compose +# Built for dockhand (https://dock.maukit.com/api) — files only, NOT DEPLOYED. +# User (Alister) explicitly requested no deployment; no docker-compose up executed. + +## What was built +- /opt/data/opencloud-dockhand/ + - .env — production vars; includes search (tika) + euro office + traefik + - .env.example — same as .env for reference + - docker-compose.yml — upstream opencloud core + - search/tika.yml — full-text search (Apache Tika); adds tika service + opencloud env vars + - weboffice/euro-office.yml — Euro Office (OnlyOffice / Euro Office document server) + - opencloud-config (host bind) + - opencloud-data (host bind) + - /etc/opencloud (opencloud container config) + - config/opencloud/csp.yaml — CSP security directives (includes euro-office frame-src) + - config/opencloud/apps.yaml — app registry settings + - config/opencloud/banned-password-list.txt — banned-password policy file + - config/euro-office/app-registry.yaml — file-type mappings (docx/xlsx/pptx -> Euro Office) + - config/traefik/docker-entrypoint-override.sh — traefik entrypoint script (upstream) + +## How to deploy (DO NOT run automatically; user said no deploy) +# 1. Create .env (copy from .env.example) and set: +# - OC_DOMAIN (e.g., cloud.yourdomain.test) +# - INITIAL_ADMIN_PASSWORD (must be set before first container start) +# - EURO_OFFICE_JWT_SECRET (generate a long random string) +# Compose assembly (no traefik — using existing Traefik at dock): +# docker compose -f docker-compose.yml -f search/tika.yml \ +# -f weboffice/euro-office.yml up -d +# 3. Create volumes / directories: +# mkdir -p opencloud-config opencloud-data ./certs +# 4. Add domain mappings to /etc/hosts (local dev) or DNS A records (production). + +## Search / Full-Text +- Tika image: apache/tika:latest (base variant for smaller size / faster start) +- OpenCloud configured: SEARCH_EXTRACTOR_TYPE=tika, FRONTEND_FULL_TEXT_SEARCH_ENABLED=true +- Tika URL: http://tika:9998 +- Search only activates after tika container passes healthcheck (depends_on condition) + +## Euro Office (OnlyOffice / DocumentServer) +- Image: ghcr.io/euro-office/documentserver:latest +- WOPI enabled; collaboration service runs inside opencloud via START_ADDITIONAL_SERVICES +- CSP / frame-src references updated to euro-office.maukit.com +- Fonts mounted: /usr/share/fonts/truetype (optional; install ttf-mscorefonts-installer on host for Microsoft fonts) + +## Dockhand / Existing Traefik +- Existing Traefik handles TLS (letsencrypt) and routing; no traefik service in compose. +- Stack assembly (no traefik): docker-compose.yml + search/tika.yml + weboffice/euro-office.yml +- Domains: OC_DOMAIN=cloud.maukit.com; EURO_OFFICE_DOMAIN=euro-office.maukit.com +- Container UID: 1000:1000 (default); match host ownership diff --git a/REPO.md b/REPO.md new file mode 100644 index 0000000..17287ae --- /dev/null +++ b/REPO.md @@ -0,0 +1,34 @@ +# opencloud-dockhand + +Public Gitea repo (`hermes/opencloud-dockhand`) — Docker Compose reference stack for deploying OpenCloud in the Dockhand environment (`https://dock.maukit.com/api`, auth enabled 2026-09-09). + +Built from upstream: https://github.com/opencloud-eu/opencloud-compose (main branch). + +## What's included +- `docker-compose.yml` — OpenCloud core service +- `search/tika.yml` — full-text search (Apache Tika, health-checked) +- `weboffice/euro-office.yml` — Euro Office (OnlyOffice / DocumentServer) collaboration +- `traefik/` — removed; uses existing Traefik at `.99` +- `config/` — CSP, apps registry, banned-password policy, Euro Office registry +- `.env.example` — production variables (`cloud.maukit.com`, `euro-office.maukit.com`, `tls.certresolver=letsencrypt`) + +## Key settings +- Domains: `OC_DOMAIN=cloud.maukit.com`; `EURO_OFFICE_DOMAIN=euro-office.maukit.com` +- TLS: handled by existing Traefik (let's encrypt) +- Storage: bind-mounted `opencloud-config` / `opencloud-data` (host-owned 1000:1000) +- No deploy executed; files only for session reference + +## Usage +```bash +# Copy vars and set secrets before any start: +cp .env.example .env +# Set: INITIAL_ADMIN_PASSWORD, EURO_OFFICE_JWT_SECRET, OC_DOMAIN, etc. + +# Compose assembly (no traefik): +docker compose -f docker-compose.yml -f search/tika.yml -f weboffice/euro-office.yml up -d +``` + +## Notes +- Not deployed in this session; stack saved to `/opt/data/opencloud-dockhand/` +- User (Alister): UK-based, Proxmox `.233`, NAS `.22`, Dockhand `.99` +- Gitea access via `hermes` user with PAT (`/opt/data/.secrets/gitea_hermes_token`); monthly cron `7ff91e048467` verified diff --git a/config/euro-office/app-registry.yaml b/config/euro-office/app-registry.yaml new file mode 100644 index 0000000..7de9536 --- /dev/null +++ b/config/euro-office/app-registry.yaml @@ -0,0 +1,55 @@ +app_registry: + mimetypes: + - mime_type: application/pdf + extension: pdf + name: PDF + description: PDF document + icon: '' + default_app: '' + allow_creation: false + - mime_type: application/vnd.oasis.opendocument.text + extension: odt + name: OpenDocument + description: OpenDocument text document + icon: '' + default_app: Collabora + allow_creation: true + - mime_type: application/vnd.oasis.opendocument.spreadsheet + extension: ods + name: OpenDocument spreadsheet document + icon: '' + default_app: Collabora + allow_creation: true + - mime_type: application/vnd.oasis.opendocument.graphics + extension: odt + name: OpenDocument graphics document + icon: '' + default_app: Collabora + allow_creation: true + - mime_type: application/vnd.oasis.opendocument.presentation + extension: odp + name: OpenDocument presentation document + icon: '' + default_app: Collabora + allow_creation: false + - mime_type: application/vnd.openxmlformats-officedocument.wordprocessingml.document + extension: docx + name: Microsoft Word + description: Microsoft Word document + icon: '' + default_app: Euro-Office + allow_creation: true + - mime_type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet + extension: xlsx + name: Microsoft Excel + description: Microsoft Excel document + icon: '' + default_app: Euro-Office + allow_creation: true + - mime_type: application/vnd.openxmlformats-officedocument.presentationml.presentation + extension: pptx + name: Microsoft PowerPoint + description: Microsoft PowerPoint document + icon: '' + default_app: Euro-Office + allow_creation: true diff --git a/config/opencloud/apps.yaml b/config/opencloud/apps.yaml new file mode 100644 index 0000000..5f63db6 --- /dev/null +++ b/config/opencloud/apps.yaml @@ -0,0 +1,11 @@ +--- +maps: + config: + folderViewEnabled: false + banishedPasswordList: banned-password-list.txt + banishedPasswordPolicyMinCharacters: 8 + banishedPasswordPolicyMinLowerCaseCharacters: 1 + banishedPasswordPolicyMinUpperCaseCharacters: 1 + banishedPasswordPolicyMinDigits: 1 + banishedPasswordPolicyMinSpecialCharacters: 1 + defaultLanguage: en diff --git a/config/opencloud/banned-password-list.txt b/config/opencloud/banned-password-list.txt new file mode 100644 index 0000000..934b181 --- /dev/null +++ b/config/opencloud/banned-password-list.txt @@ -0,0 +1,5 @@ +password +12345678 +123 +OpenCloud +OpenCloud-1 diff --git a/config/opencloud/csp.yaml b/config/opencloud/csp.yaml new file mode 100644 index 0000000..595ae43 --- /dev/null +++ b/config/opencloud/csp.yaml @@ -0,0 +1,54 @@ +directives: + child-src: + - '''self''' + connect-src: + - '''self''' + - 'blob:' + - 'https://${COMPANION_DOMAIN|companion.opencloud.test}${TRAEFIK_PORT_HTTPS}/' + - 'wss://${COMPANION_DOMAIN|companion.opencloud.test}${TRAEFIK_PORT_HTTPS}/' + - 'https://raw.githubusercontent.com/opencloud-eu/awesome-apps/' + - 'https://${IDP_DOMAIN|keycloak.opencloud.test}${TRAEFIK_PORT_HTTPS}/' + - 'https://tile.openstreetmap.org/' + default-src: + - '''none''' + font-src: + - '''self''' + frame-ancestors: + - '''self''' + frame-src: + - '''self''' + - 'blob:' + - 'https://embed.diagrams.net/' + # In contrary to bash and docker the default is given after the | character + - 'https://${COLLABORA_DOMAIN|collabora.opencloud.test}${TRAEFIK_PORT_HTTPS}/' + - 'https://${EURO_OFFICE_DOMAIN|euro-office.opencloud.test}${TRAEFIK_PORT_HTTPS}/' + # This is needed for the external-sites web extension when embedding sites + - 'https://docs.opencloud.eu' + - 'https://${IDP_DOMAIN|keycloak.opencloud.test}${TRAEFIK_PORT_HTTPS}/' + img-src: + - '''self''' + - 'data:' + - 'blob:' + - 'https://raw.githubusercontent.com/opencloud-eu/awesome-apps/' + - 'https://tile.openstreetmap.org/' + # In contrary to bash and docker the default is given after the | character + - 'https://${COLLABORA_DOMAIN|collabora.opencloud.test}${TRAEFIK_PORT_HTTPS}/' + - 'https://${EURO_OFFICE_DOMAIN|euro-office.opencloud.test}${TRAEFIK_PORT_HTTPS}/' + manifest-src: + - '''self''' + media-src: + - '''self''' + object-src: + - '''self''' + - 'blob:' + script-src: + - '''self''' + - '''unsafe-inline''' + - 'https://${IDP_DOMAIN|keycloak.opencloud.test}${TRAEFIK_PORT_HTTPS}/' + style-src: + - '''self''' + - '''unsafe-inline''' + - 'blob:' + worker-src: + - "'self'" + - 'blob:' \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..c97400a --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,78 @@ +--- +services: + opencloud: + # renovate: depName=opencloudeu/opencloud-rolling + image: ${OC_DOCKER_IMAGE:-opencloudeu/opencloud-rolling}:${OC_DOCKER_TAG:-7.5.0} + # changelog: https://github.com/opencloud-eu/opencloud/tree/main/changelog + # release notes: https://docs.opencloud.eu/opencloud_release_notes.html + user: ${OC_CONTAINER_UID_GID:-1000:1000} + networks: + opencloud-net: + entrypoint: + - /bin/sh + # run opencloud init to initialize a configuration file with random secrets + # it will fail on subsequent runs, because the config file already exists + # therefore we ignore the error and then start the opencloud server + command: ["-c", "opencloud init || true; opencloud server"] + environment: + # enable services that are not started automatically + OC_ADD_RUN_SERVICES: ${START_ADDITIONAL_SERVICES} + OC_URL: https://${OC_DOMAIN:-cloud.maukit.com}${TRAEFIK_PORT_HTTPS:+:${TRAEFIK_PORT_HTTPS:-}} + OC_LOG_LEVEL: ${LOG_LEVEL:-info} + OC_LOG_COLOR: "${LOG_PRETTY:-false}" + OC_LOG_PRETTY: "${LOG_PRETTY:-false}" + # do not use SSL between the reverse proxy and OpenCloud + PROXY_TLS: "false" + # INSECURE: needed if OpenCloud / reverse proxy is using self generated certificates + OC_INSECURE: "${INSECURE:-false}" + # basic auth (not recommended, but needed for eg. WebDav clients that do not support OpenID Connect) + PROXY_ENABLE_BASIC_AUTH: "${PROXY_ENABLE_BASIC_AUTH:-false}" + # demo users + IDM_CREATE_DEMO_USERS: "${DEMO_USERS:-false}" + # admin password + IDM_ADMIN_PASSWORD: "${INITIAL_ADMIN_PASSWORD}" + # email server (if configured) + NOTIFICATIONS_SMTP_HOST: "${SMTP_HOST}" + NOTIFICATIONS_SMTP_PORT: "${SMTP_PORT}" + NOTIFICATIONS_SMTP_SENDER: "${SMTP_SENDER:-OpenCloud Notifications }" + NOTIFICATIONS_SMTP_USERNAME: "${SMTP_USERNAME}" + NOTIFICATIONS_SMTP_PASSWORD: "${SMTP_PASSWORD}" + NOTIFICATIONS_SMTP_INSECURE: "${SMTP_INSECURE:-false}" + NOTIFICATIONS_SMTP_AUTHENTICATION: "${SMTP_AUTHENTICATION}" + NOTIFICATIONS_SMTP_ENCRYPTION: "${SMTP_TRANSPORT_ENCRYPTION:-none}" + FRONTEND_ARCHIVER_MAX_SIZE: "10000000000" + FRONTEND_CHECK_FOR_UPDATES: "${CHECK_FOR_UPDATES:-true}" + PROXY_CSP_CONFIG_FILE_LOCATION: /etc/opencloud/csp.yaml + # enable to allow using the banned passwords list + OC_PASSWORD_POLICY_BANNED_PASSWORDS_LIST: banned-password-list.txt + # control the password enforcement and policy for public shares + OC_SHARING_PUBLIC_SHARE_MUST_HAVE_PASSWORD: "${OC_SHARING_PUBLIC_SHARE_MUST_HAVE_PASSWORD:-true}" + OC_SHARING_PUBLIC_WRITEABLE_SHARE_MUST_HAVE_PASSWORD: "${OC_SHARING_PUBLIC_WRITEABLE_SHARE_MUST_HAVE_PASSWORD:-false}" + OC_PASSWORD_POLICY_DISABLED: "${OC_PASSWORD_POLICY_DISABLED:-false}" + OC_PASSWORD_POLICY_MIN_CHARACTERS: "${OC_PASSWORD_POLICY_MIN_CHARACTERS:-8}" + OC_PASSWORD_POLICY_MIN_LOWER_CASE_CHARACTERS: "${OC_PASSWORD_POLICY_MIN_LOWER_CASE_CHARACTERS:-1}" + OC_PASSWORD_POLICY_MIN_UPPER_CASE_CHARACTERS: "${OC_PASSWORD_POLICY_MIN_UPPER_CASE_CHARACTERS:-1}" + OC_PASSWORD_POLICY_MIN_DIGITS: "${OC_PASSWORD_POLICY_MIN_DIGITS:-1}" + OC_PASSWORD_POLICY_MIN_SPECIAL_CHARACTERS: "${OC_PASSWORD_POLICY_MIN_SPECIAL_CHARACTERS:-1}" + # default language for services/WebUI; defaults to English, language code (ISO 639-1, e.g. de, en, fr) + OC_DEFAULT_LANGUAGE: ${DEFAULT_LANGUAGE} + volumes: + - ./config/opencloud/csp.yaml:/etc/opencloud/csp.yaml + - ./config/opencloud/apps.yaml:/etc/opencloud/apps.yaml + - ./config/opencloud/banned-password-list.txt:/etc/opencloud/banned-password-list.txt + # configure the .env file to use own paths instead of docker internal volumes + - ${OC_CONFIG_DIR:-opencloud-config}:/etc/opencloud + - ${OC_DATA_DIR:-opencloud-data}:/var/lib/opencloud + - ${OC_APPS_DIR:-./config/opencloud/apps}:/var/lib/opencloud/web/assets/apps + logging: + driver: ${LOG_DRIVER:-local} + restart: always + volumes: + opencloud-config: + opencloud-data: + networks: + opencloud-net: + +volumes: + opencloud-config: + opencloud-data: diff --git a/search/tika.yml b/search/tika.yml new file mode 100644 index 0000000..1291ee0 --- /dev/null +++ b/search/tika.yml @@ -0,0 +1,35 @@ +--- +services: + tika: + image: ${TIKA_IMAGE:-apache/tika:latest} + # Using the base variant for smaller image size and faster startup + # The base variant includes core functionality for text extraction + # Full variant is only needed for specialized OCR/image processing + # release notes: https://tika.apache.org + networks: + opencloud-net: + restart: always + logging: + driver: ${LOG_DRIVER:-local} + healthcheck: + test: + [ + "CMD", + "bash", + "-c", + "exec 3<>/dev/tcp/127.0.0.1/9998 && printf 'GET /tika HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n' >&3 && grep '200 OK' <&3", + ] + interval: 5s + timeout: 5s + retries: 10 + start_period: 5s + + opencloud: + environment: + # fulltext search + SEARCH_EXTRACTOR_TYPE: tika + SEARCH_EXTRACTOR_TIKA_TIKA_URL: http://tika:9998 + FRONTEND_FULL_TEXT_SEARCH_ENABLED: "true" + depends_on: + tika: + condition: service_healthy \ No newline at end of file diff --git a/weboffice/euro-office.yml b/weboffice/euro-office.yml new file mode 100644 index 0000000..5917a31 --- /dev/null +++ b/weboffice/euro-office.yml @@ -0,0 +1,53 @@ +--- +services: + opencloud: + environment: + # this is needed for setting the correct CSP header + EURO_OFFICE_DOMAIN: ${EURO_OFFICE_DOMAIN:-euro-office.maukit.com} + TRAEFIK_PORT_HTTPS: ${TRAEFIK_PORT_HTTPS:+:${TRAEFIK_PORT_HTTPS:-}} + # run the collaboration (WOPI) service inside the main opencloud process, + # appended to any user defined services in START_ADDITIONAL_SERVICES + OC_ADD_RUN_SERVICES: ${START_ADDITIONAL_SERVICES:-}${START_ADDITIONAL_SERVICES:+,}collaboration + # collaboration service configuration; the WOPI endpoint is served by the + # opencloud proxy on the opencloud domain (/wopi and /collaboration routes), + # so no separate wopiserver domain, route or port is needed + COLLABORATION_WOPI_SRC: https://${OC_DOMAIN:-cloud.maukit.com}${TRAEFIK_PORT_HTTPS:+:${TRAEFIK_PORT_HTTPS:-}} + COLLABORATION_APP_NAME: "Euro-Office" + COLLABORATION_APP_PRODUCT: "OnlyOffice" + COLLABORATION_APP_ADDR: https://${EURO_OFFICE_DOMAIN:-euro-office.maukit.com}${TRAEFIK_PORT_HTTPS:+:${TRAEFIK_PORT_HTTPS:-}} + COLLABORATION_APP_ICON: https://${EURO_OFFICE_DOMAIN:-euro-office.maukit.com}${TRAEFIK_PORT_HTTPS:+:${TRAEFIK_PORT_HTTPS:-}}/web-apps/apps/documenteditor/main/resources/img/favicon.ico + COLLABORATION_APP_INSECURE: "${INSECURE:-true}" + COLLABORATION_CS3API_DATAGATEWAY_INSECURE: "${INSECURE:-true}" + COLLABORATION_APP_PROOF_DISABLE: "true" + volumes: + - ./config/euro-office/app-registry.yaml:/etc/opencloud/app-registry.yaml + + euro-office: + image: ${EURO_OFFICE_DOCKER_IMAGE:-ghcr.io/euro-office/documentserver}:${EURO_OFFICE_DOCKER_TAG:-latest} + # changelog https://github.com/EURO-office/DocumentServer/releases + networks: + opencloud-net: + environment: + WOPI_ENABLED: "true" + # self-signed certificates + USE_UNAUTHORIZED_STORAGE: "${INSECURE:-false}" + JWT_SECRET: "${EURO_OFFICE_JWT_SECRET}" + volumes: + # Mount local TrueType fonts so the container can use system fonts + # (e.g. Microsoft fonts like Arial, Calibri, Cambria by installing the `ttf-mscorefonts-installer` package). + - /usr/share/fonts/truetype:/usr/share/fonts/truetype/more:ro + logging: + driver: ${LOG_DRIVER:-local} + restart: always + healthcheck: + test: + [ + "CMD", + "bash", + "-c", + "exec 3<>/dev/tcp/127.0.0.1/80 && printf 'GET /hosting/discovery HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n' >&3 && cat <&3 | head -1 | grep -q '200 OK'" + ] + interval: 30s + timeout: 10s + retries: 5 + start_period: 120s \ No newline at end of file