From d2de92a19912e3aecdb29d4ab5d43964fcfea653 Mon Sep 17 00:00:00 2001 From: oimwiodev Date: Sat, 20 Jun 2026 18:23:43 +0100 Subject: [PATCH] feat: standalone check-order page, backup drives page, nav links, cookies, confirmed-order delete guard --- __pycache__/server.cpython-311.pyc | Bin 0 -> 39315 bytes backup-drives.html | 238 +++++ check-order.html | 228 +++++ index.html | 1317 ++++++++++++++-------------- server.py | 7 + 5 files changed, 1131 insertions(+), 659 deletions(-) create mode 100644 __pycache__/server.cpython-311.pyc create mode 100644 backup-drives.html create mode 100644 check-order.html diff --git a/__pycache__/server.cpython-311.pyc b/__pycache__/server.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..27d2db03cb9f651a9313c7b3cde6d521803a7a0c GIT binary patch literal 39315 zcmeHw33MD+c3o9>^}YaTf*=TPMR3DLKwQL46iE;ZcW?o?K_fv;RFi130Z`QqF0IBK zNTw}_=2(!zImC>q3@ndFkVnUZ*mI8QWbD8`Gd3soI8}7nZ1=GeO?V<+7&9QTmLgDqVs$YM3|NZyhd;k4kZ~J_14#(eoZ_C9SXF2ZA=^}HmC%E{? z>EyUOoWx0dgzMFR`Cgt~TY4?**V=2vuO%W3+Inp~#j!^0gN|MY3kwnFpsUw4=AXAj71(}fXS8__OZ&*0)oA}p{ z-pUJ{xRV&OtAsWPiL^*3SIT(K>@f$pH z$G?6^D?=i1P+Ne5RV7ncm6w8!)71qjtVRmO+ip$K6xJ4`u%=`g@>5tDTFcs2kk%EX zvaVz~>WY@5z95CVk|{LgrOoYBH{FOH5m1R??Ih&GQ+FX!Q3sQQ*m_jC8G$o=CL3*+vl?^3pwxvkT zfFG1eZ)dx-wIH>PB~#m0B(+RRg0#ILrA~Ji{pONb z+Vz-pb{C}cBHBdis`(AXW39&yqkqMKDaVP>3nQUu4AK2>_j+`3|N2AC&+AN)`x2K$Ps6Q0G5|UCbl<|C69t=rw|3FZdC?8P{1*PjLcX%io z3q~U0p$imk@Ny&+V{Zh9`a_XONa{CWi=*+H{y+K^fID0)JA!iD#cVj19q~EN+%ltF z%#hl}?C781`m*mNxG9?QC{oILV)$yxBM)Eg zJ0I+i4a?V4j?lGG|45A5PoSt#!iV^1b<4o;V5ns{Ja{#X+^)0)F9XHvspVRtA^A#3 zZoYgyWxo)L^-1Ss>Xsz)MLPk;xc5APTf5)fs(Mywo>gP*?=4z>`^B+#O{h!?&Q}h< zd|0VyP=!WKXjFv8?5%oLXwZZPMQBKR%Ek_Tgp|1cY~$d9P|X^V81)@OBYq2yq6jyp zlYPa^@OiKrq?r{-v(XTc3YtdZy17+c%$|$2nv(^dI|~uIo4d+gv!3Oy@@TxE>f<=K zm_FK0bhP$#h&`=)4|j+MI>oM|Jz~e11KmB{Vl)(sftsUYT{bqogeC>-={VCP9y@X1 zNb8BS;-QYSO{O?kf{~Gs9)}X_I(hi8*xu3Edh&3OxNcoGYW-90Z1_M|cgKky@#qQh zz`m}dCs3HKo}-2`AloL9rCTqaYCU|iqg$+77nBCWLw%Qn(dgA-Sz6a5>UTD5+_Vm9 zr>lsRK10${D0Dd*3SH_8UJer(Q{tarqSRp`lw>BG_5B0E7^R;r^M=LgP;fAmewVdsrp3&$qLGmc#bSvkyAB*b*$BB1q9EOHj1tmy4ogiU6}U;H0_9%o?l|1h z)+25JO4~-FF|Z0*>;#&09G?%4L}EF*JH5XH1ZE)hy3Ffh=ZT|7L_IG(7V!GCxWQPe zPiUCF^WjiL`uv)Q3e%^zZl+-~EhL`k=tNDr+RzzTnd`z*y?C?>eeG}udUacCcUx1=Ry&^B_Gq=tP*{(>z7M*V;Za1nVVh4SR9r^M2Q7O&2;|_=2xP_a;y)17tK}j zl_%y!99g`l5!NKKnl_2Ksx)D&)=LQT$!1)Xh&l#?Vb(!I=>RBeL$)0AA)rio^thQ; z1TBfJUG0YK^T{ip=rifmeJ=ItLf@f2p|>9OmyJKET5U9TnxAZ~+K16fL*{yI`bpJm zld)cpVFm^{GH(d|?7TWdMvv`bMcG1Lw}W6j5@lS#!~}AqbVlaQ>*AjiXP+0^`Y=cY zOQX(!1A`#)xREZ`BE(P&_>F;^=3++Y!&7w@li{o;jGFPTN7Timv=EhH=2>$6)a2C{ z3l>Oe1`_)xgeMe~(VPxUc>1)}mqV8$*ZU+ncs}-+vG#MXyDse*d)TKW6;|RtV!wn0 z6AH|vV(4l45wpE?eqz*PI-4#)$A+Q!=3|lFq%wYzux}`+sXCuuDRU_98yb#<@=N+p zlh&!EI{LCG%yjk7xuGfj_`%l0J&^fzMJ|W1sMy-xF18&#eDX+_2m=Li{o<{(F3a)j zg_JL?gh%`3@a0&_4ui&EI3`y?yG*&V))%Pg7U`U>pv%?t%o838$NHlE0}z{J5qC%t zk46E;xTIizC{#WWD(ARke3kPIAm48;Y_)K|ZE?4j zTYtNZ2TXDOS$hedXO;K}E*_`EC;0Qc*|Ie?4<&xony|{wgjKTSEQLdS!lK(zGJ1zT zATZq{t99#gBWc@Di@Q@cUG=r-P2fBqiuDf+4~6Olc?HUyvLar}A%&Qtld{5|5~Yd} zWuzO13?u2Z1Q)lg{C!%R3$#_kL)z+Uy^50CQ%* zP?d6!?g2|>aTC&B&=TS7BGT56;?yPaF#VWjDoYrMKyl`HqkMvomd6~K^kGC2B%3+T z%Y4k0du}#Ijam|x5*9^!k-lLtM3qd@iWCjyDHRVEN^3#M9r-0^^yBPG`C3O}1H*DS z4%6@Okh~J9K6300!BQ)WAG{7U$9+f0ygPJ3WJ6rM!L0n7hD5y+>O&#AVcd6M2;_qS zhux}orW^yX{)Xge%8Cv~ZG1Tr><`IQduD`WR3@*+Wy;nc8IDqqZDdz01)ciV;YMD6 zb%TZW!}x@{$WP*Nf};F900_^!;MUQH-W3nLE2he30;+ej=H2|zyYqo}=e@J{EvomB z<~=mlk@S=kXWaOnf5~Lq)C$$VLGy1=oEzSAmAzVht9op2w%fPPcFb;5-G?>z;fL;% z58NkJ_i4?28r@#7zq0@3{VyH7ad7Nl(&I0h9&y`^?1@h2Rv2bYG)_Ir3X=VZI?o}F z2b~-3-FZ~T$0&aKNEF(t`Qr3$PKCJ1Y3>wvhfnhrz6(8_I4~QOoPB*{qwDKSx%+5tU?f6e zZ(rXFBf*INMBan^WdR^%4G+aqWqp0YA&5+@(?${78jZeEo2Wl47e9`+)GwqRlsZ(=mAJg351Q5 zogp&XRqvEL@VeYdU>|{l1P&0O_Du(8#^#| z;H3k}Wh=%y$J-~WZ*?ic3Y;o~2+mpWckeLf!kih4d{@1# zbdBc%Sv&JmzDahv8-s1!oI*-O0x7iLe5-& zKt6hU5|%YUHmy&8b*U?XUdAM+Ewq$uh(hhDIX`Wp8#vKGZZ>RAg`{c=pKQu z;h%9AQ(eW{v95{s$pyC$C_*hxRj5stFC1$duT+GEI8_D_&=Eli#l0MRuBNcfCx!1~kV;FebhC;07DU zn5co-)ezM17={Y=Zr_L;i3ZPybm@a!%pi80rB_w}q%4=OvJ~@V4v$_6MnQ5A5q}B) z(c1vVanDsbaY9*KKfObBZP8p?AV)YnH%2Ed4;(d$qlVNq=S}CU?pyA0HxoUSl^az5 zM$Nxbac+FiyFl}kMRJKQ;VX}ugRTghvlC@-$?2L*XT{1ayF?m^TMkrpFo<(A6sfj@Iq~eri_)-tX zE|ODa^5c>>5ZFk7QEU~3hzfPV%gQ8RMuEEYMR?5WT;41dqCsT|kA4;Z(H8+ghJt_m zswynfghh(5Xr7XAPU6jw+xB}M_qM45JOJ7iq5W~>Rz9(Md?&KfsjVzcZ5g$6z8toY z-i%VNx$Q=Ic%Jfa@uQY72Oei>=bl|SD#VC?r;h}m$m5v_YeFEw<5pF|TAT+<7RhSn zv!k|zO>Qw#W+IQnO2Q?9vXqx5Y!WBge%fHeknC|h!F`9s8Sk^ZR>?`F8S)_qJ8|Rm zwM~LGL=S_@8frwj=!Y2>pkor4T#(*V<(aAS%#3`>pS{DT)8%K7gnXXBN`McD+kZe6 zh+7*P8b0{@AOHBrsYTgW($o5VgTd&fkW_EisW-=9iG)+uNN7l>S-VcNjC~5QGDK5$ zITXdLa*Dr{vIH+h?T8N=#-STryat0yRDJbNos#UFAt5vQYw~xQ@s%zYpbd|kUbF)UNTsv)1U5%QnkvOtzjT7bf|em&Pw8o0_NP8Gc%Rw{zy?J6-oq%vxrxv)1pNR-4+#?Mhjl>a16s z^+}h9>=!M`rVWO>?>9APuFMSC1G$WKj{dAffGQI1saJngS;%_}bh^j%1K!?1OxfTyH5ir2`lPD^IYw&N$8@qM=mWchsgWT`9>%Q{f2Dvb z%SJAf=S9Y*1>ZMBRPZ1DX@Js%>F-q7IkqoZUU|p;hWmBzZSNdsA=(6ZRT$^THzYmY z3CB1LgztG5Of-;7Re_{x>LS5)s>&AV3duKm&cIc-LqC6jfuIGarsl2*a6{ut7N zIjqz`Zx%F*GgLDH7|pvF(o3am{Xa~ZL|$VzL!0RbglJ$RCmet3GDFxXk#gRk@TpU_ zA!RmIjt<3;``$V z=M_`b1sCc8b-7uqdKibbLEK+vNlwQEFWXmyvoF%bvM8eBRPbL{D#pF@k zDPRI=IiGbcc?>cB9mV=RfYJ=W>woRw&4bFKU8;At=H30!yZ?cAzv?}xc@N&-qN~6X&OY>=d*C~#`XtRKDWL()7sj|~vP-U9JF{?hiE`#S z#nVTp(5DM)cIMU_C61as$hytOr7spR4>LKALL-<$oWdjDowIni$x96~9kB(BPeW`h zE1ohsfMg{RL_hL%*m>n7V8o&t798fZaV6w(!j-{Lh%0;UndG>^C4~08l_-+)ZXRRc zxm&})**v>Clj^cvt--Dz()%(IJ2`W}I1k^^^ou#) zF5S#X#=(?84udIouHP4oDhm+pBbwZ~0}Eb)d$wYfH=0TEjnS`LZUwq^)6P5aRhGj2 zF_?BO%}=B(=g%80%8%ST$!zMH;eV8KND?R8TdrcQl*`%Lhj{oCPW&63H(cUzJSUDIoU zBeiOSR<&WyAuMvwaR483g3I$U0bFK)o93Dgvl|&X7A6JOIxQ~}!HhD*7LW?#A>*IK zLrBCZ-qZO6_nCS(=HQ~A&CXV!|Giwgbl@RIeo#=-d1!9TI#-krnK>g3`^LO*W#B!y zG8oY%CpeL{fD^fxxZv)J*A_C1XnM$J-pk+-AKXTJJo0zabPQ%2;59pf?(i~bIj<`f zwD@Od4)V_+dCWGAQ!YOTVB`(*P27ktC1sJQt{6*jp~xAQ5NK4`Ir+kuH&61fZ@s-$ zzXsGB!o5@9@g^CL>t5)=+K#jN0+Y{ zGn0Q2kG;gb{sMt~-2$xO*7nzS-`uTwmTI1*4?U|Ncveq!Pp?uv&6=kftF*GRMaDm= zZC3hj7z{z_IF)r#@K@X#9NYI^`QpjdcN^96wOaXF4DvP__-*dAT|##uOL~WszRHQ< z?F*AH+)d1^{C0z~zHR#W^zqr1v&ZjO{Ps!3dk8)}F32AMU=SJLGG5LsvWE^~QM;*5dkfep>WM z(*V6ElLL=T^V_UTv;N#u@5$HknLJN3!=KPo?ToAp-Ic~~`7HuW%&;TGx@M+trj378 zBKeo_a4Gf8KSUtEZ|1sQX2xXez182TpFOQ?KcWg#h2&PaYlI7={!xX z>4_4eErU>*8$PT$QD$w@c@C9&#`^FujWimG1cwmFC&8q{Ke6)V#8@IdiTt$c-=+C? zDb8Jm#Mv^lZl*>Rc4`8q>UPfG$n4kGddJeLo{2#dTcP3aqrXH6KhbNA*f8Q19@1yk z^dOW$(Q-^I88W#IhW_hp@-bX9gPLVIva{oujUj zxUnZ338zWibeV^f^LcZY5Cof$T6Tyq;yWKF^TizmK?lS@a$<6I#aE?uNYH%2QqYVN zDZh?&a{wGcVEtz7wdbV zVfJT=lyMbd6Ys0(?j{1P)BbY`MF|`vKs~qKt?Peh=|;Ba%H;W>_vR^tQg)OL!XNXM zPFYcmC=IFl07Eb>0J0kB+N}I8B5b1`K8HY_17+4?^wd4+-f7j-p?NwUdb%EXx>V0G z&2wzt%A&6FVP+~PCSI8BRo%xl_c8de`pR!T3zKnW^__!n9DM!o?ZXD~&^c}$?@q5U zNP4BDZ^1edazMJIL&8FV-k%VjKPp^Pa%UL z#sSR|BS>y@r=Nmb>x)*nwOW6MW=Jeu@>;xG&oexu{j=?7v@oQ6=@yBEE(H6p%fCX| zQJXX%kZzNTrITl;h3N}w#TKn%i{dFbg)OGquyrIU8(SNjvR$T?2&TG`Jcp8VAN>d! zkz2bA<2PKm4NRv{yTxcq@1zfNcV?q$aXFW!h7Ip!-p?P8!M5fRD_=^U&zKC&yM$xB zxelb8=HZ}-1HRe#PP)0#1Qs*sz?j??jn~DU;mq%w*(>SXG*K=&bAtn}T&6370WM*S zRpjt%%-fu<k=Iy0IWvhOBh1nWu%h=4L&p8ton3ZQ|hr zM-E^w1XeIMSUpu-@zNliOG2Y#<=(OwGgfRq>X%OTKTk4 zxm)$`(foT9=boHUsZV6garQ;dIWOlaf35Lmep8-Ka_otk%R=6oC$vH48~NoMfmZ6`809#j3tHUDwNd7Kuj9lzxmYfV0} zVW#fep5MHtJh2bwm#gnAe`EO+KUMd2k6O{BRWvCTP4|yu0fs*HFc0 zr;1%xBKG{OQ}e`=RF2WPf~hJ2eQcGy*DSUT55=%6nus;qSHeN@G=}PE>*dQxR_sBX3vzI<`Ozk$ z*~TE+uuUO!L#5%aUeHHR7+*4NrBLFHc&TidXjST^)y8acr7#|twOPqQpT)dK_kM!_(_$UPeCTVF?S6D03CaGNUOQNv&q51!unCdlmgJW0_v*eq_`Pe&mZLboeCEz`Z#*~EHtqcS5q054ZQ(`*=gCv! z?xbhoo7G=i{?+Bv9(D0%ZSm#@Y>tDxy!PMR|LVb82geV-7g#Z6g?O>{7zrK=j+5L0 zh&w*ylrayt&t91gtHLo&IHm~4vbS4jJ7>46!Vyh4q6kN_w@bu+@}7O>x+=74LaQRQ zKE}issG5QbzMf8DJrj5O(VE#KqXT|KRuSVGvE1stkPYkjEIaW$y;{%P&HDaH<~o~J zry&`Z z3J&9YW@+H(xi|9`#6Z*c=Mrflo zopjo`m{|y}H$by^1iQ`=^M)xz96rB8j9Z$-cyoFRDaTu)Y)=CHB^ol!;|Gyy4|v~` z_|*p!#^MMaDdFO9c*tOK{~pE3+TGu==Bz(VX)@d0eHp)RU8Vbdy!*36dOwFiq2=9k z%Ck6Cf3N26Rh+#!PT>P3TvI{>OCNyvZ9BD|>vFF6->V?klu@QzkTFnJq561#tt{1G8OHJ*>0Lim43~2nSY0+JuBD*tz8#@Wd`}4@ zJ8L7cF4rHy!m*(wk}%ll$+sgt+vU=`;vb^Kx&%U~DcK3-e}kvyj)#??65F&$R`BdD z(bxn61%1x!3_(VU?dh(!RrPPv{M!`gw!&_9T7j-Rt5@)63f!mM|%nwXFe5qpT;H$eYFiM&5*;Pa0!BlWn)y<6(0MOEH&1*e3tNU*4)2{&;!z)~m zkd?^cL&!#?Mie1uwaZ&!?8=rz))4O<%K91t`Q0H$=^3|T8A9b1zKvwd5x#@OO>ZZO zn}Bec_8ztTHwNiG6GH(pfrR16;NeS^o9qElJ+&I@Dd?4o2QsTVv-BQiP8uINnCAsd}sj{2X9j5BM}|k;vhekGrv;(i*p6`I=3#jAD>9>WcqWy;^V$D{U;!>Wu|ClUXu0*M{ z?Fnpvm9Sl~kQYy0E~stcVa{dL4J>#PZcHi9jl$wnyatjp;WgUA3T$fg$q5#s5~;gC zhty$FDv`S96H+(QTozqK|d>x5CdNN(y^oke582mU(i@b*lv^D)MZL^tI zD}9g965~^RU;4$|=9Gnl-F&P>%v&Jk%HmdEkU}c*PiVwT@lxSdxfv>YI9#LNDqt$77)FaJkG{xw3KAIxEl`&&%Vl^HgX$jKUTBsu=-z+|23tA)de zH%RLhx3d+AxO8CmGplVy(&r!+o*XPA9^=G@NQPUTQu*M87z!^3UPEfXCgFtYU3*{*rEKlJQ<;MuD$rZBFgDyNlH09Z*?R`FW=W<2R_n+@I*Pprl%)~R(u{n>O)^Y)S$k}Nv7XU6Zz&z*r{-R~mwwYM6aw&eCYTdSb8`Qd; zv(@Ul1I5;U#NBE64_(5f-*`YcOuB1;Eh$gBEASe9oPJ~U5+zB`ECbQX4K@c^R5CM< z@@7BmqON}2#jK=*Sx191FK@!kSkck7VDAI8sa9HbSCCe}yXG4hymKE?9IZ%HO!*56jvM*C4)F}D zqH=GT<4J1`^0L8iN?K>QUzZC{(KuFcnA02$Bmz?v1(9$=syE|PenMJUq9p=Tfuboa zG^Zdnm^bq=KV>B$!KdK(36zAB8cS0SE6KcY7bE|n^l`B=6G{Z~YPLXfj8-NVOfAgB zF#ej`13apaIW{jGt%|MB#Y^Pj@-cj@sgRGs09u8Vn?@Iv>*M zN)5~cPZI#q3Dbf8Eeu9^4mT-?=dJZzl|}PeMujQYBQx2%UR+^tG`%%mCt@-Yg3oL zm(SZsTMX@v~- z!aPOJycy1?(nWNgfK5gI5sFr*hAhQ)!^5O07Soshi$VMFuTj`JxncZ;iOO47^(#Pq zT4WTd>n;?3ijYZpBH4r~PfZBi;lk;C7R<^MuJ|06{AX;Rg?B92*@X6@?bElQO{Iemj;_Y*P^>E2^z$C(*C&o>f!e9osX=Y^=IjGj z#gvWtv@(Z-lw)M*624-ET{pY1K#Xn2kh1Haq)FK&_GucnBU#*fp#AB%RZNI+H-P@+ z=@jpdf0*8J6yBJjC}uMImH&_aB9Fc{k*zF51Vc8B;(E$XzP zwn?PljkV7rurYIcQ|+^(@&&y8$d}p7jeR`rQPV&yb~(DEg`69kGmo0l{4G~Dw9x0( zT8I?jT0>uUWLq3QDo5!fVZFvJ7l9lY(ut?Xz2tfWB(Cql7qC*o2)-}~0>oAskr4ZU zAw9dWi5-8mJN(z+lkW&A8{391)v8t2+Ve{fi9U*;rj@sY}At1V0j;o z#!}^S5M)d%#`^SWbJ>Y}*=!th2$o|}a%6^cF`6=#a$SkHUG`H3G+CZ1 zBkFAr(E|StDy&Rx!Ir|*FV34nPdUUsa=c1^9_;y^ z1fW*5X%%hb_GEb#*)ArxPIbP0@U4T>SMRyh)qAzod)4wbt-KA^o3e#u2$@_vwf60X zw;HBT&74(hcWbq~)v`TW*&fuQViE06Gr522{M#4bx;RsPZ=Rh2YS18UE$w1Ye`ZwxdZ@k?&8P)=I(-qiO zWBPy=*fMin3$#8A?0XQ{rv`B2z_cV@39ZdI$cX;s_Ci9{cImOSt*ne5PK?daVd#ouk4IWg0w ziQCkw?ON4#yc<}2XZ;)NUvIhHGVb_`1&eO)n7p7aSgS2qJMK(Y1ki%Z)_m=`uRf

@qH6L?*$f4TzI|dcGGxUc5Ac4_oMgEtKO3uOk&=X$wf=BmdppL z1(>iV%LB|@R@swWSUtJwYxQ5P|4QRsSeDmf9a%*Hy9!hwY8E&-tTqe2dT6|Jypy_x z>!#~f&n*ub6AfD^Cu_v%0i|p!ozAWJ=1rOASwUUtS#*;eG`*8{9C+sbKDY-cC(i)> z!4YNUGdNZM7c~DD6z3P%$8#*8DoP~-i>0#XH?8+tf5ZMAyRvc*PSxM4`CAodE55Ju zqd6PBOJCZl0n_^3=6$QW0^A=4S{=s%)_=Qr^D&=Q@!1g0Iu~5vfbd`MK&iB#JOA~vm zlqjdSP}i7FznGvVrgCQ6sz^8y4kTQ1Wz1mDFzii}w+tEc zmAW;I(x`mXGwO!TY9VY^o>5Pp&8kXTlxMT@VqVsZ?on_^)zad$&8kLP0-Kc=HY~Ta zjM=P~ODkZ#5~P*y*5=u)e6Y9q3KGK&GY+6{`-)o)&GDpFIZaDiXb7)1gxBQ4^RbtW z`e9?pTA__)mDZNn`=EI2byx%IFSKVM^?6w1=5KM3>R>CZPg^j=TzQ!tp$xgr%MN0) zBdm}bVyki~<!M*m>l}%jhy|29MWrGQ}8~kpRY?3!O4ml z{?{G9>i8F~Z@ZM%FDOsYIevVC*F%5|Q}MpjGB$pOw#{_>Ch=+zrU2*@_%u-z3T!Zv zUbM+thqV7-&TMdXU>GWWBm&h9Dkc79re8w`&wLx3{FBAHxVzr1+bMR4@{dr~_z&Ff zo&i$w@NrGbc_bq3aIY7827*JE$T%@5p1aPr!NJWV(1B4Bx*e9&)(m}%oFUS9vESr% z#Oe-S7q5n})-)0!_e@y1V#6b_Q;^Pvi;bH_<6&$KC zr9u`Dcx}{D>3TxJ!CGcdAQQw6y>!f@0|kc-gzOQhH~g=iE8TAL0^XrpqsVF?{|^F> z2s9J;p9KD%!2crf4*(a=v*Ry!%YM?)cmj3;4gzihw5(KD;ltubN{1kRmay*4#a?-2Ylk4$8|YQdXmtm(%510wTa;X6F57h9cJ^`Znq$KV;ML z<}W*BC*?n@%Bs(&C!M=z*DI~Zp*wnM_du_C_dpkP6aO9_-09wG0M)l!^X6F-4-t~s-bt4g0rq_qV$b?6iL0y7|CX>-V?X z5RN-q@Nu_DY@i>pvIqKw?tcKsPz-yt`i8l_Tf6kNArx63!r3@ZI+$)3vg?V-jp$-8 zQWqn6ag2N4TR9;aKA!W4Z;4m8;2QvJySnw~^v~0^kd-am4}O$#Nnv~xHZ~0B9AO|f zi2Z~0XBa7oH{fR_{aEy|n}t!fyHpM`@7C{;Y1$E=hl%PoyXWZ2jn$9z`M5~ zzFhA5SJ=AfaW{ce1Q@>!Qb;230)bZuTp=(<;57mV34EErF9M{juz>5I4f`d!wCgJp zSc@8z&vG2Jsv7K_zEdIA;-fH$BHs4t!|EBaN?QPhm}S_{T0x zbWNX8>|0d(7R|n8%$nq^54petE-*hH84mqw=`DWX@8?2k0gIHl2~;UZV22y>!mv zLQXI~;%9mh`^f=%cUdOVTunN|@#SfYti{Pc&rjkd`ZYp&4^^+8V=?sFp`_#0`cOP) z@ly!_DB=PP&iWlOlfjA%=6t+;V$&RlpB$ifbj;E1<>?BI*G*Z+kp60oUp;5>@lQ@% zpjV!p20h{@2k7-RnMnHU42fBMc!7@vbJ(J_dTJm0nL$dp$^lA3M+@CvN+qayxkm8< zFDo>D1=X4*fuE_Xgcq`)rUAVxW+G+VU2)e;v*I^t=zx}Te(hu%{22MQQ!(~KMZi@K zP%`T?apzWNkg$HLn~+ei@%3{Sp5Hnt5p{2!KFxk|fL?FNM1mDur=;;^D!)kM7f}Id zhZKU7SjtSl(?Ch?t{$dTV4Bawugf9==`7dy<#U#$eDfSO)NG#YW?a2(1)wY) za}RGJE>#F7wo@l7r%slB?#$GAQsO`&BnZOcMbC6q>wlqG%aj-&E*8efM=4t^D(13%MS z*-sA8yJ$N-(p(_jEQ%|GPdm39-@L3yR#wfq>ZwlvVE5iRD}LYiEu84T_3WID9@sfd zEjcLUDhjm+N2A)O-h@)=Y%Wm^9P&+p|YFxkQa#1&Y;{6neejjun9Skmbz?z#*G z?xBRHR?TrNFylxE%s-TnPKzwo91JLFa$KzPU=9n2lEFCvC~9T)j+5hsS6nZ<##fEM kIR2utX7{Y5lpRvb4ryhFloP#UE|q&m`ZZ>KjAe*gdg literal 0 HcmV?d00001 diff --git a/backup-drives.html b/backup-drives.html new file mode 100644 index 0000000..881672a --- /dev/null +++ b/backup-drives.html @@ -0,0 +1,238 @@ + + + + + +Vela — Backup Drives + + + + + + +

+ + +
+
+
+
+ 🛡️ Data Protection🛡️ Protection des Données +
+

+ Backup drives.
Because data happens.
+ Disques de sauvegarde.
Parce que les données comptent.
+

+

Every server tier can be upgraded with an automated backup drive. We handle the setup — rsync, snapshots, or whatever makes sense for your use case.

+

Chaque offre serveur peut être améliorée avec un disque de sauvegarde automatisé. Nous gérons la configuration — rsync, snapshots, selon vos besoins.

+ +
+
+
+
2x
+
Backup tiers availableOffres backup disponibles
+
+
+
24/7
+
Automated, silent backupsSauvegardes automatisées et silencieuses
+
+
+
+
+ + +
+
+ +

Protect your data without thinking about it.Protégez vos données sans y penser.

+

Add a backup drive to any server tier. We configure it, test it, and leave it running silently. You get notified if something goes wrong.

+

Ajoutez un disque de sauvegarde à n'importe quelle offre. Nous le configurons, le testons, et il tourne en silence. Vous êtes notifié en cas de problème.

+
+
+
💾
+
Backup 512Backup 512
+
512 GB SSD
+
    +
  • 512 GB SATA SSD512 Go SSD SATA
  • +
  • Daily automated rsyncRsync automatisé quotidien
  • +
  • Snapshot retention: 7 daysRétention snapshots : 7 jours
  • +
  • Email alert on failureAlerte email en cas d'échec
  • +
  • Off-site backupSauvegarde hors-site
  • +
+
AddAjout
+
+
+
💿
+
Backup 1TBBackup 1 To
+
1 TB SSD
+
    +
  • 1 TB SATA SSD1 To SSD SATA
  • +
  • Daily automated rsyncRsync automatisé quotidien
  • +
  • Snapshot retention: 14 daysRétention snapshots : 14 jours
  • +
  • Email alert on failureAlerte email en cas d'échec
  • +
  • Off-site backupSauvegarde hors-site
  • +
+
AddAjout
+
+
+
+
+ + +
+
+ +

Which backup fits?Quel backup vous convient ?

+

Both drives are pre-configured and work out of the box. Choose based on how much data you need to protect.

+

Les deux disques sont pré-configurés et fonctionnent immédiatement. Choisissez selon la quantité de données à protéger.

+
+ + + + + + + + + + + + + + + + + +
FeatureFonctionnalitéBackup 512Backup 1TB
CapacityCapacité512 GB SSD512 Go SSD1 TB SSD1 To SSD
Backup MethodMéthodersync + snapshots (btrfs / ZFS)
FrequencyFréquenceDaily (configurable)Quotidienne (configurable)
Snapshot RetentionRétention7 days14 days
Failure AlertsAlertes✓ Email✓ Email
Hot-swapRemplacement à chaudSupportedSupporté
On-site InstallInstallation sur place
+
+
+
+ + +
+
+ +

Backup questions, answered.Questions backup, réponses.

+
+
+
Can I add a backup after the server is installed?Puis-je ajouter un backup après installation ?
+
Yes. As long as your server has a free SATA port and physical space, we can add a drive and configure it on a return visit.Oui. Tant que votre serveur a un port SATA libre, nous pouvons ajouter un disque et le configurer lors d'une visite.
+
+
+
What happens if the backup drive fails?Que se passe-t-il si le disque backup tombe en panne ?
+
You get an email alert. The primary drive keeps running — your server stays up. We can replace the backup drive on-site.Vous recevez une alerte email. Le disque principal continue de fonctionner. Nous remplaçons le disque backup sur place.
+
+
+
Can I use the backup drive for extra storage?Puis-je utiliser le backup comme stockage supplémentaire ?
+
It's possible, but not recommended. The backup drive is sized and configured for its job. Using it for storage can affect backup reliability.Possible mais déconseillé. Le disque est dimensionné pour la sauvegarde. L'utiliser pour du stockage peut affecter sa fiabilité.
+
+
+
Do I need a Plus tier to add backup?Faut-il une offre Plus pour ajouter un backup ?
+
No. You can add a backup drive to any tier — Rif, Rif+, Atlas, or Atlas+. The Plus tiers include a backup by default.Non. Vous pouvez ajouter un backup à n'importe quelle offre — Rif, Rif+, Atlas ou Atlas+. Les offres Plus incluent un backup par défaut.
+
+
+
+
+ + +
+

Ready to secure your data?Prêt à sécuriser vos données ?

+

Add a backup drive to any server tier. We'll include it in the quote.

+

Ajoutez un disque de sauvegarde à n'importe quelle offre. Nous l'incluons dans le devis.

+ Get a QuoteDemander un devis +
+ +
+ Vela — Server Installation. Simply. + Vela — Installation de serveurs. Simplement. +
+ + + + diff --git a/check-order.html b/check-order.html new file mode 100644 index 0000000..463e764 --- /dev/null +++ b/check-order.html @@ -0,0 +1,228 @@ + + + + + +Vela — Check Order Status + + + + + + + + +
+
🔍
+

Check Your Order Status

+

Vérifier le Statut de Votre Commande

+

Enter your email and phone to see where your order is. No password needed.

+

Entrez votre email et téléphone pour suivre votre commande. Sans mot de passe.

+ +
+
+ + +
+
+ 📞 + +
+ + +
+
+
+ +
+ Vela — Server Installation. Simply. + Vela — Installation de serveurs. Simplement. +
+ + + + diff --git a/index.html b/index.html index cf3c9d6..d801c90 100644 --- a/index.html +++ b/index.html @@ -1,688 +1,687 @@ - - - Tell us about you - + footer{border-top:1px solid var(--border);padding:2rem;text-align:center;color:var(--text-muted);font-size:.8rem} + @media(max-width:768px){.hero-grid,.form-inner{grid-template-columns:1fr;gap:2rem}.hero-stats{grid-template-columns:1fr 1fr}.nav-links a{display:none}.tiers-grid,.why-grid,.process-steps{grid-template-columns:1fr}} + .glow{position:fixed;width:600px;height:600px;border-radius:50%;background:radial-gradient(circle,rgba(108,92,231,.06) 0%,transparent 70%);pointer-events:none;z-index:-1;top:-200px;right:-200px} + .glow-2{bottom:-300px;left:-200px;width:500px;height:500px;background:radial-gradient(circle,rgba(108,92,231,.04) 0%,transparent 70%)} + + - - +
+
- -
-
-

Tell us about you

-

Three quick things and we're ready.

+ - -
-
-
-
+ +
+
+
+
+ + Taking orders nowCommandes ouvertes
- - -
Step 1 of 3
- - -
-
- - -
-
Please enter a valid email.
-
- -
+

+ Servers installed.
Simply.
+ Serveurs installés.
Simplement.
+

+

You pick a tier. We show up with the hardware, install it on-site, and hand you a working server. No upsells, no subscriptions, no runaround.

+

Vous choisissez une offre. Nous arrivons avec le matériel, installons sur place et vous remettons un serveur fonctionnel. Sans vente forcée, sans abonnement caché.

+ - - -
-
- 👤 - -
-
Don't be a stranger — what's your name?
-
- - -
-
- - -
-
- 🌐 - -
-
Please enter your domain name.
-
- - -
-
- - -
-
- - - - -
-

Success!

-

We'll be in touch.

- -
- -
-
+
+
4
Server tiers — one fits your budget
4 offres — une pour chaque budget
+
1
Week from message to installation
1 semaine du message à l'installation
+
0
Hidden fees, subscriptions, or surprises
Frais cachés, abonnements ou surprises
+
100%
On-site install. You don't touch a thing.
Installation sur place. Vous ne touchez à rien.
+
+
+
- + (function initThemeIcon() { + const isLight = document.documentElement.classList.contains('light'); + document.getElementById('themeToggle').textContent = isLight ? '🌙' : '☀️'; + })(); +})(); + diff --git a/server.py b/server.py index 5f1b9ff..05c29a9 100644 --- a/server.py +++ b/server.py @@ -371,6 +371,13 @@ def delete_submission(email: str = "", phone: str = ""): db.close() raise HTTPException(404, "No submission found with that email and phone") sub_id = rows[0]["id"] + # Get current status + sub = db.execute("SELECT status FROM submissions WHERE id = ?", (sub_id,)).fetchone() + if sub: + status_idx = STATUSES.index(sub["status"]) if sub["status"] in STATUSES else 0 + if status_idx >= STATUSES.index("confirmed"): + db.close() + raise HTTPException(400, "This order has already been confirmed and can no longer be deleted. Contact us via WhatsApp or Telegram.") db.execute("DELETE FROM submission_tags WHERE submission_id = ?", (sub_id,)) db.execute("DELETE FROM reply_drafts WHERE submission_id = ?", (sub_id,)) db.execute("DELETE FROM submission_data WHERE submission_id = ?", (sub_id,))