From 815405b6a3eaad4cab81c0b28ff9c007b70208bf Mon Sep 17 00:00:00 2001 From: mr-forust Date: Fri, 14 Nov 2025 21:34:33 +0100 Subject: [PATCH 01/20] gitignore cleanup Staging server for let'sencrypt --- .gitignore | 6 +----- traefik-docker-compose.yaml | 4 ++-- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 0165fdb..cf6ea6b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,8 @@ +sync.ffs_lock .sync.ffs_db volumes/* traefik/certs/* -letsencrypt/acme.json models/* -certs/* .env* traefik/letsencrypt/acme.json edu_master/volumes/ @@ -12,7 +11,4 @@ portainer_data/* adguardhome/* .python-version gitea/* -traefik/dynamic/.services gigaforust copy.yml -traefik/dynamic/.services workstation.yml traefik/logs/* -sync.ffs_lock diff --git a/traefik-docker-compose.yaml b/traefik-docker-compose.yaml index 958a772..30688bf 100644 --- a/traefik-docker-compose.yaml +++ b/traefik-docker-compose.yaml @@ -20,11 +20,11 @@ services: # Let's Encrypt STAGING - "--certificatesresolvers.letsencrypt.acme.email=${EMAIL}" - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json" - # - "--certificatesresolvers.letsencrypt.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory" + - "--certificatesresolvers.letsencrypt.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory" - "--certificatesresolvers.letsencrypt.acme.httpchallenge=true" - "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web" - # Cloudflare - получение реальных IP + # Cloudflare - "--entryPoints.web.forwardedHeaders.trustedIPs=173.245.48.0/20,103.21.244.0/22,103.22.200.0/22,103.31.4.0/22,141.101.64.0/18,108.162.192.0/18,190.93.240.0/20,188.114.96.0/20,197.234.240.0/22,198.41.128.0/17,162.158.0.0/15,104.16.0.0/13,104.24.0.0/14,172.64.0.0/13,131.0.72.0/22" - "--entryPoints.websecure.forwardedHeaders.trustedIPs=173.245.48.0/20,103.21.244.0/22,103.22.200.0/22,103.31.4.0/22,141.101.64.0/18,108.162.192.0/18,190.93.240.0/20,188.114.96.0/20,197.234.240.0/22,198.41.128.0/17,162.158.0.0/15,104.16.0.0/13,104.24.0.0/14,172.64.0.0/13,131.0.72.0/22" From 85436e0855d5fb0bb9f7d692e1e7e5735c482eef Mon Sep 17 00:00:00 2001 From: mr-forust Date: Sat, 15 Nov 2025 01:39:40 +0100 Subject: [PATCH 02/20] refactored dynamic traefik conf files Removed let's encrypt acme and other stuff. Using Cloudflare origin CA --- traefik-docker-compose.yaml | 24 +++++--- traefik/dynamic/{services.yml => dynamic.yml} | 59 ++++++++++++------- traefik/dynamic/tls.yml | 19 ------ 3 files changed, 54 insertions(+), 48 deletions(-) rename traefik/dynamic/{services.yml => dynamic.yml} (81%) delete mode 100644 traefik/dynamic/tls.yml diff --git a/traefik-docker-compose.yaml b/traefik-docker-compose.yaml index 30688bf..03e16b8 100644 --- a/traefik-docker-compose.yaml +++ b/traefik-docker-compose.yaml @@ -4,30 +4,36 @@ services: container_name: traefik restart: unless-stopped command: + # API - "--api.insecure=false" - "--api.dashboard=true" + + # Providers - "--providers.docker=true" - "--providers.docker.exposedbydefault=false" - "--providers.docker.network=traefik-proxy" + - "--providers.file.directory=/etc/traefik/dynamic" + - "--providers.file.watch=true" + + # EntryPoints - "--entryPoints.web.address=:80" - "--entryPoints.websecure.address=:443" - "--entryPoints.websecure.http.tls=true" - "--entryPoints.web.http.redirections.entryPoint.to=websecure" - "--entryPoints.web.http.redirections.entryPoint.scheme=https" - - "--providers.file.directory=/etc/traefik/dynamic" - - "--providers.file.watch=true" - # Let's Encrypt STAGING - - "--certificatesresolvers.letsencrypt.acme.email=${EMAIL}" - - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json" - - "--certificatesresolvers.letsencrypt.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory" - - "--certificatesresolvers.letsencrypt.acme.httpchallenge=true" - - "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web" + # Let's Encrypt STAGING. CURRENTLY USING CF ORIGIN CA INSTEAD + # - "--certificatesresolvers.letsencrypt.acme.email=${EMAIL}" + # - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json" + # - "--certificatesresolvers.letsencrypt.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory" + # - "--certificatesresolvers.letsencrypt.acme.httpchallenge=true" + # - "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web" # Cloudflare - "--entryPoints.web.forwardedHeaders.trustedIPs=173.245.48.0/20,103.21.244.0/22,103.22.200.0/22,103.31.4.0/22,141.101.64.0/18,108.162.192.0/18,190.93.240.0/20,188.114.96.0/20,197.234.240.0/22,198.41.128.0/17,162.158.0.0/15,104.16.0.0/13,104.24.0.0/14,172.64.0.0/13,131.0.72.0/22" - "--entryPoints.websecure.forwardedHeaders.trustedIPs=173.245.48.0/20,103.21.244.0/22,103.22.200.0/22,103.31.4.0/22,141.101.64.0/18,108.162.192.0/18,190.93.240.0/20,188.114.96.0/20,197.234.240.0/22,198.41.128.0/17,162.158.0.0/15,104.16.0.0/13,104.24.0.0/14,172.64.0.0/13,131.0.72.0/22" + # Logging - "--log.level=INFO" - "--log.filePath=/var/log/traefik/traefik.log" - "--accesslog=true" @@ -46,7 +52,7 @@ services: volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - - ./traefik/letsencrypt:/letsencrypt + # - ./traefik/letsencrypt:/letsencrypt - ./traefik/dynamic:/etc/traefik/dynamic:ro - ./traefik/logs:/var/log/traefik - ./traefik/certs:/certs:ro diff --git a/traefik/dynamic/services.yml b/traefik/dynamic/dynamic.yml similarity index 81% rename from traefik/dynamic/services.yml rename to traefik/dynamic/dynamic.yml index d377a78..4cd2dfa 100644 --- a/traefik/dynamic/services.yml +++ b/traefik/dynamic/dynamic.yml @@ -1,6 +1,6 @@ http: routers: - # Traefik Dashboard + # Traefik Dashboard (локальный) traefik-dashboard: rule: "Host(`traefik.workstation`)" entryPoints: @@ -10,9 +10,8 @@ http: # - auth - security-headers tls: {} - # certResolver: letsencrypt - # Portainer + # Portainer (публичный) portainer: rule: "Host(`portainer.forust.xyz`)" entryPoints: @@ -20,10 +19,9 @@ http: service: portainer middlewares: - security-headers - tls: - certResolver: letsencrypt + tls: {} - # AdGuard Home + # AdGuard Home (публичный) adguard: rule: "Host(`adguard.forust.xyz`)" entryPoints: @@ -31,8 +29,7 @@ http: service: adguard middlewares: - security-headers - tls: - certResolver: letsencrypt + tls: {} # Nextcloud AIO Interface (локальный) nextcloud-aio: @@ -44,7 +41,7 @@ http: - security-headers tls: {} - # Nextcloud Main + # Nextcloud Main (публичный) nextcloud: rule: "Host(`nextcloud.forust.xyz`)" entrypoints: @@ -52,10 +49,9 @@ http: service: nextcloud middlewares: - nextcloud-chain - tls: - certResolver: letsencrypt + tls: {} - # Dockmon + # Dockmon (публичный) dockmon: rule: "Host(`dockmon.forust.xyz`)" entryPoints: @@ -64,8 +60,7 @@ http: middlewares: # - dockmon-auth - security-headers - tls: - certResolver: letsencrypt + tls: {} # Glance (локальный) glance: @@ -87,7 +82,7 @@ http: - security-headers tls: {} - # N8N + # N8N (локальный) n8n: rule: "Host(`n8n.workstation`)" entryPoints: @@ -96,9 +91,8 @@ http: middlewares: - security-headers tls: {} - # certResolver: letsencrypt - # Gitea + # Gitea (публичный) gitea: rule: "Host(`gitea.forust.xyz`)" entryPoints: @@ -106,8 +100,7 @@ http: service: gitea middlewares: - security-headers - tls: - certResolver: letsencrypt + tls: {} services: # Portainer @@ -247,4 +240,30 @@ http: chain: middlewares: - nextcloud-secure-headers - - security-headers \ No newline at end of file + - security-headers + +# TLS Configuration +tls: + certificates: + # Cloudflare Origin CA для публичных доменов *.forust.xyz + - certFile: /certs/cloudflare.pem + keyFile: /certs/cloudflare.key + # Локальный сертификат для *.workstation + - certFile: /certs/workstation+1.pem + keyFile: /certs/workstation+1-key.pem + + stores: + default: + defaultCertificate: + # По умолчанию используем локальный сертификат + certFile: /certs/workstation+1.pem + keyFile: /certs/workstation+1-key.pem + + options: + default: + minVersion: VersionTLS12 + sniStrict: true + cipherSuites: + - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 + - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 + - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 \ No newline at end of file diff --git a/traefik/dynamic/tls.yml b/traefik/dynamic/tls.yml deleted file mode 100644 index a075d46..0000000 --- a/traefik/dynamic/tls.yml +++ /dev/null @@ -1,19 +0,0 @@ -tls: - certificates: - - certFile: /certs/workstation+1.pem - keyFile: /certs/workstation+1-key.pem - stores: - default: - defaultCertificate: - certFile: /certs/cloudflare.pem - keyFile: /certs/cloudflare.key - - - options: - default: - minVersion: VersionTLS12 - sniStrict: true - cipherSuites: - - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 - - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 - - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 \ No newline at end of file From 266b8bdf6c85f31b4b6f787d4493d746d088b7a8 Mon Sep 17 00:00:00 2001 From: mr-forust Date: Sat, 15 Nov 2025 01:46:04 +0100 Subject: [PATCH 03/20] Comments cleanup&rewritten --- traefik/dynamic/dynamic.yml | 86 +++++++++++++++++++------------------ 1 file changed, 44 insertions(+), 42 deletions(-) diff --git a/traefik/dynamic/dynamic.yml b/traefik/dynamic/dynamic.yml index 4cd2dfa..721710d 100644 --- a/traefik/dynamic/dynamic.yml +++ b/traefik/dynamic/dynamic.yml @@ -1,6 +1,6 @@ http: routers: - # Traefik Dashboard (локальный) + # Traefik Dashboard (ADMIN, local only) traefik-dashboard: rule: "Host(`traefik.workstation`)" entryPoints: @@ -11,27 +11,7 @@ http: - security-headers tls: {} - # Portainer (публичный) - portainer: - rule: "Host(`portainer.forust.xyz`)" - entryPoints: - - websecure - service: portainer - middlewares: - - security-headers - tls: {} - - # AdGuard Home (публичный) - adguard: - rule: "Host(`adguard.forust.xyz`)" - entryPoints: - - websecure - service: adguard - middlewares: - - security-headers - tls: {} - - # Nextcloud AIO Interface (локальный) + # Nextcloud AIO Interface (ADMIN, local is better) nextcloud-aio: rule: "Host(`nextcloud-aio.workstation`)" entryPoints: @@ -41,7 +21,28 @@ http: - security-headers tls: {} - # Nextcloud Main (публичный) + # Portainer (public (account required)) + portainer: + rule: "Host(`portainer.forust.xyz`)" + entryPoints: + - websecure + service: portainer + middlewares: + - security-headers + tls: {} + + # AdGuard Home (public (account required)) + adguard: + rule: "Host(`adguard.forust.xyz`)" + entryPoints: + - websecure + service: adguard + middlewares: + - security-headers + tls: {} + + + # Nextcloud Main (public (account required)) nextcloud: rule: "Host(`nextcloud.forust.xyz`)" entrypoints: @@ -51,7 +52,7 @@ http: - nextcloud-chain tls: {} - # Dockmon (публичный) + # Dockmon (public (account required)) dockmon: rule: "Host(`dockmon.forust.xyz`)" entryPoints: @@ -62,7 +63,17 @@ http: - security-headers tls: {} - # Glance (локальный) + # Gitea (public (account required)) + gitea: + rule: "Host(`gitea.forust.xyz`)" + entryPoints: + - websecure + service: gitea + middlewares: + - security-headers + tls: {} + + # Glance (local only) glance: rule: "Host(`glance.workstation`)" entryPoints: @@ -72,7 +83,7 @@ http: - security-headers tls: {} - # Watercrawl (локальный) + # Watercrawl (local only) watercrawl: rule: "Host(`watercrawl.workstation`)" entryPoints: @@ -82,7 +93,7 @@ http: - security-headers tls: {} - # N8N (локальный) + # N8N (local only) n8n: rule: "Host(`n8n.workstation`)" entryPoints: @@ -92,15 +103,6 @@ http: - security-headers tls: {} - # Gitea (публичный) - gitea: - rule: "Host(`gitea.forust.xyz`)" - entryPoints: - - websecure - service: gitea - middlewares: - - security-headers - tls: {} services: # Portainer @@ -171,21 +173,21 @@ http: scheme: https permanent: true - # Basic Auth для Traefik Dashboard + # Basic Auth Traefik Dashboard auth: basicAuth: users: - "admin:$$apr1$$57E60OUM$$JoYwmLr/uZKaTy6U4IQd9." realm: "Traefik Dashboard" - # Basic Auth для Dockmon + # Basic Auth Dockmon dockmon-auth: basicAuth: users: - "admin:$$apr1$$.bCpmIHl$$dxPEKdw5aZLAwo8wUz52b1" realm: "Dockmon Access" - # Cloudflare IP Whitelist (опционально) + # Cloudflare IP Whitelist cloudflare-ipwhitelist: ipWhiteList: sourceRange: @@ -245,17 +247,17 @@ http: # TLS Configuration tls: certificates: - # Cloudflare Origin CA для публичных доменов *.forust.xyz + # Cloudflare Origin CA *.forust.xyz - certFile: /certs/cloudflare.pem keyFile: /certs/cloudflare.key - # Локальный сертификат для *.workstation + # Local certificate - certFile: /certs/workstation+1.pem keyFile: /certs/workstation+1-key.pem stores: default: defaultCertificate: - # По умолчанию используем локальный сертификат + # Fallback local certificate certFile: /certs/workstation+1.pem keyFile: /certs/workstation+1-key.pem From 49c80944742d12dfb603d4a01bbad8f187b5bed2 Mon Sep 17 00:00:00 2001 From: mr-forust Date: Sat, 15 Nov 2025 01:53:36 +0100 Subject: [PATCH 04/20] Assigned n8n a container_name (fix for traefik) --- n8n-docker-compose.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/n8n-docker-compose.yaml b/n8n-docker-compose.yaml index 1d39fd1..a98dc0e 100644 --- a/n8n-docker-compose.yaml +++ b/n8n-docker-compose.yaml @@ -1,6 +1,7 @@ services: n8n: image: docker.n8n.io/n8nio/n8n + container_name: n8n restart: unless-stopped environment: - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true From d6843a56b8c90346afdce63f6eee44d1ae6fb574 Mon Sep 17 00:00:00 2001 From: mr-forust Date: Sat, 15 Nov 2025 03:02:38 +0100 Subject: [PATCH 05/20] Tried to add ssh router and endpoint for gitea --- traefik-docker-compose.yaml | 1 + traefik/dynamic/dynamic.yml | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/traefik-docker-compose.yaml b/traefik-docker-compose.yaml index 03e16b8..9b99664 100644 --- a/traefik-docker-compose.yaml +++ b/traefik-docker-compose.yaml @@ -21,6 +21,7 @@ services: - "--entryPoints.websecure.http.tls=true" - "--entryPoints.web.http.redirections.entryPoint.to=websecure" - "--entryPoints.web.http.redirections.entryPoint.scheme=https" + - "--entryPoints.ssh.address=:222" # Let's Encrypt STAGING. CURRENTLY USING CF ORIGIN CA INSTEAD # - "--certificatesresolvers.letsencrypt.acme.email=${EMAIL}" diff --git a/traefik/dynamic/dynamic.yml b/traefik/dynamic/dynamic.yml index 721710d..e7c638a 100644 --- a/traefik/dynamic/dynamic.yml +++ b/traefik/dynamic/dynamic.yml @@ -73,6 +73,14 @@ http: - security-headers tls: {} + # Gitea SSH + gitea-ssh: + rule: "HostSNI(`*`)" + entryPoints: + - ssh + service: gitea-ssh + tls: {} + # Glance (local only) glance: rule: "Host(`glance.workstation`)" @@ -162,6 +170,13 @@ http: servers: - url: "http://gitea:3000" + # Gitea SSH + gitea-ssh: + loadBalancer: + servers: + - url: "ssh://gitea:22" + + serversTransports: insecureTransport: insecureSkipVerify: true From df885218e5766b4a3769ca8d3a8ec058fccaa3fe Mon Sep 17 00:00:00 2001 From: mr-forust Date: Sat, 15 Nov 2025 10:29:39 +0100 Subject: [PATCH 06/20] Gitea ssh Moved to port=2221 Network rename and cleanup --- gitea-docker-compose.yaml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/gitea-docker-compose.yaml b/gitea-docker-compose.yaml index 8f510ac..60b0465 100644 --- a/gitea-docker-compose.yaml +++ b/gitea-docker-compose.yaml @@ -5,17 +5,18 @@ services: environment: - USER_UID=1000 - USER_GID=1000 + # Database - GITEA__database__DB_TYPE=postgres - GITEA__database__HOST=db:5432 - GITEA__database__NAME=gitea - GITEA__database__USER=gitea - GITEA__database__PASSWD=gitea - - GITEA__server__DOMAIN=gitea.forust.xyz - - GITEA__server__ROOT_URL=https://gitea.forust.xyz/ - - GITEA__server__SSH_DOMAIN=gitea.forust.xyz + #Server + - GITEA__server__ROOT_URL=https://gitea.forust.xyz + - GITEA__server__SSH_PORT=2221 restart: always networks: - - gitea + - gitea-db - traefik-proxy volumes: - ./gitea:/data @@ -25,7 +26,7 @@ services: - "traefik.enable=true" - "traefik.docker.network=traefik-proxy" ports: - - "222:22" + - "2221:22" depends_on: - db @@ -37,7 +38,7 @@ services: - POSTGRES_PASSWORD=gitea - POSTGRES_DB=gitea networks: - - gitea + - gitea-db volumes: - ./volumes/gitea/postgres:/var/lib/postgresql/data From 1203dea5b7ab22760671c869475299a96dd45c4e Mon Sep 17 00:00:00 2001 From: mr-forust Date: Sat, 15 Nov 2025 11:11:55 +0100 Subject: [PATCH 07/20] moved gitea compose file to a sepparated directory update gitignore accordingly &cleanup --- .gitignore | 6 ++---- .../gitea-docker-compose.yaml | 4 ++-- 2 files changed, 4 insertions(+), 6 deletions(-) rename gitea-docker-compose.yaml => gitea/gitea-docker-compose.yaml (93%) diff --git a/.gitignore b/.gitignore index cf6ea6b..f387112 100644 --- a/.gitignore +++ b/.gitignore @@ -1,14 +1,12 @@ sync.ffs_lock .sync.ffs_db +gitea/volumes/* volumes/* traefik/certs/* -models/* .env* traefik/letsencrypt/acme.json -edu_master/volumes/ -dockmon/dockmon_data/ portainer_data/* adguardhome/* .python-version -gitea/* +gitea/gitea-data/ traefik/logs/* diff --git a/gitea-docker-compose.yaml b/gitea/gitea-docker-compose.yaml similarity index 93% rename from gitea-docker-compose.yaml rename to gitea/gitea-docker-compose.yaml index 60b0465..0baba66 100644 --- a/gitea-docker-compose.yaml +++ b/gitea/gitea-docker-compose.yaml @@ -19,7 +19,7 @@ services: - gitea-db - traefik-proxy volumes: - - ./gitea:/data + - ./gitea-data:/data - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro labels: @@ -40,7 +40,7 @@ services: networks: - gitea-db volumes: - - ./volumes/gitea/postgres:/var/lib/postgresql/data + - ./gitea-db:/var/lib/postgresql/data networks: gitea: From e93963ddab1dfbebf430e3d79ede9d61ebb2b7e7 Mon Sep 17 00:00:00 2001 From: mr-forust Date: Sat, 15 Nov 2025 12:31:17 +0100 Subject: [PATCH 08/20] .env for gitea with fallbacks --- .gitignore | 4 +++- gitea/.env.example | 3 +++ gitea/gitea-docker-compose.yaml | 12 ++++++------ 3 files changed, 12 insertions(+), 7 deletions(-) create mode 100644 gitea/.env.example diff --git a/.gitignore b/.gitignore index f387112..73fcb95 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,9 @@ sync.ffs_lock gitea/volumes/* volumes/* traefik/certs/* -.env* +.env +.env.anna +.env.forust traefik/letsencrypt/acme.json portainer_data/* adguardhome/* diff --git a/gitea/.env.example b/gitea/.env.example new file mode 100644 index 0000000..b5a1c0a --- /dev/null +++ b/gitea/.env.example @@ -0,0 +1,3 @@ +GITEA_POSTGRES_USER= +GITEA_POSTGRES_PASSWORD= +GITEA_POSTGRES_DB=gitea \ No newline at end of file diff --git a/gitea/gitea-docker-compose.yaml b/gitea/gitea-docker-compose.yaml index 0baba66..d77c99f 100644 --- a/gitea/gitea-docker-compose.yaml +++ b/gitea/gitea-docker-compose.yaml @@ -8,9 +8,9 @@ services: # Database - GITEA__database__DB_TYPE=postgres - GITEA__database__HOST=db:5432 - - GITEA__database__NAME=gitea - - GITEA__database__USER=gitea - - GITEA__database__PASSWD=gitea + - GITEA__database__USER=${GITEA_POSTGRES_USER:-gitea} + - GITEA__database__PASSWD=${GITEA_POSTGRES_PASSWORD:-gitea} + - GITEA__database__NAME=${GITEA_POSTGRES_DB:-gitea} #Server - GITEA__server__ROOT_URL=https://gitea.forust.xyz - GITEA__server__SSH_PORT=2221 @@ -34,9 +34,9 @@ services: image: docker.io/library/postgres:14 restart: always environment: - - POSTGRES_USER=gitea - - POSTGRES_PASSWORD=gitea - - POSTGRES_DB=gitea + - POSTGRES_USER=${GITEA_POSTGRES_USER:-gitea} + - POSTGRES_PASSWORD=${GITEA_POSTGRES_PASSWORD:-gitea} + - POSTGRES_DB=${GITEA_POSTGRES_DB:-gitea} networks: - gitea-db volumes: From b51a1c7ee67ebe685199b70e390d8c88aaa429ba Mon Sep 17 00:00:00 2001 From: mr-forust Date: Sat, 15 Nov 2025 12:54:56 +0100 Subject: [PATCH 09/20] moved and renamed adguard, dockmon to their directories +gitea rename --- .gitignore | 3 ++- adguard-docker-compose.yaml => adguardhome/compose.yaml | 6 +++--- dockmon-docker-compose.yaml => dockmon/compose.yaml | 4 ++-- gitea/{gitea-docker-compose.yaml => compose.yaml} | 0 4 files changed, 7 insertions(+), 6 deletions(-) rename adguard-docker-compose.yaml => adguardhome/compose.yaml (81%) rename dockmon-docker-compose.yaml => dockmon/compose.yaml (90%) rename gitea/{gitea-docker-compose.yaml => compose.yaml} (100%) diff --git a/.gitignore b/.gitignore index 73fcb95..fe934fb 100644 --- a/.gitignore +++ b/.gitignore @@ -7,8 +7,9 @@ traefik/certs/* .env.anna .env.forust traefik/letsencrypt/acme.json +dockmon/data/* portainer_data/* -adguardhome/* +adguardhome/data/* .python-version gitea/gitea-data/ traefik/logs/* diff --git a/adguard-docker-compose.yaml b/adguardhome/compose.yaml similarity index 81% rename from adguard-docker-compose.yaml rename to adguardhome/compose.yaml index 367c367..0b38acd 100644 --- a/adguard-docker-compose.yaml +++ b/adguardhome/compose.yaml @@ -12,8 +12,8 @@ services: # - "68:68/tcp" # DHCP - "3000:3000/tcp" volumes: - - ./adguardhome/work:/opt/adguardhome/work - - ./adguardhome/conf:/opt/adguardhome/conf + - ./data/work:/opt/adguardhome/work + - ./data/conf:/opt/adguardhome/conf networks: - traefik-proxy labels: @@ -21,7 +21,7 @@ services: - "traefik.docker.network=traefik-proxy" - glance.name=adguard # - glance.icon=si:adguard - - glance.url=https://adguard.${HOST}/ + - glance.url=https://adguard.forust.xyz/ - glance.description=AdGuard Home is a network-wide software for blocking ads. networks: traefik-proxy: diff --git a/dockmon-docker-compose.yaml b/dockmon/compose.yaml similarity index 90% rename from dockmon-docker-compose.yaml rename to dockmon/compose.yaml index 43f132d..6caae8d 100644 --- a/dockmon-docker-compose.yaml +++ b/dockmon/compose.yaml @@ -8,7 +8,7 @@ services: environment: - TZ=Europe/Bratislava volumes: - - ./volumes/dockmon:/app/data + - ./data:/app/data - /var/run/docker.sock:/var/run/docker.sock healthcheck: test: ["CMD", "curl", "-k", "-f", "https://localhost:443/health"] @@ -22,7 +22,7 @@ services: - "traefik.docker.network=traefik-proxy" - glance.name=dockmon # - glance.icon=sh:dockmon - - glance.url=https://dockmon.${HOST}/ + - glance.url=https://dockmon.forust.xyz/ - glance.description=Dockmon is a lightweight Docker container monitoring and management tool with a user-friendly web interface. networks: diff --git a/gitea/gitea-docker-compose.yaml b/gitea/compose.yaml similarity index 100% rename from gitea/gitea-docker-compose.yaml rename to gitea/compose.yaml From fd3d2affe754a37182fb19a029a93d8c6aaf2678 Mon Sep 17 00:00:00 2001 From: mr-forust Date: Sat, 15 Nov 2025 13:30:51 +0100 Subject: [PATCH 10/20] full refactor edu_master glance n8n nextcloud portainer traefik gitignore comments --- .gitignore | 28 +++++++++++++------ .../compose.yaml | 14 +++++----- .../compose.yaml | 4 +-- n8n-docker-compose.yaml => n8n/compose.yaml | 6 ++-- .../compose.yaml | 2 +- .../compose.yaml | 4 +-- .../compose.yaml | 8 +++--- 7 files changed, 39 insertions(+), 27 deletions(-) rename edu_master-docker-compose.yaml => edu_master/compose.yaml (95%) rename glance-docker-compose.yaml => glance/compose.yaml (85%) rename n8n-docker-compose.yaml => n8n/compose.yaml (88%) rename nextcloud-docker-compose.yaml => nextcloud/compose.yaml (99%) rename portainer-docker-compose.yaml => portainer/compose.yaml (89%) rename traefik-docker-compose.yaml => traefik/compose.yaml (93%) diff --git a/.gitignore b/.gitignore index fe934fb..e4c5b93 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,27 @@ +# FreeFileSync sync.ffs_lock .sync.ffs_db -gitea/volumes/* -volumes/* -traefik/certs/* + +# Environment .env .env.anna .env.forust -traefik/letsencrypt/acme.json -dockmon/data/* -portainer_data/* + +# Volumes and data directories +gitea/gitea-db/* +gitea/gitea-data/* +n8n/n8n-data/* +n8n/n8n-node-data/* adguardhome/data/* -.python-version -gitea/gitea-data/ +dockmon/data/* +portainer/portainer_data/* + +# Traefik files +traefik/letsencrypt/acme.json traefik/logs/* +traefik/certs/* + +# Python +.python-version +.venv/ +venv/ diff --git a/edu_master-docker-compose.yaml b/edu_master/compose.yaml similarity index 95% rename from edu_master-docker-compose.yaml rename to edu_master/compose.yaml index 60eefbb..0aa1fbd 100644 --- a/edu_master-docker-compose.yaml +++ b/edu_master/compose.yaml @@ -1,6 +1,6 @@ x-app: &app build: - context: ./edu_master/backend/ + context: ./backend/ dockerfile: Dockerfile args: - VERSION=${VERSION:-v0.10.2} @@ -100,8 +100,8 @@ services: nginx: image: nginx:alpine volumes: - - ./edu_master/nginx/nginx.conf:/etc/nginx/conf.d/default.conf.template - - ./edu_master/nginx/entrypoint.sh:/entrypoint.sh + - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf.template + - ./nginx/entrypoint.sh:/entrypoint.sh environment: - MINIO_PRIVATE_BUCKET=${MINIO_PRIVATE_BUCKET:-private} - MINIO_PUBLIC_BUCKET=${MINIO_PUBLIC_BUCKET:-public} @@ -142,7 +142,7 @@ services: image: minio/minio:RELEASE.2024-11-07T00-52-20Z restart: unless-stopped volumes: - - ./volumes/edu_master/volumes/minio-data:/data + - ./volumes/minio-data:/data command: server /data --console-address ":9001" environment: - MINIO_BROWSER_REDIRECT_URL=${MINIO_BROWSER_REDIRECT_URL:-http://localhost/minio-console/} @@ -173,7 +173,7 @@ services: - POSTGRES_USER=${POSTGRES_USER:-postgres} - POSTGRES_DB=${POSTGRES_DB:-postgres} volumes: - - ./volumes/edu_master/volumes/postgres-db:/var/lib/postgresql/data + - ./volumes/postgres-db:/var/lib/postgresql/data healthcheck: test: [ "CMD-SHELL", "pg_isready" ] interval: 10s @@ -195,7 +195,7 @@ services: image: ollama/ollama:latest restart: unless-stopped volumes: - - ./volumes/edu_master/volumes/ollama-models:/root/.ollama + - ./volumes/ollama-models:/root/.ollama environment: - OLLAMA_DISABLE_TELEMETRY=true - OLLAMA_KEEP_ALIVE=5m @@ -235,7 +235,7 @@ services: phpsessid-bot: build: - context: edu_master/phpsessid_bot/ + context: ./phpsessid_bot/ dockerfile: Dockerfile restart: unless-stopped environment: diff --git a/glance-docker-compose.yaml b/glance/compose.yaml similarity index 85% rename from glance-docker-compose.yaml rename to glance/compose.yaml index 0058dbd..f393688 100644 --- a/glance-docker-compose.yaml +++ b/glance/compose.yaml @@ -4,8 +4,8 @@ services: image: glanceapp/glance restart: unless-stopped volumes: - - ./glance/config:/app/config - - ./glance/assets:/app/assets + - ./config:/app/config:ro + - ./assets:/app/assets:ro - /etc/localtime:/etc/localtime:ro - /var/run/docker.sock:/var/run/docker.sock:ro env_file: .env diff --git a/n8n-docker-compose.yaml b/n8n/compose.yaml similarity index 88% rename from n8n-docker-compose.yaml rename to n8n/compose.yaml index a98dc0e..34aecbf 100644 --- a/n8n-docker-compose.yaml +++ b/n8n/compose.yaml @@ -13,8 +13,8 @@ services: - N8N_SECURE_COOKIE=false - N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true volumes: - - ./volumes/n8n_data:/home/node/.n8n - - ./volumes/n8n_local-files:/files + - ./n8n-node-data:/home/node/.n8n + - ./n8n-files:/files extra_hosts: - "enterprise.n8n.io:104.26.13.187" - "enterprise.n8n.io:104.26.12.187" @@ -30,7 +30,7 @@ services: - "traefik.docker.network=traefik-proxy" - glance.name=n8n - glance.icon=si:n8n - - glance.url=https://n8n.${HOST}/ + - glance.url=https://n8n.forust.xyz/ - glance.description=n8n is a workflow automation tool that enables you to connect various apps and services to automate tasks and processes. networks: n8n: diff --git a/nextcloud-docker-compose.yaml b/nextcloud/compose.yaml similarity index 99% rename from nextcloud-docker-compose.yaml rename to nextcloud/compose.yaml index 82db9c7..5720363 100644 --- a/nextcloud-docker-compose.yaml +++ b/nextcloud/compose.yaml @@ -20,7 +20,7 @@ services: - "traefik.docker.network=traefik-proxy" - glance.name=Nextcloud # - glance.icon=si:nextcloud - - glance.url=https://nextcloud.${HOST}/ + - glance.url=https://nextcloud.forust.xyz/ - glance.description=Nextcloud is a suite of client-server software for creating and using file hosting services. diff --git a/portainer-docker-compose.yaml b/portainer/compose.yaml similarity index 89% rename from portainer-docker-compose.yaml rename to portainer/compose.yaml index c265488..aefd9d6 100644 --- a/portainer-docker-compose.yaml +++ b/portainer/compose.yaml @@ -5,7 +5,7 @@ services: restart: always volumes: - /var/run/docker.sock:/var/run/docker.sock - - ./volumes/portainer_data:/data + - ./portainer_data:/data ports: - 9443:9443 # - 8000:8000 # Remove if you do not intend to use Edge Agents @@ -16,7 +16,7 @@ services: - "traefik.docker.network=traefik-proxy" - glance.name=Portainer # - glance.icon=si:portainer - - glance.url=https://portainer.${HOST}/ + - glance.url=https://portainer.forust.xyz/ - glance.description=Portainer is a lightweight management UI which allows you to easily manage your Docker environments. volumes: diff --git a/traefik-docker-compose.yaml b/traefik/compose.yaml similarity index 93% rename from traefik-docker-compose.yaml rename to traefik/compose.yaml index 9b99664..f30ff82 100644 --- a/traefik-docker-compose.yaml +++ b/traefik/compose.yaml @@ -44,7 +44,7 @@ services: - "traefik.enable=true" - "traefik.docker.network=traefik-proxy" - glance.name=Traefik - - glance.url=https://traefik.${HOST}/ + - glance.url=https://traefik.forust.xyz/ - glance.description=Traefik is a modern reverse proxy and load balancer ports: @@ -53,10 +53,10 @@ services: volumes: - /var/run/docker.sock:/var/run/docker.sock:ro + - ./dynamic:/etc/traefik/dynamic:ro + - ./certs:/certs:ro + - ./logs:/var/log/traefik # - ./traefik/letsencrypt:/letsencrypt - - ./traefik/dynamic:/etc/traefik/dynamic:ro - - ./traefik/logs:/var/log/traefik - - ./traefik/certs:/certs:ro networks: - traefik-proxy From de8834254ae259e0daabceee53474754ced89ae2 Mon Sep 17 00:00:00 2001 From: mr-forust Date: Sat, 15 Nov 2025 13:52:57 +0100 Subject: [PATCH 11/20] fix: updated network name for gitea-db --- gitea/compose.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gitea/compose.yaml b/gitea/compose.yaml index d77c99f..2956b7f 100644 --- a/gitea/compose.yaml +++ b/gitea/compose.yaml @@ -43,7 +43,7 @@ services: - ./gitea-db:/var/lib/postgresql/data networks: - gitea: + gitea-db: external: false traefik-proxy: external: true From ca8e29bb4f988c5e61e80b6323d645efd9f0bdf4 Mon Sep 17 00:00:00 2001 From: mr-forust Date: Sat, 15 Nov 2025 13:59:43 +0100 Subject: [PATCH 12/20] fixed traefix proxy network for n8n --- n8n/compose.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/n8n/compose.yaml b/n8n/compose.yaml index 34aecbf..390dbc8 100644 --- a/n8n/compose.yaml +++ b/n8n/compose.yaml @@ -34,4 +34,6 @@ services: - glance.description=n8n is a workflow automation tool that enables you to connect various apps and services to automate tasks and processes. networks: n8n: - external: false \ No newline at end of file + external: false + traefik-proxy: + external: true \ No newline at end of file From 6667971359dba87a13ca3121c68dd9e36960b80a Mon Sep 17 00:00:00 2001 From: mr-forust Date: Sat, 15 Nov 2025 16:37:31 +0100 Subject: [PATCH 13/20] fix: update Gitea and PostgreSQL environment variables for consistency --- gitea/compose.yaml | 14 +++++++------- traefik/compose.yaml | 2 +- traefik/dynamic/dynamic.yml | 5 +++-- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/gitea/compose.yaml b/gitea/compose.yaml index 2956b7f..376cda9 100644 --- a/gitea/compose.yaml +++ b/gitea/compose.yaml @@ -8,9 +8,9 @@ services: # Database - GITEA__database__DB_TYPE=postgres - GITEA__database__HOST=db:5432 - - GITEA__database__USER=${GITEA_POSTGRES_USER:-gitea} - - GITEA__database__PASSWD=${GITEA_POSTGRES_PASSWORD:-gitea} - - GITEA__database__NAME=${GITEA_POSTGRES_DB:-gitea} + - GITEA__database__USER=gitea + - GITEA__database__PASSWD=gitea + - GITEA__database__NAME=gitea #Server - GITEA__server__ROOT_URL=https://gitea.forust.xyz - GITEA__server__SSH_PORT=2221 @@ -34,13 +34,13 @@ services: image: docker.io/library/postgres:14 restart: always environment: - - POSTGRES_USER=${GITEA_POSTGRES_USER:-gitea} - - POSTGRES_PASSWORD=${GITEA_POSTGRES_PASSWORD:-gitea} - - POSTGRES_DB=${GITEA_POSTGRES_DB:-gitea} + - POSTGRES_USER=gitea + - POSTGRES_PASSWORD=gitea + - POSTGRES_DB=gitea networks: - gitea-db volumes: - - ./gitea-db:/var/lib/postgresql/data + - ./gitea-db/:/var/lib/postgresql/data networks: gitea-db: diff --git a/traefik/compose.yaml b/traefik/compose.yaml index f30ff82..3dcb7a9 100644 --- a/traefik/compose.yaml +++ b/traefik/compose.yaml @@ -21,7 +21,7 @@ services: - "--entryPoints.websecure.http.tls=true" - "--entryPoints.web.http.redirections.entryPoint.to=websecure" - "--entryPoints.web.http.redirections.entryPoint.scheme=https" - - "--entryPoints.ssh.address=:222" + - "--entryPoints.ssh.address=:2221" # Let's Encrypt STAGING. CURRENTLY USING CF ORIGIN CA INSTEAD # - "--certificatesresolvers.letsencrypt.acme.email=${EMAIL}" diff --git a/traefik/dynamic/dynamic.yml b/traefik/dynamic/dynamic.yml index e7c638a..a7b0efc 100644 --- a/traefik/dynamic/dynamic.yml +++ b/traefik/dynamic/dynamic.yml @@ -68,6 +68,7 @@ http: rule: "Host(`gitea.forust.xyz`)" entryPoints: - websecure + - ssh service: gitea middlewares: - security-headers @@ -78,7 +79,7 @@ http: rule: "HostSNI(`*`)" entryPoints: - ssh - service: gitea-ssh + service: gitea tls: {} # Glance (local only) @@ -163,7 +164,7 @@ http: loadBalancer: servers: - url: "http://n8n:5678" - + # Gitea gitea: loadBalancer: From 9cc34cba6576f0bdd5a4a6b0c34af5dd224a9a2d Mon Sep 17 00:00:00 2001 From: mr-forust Date: Sat, 15 Nov 2025 16:49:28 +0100 Subject: [PATCH 14/20] fix: remove Gitea SSH configuration from Traefik dynamic routing --- traefik/dynamic/dynamic.yml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/traefik/dynamic/dynamic.yml b/traefik/dynamic/dynamic.yml index a7b0efc..f548ae2 100644 --- a/traefik/dynamic/dynamic.yml +++ b/traefik/dynamic/dynamic.yml @@ -74,14 +74,6 @@ http: - security-headers tls: {} - # Gitea SSH - gitea-ssh: - rule: "HostSNI(`*`)" - entryPoints: - - ssh - service: gitea - tls: {} - # Glance (local only) glance: rule: "Host(`glance.workstation`)" From 653670698a5514ac43ab011cd300d0461881be93 Mon Sep 17 00:00:00 2001 From: mr-forust Date: Sat, 15 Nov 2025 16:53:59 +0100 Subject: [PATCH 15/20] Removed gitea-ssh service from traefik --- traefik/dynamic/dynamic.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/traefik/dynamic/dynamic.yml b/traefik/dynamic/dynamic.yml index f548ae2..81e8cc9 100644 --- a/traefik/dynamic/dynamic.yml +++ b/traefik/dynamic/dynamic.yml @@ -163,13 +163,6 @@ http: servers: - url: "http://gitea:3000" - # Gitea SSH - gitea-ssh: - loadBalancer: - servers: - - url: "ssh://gitea:22" - - serversTransports: insecureTransport: insecureSkipVerify: true From fb9c09b53207bf5d2112cf182193c0d92153593f Mon Sep 17 00:00:00 2001 From: mr-forust Date: Sat, 15 Nov 2025 21:45:44 +0100 Subject: [PATCH 16/20] fix: set external flag for nextcloud_aio_mastercontainer volume --- nextcloud/compose.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/nextcloud/compose.yaml b/nextcloud/compose.yaml index 5720363..aa03740 100644 --- a/nextcloud/compose.yaml +++ b/nextcloud/compose.yaml @@ -56,3 +56,4 @@ networks: volumes: # If you want to store the data on a different drive, see https://github.com/nextcloud/all-in-one#how-to-store-the-filesinstallation-on-a-separate-drive nextcloud_aio_mastercontainer: name: nextcloud_aio_mastercontainer # This line is not allowed to be changed as otherwise the built-in backup solution will not work + external: true \ No newline at end of file From 20086ec8de7a7026a6337941def3010cecb077fe Mon Sep 17 00:00:00 2001 From: mr-forust Date: Sat, 15 Nov 2025 22:37:07 +0100 Subject: [PATCH 17/20] fix: update parsing logic for half-hours and improve disconnection status handling --- dtek_notif/main.py | 138 ++++++++++++++++++++++++--------------------- 1 file changed, 74 insertions(+), 64 deletions(-) diff --git a/dtek_notif/main.py b/dtek_notif/main.py index 6637257..3896473 100644 --- a/dtek_notif/main.py +++ b/dtek_notif/main.py @@ -1,10 +1,3 @@ -# Раздел "ТВАРИ, ЧИТАТЕ ВНИМАТЕЛЬНО!" - -# Когда обновят сайт -- расскоментровать 641-646 и закоментировать 647. -# Поменять комменты 671 и 672 местами. - - - import requests import json import asyncio @@ -89,7 +82,7 @@ def get_day_statistics(day_blocks: List[Dict]) -> Dict[str, int]: # ============================================================================ def parse_html(html: str) -> List[Dict]: - """Парсит HTML с графиком отключений (нова логіка)""" + """Парсит HTML с графиком отключений (логика от 15.11.2024)""" soup = BeautifulSoup(html, "html.parser") cells = soup.select(".disconnection-detailed-table-cell.cell") @@ -103,56 +96,71 @@ def parse_html(html: str) -> List[Dict]: cell_classes = cell.get('class', []) - # Перевіряємо чи вся година вимкнена + # ПРоверка статуса отключения на весь час full_hour_off = 'has_disconnection' in cell_classes and 'full_hour' in cell_classes - no_disconnection = 'no_disconnection' in cell_classes + no_disconnection_cell = 'no_disconnection' in cell_classes hour_block = cell.select_one(".hour_block") if not hour_block: continue - # Визначаємо статус та підтвердження для всієї години - confirmed = None + # Проверка подтверждённости отключения для всего часа + cell_confirmed = None if 'confirm_1' in cell_classes: - confirmed = True + cell_confirmed = True elif 'confirm_0' in cell_classes: - confirmed = False + cell_confirmed = False - # Шукаємо часткові відключення через div.fill - fill_divs = hour_block.select(".fill") + # Проверка половин часа + left = hour_block.select_one(".half.left") + right = hour_block.select_one(".half.right") - first_half_data = {"status": "on", "queue": None, "confirmed": None} - second_half_data = {"status": "on", "queue": None, "confirmed": None} + def parse_half(half, is_full_hour_off: bool) -> Dict: + """Парсит половину часа""" + if not half: + return {"status": "on", "queue": None, "confirmed": None} + + half_classes = half.get('class', []) + + # Если вся ячейка full_hour - используем статус ячейки + if is_full_hour_off: + return {"status": "off", "queue": None, "confirmed": cell_confirmed} + + # Определяем статус половины + if 'has_disconnection' in half_classes: + status = "off" + elif 'no_disconnection' in half_classes: + status = "on" + else: + status = "on" # По умолчанию считаем включенным + + # Если выключено - ищем подробности + queue = None + confirmed = None + + if status == "off": + disconnection_div = half.select_one(".disconnection") + if disconnection_div: + # Ищем номер черги в title + if disconnection_div.has_attr("title"): + title = disconnection_div["title"] + if "Номер черги" in title or "Номер черги:" in title: + try: + queue = title.split(":")[-1].strip() + except: + pass + + # Определяем подтверждение + disc_classes = disconnection_div.get('class', []) + if 'disconnection_confirm_1' in disc_classes: + confirmed = True + elif 'disconnection_confirm_0' in disc_classes: + confirmed = False + + return {"status": status, "queue": queue, "confirmed": confirmed} - if full_hour_off: - # Вся година вимкнена - first_half_data = {"status": "off", "queue": None, "confirmed": confirmed} - second_half_data = {"status": "off", "queue": None, "confirmed": confirmed} - elif no_disconnection and not fill_divs: - # Вся година ввімкнена - first_half_data = {"status": "on", "queue": None, "confirmed": None} - second_half_data = {"status": "on", "queue": None, "confirmed": None} - else: - # Перевіряємо часткові відключення - for fill_div in fill_divs: - title = fill_div.get('title', '') - style = fill_div.get('style', '') - fill_classes = fill_div.get('class', []) - - # Визначаємо підтвердження - fill_confirmed = None - if 'confirmed' in fill_classes: - fill_confirmed = True - elif 'possible' in fill_classes: - fill_confirmed = False - - # Парсимо стиль для визначення часу - # --start:0;--size:50 означає 0-30 хвилин (перша половина) - # --start:50;--size:50 означає 30-60 хвилин (друга половина) - if '--start:0' in style or title.endswith(':00—' + f'{current_hour:02d}:30'): - first_half_data = {"status": "off", "queue": None, "confirmed": fill_confirmed} - elif '--start:50' in style or (f'{current_hour:02d}:30' in title and title.endswith(':00')): - second_half_data = {"status": "off", "queue": None, "confirmed": fill_confirmed} + first_half_data = parse_half(left, full_hour_off) + second_half_data = parse_half(right, full_hour_off) schedule.append({ "hour": current_hour, @@ -168,6 +176,7 @@ def parse_html(html: str) -> List[Dict]: return schedule + def get_voe_html(city_id: int, street_id: int, house_id: int) -> str: """Получает HTML с сайта VOE""" url = "https://www.voe.com.ua/disconnection/detailed?ajax_form=1&_wrapper_format=drupal_ajax" @@ -582,7 +591,12 @@ async def cmd_info(message: Message): await message.answer( "ℹ️ Про бота\n\n" - "🚀 Версія: 2.1 (Оптимізована)\n" + "🚀 Версія: 2.2 (Стабільна)\n\n" + "📝 Реліз-ноути:\n" + "├ 15.11.2024: Адаптація під оновлену логіку сайту VOE\n" + "├ Виправлено парсинг half.left та half.right\n" + "├ Покращено визначення підтвердження відключень\n" + "└ Оптимізовано обробку статусу для всієї години\n\n" "⚡ Функціональність:\n" "├ Моніторинг графіку 24/7\n" "├ Сповіщення за 5 хвилин\n" @@ -645,21 +659,18 @@ async def cmd_tomorrow(message: Message): return try: - # """Закоментировал до лучших времен""" - # await message.answer("⏳ Завантаження графіку завтра...") - # html = get_voe_html(VOE_CITY_ID, VOE_STREET_ID, VOE_HOUSE_ID) - # schedule = parse_html(html) - # text = format_single_day_schedule(schedule, 1) - # await message.answer(text, parse_mode="HTML", reply_markup=get_main_keyboard()) - await message.answer("❌ Функція тимчасово недоступна. Чекаємо на оновлення сайту", parse_mode="HTML", reply_markup=get_main_keyboard()) + await message.answer("⏳ Завантаження графіку завтра...") + html = get_voe_html(VOE_CITY_ID, VOE_STREET_ID, VOE_HOUSE_ID) + schedule = parse_html(html) + text = format_single_day_schedule(schedule, 1) + await message.answer(text, parse_mode="HTML", reply_markup=get_main_keyboard()) + # await message.answer("❌ Функція тимчасово недоступна. Чекаємо на оновлення сайту", parse_mode="HTML", reply_markup=get_main_keyboard()) except Exception as e: await message.answer( f"❌ Помилка: {str(e)}", parse_mode="HTML", reply_markup=get_main_keyboard() ) -# Когда обновят сайт -- расскоментровать 641-646 и закоментировать 647. -# Поменять комменты 671 и 672 местами. @dp.message(Command("check")) @@ -675,8 +686,7 @@ async def cmd_check(message: Message): new_schedule = parse_html(html) prefix = "✅ Знайдено зміни!\n\n" if schedules_differ(last_schedule, new_schedule) else "✓ Графік без змін\n\n" - # result = prefix + format_schedule_message(new_schedule, days_to_show=2) - result = prefix + format_schedule_message(new_schedule, days_to_show=1) + result = prefix + format_schedule_message(new_schedule, days_to_show=2) await message.answer(result, parse_mode="HTML", reply_markup=get_main_keyboard()) except Exception as e: @@ -703,9 +713,9 @@ async def handle_text(message: Message): elif text == "📅 Сьогодні": await cmd_today(message) - # # Кнопка "Завтра" - # elif text == "📅 Завтра": - # await cmd_tomorrow(message) + # Кнопка "Завтра" + elif text == "📅 Завтра": + await cmd_tomorrow(message) # Кнопка "Оновити" elif text == "🔄 Оновити": @@ -733,7 +743,7 @@ async def handle_text(message: Message): async def main(): """Главная функция""" logger.info("=" * 50) - logger.info("🚀 ЗАПУСК БОТА V2.1 (ОПТИМІЗОВАНА ВЕРСІЯ)") + logger.info("ЗАПУСК БОТА V2.2 (stable 2.2, 15.11.2025)") logger.info("=" * 50) if not TELEGRAM_TOKEN or TELEGRAM_TOKEN = os.getenv("TELEGRAM_TOKEN", "YOUR_TOKEN_HERE") @@ -744,7 +754,7 @@ async def main(): logger.error("❌ ALLOWED_CHAT_IDS не конфігуровані! Напишіть ID в .env файл") return - logger.info(f"🔌 Дозволені чати: {ALLOWED_CHAT_IDS}") + logger.info(f"📌 Allowed chat ids: {ALLOWED_CHAT_IDS}") logger.info(f"⏱ Інтервал перевірки: {CHECK_INTERVAL} сек") logger.info("=" * 50) From dda346b1f724a175c69926004d6edf3bd5fd8a20 Mon Sep 17 00:00:00 2001 From: mr-forust Date: Sat, 15 Nov 2025 23:31:02 +0100 Subject: [PATCH 18/20] downgrade to python:3.9 docker image --- dtek_notif/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dtek_notif/Dockerfile b/dtek_notif/Dockerfile index 52d4464..7860cf1 100644 --- a/dtek_notif/Dockerfile +++ b/dtek_notif/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.11-slim +FROM python:3.9-alpine WORKDIR /app From d4bbbac7ae156c889c03a1a77c694ebe922ea747 Mon Sep 17 00:00:00 2001 From: mr-forust Date: Sat, 15 Nov 2025 23:36:50 +0100 Subject: [PATCH 19/20] hotfix: external volume was breaking nextcloud --- nextcloud/compose.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/nextcloud/compose.yaml b/nextcloud/compose.yaml index aa03740..987c542 100644 --- a/nextcloud/compose.yaml +++ b/nextcloud/compose.yaml @@ -55,5 +55,4 @@ networks: external: false volumes: # If you want to store the data on a different drive, see https://github.com/nextcloud/all-in-one#how-to-store-the-filesinstallation-on-a-separate-drive nextcloud_aio_mastercontainer: - name: nextcloud_aio_mastercontainer # This line is not allowed to be changed as otherwise the built-in backup solution will not work - external: true \ No newline at end of file + name: nextcloud_aio_mastercontainer # This line is not allowed to be changed as otherwise the built-in backup solution will not work \ No newline at end of file From 9af0c5d98f30d3521263df250a67c00d7ed3ac9b Mon Sep 17 00:00:00 2001 From: mr-forust Date: Sun, 16 Nov 2025 01:04:02 +0100 Subject: [PATCH 20/20] annoyed of traefik log err spam about glance --- traefik/dynamic/dynamic.yml | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/traefik/dynamic/dynamic.yml b/traefik/dynamic/dynamic.yml index 81e8cc9..f8355c2 100644 --- a/traefik/dynamic/dynamic.yml +++ b/traefik/dynamic/dynamic.yml @@ -74,15 +74,15 @@ http: - security-headers tls: {} - # Glance (local only) - glance: - rule: "Host(`glance.workstation`)" - entryPoints: - - websecure - service: glance - middlewares: - - security-headers - tls: {} + # # Glance (local only) + # glance: + # rule: "Host(`glance.workstation`)" + # entryPoints: + # - websecure + # service: glance + # middlewares: + # - security-headers + # tls: {} # Watercrawl (local only) watercrawl: @@ -139,11 +139,11 @@ http: - url: "https://dockmon:443" serversTransport: insecureTransport - # Glance - glance: - loadBalancer: - servers: - - url: "http://glance:8080" + # # Glance + # glance: + # loadBalancer: + # servers: + # - url: "http://glance:8080" # Watercrawl watercrawl: