From d3c0979dd59fee8e77d1ad2ab9e666e7e5a01c9b Mon Sep 17 00:00:00 2001 From: NagyZoltanPeter <113987313+NagyZoltanPeter@users.noreply.github.com> Date: Tue, 18 Aug 2026 18:03:04 +0200 Subject: [PATCH] chore(docker): rename compose folder and fix review follow-ups from #4057 (#4129) Follow-up to the review of #4057. - Rename apps/logos_delivery_node/compose -> apps/logos_delivery_node/docker (review request); the only path reference was in the folder's own README. - run_certbot.sh: pass the configured EMAIL to certbot instead of the hardcoded admin@$DOMAIN, and forward EMAIL to the certbot container so setting it in .env takes effect. Empty still falls back to admin@$DOMAIN. - set_storage_retention.sh: `grep -c` always prints a count, so the old sudo test was always true and sudo was used whenever ./postgresql existed. Test readability of the data directory directly instead. - chkhealth.sh: drop the stray `GET` argument, which curl treated as an extra (failing) URL. - docker-compose.yml: put certbot behind the `wss` profile so it no longer publishes host port 80 on deployments that do not use WebSocket-Secure, and drop the node's meaningless `depends_on: certbot` (run_node.sh polls for the certificate on disk anyway). --- .../{compose => docker}/.env.example | 9 ++++++- .../{compose => docker}/.gitignore | 0 .../{compose => docker}/README.md | 25 +++++++++++++++--- .../{compose => docker}/chkhealth.sh | 2 +- .../{compose => docker}/docker-compose.yml | 10 +++++-- .../customizations/custom-logo.png | Bin .../customizations/custom-logo.svg | 0 .../monitoring/configuration/dashboards.yaml | 0 .../dashboards/logos-delivery-monitoring.json | 0 .../monitoring/configuration/datasources.yaml | 0 .../configuration/grafana-plugins.env | 0 .../monitoring/configuration/grafana.ini | 0 .../configuration/pg-exporter-queries.yml | 0 .../configuration/postgres-exporter.yml | 0 .../monitoring/prometheus-config.yml | 0 .../{compose => docker}/postgres_cfg/db.sql | 0 .../postgres_cfg/postgresql.conf | 0 .../{compose => docker}/run_certbot.sh | 2 +- .../{compose => docker}/run_node.sh | 1 + .../{compose => docker}/set_postgres_shm.sh | 0 .../set_storage_retention.sh | 7 ++--- 21 files changed, 44 insertions(+), 12 deletions(-) rename apps/logos_delivery_node/{compose => docker}/.env.example (73%) rename apps/logos_delivery_node/{compose => docker}/.gitignore (100%) rename apps/logos_delivery_node/{compose => docker}/README.md (80%) rename apps/logos_delivery_node/{compose => docker}/chkhealth.sh (94%) rename apps/logos_delivery_node/{compose => docker}/docker-compose.yml (92%) rename apps/logos_delivery_node/{compose => docker}/monitoring/configuration/customizations/custom-logo.png (100%) rename apps/logos_delivery_node/{compose => docker}/monitoring/configuration/customizations/custom-logo.svg (100%) rename apps/logos_delivery_node/{compose => docker}/monitoring/configuration/dashboards.yaml (100%) rename apps/logos_delivery_node/{compose => docker}/monitoring/configuration/dashboards/logos-delivery-monitoring.json (100%) rename apps/logos_delivery_node/{compose => docker}/monitoring/configuration/datasources.yaml (100%) rename apps/logos_delivery_node/{compose => docker}/monitoring/configuration/grafana-plugins.env (100%) rename apps/logos_delivery_node/{compose => docker}/monitoring/configuration/grafana.ini (100%) rename apps/logos_delivery_node/{compose => docker}/monitoring/configuration/pg-exporter-queries.yml (100%) rename apps/logos_delivery_node/{compose => docker}/monitoring/configuration/postgres-exporter.yml (100%) rename apps/logos_delivery_node/{compose => docker}/monitoring/prometheus-config.yml (100%) rename apps/logos_delivery_node/{compose => docker}/postgres_cfg/db.sql (100%) rename apps/logos_delivery_node/{compose => docker}/postgres_cfg/postgresql.conf (100%) rename apps/logos_delivery_node/{compose => docker}/run_certbot.sh (98%) rename apps/logos_delivery_node/{compose => docker}/run_node.sh (96%) rename apps/logos_delivery_node/{compose => docker}/set_postgres_shm.sh (100%) rename apps/logos_delivery_node/{compose => docker}/set_storage_retention.sh (93%) diff --git a/apps/logos_delivery_node/compose/.env.example b/apps/logos_delivery_node/docker/.env.example similarity index 73% rename from apps/logos_delivery_node/compose/.env.example rename to apps/logos_delivery_node/docker/.env.example index 307282a66..0fd5911e4 100644 --- a/apps/logos_delivery_node/compose/.env.example +++ b/apps/logos_delivery_node/docker/.env.example @@ -18,8 +18,15 @@ LOGOS_IMAGE= # NODEKEY: P2P node private key (64 char hex) for a stable peer identity. NODEKEY= # DOMAIN: public domain for WebSocket-Secure (TLS via certbot). Leave empty to -# disable WSS. +# disable WSS. When set, also set COMPOSE_PROFILES=wss below, otherwise +# certbot is not started and the node waits forever for a certificate. DOMAIN= +# COMPOSE_PROFILES: set to `wss` (together with DOMAIN) to run the certbot +# service. It binds host port 80 for the ACME HTTP-01 +# challenge, so it stays off unless requested. +COMPOSE_PROFILES= +# EMAIL: registration address for Let's Encrypt. Defaults to admin@$DOMAIN. +EMAIL= # EXTRA_ARGS: extra logosdeliverynode CLI flags appended verbatim. EXTRA_ARGS= # STORAGE_SIZE: store retention size, e.g. 1GB. Empty defaults to size:1GB. diff --git a/apps/logos_delivery_node/compose/.gitignore b/apps/logos_delivery_node/docker/.gitignore similarity index 100% rename from apps/logos_delivery_node/compose/.gitignore rename to apps/logos_delivery_node/docker/.gitignore diff --git a/apps/logos_delivery_node/compose/README.md b/apps/logos_delivery_node/docker/README.md similarity index 80% rename from apps/logos_delivery_node/compose/README.md rename to apps/logos_delivery_node/docker/README.md index cedf4cdd0..5952ba981 100644 --- a/apps/logos_delivery_node/compose/README.md +++ b/apps/logos_delivery_node/docker/README.md @@ -1,4 +1,4 @@ -# logosdeliverynode compose +# logosdeliverynode docker compose stack A `docker compose` project that runs a **logosdeliverynode** as a full service node on the **Logos Dev** network (`--preset=logos.dev`), backed by Postgres @@ -17,12 +17,12 @@ RLN keystore tooling are intentionally omitted for now. | `postgres-exporter` | Exposes Postgres metrics to Prometheus | | `prometheus` | Scrapes node (`:8003`) and postgres-exporter | | `grafana` | Dashboards (`http://localhost:3000`, anonymous admin) | -| `certbot` | Optional Let's Encrypt certs for WebSocket-Secure (needs DOMAIN) | +| `certbot` | Let's Encrypt certs for WebSocket-Secure; only with the `wss` profile | ## Quick start ```bash -cd apps/logos_delivery_node/compose +cd apps/logos_delivery_node/docker cp .env.example .env # edit POSTGRES_PASSWORD etc. # Build the logosdeliverynode image from the repo Dockerfile @@ -57,6 +57,8 @@ Key `.env` values: | `POSTGRES_USER` / `_PASSWORD` | postgres / test123 | Store DB credentials | | `NODEKEY` | *(random)* | Stable P2P identity (64 char hex) | | `DOMAIN` | *(empty)* | Public domain for WebSocket-Secure; empty disables WSS | +| `COMPOSE_PROFILES` | *(empty)* | Set to `wss` together with `DOMAIN` to run `certbot` | +| `EMAIL` | `admin@$DOMAIN` | Let's Encrypt registration address | | `STORAGE_SIZE` | `1GB` | Store retention size | | `EXTRA_ARGS` | *(empty)* | Extra CLI flags appended to the node | @@ -73,4 +75,19 @@ tuned `POSTGRES_SHM` / `STORAGE_SIZE` values to `.env` based on the host. | 8645 | node REST | bound to 127.0.0.1 | | 8003 | node metrics | bound to 127.0.0.1 | | 3000 | grafana | | -| 80 | certbot | ACME HTTP-01 | +| 80 | certbot | ACME HTTP-01, only with the `wss` profile | + +## WebSocket-Secure + +WSS is off by default. To enable it, set both values in `.env` and bring the +stack back up: + +```bash +DOMAIN=node.example.com +COMPOSE_PROFILES=wss +``` + +`certbot` publishes host port 80 for the ACME HTTP-01 challenge, which is why +it is kept behind a profile rather than started unconditionally. With `DOMAIN` +set but the profile off, no certificate is ever issued and the node stays in +its certificate-wait loop. diff --git a/apps/logos_delivery_node/compose/chkhealth.sh b/apps/logos_delivery_node/docker/chkhealth.sh similarity index 94% rename from apps/logos_delivery_node/compose/chkhealth.sh rename to apps/logos_delivery_node/docker/chkhealth.sh index 277757395..cbc7cc928 100755 --- a/apps/logos_delivery_node/compose/chkhealth.sh +++ b/apps/logos_delivery_node/docker/chkhealth.sh @@ -38,7 +38,7 @@ then exit 1 fi -response=$(curl --connect-timeout 6 -s GET http://${ip_address}/health) +response=$(curl --connect-timeout 6 -s http://${ip_address}/health) if [[ $? -ne 0 ]]; then echo -e "$(date +'%H:%M:%S') - Node may not be running or not reachable at http://${ip_address}\n" diff --git a/apps/logos_delivery_node/compose/docker-compose.yml b/apps/logos_delivery_node/docker/docker-compose.yml similarity index 92% rename from apps/logos_delivery_node/compose/docker-compose.yml rename to apps/logos_delivery_node/docker/docker-compose.yml index 5a8662463..cf2069c21 100644 --- a/apps/logos_delivery_node/compose/docker-compose.yml +++ b/apps/logos_delivery_node/docker/docker-compose.yml @@ -67,16 +67,22 @@ services: # crash-loops on store setup until the DB is ready (restart: on-failure). postgres: condition: service_healthy - certbot: - condition: service_started certbot: + # Only started when the `wss` profile is enabled (COMPOSE_PROFILES=wss in + # .env, alongside DOMAIN). It binds host port 80 for the ACME HTTP-01 + # challenge, which would otherwise be occupied even on deployments that do + # not use WSS. run_node.sh polls for the certificate on disk, so the node + # needs no depends_on ordering against it. + profiles: ["wss"] image: certbot/certbot restart: on-failure ports: - 80:80 # Let's Encrypt environment: DOMAIN: ${DOMAIN} + # Empty falls back to admin@$DOMAIN inside run_certbot.sh. + EMAIL: ${EMAIL} volumes: - ./run_certbot.sh:/opt/run_certbot.sh:Z - ${CERTS_DIR:-./certs}:/etc/letsencrypt/:Z diff --git a/apps/logos_delivery_node/compose/monitoring/configuration/customizations/custom-logo.png b/apps/logos_delivery_node/docker/monitoring/configuration/customizations/custom-logo.png similarity index 100% rename from apps/logos_delivery_node/compose/monitoring/configuration/customizations/custom-logo.png rename to apps/logos_delivery_node/docker/monitoring/configuration/customizations/custom-logo.png diff --git a/apps/logos_delivery_node/compose/monitoring/configuration/customizations/custom-logo.svg b/apps/logos_delivery_node/docker/monitoring/configuration/customizations/custom-logo.svg similarity index 100% rename from apps/logos_delivery_node/compose/monitoring/configuration/customizations/custom-logo.svg rename to apps/logos_delivery_node/docker/monitoring/configuration/customizations/custom-logo.svg diff --git a/apps/logos_delivery_node/compose/monitoring/configuration/dashboards.yaml b/apps/logos_delivery_node/docker/monitoring/configuration/dashboards.yaml similarity index 100% rename from apps/logos_delivery_node/compose/monitoring/configuration/dashboards.yaml rename to apps/logos_delivery_node/docker/monitoring/configuration/dashboards.yaml diff --git a/apps/logos_delivery_node/compose/monitoring/configuration/dashboards/logos-delivery-monitoring.json b/apps/logos_delivery_node/docker/monitoring/configuration/dashboards/logos-delivery-monitoring.json similarity index 100% rename from apps/logos_delivery_node/compose/monitoring/configuration/dashboards/logos-delivery-monitoring.json rename to apps/logos_delivery_node/docker/monitoring/configuration/dashboards/logos-delivery-monitoring.json diff --git a/apps/logos_delivery_node/compose/monitoring/configuration/datasources.yaml b/apps/logos_delivery_node/docker/monitoring/configuration/datasources.yaml similarity index 100% rename from apps/logos_delivery_node/compose/monitoring/configuration/datasources.yaml rename to apps/logos_delivery_node/docker/monitoring/configuration/datasources.yaml diff --git a/apps/logos_delivery_node/compose/monitoring/configuration/grafana-plugins.env b/apps/logos_delivery_node/docker/monitoring/configuration/grafana-plugins.env similarity index 100% rename from apps/logos_delivery_node/compose/monitoring/configuration/grafana-plugins.env rename to apps/logos_delivery_node/docker/monitoring/configuration/grafana-plugins.env diff --git a/apps/logos_delivery_node/compose/monitoring/configuration/grafana.ini b/apps/logos_delivery_node/docker/monitoring/configuration/grafana.ini similarity index 100% rename from apps/logos_delivery_node/compose/monitoring/configuration/grafana.ini rename to apps/logos_delivery_node/docker/monitoring/configuration/grafana.ini diff --git a/apps/logos_delivery_node/compose/monitoring/configuration/pg-exporter-queries.yml b/apps/logos_delivery_node/docker/monitoring/configuration/pg-exporter-queries.yml similarity index 100% rename from apps/logos_delivery_node/compose/monitoring/configuration/pg-exporter-queries.yml rename to apps/logos_delivery_node/docker/monitoring/configuration/pg-exporter-queries.yml diff --git a/apps/logos_delivery_node/compose/monitoring/configuration/postgres-exporter.yml b/apps/logos_delivery_node/docker/monitoring/configuration/postgres-exporter.yml similarity index 100% rename from apps/logos_delivery_node/compose/monitoring/configuration/postgres-exporter.yml rename to apps/logos_delivery_node/docker/monitoring/configuration/postgres-exporter.yml diff --git a/apps/logos_delivery_node/compose/monitoring/prometheus-config.yml b/apps/logos_delivery_node/docker/monitoring/prometheus-config.yml similarity index 100% rename from apps/logos_delivery_node/compose/monitoring/prometheus-config.yml rename to apps/logos_delivery_node/docker/monitoring/prometheus-config.yml diff --git a/apps/logos_delivery_node/compose/postgres_cfg/db.sql b/apps/logos_delivery_node/docker/postgres_cfg/db.sql similarity index 100% rename from apps/logos_delivery_node/compose/postgres_cfg/db.sql rename to apps/logos_delivery_node/docker/postgres_cfg/db.sql diff --git a/apps/logos_delivery_node/compose/postgres_cfg/postgresql.conf b/apps/logos_delivery_node/docker/postgres_cfg/postgresql.conf similarity index 100% rename from apps/logos_delivery_node/compose/postgres_cfg/postgresql.conf rename to apps/logos_delivery_node/docker/postgres_cfg/postgresql.conf diff --git a/apps/logos_delivery_node/compose/run_certbot.sh b/apps/logos_delivery_node/docker/run_certbot.sh similarity index 98% rename from apps/logos_delivery_node/compose/run_certbot.sh rename to apps/logos_delivery_node/docker/run_certbot.sh index 99aa973fd..c2b949f69 100755 --- a/apps/logos_delivery_node/compose/run_certbot.sh +++ b/apps/logos_delivery_node/docker/run_certbot.sh @@ -36,7 +36,7 @@ if [ ! -d "${LETSENCRYPT_PATH}" ]; then --agree-tos\ --no-eff-email\ --no-redirect\ - --email admin@${DOMAIN}\ + --email "${EMAIL}"\ -d ${DOMAIN}\ --standalone diff --git a/apps/logos_delivery_node/compose/run_node.sh b/apps/logos_delivery_node/docker/run_node.sh similarity index 96% rename from apps/logos_delivery_node/compose/run_node.sh rename to apps/logos_delivery_node/docker/run_node.sh index e28d5396b..dae8c9d78 100755 --- a/apps/logos_delivery_node/compose/run_node.sh +++ b/apps/logos_delivery_node/docker/run_node.sh @@ -25,6 +25,7 @@ if [ -n "${DOMAIN}" ]; then while true; do if [ ! -f "${CERT}" ] || [ ! -f "${KEY}" ]; then echo "$(date '+%Y-%m-%d %H:%M:%S') [INFO] Certificate files not found yet. Waiting..." + echo "$(date '+%Y-%m-%d %H:%M:%S') [INFO] If no certbot container is running, set COMPOSE_PROFILES=wss in .env and re-run docker compose up -d." elif ! openssl x509 -checkend 0 -noout -in "${CERT}" >/dev/null 2>&1; then echo "$(date '+%Y-%m-%d %H:%M:%S') [WARN] Certificate exists but is expired. Waiting for renewal..." echo "$(date '+%Y-%m-%d %H:%M:%S') [INFO] If that takes more than 15 minutes, please remove --quiet attr in run_certbot.sh so that you can see the reason why renewal is not working." diff --git a/apps/logos_delivery_node/compose/set_postgres_shm.sh b/apps/logos_delivery_node/docker/set_postgres_shm.sh similarity index 100% rename from apps/logos_delivery_node/compose/set_postgres_shm.sh rename to apps/logos_delivery_node/docker/set_postgres_shm.sh diff --git a/apps/logos_delivery_node/compose/set_storage_retention.sh b/apps/logos_delivery_node/docker/set_storage_retention.sh similarity index 93% rename from apps/logos_delivery_node/compose/set_storage_retention.sh rename to apps/logos_delivery_node/docker/set_storage_retention.sh index 4d2cf742f..b81b75e7e 100755 --- a/apps/logos_delivery_node/compose/set_storage_retention.sh +++ b/apps/logos_delivery_node/docker/set_storage_retention.sh @@ -47,7 +47,7 @@ fi # Check we are in right folder if ! [ -f "./run_node.sh" ]; then - >&2 echo "This script must be run from inside the compose folder" + >&2 echo "This script must be run from inside the docker folder" exit 1 fi @@ -64,8 +64,9 @@ fi SUDO="" PGSQL_SIZE_MB=0 if [ -d "./postgresql" ]; then - # Check if we need to use SUDO moving forward - if [ "$(ls postgresql/* 2>&1 | grep -c "Permission denied")" ]; then + # Check if we need to use SUDO moving forward: the data directory is + # created by the postgres container and may not be readable by this user. + if ! ls ./postgresql >/dev/null 2>&1; then SUDO="sudo" fi