From d926cd7e694de54ea4b63c12e0a23ddbe2667184 Mon Sep 17 00:00:00 2001 From: Joao Gilberto Magalhaes Date: Sun, 22 Feb 2026 20:20:00 -0500 Subject: [PATCH] Update documentation and guides for the monitoring dashboard - Revised environment variables reference to clarify `HAPROXY_STATS_CORS_ORIGIN` requirements for the dashboard. - Enhanced README with details about the real-time monitoring dashboard and its capabilities. - Added a new "Monitoring Dashboard" guide, providing setup steps, login instructions, and feature overviews. - Included images for dashboard visuals (`dashboard_thumbnail.png`, `dashboard_login.png`). --- README.md | 9 +- docs/dashboard_login.png | Bin 0 -> 24071 bytes docs/dashboard_thumbnail.png | Bin 0 -> 47321 bytes docs/guides/dashboard.md | 144 ++++++++++++++++++++++++ docs/reference/environment-variables.md | 9 +- 5 files changed, 158 insertions(+), 4 deletions(-) create mode 100644 docs/dashboard_login.png create mode 100644 docs/dashboard_thumbnail.png create mode 100644 docs/guides/dashboard.md diff --git a/README.md b/README.md index b5bacbd..dd18174 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ EasyHAProxy dynamically creates `haproxy.cfg` based on metadata from your worklo - **Custom SSL certificates** — volume-mount or label-embed your own PEM files - **TCP mode** — proxy any TCP service, not just HTTP - **Plugin system** — JWT validation, IP whitelisting, Cloudflare IP restoration, FastCGI, path blocking, and custom plugins -- **HAProxy stats dashboard** — optional, password-protected +- **Real-time monitoring dashboard** — built-in, zero-dependency web UI with live traffic charts, frontend/backend health, and per-server stats (enabled with a single env var) - **Balance algorithms** — roundrobin, leastconn, source, uri, and more ## Supported platforms @@ -56,6 +56,13 @@ EasyHAProxy is part of some projects: - [MicroK8s](docs/guides/microk8s.md) - [DigitalOcean Marketplace](docs/guides/digitalocean.md) +## Monitoring Dashboard + +[![HAProxy Monitor](docs/dashboard_thumbnail.png)](docs/guides/dashboard.md) + +A real-time dashboard is available at `http://:11936/` whenever `HAPROXY_PASSWORD` is set — +no extra containers, no Prometheus, no Grafana. See the [dashboard guide](docs/guides/dashboard.md). + ## See EasyHAProxy in action Click on the image to see the videos (use HD for better visualization) diff --git a/docs/dashboard_login.png b/docs/dashboard_login.png new file mode 100644 index 0000000000000000000000000000000000000000..07ae0e0c2864b555e97c64b8d6a3d76db5125de6 GIT binary patch literal 24071 zcmce;bzD?o+bxWAJ9JA+3K9YW12VM4Pzngr-H3uPgpxx@C>=wWfpkboBPjxsf`ovi z)X;G5@qEwwJ#U=neD8ODzvEwun|tql$91i1t#$249c@)IVn$*tEG#m0H6=YPtZS`U zSlA4N*x)A(vqc(MSdWL)l@tt~n{8$h_*2`S_9Vn6s&jL3g&trLL9jznUrikFv59bD zB)4+;w4lEXLK{c-$uB}^1ajD((~`euBc6oF5c3D)k@Q8Xt({!i%`MxCR%N){Y_y!Z z7+fXEp7NRVUClygt)``IK5Ts3l&kWJv718!XNC_^Z@M*BE;jbwc+|*XPN&Z8M|WYw zr)L|+4m~S6C*EHf^pDmV1@6kGo>|XU#*!u5i<7z(Z?@5F8H^^)+%T;e>%;sz7q(^a z(d;pF$Cb=ZCQ-(MHUx!@jlDkp&i=iBYHLtVT-?XJV+f2;1Pcm#t@Dc; z0n1WQU|)F~3V{t!&rs>|8aSae3E4YucA=GiMjDODra@pxt*9*q3W`BQRw!gqstX+x z6C(oW424)-pMC>@y}yT`gdu4h;4s1p>@9Ud_J=u8BKA(=@lHDCuc%On9y|SieL*!3 zd#KS%G*>7@0CSxc9vE$rhV(`zDlN@XNOd7cA!P8^FBtgcrr-olRkt6XT+fe*PGSB^ zmMSXY4S@}q-*Q)|*CQVLQ;~=HhcJw>>h-z-cobwEdy}#HGybxwVso{nZaxw6;Jy`F z@Ln|aHPDWg!}o|w^dn^fX51u^=mr)Tp{I~rRs&~zC>c(x5q&Mk4+R~Ds@vGyq4m^0 zK~ABX%nMwZ4k(-J2Hk?GBeGxaxovlTFsTbX`r%_gl-YLW-g2_i8Tn>ld^Wzb^ZUDM zcIoMEr(|f23qCosK>^vt>7kgW-%j(9PK)opo#IKYt8kRDng1?#N5R%iU9`Ftub|*; zo%=k_by@lwbF(^c;sv4we!k*vhAK|PI@b#InD)E~L7O&uf4JyZRajlGi6^6$~&Eq@yy zdU*LZn2MlHTl~YMUdf;T>B!97)zuxLy18t{%xyo6VuAWq`_k6sxyWOlpWkU1kAybI z-{;w2s3RW5K&H5+5?vJ$O-efn6b>8~T_G_AISJyI^QAh#z z^72}xEN@Aq&gY>l8QX%a-p3i9p?EyJ=&JGMt2s-&iw+1(utgw!7kQEZr9>Al!*J8C^ z_PEhM;DS`+3O(ZzmPtzx9XbzLlMv+B`BD}-SLNAF?{{(90UGZ8mD1IQa-Q(BouGT- z$IEZvk(3ml-KGoftTD@hUh{daMdc?}6{mf?L8>&4C+h(4( z;b`uRIt%(MEi*oz_daBS!!<}3Y9f^Hf96Qwv-?7-co$55VpxDi?q=3pRKgj&~<#kuo>Au@Yv@E_cX;3Gz^+x z+HZV$_%Vp4)JHZjk)^|Qjfa@sS-0}(Z#@w@j!_aiA&XYzlYw9h);DgATN1h)-@Kc@ z5_!VQND-IwR~P09w8%7`-xPccgObAIbR6oc3+E^Mh0w#{AMsuJ%L%GCbf2QfhK2TK zo0^);n*E|nSFZVfYA)2^w}CeZHkXc$Mj&CnJcd7?uf%pMYe_v$WTU6%-YY6-w%-O5 zURJ*(xLMkIQvPg1BJpR?MV`;*Th_3db zIY>KmZ@ma_PZBVUdi`wUJB{P@Sf!JJw5kKw?fI*_#1$VpLn^~a=oo45BbgTc5fa{Q zOd3(!0mC)U6B6z>uF+^`N~t&P_-@bM^<>=|lDRT2fZplr>w73p5LxFHuTOw4QC0v= zdhHVci4F@De^BjmkYs4~Qao&FyMAeiW2=;+-O^tPC7?HrLqPu18XPX=B^-Rxu{z<~ z@ET<}9D>w5p!d(0PD< zs0>4oGOfO#?thsfR8FT=cBa1(bndAft$4WO&f!4|Uq|^lg=98sWz=$f7vleo&%QmJ zWCOqLyJw@sJ0EbwqAk(uJdA>d5Tp=4p>SW+q&4fn+Cd&gP}@)HkDykObvaSuVpgUt zE*~9s)V>sQ;;I-@qa&(?4;@ZZk$G~b0wU_`_<6+E z{VyA*9BWl}@X!UHAJ0b4}4NqM(0I$IQ-vZxc?<0{3pN%p5w!#nsgJt)I0CS=pxN?k%xQx`xA8J45A0=&SfJh;;xKQ zPWh^F62k)FX=3(vHa67`BYNfwQEYeaJlk9TLLNw+2iNN>S?99m6nMWiRa2 zz-izR@L0?Cp%T17V7$o}H&$;qy12l_)OI*D6qgVNp`&vzDaWjuammP8MLJf;_MK@OP3c$d0w_!I{jIy! z-7(9{XaMmPg|ag;1gyS+42w*pRc!QLci##R4{y57scC+{y|35$5coo=WT_$e}QtOJH z-qc3%=@<1n5f+X-*t~;qO+U&HL=7Sk3 z1o^}Egist3gmNO2Xp8!ro0ju+t{Gz$*2I+-oAQOrKR?Tj9mMj$XvyK#DWhTg|A;K&mG0|@U@6~2b7ZDLDiHV)cpxY1# z{6elOCLI}T87VctdB~8}=9`-Qooa^QVbT}6VABS@#pHJir&wZO!;3r9#vZmysP^Cg zJxRq9qVM6CgXd!M9yZ?+(A9KWt{k*DLS(1jbE&gXO}BN=joKxQlYm8W zwL+v2y5ROySX7iaf;d^AF={)PQ93zwk}+wdQYx7gEqL^GJmg2Hat@AzEIYg9`SI>r zs+Dxi7Ry%D1x-b{mdmyhLgumi@Drc-l%?}|FG=}3?ISmDTEhGNX;Tz5DO+`lO}CaP8@3dcT!2h}XGH6V3PgpCJ#^a1+u%a$g^;SAS75W z;FOeA&NOgLI;ZTt6n%R~M)VUG?gW2i$o)AN8e?QNk5I*)AAUq1E$NSrHqKG(W@tb3 z>7m6c?E4;eOdnD*={2gqV{&f9tUJo!X$CLaCvPyTtj@kcrnleo!DeZY6Blb-YF1c? z5nliyhq`W-f!{q|9&&O-o%M8$25oX1d9o)jy7_5Z-u5M=8uIpH`a=WH>A;WK7Axmw zEL!$0KA3!kN)(#p^QlH~;4{daRZtP4k7eDSn1;57$y#Z_ODgtg-sq$<|?WhD-2*SaC}NL zIlWPG!?S}V?dR-knWugTE1}NT-p&M~ya-Ta3s0aVW~%Msro)?1{~n?kUy8$=1ceZM zh9VA9)x|t{N+lVzrf&GtzVhN+M7g~gDxJ)r8zmKUDA~e&6EQ6}-EWi-ZnoR za~%dT{3a@}9nAjQPW1N9YyP*Lm;@zb zC`+~3fo#q;h?Suiz2oxC?5b2>F>*h8algFElR{_$CAG;$$7~}ytn4f$p71D-C9{G) zMRx{C!Rf*K6VkIF<1$&^H=|#$B^p7K!-wpcYr^)rXJ0kk`<22JM9l(+tWIUv5Qke- zZbB@JYg2mchbRV5w|mTBHHQ|pX**vES-#_N=&I~wd63!sxVre;H`Jt#5p!~^n5p-; zSw{E;ua9IfXLTG+Td)V^&@ErVkU|S(k55*OZ3Mjc*zR_+dIhn7`99%WyYc8=#$+VN>6$sY+#8;(`y7__e`F#5`(ynFM)F_Z_@6JXtF`y{kB$J;5{At3 z-ke++%s?Ed-I?&@7zW%HYtVVFu;Vy?EpXtY%6XKzcsm+IS7 z3z@gH&)#J3)c2g9_ll5?y8%5Nl$?M6sAfHq2PO6V&(Bi*;#2fiwEEPPwWYwhJ4)la zozfkz1}JmIYB(9w$R^;mTQ1Nh{>)-GHFBXuyZ22g5vM07#YIKGR?nM0I+jWah8^Y7Q=@d69OsYC{XuNzRAnC{+fMtzA8_= zrH(XQq(lIWjvKW(S`3H5V5X-24i2fjJ%nH^b}s&$bYHW`a(g?wqFn#BU_7V2_hjI; zMeYX&r_Xx!WD$@vO9fq??=JPYH~gZd<`_*Gzv2IfJyA0?zR`WY1ytYrpt|r|NwbH+ z(itC>#Y5Y8viW`5 zJCq@Ly`q@ceYEJ7EVoM%s_gU#5QYsN3+?)F*VMaS-$BJC!pF(UdFum@i%~&X$>T>E*W^4Q6o%&N6!2_;E-jhdi@tX4C4F2> z45J&P4pRLU6G1K`e}+jsDgEs~uO#OnyGs?;Jpi=c>?2DgJjvh~qZ_ zLFm5m{ljf)>Y~(5qMO>8)wcb~M{|fBKyM~5SD!R1bH0}V9MrmcZcIS%`)9{Fv0Ng>s!0Sh?SPBiVU z>2k{@FbQ#cfO4gu4qA-l8A3s$>-Cb^eyI-5xHW3=Rjj^}yu|AVQ+KNyob6k0M^K^9 z*@x5yxJWxI9q_{vfy=!V7mJ^peD_HyXX|$z6G>U5HTkj{B;9Z9 zg7dXK-)e4<4>mXq)TbRx8c@Fj$S+4nC`*vF>_tu& zWSoAH=E+{a@a`@k;4qwof82d|fAWX;>3rrg(|C@KmCG-jt-S2 zyaS6aV}>X6IjNf~h<~0Y|4EDaZ$&|&3j4LhGWJHhak=LA4@Zc>h*WIcB}BoZCjHn$ zb@s@ZIWR&8MWEwA<^)JN^{1A7}y@Kmg<=3aO(!UofO_jRan z@w6VuVLyAa8CgQ_qbFxBCK(bxp`3y2qN z5a0P9Exa!R7c1Y>k56i7f?@K($B=)?H~iKFf$;LE^-9s4l8UO)Y5XlXeS=9v?1tji z#bQ(7bb1X#i-jA07i9#UZPk7L+`ZBl8ZVG8FoT*feWPn&Kutm6h{9c5T)h1ZP3Xivwwd>O0h~m!x}VhFKbi}thz6eHUK9jf z?w5g>KOh@zi+a8YYJQ*e{;iQ(*KdfO=7?D6UN7hA6QwnW^|g`w2y&M8WFjI*{ys^U zN!|%O9CUha8;!uFH`xCO0xWhAd!91Z0p1cWf3du=!K3l%>F+3Vppps6-Q?o3vya0& zJKFKdf`Uv#qXEKPu*npa%pwp8>XVy56!Sxzo)K&Uy0G@k;lzBo%T#4Y#PyxIW)sc( zT3S>aqV97|AVNEy?CGgG0fz4i%-iAikDew$*jp@k`RZ%#30B$Xe~x!SK)8AlZwMm0 zoE=3+f%==&p(hYzR0*7ZiA(+BTo8Wc0R0kTN)J zhhtg!{d`Gq$PL5~*lpXglkX<(8Cz3jkM~ee_be$-Y=KJap4hdu#al1lUzHY1d}djr z=|dc@-?C>AyXibp_BaSkx1o7}?d|Bi52acNtC4bgyO*z*xeyxH$;c4km_lgsYOc$l zLuOPHt!YRzc9-JhzYF&_H6#l?PS22`;Ed0oLoqO{Yj+lE`)^KsWR+W&ynJtbGTAyg zaf-es9pf>lqo$U$K=hY=ee-5!iCN~^`k49UlQ(&`!GuP8dwaJJS29wfj=AMp@NU}L z+FGB_xVMJAR`Q)F`=R7q&hyPIv$-Q8?szRf4i$9idr>KO{1eBZ+#aq**8lAtng7+r zkp!n{270!3s|zfrJ$myl39aDq!6>{!FOT^fpP=l;S4C&Lfz*?B65(^84Jjxn@Tzu_ zWnZq!U!}RIddr;P)$>1rN>vx(NrJ0cZ#x`oY}cx7DNf7ku+X5xAd_;G7R zOAQXxtLSLe6A;gI_xAcfS|~;irlRDOTHlLGq_m*`ul9YW3Z5-@jBI8TuuzT{un77R zb0a64pynDAE|b0s73?h~yu3I@Kj#IY>67&Z(i@gsvSsR|m^%oug)R&-vu$OiBYv>4 z1P~Rx7`-v|siATT<#0aR;02bEiZwSJfFOmK*8QQzZ?;DHAXQywc-JrpBvaS9CS!A} zQB-gAuO6WKJ?MOGD|pdzwmo0xp4~zLwYAx{brA}IdNN1_oF1GW!a3Xt$;lNq<4_>% zvkUwTj)>;)6EeIl_@1GC6{OJ`r=;7i(+7b5odfV<1&?A;Pqq!U*RonQEZ1n;PkVPf z7)ntVzjC1mTa|1qJlUO2RW(iFW(BxXg&R+h-!yJkPwN4I2U9xcP( zJ368mu-OoF73dWLUK(Co9N*r0c__SV#3}ebEfbdjlL_-oQOg|4$~7->2m&ro=svby zehM@O3ZLBT`}@`q&l$Is0X_4tS1TFrjN7nv-^-KL3bu-ak$lzYcFfTM;cKb;*F9eV zC*$3JU?%1g2+~Db8R30kVPR4H?_W+*U8758q8`ItJOiVUqC?Gf%moXBt}dej5Xlt> z04D+orNLpD^{O7ngh?dF<=V6~&<;|ao_qB+H2|a#nQn9h1m8~NLVNf|Cx}wNHGl-r z0YVHQ{g;7gzLq3@M-~AvC)kF$6s9HGC|MAFVHYu>2G>w7@E2J7i(S#{T5WlG+dmM! zPaLp|GkH_+UqTZoIUJQ2K)vTtyOB|O1YuZMkEG%`Xl)NYCj36s*C#QSc(6Wx)-T*j zt&wu~Nlz?`C9^JaO;dLIVYTz;QMfxSgwT${rKqUri#OXtddMN>{oN+ZN6NRw>;|YM zsYD2O5-s5fjkw6jE?Ad@5^K5A1;=f=O}-UT!5>Wx56evXoca{5&@xtqMp!!V(Tfr$OS(Ea+R(Zhh&Kg%9W_!tC=><8 z2(t9AYB~>9#CN%7QmvEY<8&Sh7*YmHK>=ibU%fDoN~oguV3fyIPbUh~KC4doLVHg+@{HIaO;N^b?EEvG5oP&&V&Nh4a z&H;}-w4NxQa?IeQME@rx=23eT|Gzs|VDEqOBLI<}<2>QE@&rb>OA0iH+1c6NUfuw8 zzteainrAqFLIPfy`(`aUv6CnQ?V^14kVYhrN7Bd2)U?UhtoUoarw$N>2Y)3MnAB}A z3cPRc=qT38pk-#ZDzlCQr=_Uya4fE#M=_jq>swcDYat04S%!#pctd79|7UJ=sFdAM zrX#P*_}d4Xn(rGbqX92PHSmOCYwEr6@xkv=FfNy{`=jU2y<(0}PCABYPB{cX9nQ13 zJnuzU?KmpIY0af_esKXH2`vRh>DrKy)YI8|Pdq$4P;J`!6W7Huh~e8~4>41~+kC3* z24VVCJlX^O{Ts6lRe==1Mehx3ArYakjJs z=7Dm`4Vg6(2nsefz7A6&A|jA7vc&AQA3m&IbJEkJlol?6r5llCj(cf@)82ZN$4mmt z&@a|ba9Zv7#JpXQUxR=$hqk$T)}}PaSoM3rW?)v zS?KWWV!Zo=`V$Xv1?}Y15&&c@DxB~U__(-vyFfTmzKCVfudJ%-s>h=F3Kfrbs%MOZ zxm1G~*r7tT@vZd=%b>dm8ObM?Sx(HU5_8Y;;lqb6@BOx_>r6c3bM{k1aV#dwEx(~8 zj+C98_|a02fJ=pQOI?UgC=&WhYZxHQlarI)9GV}cGN1w~!F}Tq{?kCW`VA`&y-h^> z4X9sEa9)<3lw)q>O|4*Er2aJ3W&0yV#dwnMj|oMjrSV;@NGxWoaBuP6 zL|82Y8Lq9C<`yXC?<*7kp=efi-rc=bZYo~rz@%l8qQ^wGfvsg-Y<*_I{O$$CQ_|Ru z+IBbBAD_q`(sD}p2spJD7%{K3*Y*tyL(tU?!a8Kz-7Crq0Ps4(pEP(xLMa51Vy1Dj z)}Gt!vWYKmd{*t0+T+xG`G&QaL0iq3Z1u)wzB@$sgVbY+kb{kh>$z0gJiU+9zAGSV zol^w6DQ2}$vJ9N@oHp#lRFssSd5kNRZ0m`6fCBzwI8&=`#Y|3_)oIF07e@FV5*X!4 zf2})#q@9@Kc2Ch~q*XuamPu`URPU)#8M9$^DtT_^pPDJu+5>IvSR>*BeEp488VfqM z@{USHcKY}}YN_OWo~96TGGs9T73E1kRF zSu%!Z3DMNv++~o-AtSs^>aHP`j!!u=PrBPe2$sGD$NsM4!Vi5V;q%Ut#%9IM%Y03; zXm&c(06J91GbEBQ%y?VA^xm?RYr3CYsx=%}MglH&u?c}3;Qqds58Pf-?;=Qb@%W3R z9pGM@L=$XzB4ddK1qGi~jhMSlsvY>1FcB+mHH`c&7w zwq`~l2rCuw*w3aC$j}KCl;&1w#9L8Ol|C)@wz&i!-7apeimH)vAuA;|EBI4QH`>U- zA5KUp#baW`^eo-!B-M|6=$BuxD*I>l(^Q@j2B~>jpA@EQXR@?QlqzH9n>_Rd_}48SXwG2?$O@RMr3BgOps2> zLjnrfA|&6jy=?95h!LX!u-x^LWeyzj~*k@{YN=6&dO3S=A zgn7A-jyvnYLGnY|_vqn9dE<~2b1+BgsL6RrX4{3^Dh!I+wbftVC=5X>2}bVI^3-0Y zAy$X7*a;6H4DbB8Zrx*9yZ)w}_)k_j&)QtGj9;{VGcfAx`K#c)PasUJw(nWjx4RHK z0*V|3SL+|bNB3M}DJH!uLoQuvVwKt$V!G2KUb^K>x zG5^LUwF`qFp5J&63RJ-&F5(qJYHTYdA31Ek*l#b|Vwo!I7}t-_xpiIDGg`7PVBL%O zCFYZHhTYeVR;{bJUev5_r&t8NH2>9_fpWw;=VpLWa|S~1*M;l5clH^fg+Eb zeN%sZ@xuEA|1~E7C4_H#0lTnh`4^vrIT?&#NO<>gyr z{=5NiS}*p%ei-1IHA*zIjJK(&={W!w;LqSV*RN@>lf7R6nDc^q7BJW6Tkb(A&u(h= z{%G)8{qlyV^>qE+gLecB&Qt6xx7hd9*%yB=UQJ%LdI6rSj# z>yTT^t8~DPMRzM3FxS9r1o&wkU_0#tWU&|UYOHmDvLHpUK@QNlZ?mMIt%JfJaD%O> zlKlLqxe?zjM%J*V!NYz%0<4@!eIE)WF_l-GwV3gGiSO}v7b^mtrkz7ni9B;&kkXh3)aEfVWNL*mtR7OU}y_|8p-01Vm zvz^?2&!s2SgD4CduXULcb$)n>-kK3PJl$}=cakb%Og|4CQ-ChwK|RM_!uWXdruG4y zher-zKPmPp#{u56;vriHSY3x|E;>5sUM9#ifyjb)#D$r**nER z?pz=_7U8tEdGZ8t8+bkaGo?K9dPhS-Lf*W2)Bmto4+Ujc)dZwWGOy|y9W`|*#qlOMXxJ#V8AIJThhF%U=Og#j}& zJ^a2?gr||o*i@6RSe|Z7wNnz-JKzK{NbKqCTwJQO?O%owvEK;M*t`q)5&%)xH7YAB zbsWl!@oi_s0O6aglo}cL&hTUMc)Su_T6lf^bIak~C7#}*+e(p6~^b zvZ-0nhj0%MK;=DOmweHNctzP=2}xK#O|mgj3qguAyh-QlVI%yv;P4DJsq zu!;6M09P5tF$~;1zy=k|Do?Ix`3<-@o=mGoLdge(o z%TkZ*CA2>EE zaXD3E8RY|;H0MNu<9Nj<1er?K!B!{2p>@PD{a&$DNVh5S8*q!f^1gco)C?~Ub8Zbh z1CSfQsm{($ewqq<5DYLT>OO~SluB8|Q&fgX46_3KLqfoiM zn%Zb)CiCtji-iry!{Bxxhzd}rbfSU*F8?+fffbWlObP3yc}0Q=oi|8ZSwJ(wKerpe zK+HTrY=f9-`9FIMEQT5X#@0j-e*eZ&%fD23u+y-UE9P&d^lzcgDkr0uFw2e!-1#72 z57iX62Hi6IR61AB~~ke9=n7UmpQFyMvC43fB7zPcJx~jklQ4 zV6rNlYKy2QKL}Inc@nVkI`o;E>4G73S)@i#4pF*1?47PJb26=DQzl1E)d<XTL{O(c8xlnx#GNn_%-uC=;@medbHg1EJq6;{Uxk3PjxJEZQT~ zo4z#v?!qTN2v83W0Lma`hEq(;t2aIu^Dqfg%K9j~VW2ztY)ucE0$G&u?;WRqCf4F= zyWB6W$K)2%%)HWmM@(%N!zv#*lzA5j4~{=Ry%OB{R_Ls)Jp^2XfJXmb3})QK~7J8bFq;jHbgEj*!w z%o7F-rV@yvf`WTaAcB#Ry2O|^=Hy^;^6q^9fCvm!0Oc+fm5E{k@5Brhe+&{C6B(HX zqBuw>Gd0e1%*>)Ty*e=@ch|QfeJMUkxG^Wj$0Ld3YZ{n9w@0UfR+3f?7ws*aLGKFxS0d zC1Rh8SxV;*>8C{mPfpeYF};@}P39maKK=!aYwy;h>cnRj>djD!cTt`f7hhkzxHoWv zfuS(5ws=fnZKlp$rCaSJ0kSwKRaPom?}EleGZ(_UFr}!Y(8)#kP{2kT9~8qvEyHCJ#hYZr8D#RFxcQ3 z7(l3kr!^uKvRHdhM_UB7zr{dHdxLtc6SLX2v4Gf<)-MpXzx8{E^~LwE@+vu)WA*po zIP}TZfd7FWQqm|VMaS2-&xdeb=gTL}dqU`VDdB$AX(oxr2+8vQ37Yv>B< z1O5a5ztK_j?*hg@_a|Wj#eZx+`p3nY?!%zhfI5j3qdUa1$N*8&sca=&(5M_MV0*4P z!k3agl-?r=3M89)ATR+6FaStN$5KGnY$$3}08`Ek+)vC>9`VQYEG+s)M)j^U(JSfO z7&z(4oH9e@4+KAqGOqGpD&xAj8YyLf6+H!FRs3&2cQUamW9-y`_c#NsA>g5k?NPor zxe6RDESB2aN0}t$Zt=f=-1tz4L?1MOggDSG0clq80?^8`{>QiTegcP4-X+ksU!f)4 z=SXw&vw72i5)K565amq}&QJDeFk3>w)D3=2{%95)yzZTbRTM~>vWH{%QY5sBH8C-y ziLJZcOeIxMe}4nr4x96>tkQ~>9v*}?#9J$?bhDt%0s~Q_KHg1q|d zN6#uLM6d+XcW^%NGen&RU7g8aUhD*A0~i1J`2`L@P4OTam;mMoy8}!%d6oa+xFJYt zDht5>j@iG=oi*sq5zfQbs|#T{A=7#YYez@M(fYWF0np|deqr1TA}v8zt4MgRMhp*k zO>~@lt^=PuKhlWuo>M9dr{t^$XP*qnyuixHS$?BkC2`(o{sNSbFJXhc*%GdwQgxS? zAcc8TRO#fz#FTGp-F|qV9yki>`up#8rC?4;h}6~5?BVdNNG1qQK=gX84_xH`B*P2w z6EP|GosYtu{90_j90HK4Wa~ijtM`Bvu_>YyomcKUQ^29sv%fNUb~s^fKad&;p~>aW zGw3WY`2%DhkfwQPK#N`EseoY_fL_}(b#QNd&uy8VCINY&N7YCW9;A@(tcID~&o#W! zlLrUvy|cdxfK9`i@(DWVe2F~4fdmmeI~xgr^dI1v2!@>tQ@SeU-<}3h9IOi>@uP8- zioxY#G!ED-&4CwhAfB3S@b(miA3tW7#3HY;30JcIgkhQ`DP+7a7G@F+`y$NO*<3UJ^8dzCh*O6+YiCvB`nyK*buFPnPpB;cF2P+ zFrZHXB$knqQs=W{W(f~XE9cMCSYGMfkUw4HG@@MJ1W5)oK0ugY{=h_~z_NUpmj%iI zI!8rdGw?re1sg1;UsXNz2*cN39L=W)n_mtG&0&1wPy`yOGiCwb9a{qwyD8B8fm9St z`*)4O-2wG^6ZJZ1e^4?lEv+3Dh4ye9M%Bfe=P!d{;OgoWhYR{8WMQkr*+JV4tH3I+ zwHPr##UPwK9P=c}mVl;2o0)E^1p`5Ic_$@ze%#H?N z3!n{mV3+#m_Q!w3pZ^s2{#CI0dvUPFCJ46>TH08QDF5L_dMDh_;Ku3<6;#m~G@AJP z`w!}ag7L{UJ_RjEqCW1rKLWP3mfesEfz4hcBu*DiF{B1pYl*Cb`tBCEB4(8mkxl}} z3IK^B^9pq1xI{rVWV|Ah;V!vHGq6#*tU z(L@f^48~>fb=PD9f{0#NX8|C)ZByz1S=lcpCT6>Y?)#^kW!xbd9vloy0&ST9(-^q< zT3KxX(|bO~E`RF1nN(bOsANQ}3}92DNo(yl{8qzAWG^UTu{c*s0Wre8_z2) z&pcu$0Dy9}aUc%CYzW12HFhgNYF1YV40Tv)DDg_e0U-jYcb-7A0T!<_(8IawIgl#o zr4^}#2#=5q0@flRg1D5K>oQl^d!vm6>8>((?xqmWh=~@o*`bWD!V%8%1aC&{bL%!8$-5w*fD5KG$@3#5V_3gav&g7Xu{fDu z=R|#Z({|7P22H`Zxn%8J*RPtLesM$2PG?U*>_6gAoJaxUxX!ilf&KfWXx!|;)8D|? zC)nNds(-2_K*kg_70pMil{xrKu67q(AP8=Z>RKb)+;`-o9u zy;g?+ViA#%E(h+e!3@cKCZo~ucZR@oSpj;uteik}u5Ps(WQ-{WU%_`nCo^CJh&MT6**Q{=6x4^g>VLdE zcqB6C@SJja=I8Ltz2+>jjqCTthqaMCOa2HIB_&2|cvmu1`PjHy|9J=$2ZsqXPP+h0 z3q4$8!*`(_kC*6~gzI#uliC(d&nBi>PpvA)LZUN51!E&gi~w>EZV)h!083D<-(fRI z?;)J%b3iPxxzX=`eu+~u-;B7v<_;hnea}_-jkm5-mA}?TSb@PZ*|=&iw;#YmSVDRW z+#PUdeTjTv^Wj(tjT{4K3zZy@E3qgfs}VrA0_p3TzDPeX=aCA8)pXZqPEa_xX1=hQ zH7zS{n-Bj@X0j8xxvpA9w=^zq{vu{h@*|Vp*`w^oJpDww{D8Dj^7@*Wo!#2v0TeNe zy@bw+dE92rUd4U*22>A2iY+d+hmq`hf=?0rL1xlX%z|*&(Vl+S3Qi4pGQ&g+F$g-R zyL&gMymaKORXjz{K*s)sgqr*PwiO{C%)P9cc$=Fh=Y?s?9Ji4HwbgMw;MtU`c!cnQ zRi@Ij^DS$@K>~fmJh0aBc7q+mNJl5!ogL^$)vhUGRx$9HU{U7|w>k71a6wi;mpazZ z4^lowpRI2hUriL&untQM!;pr$%4m#y3ev?3w*GnZtmPc&FAsojFg@X#r=T?%W4bW* z0zWBv5zWtsbhAWP9#H?X5m5L4j7P z!JjFfV9m~}vky`2vCw-3#UnF})4TZ$P2}o=%7Vo8oS>`I8gPJ%6f7PMH8oPLuWjI> zo9POhik(DdMTn;j)f@avb*-}G30jFZZtZ~tVHnNb4iqrWbRTO;{)mZtJvJr|wx~(1 z%d>^{FpT$Xe^5ij@JXd#9OVtL_2wzu<A`z3y3>td^d1`-VwE4C{5^$Z*ZTkE`_BvPN5*IeO+1iUog*B zLVIGqyhdwc$VCQa(5)&Gbm@PfUttR`x9%ZN1f|ag!2Yqk6fAGx7&z`Ug_7Iie8<{c zF;r$OVJ`btzVh*p3<3$_h675sA13&3;ji*wQ35U*j}TYbG2%{?$UaB~uX}ZY@Y_2s zg=N(2W?>qej)B%+UW7>|A3WWhq@XW5U)5GGsP01ogVR3_*Mq1o@k$eEzeI`P zFRJ@>Xt3t$n}Nm!b^z#;WkUXY9P!b-)h=*lg!OM=-nk_x2&%t7pl(dwA_6uMgnMfTJHExLyK7Yu>N(b8Ow7BB-Kb$Il)>?kK6!?U0+Bw}NQReA%`5brXCQ!DbY- z+8?lTg8}=3;m^hoy@w?i3r+8aZXGei=VZTY8xtB2x+HP3(rYH8D&W|NgO_?bR5&cJ zQ`MP5i;F!yL!VzOtF-@hrB@ZDuIX~i{R0PY_$6@0+n1>jvSS-g>3bCVYpB6s9E*)9 zW`4fFH4Z4-D-gyZp~<^)Sb!4vjtUl7WLgK#<~>k(Q9E{kuOUc3_xRL6&K|1vwjFR6 zi@yKLQ}RDQM{j?fIKroxeU&Eus;GyU~ zZze*vm@)QX9Vg}(9qa0E%?dbXfGp|?*EfI5l;-b*F8j%mIi-bv3M4zf>3t7x-xNFv z${+zcUg8Bq9js;K(TF*-`Y)(#*_x`prXR|6&P zf`jl6`mHG40^ci#>pMH0Ps`xTeSHn*<%x)_tUutkPfqX}8mNF#Vc;+e3Az~GK6nSTV_+{%Ky$@n zJ&wHrmFDA9_Xl;Y`@@H{LoY)^I|1qX^S%oz45FZ<#8p=L^5rXAqOrT6GZ}PlKmPO- z$U8+EG|T>oT89x)adAO5wyze$=q;J$m6ahN6bz(_R8(jm>ryOU!^OMv<;$0sytYKK zfefNQ#eoHbKn2u;fJl@Cl1*@MFyL|t2naGVILrvYr2xRZ#~F&Vb$mwWOt4T~f4X>^ zNyG{_?^9EgW4-K>hp43OHK2u9)bf0q`}B+nC}yFBAq3Y!_H2US5`wM});mrH`zsWA zxT`oqpZ_=-8C8KsXG}q3X=6kEHW&A$6R`dO7RAOb>NyjDBmH1rr93&>MGKnlM|$7> z1{!Y3X_z%UJ$LhN21|sNw6(E+EvceRe_O?qw+4t3PQg2dH|I!W9SJ=Fo>|NoXeqik-~P(OMLOy&)_Idf=EJaQ7&$+bX=0HpI4y2*wnKS>Y1RT9g;ZF5a~ZY zMMX!DN$J5`Mq`ykNWu0dUCf^Rn?PYFD$jJ9s-UO{SgX6#UneEeP<|VmCEVptmmuqE zWAplxnVE@6?wfq^=ul)hIZL>7DmN6$!cg9zKw^*u#WR`#%fL2=nGoVoQhbclr7MEHT=)D42g*GhSTBW=9e^hdvQB7^@76qjp zK&c9fphk)yq7+MlH0cl^6e)s&A_O6DkV6lGln?}wUV{`v0#c-RM0%GJs)8WRKnT4F zcvrl4ym$Y-@&06tWUsyV+H0@1@_qB0bK3QMc1_huyCVz0Z0v@rjOZflSu-M##&lf37`iS_}jPp_@zc%M+c>c&HU5ecJn?) zez*DMYn@mRfNBnZFcWR$p*LmTc-=gK0gOWCmnz4rG-xUG<_<@DcQ<#NCK8z}+N_k0 zQ($O|Hu2)0VRv%`Z6hNaw|GJsnlDnfzmI;3I};4piBVFhppX!ypZ_t9`hO*W|GlOE--+S>*i>O`cPk%~ zvt!M=O^PGl6#6_~$?!`pGyp%MK1a&**sNc+%%**l`V=qI6ECgR)w7UO06>HCr`?G-DJ|M+{awo7cmedqp{Z$GWn}qzq%`|` zpkJ|ECJf@Gd#)HBFI3cV6n=_?XT_h;^5LAxh$Rdz>ps@0v+<>;e+jn@Xi#Kkshko0 z>AP0_=>4Xato_jJ7c6ruxG9%35y6LwkH!~uLw<2{G4ab*t)GJNIc97)glX!s=f75@ zb%gyc*(lB+I$GO-rQfm`?(!1u@T(c^Sbg*Z;-L} z&XRIO-YBimnf(k_WeU?!t(P`nU(P7mlVi6_vwCe%*y{)lM5Q6ZP$P?QDt+Na} zsln^W2NkL#DlZ-^l~=PoIQ^jP0Up9{EXC8pF3GIyeq45*I^Sc#58fGvGM{IB^@v%f z-rJmTPXv!viH!rYRbu-sC!?}JYq0oQ;C0O=-j(2b)FM))-zm=K<34YS5sBdaR`H+0 zmJGeqqW*npr{Ebc#+}vEW_s~>&g_bIujzy{q{QTF#*n?z=O_8gk;B)8&+T3bx*8TZ z?;JKRZ=Ihfo)6-AZf9d%a-IYCF$Y)Cah0!l|1cIku~4inbl#K)WEWtZyVwyE?4YxN+N8gj6k&u&MO@5S}mDf z$q_q{K{>IF$9O8>{5>6+?bev73w&qKPcX4Car^5Vo%7t6L8KR@K)`8I0x}%e&ZDio z|H)>(N4Y|!-2wW0b@&7hn_QK*&Fvpa4nQ1t9&a#dI9Lw8jp z3`zo!pCJlHhc^S-A8m0kzV4{$z?CzAx!>2;#DPkK-S0emR$zha`xN2hwz1H7xYk7{ z(-~#j<@w8*xH@XQ)o+!4^iC4?!<>Gr0>I^k< zR(>R|IEP~K=Rw8YJgtF^*1yfn!a$nh1&T=k@RA;JJ?*nyy9FpLDP0k<^*_ZZW(N?Q zE-7L5ZTfzz-2DP%Jm%66tavo%onzhN%kd*q`9-dLXu4y8TTB0SVau=kM)YojuP!HstioR<)WS&VV_zmWjT+vw znIXIE?80Khr|QSbUhxkRO!N9>nU5+q9luCs0{KLQV3*9u2k$RjFFGt&n8*n?TSCJa z)ya36!R~GM;ryhSm>6I(0OhBth6chQIx31OrXC1R<~s{Mo!ze8{PZmuR#;zoK$dHC z&pJ4b#zt2!pwxHGN(|Df{lD52ShpDU;(A(MUD_&F>#+3zqigu!ZY?cq1C$N`CzDx$ zwn4q>OkbbWXpINz@$^psEdl8H8jzr{m=;(97Eof$%_AVrX=VB=F>%y<=nV!#JHKIf zhK{?|eW~1G5FfTqAS{Lons0!tOt=V8p`HN)L(vK(+`k0YLcbG|FaEqQJsT1eigix{8a~iKfP*Fc34<2BF7M3S-mP}P~cnF?tyHpo~~c5 zyit?ar|u?zuE|bzj*>mEj)LzE7@Ar0*^IB#Rt6Yaz(YC&y2S3eKxy0J?(F4qL09Ux}z1e2r zTy+8oSn%>MzT$N)TA0DhDb9K7^ZB(4qV5%IcML4&xawk>{7h*1DkIx6Q5L^{=ue@n#JPb#M|mO@1ZV(Rl`0rOEsx+ zrEe~;|9!TQrFzzY$C7vwun-=Vm_u%OkZ_XW6yhX59>y$fOIbw&`WpJ6-+7tYdy5=F z*Z`H;`vYvY&QtXd#XgFB6(<97!5RRy&m=*;ZgiFu7qdm^B+C%nWrP%rzc%460z0rd z<&Dd9!NirCvIdDYv)GU*gfU>2kQcBj%IRhg$wA^amOWolzuhrKMj&gb%Q!DlS7g z&<{{%=Eqg-EWY&y){e2FDY|Xu|Cp z4=H8S#RvV)MgL3k+8TE(R4N8M7sQ8&!6cLfiIeJca;Ram{@KX9OA^(wrD63Lar)Ag zJ%zY$E-t=X$s~c5RI9FNm;ePwl#|Uqaj@vI@ZCIMOCUl=^)|nfj`>|e0JR}xH~*Zu z)RlKumhUQI*fq67+qea{xo?JT(*oK-vGAwtsJ#lcDE`deWArDn>y?$ez~%FNX7gnX z5c>N8qtLx0K$N@o;x9>{Emw~XmrvTJPQB3t5O6P049xWwJtJ1k36y_Wp5kwG#>liF z+{36pvK)U|M`)G_$VbHh*Q|J6Q@L{_ev0C7XVC0^TLN}Hxy>1QONd?e^a*+XVHRb+ zIW*kP+PEfU|J3i4nJ=TRsjKBs5XE^y1<{@f4)Cp!i42Am!%CpoxHuoSVaQK=N zJa{T{`OLvTPn0{`HaMsQ9e0<?eE{>0}*B*1jHWl(Nlx1k5& zO+tCjk?HhoKKyMhEud+aicgS-?d7=yomo3*nmFZyY*;A3Dvp+1_Cj&DSYNIW5_4LR z;^eaVyupE@w5B%V$b%dY*9-ibe2dI3T7~m_Vsj{Scna9V&HqGNx0L4#=5eQ#e$c(G zy$YGmp*4a(DPn>?9begAIMm?vKD!3^B*qg+-aG0W;- zW0mvTE&k~%b3?wj;ZP)>2eixEO4WxG)jBnGLH!m3x#Kj!dus6C;puZa)pvDrg=&Tn zk9+rzCS4v~Y=S>O_S7Y_du;AJe4;NLbaGDd9Y)bL)knfW{BcjRO4`gyj_|?I`VO72 zzUsTlpZXtUhrea_&P=)R1&9Er3f)+>2q@qE4|DHL6R=J27)4_bAru=b6J4ioq>+_~ zCokP~)%_FrKW4KCqJ{564GeImgxzY$zF=k(vce)a?_B|tiHP1q*>w9YsT(ADt1_Q7 zZ+G(F+t?F0ni+<=!QVTBqWZG_QoMvp##{we7FNRso(FD({dwCL7-Z5Yo;;G@CTrZF zYZl5WrJp~mN2n7g!OIrN=HH`Vk_>(;$QC!J^aKv^aU{nZ<{U{vh`riiW;{L*VjICA zJGkGjgZ4WzOh5g5Ym1WogD8v&Dg7Q2C}Wb04v8QIvSu?TO0TfrF&nTb+aR|H-FTpZ zIP^xO$&*l&t7%0OJ!3s76*7M=rXi;tnjXSkzsut-$z(kBWMD>ri|V9I`oP;y$Q97V zw|r9SG3Kh0%naREV6{bRR&T34b3kFE5LcGVhiH+0aIAk8?b5!r3kkXag$Q+$fr`cs%l8x~Tz~-zDWRR`@Nf;*B z8B#=Gfg}%MQu}77(x%yFLvx~ewDUS%!J-1MM>DLrDa|}|E(n{F;T^#eZP472?j-4IA2N7)^u> z$Yhi8Q6)BiJfWdUoB`u*_F-z;DMK$$Mg6i}@p4ThswK;9Y<3b5G_w?!7sn-=GOi@$ zD#Rt`&pI#qTs3WM9Ut4q^SILtNO16vicXi;=Q@YzuNM;a(yAqGC!OaSLA|+|Ra8>n z?Hn1h7}(R9i+H@OiSaPd%1Y27H{K|7)X5u&1pu|Dbh*s_Z_2kGmOw@Bmj?PSsME^# zf()s@u@Ch{?Vj+)gcrHpz8b;mtk5dA(l1w~Ll8Nr+f=Mp-$VH8!j2&cB8qHV41^3E zoou{!&>!}tfKMMR8 D&8`t; literal 0 HcmV?d00001 diff --git a/docs/dashboard_thumbnail.png b/docs/dashboard_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..0808d55a213c0205a2365d07dd1c3e181cbc1038 GIT binary patch literal 47321 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:11936/` | +| `8080` | `http://:18080/` | + +Open `http://:11936/` (or `http://:11936/dashboard.html`) in your browser. +Requests to `/` and `/index.html` are automatically redirected to the dashboard page. +Any other path returns a `404`. + +### Login + +The first time you open the dashboard (or after disconnecting), a **Connect to HAProxy** dialog +appears: + +![Connect to HAProxy login dialog](../dashboard_login.png) + +Fill in the three fields: + +| Field | What to enter | Example | +|---|---|---| +| **Stats URL** | The stats API base URL — `http://:`. The dashboard appends `/;json` automatically. | `http://localhost:1936` | +| **Username** | The value of `HAPROXY_USERNAME`. | `admin` | +| **Password** | The value of `HAPROXY_PASSWORD`. | `secret` | + +You can also adjust the **Polling Interval** (1 s – 60 s) to control how often the dashboard +refreshes live data. Click **Connect** to open the main view. + +:::info Why enter the Stats URL manually? +The dashboard HTML is static — it has no knowledge of which host or port HAProxy is running on. +Entering the URL at login time makes the dashboard work in any environment without any +server-side configuration. +::: + +:::info Why a separate port? +The stats API (`HAPROXY_STATS_PORT`) speaks the native HAProxy stats protocol. +The dashboard port (`+10000`) is a plain HTTP frontend that proxies to an embedded Python +HTTP server running inside EasyHAProxy. This split keeps the two concerns cleanly separated +and avoids HAProxy's 16 KB inline-file limit. +::: + +## What you can see + +### Summary cards + +At the top of the page, eight cards give an instant health snapshot: + +| Card | Description | +|---------------|------------------------------------------------------------------------------| +| **FRONTENDS** | Number of open frontends vs. total, with an "All UP" indicator | +| **BACKENDS** | Number of backends that are UP vs. total; highlights DOWN backends in orange | +| **SERVERS** | Server health across all backends — UP, DOWN, and "no check" counts | +| **BYTES IN** | Cumulative bytes received since last HAProxy start | +| **BYTES OUT** | Cumulative bytes sent since last HAProxy start | +| **SESSIONS** | Current active sessions | +| **REQUESTS** | Total HTTP requests processed | +| **REQ/S** | Current request rate | + +### Charts + +Two real-time charts update every few seconds: + +- **Traffic Volume** — bytes in and bytes out plotted over time +- **Request Rate & Sessions** — req/s and concurrent sessions plotted over time + +### Frontends & Backends table + +A tabbed table lets you drill into every frontend and backend: + +- **All** tab — frontends first, then backends and their servers +- **Frontends** tab — name, status (OPEN/CLOSED), sessions, bytes in/out, request rate +- **Backends & Servers** tab — backend health (UP/DOWN), session count, traffic, per-server + detail with Expand / Flat toggle + +You can filter by name using the search box above each section. + +## What makes this unique + +Most HAProxy installations expose only the raw stats page (tables of numbers) or require +a separate Grafana + Prometheus stack for visualization. +EasyHAProxy bundles a polished, self-contained dashboard that: + +- requires **zero extra containers** — it runs inside the EasyHAProxy process itself +- uses **HAProxy's own stats socket** — no metrics scraping pipeline +- works **out of the box** — enable with a single environment variable +- is accessible over a plain HTTP connection — no TLS setup needed for internal monitoring + +## Environment variables + +| Variable | Description | Default | +|---|---|---| +| `HAPROXY_PASSWORD` | Enables stats **and** the dashboard. Required. | *empty* | +| `HAPROXY_USERNAME` | Username for the stats endpoint. | `admin` | +| `HAPROXY_STATS_PORT` | Stats API port. Dashboard is served on this port **+ 10000**. | `1936` | +| `HAPROXY_STATS_CORS_ORIGIN` | **Required for the dashboard.** Set to the exact origin you use to open the dashboard (e.g. `http://localhost:11936`). Without this the browser blocks stats API calls and the dashboard shows no data. | *empty* | + +See the full [Environment Variables reference](../reference/environment-variables.md) for details. + +---- +[Open source ByJG](http://opensource.byjg.com) diff --git a/docs/reference/environment-variables.md b/docs/reference/environment-variables.md index 4e6026d..9e88d32 100644 --- a/docs/reference/environment-variables.md +++ b/docs/reference/environment-variables.md @@ -19,11 +19,14 @@ sidebar_label: "Environment Variables" | HAPROXY_USERNAME | (Optional) The HAProxy username for the statistics endpoint (used only when `HAPROXY_PASSWORD` is set). | `admin` | | HAPROXY_PASSWORD | (Optional) The HAProxy password to the statistics endpoint. Stats are **disabled** unless this is defined. | *empty* | | HAPROXY_STATS_PORT | (Optional) The HAProxy port to the statistics. If set to `false`, disable statistics. Only applies when `HAPROXY_PASSWORD` is defined. | `1936` | -| HAPROXY_STATS_CORS_ORIGIN | (Optional) Enable CORS for the HAProxy stats dashboard by specifying the allowed origin (e.g., `http://localhost:3000`). Only applies when `HAPROXY_PASSWORD` is defined. | *empty* | +| HAPROXY_STATS_CORS_ORIGIN | Required for the monitoring dashboard to function. Set to the origin you use to open the dashboard (e.g. `http://localhost:11936`). The dashboard page calls the stats API from a different port, so the browser enforces CORS — without this header the dashboard shows no data. Only applies when `HAPROXY_PASSWORD` is defined. | *empty* | | HAPROXY_CUSTOMERRORS | (Optional) If HAProxy will use custom HTML errors. true/false. | `false` | -:::tip HAProxy Stats -Statistics are only configured when `HAPROXY_PASSWORD` is set. Without a password, the stats section is not generated. +:::tip HAProxy Stats & Dashboard +Statistics are only configured when `HAPROXY_PASSWORD` is set. Without a password, neither the +stats endpoint nor the monitoring dashboard is generated. +When enabled, the real-time dashboard is available at `http://:/` +(default `http://:11936/`). See the [Monitoring Dashboard guide](../guides/dashboard.md) for details. ::: :::note ACME/Certbot Environment Variables