From b367b6487900de38bfa9d5c097d0c26f2197c5fa Mon Sep 17 00:00:00 2001 From: mr-forust Date: Sat, 15 Nov 2025 23:42:03 +0100 Subject: [PATCH 01/18] fix: removed ssh port-forwarding for gitea --- gitea/compose.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gitea/compose.yaml b/gitea/compose.yaml index 376cda9..e3d7350 100644 --- a/gitea/compose.yaml +++ b/gitea/compose.yaml @@ -25,8 +25,8 @@ services: labels: - "traefik.enable=true" - "traefik.docker.network=traefik-proxy" - ports: - - "2221:22" + # ports: + # - "2221:22" depends_on: - db From 625eb9561b92e62d5492b4ea46a9a78ca4abc0db Mon Sep 17 00:00:00 2001 From: mr-forust Date: Sat, 15 Nov 2025 23:48:35 +0100 Subject: [PATCH 02/18] testing: removed https:// from root url --- gitea/compose.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gitea/compose.yaml b/gitea/compose.yaml index e3d7350..9b70a93 100644 --- a/gitea/compose.yaml +++ b/gitea/compose.yaml @@ -12,7 +12,7 @@ services: - GITEA__database__PASSWD=gitea - GITEA__database__NAME=gitea #Server - - GITEA__server__ROOT_URL=https://gitea.forust.xyz + - GITEA__server__ROOT_URL=gitea.forust.xyz - GITEA__server__SSH_PORT=2221 restart: always networks: From 0dfb09590def7e257204ce2c210185b92d42a806 Mon Sep 17 00:00:00 2001 From: mr-forust Date: Sat, 15 Nov 2025 23:55:02 +0100 Subject: [PATCH 03/18] fix: added ssh domain --- gitea/compose.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/gitea/compose.yaml b/gitea/compose.yaml index 9b70a93..f392306 100644 --- a/gitea/compose.yaml +++ b/gitea/compose.yaml @@ -13,6 +13,7 @@ services: - GITEA__database__NAME=gitea #Server - GITEA__server__ROOT_URL=gitea.forust.xyz + - SSH_DOMAIN=gitea.forust.xyz - GITEA__server__SSH_PORT=2221 restart: always networks: From 6843befac3323c09a64f38c6eb62356d9a4ad995 Mon Sep 17 00:00:00 2001 From: mr-forust Date: Sun, 16 Nov 2025 00:01:35 +0100 Subject: [PATCH 04/18] fix: temp labels for routing SSH for gitea --- gitea/compose.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gitea/compose.yaml b/gitea/compose.yaml index f392306..b7986ff 100644 --- a/gitea/compose.yaml +++ b/gitea/compose.yaml @@ -26,6 +26,9 @@ services: labels: - "traefik.enable=true" - "traefik.docker.network=traefik-proxy" + - "traefik.tcp.routers.gitea.entrypoints=ssh" + - "traefik.tcp.routers.gitea.rule=HostSNI(`*`)" + - "traefik.tcp.services.gitea.loadbalancer.server.port=22" # ports: # - "2221:22" depends_on: From dc75dbaf7c152c20c4c12f90fe1aefd9c4b4f9a5 Mon Sep 17 00:00:00 2001 From: mr-forust Date: Wed, 17 Dec 2025 03:03:32 +0100 Subject: [PATCH 05/18] chore: disable logging on pre-dormant period --- traefik/compose.yaml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/traefik/compose.yaml b/traefik/compose.yaml index 3b6e66e..b4c87dc 100644 --- a/traefik/compose.yaml +++ b/traefik/compose.yaml @@ -33,12 +33,11 @@ services: # 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" - - "--accesslog.filepath=/var/log/traefik/access.log" + # # Logging + # - "--log.level=INFO" + # - "--log.filePath=/var/log/traefik/traefik.log" + # - "--accesslog=true" + # - "--accesslog.filepath=/var/log/traefik/access.log" labels: - "traefik.enable=true" From 163ea867ce20d82b560ff4d8a33db05dec462c88 Mon Sep 17 00:00:00 2001 From: mr-forust Date: Sat, 20 Dec 2025 02:00:10 +0100 Subject: [PATCH 06/18] feat: downtify service, traefik integration --- .gitignore | 1 + downtify/compose.yaml | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 downtify/compose.yaml diff --git a/.gitignore b/.gitignore index 592cc49..6cc9cbd 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,7 @@ uptime-kuma/data/ termix/termix-data/* cfddns/config.json checkmk/checkmk/* +downtify/Downtify_downloads # Steaming services files streaming/jellyfin/* diff --git a/downtify/compose.yaml b/downtify/compose.yaml new file mode 100644 index 0000000..06f92f7 --- /dev/null +++ b/downtify/compose.yaml @@ -0,0 +1,39 @@ +services: + downtify: + container_name: downtify + image: ghcr.io/henriquesebastiao/downtify:latest + # ports: + # - '7077:8000' + labels: + - traefik.enable=true + - traefik.http.services.downtify.loadbalancer.server.port=8000 + + # Prod Router + - traefik.http.routers.downtify.rule=Host(`downtify.forust.xyz`) + - traefik.http.routers.downtify.entrypoints=websecure + - traefik.http.routers.downtify.middlewares=security-chain@file + - traefik.http.routers.downtify.service=downtify + - traefik.http.routers.downtify.tls=true + + # Local Router + - traefik.http.routers.downtify-local.rule=Host(`downtify.workstation.internal`) || Host(`downtify.internal`) + - traefik.http.routers.downtify-local.entrypoints=websecure + - traefik.http.routers.downtify-local.middlewares=security-headers@file + - traefik.http.routers.downtify-local.service=downtify + - traefik.http.routers.downtify-local.tls=true + + # Dev Router + - traefik.http.routers.downtify-dev.rule=Host(`downtify.gigaforust.internal`) + - traefik.http.routers.downtify-dev.entrypoints=websecure + - traefik.http.routers.downtify-dev.middlewares=security-chain@file + - traefik.http.routers.downtify-dev.service=downtify + - traefik.http.routers.downtify-dev.tls=true + networks: + - traefik-proxy + + volumes: + - ./Downtify_downloads:/downloads + +networks: + traefik-proxy: + external: true From 4471da827cbeb2c783502db85de3b1e857f16fac Mon Sep 17 00:00:00 2001 From: mr-forust Date: Thu, 25 Dec 2025 19:41:25 +0100 Subject: [PATCH 07/18] kek --- homepages/xdfnx_files/favicon.ico | Bin 0 -> 176704 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 homepages/xdfnx_files/favicon.ico diff --git a/homepages/xdfnx_files/favicon.ico b/homepages/xdfnx_files/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..828259e73d9c94a15fea6e9dcfd4787fa94a916c GIT binary patch literal 176704 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 LQ Date: Thu, 25 Dec 2025 19:54:32 +0100 Subject: [PATCH 08/18] kek --- homepages/xdfnx_files/favicon.ico | Bin 176704 -> 43006 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/homepages/xdfnx_files/favicon.ico b/homepages/xdfnx_files/favicon.ico index 828259e73d9c94a15fea6e9dcfd4787fa94a916c..93ed59e3a7861f5a93e00c5ee688f2e9cb4f6e8c 100644 GIT binary patch literal 43006 zcmd^|J!>pkddH8fWiJ~T33h^u!K+FP6E--v8V7c&$m#8HvMVqc2R2>f4aSL)z~IQZ z1d}+j#@PnOtzj^;!Q$Re;G^+;0JWJ!3qs}J|5TmoQ>Uw{t6!?6d*^|_o^zh_yq=fp z>h8LIjX5%J%y?|ziTU(Tjrl8M%xF~f|MicI`4?oLep>WD`vYVC>@#DMq#Qpr=HLF# zn740>{@?%1n7{Z(V?Oz$=>O`c#{ADe8*_@D{D1ZnWB%z&{1JnYCIyl^BF;L>^Lzp< zcu;$t{RLx@YR?nuxdFb`K3wy04Y1ve;$-_;W0!ylu%Itl6kFEHt+#6EQ*W1!e6++^ ztu9V{RiiFJUv;Ozf=x*KEUA0*J-6m|54HPwk*}6mK4!t=0_vmn9=d(kdxq{6&~;!8 zlDem`mygJGpS6c`fbVW1w;DBRqo6gnHO19VhDi1H-h0Iw4N`kJ2T4;+UKW?(<(@Ns z3AA^c$RgC9NW6Z3?#}xV>+Wm!oEYsC7ZqwUmd4{{-@>P%?&fWGz4kc{&9B??i|g}x z$Zz7YvY){dueTkS{m$3yorS0~!4conb-o^}=)Kt5mvddu zDXM#yuJ+8N?!Bq^(bliIvrQG(Wv_1kTP40HS~*|!+SPNP+Z_7b`*=;)zjxHGy}K(} z9K2htHra z^4_O*es#ceK&;nDgMRksUt8?!Irs4zxO1TVe6IWE@}0y{UswNSKmUFmbFue*@ByrQ zJoD~zv3*<{{jRINv$xF@w@s-2gsH+x&H0^;GeJvoTcVKUOpsRk35liPSrptA9 zuWg(H^qlGn^~n<>8yRZ;lRmbuL5EyNpmERi$xpR5*jvf_*uSJsnY(grq`tXf{Jz0~ zMfPgvK)C_s*h+otmmW^04UR0bS2qXB2`INt+NAz+4zdP^7TIW1Uqk7WOIz(3V>Q|) z2OP|5PKu7MFE9SOpd3KcwQi356x3*&`elQYtmbIhxuuzG>vvl_#RNCYG-|Eto~0(G zvu!-tVSW|+EBl)N6rAqjzprf>%fg#z8v2P9!m(}I_Ug^%jI?)0kyr5#mf{V>uNx!M(gyq9VdvN z2U`oc-;R8153Q}+*Aa*J@*z1fwU4iW1-sH52N@V|lQVV}c;b8V!xDkDFSKTwk6WO6 zEQrY>(3o^mZ~>BCv&F|d@Bl1$7yDaqOK^5~oG*k>8oWG3I>1ox-CrXNzZZ zyfEfu@o1*^#=Kc9j?sYMpNStY?#}a+pBPvek`_NI?lDlqgE5OYB|jhvreLHIT}4vm|BBhN2+OPxLzxBQOE}cOp`LlcI~T)&3Nv zU3&2t`U%j!z6LX3fu{!=7qLyz*E!I=O+EwRb1$}(rSQ{c+f}I#D84#cm!P7YCtwb` zXk52c&*gmscaztcGZC|*Py=BCY&E!SNHzftxrQFpcJtnr)28yqby%jg z-2Y{MI)fouI^#IQ_P*Qi+w7UPy5uW~|DF02m>C#Kw`XKUWF50Me zU*`AizPJseGU3xrCOy!dhJNbp!=2xH+G1=v}`hwewl%xYmWShHATY*k&)uW@X;F zh9@8uA1dQjzwSJ6{(7%PhHhhi!~AI<==ETKGepidsA04}&xi3u?z15O@nNFwFABNqGfPkD{yZPX6N&3{S5KVz z4~s}#*Z+_{#51hV7(7irtQF9!hWiZD=g;fNheaeF@1gO~6%aG^6Sg5wn{vZP7Wf%_ z4T4x3H(T473E17lqmo-eK8<3@) z^s(JVM=^k6g)|L2ef?uov!nk22D>iFcNqg#(Ny_XJsN%UFYVr8qP#zr%PA9 zfCV8b=7qNl2fVB=$F^-h&KT32ZG66E117+Nm@I-M%r8_3<(steF$M8j$hBlMpjs|~ z>aA*08;pSFIR!J&MsB~vd4W{ssr)Xlwp~)r)7eChKh<#wW?);I zW2imUnzzp>4B%z^;`mlA%Hs;$0t@2xk!%K}a{<=o9Oj4q6o_j3>-#+Y6NBXYC-c|l z48AZ6a{|9Vy63;QG2f@>cjg#=#P_&I#{BP_g7bKibANwU^7E2UOI}{)?)CH;6m#-$ z@_;-4^gVZR>AO7OF0V5^=yc{D{CZa2^r7;BupZn!eudr_rJd(I=k=s|zbQG-dAa_* z^pG#6dHyVZ&H()JOpj+7^K?RD@Mj#~|2fxrp65!xg{S9FN8z~sa^M3`kQC{o~+cqA{(I0~pXkX321MqZ5qqk+-h9 zPSqZZ*RgMZ68iUfNJjeFW-IJFpkTFKa#;_W#7V+P;Y(PoyER$ zv`%m0~PR}G<^@*^%&Q`x6J>5O-CLY|qjP}yHGow8_ zi9K^o({+!rA<5m-a28kY@8_j#(iYucbKAyWT26kt7Z43}mUpX=y!?IWXg5#8Sd-ta zCJ!3;db3^r~-hheSAZCvIz@EP8|4)U{Qj^pjU3};DhS()E!UE`$8Pb?W? zCh%+JyeF;fHSDs|c91#5w=MnmV(}bdq&c*uF|S33CE{L|u^nrQ&cLM9(Q8W5q%(w! zSR>$H$6N|+aTvUE3dLLwo+Gisb@Q?Fw)`Z=W*+1?*y~=D+pLW3La)hBpAXHP;>Mp3 zb$MQn;amI7uc_wav~Pai3pUk!)1HCEk8R841Ka>lwR?Fl?CT%>_rTXF^9+pp+Iv0O zfG{shf8xhIN9M@)`)~}j-r-!zhXvPQ0utcXNB-0XBX9wflLaAVbdsjnUa4tpoeW#W zoq}*a>GmRvRt6gL^066r3;PvNEM|Wp*=J&_? zddkexU+C)^Ge3UP*Hh-dPagI4l==1fqTtg7J!9_l#S8Rx$-gQ2oqqiQ^4$HZ0R1KB z-_yH(;a6V=DGuKPxwz!!@;IlibL4Qn@iS*V`BkasIp0Iw$^W+{=XEZ4`L|6tjtDOJ(<7 z_d1B_W5--ND>LDpdw=v*@3ohgdm1j)u3z~s?-kew1^K{m3wqSOwA`V7)@LPtkjhHadi^EedhUt6JnuxZE74X3P4PE5 zcV)~f=LUbv%KEi-`nQ6$GuSU)tmUq^ab11;1BuH#GSb4yw5yjTpx?ry3g{Ic=;hY!Lu>}&d6?rA6xqBVw}w-p_l~9 z$#P`#7Jh8ttF;+>MsZpyTln73qI?4Rb`-}~p8;Ep>ieqw5`J$=-;OnTXF%&G{u*Up)d#OkK1(D$s2s>-riA{Eec@{($6I8vI)ne3vPfXOT*cF zL8#xVm8T8RxR@J;0*i!$xuyVpWZx{ zuj^x{8YdtFa}egEwqzNQPE~L0moY1N`TXwkWX`7|zd1^eetni6-A(lwik^!taCbr< zRCf}3j@9Ar_&i^noa5{)!U_E=e#r0(z~>s@d=KvVIAbw=K7KrV{Q1*S`p3Bcflokw z(B~9y!3g-zDJDPj+0{92ZCz6IkSD;ey`LBHi&A4k1-b_!tiueRg4#Tx&-jw)%I^)Z zAOmBN1RAt!_gUV*=a%tGAKS`5P35Z`r%QifOSyIW4q_B`_;UVXDX^f59eOUcQ~Y}$ z>-a=A_!B8_3lhoNX`|oaVQnh^J$x718|3fjg|xNqeW>@`lym3u_j^xqVzTw9wf(qm z{%3XDKD~{eMN0d4T-E8jKkMgg)lZv5d#p1Cb6V^}CVSH6rCaXK*%Uv_akb{UR@D4y zF}wZjHi~=gowMD%v|HnQ2FC3gyN%#m*M)31FYVU&PJnIKXdjUsXrl*ji9!Za-`|zX z7pV3PP1T@vPWIs2%?G|J|ME%qJ+NTw7_u#WXiaPW%NWygeB&6{dEe90*NXpA?(0ag zsl85Xyou10uIBgBkJE1SuW^Qy%M8fo8eD)Ru+{h&+yDzQP>oBEeyjh$&naqCFas8N zQrsEPJlFgNwpQ)`{JmrItG7qy-xo*b%LV_Q30#2;q?hCY*H1#{k4I+8KUkWQ)_I8M zBa`L7GgtZl@txCm=KK7=_>Sox%;VcXG|%R5-Su_bq( zlf^#b{zUrNi?lyf+v(Cr*s8sL#D08#7WlL6zMPik%G-5tm)`@vVzOa&{d{SC`cnUT z`+4kjzcTLU%WHK$>pYbflQ!|%{kYpVGc5i3s9pKcBJ}gqPYZY2bHN$tXV<2MFL$om z#y6GYZvwvB)UHb(e-M=VUh!ATFBp0NGoX1$Bp1;hm9ks7Roe{|V~zeaj-Kj} zFKLV3yH41dTX8>72 z=!jJNHLzd;%CqTg{WU@M9+Ej9=!z8Y3PgLc^LqM~GLSKp71_jptLu@E8*yi^IzzHc zFIB#gou7-PW^=2Ww8j{vn|@NvwQl8F_p=GL zu+6|Elx@<+HUSny`=;)t)PYsR{woNH_T9DbujA<6$cxvbslBgxki0dIQcq_@x|O~B zlw-={0i+-a{Ez5QfCbV~yqbNWJ1%vsbV^dZ41_+dY`)@QvCrXOfDGsvD>)XX3`}X9 VmpJN=s==g%&LViWK({+zEszga`qG6A13^1ef5&B?O0{ zfndR13hn#mKgk@M%gLTaAp866?cVOr%(Hnj^XAPPg(90Ghr-rY!LCk3_*;3dOk^3Wb|na{4AL z{V;{1ef#9^BU$=O3Po^m^7q-ZDZcj1roe&n@BO4uH1qqPq9psziegWap0kTW!QfCm zYzNscW9K_|k~nP!+K{EcC0Y4dk)@v{zsEE2KKY6?DbnT~l#_D$=cIB&%aQvWcM4h) zM1$81rgpR2QQ4to`8#|g$wyf(o)-=(OhIdd=*rzI^#0%XBo5r;+2FN<`8O(g@cgWN ztf=SGp7h^;|A}O&u6T!U@T~*}$~`DIxlMAT)(czHi?=UQr4tYE4&UHgq(L5_OZk!I zX-C`+`aa@&ntf!p_&n8h*5O(7{rK-`$Auj{4bocqTam{i4|@0h9rcOoL&d|3)84Cl zQ>Dc-yz3R!i~f244^M-%ID zH9cMo+cAu+1FY$%i9gYS_yhc`G@%k%1z1towlI+;1#J#WO3$9VFLqb*>;8-TRBu*2 zE;A)Zlq8&xr9Wr=N%vmd4fx9>btt9DrT2+0Z?|PXBx0%0L|Sqmo^^XNE>1{(45_K z$ZN3|{WSb1{*8=sQov#3XG1@Q|3vfto=5kdB-I@*z$!n9PZDYF-*c%_cqOv&Po<|* zQ;YSS{AcRb7mUeEIGD>r{#Gt zSys&-a$F(20#z7Qf&4f5Ysf|OW511lJneVk-zoKnv<$m}b~J16EOKA!P9;W^pwo9w zYtBsN&6zuAxV~$*q#e%#c}erO9%xO!jQxckK7UA)_fO_^v;ETcTH72^1oVjek|doO zxi6CEfxM8XCxp40Sl^$7|at+Ew;XA|W-~av>fj-caJ8AAr3rm=!M4f8q<^4Pg3MR=g^!K?F{HQV9kIO-{4Q|tylu? z$R98OADpeB`o4wTv0}wg>4A+eNoIJ4kLJo=eRtT;l;$n&Q5RjpTqy70yks}njtYhpq>AGz(tz~?=;)23bTr{8 z`E2l^@5X&c1wsn&Z}2VBAg#zp+ZFKI4YH#~vm4Q}*kyG4>1`zq#0{P;Ke3z|&1uBH zMH+2+s(Xk2RON}4$!DDp%{{`}$Fm!0)45GF@5nszUGGc3MgB(iLH4@x)z}83OvoAP zhwVUH%ERh8PTb>}stl@uQC1&9O*&mL<2}z?wLfI)|LBJ~v9k(0F%IMh27oFDgQoyH zXRz}*JLSM{if>RB$`ob)r*GLpmqGrdbytskP^N6Wq1!P2weqr}JYIRo$=8WW2C(rA zI~{!-$*#X0e}`|RI#CBaI%&?!W#iNQ-ucOGlpBSw38$^GTj|X8Gj#3lHM)BDDxHcy zMVpUrreRUT_&4|#V_H4nP|H)B02|8VorjuDY(`s8Y^CR~o(nag@%rr5GyZMUiA~AQ z+m4Wj4jQO^kAAD`AXl2Ta~8dP^HO7ZnqItk{eouhoJqw4i_7i<3pml&%dSV}7 zPqiXy@$oL&cw>)6#}`rFpu9X!FJxN27`d{cEdRh zdE1ISTg_;dvi~a4cc?1`1{R_&cpjehi@F_d7}(< z^%8x9I+1ng#hVwr-&cKVb#5m?KQ8uWtlluhB*gH39&9aDr&Og!uO9Kd>rSexc6@8? zZ%re&j#QR|J}Kk{aKTn{`&sI~fbwIN8}t$C&P*x?`g!E85BZ`Dl%>l5yo2&m^x0@- zPM05C=6!vn$Ju2?7j8dMexTt7Jjb^p9q4!Q{zc{2CYrCBzLEaHJKv4I{9B{}3`4dJk$%F?G^KbAi`Z%!DU4L{v#kVK}WuZ(#1KgJ$UYf2w zxR&Bu{6SwH{WatXT0ouyHwUH|qdtH8oB}olD9gsTsPh;vsUGUe$M?=dQqv!4fmg?6 z9hEYRZ!u=*v!)L{c=>=}U+lHISJL=~y#r2=S&WTezD?b3oVt06oI;&a&>v~?2Ii$L zXSb+=%m1HCJVzDARZ!9lFd$8XISr`6><0W^JOeFZufteC-Ld)XW?q({y|@DA@aS-L zN%%92YtgTl>TvK_+Ly(<{2}?(j=x04!=jVyxuRTgMftU-)~08#pNUUXT;Kisjs|WX zsC6uXaRzJvut%#qkhj}ZHzhAc*|>s!`GfM)=5w3XCFRe+@0!zUrodU`0Xo!}R)fof zrVNlb$`HH~X~h*ZXga4U*OThXtWlSg+kKnNX`&W)kq53A zr%c~JJw+a{Q%^rMosS`<^;Vh=_jm{U#PoyHQ}JN(-pMI!6RK&&f8+)~a)e#Nl=o|wf9qKH2iW7DX=P+j~9bTGBk0{M;9Qg+4Q@+}%2x21DRhmu8KG?&{uWhG#-%jD{6@4f9==UY2Ch z*Mcm1v$JRNiF@`8@1Xnj(1E((GEUx^-4ifd^s%5^J#tZTui{j5NKNvXhI-BHMXL|4 zrptFO)AQHQ)y`r4`|rO58`Q;H7ir~zmDFQ;4=U|ln&*MMjKD#!w6I@U^|7LF1HPp( zYsb))J6DwRTq;er*1zyk0luTxj^=qGPq}lthT;l3IrMWN|3&`XzNi&IJzm0A>9fFx z3VAYL3^VZp_StU-eoGsVZ8V79y3m1qA@7QT6}i3FP#UXCXVu?|%KDY1BbSco0>kL{ z$1We^WuZ)Uu;}~D#@mK+bjd;87I!lmHn|yeUeuYFiL&*DSNc74wM`G!SMP7hZAaRC z#^l1L>$~^=y(f=l9=uGH4H%>_$-Rety|7PVsy?_+P5^^Jj5UE1X*mvb8x#*DD*`7QM$Yp)OESUL2E z9rN3eZz=v>JhyR*@kyPTb-2A%UAd-s2EPEcOc>TOrC4{2se$ECD7>@JgRU*2;yHqpOKY^ZM`&!MIzD z|6%t%aqEQ1QGnkB{3lQj`gbM5ODKIz01IG}Qx7md*Jn{5Wg7*X8T^DGkH8bWZ92ax zJ$(7lWH>x{@qpmlfV@!#%4)r+wbBm~dJizE`ol`;F7EAo?P%@swJBhO4FvXK@eQs6 zHw{c>i%OA5<{!`p^;DWS>_Dn>RBL0_5@3^lr+N?Gl?p9ISMPoB2>}?eC1b8c&k3drv$8+s}MK?SJ(uj zPDe?L(d!;IP2u+>@`ddWzEY|O=C5i^sHJh94e4PM>o~uoQud{JBtB21DwC@yd4TVM z1ANzZUfL=BRMtJxAT9C`u!HuMCsn39&+eqk19bqf0Y>q?>J@YReyjabr4$)G=-Tb$|^pO3Rnt<6Y>6P>toow-CBV)B}+g z|KWdi==vdzX~hfpidP(8QEeWWlU4O?6X|dTY`WkdvN7ennlwG`_g&k^?d7UtaNq!+ zd(c+XvFFMj?nkAHKk|Ytc-Q4!nv(M8a^Uxi(kws71acT09jw$Bf(N)lmN3V(HEwGv zIN)cFwh!M()8HQPW1dc%?VN6^7wu7?{xFY%~Uu`A7Fgeetvtc`UiQ{jI7CR2-39b?xW+PInPz)2yg*T z_-|s4H*{Ml!Dm1n>`066z#Cl$=E$l~tge=3f)*&F#LyCSDe;o7>^NPqPD7+sy-M+t z-m88Wv^7X4zX43#-8d>9#(Zuh`c^eB{D&{}s@PRJ;l~H)12vhad+tnKIpFnQbN(Xq zedHV~j<2BH0jbtiq@o|%;GWBR%AyI%J$d^i*X6qCBEmJK`XqA1D zKk_a+ysRu45@n+g0sW^7TPSdzq07hbPjxswY787vM$}b zMBk45Ru*jp{c*(@*k_FoLGNliwqDq(wl5>iOZ6UY8024<-ozYp|JD8V8vBZ}Kud>U z2U>Gd{k%Qq-r)m=HD}dJ+V`)>4ibUfk18b9y? zzCZof^-nc-ubKy7)P@`0Z<$Y6(-|&sPdM@%T8dj8-CCAnv;FELZ zH1uV*4YqDq-~d>_AJ}TpKWjX)E~PsldD!CEi)zlCiNWOzIfLRJF_k}RG zteG)?;m47g{WpXUitvRnsy>*J)>3&FbXV~P%KDqu6o8*r6?O)*Q|YIL2P(%`K3^%A zY$#Z}55KlRcAjSE8+J3sSC* zxyZ7ECI1#_kQRAh9kiKvWO6-^F);jl;A3go$&!lnC_*)YYEZvf{b>5u=@flDnqscR zaDP9nhsAl}<^?)>=_qYFwuvTho=m-G^rk9-Rmh>c1J46_Ay0MVYctVBZ+ZhZYj11H z(LD#{>za>h52;NPHcX({tFhd_QFV-`>;IFNPblVc42@qmo@#}%^_?tF1-ccWb`k9;`b4xrIBTK_{6nK-qj}y1x)DcAIE3opN$Y3uZz(jG`KUA40HeuuB5UKU`?Ef37uE-1G3VeHw*BJv zv_?~7c^l7d&IbOWV>gT? zTLv?S-N-fpKKAv;)TjH;?o;yx&6RUu@M%*QH_T8x3{3}LWZ}C9{1K}Sur?Uefcxqj zBLkSLE7-pvMW0NHbJ2ZOcP0Lifj_4Gp>_Sbp*YD+2j08Q_^>`7_#>7Ej%}y5Q9-YQ zvV5C0(FnY6H?^IzPdj!G^Y>=;OnlGmCp7NwadN>m`FDuthdE9G5Bv{C>`L-4L0{Q@ zn!CX=fVz`^Kz`bGdYcmNotJke#dKhL24#X4ShKD!HlH$)nQjmV7-b87K=+|tg8!R1 zwx8Zk1qQGf6bu(ZBe_>gA4{q`wr&caJH-F399cPquOjLJ>fGa3k43R&zrw!^@c>b_ zzz4jC|ABO!Kh_)q2jC*UlY6!4Z$p!}rS_Lb%ob_6$PY3IUjVETGWP-B8N`%aE@p#gzK4s`{Ar>aq6PWve|0!ZtO8a<_efVqs zedX^|#RCW6qL1GNVhX#Bb4wxnB4fnzX|bsLgdCZ?Tp|%0p2HU;dLi zeh%t@+gLXqCs~?C+r6c?B@I}XI!>v;3vpGXYa>Knfa7=O^DB+tB+?jrMV`o8weF#8 zwEx=t76&XHK)^}Bsp|?`^z6T9YXn)uDN_dvJSGFc}eTLC=X>L z)|EEi1NP|C(Htjru!_9I73CBeRD_Plr}WKJr2+O5z<5BN42ZlChX;N$h8~bJ#LW`< zsa{bw{H*bvwgb2TCv`Mb%@gulET|a8-HFqdC4cw#)xUY{W_9_3)@TZ8+ZITd7=%dz69k2I8{IJ&s;GN)Ce@Wa&SYlgB>~Z8@VpwxFgmv39xa z=%jVV0#+N#~vy(y}al zEy;7ar{3kD9-yxx2N&=X?H5j6eCIS{a*z5UM~A8c-g{|p0!~sKwcW$NwEBeV^z@bd zIws1zz~biDYMXI2}|(s$5-jzNxk=|E}O zSbq(^s_Pd?%aL=BJTTrhbZmVz{wNh0EU)h;g$Mrl<9Cdgq9ywt{UX@p(RY*PY3My{ zE{JDp$T4>NShDu}U?-9b1L^?w3Dc*Yk-`VLgDqZ8JQ-}F(d&Ow$8VMk%YtJIQpMO%SC;BCv~}~2ChgTDw=C&*fEloBTNkccrs{v_o`Qh| zHO5(%mZ$Fi+}(48J=hGPKhj`s19=#7AT~5$H&zFu?$n!Fj~>6&&%TW{z}2QyGp_!# zeiG*P5F1{f<%{n>2ErpN!X6DMta}CSIgp$Ny>) zxmO1d)=oE`*_duV{t(jw_6qE;gcvx`HF9+wz6DM=fe4-{FUXeW)7FXlPJBPnxgXd-Nx{uMLw2;G&D?c#rRZU#StLxP1$A#)zSU^^@4^ z6>|Oc=&yNRa`FVMpab}k)0gFMKp$5wzUscioU)A%D?8cm5I73?7qTtZ5F^eC;>wKL zHHxq2Rkw~5u^uknzeMBzX8z8s&ww!x=pgct<}K)rvN;R}%x|m1N#AE2CPsVEAMxWM z(-`+*?>NMcLQE#q5$ye|&-^%a3St^z9W&;VkQdfwBR)sb;YF!%C>vWQmkSv5h1;ax z!~dI&6~7tr4UZ?k`|@tiW6XcOdG|)CpA5ahd@J(8H~{mz*bn3D@UN5NZ?dvYiVLe# zhUSMpfY<=dk4aLWhbdW{#6YK-+>5oZ& z5c*-qt{QvHi8!GrYq$_?FwPV6RJCnwh_y0!?6#WN|96=M(nU$>EWMY&~qLaM!|A z&a)g<9$1;&g59Xzkb3mzkU!~*?gRlXUapO?v#|G2a9D?LTkn z%|CDWKJu8$ym9{q9lvs%q7FvUkYz)tQFtRBI|X@hTCu!yvNFz)eXYo% zqXjv3ccfNhThXFDi}?Ow#>9~T?JnNFNb`5irxs&cP?7FMco`@QWu}2V8Ag+2-4B_E zzOd+ILB)F)C!cvfJZ6kBG|^;iM4s4N%V(|+FAHU&Y+mnDw?#(bWo*9(@{Rcpi|!WW z(9MDR&g@I4ub<{|vNhpns^^%WL0Kph@rwWhpL;j@sVfAR&>0Nw3 zWK-cUHy`-EAw~;g_E>jj^Mi=tl+H9lTaCJ(uUkI8cjUw8rrV=PE?rc=yZ7`ShXwI` zxL!h^ARXk0(}uOzPQ9FH&W<_hA~UMA5&tnyy7=$KbkNkp96-xV4d9b{nM#- zIE&fEa53dr1p8hW>RX6*p5DpVO9=Ud+(LfgXO+@$QtDW$$|*z0unncaNfWxkiU z3Hn8#fn^^{>OHqN+pLUe!?_J9{L68w{Glu1e|Gr#VGhli8)vAb zUrD{zzKJ>`y>i*JirR!hcbk7vy*1-id~yWwLbevji+s z*Z?cmFG|;1#a@dg7atd+{7WspEUE3(w#qnC0txs{!;e=A19((oLb=vCohy;w-)9KoyYpF^EZotuyI)=JcHn1#RyO%m&*reb;4!xsFZSqz7~U**!)rOzQG7<{8@ZQM*TRorAKa`~t7wKaF@I>JH!r9QBFeBl1Ul=Fyu*tIL)@ zgO75%#p+`h04}trs(V&z%*==vC_~elVaRujg)Ox1gEeZ?sH9lbdh`{6pWOgE+IT|y z8c(df;xV^W_y!t7*0H8RP8=3P$%8$i#a{7(ui^?>!nz<`<3r#GT!FJltLq9sYo`Dw zI+JilE9lsJjIZ@oqlZui^fmN2V)mK(K%VH+pbT~RKz0x>Ls$Hn(+Q_JuKM_vV?9*) z(DHQi(TDX=n(%{sXp(PEBL-)cDOKoPqG9Vj)s>4i1FCzIOKAkzDHvK%=YEyQ8#n@2 z;4IBU+dbCaRvBGI*4k059qhicyV|x)lmQ;snNf$XKD??9UA>+mZV&npn&bv$LUzy} z#2O4;2iC^|SAEtS~b=ewpwa8n@5%86J zT)cNtRvaJHImExwhyIwSZZL_(G}ePYkhMA!>(HyWujHb@zeD^IVS5$yPddSo zD@MbqJEy4Tw3@o*hUsL)mee=4H0oFF3AOdAUsz-E``F)Q>1Qbcp{sjE_0ow8Xa-)R z4LW+`s5FZd_voYl8YypITjbYqSx2pX!4#P%|A8M(<68*DFF6|;(R`RX6< z$jZlxhHe^a5PgsceHFR719XENKyLZT?lsX;`W&){cphlq3_U_Ogc5L-<}2qO?Ol`U zO}Iaxp=D#PLu$*HQ?A@^Ku5&BjyfG>D0n=+&|lO3(yMJ3@L{}GYDg)%lz7SD@?o19 zwtbk%;&lnw#1-+%p|cD<;_k*#iBL92#&8vR>UH(ArTK^E8(KV1hxPkB-Y=^QdX>%U zoTl&5?jc5iq4B*0LURw!C0mB0rgC&WM?bOU?3Q|sGep_aE5_TH6Oz+b>w*b+z^;MV zn8q9!SG1VbLa%b)^#t zhV>N%Y?!k|>|b^9_jSR5_h|p~1?Quw2c|0Laz)tc~ql7s1@G}FA zRr56TKk~wu%WIvNUjC1WFIJt!T7!MU(6Y6qL%bf}HNLXyS=_xiKKF$DpgXkXYsfp1 zC+4?cGthNFj{B_WlNA3)MSmDlzPdEvTmC`$Y2G2t@i(DsuKBSPF-@ht4k=T9l$rq#pNRZUOPk5U-7j-lfSJ>?B^MJ2*Y5XuEj5C<$II)o~Wt-xhQUmk%j@Yz9pwCYo< z^F0OdOz=d`6=gz}uvZc6^ZTyu~qcyg*$mIjp3zZPKSc zL4SY-@XbN2;TeZ!@bMJ<)6f?{{8ack;2WW9bisu8fB`3B*OeMpio=*za-#|#Ux&f= zvy{8%HKz%y3&0unus_-UKy!}FA^5qg9@ukYY3x$IzYzL7NQ1g3i&o4Z88Bh5&9qu~ zp-LO^A9Bst7PCE2;ZrQ+LhuoIiCBW533RFdMt|CMd6z7IMa-Y0{-Vxc?gl;w$QyYI zn&H2ac7TDw!eL^t2{_aB3YeIGJ=Py!4`1wI3fm#Z?1-g_c?Im}2tORig`o%P9(*=N z?;g$Pj}gZi<$!LO3vmc`NLo9{U@@itx2b3gS%yw(H@_W^*M@q7`6Y}8O?@Cw^q)bq zt>?E=n|W=LVwR`TIwnJDhWZBIyy8QOQ@>UH=+L!8M#V|jL|63p5JS*A%9~1tF<)j@ zroQc_p*Wf%9oh_xNzm_THoFD4}& zf==Km=!Cf4rG}QGCNrDR&@DsxKI@1BneaG)$2&$ngiL@2xQAW#*5g}r>eeaRaC!rc zh#o=BXE&!Z!^-fu<;W9y*%UD9$ir+g6jaOQ?GD2Wb-^ycj+{cAcudsaBYx*`-y2SE z$m1c`om!WwPN>RbvqDDl3}pQvmWIOC1q0>q!;`vM69G3Lp+?dv@+-r!o#Hf|9B^>;ml+Y_3MZ z`fLhj_p@Poy#>=>%h`FIomuVQhxRX3UzpKH+cVG(G+Yjvg0`SBXbqabc90J7;$*vg~R} zmR(qU<}NHAGdppQXLx7blg;gRQyMQDWo7_gr0dv<)1ApC=z>^}kYP@BJ^?;R>2BGL$$H!DT+VBU)TT)r zC(*ftb4JZ0YvO}=j`>x@e4emj0@VtxMfuw2<1hf0kC_jg?yO&eIuDu4(Jlu$baEh% z2oE0H`RS{tf<$R{#U6@VW4BWKi1r*7z{KkV_EbP0>LaNSoc63;MV|!wC)j(~lg9)P z+JAn(UhDkL#TfV<>^r}Y!vxp>BVf%?eqM%*P2d~G`h1Xii>@rTdpjGdJESgcirHjV z9b+h;;6DS{pbM?rCiMk)8_jUYh(2Z7`fftsAU1Q34mqe)pHdXLF_IoV|FFNep>#5L zy8F-W)5xfiRIEoa4m*!8or&}jr#X3_%y)$x~0NTTM z8-0je9=RxJNf14M{oG8HNxN)czkN+%E5azZNA9Hl5yKI_pa~JfEKg7#u6KYd#~J&2VSHf7_{hjKT<5d> z{46^$x$nZ(>;-(7zcVx@QwAkH2W!IK2_O9K8Lrq13%Fx{#Pnzju;v+dt4aZtxUW2$ z&*yRg|L^Xrx|?NfPkQkOu?O6jxO0DZ$U1N>7haBj4ET}L0JKQUI)FNdJ-&+eDN1wx zp2Oq03Hsw&VO#~H;&rAMoi&w=E{{a4jLd{4q{M_UN@RRi?q^1X!EfL?jJ+{ zAndz$>h>uf>s-3N7HdYaPWkThyP8nSG|#ba6mdSGSA~uNu2@?P*?aWj5xEU@<1{gM ze+YcH9$-!OJ?v@Sv2~n=7w&!7%Syn9E7sM|JUlbg&{-3p^N!9-wWkK?P;_`vWo+&B zG3zOR57swjw81+m9ZY#IWWU1{7DJlZYjI#Lt?IrpC=+#{a%5$~{t}t>xb^f_QoM17 zi&~vz8rv7Tr%zNLjj{w9fmWvMi&}YG@qPE= zZpUe)3}}lOGSYE?s@x!+(Z&0Q$6VG}xQSk1ua=)C{-jpt3tXUQwZ$m~jj%@{XeQDa zbLG0n(}G$?YL91&n7gXu6xDK3ciS#*%VSKKh-43F9$ku`H0SP5j!4jle#{e-~nU;dx2!6u`yubx>L*8 z6*$2LCnsk8;me0P%}ikzg&zAc^hdh;M4l~Y@Rq?^=?^{t7wk2Jc$4XUK$im+Z88Ix zp?k1*ubi>uohNtbhtMBP(gs-cx1bi2TFBNHh%a7xWNDrF0AIvyJaqj~y0PHMjU(Jv zu8a0~k8vdSFqU&bw>F>DoIpEK?+v*^S71-?;HY3Z#qw_;AJC<`a1t_w_;KoDd&(}* zzz<zdzQ+MDl3Zzzzw#P zw6xP*e|(*nDMv=|4fcq`UUB*yGk4GAv@?qStnZVje;!&NyI!B7xsD8u4wl{j0*u&i zGA-r{5SI{T$)P>!0KP-)UwvaGf@XI8+5Vi2hSIvE&pqOJIruuz!OI8rqCY-HUkH2L z$i)+Iby?Ac9=$T3k1qQ7*po;u4FEg#%DRwvL2vv)GtkbM7=kwbHstKj=GhWX>0Le& zAYQNPp5&Tv$G91De0|sSr6;eS7*w9NMBryls>!JcdS z&>k?r*KPTU<(kN=^ZB*=*Qf-eow4*U8Ca68-`9U%Qvo2x_I=j$(W@O0Jiz|$kX=I$ z*zvIkFy^r2%022Q^gj0KHD<4S$gC;oUwlw;x}12~P!jNTXuovXB~h%nJcw(=2W7=QzoeKFEqWzcm z>s7Y8kD<$3Eo>#bEtb*VRkduHl8&P@eK@`K2ok!01Mt%GAUR9BwdXO;sj$#<2nregGdj{Z#Z z1p3zPUw;}h4Z(m_p1xk37AhI{f75fUY_~>4qnPi+TrOl4>JILP8-l)Eh zzzO{V_%x1=9xW}xB=^|E3_iNh>7u-}x}r?@jG1HZCwy}_Sq)%qFQc6)@ZoL1w8r%6 zt^WIB>SEO9^PBlvhP12)pbPf$TYF}$F7Whzk9yr;N&^DTOhJ3(0UcB{s3@JfX_y^a z8xrX6Vb4=T`=o~8h%s*1wlKZs6Sd(WeTQ+c%U~Ci=pKO^TMK zq(vP-8JPbv*F4Yo?c>SX+w|)&EPXAh*2G#y*(0?v?8<{He9aR2;)3s{zC!0?-#F|+ zYmVdb%g0n}LM;NVObt79kiEY>tv{vTT(CZPV(edPWGS=M1IRsmNX+R24BCK3#@Kwc z@eOTCi&-tq(hdtg%|A9jX}@tJ$L&%)Fh0N@mF8R*j=o9DSuIW4?n-gMJ@{H^U?JLm zKJ^+5K|f=!nD2v6kSW^&I)v`4!x+|efXj_RFi zy`d=Em@D?|#oWF*+Fk6o*=}At0&R?eQBGR$H-A8Wwfki2qOZ31n5&0>g1&Qwa$v?c z&_S3_Lm8&9?@Mu6b$k`4iMeH8;A-V-MKvbWpu11y`Q%DrRd6Y=DzZAwXZFW-e$Z_0&7k%w=tqgax%)t zL@vDQzC)d>KA}3@c%E+`wef5aHjcRkL<#EbOv=%3S6?+CcX z74;ZvU3)I=DLdZY?Ps^icZ08Tzju*WdR@T-j12;}1k$}1^5(w~J6iO2xGrWoE#2T} z{h>Vmc_?ginASP6cmKZQV^8cI4_MP1ZYjM03)+6P2^b%1s|y%s`K|GzTz<@_%Lw0Q zY5B(9qu-S;ARmp49+?VutXV*umj3JdlhaV9D@|nUM|%xh5%M!t+l{;s%Lskc!`Ba| z!UcL0?X8`ko!Q4(`tk&RM)?Qkr|{@-KBs|oNQhb2E2@{$reg}37j%ct@L1|WtroRP zic83NVG2F~M(_di`IukE90Asoz-Bjm>u|CUVD=p&e46#8t3KZYuH1gPsl<>HxG&98#ZuL#BB%fKnM6xBhJmLQ>)a@*FJmmj5eO%Nbps38Ro)e*kpW9 z#wVlbdqHbWSHNlGlN1w88kbVj_o~kY%`s2)&6sbv?>@!~kab-L)}LcdCHh$K`Gwub z;5x|SOk&;%xMUXE3tB=4AYQoGX9&-spFvyxj@{!w?ghO;C(x_h=yE*XSGp`NpirbYc zj+suvnc;(X@88khOMA(EzB?5h#QeosAMRt2d38L%GsqR}Mui3yqL#B;(%MsN>EVlq zW}vM0EMY^~e0DRpBNPrS%whW2WL^^w@El`i@B!my*zm^e7(=lMv9kI&+9|8~E#|4t z+&)8*yCcbMk{hp!fFZ5sO|;P?z22d&Tlp~>ustPQLR_ffw1#|M0s09#8f~Yc2kbbv zpWLRsm-kY{t_W&6vndrHQk?h8Q0B+1XY}SL+b>Mi3Gkx8zykE$$nU7}jK<`%#)qcu zoknX;uHm#ib?X$xCB_l_jB#GNcZtjO{ww=w{ps~I>%c4;xNaadpVgdx81+MvUT1j< zS4<(5Ydh4P;(cbpCzFxE0$CI=7X^YpWSp%e zyXXIz_Q|GjN`9kV73ChBTVWS$hdz_SF39dnrq?R5`@u{v?_}qltTrQ4v`=W8z^k3$ z9e4;{a-K5Yg2(C(yyx%gD$rLb&-?}>Ssn@Oe9unN?qyvw7cIcM1n?3(Re-mQ|KPRs z;JgoHb$_tk7wojwziPNuK>oX>*S;4ky@&*_uwBR_!owe)9aKX!U1oz{KXdI8BPp7U?;Ez&UmdgQ_L zLY|NflmWT;ICO=u>t#xOlyw`t!I~7ThXC*Tvb9yc7=L?MlT}ydFV@+TEIY8Xy(L+= zTaZON3(C89X0>bDo;HR^Fs z#_KMO*No5LW%gFt>8oa6(U(oWB+F)&l&e)P%HJ+O6>eXcoIIS!xq~wm?O2qbxOen$ zBnNi~%GZ{~&TW~Kax~4s(;^S#g*=fr%0O8t6J>M#ka=Yx)64;LzKeP;c+TpkWhYC@ z(Jlvl)#5Aqs_9phyLE1I?&wUv`2Ip|#o8bfCj&eEmZ zm*{%pb&5}nr?^{jbn5yk!v30@Pj03Ke=nf1YsZrJY;S5hvME*UUy+J<6d~J|w)9mK zCJ!x=<$;yW^@ETFp%*@$_95Nd1ts6TSzTxCH|ierIp=xvugIna+jF#YF={Zh0S#U> zm{uNIN#}2#rw7j-7#&Lt`;TL7XyTJZIuU<@7Vce0K68D@EyRtSIy#Y6b1V9a!2nnQ z6JP_3IT@@U%Nn=zYTHuqo%PwQx?7Qj2h-~$$|bh1u5UHJz1OHjq$xb<9qY$y#1~d zQimcpM$&~_7mQj%W9Zr&)pS_{vgAOw9B{s4e1(2I z)1kb+v;H{vUZg`2>Nv3@MW2kOCofIEhoUM^4gHTey<1Lfp$-!|aF_u*#uQv1pj|-! zAbAX#UV1gdl`CvCSeK7}9UE(*pN&42V<$)IJ*_t#xNsmt)OERX@#dd5wEx0>>NTww z#{swiCq9nEm;ts4^br~E8IB)mXx9*R9&s=*p0e!1_})4@*P-pkx1+u1_oj-KB$o#n z;XAC;1P;K3w+jq6K7Pb_AvyL3mxDBxc>jm>gSftj{iL-uH6GrWj$AsDS=p)= z-0%N;PrJ|Trg}r_aol0Q0xd+}Fr(;aQ^S#>t?y&a$H{r!^HRY40J{J5zFsu^7(TxD zVf{@qCJbKc#qhLNm*s&m|5uZm$mH|_@!)cix=RL;uu<5j8WBWGQ$$gGH zk1uN!u|C4Yup_sb)rQjuwBmXo6UGM>^2PN&`uVI)vvg-Z6>ZtxW!|AjlH*HwTx{6E zK{NOw@v&hhvJY_HGrOL3KQ?#Qk@@3*_n7-&ad@-%uU%*t#w_Hq-JwH4Gtdq+1T8a* zoshTrOn$j97I@G6=0uyo;!)77BeS#<;S+v4{_pWAd`m$)E(6TxjQg6gzOh;edXIjr6i%xED;l(U&?n4c&8TA^nLbf{2sDz?jE|ezusLK#Q(+sBzRxK4(EEtP z%jJC>_0V)V##Zgt=pnWW?{6 z@)rCD4X5s%N;QLPa@xWN9kdp7&j?pu_t{w0vb!Y}=~jfco!mxK4op!CBXAnJeP|}+ zkoiEyo)*|Ajm7UuMKiWWi}#tfpW04Ex)qs-0OkuB%`;5hXSPa< z&K6W9s0!VDbd$pxwmnQO{{b^(dg9)RnTttggm&7&X~beOsO6_+fF%vtHiVac`_XNx z7F>jkwqtqq9MKP`IKCp^KPpASPw3C(2bbxmi9c!7ljtjBFRu;fHl(1+fr|&orH>0) z_Gb3AbkYIJy3gdW=ggj|{B$qgzo^_FRLXbhJ@UZ*t)|?QECr!5@E_QF25ugxvEGAD zppR>~E1kJ>CIu$&8|gi}ce?5T>}O@w$BG<#Ii{-n02XVcYR{<6_vDlETzU`uuuold zTyzTjK7~Knn+f(BBWNbjK|VH0}r@!fyV2FA45cM$y-DNd^Q=nK}LU7r%4C#J&jV|{S<*>QNf-CX~&rzs-P+VW6w$KM~QY!ikIp=`Z!_R!U%hMf9wZ% z84?}B`@gDmkp2hF&@aTCpr&Kz*_~9VS0T=ew6qDL&tcKsg6fT`M^9fp)dU`0dw7lS zm8(n6@g8DBRU31dp z=*gNu*>!v$U|ns1fXQ>M=SQ{nOArNn^Mapp zcn?~!y(DO9>{5|j;}tvrFTj(uXak^Ua&*r@U1xSpHRe+XB9PJk&EWZC6-90C}jEwr>iCZV=$A}+g^B(*||M2fCf6GP* zyZ}!yCNpOnfH_BtUKZ3Oq6xtcE%(4!wbSxWI&A?`nS=~9U(lS;eq`1Ius5F9ST^s0 zKl**G7q!-Fzi#lNaYSRz8*|PJqkVyoNBG)sy;-v9{3a?CT1d7I04-RIVs8I<{w8f= zJL!#-mIQzqwj1Cem1}MH=o_H_1G|a7$MCholYB$WG#?<^{(OD%(c0r{^#zan{56=< zKrbC2`oSZ1j*!*Y)Eg)>B|x7H{x9gm%jxe4nLypIHN6(W7f|10P0Sj~+b6Ht`T*d+ zm6sJ28&FKIwqJ?|Y+3r!1m(g9Zr-tZEb`ia((E$iJzxZ^-1m{eE_f^F3VWY)u2&xf z&)qslMF$k+JOa(+l&8-(eBAG8NmYkerH9WS>I0hcTgY{tnRWEi0e}&Gff6H1q?!j+ zW}Ja;wp`dkB}bIhtIY?Fm_M&s*ok)kvaN+$kU=Xo9~&`iQc|@ zYY>b`wD|a9S#tuavI!ZeFt!5iyPDF^z+gbkknq5@1Kg(pu&TnZ?LXQG)csk94PP4r zo`5&tkvaH}ImR44b5P)lK%*%4@a03QH;ctS(J?Qmj$WYaZpgG+4e|!%r8!6D7!A(E=!r?|#?3GWu=cg4 zJf3-I#nBZ;!-@4j&E_}L=<_Iet?3FnH<{NYL->!vhqdYarUvmI_@VA&O_U*hepN;+ zKeC+j2)xonJ42r%&q7{>X!nKPs>K@gAO3-I=0P>Vi+a;;Njsx;ra{0bC%X0Y7PVQ_ zMz1lR6d&}{9YP%lbHb)Lz#H($Ed2MerXt=&=;*bhrT~@CYht~lAvzN@1pi@M>AIq; zN$QTiNTIE6zqGwk^$fUoSlYp4^PS)gcx26ZC6zN%+#^qCA7?t1V7k5+Y~%28Fh&O8 zJJe%U4|?z-wU3;>JeB+Xz32C+^NP+~{tW5EfFHma^IRA+nCbv;z$0_6fS#$n! z@xk06>||^oDud+}^oI=eT-}o}wlMbrKgBL9x^S2c<-O2f{+s;O`t})$L)@J>0*}nW ze=8p=D(+XDuHQGUf6mP(H>t+d8V2_T1uY>1y`p-l^_4Z0o~r3EpVM(!N27UV@LyfTH(m*&Cw?_Zp5Jh)*>ka=FKPp{_vAY<&7LJxFb)t#W9O?{xR zhxQ(Q4rA**d}2*8-c!Z#`h)9KobkvU{D)3)^>?K!_pYcGYxIA_K0_OBXg@&6Dfoi6 z1ar-%oHvF~BIaa;t`X%Ka>aPB)xuWv^tEQcSwjhW>Fy;e=2y%t`X6J8qJBl`{B8Mu zANt?{o8Gr$zcq;rfG=$qx0U5Tr3*&rXw2aoqnm`BK)y?am!SRE_UkIvp!a8Po*@@M z7xRq&82=r89qGt5^Tp|o+#ktpVaDiJL2KjzzG?HH)$L7IfXm}^3bxQAJ+Jr1CImo2Xw9* z)dwfYz|RwZrk$5|$_5v6xbVL;u%igp090zQ5{`fFN!N_)(4tXElde341zPsnQE=0LOiFpb_knymV= z^`MMbqFhs5A;T7)7UZ|m&#e4M=9mllYtCOr*#uPah74f6En=;_ewTXB0gOQqf6+0_ z(PZ@=FhK9azG3cIC;$HUFZEy6pYzBReN|QZAy3Qxmeg`aOOx5FwF%PRt9uRdqfv!h z`X4fYcnYYC()l*n3w$^D@;PZ!>3ozc^geuF&3(Y%w8_*aoJZ#3zm>NY{WSb1y7$cV z_7zq7pdG-P8TiGRsvQtKK^$7lKVw}2Vi7i5(2U!VO-(o0B(c_4-TG}+e2x8o=gA$a z7*>(MBU9rc>JY{i&H>JJBH@Iw;L1w>=+z@?xv-^4^|8PO^}N)`QdD|mX|v^zxCX}h z^vEI<`{-!=QF8QmG|SjeNwefJz>*_Ni@amfm`)9&e#FYI2fs?7PsQZ|Ic=r04zGxc! zJ?v&R#?|1wF?St7AHZdxOPcio1X1E2#d9B7Q})lz!F%{88)I`8`08^#7JrPK0-Vg+ z_6u5Z+rj`_nzm<}J|LRpTiEb0f07Yp05D;V_r~)ZO@gaFnM~R>iE?_em|SMC`v|^^ zt7rpS&1^-l-oDZYOryVrjRP@5^<6_IU^mwl?GnbRh|`?bF|5!wHlN-+O?1DYAKHKt zK_%$)t=YX$(x!XB`tDGz9zQ-~Tdi?6KzUUbJ{mF!rh_HjnTZ%77+D~5T!jL;4M2Fw$tb(=5fHg?-s&Wp6r{eu6z4e++4KO+91hcC?U zb186@UNN>d#&=lYV$2o1$6C)F7d6K~l)`N4d(a*{uw=YQYki3M;QW61Y0Zf>rbbJ4 zehXq2XpJ##3~zO%1-&tsfc4t2Rj0=R+Jgt?SnnqXf7k+A%xsY&?t5C&0db>YUq_tz zw6+bvwh#a9^xD51{UFdDJV@)hFJuFLCWQhD(bjY67q=6At`5sOn0&rl;Hd5jS;M+7 z=^SEO%00>g%|Ux}`1+{BS=}?<5Ad=ik9i*HRu3@V8opz=&Um`&;5YOc>i)3p!_qBA zA#@ICZpmn$UUgs44)W(X$dPtmG|jqDed-b7>`Xl{)u?r(0uOzzpgH`x(DtXr+^#B3 zcE|1JG*8dEFX#nYSPihERTJ;0x9+*pceelb0|E%poI_J7vyh_ciB3SPkekF|%lo|wnK|K0m{ zq^jPS+k>)5J=>pYOc9)8N=z0=BfeqCG&o zdwtfM=pxA3+h;SZ-dCk7bQ5$`k0m|yiV>}j2I%L_J37y7KANhqo9aJgpvq&u|+yiq;3l1-!!h;HD=r&&+-U4^XK-sXevgZd73kJ5_jOyd130Gau zp$o9qVCeRtd`~nvGO#*!H5ChDu^bo;Gix0H+~^N}Gwd7M8K-$nfc01NkImVxt-FXr8DF>Uze<_zDIu$YmzF4SEOBW zyXfUVF9~Zcv9>4nRxCyAjo^O07}J9vs_D(~AG|<$i0y#5yJ;nJzy)QaP53qPSH8{} zG{77tXo7P`+z$G7__tI>_QTVbAU9ho8R9XF*)xWIi1xlMU5xP5oc!dBp7kk4NnqMOPnQO{IIUJh;N`_^6k# z@jf99KbC#MZ`|j4`{%(B%i0 zQ}JE(LBf*+9*6%=7LytNU0e>#ET>YM2s)XACK(}5j-Ow$4EQh^7-(xUIp91;Tf+E- z`FX?$UvO-JL3?VTe}aAc5c3c16liC1Szx&5WHjLQfzbqTX9OOZ8wM@|Y%e*R0XF=! z4KQ2=1kcf)VlEcG*s!@^yp6d+V-NJn5I+igQ2jCO4_<~CHyFh)hO@vQd$t*s7n4nM z^UT!wD`mi&$pG2|CjX)g@RGl0V>GnE%9GU(yaWBM0<3sH8vBNWFPMKtOnGy}{uDCw z;N=5~j*I58La^5dV#NSvz#^3iCAy-U~i+9;2U&J^^$Aqlf)q zdv5OsU(x=e{l-`g_nWHJ(JE}L$JUo-vO{{-S%L8^i_Qe1fE()s@&+=$4ahsg6*zy4{XD^2eXc?mVEdTHa`yT7@HlEo??(^M0@SW|&#rbZ+aqg!iBT_j) zyHI6(6&eveg2x|u@mBsGnA(6! zgp{CMzPZTKhuQ4mllc+N*BHyAv`Vik3s?)A$1e|;hf1R=QOnsa$$yPMMeK~AMMoC# ze&mt(BV0Z%CSK%g6|i36(!EP`_Rd*~xe-GVu9VL| zANRxK^H(1a&)=pMzsy+bI3|l3wR=Pf!Ls&527I<_+H8NyGBejBcDq$>RvF zo6%;lH7aPI#cAztO*qAWe#JLf%Odo7avmQejgoo4^CQJA&15YT({Cs9zZuNnf1inQ z$l|kM{HhM89uz`F$W^}tikTgGEm-U~T^PC%Q0_vjn4G?myr>;te7!A|&5 z*oqk*viiuG^gChG<+dI0Q1tUfdoTEnYrOQ2Lh;q^l>a{qPWeAu%D-9vvM7*6fh-DS zQ6P%~Sro_!6bMcUM7G^2|9=*r^8Z&O8rH96ZBfvIJ+`jxR-=(ZfhIniBKw!@(x(5? zF8J5CfBh!eV(0r#S15j3Si45mCVm$m&hj19WdFs3L0-rE1UMJlV4K_4)-Bx4E^_RE zh7I#H%(ZAlyB+!V-7j;aX_H>fx7=&`c^<2gBeS0>_QJ)bW}UnLo9E{AMK!mmZFi2n zJNT-TU87esf7Tr_DMGi=Kb-#B^pKGL&P+{T~l*V|?Lwppht5lt%2 zYWS?YMZshL)bOly)h65FC1Hc}IDL7n?!YpumKML3cg4Fs!<+wFw#$Z?sXfM9?^0}W z3@(3vq*o;eMRE5BeIv(A{NF#H-yG-HXWz-wzt35G_HBoaF2PTH_s*!}da9tJZHx1f zd#_)fP<{TKN~L=?Yj$tdZ+>;NWe+O4ea4@+&gR*W<9@4tm1f?nTIJLiF29a{S^r$f z^504{c{$FbZ`hbA&W~>#kG;OdKF@{`R{qT|6!J(|@lTsYKLxM(@$UnT>+Je$ZpXF- zY=$>3GeA+~#p8sad7XR@_v`BDdGQOLzm>oJqBG;Xtt&ayzv2`YnceoEpYPi=vE{HG zaeY>`$Sbc(vp>sL+x~sn>RWb0Y<>y`nt=Mzdxx=It5%)i=6Y&6d-mYOL*F+=7xX^R z#Ny{M8`nD6)XL>TJOA_T@$}J+y_0`j**5slW|z-Kj@f_5|9L?`D-DIiwoUKPw(?~hGKD{fzK?Tmw&$XUx%@Gs#ke7~9U`->&)AzKi|U_}9<9Dqa1| zd11+K%6?O=Ib=lvsO_tkvM#x$j@PU@q+wX%vAVuq`4i4uFXQET?|tPS|G2;07vHSO z?H8XrEvBYJO6payoheOdj#0LvK+SSs^fnFL7(6KEdFuFf%U31>`=Dqh_#>ZAJ!qVVBLDL z!y4V3a=U2d9}6e?CmuQ!Qzf9!&!^U%UKw<>$)=xn)N}~9>*wi`=au)J4!g5kIPSbS z?nslw7xjz0vT4wH+yn`!*c2v*UOx zx1ABAcb%fY6Gxw}G|Q*plEw`Z8l7{s4XI=w_AF=csB9hGcC>uy_f-{-e<4p{2B2-`_C48X7l{Ee&JmcCeN;u=ePMezuafD z``^Nk4z9W2vGk7nIPbi97M*D^a@OHr);_xMbFWHkv&Genb8=bsYlZk~b4#{SvGO!q|R&#tuc*}HIHagR>#-9CTwheQ@iB_9#5ercyCJ2r|I}%_5Zc6)%5yr-%syye`EK{UwZu!vuExPLt4x@ zy0+u_w{87;zwB9QlFyNfM;q4i+dQ|RXSQz|w_MS;-+NE;JQm$I-|X%8YlnxnxYVJN zh0EdGJ1f5_ceUN?AJ&arKhu)s{=eee+bK%-e(BnJ%kLEjm)sffpiIMtZMO8wcKF8$ z5tFA38@=6X;hiN#w^b^%XXl>mFD+|UrT|!rl@1AZI#I&bdPu?fJ=d=e@0)v^B2Y0b#&KBV z<_+Sazi{!Z82@=xKE;yb<)=N`w;=ZypI3R2x8DET`s%2tzNqax!yw&AcPQPBbc%F` z2!e!kcMRR7(j8LL-5~-$8l*!~Kp7h8`Y!AH>wVYz$1K*&I``aj_St90^X$DK#=}#- z?4A!cT{8uhLGEp#&=3B2nai|8Kg~qSPi!0i8mEQ4wrQ}9g+mEQUpoEWVI)j>KDXyJ zx26Ow(nL#qpP|EquRzPSHAc7I2sL#Nxb;0^kLQF0R|A`cD`8VKHISQz{SfiybE%`0 zPCR4IjB{oUEG6dnV#@xe-}YAr-yIc|RHT#g6*`N0x#=YWdOzp&e_?;lbIrOB#+IHyzqkXNaj394rAJJ{2dTTouyXxnw5zb zr0tvs0|~Ds%b%;9Q_!eies$ zlRS9iAbe{|HK9P^jLN~;Ij1v#Xe5DSFxs3oF(q|iDGOa4DeNsBQm`?fX}aWx0m|`u z)?;)?>ExPV^WDsU9KWlvrp^ma6bBWKtp^qGD2pqzddCVf^}YQVQ>cyOi)I++c2>x4 zIfCMa(z6Ibhj=H_7x<-~_15W&&M9UIOs8_7=Rzl2L+aerMVRNfOo+X&hy|H3@NgFnGw z_ON=r;OR|`&{DTzGltr}liU@fTTg)f^4vf5O}r=LE;`YHNvI=^e@w^ES97yk*l*s!g-BWWwm#CWYe3b%p7rhD<(%K@ zynfWZKQVlqx9ODcHJN|-{<1qTSm&j#)F;NdSq&7!em@9r4g-{m9!SPMBV~rs!C^k* z3A$R(8mQp&H{Ic?8rkLN*YtV`riX{Eig&C@jeke;!U%czJyBkHrA^Yq@;c767E}Hb z!ypVjya5$$JmvRH9b#AZeBb6r|8`S%`H;9ajrERWh#F*;qgmsHv5hq0K}Y0YSiX{i zt-J$;HDnC{A^HdsYPa@I(Ef z#=3Lc`y*+MABh6Q?pYBwt~R}$m52SAA**hGhsWkmtKUzSggjZeL0W0S=a6RnCsV26 zX0wEbc&Npu4WNzw(tbE2GO90ulpdB|p#~`-lMR>M40%tz4w@uF;fL+aRPN*Hp#PZu zbLz-mz>@2+f6=ciu;QuECt9~JpudjTUlW4vrTifnzj>RK;{WK9h6?X-n`F*{CH(= z_sTkGAhL=$F4P(A&q70?jRjSk3#yC+Wi-zh;VKT;WfXLU4(gdr`vn$66yDa19(|ZR=ay)FEW0_Rq?s(? zGn~HW1izRZcAq){h{KfKL2bM0}F!tU^=vDJE&^H6zXKB8qbSrC9RS1j~o+U`780_}fk3l5=J^PsG={Z+ss zJQ6?Vp!#zR*q&u=mYntdxtd~1R&u7<25enleJW`a3q!_XuUYLc<=>>=a^^o`iT_Gb z?*VDZ!I}Jk-9ralO#4MNkw@niKm1r~u&LdbZ1#_`u=eBd3)wLFT7mupv~!Gp zPPMyDqH!DmjNqTP4U2@pVax8A_8!Q5F9Cp}{y{$aQlUGc2F^97I~yrVchnPK;+f~F zZ8cZi!v5r4FFr0$-8QXOsFdMVk~a(>E;}8J!rv8VsG!>@0Tub(U)MM_{@MJ(!13@( zZ2Z_*Af=8}k=sDkw}fSGAH6&!*4F;fjq$sff?m$w6U-(4k5<2Y;)i!^jm$ORmashO zKaPB37q?d%2?m+EFYnGDt{hf8y>1Rm3^F$bV&kdf_zC9o0wn$Cif72OOZz%%&j2K4 znGmuAbZZB~o~0Xd=A45^wgGpl!KES*8Ps0*91?CGPEQp^yMAWj$9I3up*yRB%}d{e zKc@ewv3@(=8cU$3wjhrTvuA|ybEB_w?OPSWA(6*1l0UmY6LyXyAjdqujU`1`)dFRrT3w-FD?+=t`N`mZdxWu-pYqr18VW5*1#4QypoTiHjODIbcHQWlCD&SOn# zN+-4gfD_5tOZ?tJbMd)Q5tgCSi^7@@qxjWC5YTUYZ-K?yNJKX>N7JD~cjD4f=#tP~ zk@Wkt0T#?#Qs$ifa|RJv4^#hl+8Ylow@F+A5Ru+{f_MD=db=@4)b~_<%UIwmS==1v zNC|wDxwc#Q_}Kmvht}BM%du>3`fN~oT%FWXcOLGP z={@U$CPimNL(@Q$`&z=hEl$c!pAX?$AR@Dj-Jh@(7@8YDRzPI)bX`tQMy9HDB<6}s zRlzX>Zsdh!LsEA1K>Hju{_#(EYFb9$C-53>rTgZ*w-4V`J`jKIZ+P+E{u%E(vg1$Z zKJ(IqJ+eSn;{&}&yySAY{bCMQc+u~o^<|m0IsqByl)F|~Np-d*IDSdME(VWM!TJTd zDKSKUW}@TgM6A@RsBkgpj}rVJN$R5O^fL>TjHwMSBJ~_Q1QKW{ZhmNkbptqQ_EFI5z|`AMyZkV~U%pzAg35#D9hXq_)4aTnC& zwKG%aIzzSQRci%gc;Ak7Mh~&RkV&xs4=|brm1NDe!~HK85k`1vCK9ME$gg{@+6TTF zbiBCQ>(SG9wnMh%z+&3GhZ1R$uc2(Ozy9}na!6Xb z(C0?d42#u6?*%VQdRty?MiDl$`^_7Jdue-ZJoqW%UW2}$KrBbSy9slMW%T=xZG!h- zI$ihM+g^3ZIvaf(eiU9 zH!^3utY*L=2*`qKnlsyKX`3tV<6gx)%=OF6?msJCM&_FEr&|3e_N(IXzk9$zY93=^lL!S z&snxmzQJMdAKqd$$jm1z6p7=BgDo7eRmclUW>diB78z(3I7#k}F7*oacUG7>f=YD7 zx6eQO+l;)iHTnKEGgUt`A025KJG6Rro&{>-jx>XSrriqAi^LsAALnXDTj`30#NJ^( z*={fiOuL$v{X#kd>atn zYfho2*pFpNW~ROqCde24jhsHeWQq8n!qYF$wP=R$ZM6t3OjjfkKR0Y5;bu@t=EifA z(GBHCft>7n6CZ14-Q2fhOPC23fx`iQHCsq?mP|^IP4|>LNJ3XhP$qJS{-?m128xE4 zoVV^91IQgIS7hL#b6VSX&DOU4E5_7g+szK45a(k`MvX2E)2^Y7aUxHj{o`DQH)%~a zWYJjt6)GoQOkdNQT*yw}oEc;mpymhUTa(Y~HfDy*q@yxuxH--m#}%Y;T{gE0`JHpw z@^*x?3hN#3Rp*H6TpiANX38UJOHP4j+Fz>dtQXU+U6!~+p&~Y1a>KJeSSaDMZ&v=x z(5-$O^1)&k%0vfXKg(ow){EUmldR1rQLFSDw&$HbAa7Ri`|LGmIg>#=-}NVnm%aUm zTiGPCx)SUQ0;>OsglCegh?WdlP_u$bcXXA99K;R`GBwOmX}xOaV;02iMVr)?ltRsPTq{>WP5J)>)0t71;+_ust>K*T`PRJ)5RxoHx0b$vBaF;*%7 z;&NRS_l%Y}ImVTY3+Dw?xv_V!dX(1rF=d76_|1B;TyQ%UKja589MCmMQbDV41ZSRP zDM&u$*9cnKeB06SU@>Q@oe2V$wE;hUV%uHc#&zHNRqvjREjX@!JF_s3vpL%s$8o;6 zF#xZ6=<;{RZ(QW+QB0EQsPHAK-XIXj!O_`!RW^*seCL_@zT}V3)WR!w-oxms`(wnD z|Mu84484x1tx|1d`aJv;%fB)UNh+pQq5T6xG0}wfM?lQ!%m`VfRXlRmqK*>$CYEAt zrfBPsnpBtfKK=L2$W74B--gw2#<91}aCQ?+Fw?p{#cg@_VpV7I4el)+USV3Vo-}y( z?F<`K<0F4X_If{t0ZNAGvZ;-@TlMBS2o$yLr?Jx;njy4|rWngH5PLc?!ppns-{YRf z@p5CCSBQRO4dW38MxN1pp%bAq?A0p5c69V7*K?_^5!gz3_45Rejk=pcs!NJP!o$l{ zXimj&mngF}h2+ig1plMkZNI)b*^h-e)S|;LNHvl{1Nm{!*`+^TJao>pzsMNS9yU(G`^c2sbrnu33H>aBGk--nBoMTbriEm`$Yc9eD9*OKj{7GCNt(j^Ms ztIH=;9G1qQx_`ae^E)|capbN=$j*-B@S75elT;nddPif*c?FD}fjj5N>&0^rN0;1a zih<`SO632wbE$FU(pA-u+NkYIU*xL1AqETZF%4UjbgT~7Ebb(QZFnWr*>XlrPYwwW!2$<$xwD9^YcH81trB+SOKno z$eWFt#?*Fq*WW1Rt$Z@&iZj`h>(rEE`d*<@pJ-Ij=~U}3Yy0$4w=|Dk9k=McP^`~_ zc^ZiqM1lEVHov-aerz(@#gyoL4U`7c!Z(cp&uGBIWF_wTpl*#oA=Ei;v*!KjGcYZ# z6WC5^u${q<(!%Heh=}?};J`1~qqb}1v*BS3V9dCQmW!%evQ7Wa4meTStabP)!iQ?p zv-HKr)#%DzG3!(5(DU%sPt9x8pRj=2<=~=XYQtZp==}=vYonPzB7>ir0p|zxu04$by`;C>+{@H14h=0L30L7Nq;WhG_h9m}|3EqE{9wXlF zeczb)Q|bizlm?3_YxkmbP){)4+bd;%BwHdRf8jW}Qo!|ib8f<=_zW}~QDj|(Uf7Zd zXbrnJc@v`}Xo-`tlPGI$qGnOgUDr~&U#UoEn1XM#p3cLv)v9>=UmLs{$8T&YmW7#v z)#Hc)KvmZ+{>1^;;MqKn+gp*EQP+dRI~(3 zw32Pp0Z?3A!ekpxsN%TtoGg@yg%AB(?%M<1&wg*^l=U&^RNo?gHe%S06xU}SFNdw^ zXKDm}|0#|8nVvbE2P$bdLF&C^B=0*{Y``^a=b7~68}?r6(X;SHpZ_%tXS|t`p5Hx> ztG0CzK8anye6pl+^Z=mPnpB{V*Z6+-I(xyz0Yi&i+E1p&<~z$+TwHygaiK?X63#$h zPDxevcTa^bbAJ&E#UY;C_+>eOE9_C0rsdPu>{&NP12b`~8MWPr?F7z2$|TPkamozZ zuGg;ua*lbybXNHwt==B{DT2twX4P|e3&D#lBhSMfc89>G&yo>Kc<|i#`%vEb2`*NX zmw%2A=+{JkWzR4FU8-PBi8mT{^R6BJuI$%(`DU)<`*1QskHYUY8euL8ngFg%3NY66LW(-P~sZAfTZ};S=4{mC;iN~}z0MqTOwlYzO z%9mX<)DEHk6kysW`_ETqtuN#Rr%oIz!)ia<{NymvGd($1?^DEeV2uf86NosF3kxa- zE?j^9=G+S4O54e2%B0S$Xj@cNzpxnK@#{dCTW(9tZwbHhznoT{2ogQ9ORzfeQv)wY zVC&JF--NqdVkmm9Rl2B;m0jD?U*Z7RH2wCAWrv<8nKm`fgJ_ADZ_O>c;!wt7h}Bk7 zd;%AbgTr5R)nodL`!f_xVq-w0K{GErC0R)7lwJhD$+P)OEoFOTJxkESsJQ5Z$ zQD+d}3Q9%IBe1}yRYfLaa~Dm5H+N+d?Fw;!a$mT{+v@!Xfn-8oPxJY8XF`@JlrH6r zv3Us6V^?EZ-ebZX$ZbGuI+Xjysd7D|+#>ucY#p4yc2k~ME&u5zdifzs`^_5Dmi?z5 zsuu7ldwxUog=l>=nHO8Uh%g!zE<;EI)X{9|?{RP2Y=q*=MD0oBFh%N%I502qga7WT zb@eF)J{fCq)XrsU_&vecqTwYo%aibx3h8;N3{<`B)u%dPpqLoKbL!-WBKiEg@`sHTJ0 zl;z{s)GL-;tCXV-7a7gmR{v4xM4*74tM>FtX?FOHNGdE+y-)P{I3!JmgbtUXW)_{SWY_dvZKIv`_v$iifqtz<4nc>9uP z={&s1S9zT&=_Z>DqaoxhSP_F5;W&h8XgV-g?HAbHx$VD{`}Sd@UL!Xj#MN|$H?>tk z@^hp8$i_?-%^D4xuN!Hwf5>z85)eGGRjtza zy+D592>P<0`Q6Cd$UUEsxb)bB*-42VTe_$lHy6<5zR{x7b&=j;k)a6cHc+S@e0)BI zZW6C6j@GeRil}ak5#-qPTk_5Xm|C#X92ZuxAAa1ONqe*PL^Y$z}F5h9SYSZXb{ zN_vNV_%R@%z`|*7{Me)K#3eWNIlKAMc4y0{ttDj3xtEm@H0Z^XYZMS%DQ{$TZD2nY zrG6X*Hz<@Hjf33^^J^JOv&|7P{U@h92Ae&5u6= z7)lt8?)&Op0H-W6WjC0tT8-PhW-7(4;RFAESBnu|JD78rh}}I0fxuZI6$)Z}Qv9e1 z1^=prlZm$yAq0P4zICbi+RctUMX(H`3A1`!EcCVM3eOh1knHlkPa|3)*>fX0*6vx=|rF4%ZnnGsL@2%G5E0gn1* z62Icr+slA2n!Jx~3Z7PNeEfs_qog7Vwbu}E#`3f9f^Ldy9gsR!L`7d zza(hO_>!`&SB^su-&&#@+Q4L?Lb85|Qrws1<+R$|O-trD6Ysa<`}armFWBVcwE8rH zK-xY{%&UoRQ1zA8E&0kr+XeB%9YW1^#IYN-bnrJoQM0mQN(9zx__cn$AQ1f0a^Pvb zoKLdm-BDf=R`_bVO-<_qUJ~W5=gdtzMiU2@aHs#D>Qf^8a&-9lD$qNFOyd)5k(oMc zqbUb!(nZO>XPH09`d+y)v^TB`51%fUPP`T8^8)v%>0;A$reo+pmhvK_{*li47>i#+ z5XF>v%0U&*pm=pO@Hltn)y{bsF2&O_GmxO*7yC>KYes~TBKaf93@$b1ZO``Lubhs~ zfwk)oXD_+Xjiz@V)sx0q=S&dY!E~sNaSpMzdB@h2s3kFWz(A@mKXTk%$-f+Xa;!6dAW%en zer0{7P@ap9O}_I>V&ZFNEJd4U{qyR_=7T_{q&HbF9%tl#QNRs0DhPsQ0Us@f8f*J= zL32LEXB2N-f63ENte&wM3R+k0l&y0y@G#)>qKvvNo;-{{v@gv&I5=|M!rezo^8Hvae81I%AY-n=zanocZEoAP}2dAjHQ;FtDd znktQ~k$6vrbHzsS%WaT2Q`a@Mxso0H+s$VB8414CVEPBxl;L_zy#|4w)@^Q8W6^CM z-&OJps$9fTSY&Wyf_zKWvZu(_KX!@FU`#Th=kH*1&psp(UMbPT0tF}vf$YDbAWO9M z%fzv>H~brs<^FOV=V3y7?jrMg&34Yt<$As-mCH~qxS!jU+-s+;h~j6eR-V6j?d~D+ z&~-la$xJE?J@$^T8SnmUQ@0|QmHHhefxSv{9R4Q7>-KhMP3OVa#ga$-@!A#PUKKV+ zZAuCOn(!d?WcXr`=gjX6E|ii@+P&%z@p=}p&Am4hLO_}Uq|nR82V33FG?O16_AaZX z={}t|nG~3(UN=Xi1NwzP?OVb;B#--63`BhOw}0*PXVvp%b{e?gn$FcTY<7nYxRHbqog39u z2`kWpNt606Wdz1BdRCW-C0ie>N#~}Mz3ta?6cP+c3k~3ew#DTDU3~eSGc!lwhl=T& zKqwwpA&%p{aQssYcRYPPdvnW^oGqY#<~ct2wc$;Zb0AjZ1DuEs=n@Xk~ z#cFtfKZErwM#352vdA@cPI?cSe1G*+|W5t{I1Y<0bw-)a@H=OfF*ak{z<3nf-( zAU2Q*to-nB@SX$E9lb=+w|r(uWpv>n^}P#*81!=!Z=`A>rIaA6q%*9oVpb^Rt6rm! zS;8!v^_01jUN1bWedyeuu(&$EG@-1rK%9@Q9#vXP1N)aaH73GoS7}t$0oUbyLbmqJ zff+yT(Gle?eB&VBQayV~_Kd%wOLa)KH?c-Te-&&i zCGuz?rMSrY_`zL(AG}lH(og{zM8&F3PF}jD_keV`pd_K}|3{ZRjr_IDuFtY_w=U_s zGw}nv#t8xqKi)&I&;a$<(&|vNweg9-B7@EC z`~00Rr+zV!iHXDwzrt5}`LI8g1qi92-r(9Qx^JGM#iolE%MWUs@$1L$N~1niMcMqz z&OgHLj~aPdVXSKl%bS{93*LeCpgU*LD*pRXR3R=oyiKSmtl5Y&`^5G%ZnTi{FB`8CtO4|ESNJVR$^P;0!bXicNjb@aST3x7 z^F9hSN)gI7U^*IHqkK4PL`e(3^&6cpzE8~cxL=JfM$YpiH2tMHI+#LI#1pnr2PtL1 z1=(tIW32d0d@7Q|J8CA=7CRuhjD5q(V7GcDl$yQy0X~2Xloqk(H8Ubd;Xv5GautcJ zF-BqlB~76yLd1YfIi%sslA*sK;&Qpr8v>O7hoWCsB@W|DkXHK4^2iaPC6l!c6!D?) zP3+vwAttf1sVDz1Nq*H=tx{B`mEe!VhC@T~rzi8MaLFU*sy`50)Hh{p75`58Epo?h zp_J&t@Odkh{K%@cUCr2u98yC~)}V}A7YUeBy(ohHbVr+nn5DgjRXu-eZZ9&ZQrqoO zWQX?CJ@d?nPR(k>xBU$QrzHsh#^vC_!EpUTh;&pLD-F~vGEze8fv@vOUIINr?AZ`p zi?kTay66>}X2u6f|GIeD^xONxy*qg3Z(!fqV?NLQLr($_P(1(hxmHVxaaP=C(w7FA zW6r#vG(Us&r9oflrP|Cq0wmy9i#!j8T_e?PE!hCz@zRhogargxwt^wVtyc9R4B; ztjUsayk4ByZN|Cv7aO^T2oeE3QK*p~bn8~P8%lLbTzh>QVD1#sI7AWmRkh-T(hX1Tp><94l&%eo;?#pXjyN>BQ%Z@Hv59Jl$hCAf0#e|WA1*MSTqdi zc6r|&-||b{M5m<_5Mn^ij)GUSbEo~&!@n8dkHHY!>uO~htZy-JBj{VBil>b5SileH zN*3xSe|bN=bpZv0h#^v(3zq0NO97K-WxG?CCjPa%->K#-UHQHz@3WF{xdPZZVthz^AGa0iZ#`rJAmfq{K7Y;5wEHs7`3N?gdUlneb_n*SCU2p4H0OB6EY58wfFU% zNf<7p%5}IS{4AaY^5HqtcHMcz$|^;f3FmsqWrE+RDsSI6Ab<7H`J{rg$b|F^PR68e zX*kq>>Z86ZrGNSpKNR^`6s0pLtAIlJ-i-wx=S4d!Cl?GQ@(RXCByY0eKu8%f6SQ~h=rVG~D?)U#NCz1|&}ZQ_J|^W^$0 zxA2WJ@m#U%+a9%u!0)V&zQ_jN22EUR_&1rm=e{z5YozaJ0ZCyzE{q@@80O3uYNmQL zND}IcxUA6T!LB%;hjabRi85rcmdh*PYMvV?-8-P6rHaWS!*)9_c|L>#(*zN zEH3KKiLsdTKE_Svcj-NuTCZPbKh&ZIe@di?ydVoD%%UX6at^Cp0_f#>NmLJiNCwxMvq2Uj#)OyS{qDRuV49L-WfJO zBJ*(S)d}dA@{w^ZZ9l_&o=c0=`_Sv09(&Yxuv z2ZsK}txhI`M)&3GVCip|bq^g(lTq5#jSx!Ri$Xx15lI~00S9sPx!DsY4h!S&FUci( zf10Fxm&A$(Be@?Z>;yi;?DJ#UYtM**moueCG`$R{pV&2+)FI{(3H`h>Ia0fp*#>%p zm5aU~If?8ILX*k$g7IzM9H;9A){P$j-Uv8YhpHndyJJvwf37j>5q3g67(Lyq<@0^5OC2RK0~-fJTbUCq_Goc1pBmf|`I^pZ~O*!j8>a)z?%p z%U%57qK}o}GE}lWFh(bIX%qL`U_`WuV@HcoQpz7NsX8vDR_3?G-Qo_>rH(Vu(y_rl zfZE$ThYE=XDnwJY%+8oHN=byZ;Y4p&g5#q9eDBE^uW0MmJXm_oUnDP0BkX}zaWvAT z5F(GoRd=MgGJh@p&tZ{VT!eZ~NBav1LfhTjvIdCVvEqBaEZ}OMobxd<^qs0rZjOd{ z`la?E=cTOF*_wKIAnK=72^nnSp6&P3{3n5m-%p5Apr?TaVuN5X7_V>14!y~ug-+RU)Jp{cSY5jW(DB)C6u zFCENd4F?-*;8*sceDy`=WT89G%G5t>5alz_YgPJr`ZLju5zY7W<>uv9_tu}G!bBwo zg~3M01LXF()pr1Fxj0jHJ-(XoskC2<*6GEwls`Qb5cR_A#;FTZ6z&?)XQ-2P-fw<1 z#>>1_rdSfNjae9|wf>dI|F7WP?9D1$TND_$Ig8x$J+z$?s~U@hecn~2d&xT3U|{PV z(P(>8smi$!b`@;SdNlL5b*mkeEl05?Etf=vDn~K_Qma{fUNBAGO8s>j_~+y2V(Xu! zXc+=_(F1sKQw$Yo88f!Q1GI5?d(`MAotz*}4c6~|S35$H$o>lf(8W&&(Z%f|0<3t%PlqX6Td_SwNFzRK;-`)Pn`{P%@oDLhGCQ zr)#=RnZL#p^M?)LF>!YisT|>@3yF05UpdB8Mar^xa1L{NTY6&&p(07KXZ^R@%O1F_ zR>MqP9OF^h(!YUL#sm!&6?0`eb*K67*)}wfAvrpz|MfwC&v+{uBQ_qKZREKt()c?q zZR`7ku)Mn2I0}lYj;&Nr?HGb(oPGmcL;O(mJ~y54i&sCakffU8)m?Ieo6PKEn!%0? zqN9ccOg6`40+!=yZK)R zT;1iJ0-6|7G;KxPiM+$2N{w$5dhoWG?|ZnqJHqjDKM|#-qrowVJxc8M@*8e2dOWs} zEOrd0cAn5b{xNS+#y_is3TiGcq`c?PROR+gf2 zY2Hn_IzJ(R{IjyBi0IQG3HGeMzg;5gad5GMlW--#i|U)=`ZkzQAg^(7k#-Coh}bz# zJ-5l9THdrKZ}rKC!1<(TzQ-aQP1YRmmmjE);<`P#;W8C*znz4lo&MY3(q;J_(zk}? z$ddXW3bQrA+?c+(U4APIg2E1x0QJYwI|Z_c??Q*9IS!;6 zF@&6jCXam0zlDT$W%VIZQxZagCw#eW0}!iclf62q8rtFd7vO0U75LnvPH$&fTfya0Fe&GfTX z?iyeBthImHWcdHHi?Hn{MSL^Z)yAApjT{L%`?;#bTE6J{zdIAVa)5|Js{f-cF`hLx z>i=wi^c!-cC(G@;So}7;E3n*pUMN+ya~LP LQ Date: Thu, 25 Dec 2025 19:58:38 +0100 Subject: [PATCH 09/18] feat: add gitea-basic-runner --- gitea/.env.example | 3 ++- gitea/compose.yaml | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/gitea/.env.example b/gitea/.env.example index b5a1c0a..6f45966 100644 --- a/gitea/.env.example +++ b/gitea/.env.example @@ -1,3 +1,4 @@ GITEA_POSTGRES_USER= GITEA_POSTGRES_PASSWORD= -GITEA_POSTGRES_DB=gitea \ No newline at end of file +GITEA_POSTGRES_DB=gitea +BASIC-RUNNER_TOKEN= \ No newline at end of file diff --git a/gitea/compose.yaml b/gitea/compose.yaml index 2e0c67b..ba532e2 100644 --- a/gitea/compose.yaml +++ b/gitea/compose.yaml @@ -52,6 +52,25 @@ services: depends_on: - db + runner: + image: gitea/act_runner:0.2.11 + container_name: gitea-runner + restart: always + depends_on: + - server + env_file: + - .env + networks: + - gitea-db + environment: + - GITEA_INSTANCE_URL=http://server:3000 + - GITEA_RUNNER_REGISTRATION_TOKEN=${BASIC-RUNNER_TOKEN} + - GITEA_RUNNER_NAME=basic-runner + - GITEA_RUNNER_LABELS=docker:docker://node:20-bookworm,ubuntu-latest:docker://node:20-bookworm + volumes: + - ./gitea-runner:/data + - /var/run/docker.sock:/var/run/docker.sock + db: image: docker.io/library/postgres:14 restart: always From e0f7ab656182397ff67b5d73a97723779ceac4c2 Mon Sep 17 00:00:00 2001 From: mr-forust Date: Thu, 25 Dec 2025 20:00:22 +0100 Subject: [PATCH 10/18] chore: gitea runners gitignored --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 6cc9cbd..7d81695 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ sync.ffs_lock # Volumes and data directories gitea/gitea-db/ gitea/gitea-data/* +gitea/*runner/* n8n/n8n-data/* n8n/n8n-node-data/* adguardhome/data/* From d20ec696a389c848929df1ae42eb016584aa58d6 Mon Sep 17 00:00:00 2001 From: mr-forust Date: Fri, 26 Dec 2025 21:02:47 +0100 Subject: [PATCH 11/18] tcp router for gite ssh --- gitea/compose.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gitea/compose.yaml b/gitea/compose.yaml index ad4982a..7c3a43f 100644 --- a/gitea/compose.yaml +++ b/gitea/compose.yaml @@ -12,8 +12,8 @@ services: - GITEA__database__PASSWD=gitea - GITEA__database__NAME=gitea #Server - - GITEA__server__ROOT_URL=gitea.forust.xyz - - SSH_DOMAIN=gitea.forust.xyz + - GITEA__server__ROOT_URL=https://gitea.forust.xyz + - GITEA__server__SSH_DOMAIN=gitssh.forust.xyz - GITEA__server__SSH_PORT=2221 restart: always networks: From 60c7d4ff177fd298a5ea2c8944ceb96f0f12ebec Mon Sep 17 00:00:00 2001 From: mr-forust Date: Sun, 28 Dec 2025 21:08:18 +0100 Subject: [PATCH 12/18] feat: add mailer support and credentials for gitea --- gitea/.env.example | 5 ++++- gitea/compose.yaml | 9 +++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/gitea/.env.example b/gitea/.env.example index 6f45966..672c2e6 100644 --- a/gitea/.env.example +++ b/gitea/.env.example @@ -1,4 +1,7 @@ GITEA_POSTGRES_USER= GITEA_POSTGRES_PASSWORD= GITEA_POSTGRES_DB=gitea -BASIC-RUNNER_TOKEN= \ No newline at end of file +BASIC-RUNNER_TOKEN= +GITEA_SMTP_PASS= +MAILER_ADDR= +SERVICE_EMAIL=email.used.by.services@domain.tld \ No newline at end of file diff --git a/gitea/compose.yaml b/gitea/compose.yaml index 7c3a43f..1bdd309 100644 --- a/gitea/compose.yaml +++ b/gitea/compose.yaml @@ -15,6 +15,15 @@ services: - GITEA__server__ROOT_URL=https://gitea.forust.xyz - GITEA__server__SSH_DOMAIN=gitssh.forust.xyz - GITEA__server__SSH_PORT=2221 + # Mailer + - GITEA__mailer__ENABLED=true + - GITEA__mailer__FROM=${SERVICE_EMAIL} + - GITEA__mailer__SMTP_ADDR=${MAILER_ADDR}:465 + - GITEA__mailer__USER=${SERVICE_EMAIL} + - GITEA__mailer__PASSWD=${GITEA_SMTP_PASS} + - GITEA__mailer__PROTOCOL=SMTP + - GITEA__service__REGISTER_EMAIL_CONFIRM=true + - GITEA__service__ENABLE_NOTIFY_MAIL=true restart: always networks: - gitea-db From fb2f42052026ea88bad4aa9ee2d123069a4f9c41 Mon Sep 17 00:00:00 2001 From: mr-forust Date: Tue, 30 Dec 2025 14:14:24 +0100 Subject: [PATCH 13/18] refactor: update network refs form "traefik-proxy" to "proxy" - To allow testing dev vers of other services --- adguardhome/compose.yaml | 6 +++--- authentik/compose.yaml | 6 +++--- dockmon/compose.yaml | 6 +++--- downtify/compose.yaml | 4 ++-- gitea/compose.yaml | 6 +++--- glance/compose.yaml | 6 +++--- homepages/compose.yaml | 10 +++++----- metube/compose.yaml | 6 +++--- n8n/compose.yaml | 6 +++--- nextcloud/compose.yaml | 8 ++++---- penpot/compose.yaml | 6 +++--- portainer/compose.yaml | 6 +++--- termix/compose.yaml | 6 +++--- traefik/compose.yaml | 10 +++++----- uptime-kuma/compose.yaml | 6 +++--- 15 files changed, 49 insertions(+), 49 deletions(-) diff --git a/adguardhome/compose.yaml b/adguardhome/compose.yaml index bbcd151..2e3b7c6 100644 --- a/adguardhome/compose.yaml +++ b/adguardhome/compose.yaml @@ -15,10 +15,10 @@ services: - ./data/work:/opt/adguardhome/work - ./data/conf:/opt/adguardhome/conf networks: - - traefik-proxy + - proxy labels: - "traefik.enable=true" - - "traefik.docker.network=traefik-proxy" + - "traefik.docker.network=proxy" # Prod Router - "traefik.http.routers.adguard.rule=Host(`adguard.forust.xyz`)" @@ -46,5 +46,5 @@ services: - glance.url=https://adguard.forust.xyz/ - glance.description=AdGuard Home is a network-wide software for blocking ads. networks: - traefik-proxy: + proxy: external: true diff --git a/authentik/compose.yaml b/authentik/compose.yaml index 537793d..2311c1c 100644 --- a/authentik/compose.yaml +++ b/authentik/compose.yaml @@ -40,7 +40,7 @@ services: labels: - "traefik.enable=true" - - "traefik.docker.network=traefik-proxy" + - "traefik.docker.network=proxy" # Services # - "traefik.http.services.authentik-server.loadbalancer.server.port=9443" - "traefik.http.services.authentik-server.loadbalancer.server.port=9000" @@ -69,7 +69,7 @@ services: - ./media:/media - ./custom-templates:/templates networks: - - traefik-proxy + - proxy - authentik depends_on: postgresql: @@ -102,5 +102,5 @@ volumes: driver: local networks: authentik: - traefik-proxy: + proxy: external: true diff --git a/dockmon/compose.yaml b/dockmon/compose.yaml index b3dc1c3..b7f11de 100644 --- a/dockmon/compose.yaml +++ b/dockmon/compose.yaml @@ -16,10 +16,10 @@ services: timeout: 10s retries: 3 networks: - - traefik-proxy + - proxy labels: - "traefik.enable=true" - - "traefik.docker.network=traefik-proxy" + - "traefik.docker.network=proxy" # Prod Router - "traefik.http.routers.dockmon.rule=Host(`dockmon.forust.xyz`)" @@ -50,5 +50,5 @@ services: - glance.description=Dockmon is a lightweight Docker container monitoring and management tool with a user-friendly web interface. networks: - traefik-proxy: + proxy: external: true diff --git a/downtify/compose.yaml b/downtify/compose.yaml index 06f92f7..f507091 100644 --- a/downtify/compose.yaml +++ b/downtify/compose.yaml @@ -29,11 +29,11 @@ services: - traefik.http.routers.downtify-dev.service=downtify - traefik.http.routers.downtify-dev.tls=true networks: - - traefik-proxy + - proxy volumes: - ./Downtify_downloads:/downloads networks: - traefik-proxy: + proxy: external: true diff --git a/gitea/compose.yaml b/gitea/compose.yaml index 1bdd309..bf2d696 100644 --- a/gitea/compose.yaml +++ b/gitea/compose.yaml @@ -27,14 +27,14 @@ services: restart: always networks: - gitea-db - - traefik-proxy + - proxy volumes: - ./gitea-data:/data - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro labels: - "traefik.enable=true" - - "traefik.docker.network=traefik-proxy" + - "traefik.docker.network=proxy" # Prod Router - "traefik.http.routers.gitea.rule=Host(`gitea.forust.xyz`)" @@ -99,5 +99,5 @@ services: networks: gitea-db: external: false - traefik-proxy: + proxy: external: true diff --git a/glance/compose.yaml b/glance/compose.yaml index 6c940ab..cd853ab 100644 --- a/glance/compose.yaml +++ b/glance/compose.yaml @@ -11,7 +11,7 @@ services: env_file: .env labels: - "traefik.enable=true" - - "traefik.docker.network=traefik-proxy" + - "traefik.docker.network=proxy" # Prod Router - "traefik.http.routers.glance.rule=Host(`glance.forust.xyz`)" @@ -31,10 +31,10 @@ services: - "traefik.http.routers.glance-dev.middlewares=security-chain@file" - "traefik.http.routers.glance-dev.tls=true" networks: - - traefik-proxy + - proxy dns: - 1.1.1.1 - 8.8.8.8 networks: - traefik-proxy: + proxy: external: true \ No newline at end of file diff --git a/homepages/compose.yaml b/homepages/compose.yaml index 6a246a4..eeabd28 100644 --- a/homepages/compose.yaml +++ b/homepages/compose.yaml @@ -9,10 +9,10 @@ services: volumes: - ./forust_files:/usr/share/nginx/html networks: - - traefik-proxy + - proxy labels: - "traefik.enable=true" - - "traefik.docker.network=traefik-proxy" + - "traefik.docker.network=proxy" # Services - "traefik.http.services.forust-homepage.loadbalancer.server.port=80" @@ -48,10 +48,10 @@ services: volumes: - ./xdfnx_files:/usr/share/nginx/html networks: - - traefik-proxy + - proxy labels: - "traefik.enable=true" - - "traefik.docker.network=traefik-proxy" + - "traefik.docker.network=proxy" # Services - "traefik.http.services.xdfnx-homepage.loadbalancer.server.port=80" @@ -79,5 +79,5 @@ services: networks: - traefik-proxy: + proxy: external: true diff --git a/metube/compose.yaml b/metube/compose.yaml index 27e323d..47490eb 100644 --- a/metube/compose.yaml +++ b/metube/compose.yaml @@ -14,7 +14,7 @@ services: - ./MeTube_downloads:/downloads labels: - traefik.enable=true - - "traefik.docker.network=traefik-proxy" + - "traefik.docker.network=proxy" # Prod Router - "traefik.http.routers.metube.rule=Host(`metube.forust.xyz`)" @@ -39,7 +39,7 @@ services: - "traefik.http.routers.metube-dev.tls=true" networks: - - traefik-proxy + - proxy networks: - traefik-proxy: + proxy: external: true diff --git a/n8n/compose.yaml b/n8n/compose.yaml index bcaa985..ff73617 100644 --- a/n8n/compose.yaml +++ b/n8n/compose.yaml @@ -23,11 +23,11 @@ services: - 1.1.1.1 - 8.8.8.8 networks: - - traefik-proxy + - proxy - n8n labels: - "traefik.enable=true" - - "traefik.docker.network=traefik-proxy" + - "traefik.docker.network=proxy" # Prod Router - "traefik.http.routers.n8n.rule=Host(`n8n.forust.xyz`)" @@ -58,5 +58,5 @@ services: networks: n8n: external: false - traefik-proxy: + proxy: external: true diff --git a/nextcloud/compose.yaml b/nextcloud/compose.yaml index e9bf811..dfc77a3 100644 --- a/nextcloud/compose.yaml +++ b/nextcloud/compose.yaml @@ -9,7 +9,7 @@ services: - /var/run/docker.sock:/var/run/docker.sock:ro networks: - nextcloud-aio - - traefik-proxy # Optional: Connects the mastercontainer to the traefik-proxy network in order to make the built-in reverse proxy detection work. See https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md + - proxy # Optional: Connects the mastercontainer to the proxy network in order to make the built-in reverse proxy detection work. See https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md # ports: # - 8081:80 # may be removed if under reverse-proxy # - 8443:8443 @@ -17,7 +17,7 @@ services: labels: - "traefik.enable=true" - - "traefik.docker.network=traefik-proxy" + - "traefik.docker.network=proxy" # AIO Services configuration - "traefik.http.services.nextcloud-aio.loadbalancer.server.port=8080" @@ -55,7 +55,7 @@ services: AIO_DISABLE_BACKUP_SECTION: false APACHE_PORT: 11000 # Is needed when running behind a web server or reverse proxy (like Apache, Nginx, Caddy, Cloudflare Tunnel and else). See https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md APACHE_IP_BINDING: 0.0.0.0 # Configure when going with reverse-proxy https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md - APACHE_ADDITIONAL_NETWORK: traefik-proxy # (Optional) Connect the apache container to an additional docker network. When going with reverse-proxy. See https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md + APACHE_ADDITIONAL_NETWORK: proxy # (Optional) Connect the apache container to an additional docker network. When going with reverse-proxy. See https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md BORG_RETENTION_POLICY: --keep-within=7d --keep-weekly=4 --keep-monthly=6 # Backup retention See https://github.com/nextcloud/all-in-one#how-to-adjust-borgs-retention-policy COLLABORA_SECCOMP_DISABLED: false # Setting this to true allows to disable Collabora's Seccomp feature. See https://github.com/nextcloud/all-in-one#how-to-disable-collaboras-seccomp-feature FULLTEXTSEARCH_JAVA_OPTIONS: "-Xms1024M -Xmx1024M" # adjust fulltextsearch java options. https://github.com/nextcloud/all-in-one#how-to-adjust-the-fulltextsearch-java-options @@ -75,7 +75,7 @@ services: # WATCHTOWER_DOCKER_SOCKET_PATH: /var/run/docker.sock # Needs to be specified if the docker socket on the host is not located in the default '/var/run/docker.sock'. For macos it needs to be '/var/run/docker.sock' networks: - traefik-proxy: + proxy: external: true nextcloud-aio: driver: bridge diff --git a/penpot/compose.yaml b/penpot/compose.yaml index db2b1b1..aebb831 100644 --- a/penpot/compose.yaml +++ b/penpot/compose.yaml @@ -50,7 +50,7 @@ x-secret-key: &penpot-secret-key networks: penpot: - traefik-proxy: + proxy: external: true volumes: @@ -98,11 +98,11 @@ services: networks: - penpot - - traefik-proxy + - proxy labels: - "traefik.enable=true" - - "traefik.docker.network=traefik-proxy" + - "traefik.docker.network=proxy" # Prod Router - "traefik.http.routers.penpot.rule=Host(`penpot.forust.xyz`)" diff --git a/portainer/compose.yaml b/portainer/compose.yaml index 84651df..c56e465 100644 --- a/portainer/compose.yaml +++ b/portainer/compose.yaml @@ -10,10 +10,10 @@ services: - 9443:9443 # - 8000:8000 # Remove if you do not intend to use Edge Agents networks: - - traefik-proxy + - proxy labels: - "traefik.enable=true" - - "traefik.docker.network=traefik-proxy" + - "traefik.docker.network=proxy" # Prod Router - "traefik.http.routers.portainer.rule=Host(`portainer.forust.xyz`)" @@ -50,5 +50,5 @@ volumes: networks: default: name: portainer_network - traefik-proxy: + proxy: external: true diff --git a/termix/compose.yaml b/termix/compose.yaml index 44a87c1..28051b7 100644 --- a/termix/compose.yaml +++ b/termix/compose.yaml @@ -11,7 +11,7 @@ services: PORT: "8080" labels: - "traefik.enable=true" - - "traefik.docker.network=traefik-proxy" + - "traefik.docker.network=proxy" # Prod Router - "traefik.http.routers.termix.rule=Host(`termix.forust.xyz`)" @@ -35,10 +35,10 @@ services: - "traefik.http.routers.termix-dev.service=termix" - "traefik.http.routers.termix-dev.tls=true" networks: - - traefik-proxy + - proxy networks: - traefik-proxy: + proxy: external: true volumes: diff --git a/traefik/compose.yaml b/traefik/compose.yaml index b4c87dc..4f29341 100644 --- a/traefik/compose.yaml +++ b/traefik/compose.yaml @@ -11,7 +11,7 @@ services: # Providers - "--providers.docker=true" - "--providers.docker.exposedbydefault=false" - - "--providers.docker.network=traefik-proxy" + - "--providers.docker.network=proxy" - "--providers.file.directory=/etc/traefik/dynamic" - "--providers.file.watch=true" @@ -41,7 +41,7 @@ services: labels: - "traefik.enable=true" - - "traefik.docker.network=traefik-proxy" + - "traefik.docker.network=proxy" # Prod Router (Dash) - "traefik.http.routers.traefik-dashboard.rule=Host(`traefik.forust.xyz`)" @@ -80,11 +80,11 @@ services: # - ./traefik/letsencrypt:/letsencrypt networks: - - traefik-proxy + - proxy environment: - TZ=Europe/Bratislava networks: - traefik-proxy: - external: true + proxy: + external: true \ No newline at end of file diff --git a/uptime-kuma/compose.yaml b/uptime-kuma/compose.yaml index 699ba79..4051573 100644 --- a/uptime-kuma/compose.yaml +++ b/uptime-kuma/compose.yaml @@ -10,7 +10,7 @@ services: - "3001:3001" labels: - "traefik.enable=true" - - "traefik.docker.network=traefik-proxy" + - "traefik.docker.network=proxy" # Prod Router - "traefik.http.routers.uptime-kuma.rule=Host(`uptime.forust.xyz`)" @@ -28,7 +28,7 @@ services: - "traefik.http.routers.uptime-kuma-dev.entrypoints=websecure" - "traefik.http.routers.uptime-kuma-dev.tls=true" networks: - - traefik-proxy + - proxy networks: - traefik-proxy: + proxy: external: true From f2b951673c266841f27e26f8368afbb7bca6cc96 Mon Sep 17 00:00:00 2001 From: mr-forust Date: Tue, 30 Dec 2025 15:42:42 +0100 Subject: [PATCH 14/18] fix: add traefik route for dns o https --- adguardhome/compose.yaml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/adguardhome/compose.yaml b/adguardhome/compose.yaml index 2e3b7c6..205479e 100644 --- a/adguardhome/compose.yaml +++ b/adguardhome/compose.yaml @@ -3,8 +3,6 @@ services: image: adguard/adguardhome:latest container_name: adguardhome restart: unless-stopped - environment: - - TZ=${TZ} ports: - "53:53/tcp" - "53:53/udp" @@ -21,7 +19,7 @@ services: - "traefik.docker.network=proxy" # Prod Router - - "traefik.http.routers.adguard.rule=Host(`adguard.forust.xyz`)" + - "traefik.http.routers.adguard.rule=Host(`adguard.forust.xyz`) || Host(`dns.forust.xyz`)" - "traefik.http.routers.adguard.entrypoints=websecure" - "traefik.http.routers.adguard.middlewares=security-headers@file" - "traefik.http.routers.adguard.service=adguard" @@ -29,14 +27,14 @@ services: - "traefik.http.services.adguard.loadbalancer.server.port=3000" # Local Router - - "traefik.http.routers.adguard-local.rule=Host(`adguard.workstation.internal`) || Host(`adguard.internal`)" + - "traefik.http.routers.adguard-local.rule=Host(`adguard.workstation.internal`) || Host(`adguard.internal`) || Host(`dns.workstation.internal`)" - "traefik.http.routers.adguard-local.entrypoints=websecure" - "traefik.http.routers.adguard-local.middlewares=security-headers@file" - "traefik.http.routers.adguard-local.service=adguard" - "traefik.http.routers.adguard-local.tls=true" # Dev Router - - "traefik.http.routers.adguard-dev.rule=Host(`adguard.gigaforust.internal`)" + - "traefik.http.routers.adguard-dev.rule=Host(`adguard.gigaforust.internal`) || Host(`dns.gigaforust.internal`)" - "traefik.http.routers.adguard-dev.entrypoints=websecure" - "traefik.http.routers.adguard-dev.middlewares=security-headers@file" - "traefik.http.routers.adguard-dev.service=adguard" From c047cc291dbe36f17505d815f9d0995b6bdfa886 Mon Sep 17 00:00:00 2001 From: mr-forust Date: Tue, 30 Dec 2025 16:54:23 +0100 Subject: [PATCH 15/18] LE for DoH --- adguardhome/compose.yaml | 9 ++++++++- traefik/compose.yaml | 15 ++++++++------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/adguardhome/compose.yaml b/adguardhome/compose.yaml index 205479e..d61a6af 100644 --- a/adguardhome/compose.yaml +++ b/adguardhome/compose.yaml @@ -34,12 +34,19 @@ services: - "traefik.http.routers.adguard-local.tls=true" # Dev Router - - "traefik.http.routers.adguard-dev.rule=Host(`adguard.gigaforust.internal`) || Host(`dns.gigaforust.internal`)" + - "traefik.http.routers.adguard-dev.rule=Host(`adguard.gigaforust.internal`)" - "traefik.http.routers.adguard-dev.entrypoints=websecure" - "traefik.http.routers.adguard-dev.middlewares=security-headers@file" - "traefik.http.routers.adguard-dev.service=adguard" - "traefik.http.routers.adguard-dev.tls=true" + # DNS + - "traefik.http.routers.dns.rule=(Host(`dns.forust.xyz`) && PathPrefix(`/dns-query`)) || (Host(`dns.workstation.internal`) && PathPrefix(`/dns-query`)) || (Host(`dns.gigaforust.internal`) && PathPrefix(`/dns-query`))" + - "traefik.http.routers.dns.entrypoints=websecure" + - "traefik.http.routers.dns.service=adguard" + - "traefik.http.routers.dns.tls.certresolver=letsencrypt" + - "traefik.http.routers.dns.tls=true" + - glance.name=adguard - glance.url=https://adguard.forust.xyz/ - glance.description=AdGuard Home is a network-wide software for blocking ads. diff --git a/traefik/compose.yaml b/traefik/compose.yaml index 4f29341..b06b28b 100644 --- a/traefik/compose.yaml +++ b/traefik/compose.yaml @@ -23,12 +23,13 @@ services: - "--entryPoints.web.http.redirections.entryPoint.scheme=https" - "--entryPoints.ssh.address=:2221" - # 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" + # Let's Encrypt + - "--certificatesresolvers.letsencrypt.acme.email=${EMAIL}" + - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json" + - "--certificatesresolvers.letsencrypt.acme.httpchallenge=true" + - "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web" + # STAGING + - "--certificatesresolvers.letsencrypt.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory" # 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" @@ -87,4 +88,4 @@ services: networks: proxy: - external: true \ No newline at end of file + external: true From 502810a12ee83257d3d9b33b95f78e53e1e97005 Mon Sep 17 00:00:00 2001 From: mr-forust Date: Tue, 30 Dec 2025 17:20:13 +0100 Subject: [PATCH 16/18] fix: update traefik router rules for DNS and adjust letsencrypt volume path --- adguardhome/compose.yaml | 6 +++--- traefik/compose.yaml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/adguardhome/compose.yaml b/adguardhome/compose.yaml index d61a6af..0224100 100644 --- a/adguardhome/compose.yaml +++ b/adguardhome/compose.yaml @@ -19,7 +19,7 @@ services: - "traefik.docker.network=proxy" # Prod Router - - "traefik.http.routers.adguard.rule=Host(`adguard.forust.xyz`) || Host(`dns.forust.xyz`)" + - "traefik.http.routers.adguard.rule=Host(`adguard.forust.xyz`)" - "traefik.http.routers.adguard.entrypoints=websecure" - "traefik.http.routers.adguard.middlewares=security-headers@file" - "traefik.http.routers.adguard.service=adguard" @@ -27,7 +27,7 @@ services: - "traefik.http.services.adguard.loadbalancer.server.port=3000" # Local Router - - "traefik.http.routers.adguard-local.rule=Host(`adguard.workstation.internal`) || Host(`adguard.internal`) || Host(`dns.workstation.internal`)" + - "traefik.http.routers.adguard-local.rule=Host(`adguard.workstation.internal`) || Host(`adguard.internal`)" - "traefik.http.routers.adguard-local.entrypoints=websecure" - "traefik.http.routers.adguard-local.middlewares=security-headers@file" - "traefik.http.routers.adguard-local.service=adguard" @@ -41,7 +41,7 @@ services: - "traefik.http.routers.adguard-dev.tls=true" # DNS - - "traefik.http.routers.dns.rule=(Host(`dns.forust.xyz`) && PathPrefix(`/dns-query`)) || (Host(`dns.workstation.internal`) && PathPrefix(`/dns-query`)) || (Host(`dns.gigaforust.internal`) && PathPrefix(`/dns-query`))" + - "traefik.http.routers.dns.rule=(Host(`dns.forust.xyz`) && PathPrefix(`/dns-query`))" - "traefik.http.routers.dns.entrypoints=websecure" - "traefik.http.routers.dns.service=adguard" - "traefik.http.routers.dns.tls.certresolver=letsencrypt" diff --git a/traefik/compose.yaml b/traefik/compose.yaml index b06b28b..cdf4096 100644 --- a/traefik/compose.yaml +++ b/traefik/compose.yaml @@ -78,7 +78,7 @@ services: - ./dynamic:/etc/traefik/dynamic:ro - ./certs:/certs:ro - ./logs:/var/log/traefik - # - ./traefik/letsencrypt:/letsencrypt + - ./letsencrypt:/letsencrypt networks: - proxy From dc7fe64fbcecaa6325e877ef23585051820ae302 Mon Sep 17 00:00:00 2001 From: mr-forust Date: Tue, 30 Dec 2025 22:44:52 +0100 Subject: [PATCH 17/18] fix: clean up traefik configuration and add redirect middleware --- .gitignore | 1 + adguardhome/compose.yaml | 1 - traefik/compose.yaml | 7 ++----- traefik/dynamic/middlewares.yml | 28 ---------------------------- traefik/dynamic/redirect.yml | 23 +++++++++++++++++++++++ 5 files changed, 26 insertions(+), 34 deletions(-) create mode 100644 traefik/dynamic/redirect.yml diff --git a/.gitignore b/.gitignore index 7d81695..5e00c81 100644 --- a/.gitignore +++ b/.gitignore @@ -83,3 +83,4 @@ replacements.txt # Temp files edu_master/temp/ +temp/* diff --git a/adguardhome/compose.yaml b/adguardhome/compose.yaml index 0224100..7582125 100644 --- a/adguardhome/compose.yaml +++ b/adguardhome/compose.yaml @@ -45,7 +45,6 @@ services: - "traefik.http.routers.dns.entrypoints=websecure" - "traefik.http.routers.dns.service=adguard" - "traefik.http.routers.dns.tls.certresolver=letsencrypt" - - "traefik.http.routers.dns.tls=true" - glance.name=adguard - glance.url=https://adguard.forust.xyz/ diff --git a/traefik/compose.yaml b/traefik/compose.yaml index cdf4096..eff00c3 100644 --- a/traefik/compose.yaml +++ b/traefik/compose.yaml @@ -19,17 +19,14 @@ services: - "--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" - "--entryPoints.ssh.address=:2221" # Let's Encrypt - "--certificatesresolvers.letsencrypt.acme.email=${EMAIL}" - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json" - - "--certificatesresolvers.letsencrypt.acme.httpchallenge=true" - "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web" - # STAGING - - "--certificatesresolvers.letsencrypt.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory" + # # STAGING + # - "--certificatesresolvers.letsencrypt.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory" # 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" diff --git a/traefik/dynamic/middlewares.yml b/traefik/dynamic/middlewares.yml index 28d552b..0dba63f 100644 --- a/traefik/dynamic/middlewares.yml +++ b/traefik/dynamic/middlewares.yml @@ -1,33 +1,5 @@ http: middlewares: - # HTTPS Redirect - redirect-https: - redirectScheme: - scheme: https - permanent: true - - # Metube Basic Auth - metube-auth: - basicAuth: - users: - - "vv:$2y$05$JdT8AGUO9bd.E/PiCmKaoOJS1RFlXkrrmZ5mJ4f8/a1bEW39L3FbS" - - realm: "MeTube Access" - - # Basic Auth Traefik Dashboard - auth: - basicAuth: - users: - - "admin:$2y$05$.CKDD82sNUxcpaRrLbHuK.dopqt1fgurc2yfTKAT5OFzT7RvPrJHK" - realm: "Traefik Dashboard" - - # Basic Auth Dockmon - dockmon-auth: - basicAuth: - users: - - "admin:$2y$05$.CKDD82sNUxcpaRrLbHuK.dopqt1fgurc2yfTKAT5OFzT7RvPrJHK" - realm: "Dockmon Access" - # Cloudflare IP Whitelist cloudflare-ipwhitelist: ipWhiteList: diff --git a/traefik/dynamic/redirect.yml b/traefik/dynamic/redirect.yml new file mode 100644 index 0000000..fdcea94 --- /dev/null +++ b/traefik/dynamic/redirect.yml @@ -0,0 +1,23 @@ +http: + middlewares: + redirect-https: + redirectScheme: + scheme: https + permanent: true + + routers: + acme-challenge-exempt: + rule: "PathPrefix(`/.well-known/acme-challenge`)" + entryPoints: + - web + service: noop@internal + priority: 100 + + http-catchall: + rule: "HostRegexp(`{host:.+}`)" + entryPoints: + - web + middlewares: + - redirect-https + service: noop@internal + priority: 1 From 9675eac2bf67319989c11959dab98b8779586a59 Mon Sep 17 00:00:00 2001 From: mr-forust Date: Wed, 31 Dec 2025 03:41:38 +0100 Subject: [PATCH 18/18] feat: add DoT support on dns.forust.xyz - Made adguard available on adguard. and dns. subdomain - DoT and DoH implementation complete --- .gitignore | 3 +++ adguardhome/compose.yaml | 12 +++++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 5e00c81..2761f85 100644 --- a/.gitignore +++ b/.gitignore @@ -41,6 +41,9 @@ homepages/forust_files/assets/images/team/* # Traefik files traefik/letsencrypt/acme.json traefik/logs/* + +# SSL Certificates +adguardhome/certs/* traefik/certs/* # Monitoring diff --git a/adguardhome/compose.yaml b/adguardhome/compose.yaml index 7582125..e2d40f6 100644 --- a/adguardhome/compose.yaml +++ b/adguardhome/compose.yaml @@ -6,41 +6,43 @@ services: ports: - "53:53/tcp" - "53:53/udp" + - "853:853/tcp" # DNS over TLS # - "67:67/udp" # DHCP # - "68:68/tcp" # DHCP - "3000:3000/tcp" volumes: - ./data/work:/opt/adguardhome/work - ./data/conf:/opt/adguardhome/conf + - ./certs:/certs:ro networks: - proxy labels: - "traefik.enable=true" - "traefik.docker.network=proxy" + - "traefik.http.services.adguard.loadbalancer.server.port=3000" # Prod Router - - "traefik.http.routers.adguard.rule=Host(`adguard.forust.xyz`)" + - "traefik.http.routers.adguard.rule=Host(`dns.forust.xyz`) || Host(`adguard.forust.xyz`)" - "traefik.http.routers.adguard.entrypoints=websecure" - "traefik.http.routers.adguard.middlewares=security-headers@file" - "traefik.http.routers.adguard.service=adguard" - "traefik.http.routers.adguard.tls=true" - - "traefik.http.services.adguard.loadbalancer.server.port=3000" # Local Router - - "traefik.http.routers.adguard-local.rule=Host(`adguard.workstation.internal`) || Host(`adguard.internal`)" + - "traefik.http.routers.adguard-local.rule=Host(`dns.workstation.internal`) || Host(`adguard.internal`) || Host(`adguard.workstation.internal`)" - "traefik.http.routers.adguard-local.entrypoints=websecure" - "traefik.http.routers.adguard-local.middlewares=security-headers@file" - "traefik.http.routers.adguard-local.service=adguard" - "traefik.http.routers.adguard-local.tls=true" # Dev Router - - "traefik.http.routers.adguard-dev.rule=Host(`adguard.gigaforust.internal`)" + - "traefik.http.routers.adguard-dev.rule=Host(`dns.gigaforust.internal`) || Host(`adguard.gigaforust.internal`)" - "traefik.http.routers.adguard-dev.entrypoints=websecure" - "traefik.http.routers.adguard-dev.middlewares=security-headers@file" - "traefik.http.routers.adguard-dev.service=adguard" - "traefik.http.routers.adguard-dev.tls=true" - # DNS + # DoH - "traefik.http.routers.dns.rule=(Host(`dns.forust.xyz`) && PathPrefix(`/dns-query`))" - "traefik.http.routers.dns.entrypoints=websecure" - "traefik.http.routers.dns.service=adguard"