From 48d66950d8c5645c2ccea9587cb20c18806691a4 Mon Sep 17 00:00:00 2001 From: mcolonna Date: Tue, 25 Mar 2025 21:00:17 +0100 Subject: [PATCH 02/34] add: non-configured nginx docker --- srcs/.dockerignore | 1 + srcs/compose.yaml | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 srcs/.dockerignore create mode 100644 srcs/compose.yaml diff --git a/srcs/.dockerignore b/srcs/.dockerignore new file mode 100644 index 0000000..f04fdfd --- /dev/null +++ b/srcs/.dockerignore @@ -0,0 +1 @@ +/.dockerignore diff --git a/srcs/compose.yaml b/srcs/compose.yaml new file mode 100644 index 0000000..6528b1c --- /dev/null +++ b/srcs/compose.yaml @@ -0,0 +1,38 @@ +name: my-awesome-compose + +services: + nginx: + # TODO no latest?? + image: nginx:latest + ports: + - 8080:80 + +# image: +# build: +# ports: +# depends_on: +# - ... +# ... +# | +# ...: +# condition: service_healthy +# domainname: ... +# env_file: ... +# environment: ... +# expose: +# - ... +# ... +# external-links: +# - ... +# ... +# healthcheck: # Dockerfile +# hostname: ... +# labels: +# - ... +# ... +# label_file: ... +# restart: on-failure:3 / always +# secrets: +# - ... +# ... +# volumes: {out}:{in}:{rw|ro} From 8f789d51a082450578bda43a44aaf9cff1e2ccca Mon Sep 17 00:00:00 2001 From: mcolonna Date: Tue, 25 Mar 2025 23:09:18 +0100 Subject: [PATCH 03/34] dev: add notes --- srcs/compose.yaml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/srcs/compose.yaml b/srcs/compose.yaml index 6528b1c..403a393 100644 --- a/srcs/compose.yaml +++ b/srcs/compose.yaml @@ -7,6 +7,7 @@ services: ports: - 8080:80 +### services ### # image: # build: # ports: @@ -36,3 +37,19 @@ services: # - ... # ... # volumes: {out}:{in}:{rw|ro} +# networks: ??? + +### networks (list of networks) ### +# (services are connected to the network "default" by default) +# (see https://docs.docker.com/compose/how-tos/networking/) + +### volumes (list of volumes) ### +# (there's nothing useful???) + +### configs ### +# ??? + +### secrets ### +# ??? see configs before + +### From 3ba95ed8a6e31c6ca1926815523c4b5bd1b53ef9 Mon Sep 17 00:00:00 2001 From: mcolonna Date: Wed, 26 Mar 2025 18:57:27 +0100 Subject: [PATCH 04/34] add: nginx example website & dev: Makefile --- Makefile | 81 +++++++++++++++++++ data/nginx/www/VarelaRound.ttf | Bin 0 -> 132204 bytes data/nginx/www/index.html | 144 +++++++++++++++++++++++++++++++++ srcs/compose.yaml | 2 + 4 files changed, 227 insertions(+) create mode 100644 Makefile create mode 100644 data/nginx/www/VarelaRound.ttf create mode 100644 data/nginx/www/index.html diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..b55a3bf --- /dev/null +++ b/Makefile @@ -0,0 +1,81 @@ +DOCKER=docker +SRC_DATA=data/ +SRC_COMPOSE=srcs/ +OUT_DATA=$(HOME)/inception_data # TODO to change + +.ONESHELL : +.SHELLFLAGS = -eu -c +.PHONY : all run re data_install data_remove data_reinstall help + +### pretty logs #### + +_ECHO = echoo(){ \ + if [ -t 1 ]; then \ + echo "\e[30;47;1m$$*\e[0m"; \ + else \ + echo "$$*"; \ + fi; \ +} + + +### rules ### + + +## Run the compose, installing the necessary data if necessary. +all : data_install run + + +## Run the compose. +run : + @$(_ECHO) + + echoo "Running '$(SRC_COMPOSE)'..." + echo "$ cd -- $(SRC_COMPOSE)" + cd -- $(SRC_COMPOSE) + echo "$ DATA=$(OUT_DATA) docker compose up --build" + DATA=$(OUT_DATA) docker compose up --build + + +## Reinstall the data then run it again. +re : data_reinstall run + + +## Install the necessary data if the directory doesn't exist yet. +data_install : + @$(_ECHO) + + echoo "Copy '$(SRC_DATA)' to '$(OUT_DATA)'..." + if [ -d $(OUT_DATA) ]; then + echo "'$(OUT_DATA)' already exists." + else + echo "$ cp -r -- $(SRC_DATA) $(OUT_DATA)" + cp -r -- $(SRC_DATA) $(OUT_DATA) + echo "$ chmod -R 0777 -- $(OUT_DATA)" + chmod -R 0777 -- $(OUT_DATA) + fi + + +## Remove the necessary data.. +data_remove : + @$(_ECHO) + + echoo "Remove '$(OUT_DATA)'..." + echo "$ rm -rf -- $(OUT_DATA)" + rm -rf -- $(OUT_DATA) + + +## Remove then reinstall the necessary data. +data_reinstall : data_remove data_install + + +## Show help +help : + @$(_ECHO) + + echo "all Run the compose, installing the necessary data if necessary." + echo "run Run the compose." + echo "re Reinstall the data then run it again." + echo "data_install Install the necessary data." + echo "data_remove Remove the compose data." + echo "data_reinstall Remove then reinstall the necessary data." + echo "help this lol" diff --git a/data/nginx/www/VarelaRound.ttf b/data/nginx/www/VarelaRound.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9d018125142e6af42661b072a7443417b5ef1673 GIT binary patch literal 132204 zcmd3P2YgjU_W#V>mzQ3E5CVbl(nA{Q2@oNjDj+pM#DpXi2?>UTj%^WX0wQ8#70cSz z@`4Rn7tuw<&e~T|5ete4h=>a6`+v{5_vPJO0;s#c&*%T%XUds#=FFKhXXehmcjk_e zLWoZAY$9ZEX<7M5|IvMg(CUSd0|$>DHCB!b_7!5vV?xxd8a#G<@!C6`bwXsNAk)L6 z#`euzd2GVFpxpv4RW-A#=d6Bu<0Tkazdxs`Zq8TpmK}z?8$tiBkV3j#A{e32^29RX zEgFRvDw8dyiEBY|dr$!M1}fk;{kC5SuaU0C-$r{yQHuGed2@=U)?K!%Z_LHP1wV*j z?JJ^q>&0UiQ~1fZI}ai6ey=DS<+bZ7L(Hbmm+MigP^(l0;Nf~Gr-)3M3ApXIMfkW1 zg=4roVdSWhWn!lgr-tjY*`$ng2>B@C`0*BBD`rW^9!GE<&{^mNR`{F|UM~l&F zq!6w_YMkqoYY?Z66=SIk^@;oqn67G<>xBA5`M6HFx{87L_Y?i(DoC=5&?w)rM3cFichpxxR;loku*dV zs%(3L)=T50fZ`pU3WE#%3w?Il3!y}Rkaa5FAqw06l=c*`^=p%;1KVM9SKSfN3 zKU2(tKU=iGpD(t;e;j`)o)oXc-y?n#5<&&S50>Z!vXe}LpCYs2=gM;UL*x+n!{iwF zAKfKwUSYmr3=udK>uuw09(~*0z|GHXT$@g17m@n9)y?>Gek4~b3}j97yr4U zMl?aobC5Pyq`}P;^#~i0Ivw~?qFjs+qITmTM(~Byb1AUa3b2VVkr1Jz<&mUVjkq9I#t82>$&XtfJqJq(x}`baRJAhp%cfS(ocJx&WBFsL%M3zdN#^hz_lmo zr?Xblpr1xy&Xj8&G*u03HE4*k3Av_0@_O)b=N*Q0(&K1gX97)7vH$@j6J?!s$(?={pPMrbFZDVgSk@`Pdg1kj;Y*&^U*u|aGQJVnd(oyt_dxn_dQR49f@*gGv0x*)?B*; z$Xty!q`ul7W7b*%B&XjfakKcFXchkyuZjPNFT{7^SLrLe%Q%@K&yz#tcv&rH%Z2i4 zd7TPV(du974Q+~ciT1oL$(Cy?wvDt+v0Y-DXM4i-f>*3px>vqesn=+)DzE#!9`}0I z>ou>ByuSAO!R}@6Wbb9~W6!Y{+0VCE+Ux9>+Lzi_+Hbc%?p@@4zV}-1lRkEz&OVVo zNj|wg#Xc*1j{6GV0N-%mfxg3hC-_eFZSY;>yVmy>-+O$w`tI<3+4o()JiijZYy7VF z+vj)4Kf*u3Kg)lR|8W0J{&)I6?7uxABw%VlL%^c}&jh>@@Ls@Y0Y?H(1x^gC32Y2p z9JniRPvG9buL6$;*@8lXdIlv1Wd{`oO$e$FS`f4>Xnkh>SLbn^AMFy-rDvDKF4*DWUnHrJx;+(k>B^8*ZcL}AN2mR z_c4cX1USMSw?-93ogZ~9>bGdW=pNDYqyG}UF8bE!`=cL^em44z=ntb0M1LRcit&%> z784WGH)cT0;Fz&7(_UK9IM+?{a`$8C>$A@0q%kK+!;=f~d}|8V?{_?HtR z6G{_CCrnP5kY;tMx=;VizpGp~(a$(B!l({LFr<_PtsX?hdQm3Xiq%KNbp1L7* zOX`EE+fsL>?n&L7dNj?J7LwL8EivtZv?tP@OM5--gT9aS{YT#y`@YrpK;Kj8S7sz< z-ad~Dz=A&6%vu@5hm~|psWd~*V$d1p>%pREix9ryJ=d=Hv{YCb7*}vxa z=5)=8%ITZ)LGF3Ef6wcmSDrT}Z%ST6-lDwad7tGS$vc(ro!=$DcYbnyUVcgb^ZEbI z|0w_K{2%(seu4eE_lxV-uiroWz0~iWeqZ-b?0;4Nwf%4De^39d{eK%!G~oOJl>_Pq zTsmOsfRzJo7;wjchXx!P@Kb@UAf%vYL3+V6=QR(E93%%lU07XodC}^k8;g4vFD^b% zQc`kd$+aanm;Altc&WW~e(7IIpDlf>EV=BwvYN7%vMbAWl9NFW%<43Pn91T zEC&}19x-_B;M)ct95QxD-H_EoUKsNJ(D09{T>UF~g<~+c50?VF!mV9lmb( zYr{Vpkv*bt#E217M=ThzYQ(YgZReMtzwZ14BWH|!a#Y%=J4d}gdfe#U7X(}|@q*Sd z*<-F5;~LvC_Mvgf;(#S;}TRJ>d9WyOg~du3Qs^_Z?RUNPHSzTIPU)@~2r24+yuT%(WmL=NmLKNj&wF~loL@fw*7-*loWJ1M!jgr{7w%a!Y0;aD;}&1P z_^l<~mt3;sg{7rScU(5_@~M~KamC^*J73v&<;ko5_Lrf5*|jWS+0bS8FMH$akgL~U zePsDJ%YVG){A<=+^Wrt%uZUhTYQ^O%T375{>9aCp#kq7W8DkuUSId_x{ud=x$f|~ z6YG9kZ(kp@K5TvD`uO$L>#teAb^X5UlCGO~UF&s+Hl%KtwPE{){nr;*g7o zfBx%5e|`40NwhZ_><+r?P;hh?5=ygJ4sAXg5bhOM;2v}`Vu834_7j)k z`g6HlCpXADq*J~s56Ev+gi2LeDo<6ar`0p+RrQf(!%RI`>#Rj+v09>*re$dNYdgK3 z_S)g~oY#w92fdC*`bGvvc8ly485J29nHx*y2$Gz zZ;ZSx@@I#?BgE0w(Zdnxh<3y~(j8fj{*F?|9LGY(O2-|JyB+sB9&&7TJnq=;_-9m? zsIaK$sQ9R~XccXb4vy{|-4&x`WOQ=$km#!Dy1185sZ*(^a!(bU8hEPcROzYVxUZ*Q zAg;>km`7}p*<8CV@)5a9ekl*ilPXE2bM5}2cBmKB`n7ejP)b3f- zZjaaZkv@?Dk)e@2BOQ^kkx7whk-3rmBa0(PL{5sF5?LR)Ao7aHwUHaRc3T|Ys9k4_ z>pdL~u3e_1AJ?wgaRq93m*XDC{f<`D?kUI9?P}+R+I2$hy0_J?7PXV7l1`2$?{5}iX-<8PrPj?gV@3;T@{kQHPvcJoxAL0MVr{4+j=}(0H^h5Ta z`Ee6!(9(|%f5B{>i6N9!rqhi|JV-_rTt&z<41NX#QSi^`JqFuR#oaRYC7(YpM%vcQ?pdPnx^holhvi_LN!BOq^2mRdPqH@rmE+m zi=Ltv?)g)2FH(y8`_bZJ%rnxmdn z3)CrbPTY$tx<~C%yVcL?CHaZETs@(h)XSQN5#doaN{v>(sGaIXRjb+5NV!j4 zf$^e3O;RaJS#pFx5?YYDe;XsCYAUZ&nPs^l4E37%#CD3fVoD4xF!!PBadGEa<llZ&bB(}-B#FO$)@r1lX{9EFVK|UpR$Opt8`LuXN zJ}KUi{}AuW=fqyQTYMzGkpC73rW?oBR{<8endUrrU} zvah&7ULnHq=qEzj#EtSQJXiV&SBPIlp6o5olW}6494Ic7W#TWgL0l)7h`Z%FagV%C z?353RSLHVGh`dESCGQqj%Q@m!xm+xlmx}%Jbv)&HSAD2HP`@dc`dGcM_NxEjsv*=# zO=@16QopLt)aQ8e^Nl*BzE=D3BMo+BpXehyi6q%s6v{*~NG6DM87_v&EHO&v zi}Pi!m>>(qOgT=>k`qLOtQ5`iV$p)IP zZxyX_vv@$>ARd%AimiC!wO!sL{vq!bZ^|9wbv*TYU+xm`$Y;fS@?YX(`Lg&*zAZY5 zlcJ0GMfi#DMS%DLSD+IjNc<@L#c@1K{uWo=Bf?u8#WT>;x8tUO2d!c(Y7ktHLNwNNcqOVlFuZ}pa{Q#Yww)!)=z>ISt*-J-Uro7J6a zv-+#LLp_E0!4CC+x)-yAt*TXiF2BGP_A6Xt56Q#wsQg}@kUzj$a)Y!3y!V5OLe9fG_($ zbXDN}17tgs`yTjTMVO+{aIltY!wH1ma0zfehMSC#ToPOX9B5p>AWTDeSiUI&$>BO% z&8`r2?2I@(j%d_w#Lwnth%EJcofAC6!Lu4VJ(D{jCaZI~Q=sX{oh#oHB3%1kL|C1=U8JbX zMa1uNmx;cx@%E1TL8eIipSvUxZ|1436KUksd@)LO73pVm^MShnj>08Ih`4P$;<^8) zt`DvfUASB-yCYW(*{9(x4uysjKa0U|qjcvwEPi(VfOuDgCv+!<88qPtlaNL<2NCay zaIg5y^_JVIDDX8L@CHu~hvIDx!NcT_6uJ&d4R4S(iBaU-vZ!j;Ay3?su3hYjt18s( z{{yFe$T}Xy_5fYuDm}_@LlBZ9cqm+vyxjG*+$U0huS5MtVaC&i+EcE;jEKSx9CS78 zoNg9qI&$aA+gbF$c+u19R4-f)yNe#b$H`-u%UT`UU$cuYHg7nDYN_Fth%VX?kxJJ! z*vMe{g($}Lw_FPoxoVLJQ5*11&FroeISLLlpibn}aM6?9Mp20Odxe-&S4e-?=NxXq z{CSJ;#azBbZ4>8{!`yp}aJfEIokTRd0*ouea3kU3;bP%B!}T#>3S;1U z!~H(G6_~LTzlUJYZho7g=bOX;+#Aq)%D#yI?sCO5u14)HF;ZL1E*3NXGPptRP}>c- zJML*T*ur^g%BA#t%u4eCR|pNRCuXJ-;d(-*GIHuc zQHHYGLQcC8vsxh0~C^T zB3=slOF=siwlYujhrJ9`cVTVBWf%`iKocOwX#WBqve**lE;vRP$?uu`QU0(xtCF&G} zdsHXpt@)tMLVYggyhX@S18JJTy%7I?kRSo2x1i*HDCHgT6>zh~67YT)|NF%wNP9=@ zXa5z@=zq#vD9$?#7EY1kaEkF2Wt9#GmZbz;Fx+V$JE_8%9pOx@teWOnHNL{B;;QvU zDm5`vBch_5qS7f!VoGT}MM+h0s#B&o9aYm(ohl_JDkdt`siin-AJsy;isBMyml8)+ zRdK5dEh%n|(@LDGWZVLWGav?$lImKgZS;bzxU~fvXH;F!C`#QL)KwPubRZg2ytRw$ z0$hw!jIOAw+!`i{GSz8IacarVt|b*zo-?eZ#2|=p)H<9yM>}otleQ+xz!JQWaN5f% zqMTY><(LaAKpe5E!r>e}8cBtf5e{cQ#qujF9j!VwBuYe*0XdxMgij~Rouexp(8j82 zhtqF#MHNyUg!7|VF2!=IBC4=VCIZ@W29(q|#h41G7*51dfFp)GBPkX+yn0)Rs3D4N zUSeuxWoQ#=iRWa4n zsH|)eK@H+`L_kQllxW(R>QcRkz%yib#v&Iow^hxYDTwSprufmo0HKwki6Ua6DwANu z!6~gul{ssxOH-X8DX4rh^c1or$2h%EU4JI!Ho>PXQEws4NSV)Ejg1U-Vp@mUwNK#Y`vbp212f|Yp^kl+T zq9%hO|6ruHZ>%#kVXF{bVxZ&_rx>_ZO3A&jYYJZEtFmzw&dxE#jxuKu%r7toCRgmJ zdNMp*;!#i+QCwV18VChWR=0-wBs*6pM?}NC!%)Yr$*In6DXo&iaOj)D?kTMrg*{SQ zZ4^eNw0cq4Go{r|VXu@{Zwez*T74+&ozm({VR8zzq3hpiuY#sy9BEE@5%rc-XNn0K z)`q-PN2Z#P@omT^9qC9B&fw%T))SR_T(2tC(_FtO)XxFAqESBzV^BW|V^Kc}<4`{e z<552f6Hq@26Hz}3`=EXlCZT>5rlmLvxFhvVaa1|Os~i~gWEI&&H9}_^*=%}>vv0Dq zFZyE!y24;sY=<2(raC`{2KKX3z#LPZneHZT4YHS!#W^#QTD@e~vI-1})QVUr+oql~ z(PXDMa#->laMSseojy!p^yyGqN*7^|;TnoHj00oxTeD?Xs%tLvfeLh(rwW~=IzQE! zmy*`4Ak~?FE>akF4aobUi9}eOBh4|Gh6Jc~=&DtNvC^R0QGp8|MqONy@}=w=3Jv$i z*cImN1~MCl(>Nw;4G_gn|B~doRcSE}N5Lxa9MGQ3k*4!=+GC2{)DCAAjVXl}R6J^P zcsU{-wZ(h&s4S+D)(?X=%7+9oHoP>y;c;8MV^gF+w(4as&4B4`XR7#yx37D>RdnyywPga+Rj zNj+u3SPI;_a6kgDctaO41yIv@Z78Q71`~&)JZ3NzO0781jpNGbns$nD6={wFT+m5+ zr6+=ETT?jgae#&b)i!t08}W3@tBNsN3nPE3bCA0<*1pkPRW!k|R@vReg&055NQ>pp zZY33?BXCW16jY|Qrpr+D+oE>ZF%hHNVT;>g-FeOYtT{?joc)u{1nx}k0!vez1Cm$4 z{K&>up{JioHZ*9OGaVw9ah1u8<8{qfV}e$!SDnl`20bkeJx{Mtc}lAvt~F%+Z25o8 zqz89oV1LGnN#8V%6~yF6M49X*s?v~iFb3fM$!@I-0W=^virS3yV$`Nh1w)~Nu6nn} z>;yf$OPVtmy?odi(uaec4DI5~1I>sOXFmkzlNQUMZbvyT!ftJiOd*4Io)0yTO4%wz zIU=JGkrcTgWvk?rF^F)=SfUvW)HtG{$atcm$ONLH$ix&{<6eST1!B0iBUYL6sMOOY zA*QEYNOY30lZlRF7ZDxDrVt&+E~YZeKvqR%Qly&7q{vh%lOi=lGX#-ZqM=9~(NJU> z(NJVM%T*xGg&T*UBYrvY!=H!v3iz^VzXH;iZ!rY6l;Wz3)&iR4nxjDATHIT zMTj<$(uvGj3}`N{wTKc;vmPay7N#Kt(ab~U^V+!1XNYqw(4&-Np&ljjMc{Lu&T_FH zC4wb-ln9oBc3>O7%NSyQm+Mg?ze0}^`IX2yQ0I4*9wmam=uskA2HHVw{H|t*`7PI@ zM1GAPCGr)>IY{TXQjZeBDm_XBt5df6^UT(1kJxHcS{ZJda4oAWPImg#Ikni)3)~m< zRM?UberllYW#Ls?K4P2-t6A7oFAq&`s+%Qu�T)q{6VQ32UhFw9vn3Qkg?eD=8Z1 zki$yGz)vhK8}E=l!;2<4#G&&?jc|yUM~*0Uh=<3FI^QAIj2%<#5X;7aUd$LbW;m^# z#)C1u8-$VK7Q;r{7w|kdN<@o9yzfuNic##;0foPb!U3!qC-L6a%Eb@U&fcKI6Ol7; ziL`Jr%ixRm_Pv0QKV$BmmfV3R`Ft?xjmBGNbIE4z-dGI~0Sa2t&~XiWSh$;W+wn}G zJMb~>a_i;eIX5&IB*KADZo}j05bMV*V<6TeMB@p&TLM2Jxoy%;qYS{>foNVQtjp@= zhIJfmZRTl@^y=#RX0@!QdTyP%tfpr695s*q`r7)L)77-vhQ`^dYFblujjCXOH2Xu? zFJwQT{dD$|*pFpD5)7(UDEofo%iq{P#{QS=f5848_II!&idV%2PN3Ppl~%hP5_WIK=6b5VLWtLR7ZJ zCy0q{@o`wq;-(oR#v-ogyr3;M8Zn9W0OWhKuiz`BBpG3x5ju=8!U*+Md;#cJl$Z9? zNzn{n!!E2TSPMj4C`RdX8KPKAK$`y&e;>d7eoy;t@|)uq?T-1r-4#8UE$$`;c#cnf*2Fk7PfDe6Kgz-^l(YUb$Xwmurf*rP-F*!foN& zJ=!#F8deoFsa%zazg^j}BE1EUZV%L3v(SCmD-I_&|M#YX|LZ3cw1NqoNbm5T;_R zbC)WG9dG&+_CLibj5Mb7fh@7R4(Zqd=E+0X0uL05{^5b_s4MZ~^4q18E~M<&mWDl3 z(9$DVvvUicy+b>AqPk7qg!M%pZeduNVsFzVaiAS+Qq`gi!bv=b1GI&g^evv-%Tgk;v`!f&n5JocD%bzLej2y?~n#-b@TH<{sOH2>Mw`=38|H^qn+?n zA8QHGnkvfS-pw{7Zf+KgH90 zH(h6gZgN{)1(%_?3~w%@6R1f)<)8^gDWomptJHT`8za;Y3VRF#lLi{ScBPYF|N%F#Wxd)kY*J2N8sVqEe?(^E^E->Yemtk1T zN>+2`virBo-OrO7mi0c~A?-SA?!0!nb4|G)5Vwd`V)CNoly6 zP~StZ(!#YWjFbXtI^16ytwjP(HQ*$zP{WlBW4Dga$CZv|R>>W4!wTTeY9FwDbZT`7 z>pS-VPBh@X*u(rT-~}nGB zdCyS2Ih?3^o2a&%s45I93fog*|9BfOovN48sd|}stuawO$GjpGg%eeTQOgPFYq4$} zKvxy8Liz>+`l~W*0#;uP3>NBhs$n^painmnjZ=HE-&3zW+B*b}X5#2|C~XE~BLKT~ z(G!}y8>`#bh$}FUnSm?MXi}5KqOvlp-};jYm8M zbKpWXOpQZ4S>-6Km{4O8Pg2?V9>EYb2Jt@Fr*obfjP-C{n9*X*4D5L{;t4844Nzrj z6yovN?b2VBs*#AtslKY8DpBV{ivF?)a_bT+NSMs?#80s2e;>^jAzx3`OGTm;9V!Yt zQe#xCy5vvI8UiuvdbqP!%P)TE7fLU?2Svk&$X_(^{mAOo>>KL~3P zf@KK4eb5;zB)VV?!Ft?P#KA&-#Tu1b*%eovZdjKPF22U@gB~(M_LRLa%GIGS^p*~+ zrihZ!GDgN?4{tnHSSQFttj_NvlVmdH2dOem(oW+f@smu)9;-~5C9|=@CkNkG$dhCV zuVNS%6jj=b;x4l7(oORIIE?lOxybRj=gky*u+IJ8aw2wlRAQgUh1h#A9Xk-FU`@qavI;wlr^*`a zov6d!iRsuqF;iY5XUTf3^q-BD{SC5F&Jj*rzrMvPlN@=eY{D*!X4xX=VO4pqT!2+N zpJN5eDY+P9%~E+8_KjVE6&!h(7yLyo!_MX9SksX&-o`VscjQW}I9Y{V3ac?rT`SjO z57v5l9mc@xX>OR<*!evFELmk(mE$HQ3F{|N2|Tjf^yDAu{x%g3>j0ut5|@$poQ``v6%NlNGuuAluazbjtIN*7K^Ye!Wa7@{CQ_Y zkP61?`c7D1-$jLrJFtRwDfW_gQ{i}BJr--O@U%j8S3NvETTGz7Exu6E;ur4Ud~YmP zszfod-TiT2jGULLbgZ7s5LaSF)a4j=vN0y*V!X=7h|(XUO#w!tff%IEao&nPB~L#kYC$2c_vW7sf^ZzIG-7=sR|k-U%S0yRdB#W=T9Jgdgz3Oy0~n{LB+ zf2*p*exeI8Yo@(X7pp2&jlEGd7#-?xU7wCC%uI|(w2x{w_ANE4IoL_n#QPXpFb|lI zeNYRri-Gns(5{Bdu|w%fbrtqtEmK#k00c7Sf|$G+8c`Na~Q7R z;ke58z+HS#?1b8YolqNj|HF;g4RJGeLEOqaAZ}B)V?V?l*bi|RW+{KeZmE0Keb~|U zfcm?75IeaZ#$GO`YQ^4&M=`5;9Q&u9RNJs?V!QeWo^kvWdncYzJJqweW<8BPB0pe- zR3}`&dttWncUgcZFE7xeH%*c~m`*-DEG~ z8nz2}Q;%Us*c155%l+a3u>(7*yzpdVw|YsvtX{#ct=DjEd>wnd_F!kno7j2v7S`H% z<2x7D@+1*xc1SKv}7$sOSL}t(Q>ssEnn-W_16Yy1=@MqKy8p#XfK-DR5!2A zyQN`fMp;pr9v0^sVY(4!8ez5`7P-R`12*W3@(s9%!t~5^BY%-QWIjmG^e&oRUDMRq z;9b->y|JNgmS0iR%!cXJH7(6`-bH14$RefZ`&)OAVmCp4^&nU^UmvJ@iWlXF~nPE^B8?`PmYEfcHTVm9@ zglh|_v;E526`xU7Y*e_|UEy5sGNWQFeTKm@Bip-7uc%&hafy8}OX5G+Q#rjxnVEir zEv00p+lEZ7Zql=67WofppC_X%GuuA2tr;PxAyuZkVk})oSqY~DU*tX1kaDOlm3?UQ z%=+3o|6%Ppr)Okw1)#w^`v`6o`-nCT0$Xew0aZ$S|bNF=~%x^ed6?{>Unkkl^&#?FW+e1@@#u0ljzCihW4`zRh8%4 zCoy}!NtVvpFEeB)V=f++Mz5jp`qWS&Fv|#y4p8I{OZD_3gTAPr z0dr@7#TogF+#&NpdX{&!p{;6TOs)2esnvBRTS@QdU*pk(Urk$$?6qwzk3rNBB%LdO zAt2X|x5>Cx*y~JG83t9cQOy!V>=Hw~5~G?WTs?@H<5$;Ko}mGwhQ;n0=6Tnd+dacz znUUjN*KQEyqSG^T`q`(mME=t~wIbH(8JSsr(=DZCX4qzU2Ge5y8SV36FwL>gY->LV zY)F?`?mLqk81KP#x!uE42~&Ww*n6fS_e^70o!Mrg>6ux1{+F~b3j=6gz%0C}uWP8U zZm6AEW3T5{ve&mM7$haOdQ?F#GK*D#wlIXsa*vQ%_6E-C-%w3okZfw4Go#MlU}BTa z295F6J>KSNb#3FUdqC=EZ)~eM##y5YOO3)xjixL$Sd{9*Wa@^3an@+REO*lzrcqMv z)#w=uN)3_A+}sSRQp14CG6EY<9}8fFjb@w3F>>c{Sr})F{TojkXARETx&dcqmfGsNw6zGxjKa&@VV+luN3&%{@#RMGWo}Iy%*x6G zTTa(3^)9n!^N`CJWm|ZZZE3UNjIz9b_W8P<&G%H^cYfO_J6|7V7kZGo-R2vOTb^TI zXdYz^-Deq!D(`1s#O(bRS$b{1tdNKqoFHAlz~mU6C`X^nAe}Fj$j^-lm_xvP$poxV19J3k1lY}&`!HY*LC=kj zkgsn@*RSz8dN)hYDdS6Vd2u#}fQ|ZQ8}-$vK}a|1nQhclzrZ7(QBU0zLC5t$x>2t( zZd$;46X)nt0Ki85bYq3yje6;W2VkQfnJho(jr!|T2Eaw$i|U#h)9R<$ao<2e^L&DQ znrC1fMZ|krV@nfG55xyWyz4Z|sB!^LF4 zD7MJRrVl)s#zg{Qj!)g}In4{fff;0E>YB?;*LzTUagKfV%m%t#&8@3xY^c?#^vhCa zMneVT%F<1(o0Ej_b@1w*Kh7?~yc0W@aY|*EG(a>dT`t#SEHaf1S1@4J*rxG~H&hj2p5nqlQ`OMZSD( zG3CwHZ_=W z*$i}Urw}vV)J{;136r50&dSfxC*tWj#YQ(OHU@a3Bj@NH8F+WM;*JbhH^UtLz6G!` za2o?bj`7GN$1t}X!~AmerzYt+C3%J+f{<;P+8}ViKNv@;Y2mNb7J#I<3PM z>9h`4ICvdyI==;^^{@EI5S+~f(|b8HOkd;13ej10O%0-u{r>D{&aQ5nC6Z>(nmr58 zG%1%Cp0m;#J)NWemWkdp(OWVd!duCU-!GWlH(EQamdpKk+tC?$=nLO|$R+XQI1GLW zp3=&+os=)_b@=r4Z#NYnyg9iHsk=axh9|fW#!QQuh9|IF#Dn6&v|HfcA~quB!Gy_p zrnwf+PU(LYcDl~PD!{c^=U5A9g_uJ5%zvb||4Xr3TY-{xYm3;Yl?l7GIqZ|JcWZ;$ zzmWY4*r!z(yYXb1{JHG^4gO2&5sqKS{xy(Wq#pk-+`#JkZ+m)8UvI}7<&;;?;2uNzx!u{m22bk? z=nc7)@pxaUASEmgR*si8iNBz1tc1kdA<*DW3B7U0_t|OfY)avub~2^E=*Wo_*utN5 zG9?;3&+X1F_t|B@*XYcvzR*rMrGdY(--TDob>)?EJ@|Y3v3L^@EmH9wAO}|7wz?tN zua8~$^m$nX$Ww{1z{JCeUqQe8ON7O>gK_3WI~c2B+QEe1W6E#E|1aSGCI6Q#@>BiI z{H^uhWudp?cUbV-EU>jatb$2=(5-F6@3FvJ0N-N5Zv?#71Y`YBJNPOKO!P}E^k#UT zg?^3&z65Zsow_-zYJ`Cm8X-)+G^XMvvv`~=Y__D^skPVfUJ`0jJyZv+0O zgbkFRawV*>z{@T073Y8#S@6vk*ovp}8_rVx3`>5id{ZrWEC0#BPoSFVzl6~ico^VP zHx_Y%2b$pggv^8#BX2x~37Kwe0^kHkdwhb0p5Y#z{0xU$U=#n-@IffU$6X@g1S=05 z{|gpNo-n~jE$~4LO!S|d=s)fN|Go)t{{0@3^`KQtEZeL#fV`qn{KIZbR^}+Y^+tt_F|KoR}y}tD5lkoA|J+KuY z|FDJL(*I8@->To|+RGDv-`Qc3$NW2|{8s(lY2m-w0$cUF3H4v^DUth|ssF{V0)CkZ z5Bbdci@yx`1s;5SlLfA~z(haIL|@ebev%1q|!&V>&&-gpapdV1u0-A9u1n-VDbbk2@UqRos3f zi-_B6f#0>jd(HvBY{3)%U1#CH!%B~H<-T%DgZN$xd>rtuv*34F=wG(L*7{lDZ5Da9 zTHpsQu(iJTw8tlI!AN?GNnXHlW_Y6oUTc9@SYQjiwZFw(1^OjaUfewP=UCuNEO6~P zVB$CBEc_}g`NvpbEB_I|mlHqz7guP3`&-~_3rzXb+_~MMXZ{hF2z+#0Pd6qm%mRm4 z;EwQqXUT7+x5Bn_@F)C#!{1U~>~EIxsQzc+AB*v#oqjC(h{f1q#>XCN51*!AYkpiS zWB0kWkN5``_-(+ioAA2y8*Nv!D}pd z6O0_Uxl8B#%Sk`6SG1)qvcS#fhGQE{`Da+@t^5e@XQH>_|0q1wQl3>_s^8hln|zM^ z6D;`A=YUb3`4?-IXBb+b)I$+_H(;YZDK&QBIpBN?KGOnQ^QTzw@t*5%tOGc}?&~ST zJOvSSn#nHc!&jFU@6b4&qxbC{2VakG5=z$Fyu4;VyxwLw(t+Iz*c?QQ6Ce-)5g=g z(Z9{(s|AieDMa*f4}<8#7WgX*O!WKDLQnX;CVWTv&G>ggzsE%XvIX8{fp=KoZ5EjL zZ8hRQzo(LChf_qxvFbf=Ffvxm@z}r0hqJ9%1 z>L(L?%mN>>z+YP6eHNJbeQ*|jZ(HbJx4>3@yMces#P4Yf{KPq6%J1~#*JGafQPcxy z{}f7%x;yGN_3D?VV&c7jQ4f0#zzf6GAwS z65esp@i}}e{4vtrXZ)LvR}r_uFCc9vc`ieI0UY`~Y8LOP?*N{Lv?|6ga!f+p3XenDNWwdYIEvvHz~wUh zrX#%rI0 z!@yhM-d_Q~A8v2&cYE*Y{qp}D-UZ$}xco)Ew;^tUC5(bEBr_41+8Vl`W5U?_JuzM+~H$SExwyYzVgOCY3Xutd_DPcx$6|u6U`?w z1Mx>)zrfFv`1TL>X;XTmcnR?=ruV^)af$uql=pmzRWdTo^(*}ToYGe=Mx4HF2A@+R zQ+>HAg7IAytuXqGem`7#RJ=*w%Q zH%h--#v<=g#x@;JO5Py}^56F1X|H|}(*msCak#d~lLz(83i`M6y z!pRWi(@LgO%;6N%1kySu8AxlMz+c0Z zYZOtgVahd(UBg&kj{9;vLn{VNh9X_k|c7D${sG5uAnnX4!T=jkyAk{o;HVF}dFda;&zQQOI0 ztbtyvfrnX3y*O_H>!E;4#B~epQm&W9*d*qV#2k{CLlSeq6$?C*n1;T0C~^KgN%A6N zU*nV)Ii(w|ACui!wr(t2HJ7qW^6X|%x0Qw=A6xx+1krQ!}QrKTQ--K%`#^*|61ly%eiWqLoL(SGG#4O z)-vU2j*q4|PLUxwCv*BHZ6`|E#QZmLiJQ2-n^*&znExi`wuxlMsWE6Td=-M~xPh@7 zSpE%M`UWn21JiHd5;rjAXH5ASr+mgKLpfzAe8#S3{;QeuYUaF}DOaTQ+~iH*vP$e>J`pvmLX$r{z2NcFbq0hkOd(>)0s2 z!?!Ko##g%DQ+wt2^fe2dl~e|G^#9WiGdiL09UrsPB)&pvqzTM?{;adfXz=NIPUi(W zazty#SGc?pKX;wZE*EA*G{2HQ)YkYK5nT;;lg)_T+_QFb`fj9~*H8Z>=t~@aq8rxF z#^NM9S~E*uM#Wda0^UVF=GtL}8TV6LE@o<;l5xtwv9hzy(auS~SnE9FWxM{62Q@WWa^MNki z^ll#3(3;1Jcf&X*{&jb}qmaut>ANEuciP!x;(DVjw_I(yAl`oX8^5#hFw^`VIyb#L z{4;sndCwMF`MT>!dCc*%@%S@1;%&7TF4NLpzek4C>OgI^-L?H(a#{1a>D_(C4ZFiL z$zn~n!tVU$@JwZ!Y5q{$WQUZGZPYYgnRU%L(h-dh?y=1@R&ahx-y*s*>cw0RjT5Fe zg4{%7jS z?X$~8Pq_GJwGFz4aT@hIlT79~Wi;#3jdS;9H;%5!E~m?>mt@#s2e#)f&rN3z-Mq|c z|4p20WsGkfmFw0i(;4+Qr%~A*T~FL~|8Hdby?NdGW?9^0=kLvY4!SmdOMI{MGkE~t zfBXjDeLN&y`qvF-TE1m?4ZbaS)-MZU-rWnO ze1?;J56A;J)B0=qHBKb{Mt&o@q1112iZjkp5H^&4T!f(fA8{A)Gwz7OAjc^YEPut< zCWE9)xhAcG zASB24aHpwh_|D)=HB)p)9p)qD8ay!yg#7m+e!s$#7<>ouN$j^(I6aso?#>d2vBV)P zaaWc&m?hR&;vnek2i)(F+%}dwl;sX&xdWg_1AJORQMpZY;56iTzn(T~>uVA^rQ+LAb-ksl9OJ9sF^20=M)xMmx6u9wq88KO?J< z2iP`n#sb?Pg=Bkt=M+Af?wmSJroD$q4&h-<+KjOK*aD4*D zcRsEIuFpCBC)YQgdm%~z#W9rgZx_Cdum6bBbqo$1;N#sAxc`WAx&>7#vSqGC;03?y;YI_IJ8YVJcRID*IuLLcLDkt?Mre!N1R-5 zvo*Zsddtn%wafLk9*2(iaV(sC*7sq^eTZW}q2??*FyBFwY@I|m^tY==>1juUl-jtFJjcSU=5bS z{3AW!*I7@4o<0B-$;j419NO&hN7T?W3t+3)bG7%|x0_+tWIb&;(8qqEJg$@amEM51 za@s+wgrMVIi13K(2-D~?69+>Bi0wmvA&rv6Ke`UO@OIVpAyYFA#oRwwi9RC09`v7~ z!N+k;-tKw?w(vA^Lw~NnL+VV|4sd+Q^%b5MB=P-v4-ueS3ra=5wuoZsYdx zxF6T87{a@M9(}n}&K7#w>hyfNoe%{(8ab%u)EiiDW*N^|2B!$mE1O+TwmZSeHhmRy2c;ps{oCH0hA9T1+G2k z`gv?cr_?RRY#Hu;b1qJ2!t?d|C)by_GU;_c$+f3z?N5})#iJv~P>a*KxLVz5(3jEY z^wx4iZv3AQdB*Y`w7k!KrE}Z<@8kK$sLedhnl`8Z7jg89-}iH^Bsy5$Yi@e0-MP~{ z4qZE~>8@pZig}E+(wq%;y?8dP2Y34X(S!5EJo86A?QCPMYo94!n?5{g1_$)QKmYsv z_DW*{TIQ%lk6oxnH19HvR-ta&Giv82ygBbF8XrMznH5o*=hv>*dpzmwV}Had%%h?? zZsFKAV=|{3SN;>8xmX+aciFVZj@|h%xA`99&P#CbK^KQGg1(ON%+K`+bodoU+-L9| zeEQ+Nnd>8pU=$@C8}hmKK&v$3AAxL9jHf5VU$`D~y-M_S*X3>taQgyd@l!;l|MaV7 z`%&1{s?Vg5m&ZDc`QLjeFdBpydEYU{!mgmioDIHdmg3G~w0V$`hua!fa{y!iVO$x$ z!&TvcafLYQdI>xZLwd|KU7O8w7CpDY;~uJy^{QZ|I9uHFeCupf=fL@&1OL0wp8G8# z*XQASM$CA5u6;V2_IWs8+YAY#q|uX%`LR9+;JL}^oKPZJ6TOZ79Y5Ds9wN^b-jnuw zW3VNIlWRBSLHpC)=b8KUn;`09<&K%^=diUC!ofX(?wa%`71S@@W{Y#2mdCi;6YVh2 zb5A!VWc$gjcYQ|T`WXE5d+m?h;~cEBP2+k_vP9SOo>XXG;dzS0S_Ldp#a#=XM_j_I z7pCA8i)x&5IUZ+RHsZXKOU3Pg?!$N5Hi%bnLdzpKHzpXT{?K_rhh-?<_#fpJ3Z1Y% z;X)aWb9Sl#PsNEe{c#4(8*(L9BkaY>gpcJu`2fyYiIxx1*`v~llbRCcR-EIMCLhJ= zCe?Bq&NP`OpTT)1v*f?jY&9F}uo_jP+>NJESIL*udbL4*$SWE?R-4o&`3X)Txdo?_ zZB~E9YKPm^9r6pDK60P@ik_>O&zG7|^X`JaWkzQ) z_rzb~ypb3@i;IO8q$m}`5Fd^e91>@ARAJ1j#wrepRU8Z9FA|%9#n~)~-;Tc~w&45^ z2_0?4obgforFaZ~4J$nU0n2z=ya^kA3x9`r8>e!F;zW-B-~^=)pv^#>{P;EK4@!KS z4<|I?q!OI*hx0bE_9F$)DpMuS@5G9aY^3MPeE4+oWH5BwAJ6{=;LN08Ss)7#KTn>A z_&_-j@j+Ns7L2taMTi&U{G?!o}=D}6NS8Sp3pAg zE1#Foix`|D^akSZ;H)4U&I$SulzVX|tv}8P`Uop5KE_$7!F(oQ7*5veEqcKw;_$q* zkLrVXvPwoAC*Fw8bmonS#HlwIBR*A4#WqZOz8b_&D|^FMX5bkoJ!Or<890}Kre4*H zZa4?00sb5{2R=Q04Z`a-4BNrKi5VapKKRJS%=)Jul*Ma?K0)^bO9Z0SBB=Bf`{c z>UES0tA%YSoEJm(>dp3QXM63=_8N>{OQ%zo;GfL)YJ;Ut1+E7F&gj82;a`HkFYLD- zaaxCDL!X`pe?I=cI9X{S;+yfe!>0cV?ziEe!`2+g*4&-#I1F~Y3wHcUn>8n~HHWh` zXR|d2!H(%p}cwe@7jV)edi}!`akHnd;qvSZ0 zJ{~89`C=8-M8wJN6^&c)r^=~F$LU~**U9CO>KgO}FZ6_!h*KZXxDRyUJ`f;plegg{ zGU^F^xhHf&PjG_fN%RMe`-30%hZOD)e%v2?(I4JLP2ZF6p{)0DlBz$Sq2-G+v_3?f z`bj75A->#0x?$9Gz`mmt&KtrBbkVS?coi?wXat4rCaEM~sn7JrX?ZEYrm9q=Q~&A8 z{U?$8Pghl?s$pj}sz#)8FACva)Q5XfB=@2W?nPa3n$#@x4UEC?F$Tk@UKGN;s4MrP zXzoQ(+>4^Q7e#R|isfDu!@Ve$dr=JcpJ47kq1=Chx&H)m&k4pTev?S%{u7KdrEWq0 z-;A>@I~#rJc6B>?8qSwOpQIj@#62pA-%5mVkBa0T)rb31CikT*^&-xKvT{%13FIgaQpKyzt8_5Txkl%#1Jcs>G|6BPTX6gyZ^*{Lg?)QDw_l2|nJu;C-e0So%-S;uC za_u-;>vQ~9`OWiv%iF*TsV2;c?aXn?czNiPyWLr$tOILe9dFXK^{H6;Su9o zzK$NoX_{%`2>17++~1FJPye2K^l|RdKXAW0!9D9oI<-yw%>C#T_nlw(YV<4j9hc~f zog_a91*gH;;Jo1MaNck}aK3PUaQ<)saDi|^aKUgPaGl^f!*ziRh3g6z2G8z){s^Q$0_l%H`XiA32&6v(>5oAABar?Gq(1`bk3jk(kp2jy zKLY8GK>8z){s^Q$0_l%H`XiA32&6wEdcj4)^@el6MZrbG#lV%qmBE$64Tc*6HxzCd z+#zy-UKj`qr4aI>Yn?a>A7b#nnRk=eM_^tN78CfY41z&+H3jP_4>y4 zdVPBh_~3FlLmMKodbE;l zUS8h&8%neDO?7wGSKs}8Rec-U?Pw>^?m&Ah+S}0Hj&>*7U1)cs-GlZHw0EMt3+>%# z??Jm4?YGe0i}pUW_oICP?Sp6^Li=sB52O7K+DFhniuSu`_o00p?GKkk?NVd=i!jGOR#Gg=X?gw}%Aiq?kKjz%Z-cA|Bmb))s5^`iBm z^`i}-4WbR9mC@Fr4Wo^qjiS+6#N%iaXp?9av?;V{v>CM5!}wPGK8H4swhe7N+77gx zXuHsMqwPW4i?$DKKiUDb1++!9bI=Z=or`uJ+7j9YXcwYggmy97VYDM?m!KU*yA2j&=jujcEUWqL7baJolp!r96PoPoRAg?NeyK zhxTc-&!GK2+E>s(P4I6#%(nb?7tM#}M+=|@(L!h{S{N;Y7DbDp z#nBRINwgGN8m$2>gVu9f_4<`Qnbs^E=Rip?Mk$((5^;%3)(ek*P>mAb`0%$wBu+upxuae6WYya zx1imMb{pF5XeZF_Kzl3N+tA*Qb|>0hXm_K%6YT+T-Y3vLiS{Y9-$VN}+Go&yAMLZ) zN%=Xn&!c?-?GMl%MEfGzm(Wh4J%sjUw6CE3A=<-ekDxt@_Eoe$Li-xpAEP~n_I0#B zLHh>o|EFl*MEe%npP@aD_UCASf%cbZkPeKb!*|iXhxR|v{u=FX(0&XX&MZ~lxBPQ1 zSw4hMUAlmdQgx~%h^8epa0rZXK(-`$>jQTW2eHx=ajZvS*s83_mr!nf&81-q4`ZPv;8lygq zQJ==BPh-@lTY4sD`qm7DSX7ChlreBOpn%obHZwVuzR=d*bJFZeGE|9Tdl zz$B`VX5fW>2j8%}2QdJ6G4PwQj|abnSOue`gnvRVxS1}6go|O+H?h0%He-_+H!E+Q`1-}T92f`HB zl=#=x%m2oo$7^ro=W&$`e+ZVcyovoGstI^5Op7In>`{GA?rn%Ky|PSypRZ-QmT$xN zztdw^^jVADFJDd(VL%?Q!RWjBKk*Chh&-kqALhSn&#v8{qG0r2{k>|LZ2n{2h|Rrg zaWUR+#a(n*{k;WL`|WZ4o5+NUzdDRQmnlZ5{iT25KPI&p?-VZ@ZyAQq2479ozKQqx z*4Ivnclq7|f9r(y4qtlL?xXN}C}JQZxb8V7Ch}sP+>5nn<0CKDt&NYoSSR;lE!tRVl#GwkJU&rV=i#Gd+#h9iVe`Y4K{fVvr}GaI}o}KfF7D=EQ$z@=eRf@v9ZQDzRT;7my$QBT^hO!*XRH z6^}(DVb!k4jP~DQ8?bx?5kE=UFDZ(2$U?8%*v_P6A{2Dm5bE+-ZPE7rd~q;1Fw~#x zi$;QBTR|!3lyZp$?Mkk+DVoVd*;}HGjnS{(SN)63$3DiczyE7&_`Xb3-bv6iUy5ef zdtN*9k7v$QZR|hKRR8WYy^W)9`8D~g@;BhWq^15!PZ}?JSMYFo4)ekrKa@)#VY=o~ z#3;eg+Qy_*G8PSouq7$M5;kYFJ%%w2l+~f3{{FsbOvR*Zg?y=$v)k01awrnFF54TT zu2|Z>Y>h`6JyX>`nDSiBe0N)us>35M1`>(Dna_9}YBGJ_eQCT^eim;d;bT&6!|F0% z(5^V?z4r$EQUi{6&zs=iG~itZd{O?YqW3S!FA^O0TkE=R<2v9(dC9n6PaXU(4R~)I z{0al^se{+X)n~wITzdc7xYoL^-?)y(^|bMvfjW3?T!VG+8Xna;_)g6Bb#Hx*TpVgGM$m{aXfx z{2W78jU!%z1j)b$T94hKmsKv=$Xxa=W^;m9!LxU|!M0Yse&+=E)@o6#N4?DA!Lb|` zM7Ld%)8=wsBH8U-^A4YEvvu3Hb+l(2!zzukTo2Y-()Fwk6|gCY*6Q zVOWIxz!4KTDuc-(dBS$!!OlVatF6>GG&oQ!+o48FO=K7cDvIu?sW(Kes9@k`GUB#RPN;0;`-CC)#G>-nR1?i z*?>lS^73oSKSMgVL%h9z>&ea?2Ofs}v$DAqK5h71;J``?NkfNXIf59r-RiI(aWYWo zAub&yt5sUExrB&JRXSe3tL=~k{Li}}+aOUFDk&WG(bd_}QfkUIq>}M)DCmcHMf}ID zi`Stt6G9)dH5Vc2U-u6z#URMnruGL5J!;BkVZRk@V9$gSiBR=pY?6O|lU>L^uTqoM z?;W;>AFU=x0(Zo0uw-+FA;^Y$g$dN{h0H9rM#wnxG_mM#j{j z*uZj}rV2shU-zoXr271o*NhdLCX4-VIrs6;Om0Zet$*~7XXmr$?0YP!%7@g{MLQ?9 z2HhRgT_X#og$ShWHj|{$%ttU9w zSZ<@iFJWB=<|Pb%i3UGNny)F}*bs|^0!}+E4hL(Vk1i2 z0>Sa23qOAF;KwiAa(S1_%~(`*Ia>CN9=Ks_?1lrQds-YWHHxURtLt*t{!d(W^#l8x zlGdOv5Vu5b<7XV8HxbE`%e5e=z` z3K|HpptX($X!(6|p`ITXV{lh#NIwJSFLAcz}c-ud^ zo`C!6;Dk8=_v-NFf~h}IKkfs})?Y`|FRt_G*YW3&T_@muIvkka!tFYOlU*n7x7Kz2 z`gQz%WY>xN4b;KOt`qRVIyl*50-5QidLJ&dc?u(PKFFP8IJNH5HGAp$YfIA-3%sVr-UBNVLzc?AiZAyg-U`+ z{e4{>`D|lD0{&3I>##}d*gBU`3S>~`pp|uBtxj7DvR}or{FkQT{(SXOQgf?uLps=9 zFk6=}EZauZvpFQ~u{X3PYL=z3o@D!obqLTpaD2TcPjG42S!pBAmg+d$stZAbrBf`W z`+Td;4Nj@x<~unze~u0C&+nyRYseR=DT9-%FRL&pghu`ZH1dG7zA}}EHYOVar(wu8 zGUlxoo3JHJ>KOLFP{$oG<+GW1R1LZu5-MCYV;%~5LKX^HxT5t6c~Fj`K#g-ng-H)4st2`A-Mq@!+?^=}55mTGzo(9Nl^6q5igv zCFBdhe#%VVcmS$7p*|cB2IJ}QQ<0n_(WvX^PjE@JUXv()&8eC6^C!3r7jQ4mZ>jYs zNh9DM9bWwp8TirR@=H3L--kF|^tac+iQ@!3NN{bX-w!XpQR=9)l9eXGN>doQ_7?Y@)7MkJ>IsG5x-~*h~7h6rSo0F=VN~y3d@8nB;l)hD8VJ`YS z^I=ZXuIeka<}xy0ugRw{mR_tQR^0{{$ZeOIi?lHO6v^d0VrAstAwHmK;lTlLTW4EK zbD^;z8IOc9O47!?tk(;U%INouFIx4{9I~-bypsD*lE80kzs%n-qKZ4O~AjZ$WhedCyyE&E;Q9sHrFJ z!+hV*wE~AL9s|Bu*Z)O=i?xy-1Ae?xvVw{OioWQKh?PMljH1t3TN#b%FhXK8j(ftn z_H5}Tt|@om-ZsTarQH}4YW`S;)2D#@G`Jn`7$2*Edo*|n@F~-MR1NL`Jj(4r(cfl< zTNrRb@S*}Z$#+zizYX$TVJF`P`HpcMM6~x?rt9t6^#^g5(ziG+`F-UVHFz8PKV}+- zLxYb2{xcql5aS4Ga4}EPOadMjaO}=`jpY^M69Eqr9JudV9+aL3?wh3jT!TCe3z3m8 zXoH8%eL;#x_z|r`gieM!!Say)h$1GAx+TO8>wZ|M_?eV#OeMT-sfjg_vCHFSL**J@ zK?otr5Z2uViZXnteXP_7(XOVfc6%z8OlTp6{CE4?3nO7~Ok3nnc!Mrix}_nS7GZ?= z@-k|RUt_%r$$BxffHpHP_RC(6nPsGQ__7!(28>972%|_#n2r#uv54Obftq0%ZM5)c zI4i-!;byrZ22hVyoJl*q5eVRLcQR9Mq7fHHx41$9D+x%8%M+cPWDjv+uy@nBgHfzF zjpO^A!VUrBc5uT9j(OseJ21Yy)LJPvW+HA2a61R&gZ>qZE(p@efDcTNXL%i$`fwO` z!|XP@okb(u6JvG=c&?7X-}|f~cPJ^#&Qr|kW=S>XtyZt8@k{kv?4Zq+2&vAWRln@> zhms+-`Px6$cnC5WBLha4XvC1gcZ(52nDt`BAt_fuP6^|LT_K&X=*;RRK?)bgf>qbu zTrNoQ2eRmaWHXmM8wowlNqHB2p7{<*AHlh=D39RoMd?C%s&q)M2x&r3{i&ZS+mVae2#h~83s|J)(Y{Ed-S7BZFm))*=)QbmlwqP$*tXo%sUk zHF@2cZ>zDGDvzG|OEoFhg~kXfx&qW=mtRB;hi+FuPQ$J!RWNjH@IRYp6EG?;ZkQBi zo~3a!oq0hmG+w5U*BeZ`*c~*|QpyuZJFBhktn!6a(eIJF&pf4#@D)~SbPi|HirW|x|c|+n5tnhIs7Z9BkhkVjXhKHUcwmG80!vf zJ|jCgHq-5!aAY8HU_ki+=QKV~wpmFSoMy($tH%5Zzoc&jUIKjnGLKNb49ngR+Th-W z9#pd;ZffY8U;vfLu|Q+65m7Z1_7Y`NRIS8q_-M>0Be+bFz@i>iW50dbefwm2-+h-Y;`XxQQqPlu)z1U*@)ufcxs; zWRnZHVUzRwkoPa(eMbL9++Xic-apyiq~XlZsa@A!2Pf}e+;5-`PTs$O57xoS`xkJv z4o(y*;I=yWqZ+)Va5$_n@(suuvj}U9ud={VtuOa0Ono)WP3w#Ka^HkMPt11}JUi;f zLD2&-z7WBoiNrJaVwXg(bi>w@VMO3lD1{`e3!jK8BLWX#r2#gUawh_HY>7B$VBQW^ zGUBtTN>2RFg*tVDELzcLp%N?Pnbh8z?=AF3!(Q;3lw&#FbJU2Acx^!AJ8}^b*)hP6xD=3sG zYcDXz;j3U;^gkQZ0?sjQ+@E+=zyozFbE~m3t~xkb&tk>Gb#Stt1)O`C#{DT)LvV`g zV1>!<$0x;VKs`oWN6hu?zBGrrzMMh^iPBI7xK6rUM0OgX&=CqyV1nCh@)A_}z`TQL z%RWdZIbuK1`4$C6?(20#ET^rNNqs%7>)O^8@|iR@Fk4s)#d#r$V9}HzbPb7wVE#&T z-KMORQI9qax2B!Cfa0ImU6vSVir12Z<0cwGD5p4}8nWw_FSfbzZLwMihegezjPft# zq?5%Qm`os3Ry5Z8l2Zs z8(skPfhKDv))5r|WgSH^!#d)OLwenAD>Fla z#{{xUEPB7&XDf|Na$!DnsMKQj5nxyYoCm-#8%fW$08{P%AO5tpRKGo%@wpt%a?ksT zfs(Ni7kypV^IrOzhz`3x$G#a10b7;J599CT70uPjJf}?Hi_8AsUcp(U6Nn=OCD(BT z_g@7ibGSyyCJ)vmGym40dc7~nS>9LX-ma-{O}^@Vby;l4S0NWIZv)kLqeAt!Do7ex zlul$MDJf3tTF^t4P6SJIk?3|Hw<|5#DHn;PRjSgj_mZ4WjR5LGp!P$^33t!CnZqG1 zQA!e5EmRtNdzds_?wRbJY%3LzvP;Hek)RLa5?OOkosN!?$-ic7pQ50HkbNr|#8Be< z-rlx)xD&Zcukd98b#n5G^AC7f@_(9E z{dWRym1RRX9{WQUm5mnsHWzz$iY`Txj z3IQh%MZmq-W5+FYcqo{u4u^+g?oW21=&u^^#k&448gP0pX?M{-Y`~A#^?#M%pn`tb zz2lHaqta+)9kPJTY9UuzhCzQDrB6wxAZJe2y{1?YPwOZZ8yk2;37buYPg7hOQ5xv7 zLWq!0jTn=_IJ)q9l8hDKZESq&@eX$oIdff_I90-2$!}k#2f;kh7GihAARb1bxKUA8PV82nb%*B4S`mR=ci$kXBl&qt)6i zs6|WZ@Di==j#6{Bfy@gi8|>NCY;(;I7BNULATi}Yxh!f#P7&-@wXe`?QaAvulsIw~+wEzWa3mP0@l5ZQ8NHcfg3qoep!cu8_n>SbT}fKX84N+{CFMwRe}RM2f=Y4McgPS zX)B?z6s-g=LrTU&0R-qlE@CCRWFtix$p3veu|_GFZT8>4%5H-_Z)U* zXO3)O@1n?0^_q#@t*yH!*uDJQu?9E$Cn+W1 zw10=B=gRx2b#RJSi2gPMzDV=e;qY}=zmKC1PEiGMpAf+X9+iG&FDgoxgve?@QJ?ir z%K9%^z^PieUS~)OAJFe2CyHL2Yc<@P1ypByv5Cs`_#*VNJ|UpiT!aFh-{w8b!PS_Op z;n)Ivmm(33%NaabK3;C56L*TjFT)Pf=|{*;vjsap-~jA$_7!p^`;G zaV?y$i)55`*{OJwvRW|p6%i<-6a*9$=C9ZaY)5P4*GfE+@jmyQHxr2~zmBw8yX5^2 zXE@n-<`H>IV>0Y?ocUZA@o5V6xBrAEwo>+^81eG#hl1)dFer*MHT6@-X&l$eTD2H4 zJ-Wz^MxOrA(;$6OI}L*LW=X*(%cxn$;|fxK!MNqKpR+cELJii>ebyQegp;!JxFf5E zbGA=>!j`i}WAdWgrY6FHGyf@KJMq`&+?p ztdC1O0VgRa;GQ}-Njm|z)xn8x1>8Y!V5I}=a4oP>ploO^?uY8FErpQ{ZES#Ac1s0T z&@(FoW%cY8(KlrP9s7a_=c%7M6KdT1qaV4Wp`_!~DQ7$q_5J;i{MJM;;9+T&^aNCR z-!Czwa6>+K^{ML9u0SZIGH>-o?4Y9+!)|ceG16SgN4*wPzRJjbqJ-H=J46JPz=5hC z6)h22XB9Q|f+L|O{6F}CKM_ta$FGubo0i#jFX|v;)$g;OSW5MIs}C*n91njo$NE13 zOR&&yzy~-&zzORD?x}+l)&<!^d1v=sLb)xk;133#v$ zP8=%W0fGag-7qJ2!um={R5NQBUyx&_n%QXB??GY`6{xh>{oDX%6kpNfFLtKcKu6V@nc`jU@F{jvqNSh6`04OJOgWrRQed_KRY1zu_6k^v`=M!>yw zaKfvA+jTf>9n3?A%P(qh@*=*Y+=lEe)g-`!LQO(RI>g^^2RVe(fapIN)fcbe^d$#= z>yz#iTHDpmZ1!e`Es}GoiuT2dFSV+CJ*6wzZOm@i+vRyDqez(5p?e~z%3rH1yw`56 zKbf991eR)TA@{YVueC3qCE>%3bR=J?#t)Ggj`x1dzE3JQaSh! z+P8MT<=BnW>)R&N4y!+!EbJZJe2^C#r52mJcO|aau(Q+EG}FED9LLPC-zi4}DYri| zve;YwDLEj?bkB~ihCNN~*&eKnz|;?c>7N60Hu>r8_%PsqV!)p@!< zjcaI3>-1+R9d+>9m^#gHxrV=A*192AuF@jK_4Jr;PqY$v-pt|Dq25 zumOLe4t|dTf1cprh~n}f`&V$pC{D@$c*Q-*97qq#%%Sg$Lfr-`c`Q_SBsm?j^N5|< z5XH42ErJxl5(vA@W4k=`%hMu5#uezw>^9>{>2)teOn7{ZNz;|F4dWYz279}k^64b) zhJc($WJik$leq-4hwgn{_CVETeZdoDP;^FN$D4*L?Wx6$t20c#quZ24`K-n`$e?sh zNBh$~t20oeH#nFy>hEpe z)v@dB?O!US9pBS6glLOq;$ivL+Ww`y!O9b9XbAyhy^p;9rm(iv>43sFHNh$W@C|o| zo%!VIw6Q|C*0}o122DK2X+j~IP!59|C$Rr+H%o0jnM5AOl}0h(D6@knp`q}_Exv#r z=;uL0?Kq$(P+{)EdytvUf!L56-il?33PQ^BsARF*r6s3NQ&)o4CfB|gtE*qjV@#{x zrn2QXy#vxg`Y`7GAV>WR(n1TB(&kM}+CIN&_vYQRGnGkXh`QQa5wJskNK=qFKrrwI z3NogtNrcvOhUdfs?!s#K$*Kr`iM*<&KVKYN7+R@6r}jh}7ACh|HXMsoKkL}FzjGq( za0TLicW!=a{gG^JzMZA$k{HapY(MB`*TRO|#-u?O5H72Dlh?3%h}Qy?|7C+M?8 zgB}%5KxbQ1(aQ!0CL05kUDU18 zyT$7HL(Hm_iZV9LVAHAs@-RaXKGkJLgGjt;0->xGHZV$6@Fbp=!Zm(}iP&9V{ebjr zrh&3C4Xv40ScF`iz(W-LH$>!uz1T-n}%J%wbL7$Tf3>=_upa^uD; zw`@H3+>O0E8X9)ET2SCgg+uQMCzIiqn_4EW-@EtviM&v9B)Ih!7u2y5U#CywY+6q(8WGClUgBJ|K#C3OU;3X~MS~-FVZMEjMi( z-JTFJ-oDcQrKSC)zNFh7h=vo}U6aRm@40@mF{p)hFWRx=BGqe4`l8-ImN;FEmsZn; zRfHXN0X_`)w+#3*2E0J?GvF`R!S(wTWrFj&8TW!cqdnu4aSh=LwuT0OlHi~uj0q?6 z)l-riF^pUml$6vd$pleWp(L*GbxKmsrX=lm=%3Xo3E4+bQY;dnq;HLqjAbFOgK9qo zVdmbJky;IXSVZoF!2a8I7(G{r&kds;XZ^@5&Uf^u4#UM5O9bDWFdrk1^&iq2U$ zfYT*77IN~haDvkY=|sibU5xuIvc(OXMYnxW;DN9@SVvc*6xsu8^zuRwBh;R%G@-VE zinEW33s&!jI*@f`CRHZN8`f=TYsqJk4z^1}Y{(Rp=LCs52aq1I6A}>kQY(+HRX$K| zc9pDm%hszV%9m`-uZu;?nLQSV)#dlESDV95cOvL;rMGvBYwEiBnPZy+p6pnnSGM?Fen*Qp;j)HZp}5W4oM^S8bi$EqyW*~G^LK39 z(X?ZFYI~uueQJ6K-z`cM^(nl$w}?|TNoM_w;bavJ$2Wk|x?o>^R+Cw7=4AbSvcuWI zBnOvSCWsvn&CV%dj|SF4Lo19Jt-e6mo8}UP_BDI1T6)majcq}L-J?CDt)(W^<0N8Q zHmHkr>7@s{aL|MQ@WVJcnuGslOJfzfypHx=UPsi~O?xxD*QC)qXkTV85o#~(#60ud zS=7pTe35uo!>~<$@j4)w!;ja&Up3&bSUQ1uu_7hxxumLX?775Qu=>h)Ax9fg^E6Qz z#knF>oQ)VJ_7_-D!JyGFL@8nfdJLOM#im@Ac0_UckAmA;6qC@yMd?{8SJ9L$>%Zw8 zeV6W@zqFi)R3CKg+iB9K&#;oxJ)O-?ce&nm+xi>lHeNHMCTDim)Fta5sAMt~A?@&n zFp`8}%mgw}^OT4Nz2s?X@Mr7bBxyzeXAF43)E^QRaCoMBHR+7sNTP~sP8rwW8RSt4 zxYB087ft;QkFs_z(>3kJHFPg{l-j*I>frDwHF&2PZkqQm>)<5i#aN$M1OB7|r?HZT z5&d;fQ{bT1{V6BWir%0oTf?X9$5OtXgu*&v;$P^;Hlo7sY~G33bCU&=WBL+jqZ*BW*;uFNXq|x9R`8KclMFMJiecWv z={M(_%k@eymt|6OQ?@17l8n>lIhcnK4<^;tpW`ypE)<)VZ`PF<&o@Wrj}9dwY`1OS zT$ix31FrmH_f2>AU$zs1L8<o6l4RFf)pEs@R`& zBdq2Q>5{D{TR;^V@?10(j#My{Q9UBdq{MmbKZS@WL>`Wnfb`Qn=2iN^0%lSxiq$e{ zN~!aFaR=+5De}50uCTE=MOPhqr3ppn%xdG4YH~CXiv>nIHxv>bA*U}A@Wg%1owo*~ z(crBVo@V#N0>S9Ww!IrWIyUZYTeqi?6zfel4s1%NHw|=e>+Ib2t8CaB z@cFSBD-iwE4BV>91=G_PRI=^41kXTE-F6R~=}P}~LuYaO*x2@>;0D4eX^&2>Ri3>L zA6yy{oV164KT`)M4I$vC%y5{)I{a5=IJd<`|0nCB(E}Q+EfRYL!!o9TuAn_=89={bdVpTW5>5!gw>qgKQp|ejjWXZ z(V-m~UQof^uj*@s;lYKW>eJMZg@&g_iq*dr^%WM3Ese49-L-uUIFgUeA^nGndPEM7 z>JcZ~5{w8q2u@i`vGsJdmULH)a}VUD7V9=@J{!Ph}SE|lQRrg$#PLtim=GB0YXwj(29zK&O4fJZlCzvx%6 z%f*j#O6IqoY=az%QH2H9J#Z=%rFWh-s_^rrBG@m6cpj4oc?Nu;qSEdaq>LMa4X7N& z8Ev$GQH8>3e~D-*_)DrySgaBvtKR9EYz-PjU-ogyZn(hw-8981-=867Xj=INpSY?H9yD z0)9%saeDDyU^ifbTiQdLARLKgM@H)eFM-Xa_=^UOFzXAcoXZdUj zCv5~u!II!L9Rc;cX5KGX+gx}%O`LPxLT#5Eao?z!`%Zse?2%JjkKC{OW_~Sn+6WM_%32z>UBjjzS==+rp{+ z)Ypg_g~pM%#_6iy;I?SU4PQ`KI%F@^Hc2<6_#PHhS%8iTJ%o?)NIHHJ>b+E=UDBGi z`K8V8OonXk_de`Oh9iML*e~=Ar+_2>Y;`pFZ9(@Pzw-LRarNihA>v7@pzaOh!g%NS zcwgFV9#Ge_!yzQbzZlZA=Qon3BJN4i zDzZFCGC!$2fO!*UKfrB7c8WY%}U=j(sBDhXtdn!ohwgXLpP3f$T zF>Qf_J!u+~E@8KW79YZx#8~ZYv-BTaWBh#iI3#9m4zKb#ATkM@ETeypPKv7Sx@HO~ z&l4iZtte%EI<)nZZ?@KI8M&RVc_8IgHd}{nAi0>!>y5ZJ5cfu0USHHb%Qc-f=8Af~ zt_`f2Sog0YuCUMRo~=HB#p1l9%)ufbmCmm?*R_Ulwg3*A5vF<6&UcORilg3n8;j#FVY!woIj@_B4$i=&b%Lw*-BY zlMNj)G6kXjYhMJ#E)o_%c?Up>w1=BA7`iR%0H^MJL^EXtYE*a=Vq+0FRK5 z_KF*;C#@^Uik%|IIN-5TbO2&ODD4CxfMUil+;xWwMBtPW7ANi8Mjh#_9CJsDg*#hX zc3tm`_;DgGNkaqOo#b1^M-!va7_p{=%NcLiv@>=x8~h2Wiz9M535d|;T9!1kdmL7G zG@ML@BZ*Afb}cQfnp%l2xy|FUJ1mZ9D4~Ya4dKRYd)Rj72f7isIueB(1FpVh;P4sU zvW8rbacU8`)$5tL#m%iW0e@2O&n<1DE&&&oHc?lA?t>Wf(MJkl1Tl5S!**W93SXc5 zt`>{F9UeuR!n;L1E_t;mS`(fMC~id`UbsofCNaWQFhay4$d zs#&;M;I$f#O`GT0yL3lu1zwM8yXP@mB|*FAITj!>;S35&Jzj@RUhQpQpKK_BwdVu{ z^Xx|tu(o3Ne3?5XZ@7CNHW5vdH2hhcu0ZP7O-^1nKYwkda_xL^uD^e-Se)2c-!6`y3#`=UA zt^_qW{1zOAZO7U6mvFxYyXG~&h2us^8U3C#`h7t7Hy;rGO%FH(Yic})=4i~%G_I%W z;1t;vX@ zj2ic*$w1-4aZu&j^mq(7G1DXA_#?oXfS-+H0Y4kZ0xoc@X!QPNj^ka@x5SQH*DO

iwIomrz+;jPRU0{VPUi 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 + + + + + yippee + + + +

+
yippee
+
yippee
+ + diff --git a/srcs/compose.yaml b/srcs/compose.yaml index 403a393..6fa4403 100644 --- a/srcs/compose.yaml +++ b/srcs/compose.yaml @@ -6,6 +6,8 @@ services: image: nginx:latest ports: - 8080:80 + volumes: + - ${DATA:?error}/nginx/www/:/usr/share/nginx/html:ro ### services ### # image: From dd84b21c5689c21d17852c9be7eaf63a8a652c59 Mon Sep 17 00:00:00 2001 From: mcolonna Date: Wed, 26 Mar 2025 23:43:47 +0100 Subject: [PATCH 05/34] change: nginx port change: 8080 -> 80 --- srcs/compose.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/srcs/compose.yaml b/srcs/compose.yaml index 6fa4403..2d7cddc 100644 --- a/srcs/compose.yaml +++ b/srcs/compose.yaml @@ -5,7 +5,7 @@ services: # TODO no latest?? image: nginx:latest ports: - - 8080:80 + - 80:80 volumes: - ${DATA:?error}/nginx/www/:/usr/share/nginx/html:ro From 5d72cc8d48f9b0abb3f498ea36334dcf084b25b7 Mon Sep 17 00:00:00 2001 From: mcolonna Date: Wed, 26 Mar 2025 23:44:12 +0100 Subject: [PATCH 06/34] change: improve example website --- data/nginx/www/index.html | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/data/nginx/www/index.html b/data/nginx/www/index.html index b2e6085..dc17481 100644 --- a/data/nginx/www/index.html +++ b/data/nginx/www/index.html @@ -42,21 +42,20 @@ 50% { transform: scale(1.4); } 100% { transform: scale(1); } } -/* - @keyframes rainbow { - 0% { color: #f00; } - 33% { color: #0f0; } - 67% { color: #00f; } - 100% { color: #f00; } - }*/ @keyframes rainbow { 0% { color: #f00; } + 17% { color: #f00; } 17% { color: #ff0; } + 33% { color: #ff0; } 33% { color: #0f0; } + 50% { color: #0f0; } 50% { color: #0ff; } + 67% { color: #0ff; } 67% { color: #00f; } + 83% { color: #00f; } 83% { color: #f0f; } + 100% { color: #f0f; } 100% { color: #f00; } } From e406e26b4d967635ed6c8f7bf194b5be495d0bbd Mon Sep 17 00:00:00 2001 From: mcolonna Date: Thu, 27 Mar 2025 14:59:22 +0100 Subject: [PATCH 07/34] dev: reorganize --- Makefile | 60 ++++-------------- srcs/{compose.yaml => docker-compose.yml} | 6 +- srcs/{ => requirements/nginx}/.dockerignore | 1 + srcs/requirements/nginx/Dockerfile | 7 ++ .../requirements}/nginx/www/VarelaRound.ttf | Bin .../requirements}/nginx/www/index.html | 0 6 files changed, 21 insertions(+), 53 deletions(-) rename srcs/{compose.yaml => docker-compose.yml} (88%) rename srcs/{ => requirements/nginx}/.dockerignore (55%) create mode 100644 srcs/requirements/nginx/Dockerfile rename {data => srcs/requirements}/nginx/www/VarelaRound.ttf (100%) rename {data => srcs/requirements}/nginx/www/index.html (100%) diff --git a/Makefile b/Makefile index b55a3bf..4f560ac 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,11 @@ +# TODO data is supposed to be in $HOME/data/ + DOCKER=docker -SRC_DATA=data/ SRC_COMPOSE=srcs/ -OUT_DATA=$(HOME)/inception_data # TODO to change .ONESHELL : .SHELLFLAGS = -eu -c -.PHONY : all run re data_install data_remove data_reinstall help +.PHONY : run help ### pretty logs #### @@ -18,13 +18,6 @@ _ECHO = echoo(){ \ } -### rules ### - - -## Run the compose, installing the necessary data if necessary. -all : data_install run - - ## Run the compose. run : @$(_ECHO) @@ -32,50 +25,19 @@ run : echoo "Running '$(SRC_COMPOSE)'..." echo "$ cd -- $(SRC_COMPOSE)" cd -- $(SRC_COMPOSE) - echo "$ DATA=$(OUT_DATA) docker compose up --build" - DATA=$(OUT_DATA) docker compose up --build + echo "$ $(DOCKER) compose up --build" + $(DOCKER) compose up --build -## Reinstall the data then run it again. -re : data_reinstall run - - -## Install the necessary data if the directory doesn't exist yet. -data_install : - @$(_ECHO) - - echoo "Copy '$(SRC_DATA)' to '$(OUT_DATA)'..." - if [ -d $(OUT_DATA) ]; then - echo "'$(OUT_DATA)' already exists." - else - echo "$ cp -r -- $(SRC_DATA) $(OUT_DATA)" - cp -r -- $(SRC_DATA) $(OUT_DATA) - echo "$ chmod -R 0777 -- $(OUT_DATA)" - chmod -R 0777 -- $(OUT_DATA) - fi - - -## Remove the necessary data.. -data_remove : - @$(_ECHO) - - echoo "Remove '$(OUT_DATA)'..." - echo "$ rm -rf -- $(OUT_DATA)" - rm -rf -- $(OUT_DATA) - - -## Remove then reinstall the necessary data. -data_reinstall : data_remove data_install +## Run the compose with debug flags. +debug : + $(MAKE) DEBUG=yes run ## Show help help : @$(_ECHO) - echo "all Run the compose, installing the necessary data if necessary." - echo "run Run the compose." - echo "re Reinstall the data then run it again." - echo "data_install Install the necessary data." - echo "data_remove Remove the compose data." - echo "data_reinstall Remove then reinstall the necessary data." - echo "help this lol" + echo "run Run the compose." + echo "debug Run the compose with debug flags." + echo "That's all lol" diff --git a/srcs/compose.yaml b/srcs/docker-compose.yml similarity index 88% rename from srcs/compose.yaml rename to srcs/docker-compose.yml index 2d7cddc..61524c5 100644 --- a/srcs/compose.yaml +++ b/srcs/docker-compose.yml @@ -3,11 +3,9 @@ name: my-awesome-compose services: nginx: # TODO no latest?? - image: nginx:latest + build: ./requirements/nginx/ ports: - - 80:80 - volumes: - - ${DATA:?error}/nginx/www/:/usr/share/nginx/html:ro + - 8080:80 ### services ### # image: diff --git a/srcs/.dockerignore b/srcs/requirements/nginx/.dockerignore similarity index 55% rename from srcs/.dockerignore rename to srcs/requirements/nginx/.dockerignore index f04fdfd..6169efb 100644 --- a/srcs/.dockerignore +++ b/srcs/requirements/nginx/.dockerignore @@ -1 +1,2 @@ +/Dockerfile /.dockerignore diff --git a/srcs/requirements/nginx/Dockerfile b/srcs/requirements/nginx/Dockerfile new file mode 100644 index 0000000..8e49f9d --- /dev/null +++ b/srcs/requirements/nginx/Dockerfile @@ -0,0 +1,7 @@ +# TODO no latest +FROM nginx:latest + +EXPOSE 80 + +RUN rm -r /usr/share/nginx/html +COPY www /usr/share/nginx/html diff --git a/data/nginx/www/VarelaRound.ttf b/srcs/requirements/nginx/www/VarelaRound.ttf similarity index 100% rename from data/nginx/www/VarelaRound.ttf rename to srcs/requirements/nginx/www/VarelaRound.ttf diff --git a/data/nginx/www/index.html b/srcs/requirements/nginx/www/index.html similarity index 100% rename from data/nginx/www/index.html rename to srcs/requirements/nginx/www/index.html From c8c5e952ab3ba29e7e9a7bc140cbf9c046b95a20 Mon Sep 17 00:00:00 2001 From: mcolonna Date: Tue, 1 Apr 2025 15:01:28 +0200 Subject: [PATCH 08/34] dev: use image alpine & install nginx in it * also add nginx.conf --- srcs/requirements/nginx/Dockerfile | 28 ++++++++++- srcs/requirements/nginx/nginx.conf | 76 ++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 srcs/requirements/nginx/nginx.conf diff --git a/srcs/requirements/nginx/Dockerfile b/srcs/requirements/nginx/Dockerfile index 8e49f9d..7b84958 100644 --- a/srcs/requirements/nginx/Dockerfile +++ b/srcs/requirements/nginx/Dockerfile @@ -1,7 +1,33 @@ # TODO no latest -FROM nginx:latest +FROM alpine:latest EXPOSE 80 +# install curl +RUN apk update +RUN apk add curl +RUN apk fix + +# install nginx +# TODO installed automatically? +#RUN apk add openssl curl ca-certificates +RUN printf "%s%s%s%s\n" \ + "@nginx " \ + "http://nginx.org/packages/alpine/v" \ + `egrep -o '^[0-9]+\.[0-9]+' /etc/alpine-release` \ + "/main" \ + | tee -a /etc/apk/repositories +RUN curl -o /tmp/nginx_signing.rsa.pub https://nginx.org/keys/nginx_signing.rsa.pub +RUN mv /tmp/nginx_signing.rsa.pub /etc/apk/keys/ +RUN apk update +RUN apk add nginx@nginx +RUN apk fix + +# add config +RUN rm /etc/nginx/nginx.conf +COPY nginx.conf /etc/nginx/nginx.conf RUN rm -r /usr/share/nginx/html COPY www /usr/share/nginx/html + +# start +CMD ["nginx", "-g", "daemon off;"] diff --git a/srcs/requirements/nginx/nginx.conf b/srcs/requirements/nginx/nginx.conf new file mode 100644 index 0000000..79aa74a --- /dev/null +++ b/srcs/requirements/nginx/nginx.conf @@ -0,0 +1,76 @@ +# TODO clean comments? + +user nginx; +worker_processes auto; + +error_log /var/log/nginx/error.log notice; +pid /var/run/nginx.pid; + + +events { + worker_connections 1024; +} + + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + + access_log /var/log/nginx/access.log main; + + sendfile on; + #tcp_nopush on; + + keepalive_timeout 65; + + #gzip on; + + server { + listen 80; + server_name mcolonna.42.fr; # TODO from env var? + + #access_log /var/log/nginx/host.access.log main; + + location / { + root /usr/share/nginx/html; + index index.html index.htm; + } + + #error_page 404 /404.html; + + # redirect server error pages to the static page /50x.html + # + #error_page 500 502 503 504 /50x.html; + #location = /50x.html { + # root /usr/share/nginx/html; + #} + + # proxy the PHP scripts to Apache listening on 127.0.0.1:80 + # + #location ~ \.php$ { + # proxy_pass http://127.0.0.1; + #} + + # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 + # + #location ~ \.php$ { + # root html; + # fastcgi_pass 127.0.0.1:9000; + # fastcgi_index index.php; + # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; + # include fastcgi_params; + #} + + # deny access to .htaccess files, if Apache's document root + # concurs with nginx's one + # + #location ~ /\.ht { + # deny all; + #} + } +} + From de7f8e0492464329c3d3a11c5c129b48c5efd052 Mon Sep 17 00:00:00 2001 From: mcolonna Date: Wed, 2 Apr 2025 18:33:35 +0200 Subject: [PATCH 09/34] change: nginx now uses self-signed https --- secrets.txt | 1 + srcs/docker-compose.yml | 3 +- srcs/requirements/nginx/.dockerignore | 2 - srcs/requirements/nginx/Dockerfile | 6 +-- .../nginx/conf/mcolonna.42.fr.crt | 33 ++++++++++++ .../nginx/conf/mcolonna.42.fr.key | 52 +++++++++++++++++++ srcs/requirements/nginx/{ => conf}/nginx.conf | 8 ++- srcs/requirements/nginx/more/ca.pem | 37 +++++++++++++ 8 files changed, 134 insertions(+), 8 deletions(-) create mode 100644 secrets.txt delete mode 100644 srcs/requirements/nginx/.dockerignore create mode 100644 srcs/requirements/nginx/conf/mcolonna.42.fr.crt create mode 100644 srcs/requirements/nginx/conf/mcolonna.42.fr.key rename srcs/requirements/nginx/{ => conf}/nginx.conf (85%) create mode 100644 srcs/requirements/nginx/more/ca.pem diff --git a/secrets.txt b/secrets.txt new file mode 100644 index 0000000..b241c20 --- /dev/null +++ b/secrets.txt @@ -0,0 +1 @@ +DisIsAPasswordForTheSA:D diff --git a/srcs/docker-compose.yml b/srcs/docker-compose.yml index 61524c5..5732329 100644 --- a/srcs/docker-compose.yml +++ b/srcs/docker-compose.yml @@ -5,7 +5,8 @@ services: # TODO no latest?? build: ./requirements/nginx/ ports: - - 8080:80 + - 4433:443 + # domainname: mcolonna.42.fr # TODO useful? # TODO no copy ### services ### # image: diff --git a/srcs/requirements/nginx/.dockerignore b/srcs/requirements/nginx/.dockerignore deleted file mode 100644 index 6169efb..0000000 --- a/srcs/requirements/nginx/.dockerignore +++ /dev/null @@ -1,2 +0,0 @@ -/Dockerfile -/.dockerignore diff --git a/srcs/requirements/nginx/Dockerfile b/srcs/requirements/nginx/Dockerfile index 7b84958..638280f 100644 --- a/srcs/requirements/nginx/Dockerfile +++ b/srcs/requirements/nginx/Dockerfile @@ -1,7 +1,7 @@ # TODO no latest FROM alpine:latest -EXPOSE 80 +EXPOSE 443 # install curl RUN apk update @@ -25,9 +25,9 @@ RUN apk fix # add config RUN rm /etc/nginx/nginx.conf -COPY nginx.conf /etc/nginx/nginx.conf +COPY conf/ /etc/nginx/ RUN rm -r /usr/share/nginx/html -COPY www /usr/share/nginx/html +COPY www/ /usr/share/nginx/html # start CMD ["nginx", "-g", "daemon off;"] diff --git a/srcs/requirements/nginx/conf/mcolonna.42.fr.crt b/srcs/requirements/nginx/conf/mcolonna.42.fr.crt new file mode 100644 index 0000000..fafa526 --- /dev/null +++ b/srcs/requirements/nginx/conf/mcolonna.42.fr.crt @@ -0,0 +1,33 @@ +-----BEGIN CERTIFICATE----- +MIIFyjCCA7KgAwIBAgIUSCJJNkcYCGrdVPyeIij0K+4xYxcwDQYJKoZIhvcNAQEL +BQAwgb0xCzAJBgNVBAYTAjozMQ4wDAYDVQQIDAVlYXJ0aDEVMBMGA1UEBwwMc29s +YXIgc3lzdGVtMRMwEQYDVQQKDApteWxhbiBjb3JwMS0wKwYDVQQLDCR0aGUgbWFp +biBhbmQgb25seSB1bml0IG9mIG15bGFuIGNvcnAxFTATBgNVBAMMDG15bGFuIChj +b3JwKTEsMCoGCSqGSIb3DQEJARYdbXlsYW5AbWNvbG9ubmEuNDIuZnIgcHJvYmFi +bHkwIBcNMjUwNDAyMTUzMzUxWhgPMjEyNTAzMDkxNTMzNTFaMBkxFzAVBgNVBAMM +DnN1cGVyYXdlc29tZWNuMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA +yufae4sNj7+B5buW5gkgW8UtAUJvtAeArY7XqpXIXiosUGzdUJXhgDJO9VHJjFy2 +3ATEJBMf2uJtXtPOjisxPUZbFlA5xUugWOgoIO2xdLC7Z4Zciu7A928ckhkIFRCw +EsaIsYCNmNZV3rQ6DNJE8YCC5C/TDhyin01wEEUNJAIH2POJEyiSuJegmK35Uk4m +Qe4qBhc3jM7mdPiUPsNzgxH35L924jhzjh0ZonYN3cdi6mHoUnDUb7DrqHWP5yOC +0m39kKHLnH3jWFeRvwYiNWVu5D8PKcETQrhkvmwM2ECv1JhYGpsUgDu6SJSylgvl +IK1KUE/8Q2oX5vHLAaoe3HN4VUQqsnW7S2Ncp8x6vdCaNYVROre9zGxur0ibzGQm +jzRhC/Yo6eyP7B7IEjoATNQZ8TuXXPgkfRkN819YWXY/YfqzCaP0HGy/dWjc+So8 +C+nFsITjJYASkd2zCg9BkNWiFxaMlYLc2F8WwPLwGV8ZqAYtdem9IX+LeW3feEbC +e/sWlsWbMJA23X6+5hZcxJRzi/J5qzk2Iwpg/jmaTak9vO3pkVbm94alteuewQY8 +OZVypK6WvY/vdeVQYgeqL2+ra+ORwg3Wumtuz1LFQqwvUEbLtuYicV+kLAL1pZTY +ghBICgBtBqkV45c5cbEUbbjrsVcgg51J1n7TC4cZTd8CAwEAAaNjMGEwHwYDVR0R +BBgwFoIObWNvbG9ubmEuNDIuZnKHBH8AAAEwHQYDVR0OBBYEFNPoa7p0ltnw8UKu ++CjgOkcSYyaYMB8GA1UdIwQYMBaAFPpKGyjeoaBrRvUK7DGX91sfsC8aMA0GCSqG +SIb3DQEBCwUAA4ICAQCNyyBfb7poleEHzW9UVvGfZcQlLLdiGmTUX0rFWiva8Tju +r7rolKw/Ai08Wt9bT3qld1ss/gWCo7mRjpXLCPgCV9/De5oWhwH+n0dztOavDIi6 +50Nkg9dIrthiHDBrAU9Z2DuecB6R0h22PKTz/rbxAIdzBfKSnw9AKdfPQGR7LKgy +ez3NATa7Ul677FWyRNgeTVajEHIkrPk2kaaNV/2vcQRo35u0p1jOmM2Xys2Qgrfx +YhY3ysP7ZncjVeg7DYlsJOa13vHrkHr42eNpglcHLqoGnZ2wriT2V8Ca6WZlTKxn +LgHc0sRF6GtOLtRJNrhXgmMBtLBzAbK77qb9m2OhHcphAWQKpnaqONXmrHTbZGxR +ct7ZoGZj3XWYQmAyEmS788cHW9sMx9Zv1888r7V+E6mh4UbGlOo64x30Od43RLLH +PmEoO9qIGx6epNbLz2UqP24oJM+82XVbEpvkg3mm6tYZXKVAW0eWpMJe7xtAlO0L +QhAPcxoA8HCd/TeMzqeomqgUY97IDH8buTK1fuw60jEl4VOvZNP3DA7eqjEkrLYC +xNmXP4OBgJU1wYv7VGVagwRJf3g9SpE231kdEOIswBGX8qQ6KBGmqbu8LPgKwMQr +P9WQBbSWY4m8Hy/ENQnsIPZ4JlRIXcL5x5KXAf5LPJA4KT1NBD5jF9mYTKRf2A== +-----END CERTIFICATE----- diff --git a/srcs/requirements/nginx/conf/mcolonna.42.fr.key b/srcs/requirements/nginx/conf/mcolonna.42.fr.key new file mode 100644 index 0000000..6475da9 --- /dev/null +++ b/srcs/requirements/nginx/conf/mcolonna.42.fr.key @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +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 +99QtKthw4Cvq44EJOzKZsdkAy2GGHjM= +-----END PRIVATE KEY----- diff --git a/srcs/requirements/nginx/nginx.conf b/srcs/requirements/nginx/conf/nginx.conf similarity index 85% rename from srcs/requirements/nginx/nginx.conf rename to srcs/requirements/nginx/conf/nginx.conf index 79aa74a..2faf0dc 100644 --- a/srcs/requirements/nginx/nginx.conf +++ b/srcs/requirements/nginx/conf/nginx.conf @@ -30,8 +30,12 @@ http { #gzip on; server { - listen 80; - server_name mcolonna.42.fr; # TODO from env var? + listen 443 ssl; + server_name mcolonna.42.fr; # TODO from env var? + ssl_certificate mcolonna.42.fr.crt; + ssl_certificate_key mcolonna.42.fr.key; # TODO secret? # TODO in .cert? + ssl_protocols TLSv1.3; + # TODO ssl_ciphers #access_log /var/log/nginx/host.access.log main; diff --git a/srcs/requirements/nginx/more/ca.pem b/srcs/requirements/nginx/more/ca.pem new file mode 100644 index 0000000..5b7e24e --- /dev/null +++ b/srcs/requirements/nginx/more/ca.pem @@ -0,0 +1,37 @@ +-----BEGIN CERTIFICATE----- +MIIGXzCCBEegAwIBAgIUSCUe1jmf7CeAOl7Er2tsvB90u3EwDQYJKoZIhvcNAQEL +BQAwgb0xCzAJBgNVBAYTAjozMQ4wDAYDVQQIDAVlYXJ0aDEVMBMGA1UEBwwMc29s +YXIgc3lzdGVtMRMwEQYDVQQKDApteWxhbiBjb3JwMS0wKwYDVQQLDCR0aGUgbWFp +biBhbmQgb25seSB1bml0IG9mIG15bGFuIGNvcnAxFTATBgNVBAMMDG15bGFuIChj +b3JwKTEsMCoGCSqGSIb3DQEJARYdbXlsYW5AbWNvbG9ubmEuNDIuZnIgcHJvYmFi +bHkwIBcNMjUwNDAyMTUxMTQwWhgPMjEyNTAzMDkxNTExNDBaMIG9MQswCQYDVQQG +EwI6MzEOMAwGA1UECAwFZWFydGgxFTATBgNVBAcMDHNvbGFyIHN5c3RlbTETMBEG +A1UECgwKbXlsYW4gY29ycDEtMCsGA1UECwwkdGhlIG1haW4gYW5kIG9ubHkgdW5p +dCBvZiBteWxhbiBjb3JwMRUwEwYDVQQDDAxteWxhbiAoY29ycCkxLDAqBgkqhkiG +9w0BCQEWHW15bGFuQG1jb2xvbm5hLjQyLmZyIHByb2JhYmx5MIICIjANBgkqhkiG +9w0BAQEFAAOCAg8AMIICCgKCAgEAtTDajPzwjjzdLnPXSAhjJKNcWJbHwMYztUQJ +1FHPA6wrLMXpjxptbSlwtJCFExpnKZDJmYPK5hA07r6jYVqL1XVXREjEUbJzJ2H7 +JdAu+0/RT85WfImENqDGlVkogH4Mcp/rq/0vcrmHsUfi/dKVlb2ESVuO2cDoDfaQ +6GNDTLLlCMPBkdUkeLgABTQJNFiOTeI1hkcNoZWI0FV5LB+QlTYnJoRkUQEdV73F +rKqENRKqBMr5d5EzpDUxpiYF8Y0S3GURwBXYnFz4nzInCw8ukn+deVlh7iZzHevj +lqQqDfN47dYyG5XaPZpFoSBl6lyDiKpg+1zH54WlBxjVnBqdadsQOwbzvdMLDebp +fP2rhAuurizIQpjsuD2QCdAka8XQwuv7GH19N3ZOjcoV47jMCZBTF2PhB1S+a4Ud +oAOkOSyCJ8B8crzPGa3+7a06NMhGnEFSX4mxgw2RJM42atF/Zd3ERlds8hUcQsar +QbX4HJ8+7da47mrVcKbVWux6fM4GamRUyBP80XM0BhN2Esdz8LXSH9+Lueh3cmle +BSNMZI1T2BQBWi+Z/hrxT3Qsufc1o/yL6WR6hecH+jM6/p5Q0TzCeB2cZr3gO1eB +r4dZ/NwYy05cwZSRAFD8zxduRBGgCbRTamFTkuTJbAymthnNvJ3Xm0VdwB8W4q5p +XtoFaNUCAwEAAaNTMFEwHQYDVR0OBBYEFPpKGyjeoaBrRvUK7DGX91sfsC8aMB8G +A1UdIwQYMBaAFPpKGyjeoaBrRvUK7DGX91sfsC8aMA8GA1UdEwEB/wQFMAMBAf8w +DQYJKoZIhvcNAQELBQADggIBAAo/jDALZz0VbafsC/PTNE9jP3IofCcBmSDmjBub +RR9gArgKhlBORXQCE3phFpKGBrYy28LShykHBf6ZXsKFmdgjGkAqL0ouVsBSzgZU +tGjQrnY4sh1jCYi3Qe7L/bkgXi8Oyhi0u54dslsnN9Nr5BujJXauDRiiO5o8ZjUz +JJCJZk9OmbzyEXwm9JhgRUAzG7D8FKTsy7s8AWkj+ibb/0WasSwaDJkgQo6ndUv7 +mMYxS/2Gc1HF8R5wkmGXiaU1SIIPIgNUj4E5weCcGqwBkiQ9I8TwW8d4MbSSeIoK +o6PS85cZsDYrEbm0qShpbhBdKUSdzoxDgAv0ZbQ7j7CbkuuB6Ad007NhGxogkTIy +uC5eoUdrEJ2zelC7PX4d51EvIPjXhD+YAtrgmub1dkmApEUP/yDojY9GdQpEm58P +x+NF548BK7U2PxIKPqWqEwymTkd0X4haBV7JZXgwcGulSdVpcSBVYLVQHOF3AzvP +/c7q66YodFvsUBWvjCAgVc2vRYmhchogGm1wuk4g1EO8MPnui4ySMy7d81pqS0rm +3183PN+nGtl+yTsjtcp/qrWc/CyP2V7EpcUQrLHiqzpTYJeYZPmSsfVZdfZlfef0 +hVhO47vIOLGDXsCM1ymZYm/Y+dk5Rjfin7prMf0ZK9YqH7magqWH9yE+JbV6nZG8 +N7cI +-----END CERTIFICATE----- From 0e38c9cdd3c7b60d1f52a76045ad7cbf64e6a5da Mon Sep 17 00:00:00 2001 From: mcolonna Date: Wed, 2 Apr 2025 18:38:09 +0200 Subject: [PATCH 10/34] dev: rewrite TODOs --- Makefile | 2 +- srcs/docker-compose.yml | 4 ++-- srcs/requirements/nginx/Dockerfile | 4 ++-- srcs/requirements/nginx/conf/nginx.conf | 8 ++++---- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index 4f560ac..2287ed3 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -# TODO data is supposed to be in $HOME/data/ +# TODO(vm) data is supposed to be in $HOME/data/ DOCKER=docker SRC_COMPOSE=srcs/ diff --git a/srcs/docker-compose.yml b/srcs/docker-compose.yml index 5732329..7d1b4a9 100644 --- a/srcs/docker-compose.yml +++ b/srcs/docker-compose.yml @@ -2,11 +2,11 @@ name: my-awesome-compose services: nginx: - # TODO no latest?? + # TODO(any)(latest) no latest?? build: ./requirements/nginx/ ports: - 4433:443 - # domainname: mcolonna.42.fr # TODO useful? # TODO no copy + # domainname: mcolonna.42.fr # TODO(vm) useful? # TODO(any)(nocopy) ### services ### # image: diff --git a/srcs/requirements/nginx/Dockerfile b/srcs/requirements/nginx/Dockerfile index 638280f..ac5fb93 100644 --- a/srcs/requirements/nginx/Dockerfile +++ b/srcs/requirements/nginx/Dockerfile @@ -1,4 +1,4 @@ -# TODO no latest +# TODO(any)(latest) FROM alpine:latest EXPOSE 443 @@ -9,7 +9,7 @@ RUN apk add curl RUN apk fix # install nginx -# TODO installed automatically? +# TODO(any) installed automatically? #RUN apk add openssl curl ca-certificates RUN printf "%s%s%s%s\n" \ "@nginx " \ diff --git a/srcs/requirements/nginx/conf/nginx.conf b/srcs/requirements/nginx/conf/nginx.conf index 2faf0dc..a9592ee 100644 --- a/srcs/requirements/nginx/conf/nginx.conf +++ b/srcs/requirements/nginx/conf/nginx.conf @@ -1,4 +1,4 @@ -# TODO clean comments? +# TODO(any) clean comments? user nginx; worker_processes auto; @@ -31,11 +31,11 @@ http { server { listen 443 ssl; - server_name mcolonna.42.fr; # TODO from env var? + server_name mcolonna.42.fr; # TODO(any)(nocopy) ssl_certificate mcolonna.42.fr.crt; - ssl_certificate_key mcolonna.42.fr.key; # TODO secret? # TODO in .cert? + ssl_certificate_key mcolonna.42.fr.key; # TODO(any)(secret) secret? # TODO(any)(nocopy) ssl_protocols TLSv1.3; - # TODO ssl_ciphers + # TODO ssl_ciphers(any) #access_log /var/log/nginx/host.access.log main; From c972110e1069612aab9da3bfa5c40e72ff1a1db4 Mon Sep 17 00:00:00 2001 From: mcolonna Date: Wed, 2 Apr 2025 18:46:49 +0200 Subject: [PATCH 11/34] dev: clean nginx.conf --- srcs/requirements/nginx/conf/nginx.conf | 40 ++----------------------- 1 file changed, 3 insertions(+), 37 deletions(-) diff --git a/srcs/requirements/nginx/conf/nginx.conf b/srcs/requirements/nginx/conf/nginx.conf index a9592ee..fc74893 100644 --- a/srcs/requirements/nginx/conf/nginx.conf +++ b/srcs/requirements/nginx/conf/nginx.conf @@ -1,5 +1,3 @@ -# TODO(any) clean comments? - user nginx; worker_processes auto; @@ -23,12 +21,9 @@ http { access_log /var/log/nginx/access.log main; sendfile on; - #tcp_nopush on; keepalive_timeout 65; - #gzip on; - server { listen 443 ssl; server_name mcolonna.42.fr; # TODO(any)(nocopy) @@ -37,44 +32,15 @@ http { ssl_protocols TLSv1.3; # TODO ssl_ciphers(any) - #access_log /var/log/nginx/host.access.log main; + access_log /var/log/nginx/mcolonna.42.fr.access.log main; location / { root /usr/share/nginx/html; index index.html index.htm; } - #error_page 404 /404.html; - - # redirect server error pages to the static page /50x.html - # - #error_page 500 502 503 504 /50x.html; - #location = /50x.html { - # root /usr/share/nginx/html; - #} - - # proxy the PHP scripts to Apache listening on 127.0.0.1:80 - # - #location ~ \.php$ { - # proxy_pass http://127.0.0.1; - #} - - # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 - # - #location ~ \.php$ { - # root html; - # fastcgi_pass 127.0.0.1:9000; - # fastcgi_index index.php; - # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; - # include fastcgi_params; - #} - - # deny access to .htaccess files, if Apache's document root - # concurs with nginx's one - # - #location ~ /\.ht { - # deny all; - #} + # TODO(more) error_page 404 /404.html; + # TODO(more) error_page 500 502 503 504 /50x.html; } } From 2484c20af5678878281521563b304c2fc44160ee Mon Sep 17 00:00:00 2001 From: mcolonna Date: Wed, 2 Apr 2025 18:48:21 +0200 Subject: [PATCH 12/34] dev: add TODO --- secrets.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/secrets.txt b/secrets.txt index b241c20..4686533 100644 --- a/secrets.txt +++ b/secrets.txt @@ -1 +1,2 @@ +# TODO(any)(secret) DisIsAPasswordForTheSA:D From aa2a0d6f7156fab59db88e1211dc314bb5cb1fab Mon Sep 17 00:00:00 2001 From: mcolonna Date: Mon, 9 Jun 2025 15:37:05 +0200 Subject: [PATCH 13/34] add: wordpress docker --- .gitignore | 2 + Makefile | 71 +++++++-- srcs/docker-compose.yml | 17 +++ srcs/requirements/nginx/Dockerfile | 2 - srcs/requirements/nginx/conf/nginx.conf | 10 +- .../nginx/conf/snippets/fastcgi-php.conf | 15 ++ srcs/requirements/nginx/www/VarelaRound.ttf | Bin 132204 -> 0 bytes srcs/requirements/nginx/www/index.html | 143 ------------------ srcs/requirements/wordpress/Dockerfile | 24 +++ srcs/requirements/wordpress/conf/php-fpm.conf | 1 + .../wordpress/conf/php-fpm.d/www.conf | 11 ++ 11 files changed, 137 insertions(+), 159 deletions(-) create mode 100644 .gitignore create mode 100644 srcs/requirements/nginx/conf/snippets/fastcgi-php.conf delete mode 100644 srcs/requirements/nginx/www/VarelaRound.ttf delete mode 100644 srcs/requirements/nginx/www/index.html create mode 100644 srcs/requirements/wordpress/Dockerfile create mode 100644 srcs/requirements/wordpress/conf/php-fpm.conf create mode 100644 srcs/requirements/wordpress/conf/php-fpm.d/www.conf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7958fac --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +__* +.__* diff --git a/Makefile b/Makefile index 2287ed3..9695171 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,14 @@ # TODO(vm) data is supposed to be in $HOME/data/ +WWW_PATH=__www/ # TODO to change +BUILD_PATH=__build/ + DOCKER=docker SRC_COMPOSE=srcs/ .ONESHELL : .SHELLFLAGS = -eu -c -.PHONY : run help +.PHONY : run install uninstall debug re help shell ### pretty logs #### @@ -19,25 +22,71 @@ _ECHO = echoo(){ \ ## Run the compose. -run : +run : $(WWW_PATH) @$(_ECHO) echoo "Running '$(SRC_COMPOSE)'..." - echo "$ cd -- $(SRC_COMPOSE)" cd -- $(SRC_COMPOSE) - echo "$ $(DOCKER) compose up --build" - $(DOCKER) compose up --build + INCEPTION_WWW_PATH="$(shell realpath $(WWW_PATH))" $(DOCKER) compose up --build -## Run the compose with debug flags. -debug : - $(MAKE) DEBUG=yes run +## Create WWW_PATH from wordpress' release. +install : $(WWW_PATH) + + +$(WWW_PATH) : + @$(_ECHO) + + echoo "Creating $(WWW_PATH) directory from wordpress release..." + + rm -rf $(BUILD_PATH) + + # download and uncompress release + mkdir -p $(BUILD_PATH)"/www/" + curl https://wordpress.org/latest.tar.gz | tar zx -C $(BUILD_PATH)/www + + # move in WWW_PATH + rm -rf -- $(WWW_PATH) + mv $(BUILD_PATH)"/www/wordpress" $(WWW_PATH) + + rm -rf $(BUILD_PATH) + + +## Remove WWW_PATH. +uninstall : + @$(_ECHO) + + echoo "Removing $(WWW_PATH)..." + rm -r $(WWW_PATH) || true + + +## 'uninstall' then 'install' +re : uninstall install + @$(_ECHO) + echo + echo "run \`make\` or \`make run\` to run the docker." + + +## TODO docs +shell : + @$(_ECHO) + + echoo "Running shell inside '$(SRC_COMPOSE)' (container nginx)..." + cd -- $(SRC_COMPOSE) + INCEPTION_WWW_PATH="$(shell realpath $(WWW_PATH))" $(DOCKER) compose run --build nginx sh ## Show help help : @$(_ECHO) - echo "run Run the compose." - echo "debug Run the compose with debug flags." - echo "That's all lol" + echo + echo "run Run the compose, install WWW_PATH if necessary." + echo "install Create WWW_PATH from wordpress' release." + echo "uninstall Remove WWW_PATH." + echo "re 'uninstall' then 'install'." + # TODO docs shell + echo + echo "WWW_PATH is the volume directory where WordPress is installed." + echo "you might want to reset the WWW_PATH variable in the Makefile." + echo diff --git a/srcs/docker-compose.yml b/srcs/docker-compose.yml index 7d1b4a9..9455888 100644 --- a/srcs/docker-compose.yml +++ b/srcs/docker-compose.yml @@ -6,8 +6,25 @@ services: build: ./requirements/nginx/ ports: - 4433:443 + depends_on: + - wordpress + volumes: + - www:/www:ro # domainname: mcolonna.42.fr # TODO(vm) useful? # TODO(any)(nocopy) + wordpress: + build: ./requirements/wordpress + volumes: + - www:/www:rw + +volumes: + www: + driver: local + driver_opts: + o: bind + type: none + device: "${INCEPTION_WWW_PATH:?error}" + ### services ### # image: # build: diff --git a/srcs/requirements/nginx/Dockerfile b/srcs/requirements/nginx/Dockerfile index ac5fb93..1a5d8b2 100644 --- a/srcs/requirements/nginx/Dockerfile +++ b/srcs/requirements/nginx/Dockerfile @@ -26,8 +26,6 @@ RUN apk fix # add config RUN rm /etc/nginx/nginx.conf COPY conf/ /etc/nginx/ -RUN rm -r /usr/share/nginx/html -COPY www/ /usr/share/nginx/html # start CMD ["nginx", "-g", "daemon off;"] diff --git a/srcs/requirements/nginx/conf/nginx.conf b/srcs/requirements/nginx/conf/nginx.conf index fc74893..08917f1 100644 --- a/srcs/requirements/nginx/conf/nginx.conf +++ b/srcs/requirements/nginx/conf/nginx.conf @@ -35,12 +35,16 @@ http { access_log /var/log/nginx/mcolonna.42.fr.access.log main; location / { - root /usr/share/nginx/html; - index index.html index.htm; + root /www; + index index.php; + + location ~ \.php$ { + include snippets/fastcgi-php.conf; + fastcgi_pass wordpress:9000; + } } # TODO(more) error_page 404 /404.html; # TODO(more) error_page 500 502 503 504 /50x.html; } } - diff --git a/srcs/requirements/nginx/conf/snippets/fastcgi-php.conf b/srcs/requirements/nginx/conf/snippets/fastcgi-php.conf new file mode 100644 index 0000000..5ed9d38 --- /dev/null +++ b/srcs/requirements/nginx/conf/snippets/fastcgi-php.conf @@ -0,0 +1,15 @@ +# from https://exampleconfig.com/view/nginx-ubuntu20-04-etc-nginx-snippets-fastcgi-php-conf + +# regex to split $uri to $fastcgi_script_name and $fastcgi_path +fastcgi_split_path_info ^(.+?\.php)(/.*)$; + +# Check that the PHP script exists before passing it +try_files $fastcgi_script_name =404; + +# Bypass the fact that try_files resets $fastcgi_path_info +# see: http://trac.nginx.org/nginx/ticket/321 +set $path_info $fastcgi_path_info; +fastcgi_param PATH_INFO $path_info; + +fastcgi_index index.php; +include fastcgi.conf; \ No newline at end of file diff --git a/srcs/requirements/nginx/www/VarelaRound.ttf b/srcs/requirements/nginx/www/VarelaRound.ttf deleted file mode 100644 index 9d018125142e6af42661b072a7443417b5ef1673..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132204 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�T)q{6VQ32UhFw9vn3Qkg?eD=8Z1 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 -
yippee
-
yippee
- - diff --git a/srcs/requirements/wordpress/Dockerfile b/srcs/requirements/wordpress/Dockerfile new file mode 100644 index 0000000..d51e8e8 --- /dev/null +++ b/srcs/requirements/wordpress/Dockerfile @@ -0,0 +1,24 @@ +# TODO(any)(latest) +FROM alpine:latest + +# EXPOSE +EXPOSE 9000 + +# install packages +RUN apk update +RUN apk add php-fpm +RUN apk fix + +RUN addgroup -S www +RUN adduser -D -S -G www www + +#RUN apk add curl +# install wordpress +# RUN mkdir -p /www +# RUN curl https://wordpress.org/latest.tar.gz | tar zx -C /www + +# add config +COPY /conf/ /etc/php83/ + +# start +CMD ["php-fpm83", "-F"] diff --git a/srcs/requirements/wordpress/conf/php-fpm.conf b/srcs/requirements/wordpress/conf/php-fpm.conf new file mode 100644 index 0000000..c587bf2 --- /dev/null +++ b/srcs/requirements/wordpress/conf/php-fpm.conf @@ -0,0 +1 @@ +include=/etc/php83/php-fpm.d/*.conf diff --git a/srcs/requirements/wordpress/conf/php-fpm.d/www.conf b/srcs/requirements/wordpress/conf/php-fpm.d/www.conf new file mode 100644 index 0000000..273c434 --- /dev/null +++ b/srcs/requirements/wordpress/conf/php-fpm.d/www.conf @@ -0,0 +1,11 @@ +[www] + +user = www +group = www +listen = wordpress:9000 + +pm = dynamic +pm.max_children = 5 +pm.start_servers = 2 +pm.min_spare_servers = 1 +pm.max_spare_servers = 3 From b7cb3733ec83f24fa8a4cf0ec5e88d8ca52c997e Mon Sep 17 00:00:00 2001 From: mcolonna Date: Mon, 9 Jun 2025 16:25:45 +0200 Subject: [PATCH 14/34] add: handle sending HTTP request to HTTPS port --- Makefile | 4 ++++ srcs/requirements/nginx/conf/nginx.conf | 1 + srcs/www/497.php | 3 +++ 3 files changed, 8 insertions(+) create mode 100644 srcs/www/497.php diff --git a/Makefile b/Makefile index 9695171..2127a26 100644 --- a/Makefile +++ b/Makefile @@ -5,6 +5,7 @@ BUILD_PATH=__build/ DOCKER=docker SRC_COMPOSE=srcs/ +SRC_WWW_MORE=srcs/www/ .ONESHELL : .SHELLFLAGS = -eu -c @@ -48,6 +49,9 @@ $(WWW_PATH) : # move in WWW_PATH rm -rf -- $(WWW_PATH) mv $(BUILD_PATH)"/www/wordpress" $(WWW_PATH) + echo + echo "also copy files from $(SRC_WWW_MORE)" + cp -r $(SRC_WWW_MORE)/. $(WWW_PATH) rm -rf $(BUILD_PATH) diff --git a/srcs/requirements/nginx/conf/nginx.conf b/srcs/requirements/nginx/conf/nginx.conf index 08917f1..34dfca1 100644 --- a/srcs/requirements/nginx/conf/nginx.conf +++ b/srcs/requirements/nginx/conf/nginx.conf @@ -30,6 +30,7 @@ http { ssl_certificate mcolonna.42.fr.crt; ssl_certificate_key mcolonna.42.fr.key; # TODO(any)(secret) secret? # TODO(any)(nocopy) ssl_protocols TLSv1.3; + error_page 497 =301 /497.php; # TODO ssl_ciphers(any) access_log /var/log/nginx/mcolonna.42.fr.access.log main; diff --git a/srcs/www/497.php b/srcs/www/497.php new file mode 100644 index 0000000..d0ca495 --- /dev/null +++ b/srcs/www/497.php @@ -0,0 +1,3 @@ + Date: Thu, 12 Jun 2025 18:26:18 +0200 Subject: [PATCH 15/34] add: mariadb docker, wordpress now works :)))) --- Makefile | 4 + TODO | 3 + srcs/docker-compose.yml | 8 ++ srcs/requirements/mariadb/Dockerfile | 22 ++++ .../mariadb/conf/mariadb-server.cnf | 10 ++ srcs/requirements/mariadb/run.sh | 34 ++++++ srcs/requirements/nginx/Dockerfile | 2 +- srcs/requirements/wordpress/Dockerfile | 2 +- srcs/www/wp-config.php | 102 ++++++++++++++++++ 9 files changed, 185 insertions(+), 2 deletions(-) create mode 100644 TODO create mode 100644 srcs/requirements/mariadb/Dockerfile create mode 100644 srcs/requirements/mariadb/conf/mariadb-server.cnf create mode 100755 srcs/requirements/mariadb/run.sh create mode 100644 srcs/www/wp-config.php diff --git a/Makefile b/Makefile index 2127a26..6d93a95 100644 --- a/Makefile +++ b/Makefile @@ -63,6 +63,10 @@ uninstall : echoo "Removing $(WWW_PATH)..." rm -r $(WWW_PATH) || true + # TODO(ugly) + -docker container prune + -docker volume rm my-awesome-compose_db + ## 'uninstall' then 'install' re : uninstall install diff --git a/TODO b/TODO new file mode 100644 index 0000000..7392ecc --- /dev/null +++ b/TODO @@ -0,0 +1,3 @@ +TODO later +- dependencies between containers and check if its is working +- volume www to normal volume, and create it in docker diff --git a/srcs/docker-compose.yml b/srcs/docker-compose.yml index 9455888..1559459 100644 --- a/srcs/docker-compose.yml +++ b/srcs/docker-compose.yml @@ -16,6 +16,13 @@ services: build: ./requirements/wordpress volumes: - www:/www:rw + depends_on: + - mariadb + + mariadb: + build: ./requirements/mariadb + volumes: + - db:/db:rw volumes: www: @@ -24,6 +31,7 @@ volumes: o: bind type: none device: "${INCEPTION_WWW_PATH:?error}" + db: ### services ### # image: diff --git a/srcs/requirements/mariadb/Dockerfile b/srcs/requirements/mariadb/Dockerfile new file mode 100644 index 0000000..116af2e --- /dev/null +++ b/srcs/requirements/mariadb/Dockerfile @@ -0,0 +1,22 @@ +# TODO(any)(latest) +FROM alpine:latest + +RUN apk update +RUN apk add mariadb +RUN apk fix + +RUN rm -rf /etc/my.cnf.d/ +RUN mkdir -p /etc/my.cnf.d/ +COPY conf/mariadb-server.cnf /etc/my.cnf.d/mariadb-server.cnf +COPY run.sh /run.sh + +# TODO(secret) +RUN addgroup -S www && adduser -S www www +RUN mkdir /db +RUN chmod -R 666 /db + +EXPOSE 3306 + +# start +CMD ["/run.sh"] +#CMD ["ls", "-AlF", "/"] diff --git a/srcs/requirements/mariadb/conf/mariadb-server.cnf b/srcs/requirements/mariadb/conf/mariadb-server.cnf new file mode 100644 index 0000000..ce6f9a1 --- /dev/null +++ b/srcs/requirements/mariadb/conf/mariadb-server.cnf @@ -0,0 +1,10 @@ +[client-server] +socket=/tmp/mysql.sock +port=3306 + +[mysqld] +# fix from https://stackoverflow.com/questions/75696472/aborted-connection-3-to-db-unconnected-user-unauthenticated-host-172-21 +skip-grant-tables + +[mariadb] +datadir=/db diff --git a/srcs/requirements/mariadb/run.sh b/srcs/requirements/mariadb/run.sh new file mode 100755 index 0000000..d18bd1d --- /dev/null +++ b/srcs/requirements/mariadb/run.sh @@ -0,0 +1,34 @@ +#!/bin/sh +set -e + +echo + +dirisempty() +{ + [ -z "$( ls -A "$1" )" ] +} + +# install database if doesn't exist +if dirisempty /db +then + echo "database doesn't exist. creating it..." + echo + chmod -R 777 /db + mariadb-install-db --user=www --datadir=/db + # TODO(secret) + echo ' + FLUSH PRIVILEGES; + CREATE DATABASE wp; + GRANT ALL PRIVILEGES ON wp.* TO wwsw IDENTIFIED BY "ultraPassword"; + FLUSH PRIVILEGES; + ' | mariadbd -u root --bootstrap + echo + echo "database created!" + echo +fi + +echo "to recreate a new database, remove the db volume of this compose." +echo + +# run mariadb +mariadbd -u root diff --git a/srcs/requirements/nginx/Dockerfile b/srcs/requirements/nginx/Dockerfile index 1a5d8b2..70a88e2 100644 --- a/srcs/requirements/nginx/Dockerfile +++ b/srcs/requirements/nginx/Dockerfile @@ -20,7 +20,7 @@ RUN printf "%s%s%s%s\n" \ RUN curl -o /tmp/nginx_signing.rsa.pub https://nginx.org/keys/nginx_signing.rsa.pub RUN mv /tmp/nginx_signing.rsa.pub /etc/apk/keys/ RUN apk update -RUN apk add nginx@nginx +RUN apk add nginx@nginx mysql-client RUN apk fix # add config diff --git a/srcs/requirements/wordpress/Dockerfile b/srcs/requirements/wordpress/Dockerfile index d51e8e8..7eb1a7b 100644 --- a/srcs/requirements/wordpress/Dockerfile +++ b/srcs/requirements/wordpress/Dockerfile @@ -6,7 +6,7 @@ EXPOSE 9000 # install packages RUN apk update -RUN apk add php-fpm +RUN apk add php-fpm php-mysqli RUN apk fix RUN addgroup -S www diff --git a/srcs/www/wp-config.php b/srcs/www/wp-config.php new file mode 100644 index 0000000..b86e80c --- /dev/null +++ b/srcs/www/wp-config.php @@ -0,0 +1,102 @@ +c]EE<+5BAo{3/)5Oc|(U30#2An'); +define('NONCE_KEY', 'EwQ+Jo#/Zr-I_,nJu|)i1.Bfzm:b!5d.ku%%+Ihw.)l-]0y 2^;=4HR1XB$B!;m66'); +define('AUTH_SALT', 'p_&.BA.mTs]RQEM(Q@F0yB`.@INfW@6L-<%%cd*@I-w iOlEqC@[I0aLbuYNLk}O9'); +define('SECURE_AUTH_SALT', '$H?b*kvJ:uA6DyPLwAJsh8:n}P.:[-N<,$/zl?,|`Vu++qC}F,{YKw&8CM`@@d*t'); +define('LOGGED_IN_SALT', ',6~y7[-Z}Hj/d&C!M[_|FD]R0>YMTO)s}xD`?.{ Ich:>5j!W`T9~~wef-WLJ:U#'); +define('NONCE_SALT', '%%-8d||zvI0s,giZmR7Lk(nhG|uH8c~U{kdB|2.v?Z+@3hr&nlk<@V22;.Ef8chSv'); + +/**#@-*/ + +/** + * WordPress database table prefix. + * + * You can have multiple installations in one database if you give each + * a unique prefix. Only numbers, letters, and underscores please! + * + * At the installation time, database tables are created with the specified prefix. + * Changing this value after WordPress is installed will make your site think + * it has not been installed. + * + * @link https://developer.wordpress.org/advanced-administration/wordpress/wp-config/#table-prefix + */ +$table_prefix = 'wp_'; + +/** + * For developers: WordPress debugging mode. + * + * Change this to true to enable the display of notices during development. + * It is strongly recommended that plugin and theme developers use WP_DEBUG + * in their development environments. + * + * For information on other constants that can be used for debugging, + * visit the documentation. + * + * @link https://developer.wordpress.org/advanced-administration/debug/debug-wordpress/ + */ +define( 'WP_DEBUG', true ); # TODO(debug) + +/* Add any custom values between this line and the "stop editing" line. */ + + + +/* That's all, stop editing! Happy publishing. */ + +/** Absolute path to the WordPress directory. */ +if ( ! defined( 'ABSPATH' ) ) { + define( 'ABSPATH', __DIR__ . '/' ); +} + +/** Sets up WordPress vars and included files. */ +require_once ABSPATH . 'wp-settings.php'; From f5c5b31fbdf04c73694fe3e2939643ca683c0b0a Mon Sep 17 00:00:00 2001 From: mcolonna Date: Fri, 13 Jun 2025 12:26:40 +0200 Subject: [PATCH 16/34] change: www volume managed better --- Makefile | 37 +++---------------- TODO | 1 - srcs/docker-compose.yml | 5 --- srcs/requirements/wordpress/Dockerfile | 4 +- .../wordpress/conf/wwwmore}/497.php | 0 .../wordpress/conf/wwwmore}/wp-config.php | 0 srcs/requirements/wordpress/run.sh | 34 +++++++++++++++++ 7 files changed, 43 insertions(+), 38 deletions(-) rename srcs/{www => requirements/wordpress/conf/wwwmore}/497.php (100%) rename srcs/{www => requirements/wordpress/conf/wwwmore}/wp-config.php (100%) create mode 100755 srcs/requirements/wordpress/run.sh diff --git a/Makefile b/Makefile index 6d93a95..b32e24a 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ SRC_WWW_MORE=srcs/www/ .ONESHELL : .SHELLFLAGS = -eu -c -.PHONY : run install uninstall debug re help shell +.PHONY : run uninstall debug re help shell ### pretty logs #### @@ -23,7 +23,7 @@ _ECHO = echoo(){ \ ## Run the compose. -run : $(WWW_PATH) +run : @$(_ECHO) echoo "Running '$(SRC_COMPOSE)'..." @@ -31,31 +31,6 @@ run : $(WWW_PATH) INCEPTION_WWW_PATH="$(shell realpath $(WWW_PATH))" $(DOCKER) compose up --build -## Create WWW_PATH from wordpress' release. -install : $(WWW_PATH) - - -$(WWW_PATH) : - @$(_ECHO) - - echoo "Creating $(WWW_PATH) directory from wordpress release..." - - rm -rf $(BUILD_PATH) - - # download and uncompress release - mkdir -p $(BUILD_PATH)"/www/" - curl https://wordpress.org/latest.tar.gz | tar zx -C $(BUILD_PATH)/www - - # move in WWW_PATH - rm -rf -- $(WWW_PATH) - mv $(BUILD_PATH)"/www/wordpress" $(WWW_PATH) - echo - echo "also copy files from $(SRC_WWW_MORE)" - cp -r $(SRC_WWW_MORE)/. $(WWW_PATH) - - rm -rf $(BUILD_PATH) - - ## Remove WWW_PATH. uninstall : @$(_ECHO) @@ -66,10 +41,11 @@ uninstall : # TODO(ugly) -docker container prune -docker volume rm my-awesome-compose_db + -docker volume rm my-awesome-compose_www ## 'uninstall' then 'install' -re : uninstall install +re : uninstall run @$(_ECHO) echo echo "run \`make\` or \`make run\` to run the docker." @@ -90,9 +66,8 @@ help : echo echo "run Run the compose, install WWW_PATH if necessary." - echo "install Create WWW_PATH from wordpress' release." - echo "uninstall Remove WWW_PATH." - echo "re 'uninstall' then 'install'." + echo "uninstall TODO" + echo "re 'uninstall' then 'run'." # TODO docs shell echo echo "WWW_PATH is the volume directory where WordPress is installed." diff --git a/TODO b/TODO index 7392ecc..c17f091 100644 --- a/TODO +++ b/TODO @@ -1,3 +1,2 @@ TODO later - dependencies between containers and check if its is working -- volume www to normal volume, and create it in docker diff --git a/srcs/docker-compose.yml b/srcs/docker-compose.yml index 1559459..ec35e7d 100644 --- a/srcs/docker-compose.yml +++ b/srcs/docker-compose.yml @@ -26,11 +26,6 @@ services: volumes: www: - driver: local - driver_opts: - o: bind - type: none - device: "${INCEPTION_WWW_PATH:?error}" db: ### services ### diff --git a/srcs/requirements/wordpress/Dockerfile b/srcs/requirements/wordpress/Dockerfile index 7eb1a7b..a1358a0 100644 --- a/srcs/requirements/wordpress/Dockerfile +++ b/srcs/requirements/wordpress/Dockerfile @@ -19,6 +19,8 @@ RUN adduser -D -S -G www www # add config COPY /conf/ /etc/php83/ +COPY /conf/wwwmore/ /conf/wwwmore/ +COPY /run.sh /run.sh # start -CMD ["php-fpm83", "-F"] +CMD ["/run.sh"] diff --git a/srcs/www/497.php b/srcs/requirements/wordpress/conf/wwwmore/497.php similarity index 100% rename from srcs/www/497.php rename to srcs/requirements/wordpress/conf/wwwmore/497.php diff --git a/srcs/www/wp-config.php b/srcs/requirements/wordpress/conf/wwwmore/wp-config.php similarity index 100% rename from srcs/www/wp-config.php rename to srcs/requirements/wordpress/conf/wwwmore/wp-config.php diff --git a/srcs/requirements/wordpress/run.sh b/srcs/requirements/wordpress/run.sh new file mode 100755 index 0000000..87345ce --- /dev/null +++ b/srcs/requirements/wordpress/run.sh @@ -0,0 +1,34 @@ +#!/bin/sh +set -e + +echo + +dirisempty() +{ + [ -z "$( ls -A "$1" )" ] +} + +if dirisempty /www +then + echo "download and uncompress wordpress release..." + echo + apk add curl + apk fix + rm -rf /build + mkdir -p "/build/www/" + curl https://wordpress.org/latest.tar.gz | tar zx -C /build/www + chmod -R 777 /www + mv $(find /build/www/wordpress -maxdepth 1 -mindepth 1) /www + rm -rf /build + echo + echo "add files from /conf/wwwmore/" + echo + cp -r /conf/wwwmore/. /www + echo "www directory created!" + echo +fi + +echo "to recreate the www directory, remove the www volume of this compose." +echo + +php-fpm83 -F From 961b90c4d61fcd1abafe271dde05a70e3af5ddd2 Mon Sep 17 00:00:00 2001 From: mcolonna Date: Fri, 13 Jun 2025 21:21:36 +0200 Subject: [PATCH 17/34] fix: dependencies between dockers --- TODO | 2 -- srcs/docker-compose.yml | 6 ++++-- srcs/requirements/mariadb/Dockerfile | 2 ++ srcs/requirements/nginx/Dockerfile | 2 ++ srcs/requirements/wordpress/Dockerfile | 2 ++ 5 files changed, 10 insertions(+), 4 deletions(-) delete mode 100644 TODO diff --git a/TODO b/TODO deleted file mode 100644 index c17f091..0000000 --- a/TODO +++ /dev/null @@ -1,2 +0,0 @@ -TODO later -- dependencies between containers and check if its is working diff --git a/srcs/docker-compose.yml b/srcs/docker-compose.yml index ec35e7d..b9dca18 100644 --- a/srcs/docker-compose.yml +++ b/srcs/docker-compose.yml @@ -7,7 +7,8 @@ services: ports: - 4433:443 depends_on: - - wordpress + wordpress: + condition: service_healthy volumes: - www:/www:ro # domainname: mcolonna.42.fr # TODO(vm) useful? # TODO(any)(nocopy) @@ -17,7 +18,8 @@ services: volumes: - www:/www:rw depends_on: - - mariadb + mariadb: + condition: service_healthy mariadb: build: ./requirements/mariadb diff --git a/srcs/requirements/mariadb/Dockerfile b/srcs/requirements/mariadb/Dockerfile index 116af2e..16f1044 100644 --- a/srcs/requirements/mariadb/Dockerfile +++ b/srcs/requirements/mariadb/Dockerfile @@ -20,3 +20,5 @@ EXPOSE 3306 # start CMD ["/run.sh"] #CMD ["ls", "-AlF", "/"] + +HEALTHCHECK --interval=1s --timeout=10s --start-period=600s --retries=1 CMD [ "sh", "-c", "! [ -z \"$(netstat -tuln | grep :3306)\" ]" ] diff --git a/srcs/requirements/nginx/Dockerfile b/srcs/requirements/nginx/Dockerfile index 70a88e2..ca58b5f 100644 --- a/srcs/requirements/nginx/Dockerfile +++ b/srcs/requirements/nginx/Dockerfile @@ -29,3 +29,5 @@ COPY conf/ /etc/nginx/ # start CMD ["nginx", "-g", "daemon off;"] + +HEALTHCHECK --interval=1s --timeout=10s --start-period=60s --retries=1 CMD [ "sh", "-c", "! [ -z \"$(netstat -tuln | grep :443)\" ]" ] diff --git a/srcs/requirements/wordpress/Dockerfile b/srcs/requirements/wordpress/Dockerfile index a1358a0..a16d922 100644 --- a/srcs/requirements/wordpress/Dockerfile +++ b/srcs/requirements/wordpress/Dockerfile @@ -24,3 +24,5 @@ COPY /run.sh /run.sh # start CMD ["/run.sh"] + +HEALTHCHECK --interval=1s --timeout=10s --start-period=3600s --retries=1 CMD [ "sh", "-c", "! [ -z \"$(netstat -tuln | grep :9000)\" ]" ] From 36882aa3b71860a2ee3be656156008a0960e52fa Mon Sep 17 00:00:00 2001 From: mcolonna Date: Fri, 13 Jun 2025 21:22:10 +0200 Subject: [PATCH 18/34] dev: whatever --- Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index b32e24a..11c6752 100644 --- a/Makefile +++ b/Makefile @@ -39,9 +39,9 @@ uninstall : rm -r $(WWW_PATH) || true # TODO(ugly) - -docker container prune - -docker volume rm my-awesome-compose_db - -docker volume rm my-awesome-compose_www + docker container prune + docker volume rm my-awesome-compose_db || true + docker volume rm my-awesome-compose_www || true ## 'uninstall' then 'install' From 2eb686ef41b9395e91bff1f8232b88dca49edca3 Mon Sep 17 00:00:00 2001 From: mcolonna Date: Mon, 16 Jun 2025 14:54:40 +0200 Subject: [PATCH 19/34] dev: make database password a secret --- srcs/.env | 1 + srcs/docker-compose.yml | 8 ++++++++ srcs/requirements/mariadb/Dockerfile | 1 - srcs/requirements/mariadb/run.sh | 11 +++++++++-- .../requirements/wordpress/conf/wwwmore/wp-config.php | 2 +- 5 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 srcs/.env diff --git a/srcs/.env b/srcs/.env new file mode 100644 index 0000000..e419ce1 --- /dev/null +++ b/srcs/.env @@ -0,0 +1 @@ +DATABASE_PWD=SuperComplexDatabasePassword diff --git a/srcs/docker-compose.yml b/srcs/docker-compose.yml index b9dca18..19f7028 100644 --- a/srcs/docker-compose.yml +++ b/srcs/docker-compose.yml @@ -20,16 +20,24 @@ services: depends_on: mariadb: condition: service_healthy + secrets: + - database-pwd mariadb: build: ./requirements/mariadb volumes: - db:/db:rw + secrets: + - database-pwd volumes: www: db: +secrets: + database-pwd: + environment: "DATABASE_PWD" + ### services ### # image: # build: diff --git a/srcs/requirements/mariadb/Dockerfile b/srcs/requirements/mariadb/Dockerfile index 16f1044..0e42e8a 100644 --- a/srcs/requirements/mariadb/Dockerfile +++ b/srcs/requirements/mariadb/Dockerfile @@ -10,7 +10,6 @@ RUN mkdir -p /etc/my.cnf.d/ COPY conf/mariadb-server.cnf /etc/my.cnf.d/mariadb-server.cnf COPY run.sh /run.sh -# TODO(secret) RUN addgroup -S www && adduser -S www www RUN mkdir /db RUN chmod -R 666 /db diff --git a/srcs/requirements/mariadb/run.sh b/srcs/requirements/mariadb/run.sh index d18bd1d..1319dd1 100755 --- a/srcs/requirements/mariadb/run.sh +++ b/srcs/requirements/mariadb/run.sh @@ -15,11 +15,18 @@ then echo chmod -R 777 /db mariadb-install-db --user=www --datadir=/db - # TODO(secret) + echo "creating database..." + DATABASE_PWD="$(cat /run/secrets/database-pwd)" + if ! [[ "$DATABASE_PWD" =~ ^[a-zA-Z0-9_]+$ ]] + then + echo "the DB password must contain only letters, digits or '_'." + echo + exit 1 + fi echo ' FLUSH PRIVILEGES; CREATE DATABASE wp; - GRANT ALL PRIVILEGES ON wp.* TO wwsw IDENTIFIED BY "ultraPassword"; + GRANT ALL PRIVILEGES ON wp.* TO www IDENTIFIED BY "'$DATABASE_PWD'"; FLUSH PRIVILEGES; ' | mariadbd -u root --bootstrap echo diff --git a/srcs/requirements/wordpress/conf/wwwmore/wp-config.php b/srcs/requirements/wordpress/conf/wwwmore/wp-config.php index b86e80c..157cff5 100644 --- a/srcs/requirements/wordpress/conf/wwwmore/wp-config.php +++ b/srcs/requirements/wordpress/conf/wwwmore/wp-config.php @@ -26,7 +26,7 @@ define( 'DB_NAME', 'wp' ); define( 'DB_USER', 'www' ); /** Database password */ -define( 'DB_PASSWORD', 'ultraPassword' ); # TODO(secret) +define( 'DB_PASSWORD', `cat /run/secrets/database-pwd` ); /** Database hostname */ define( 'DB_HOST', 'mariadb:3306' ); From 2d673aa016d0cd905e2b773e3ad46a6e12ba14a2 Mon Sep 17 00:00:00 2001 From: mcolonna Date: Mon, 16 Jun 2025 15:23:52 +0200 Subject: [PATCH 20/34] dev: clean and fix Makefile --- Makefile | 44 ++++++++++++++------------------------------ 1 file changed, 14 insertions(+), 30 deletions(-) diff --git a/Makefile b/Makefile index 11c6752..75f81a5 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,5 @@ # TODO(vm) data is supposed to be in $HOME/data/ -WWW_PATH=__www/ # TODO to change BUILD_PATH=__build/ DOCKER=docker @@ -9,7 +8,7 @@ SRC_WWW_MORE=srcs/www/ .ONESHELL : .SHELLFLAGS = -eu -c -.PHONY : run uninstall debug re help shell +.PHONY : run reset re help ### pretty logs #### @@ -28,48 +27,33 @@ run : echoo "Running '$(SRC_COMPOSE)'..." cd -- $(SRC_COMPOSE) - INCEPTION_WWW_PATH="$(shell realpath $(WWW_PATH))" $(DOCKER) compose up --build + $(DOCKER) compose up --build + cd - -## Remove WWW_PATH. -uninstall : +## Remove all content of the website. +reset : @$(_ECHO) - echoo "Removing $(WWW_PATH)..." - rm -r $(WWW_PATH) || true - - # TODO(ugly) - docker container prune - docker volume rm my-awesome-compose_db || true - docker volume rm my-awesome-compose_www || true + echoo "Removing all data..." + cd -- $(SRC_COMPOSE) + docker compose down -v + cd - -## 'uninstall' then 'install' -re : uninstall run +## 'reset' then 'run' +re : reset run @$(_ECHO) echo echo "run \`make\` or \`make run\` to run the docker." -## TODO docs -shell : - @$(_ECHO) - - echoo "Running shell inside '$(SRC_COMPOSE)' (container nginx)..." - cd -- $(SRC_COMPOSE) - INCEPTION_WWW_PATH="$(shell realpath $(WWW_PATH))" $(DOCKER) compose run --build nginx sh - - ## Show help help : @$(_ECHO) echo - echo "run Run the compose, install WWW_PATH if necessary." - echo "uninstall TODO" - echo "re 'uninstall' then 'run'." - # TODO docs shell - echo - echo "WWW_PATH is the volume directory where WordPress is installed." - echo "you might want to reset the WWW_PATH variable in the Makefile." + echo "run Run the compose." + echo "reset Remove all content of the website." + echo "re 'reset' then 'run'." echo From 7b0baf20fb362f0277b2692a8fb5b7e776287a66 Mon Sep 17 00:00:00 2001 From: mcolonna Date: Mon, 16 Jun 2025 17:03:44 +0200 Subject: [PATCH 21/34] dev: manage SSL certificate better --- Makefile | 69 ++++++++++++++++++- srcs/docker-compose.yml | 1 + .../nginx/conf/mcolonna.42.fr.crt | 33 --------- .../nginx/conf/mcolonna.42.fr.key | 52 -------------- srcs/requirements/nginx/conf/nginx.conf | 4 +- 5 files changed, 70 insertions(+), 89 deletions(-) delete mode 100644 srcs/requirements/nginx/conf/mcolonna.42.fr.crt delete mode 100644 srcs/requirements/nginx/conf/mcolonna.42.fr.key diff --git a/Makefile b/Makefile index 75f81a5..a454cdc 100644 --- a/Makefile +++ b/Makefile @@ -3,12 +3,18 @@ BUILD_PATH=__build/ DOCKER=docker +MKTEMP=mktemp + +DOMAIN=mcolonna.42.fr + SRC_COMPOSE=srcs/ SRC_WWW_MORE=srcs/www/ +CERT_PATH=srcs/__cert/ +CERT_PATH_FILES=$(addprefix $(CERT_PATH), ca.pem cert.key cert.crt ) .ONESHELL : .SHELLFLAGS = -eu -c -.PHONY : run reset re help +.PHONY : run reset re cert_reset cert_re help ### pretty logs #### @@ -22,7 +28,7 @@ _ECHO = echoo(){ \ ## Run the compose. -run : +run : $(CERT_PATH_FILES) @$(_ECHO) echoo "Running '$(SRC_COMPOSE)'..." @@ -48,6 +54,61 @@ re : reset run echo "run \`make\` or \`make run\` to run the docker." +## Create the SSL certificate. +cert : $(CERT_PATH_FILES) + +$(CERT_PATH_FILES) : + @$(_ECHO) + + echoo "Creating SSL certificate files..." + mkdir -p $(CERT_PATH) + cd $(CERT_PATH) + + echoo " -> Creating CA..." + # Create local CA + TMP_CA_KEY=$$($(MKTEMP)) + openssl genrsa -out $$TMP_CA_KEY 2048 + openssl req -x509 -new -nodes -key $$TMP_CA_KEY -sha256 -days 1825 -out ca.pem + + echoo " -> Creating certificate for $(DOMAIN)..." + # Create certificate for $(DOMAIN) + openssl genrsa -out "cert.key" 2048 + TMP_CA_CSR=$$($(MKTEMP)) + openssl req -new -key cert.key -out $$TMP_CA_CSR + TMP_EXT=$$($(MKTEMP)) + >>$$TMP_EXT echo "authorityKeyIdentifier=keyid,issuer" + >>$$TMP_EXT echo "basicConstraints=CA:FALSE" + >>$$TMP_EXT echo "keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment" + >>$$TMP_EXT echo "subjectAltName = @alt_names" + >>$$TMP_EXT echo "" + >>$$TMP_EXT echo "[alt_names]" + >>$$TMP_EXT echo "DNS.1 = $(DOMAIN)" + openssl x509 -req -in $$TMP_CA_CSR -CA ca.pem -CAkey $$TMP_CA_KEY \ + -CAcreateserial -out cert.crt -days 825 -sha256 -extfile $$TMP_EXT + + rm $$TMP_CA_KEY $$TMP_CA_CSR $$TMP_EXT + + echo + echo "=====" + echo "to avoid \"this website was self-signed\" warnings," + echo "install $(CERT_PATH)/ca.pem on whatever you need i guess" + echo "=====" + echo + + cd - + + +## Remove the SSL certificate. +cert_reset : + @$(_ECHO) + echoo "Removing SSL certificate files..." + rm -rf $(CERT_PATH) + + +## 'cert_reset' then 'cert' +cert_re : cert_reset $(CERT_PATH_FILES) + + ## Show help help : @$(_ECHO) @@ -57,3 +118,7 @@ help : echo "reset Remove all content of the website." echo "re 'reset' then 'run'." echo + echo "cert Create the SSL certificate." + echo "cert_reset Remove the SSL certificate." + echo "cert_re 'cert_reset' then 'cert'." + echo diff --git a/srcs/docker-compose.yml b/srcs/docker-compose.yml index 19f7028..34e8965 100644 --- a/srcs/docker-compose.yml +++ b/srcs/docker-compose.yml @@ -11,6 +11,7 @@ services: condition: service_healthy volumes: - www:/www:ro + - ./__cert:/cert:ro # domainname: mcolonna.42.fr # TODO(vm) useful? # TODO(any)(nocopy) wordpress: diff --git a/srcs/requirements/nginx/conf/mcolonna.42.fr.crt b/srcs/requirements/nginx/conf/mcolonna.42.fr.crt deleted file mode 100644 index fafa526..0000000 --- a/srcs/requirements/nginx/conf/mcolonna.42.fr.crt +++ /dev/null @@ -1,33 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFyjCCA7KgAwIBAgIUSCJJNkcYCGrdVPyeIij0K+4xYxcwDQYJKoZIhvcNAQEL -BQAwgb0xCzAJBgNVBAYTAjozMQ4wDAYDVQQIDAVlYXJ0aDEVMBMGA1UEBwwMc29s -YXIgc3lzdGVtMRMwEQYDVQQKDApteWxhbiBjb3JwMS0wKwYDVQQLDCR0aGUgbWFp -biBhbmQgb25seSB1bml0IG9mIG15bGFuIGNvcnAxFTATBgNVBAMMDG15bGFuIChj -b3JwKTEsMCoGCSqGSIb3DQEJARYdbXlsYW5AbWNvbG9ubmEuNDIuZnIgcHJvYmFi -bHkwIBcNMjUwNDAyMTUzMzUxWhgPMjEyNTAzMDkxNTMzNTFaMBkxFzAVBgNVBAMM -DnN1cGVyYXdlc29tZWNuMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA -yufae4sNj7+B5buW5gkgW8UtAUJvtAeArY7XqpXIXiosUGzdUJXhgDJO9VHJjFy2 -3ATEJBMf2uJtXtPOjisxPUZbFlA5xUugWOgoIO2xdLC7Z4Zciu7A928ckhkIFRCw -EsaIsYCNmNZV3rQ6DNJE8YCC5C/TDhyin01wEEUNJAIH2POJEyiSuJegmK35Uk4m -Qe4qBhc3jM7mdPiUPsNzgxH35L924jhzjh0ZonYN3cdi6mHoUnDUb7DrqHWP5yOC -0m39kKHLnH3jWFeRvwYiNWVu5D8PKcETQrhkvmwM2ECv1JhYGpsUgDu6SJSylgvl -IK1KUE/8Q2oX5vHLAaoe3HN4VUQqsnW7S2Ncp8x6vdCaNYVROre9zGxur0ibzGQm -jzRhC/Yo6eyP7B7IEjoATNQZ8TuXXPgkfRkN819YWXY/YfqzCaP0HGy/dWjc+So8 -C+nFsITjJYASkd2zCg9BkNWiFxaMlYLc2F8WwPLwGV8ZqAYtdem9IX+LeW3feEbC -e/sWlsWbMJA23X6+5hZcxJRzi/J5qzk2Iwpg/jmaTak9vO3pkVbm94alteuewQY8 -OZVypK6WvY/vdeVQYgeqL2+ra+ORwg3Wumtuz1LFQqwvUEbLtuYicV+kLAL1pZTY -ghBICgBtBqkV45c5cbEUbbjrsVcgg51J1n7TC4cZTd8CAwEAAaNjMGEwHwYDVR0R -BBgwFoIObWNvbG9ubmEuNDIuZnKHBH8AAAEwHQYDVR0OBBYEFNPoa7p0ltnw8UKu -+CjgOkcSYyaYMB8GA1UdIwQYMBaAFPpKGyjeoaBrRvUK7DGX91sfsC8aMA0GCSqG -SIb3DQEBCwUAA4ICAQCNyyBfb7poleEHzW9UVvGfZcQlLLdiGmTUX0rFWiva8Tju -r7rolKw/Ai08Wt9bT3qld1ss/gWCo7mRjpXLCPgCV9/De5oWhwH+n0dztOavDIi6 -50Nkg9dIrthiHDBrAU9Z2DuecB6R0h22PKTz/rbxAIdzBfKSnw9AKdfPQGR7LKgy -ez3NATa7Ul677FWyRNgeTVajEHIkrPk2kaaNV/2vcQRo35u0p1jOmM2Xys2Qgrfx -YhY3ysP7ZncjVeg7DYlsJOa13vHrkHr42eNpglcHLqoGnZ2wriT2V8Ca6WZlTKxn -LgHc0sRF6GtOLtRJNrhXgmMBtLBzAbK77qb9m2OhHcphAWQKpnaqONXmrHTbZGxR -ct7ZoGZj3XWYQmAyEmS788cHW9sMx9Zv1888r7V+E6mh4UbGlOo64x30Od43RLLH -PmEoO9qIGx6epNbLz2UqP24oJM+82XVbEpvkg3mm6tYZXKVAW0eWpMJe7xtAlO0L -QhAPcxoA8HCd/TeMzqeomqgUY97IDH8buTK1fuw60jEl4VOvZNP3DA7eqjEkrLYC -xNmXP4OBgJU1wYv7VGVagwRJf3g9SpE231kdEOIswBGX8qQ6KBGmqbu8LPgKwMQr -P9WQBbSWY4m8Hy/ENQnsIPZ4JlRIXcL5x5KXAf5LPJA4KT1NBD5jF9mYTKRf2A== ------END CERTIFICATE----- diff --git a/srcs/requirements/nginx/conf/mcolonna.42.fr.key b/srcs/requirements/nginx/conf/mcolonna.42.fr.key deleted file mode 100644 index 6475da9..0000000 --- a/srcs/requirements/nginx/conf/mcolonna.42.fr.key +++ /dev/null @@ -1,52 +0,0 @@ ------BEGIN PRIVATE KEY----- -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 -99QtKthw4Cvq44EJOzKZsdkAy2GGHjM= ------END PRIVATE KEY----- diff --git a/srcs/requirements/nginx/conf/nginx.conf b/srcs/requirements/nginx/conf/nginx.conf index 34dfca1..b93b327 100644 --- a/srcs/requirements/nginx/conf/nginx.conf +++ b/srcs/requirements/nginx/conf/nginx.conf @@ -27,8 +27,8 @@ http { server { listen 443 ssl; server_name mcolonna.42.fr; # TODO(any)(nocopy) - ssl_certificate mcolonna.42.fr.crt; - ssl_certificate_key mcolonna.42.fr.key; # TODO(any)(secret) secret? # TODO(any)(nocopy) + ssl_certificate /cert/cert.crt; + ssl_certificate_key /cert/cert.key; ssl_protocols TLSv1.3; error_page 497 =301 /497.php; # TODO ssl_ciphers(any) From 7423c30a36190ac0021d849156febdf480adc5b4 Mon Sep 17 00:00:00 2001 From: mcolonna Date: Tue, 17 Jun 2025 12:34:27 +0200 Subject: [PATCH 22/34] dev: clean and 404 --- Makefile | 2 - secrets.txt | 2 - srcs/docker-compose.yml | 48 ------ srcs/requirements/mariadb/Dockerfile | 1 - srcs/requirements/nginx/Dockerfile | 2 - srcs/requirements/nginx/conf/nginx.conf | 4 +- srcs/requirements/wordpress/Dockerfile | 5 - .../wordpress/conf/wwwmore/404.php | 143 ++++++++++++++++++ .../wordpress/conf/wwwmore/VarelaRound.ttf | Bin 0 -> 132204 bytes .../wordpress/conf/wwwmore/wp-config.php | 2 +- 10 files changed, 145 insertions(+), 64 deletions(-) delete mode 100644 secrets.txt create mode 100644 srcs/requirements/wordpress/conf/wwwmore/404.php create mode 100644 srcs/requirements/wordpress/conf/wwwmore/VarelaRound.ttf diff --git a/Makefile b/Makefile index a454cdc..4aa5d62 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,3 @@ -# TODO(vm) data is supposed to be in $HOME/data/ - BUILD_PATH=__build/ DOCKER=docker diff --git a/secrets.txt b/secrets.txt deleted file mode 100644 index 4686533..0000000 --- a/secrets.txt +++ /dev/null @@ -1,2 +0,0 @@ -# TODO(any)(secret) -DisIsAPasswordForTheSA:D diff --git a/srcs/docker-compose.yml b/srcs/docker-compose.yml index 34e8965..9b5547f 100644 --- a/srcs/docker-compose.yml +++ b/srcs/docker-compose.yml @@ -2,7 +2,6 @@ name: my-awesome-compose services: nginx: - # TODO(any)(latest) no latest?? build: ./requirements/nginx/ ports: - 4433:443 @@ -38,50 +37,3 @@ volumes: secrets: database-pwd: environment: "DATABASE_PWD" - -### services ### -# image: -# build: -# ports: -# depends_on: -# - ... -# ... -# | -# ...: -# condition: service_healthy -# domainname: ... -# env_file: ... -# environment: ... -# expose: -# - ... -# ... -# external-links: -# - ... -# ... -# healthcheck: # Dockerfile -# hostname: ... -# labels: -# - ... -# ... -# label_file: ... -# restart: on-failure:3 / always -# secrets: -# - ... -# ... -# volumes: {out}:{in}:{rw|ro} -# networks: ??? - -### networks (list of networks) ### -# (services are connected to the network "default" by default) -# (see https://docs.docker.com/compose/how-tos/networking/) - -### volumes (list of volumes) ### -# (there's nothing useful???) - -### configs ### -# ??? - -### secrets ### -# ??? see configs before - -### diff --git a/srcs/requirements/mariadb/Dockerfile b/srcs/requirements/mariadb/Dockerfile index 0e42e8a..475c0d9 100644 --- a/srcs/requirements/mariadb/Dockerfile +++ b/srcs/requirements/mariadb/Dockerfile @@ -18,6 +18,5 @@ EXPOSE 3306 # start CMD ["/run.sh"] -#CMD ["ls", "-AlF", "/"] HEALTHCHECK --interval=1s --timeout=10s --start-period=600s --retries=1 CMD [ "sh", "-c", "! [ -z \"$(netstat -tuln | grep :3306)\" ]" ] diff --git a/srcs/requirements/nginx/Dockerfile b/srcs/requirements/nginx/Dockerfile index ca58b5f..68ae58d 100644 --- a/srcs/requirements/nginx/Dockerfile +++ b/srcs/requirements/nginx/Dockerfile @@ -9,8 +9,6 @@ RUN apk add curl RUN apk fix # install nginx -# TODO(any) installed automatically? -#RUN apk add openssl curl ca-certificates RUN printf "%s%s%s%s\n" \ "@nginx " \ "http://nginx.org/packages/alpine/v" \ diff --git a/srcs/requirements/nginx/conf/nginx.conf b/srcs/requirements/nginx/conf/nginx.conf index b93b327..534f3d1 100644 --- a/srcs/requirements/nginx/conf/nginx.conf +++ b/srcs/requirements/nginx/conf/nginx.conf @@ -31,7 +31,6 @@ http { ssl_certificate_key /cert/cert.key; ssl_protocols TLSv1.3; error_page 497 =301 /497.php; - # TODO ssl_ciphers(any) access_log /var/log/nginx/mcolonna.42.fr.access.log main; @@ -45,7 +44,6 @@ http { } } - # TODO(more) error_page 404 /404.html; - # TODO(more) error_page 500 502 503 504 /50x.html; + error_page 404 /404.php; } } diff --git a/srcs/requirements/wordpress/Dockerfile b/srcs/requirements/wordpress/Dockerfile index a16d922..bb99608 100644 --- a/srcs/requirements/wordpress/Dockerfile +++ b/srcs/requirements/wordpress/Dockerfile @@ -12,11 +12,6 @@ RUN apk fix RUN addgroup -S www RUN adduser -D -S -G www www -#RUN apk add curl -# install wordpress -# RUN mkdir -p /www -# RUN curl https://wordpress.org/latest.tar.gz | tar zx -C /www - # add config COPY /conf/ /etc/php83/ COPY /conf/wwwmore/ /conf/wwwmore/ diff --git a/srcs/requirements/wordpress/conf/wwwmore/404.php b/srcs/requirements/wordpress/conf/wwwmore/404.php new file mode 100644 index 0000000..145a146 --- /dev/null +++ b/srcs/requirements/wordpress/conf/wwwmore/404.php @@ -0,0 +1,143 @@ + + + + + + yippee + + + +
4 0 4
+
4 0 4
+
4 0 4
+ + diff --git a/srcs/requirements/wordpress/conf/wwwmore/VarelaRound.ttf b/srcs/requirements/wordpress/conf/wwwmore/VarelaRound.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9d018125142e6af42661b072a7443417b5ef1673 GIT binary patch literal 132204 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�T)q{6VQ32UhFw9vn3Qkg?eD=8Z1 zki$yGz)vhK8}E=l!;2<4#G&&?jc|yUM~*0Uh=<3FI^QAIj2%<#5X;7aUd$LbW;m^# z#)C1u8-$VK7Q;r{7w|kdN<@o9yzfuNic##;0foPb!U3!qC-L6a%Eb@U&fcKI6Ol7; ziL`Jr%ixRm_Pv0QKV$BmmfV3R`Ft?xjmBGNbIE4z-dGI~0Sa2t&~XiWSh$;W+wn}G zJMb~>a_i;eIX5&IB*KADZo}j05bMV*V<6TeMB@p&TLM2Jxoy%;qYS{>foNVQtjp@= zhIJfmZRTl@^y=#RX0@!QdTyP%tfpr695s*q`r7)L)77-vhQ`^dYFblujjCXOH2Xu? zFJwQT{dD$|*pFpD5)7(UDEofo%iq{P#{QS=f5848_II!&idV%2PN3Ppl~%hP5_WIK=6b5VLWtLR7ZJ zCy0q{@o`wq;-(oR#v-ogyr3;M8Zn9W0OWhKuiz`BBpG3x5ju=8!U*+Md;#cJl$Z9? zNzn{n!!E2TSPMj4C`RdX8KPKAK$`y&e;>d7eoy;t@|)uq?T-1r-4#8UE$$`;c#cnf*2Fk7PfDe6Kgz-^l(YUb$Xwmurf*rP-F*!foN& zJ=!#F8deoFsa%zazg^j}BE1EUZV%L3v(SCmD-I_&|M#YX|LZ3cw1NqoNbm5T;_R zbC)WG9dG&+_CLibj5Mb7fh@7R4(Zqd=E+0X0uL05{^5b_s4MZ~^4q18E~M<&mWDl3 z(9$DVvvUicy+b>AqPk7qg!M%pZeduNVsFzVaiAS+Qq`gi!bv=b1GI&g^evv-%Tgk;v`!f&n5JocD%bzLej2y?~n#-b@TH<{sOH2>Mw`=38|H^qn+?n zA8QHGnkvfS-pw{7Zf+KgH90 zH(h6gZgN{)1(%_?3~w%@6R1f)<)8^gDWomptJHT`8za;Y3VRF#lLi{ScBPYF|N%F#Wxd)kY*J2N8sVqEe?(^E^E->Yemtk1T zN>+2`virBo-OrO7mi0c~A?-SA?!0!nb4|G)5Vwd`V)CNoly6 zP~StZ(!#YWjFbXtI^16ytwjP(HQ*$zP{WlBW4Dga$CZv|R>>W4!wTTeY9FwDbZT`7 z>pS-VPBh@X*u(rT-~}nGB zdCyS2Ih?3^o2a&%s45I93fog*|9BfOovN48sd|}stuawO$GjpGg%eeTQOgPFYq4$} zKvxy8Liz>+`l~W*0#;uP3>NBhs$n^painmnjZ=HE-&3zW+B*b}X5#2|C~XE~BLKT~ z(G!}y8>`#bh$}FUnSm?MXi}5KqOvlp-};jYm8M zbKpWXOpQZ4S>-6Km{4O8Pg2?V9>EYb2Jt@Fr*obfjP-C{n9*X*4D5L{;t4844Nzrj z6yovN?b2VBs*#AtslKY8DpBV{ivF?)a_bT+NSMs?#80s2e;>^jAzx3`OGTm;9V!Yt zQe#xCy5vvI8UiuvdbqP!%P)TE7fLU?2Svk&$X_(^{mAOo>>KL~3P zf@KK4eb5;zB)VV?!Ft?P#KA&-#Tu1b*%eovZdjKPF22U@gB~(M_LRLa%GIGS^p*~+ zrihZ!GDgN?4{tnHSSQFttj_NvlVmdH2dOem(oW+f@smu)9;-~5C9|=@CkNkG$dhCV zuVNS%6jj=b;x4l7(oORIIE?lOxybRj=gky*u+IJ8aw2wlRAQgUh1h#A9Xk-FU`@qavI;wlr^*`a zov6d!iRsuqF;iY5XUTf3^q-BD{SC5F&Jj*rzrMvPlN@=eY{D*!X4xX=VO4pqT!2+N zpJN5eDY+P9%~E+8_KjVE6&!h(7yLyo!_MX9SksX&-o`VscjQW}I9Y{V3ac?rT`SjO z57v5l9mc@xX>OR<*!evFELmk(mE$HQ3F{|N2|Tjf^yDAu{x%g3>j0ut5|@$poQ``v6%NlNGuuAluazbjtIN*7K^Ye!Wa7@{CQ_Y zkP61?`c7D1-$jLrJFtRwDfW_gQ{i}BJr--O@U%j8S3NvETTGz7Exu6E;ur4Ud~YmP zszfod-TiT2jGULLbgZ7s5LaSF)a4j=vN0y*V!X=7h|(XUO#w!tff%IEao&nPB~L#kYC$2c_vW7sf^ZzIG-7=sR|k-U%S0yRdB#W=T9Jgdgz3Oy0~n{LB+ zf2*p*exeI8Yo@(X7pp2&jlEGd7#-?xU7wCC%uI|(w2x{w_ANE4IoL_n#QPXpFb|lI zeNYRri-Gns(5{Bdu|w%fbrtqtEmK#k00c7Sf|$G+8c`Na~Q7R z;ke58z+HS#?1b8YolqNj|HF;g4RJGeLEOqaAZ}B)V?V?l*bi|RW+{KeZmE0Keb~|U zfcm?75IeaZ#$GO`YQ^4&M=`5;9Q&u9RNJs?V!QeWo^kvWdncYzJJqweW<8BPB0pe- zR3}`&dttWncUgcZFE7xeH%*c~m`*-DEG~ z8nz2}Q;%Us*c155%l+a3u>(7*yzpdVw|YsvtX{#ct=DjEd>wnd_F!kno7j2v7S`H% z<2x7D@+1*xc1SKv}7$sOSL}t(Q>ssEnn-W_16Yy1=@MqKy8p#XfK-DR5!2A zyQN`fMp;pr9v0^sVY(4!8ez5`7P-R`12*W3@(s9%!t~5^BY%-QWIjmG^e&oRUDMRq z;9b->y|JNgmS0iR%!cXJH7(6`-bH14$RefZ`&)OAVmCp4^&nU^UmvJ@iWlXF~nPE^B8?`PmYEfcHTVm9@ zglh|_v;E526`xU7Y*e_|UEy5sGNWQFeTKm@Bip-7uc%&hafy8}OX5G+Q#rjxnVEir zEv00p+lEZ7Zql=67WofppC_X%GuuA2tr;PxAyuZkVk})oSqY~DU*tX1kaDOlm3?UQ z%=+3o|6%Ppr)Okw1)#w^`v`6o`-nCT0$Xew0aZ$S|bNF=~%x^ed6?{>Unkkl^&#?FW+e1@@#u0ljzCihW4`zRh8%4 zCoy}!NtVvpFEeB)V=f++Mz5jp`qWS&Fv|#y4p8I{OZD_3gTAPr z0dr@7#TogF+#&NpdX{&!p{;6TOs)2esnvBRTS@QdU*pk(Urk$$?6qwzk3rNBB%LdO zAt2X|x5>Cx*y~JG83t9cQOy!V>=Hw~5~G?WTs?@H<5$;Ko}mGwhQ;n0=6Tnd+dacz znUUjN*KQEyqSG^T`q`(mME=t~wIbH(8JSsr(=DZCX4qzU2Ge5y8SV36FwL>gY->LV zY)F?`?mLqk81KP#x!uE42~&Ww*n6fS_e^70o!Mrg>6ux1{+F~b3j=6gz%0C}uWP8U zZm6AEW3T5{ve&mM7$haOdQ?F#GK*D#wlIXsa*vQ%_6E-C-%w3okZfw4Go#MlU}BTa z295F6J>KSNb#3FUdqC=EZ)~eM##y5YOO3)xjixL$Sd{9*Wa@^3an@+REO*lzrcqMv z)#w=uN)3_A+}sSRQp14CG6EY<9}8fFjb@w3F>>c{Sr})F{TojkXARETx&dcqmfGsNw6zGxjKa&@VV+luN3&%{@#RMGWo}Iy%*x6G zTTa(3^)9n!^N`CJWm|ZZZE3UNjIz9b_W8P<&G%H^cYfO_J6|7V7kZGo-R2vOTb^TI zXdYz^-Deq!D(`1s#O(bRS$b{1tdNKqoFHAlz~mU6C`X^nAe}Fj$j^-lm_xvP$poxV19J3k1lY}&`!HY*LC=kj zkgsn@*RSz8dN)hYDdS6Vd2u#}fQ|ZQ8}-$vK}a|1nQhclzrZ7(QBU0zLC5t$x>2t( zZd$;46X)nt0Ki85bYq3yje6;W2VkQfnJho(jr!|T2Eaw$i|U#h)9R<$ao<2e^L&DQ znrC1fMZ|krV@nfG55xyWyz4Z|sB!^LF4 zD7MJRrVl)s#zg{Qj!)g}In4{fff;0E>YB?;*LzTUagKfV%m%t#&8@3xY^c?#^vhCa zMneVT%F<1(o0Ej_b@1w*Kh7?~yc0W@aY|*EG(a>dT`t#SEHaf1S1@4J*rxG~H&hj2p5nqlQ`OMZSD( zG3CwHZ_=W z*$i}Urw}vV)J{;136r50&dSfxC*tWj#YQ(OHU@a3Bj@NH8F+WM;*JbhH^UtLz6G!` za2o?bj`7GN$1t}X!~AmerzYt+C3%J+f{<;P+8}ViKNv@;Y2mNb7J#I<3PM z>9h`4ICvdyI==;^^{@EI5S+~f(|b8HOkd;13ej10O%0-u{r>D{&aQ5nC6Z>(nmr58 zG%1%Cp0m;#J)NWemWkdp(OWVd!duCU-!GWlH(EQamdpKk+tC?$=nLO|$R+XQI1GLW zp3=&+os=)_b@=r4Z#NYnyg9iHsk=axh9|fW#!QQuh9|IF#Dn6&v|HfcA~quB!Gy_p zrnwf+PU(LYcDl~PD!{c^=U5A9g_uJ5%zvb||4Xr3TY-{xYm3;Yl?l7GIqZ|JcWZ;$ zzmWY4*r!z(yYXb1{JHG^4gO2&5sqKS{xy(Wq#pk-+`#JkZ+m)8UvI}7<&;;?;2uNzx!u{m22bk? z=nc7)@pxaUASEmgR*si8iNBz1tc1kdA<*DW3B7U0_t|OfY)avub~2^E=*Wo_*utN5 zG9?;3&+X1F_t|B@*XYcvzR*rMrGdY(--TDob>)?EJ@|Y3v3L^@EmH9wAO}|7wz?tN zua8~$^m$nX$Ww{1z{JCeUqQe8ON7O>gK_3WI~c2B+QEe1W6E#E|1aSGCI6Q#@>BiI z{H^uhWudp?cUbV-EU>jatb$2=(5-F6@3FvJ0N-N5Zv?#71Y`YBJNPOKO!P}E^k#UT zg?^3&z65Zsow_-zYJ`Cm8X-)+G^XMvvv`~=Y__D^skPVfUJ`0jJyZv+0O zgbkFRawV*>z{@T073Y8#S@6vk*ovp}8_rVx3`>5id{ZrWEC0#BPoSFVzl6~ico^VP zHx_Y%2b$pggv^8#BX2x~37Kwe0^kHkdwhb0p5Y#z{0xU$U=#n-@IffU$6X@g1S=05 z{|gpNo-n~jE$~4LO!S|d=s)fN|Go)t{{0@3^`KQtEZeL#fV`qn{KIZbR^}+Y^+tt_F|KoR}y}tD5lkoA|J+KuY z|FDJL(*I8@->To|+RGDv-`Qc3$NW2|{8s(lY2m-w0$cUF3H4v^DUth|ssF{V0)CkZ z5Bbdci@yx`1s;5SlLfA~z(haIL|@ebev%1q|!&V>&&-gpapdV1u0-A9u1n-VDbbk2@UqRos3f zi-_B6f#0>jd(HvBY{3)%U1#CH!%B~H<-T%DgZN$xd>rtuv*34F=wG(L*7{lDZ5Da9 zTHpsQu(iJTw8tlI!AN?GNnXHlW_Y6oUTc9@SYQjiwZFw(1^OjaUfewP=UCuNEO6~P zVB$CBEc_}g`NvpbEB_I|mlHqz7guP3`&-~_3rzXb+_~MMXZ{hF2z+#0Pd6qm%mRm4 z;EwQqXUT7+x5Bn_@F)C#!{1U~>~EIxsQzc+AB*v#oqjC(h{f1q#>XCN51*!AYkpiS zWB0kWkN5``_-(+ioAA2y8*Nv!D}pd z6O0_Uxl8B#%Sk`6SG1)qvcS#fhGQE{`Da+@t^5e@XQH>_|0q1wQl3>_s^8hln|zM^ z6D;`A=YUb3`4?-IXBb+b)I$+_H(;YZDK&QBIpBN?KGOnQ^QTzw@t*5%tOGc}?&~ST zJOvSSn#nHc!&jFU@6b4&qxbC{2VakG5=z$Fyu4;VyxwLw(t+Iz*c?QQ6Ce-)5g=g z(Z9{(s|AieDMa*f4}<8#7WgX*O!WKDLQnX;CVWTv&G>ggzsE%XvIX8{fp=KoZ5EjL zZ8hRQzo(LChf_qxvFbf=Ffvxm@z}r0hqJ9%1 z>L(L?%mN>>z+YP6eHNJbeQ*|jZ(HbJx4>3@yMces#P4Yf{KPq6%J1~#*JGafQPcxy z{}f7%x;yGN_3D?VV&c7jQ4f0#zzf6GAwS z65esp@i}}e{4vtrXZ)LvR}r_uFCc9vc`ieI0UY`~Y8LOP?*N{Lv?|6ga!f+p3XenDNWwdYIEvvHz~wUh zrX#%rI0 z!@yhM-d_Q~A8v2&cYE*Y{qp}D-UZ$}xco)Ew;^tUC5(bEBr_41+8Vl`W5U?_JuzM+~H$SExwyYzVgOCY3Xutd_DPcx$6|u6U`?w z1Mx>)zrfFv`1TL>X;XTmcnR?=ruV^)af$uql=pmzRWdTo^(*}ToYGe=Mx4HF2A@+R zQ+>HAg7IAytuXqGem`7#RJ=*w%Q zH%h--#v<=g#x@;JO5Py}^56F1X|H|}(*msCak#d~lLz(83i`M6y z!pRWi(@LgO%;6N%1kySu8AxlMz+c0Z zYZOtgVahd(UBg&kj{9;vLn{VNh9X_k|c7D${sG5uAnnX4!T=jkyAk{o;HVF}dFda;&zQQOI0 ztbtyvfrnX3y*O_H>!E;4#B~epQm&W9*d*qV#2k{CLlSeq6$?C*n1;T0C~^KgN%A6N zU*nV)Ii(w|ACui!wr(t2HJ7qW^6X|%x0Qw=A6xx+1krQ!}QrKTQ--K%`#^*|61ly%eiWqLoL(SGG#4O z)-vU2j*q4|PLUxwCv*BHZ6`|E#QZmLiJQ2-n^*&znExi`wuxlMsWE6Td=-M~xPh@7 zSpE%M`UWn21JiHd5;rjAXH5ASr+mgKLpfzAe8#S3{;QeuYUaF}DOaTQ+~iH*vP$e>J`pvmLX$r{z2NcFbq0hkOd(>)0s2 z!?!Ko##g%DQ+wt2^fe2dl~e|G^#9WiGdiL09UrsPB)&pvqzTM?{;adfXz=NIPUi(W zazty#SGc?pKX;wZE*EA*G{2HQ)YkYK5nT;;lg)_T+_QFb`fj9~*H8Z>=t~@aq8rxF z#^NM9S~E*uM#Wda0^UVF=GtL}8TV6LE@o<;l5xtwv9hzy(auS~SnE9FWxM{62Q@WWa^MNki z^ll#3(3;1Jcf&X*{&jb}qmaut>ANEuciP!x;(DVjw_I(yAl`oX8^5#hFw^`VIyb#L z{4;sndCwMF`MT>!dCc*%@%S@1;%&7TF4NLpzek4C>OgI^-L?H(a#{1a>D_(C4ZFiL z$zn~n!tVU$@JwZ!Y5q{$WQUZGZPYYgnRU%L(h-dh?y=1@R&ahx-y*s*>cw0RjT5Fe zg4{%7jS z?X$~8Pq_GJwGFz4aT@hIlT79~Wi;#3jdS;9H;%5!E~m?>mt@#s2e#)f&rN3z-Mq|c z|4p20WsGkfmFw0i(;4+Qr%~A*T~FL~|8Hdby?NdGW?9^0=kLvY4!SmdOMI{MGkE~t zfBXjDeLN&y`qvF-TE1m?4ZbaS)-MZU-rWnO ze1?;J56A;J)B0=qHBKb{Mt&o@q1112iZjkp5H^&4T!f(fA8{A)Gwz7OAjc^YEPut< zCWE9)xhAcG zASB24aHpwh_|D)=HB)p)9p)qD8ay!yg#7m+e!s$#7<>ouN$j^(I6aso?#>d2vBV)P zaaWc&m?hR&;vnek2i)(F+%}dwl;sX&xdWg_1AJORQMpZY;56iTzn(T~>uVA^rQ+LAb-ksl9OJ9sF^20=M)xMmx6u9wq88KO?J< z2iP`n#sb?Pg=Bkt=M+Af?wmSJroD$q4&h-<+KjOK*aD4*D zcRsEIuFpCBC)YQgdm%~z#W9rgZx_Cdum6bBbqo$1;N#sAxc`WAx&>7#vSqGC;03?y;YI_IJ8YVJcRID*IuLLcLDkt?Mre!N1R-5 zvo*Zsddtn%wafLk9*2(iaV(sC*7sq^eTZW}q2??*FyBFwY@I|m^tY==>1juUl-jtFJjcSU=5bS z{3AW!*I7@4o<0B-$;j419NO&hN7T?W3t+3)bG7%|x0_+tWIb&;(8qqEJg$@amEM51 za@s+wgrMVIi13K(2-D~?69+>Bi0wmvA&rv6Ke`UO@OIVpAyYFA#oRwwi9RC09`v7~ z!N+k;-tKw?w(vA^Lw~NnL+VV|4sd+Q^%b5MB=P-v4-ueS3ra=5wuoZsYdx zxF6T87{a@M9(}n}&K7#w>hyfNoe%{(8ab%u)EiiDW*N^|2B!$mE1O+TwmZSeHhmRy2c;ps{oCH0hA9T1+G2k z`gv?cr_?RRY#Hu;b1qJ2!t?d|C)by_GU;_c$+f3z?N5})#iJv~P>a*KxLVz5(3jEY z^wx4iZv3AQdB*Y`w7k!KrE}Z<@8kK$sLedhnl`8Z7jg89-}iH^Bsy5$Yi@e0-MP~{ z4qZE~>8@pZig}E+(wq%;y?8dP2Y34X(S!5EJo86A?QCPMYo94!n?5{g1_$)QKmYsv z_DW*{TIQ%lk6oxnH19HvR-ta&Giv82ygBbF8XrMznH5o*=hv>*dpzmwV}Had%%h?? zZsFKAV=|{3SN;>8xmX+aciFVZj@|h%xA`99&P#CbK^KQGg1(ON%+K`+bodoU+-L9| zeEQ+Nnd>8pU=$@C8}hmKK&v$3AAxL9jHf5VU$`D~y-M_S*X3>taQgyd@l!;l|MaV7 z`%&1{s?Vg5m&ZDc`QLjeFdBpydEYU{!mgmioDIHdmg3G~w0V$`hua!fa{y!iVO$x$ z!&TvcafLYQdI>xZLwd|KU7O8w7CpDY;~uJy^{QZ|I9uHFeCupf=fL@&1OL0wp8G8# z*XQASM$CA5u6;V2_IWs8+YAY#q|uX%`LR9+;JL}^oKPZJ6TOZ79Y5Ds9wN^b-jnuw zW3VNIlWRBSLHpC)=b8KUn;`09<&K%^=diUC!ofX(?wa%`71S@@W{Y#2mdCi;6YVh2 zb5A!VWc$gjcYQ|T`WXE5d+m?h;~cEBP2+k_vP9SOo>XXG;dzS0S_Ldp#a#=XM_j_I z7pCA8i)x&5IUZ+RHsZXKOU3Pg?!$N5Hi%bnLdzpKHzpXT{?K_rhh-?<_#fpJ3Z1Y% z;X)aWb9Sl#PsNEe{c#4(8*(L9BkaY>gpcJu`2fyYiIxx1*`v~llbRCcR-EIMCLhJ= zCe?Bq&NP`OpTT)1v*f?jY&9F}uo_jP+>NJESIL*udbL4*$SWE?R-4o&`3X)Txdo?_ zZB~E9YKPm^9r6pDK60P@ik_>O&zG7|^X`JaWkzQ) z_rzb~ypb3@i;IO8q$m}`5Fd^e91>@ARAJ1j#wrepRU8Z9FA|%9#n~)~-;Tc~w&45^ z2_0?4obgforFaZ~4J$nU0n2z=ya^kA3x9`r8>e!F;zW-B-~^=)pv^#>{P;EK4@!KS z4<|I?q!OI*hx0bE_9F$)DpMuS@5G9aY^3MPeE4+oWH5BwAJ6{=;LN08Ss)7#KTn>A z_&_-j@j+Ns7L2taMTi&U{G?!o}=D}6NS8Sp3pAg zE1#Foix`|D^akSZ;H)4U&I$SulzVX|tv}8P`Uop5KE_$7!F(oQ7*5veEqcKw;_$q* zkLrVXvPwoAC*Fw8bmonS#HlwIBR*A4#WqZOz8b_&D|^FMX5bkoJ!Or<890}Kre4*H zZa4?00sb5{2R=Q04Z`a-4BNrKi5VapKKRJS%=)Jul*Ma?K0)^bO9Z0SBB=Bf`{c z>UES0tA%YSoEJm(>dp3QXM63=_8N>{OQ%zo;GfL)YJ;Ut1+E7F&gj82;a`HkFYLD- zaaxCDL!X`pe?I=cI9X{S;+yfe!>0cV?ziEe!`2+g*4&-#I1F~Y3wHcUn>8n~HHWh` zXR|d2!H(%p}cwe@7jV)edi}!`akHnd;qvSZ0 zJ{~89`C=8-M8wJN6^&c)r^=~F$LU~**U9CO>KgO}FZ6_!h*KZXxDRyUJ`f;plegg{ zGU^F^xhHf&PjG_fN%RMe`-30%hZOD)e%v2?(I4JLP2ZF6p{)0DlBz$Sq2-G+v_3?f z`bj75A->#0x?$9Gz`mmt&KtrBbkVS?coi?wXat4rCaEM~sn7JrX?ZEYrm9q=Q~&A8 z{U?$8Pghl?s$pj}sz#)8FACva)Q5XfB=@2W?nPa3n$#@x4UEC?F$Tk@UKGN;s4MrP zXzoQ(+>4^Q7e#R|isfDu!@Ve$dr=JcpJ47kq1=Chx&H)m&k4pTev?S%{u7KdrEWq0 z-;A>@I~#rJc6B>?8qSwOpQIj@#62pA-%5mVkBa0T)rb31CikT*^&-xKvT{%13FIgaQpKyzt8_5Txkl%#1Jcs>G|6BPTX6gyZ^*{Lg?)QDw_l2|nJu;C-e0So%-S;uC za_u-;>vQ~9`OWiv%iF*TsV2;c?aXn?czNiPyWLr$tOILe9dFXK^{H6;Su9o zzK$NoX_{%`2>17++~1FJPye2K^l|RdKXAW0!9D9oI<-yw%>C#T_nlw(YV<4j9hc~f zog_a91*gH;;Jo1MaNck}aK3PUaQ<)saDi|^aKUgPaGl^f!*ziRh3g6z2G8z){s^Q$0_l%H`XiA32&6v(>5oAABar?Gq(1`bk3jk(kp2jy zKLY8GK>8z){s^Q$0_l%H`XiA32&6wEdcj4)^@el6MZrbG#lV%qmBE$64Tc*6HxzCd z+#zy-UKj`qr4aI>Yn?a>A7b#nnRk=eM_^tN78CfY41z&+H3jP_4>y4 zdVPBh_~3FlLmMKodbE;l zUS8h&8%neDO?7wGSKs}8Rec-U?Pw>^?m&Ah+S}0Hj&>*7U1)cs-GlZHw0EMt3+>%# z??Jm4?YGe0i}pUW_oICP?Sp6^Li=sB52O7K+DFhniuSu`_o00p?GKkk?NVd=i!jGOR#Gg=X?gw}%Aiq?kKjz%Z-cA|Bmb))s5^`iBm z^`i}-4WbR9mC@Fr4Wo^qjiS+6#N%iaXp?9av?;V{v>CM5!}wPGK8H4swhe7N+77gx zXuHsMqwPW4i?$DKKiUDb1++!9bI=Z=or`uJ+7j9YXcwYggmy97VYDM?m!KU*yA2j&=jujcEUWqL7baJolp!r96PoPoRAg?NeyK zhxTc-&!GK2+E>s(P4I6#%(nb?7tM#}M+=|@(L!h{S{N;Y7DbDp z#nBRINwgGN8m$2>gVu9f_4<`Qnbs^E=Rip?Mk$((5^;%3)(ek*P>mAb`0%$wBu+upxuae6WYya zx1imMb{pF5XeZF_Kzl3N+tA*Qb|>0hXm_K%6YT+T-Y3vLiS{Y9-$VN}+Go&yAMLZ) zN%=Xn&!c?-?GMl%MEfGzm(Wh4J%sjUw6CE3A=<-ekDxt@_Eoe$Li-xpAEP~n_I0#B zLHh>o|EFl*MEe%npP@aD_UCASf%cbZkPeKb!*|iXhxR|v{u=FX(0&XX&MZ~lxBPQ1 zSw4hMUAlmdQgx~%h^8epa0rZXK(-`$>jQTW2eHx=ajZvS*s83_mr!nf&81-q4`ZPv;8lygq zQJ==BPh-@lTY4sD`qm7DSX7ChlreBOpn%obHZwVuzR=d*bJFZeGE|9Tdl zz$B`VX5fW>2j8%}2QdJ6G4PwQj|abnSOue`gnvRVxS1}6go|O+H?h0%He-_+H!E+Q`1-}T92f`HB zl=#=x%m2oo$7^ro=W&$`e+ZVcyovoGstI^5Op7In>`{GA?rn%Ky|PSypRZ-QmT$xN zztdw^^jVADFJDd(VL%?Q!RWjBKk*Chh&-kqALhSn&#v8{qG0r2{k>|LZ2n{2h|Rrg zaWUR+#a(n*{k;WL`|WZ4o5+NUzdDRQmnlZ5{iT25KPI&p?-VZ@ZyAQq2479ozKQqx z*4Ivnclq7|f9r(y4qtlL?xXN}C}JQZxb8V7Ch}sP+>5nn<0CKDt&NYoSSR;lE!tRVl#GwkJU&rV=i#Gd+#h9iVe`Y4K{fVvr}GaI}o}KfF7D=EQ$z@=eRf@v9ZQDzRT;7my$QBT^hO!*XRH z6^}(DVb!k4jP~DQ8?bx?5kE=UFDZ(2$U?8%*v_P6A{2Dm5bE+-ZPE7rd~q;1Fw~#x zi$;QBTR|!3lyZp$?Mkk+DVoVd*;}HGjnS{(SN)63$3DiczyE7&_`Xb3-bv6iUy5ef zdtN*9k7v$QZR|hKRR8WYy^W)9`8D~g@;BhWq^15!PZ}?JSMYFo4)ekrKa@)#VY=o~ z#3;eg+Qy_*G8PSouq7$M5;kYFJ%%w2l+~f3{{FsbOvR*Zg?y=$v)k01awrnFF54TT zu2|Z>Y>h`6JyX>`nDSiBe0N)us>35M1`>(Dna_9}YBGJ_eQCT^eim;d;bT&6!|F0% z(5^V?z4r$EQUi{6&zs=iG~itZd{O?YqW3S!FA^O0TkE=R<2v9(dC9n6PaXU(4R~)I z{0al^se{+X)n~wITzdc7xYoL^-?)y(^|bMvfjW3?T!VG+8Xna;_)g6Bb#Hx*TpVgGM$m{aXfx z{2W78jU!%z1j)b$T94hKmsKv=$Xxa=W^;m9!LxU|!M0Yse&+=E)@o6#N4?DA!Lb|` zM7Ld%)8=wsBH8U-^A4YEvvu3Hb+l(2!zzukTo2Y-()Fwk6|gCY*6Q zVOWIxz!4KTDuc-(dBS$!!OlVatF6>GG&oQ!+o48FO=K7cDvIu?sW(Kes9@k`GUB#RPN;0;`-CC)#G>-nR1?i z*?>lS^73oSKSMgVL%h9z>&ea?2Ofs}v$DAqK5h71;J``?NkfNXIf59r-RiI(aWYWo zAub&yt5sUExrB&JRXSe3tL=~k{Li}}+aOUFDk&WG(bd_}QfkUIq>}M)DCmcHMf}ID zi`Stt6G9)dH5Vc2U-u6z#URMnruGL5J!;BkVZRk@V9$gSiBR=pY?6O|lU>L^uTqoM z?;W;>AFU=x0(Zo0uw-+FA;^Y$g$dN{h0H9rM#wnxG_mM#j{j z*uZj}rV2shU-zoXr271o*NhdLCX4-VIrs6;Om0Zet$*~7XXmr$?0YP!%7@g{MLQ?9 z2HhRgT_X#og$ShWHj|{$%ttU9w zSZ<@iFJWB=<|Pb%i3UGNny)F}*bs|^0!}+E4hL(Vk1i2 z0>Sa23qOAF;KwiAa(S1_%~(`*Ia>CN9=Ks_?1lrQds-YWHHxURtLt*t{!d(W^#l8x zlGdOv5Vu5b<7XV8HxbE`%e5e=z` z3K|HpptX($X!(6|p`ITXV{lh#NIwJSFLAcz}c-ud^ zo`C!6;Dk8=_v-NFf~h}IKkfs})?Y`|FRt_G*YW3&T_@muIvkka!tFYOlU*n7x7Kz2 z`gQz%WY>xN4b;KOt`qRVIyl*50-5QidLJ&dc?u(PKFFP8IJNH5HGAp$YfIA-3%sVr-UBNVLzc?AiZAyg-U`+ z{e4{>`D|lD0{&3I>##}d*gBU`3S>~`pp|uBtxj7DvR}or{FkQT{(SXOQgf?uLps=9 zFk6=}EZauZvpFQ~u{X3PYL=z3o@D!obqLTpaD2TcPjG42S!pBAmg+d$stZAbrBf`W z`+Td;4Nj@x<~unze~u0C&+nyRYseR=DT9-%FRL&pghu`ZH1dG7zA}}EHYOVar(wu8 zGUlxoo3JHJ>KOLFP{$oG<+GW1R1LZu5-MCYV;%~5LKX^HxT5t6c~Fj`K#g-ng-H)4st2`A-Mq@!+?^=}55mTGzo(9Nl^6q5igv zCFBdhe#%VVcmS$7p*|cB2IJ}QQ<0n_(WvX^PjE@JUXv()&8eC6^C!3r7jQ4mZ>jYs zNh9DM9bWwp8TirR@=H3L--kF|^tac+iQ@!3NN{bX-w!XpQR=9)l9eXGN>doQ_7?Y@)7MkJ>IsG5x-~*h~7h6rSo0F=VN~y3d@8nB;l)hD8VJ`YS z^I=ZXuIeka<}xy0ugRw{mR_tQR^0{{$ZeOIi?lHO6v^d0VrAstAwHmK;lTlLTW4EK zbD^;z8IOc9O47!?tk(;U%INouFIx4{9I~-bypsD*lE80kzs%n-qKZ4O~AjZ$WhedCyyE&E;Q9sHrFJ z!+hV*wE~AL9s|Bu*Z)O=i?xy-1Ae?xvVw{OioWQKh?PMljH1t3TN#b%FhXK8j(ftn z_H5}Tt|@om-ZsTarQH}4YW`S;)2D#@G`Jn`7$2*Edo*|n@F~-MR1NL`Jj(4r(cfl< zTNrRb@S*}Z$#+zizYX$TVJF`P`HpcMM6~x?rt9t6^#^g5(ziG+`F-UVHFz8PKV}+- zLxYb2{xcql5aS4Ga4}EPOadMjaO}=`jpY^M69Eqr9JudV9+aL3?wh3jT!TCe3z3m8 zXoH8%eL;#x_z|r`gieM!!Say)h$1GAx+TO8>wZ|M_?eV#OeMT-sfjg_vCHFSL**J@ zK?otr5Z2uViZXnteXP_7(XOVfc6%z8OlTp6{CE4?3nO7~Ok3nnc!Mrix}_nS7GZ?= z@-k|RUt_%r$$BxffHpHP_RC(6nPsGQ__7!(28>972%|_#n2r#uv54Obftq0%ZM5)c zI4i-!;byrZ22hVyoJl*q5eVRLcQR9Mq7fHHx41$9D+x%8%M+cPWDjv+uy@nBgHfzF zjpO^A!VUrBc5uT9j(OseJ21Yy)LJPvW+HA2a61R&gZ>qZE(p@efDcTNXL%i$`fwO` z!|XP@okb(u6JvG=c&?7X-}|f~cPJ^#&Qr|kW=S>XtyZt8@k{kv?4Zq+2&vAWRln@> zhms+-`Px6$cnC5WBLha4XvC1gcZ(52nDt`BAt_fuP6^|LT_K&X=*;RRK?)bgf>qbu zTrNoQ2eRmaWHXmM8wowlNqHB2p7{<*AHlh=D39RoMd?C%s&q)M2x&r3{i&ZS+mVae2#h~83s|J)(Y{Ed-S7BZFm))*=)QbmlwqP$*tXo%sUk zHF@2cZ>zDGDvzG|OEoFhg~kXfx&qW=mtRB;hi+FuPQ$J!RWNjH@IRYp6EG?;ZkQBi zo~3a!oq0hmG+w5U*BeZ`*c~*|QpyuZJFBhktn!6a(eIJF&pf4#@D)~SbPi|HirW|x|c|+n5tnhIs7Z9BkhkVjXhKHUcwmG80!vf zJ|jCgHq-5!aAY8HU_ki+=QKV~wpmFSoMy($tH%5Zzoc&jUIKjnGLKNb49ngR+Th-W z9#pd;ZffY8U;vfLu|Q+65m7Z1_7Y`NRIS8q_-M>0Be+bFz@i>iW50dbefwm2-+h-Y;`XxQQqPlu)z1U*@)ufcxs; zWRnZHVUzRwkoPa(eMbL9++Xic-apyiq~XlZsa@A!2Pf}e+;5-`PTs$O57xoS`xkJv z4o(y*;I=yWqZ+)Va5$_n@(suuvj}U9ud={VtuOa0Ono)WP3w#Ka^HkMPt11}JUi;f zLD2&-z7WBoiNrJaVwXg(bi>w@VMO3lD1{`e3!jK8BLWX#r2#gUawh_HY>7B$VBQW^ zGUBtTN>2RFg*tVDELzcLp%N?Pnbh8z?=AF3!(Q;3lw&#FbJU2Acx^!AJ8}^b*)hP6xD=3sG zYcDXz;j3U;^gkQZ0?sjQ+@E+=zyozFbE~m3t~xkb&tk>Gb#Stt1)O`C#{DT)LvV`g zV1>!<$0x;VKs`oWN6hu?zBGrrzMMh^iPBI7xK6rUM0OgX&=CqyV1nCh@)A_}z`TQL z%RWdZIbuK1`4$C6?(20#ET^rNNqs%7>)O^8@|iR@Fk4s)#d#r$V9}HzbPb7wVE#&T z-KMORQI9qax2B!Cfa0ImU6vSVir12Z<0cwGD5p4}8nWw_FSfbzZLwMihegezjPft# zq?5%Qm`os3Ry5Z8l2Zs z8(skPfhKDv))5r|WgSH^!#d)OLwenAD>Fla z#{{xUEPB7&XDf|Na$!DnsMKQj5nxyYoCm-#8%fW$08{P%AO5tpRKGo%@wpt%a?ksT zfs(Ni7kypV^IrOzhz`3x$G#a10b7;J599CT70uPjJf}?Hi_8AsUcp(U6Nn=OCD(BT z_g@7ibGSyyCJ)vmGym40dc7~nS>9LX-ma-{O}^@Vby;l4S0NWIZv)kLqeAt!Do7ex zlul$MDJf3tTF^t4P6SJIk?3|Hw<|5#DHn;PRjSgj_mZ4WjR5LGp!P$^33t!CnZqG1 zQA!e5EmRtNdzds_?wRbJY%3LzvP;Hek)RLa5?OOkosN!?$-ic7pQ50HkbNr|#8Be< z-rlx)xD&Zcukd98b#n5G^AC7f@_(9E z{dWRym1RRX9{WQUm5mnsHWzz$iY`Txj z3IQh%MZmq-W5+FYcqo{u4u^+g?oW21=&u^^#k&448gP0pX?M{-Y`~A#^?#M%pn`tb zz2lHaqta+)9kPJTY9UuzhCzQDrB6wxAZJe2y{1?YPwOZZ8yk2;37buYPg7hOQ5xv7 zLWq!0jTn=_IJ)q9l8hDKZESq&@eX$oIdff_I90-2$!}k#2f;kh7GihAARb1bxKUA8PV82nb%*B4S`mR=ci$kXBl&qt)6i zs6|WZ@Di==j#6{Bfy@gi8|>NCY;(;I7BNULATi}Yxh!f#P7&-@wXe`?QaAvulsIw~+wEzWa3mP0@l5ZQ8NHcfg3qoep!cu8_n>SbT}fKX84N+{CFMwRe}RM2f=Y4McgPS zX)B?z6s-g=LrTU&0R-qlE@CCRWFtix$p3veu|_GFZT8>4%5H-_Z)U* zXO3)O@1n?0^_q#@t*yH!*uDJQu?9E$Cn+W1 zw10=B=gRx2b#RJSi2gPMzDV=e;qY}=zmKC1PEiGMpAf+X9+iG&FDgoxgve?@QJ?ir z%K9%^z^PieUS~)OAJFe2CyHL2Yc<@P1ypByv5Cs`_#*VNJ|UpiT!aFh-{w8b!PS_Op z;n)Ivmm(33%NaabK3;C56L*TjFT)Pf=|{*;vjsap-~jA$_7!p^`;G zaV?y$i)55`*{OJwvRW|p6%i<-6a*9$=C9ZaY)5P4*GfE+@jmyQHxr2~zmBw8yX5^2 zXE@n-<`H>IV>0Y?ocUZA@o5V6xBrAEwo>+^81eG#hl1)dFer*MHT6@-X&l$eTD2H4 zJ-Wz^MxOrA(;$6OI}L*LW=X*(%cxn$;|fxK!MNqKpR+cELJii>ebyQegp;!JxFf5E zbGA=>!j`i}WAdWgrY6FHGyf@KJMq`&+?p ztdC1O0VgRa;GQ}-Njm|z)xn8x1>8Y!V5I}=a4oP>ploO^?uY8FErpQ{ZES#Ac1s0T z&@(FoW%cY8(KlrP9s7a_=c%7M6KdT1qaV4Wp`_!~DQ7$q_5J;i{MJM;;9+T&^aNCR z-!Czwa6>+K^{ML9u0SZIGH>-o?4Y9+!)|ceG16SgN4*wPzRJjbqJ-H=J46JPz=5hC z6)h22XB9Q|f+L|O{6F}CKM_ta$FGubo0i#jFX|v;)$g;OSW5MIs}C*n91njo$NE13 zOR&&yzy~-&zzORD?x}+l)&<!^d1v=sLb)xk;133#v$ zP8=%W0fGag-7qJ2!um={R5NQBUyx&_n%QXB??GY`6{xh>{oDX%6kpNfFLtKcKu6V@nc`jU@F{jvqNSh6`04OJOgWrRQed_KRY1zu_6k^v`=M!>yw zaKfvA+jTf>9n3?A%P(qh@*=*Y+=lEe)g-`!LQO(RI>g^^2RVe(fapIN)fcbe^d$#= z>yz#iTHDpmZ1!e`Es}GoiuT2dFSV+CJ*6wzZOm@i+vRyDqez(5p?e~z%3rH1yw`56 zKbf991eR)TA@{YVueC3qCE>%3bR=J?#t)Ggj`x1dzE3JQaSh! z+P8MT<=BnW>)R&N4y!+!EbJZJe2^C#r52mJcO|aau(Q+EG}FED9LLPC-zi4}DYri| zve;YwDLEj?bkB~ihCNN~*&eKnz|;?c>7N60Hu>r8_%PsqV!)p@!< zjcaI3>-1+R9d+>9m^#gHxrV=A*192AuF@jK_4Jr;PqY$v-pt|Dq25 zumOLe4t|dTf1cprh~n}f`&V$pC{D@$c*Q-*97qq#%%Sg$Lfr-`c`Q_SBsm?j^N5|< z5XH42ErJxl5(vA@W4k=`%hMu5#uezw>^9>{>2)teOn7{ZNz;|F4dWYz279}k^64b) zhJc($WJik$leq-4hwgn{_CVETeZdoDP;^FN$D4*L?Wx6$t20c#quZ24`K-n`$e?sh zNBh$~t20oeH#nFy>hEpe z)v@dB?O!US9pBS6glLOq;$ivL+Ww`y!O9b9XbAyhy^p;9rm(iv>43sFHNh$W@C|o| zo%!VIw6Q|C*0}o122DK2X+j~IP!59|C$Rr+H%o0jnM5AOl}0h(D6@knp`q}_Exv#r z=;uL0?Kq$(P+{)EdytvUf!L56-il?33PQ^BsARF*r6s3NQ&)o4CfB|gtE*qjV@#{x zrn2QXy#vxg`Y`7GAV>WR(n1TB(&kM}+CIN&_vYQRGnGkXh`QQa5wJskNK=qFKrrwI z3NogtNrcvOhUdfs?!s#K$*Kr`iM*<&KVKYN7+R@6r}jh}7ACh|HXMsoKkL}FzjGq( za0TLicW!=a{gG^JzMZA$k{HapY(MB`*TRO|#-u?O5H72Dlh?3%h}Qy?|7C+M?8 zgB}%5KxbQ1(aQ!0CL05kUDU18 zyT$7HL(Hm_iZV9LVAHAs@-RaXKGkJLgGjt;0->xGHZV$6@Fbp=!Zm(}iP&9V{ebjr zrh&3C4Xv40ScF`iz(W-LH$>!uz1T-n}%J%wbL7$Tf3>=_upa^uD; zw`@H3+>O0E8X9)ET2SCgg+uQMCzIiqn_4EW-@EtviM&v9B)Ih!7u2y5U#CywY+6q(8WGClUgBJ|K#C3OU;3X~MS~-FVZMEjMi( z-JTFJ-oDcQrKSC)zNFh7h=vo}U6aRm@40@mF{p)hFWRx=BGqe4`l8-ImN;FEmsZn; zRfHXN0X_`)w+#3*2E0J?GvF`R!S(wTWrFj&8TW!cqdnu4aSh=LwuT0OlHi~uj0q?6 z)l-riF^pUml$6vd$pleWp(L*GbxKmsrX=lm=%3Xo3E4+bQY;dnq;HLqjAbFOgK9qo zVdmbJky;IXSVZoF!2a8I7(G{r&kds;XZ^@5&Uf^u4#UM5O9bDWFdrk1^&iq2U$ zfYT*77IN~haDvkY=|sibU5xuIvc(OXMYnxW;DN9@SVvc*6xsu8^zuRwBh;R%G@-VE zinEW33s&!jI*@f`CRHZN8`f=TYsqJk4z^1}Y{(Rp=LCs52aq1I6A}>kQY(+HRX$K| zc9pDm%hszV%9m`-uZu;?nLQSV)#dlESDV95cOvL;rMGvBYwEiBnPZy+p6pnnSGM?Fen*Qp;j)HZp}5W4oM^S8bi$EqyW*~G^LK39 z(X?ZFYI~uueQJ6K-z`cM^(nl$w}?|TNoM_w;bavJ$2Wk|x?o>^R+Cw7=4AbSvcuWI zBnOvSCWsvn&CV%dj|SF4Lo19Jt-e6mo8}UP_BDI1T6)majcq}L-J?CDt)(W^<0N8Q zHmHkr>7@s{aL|MQ@WVJcnuGslOJfzfypHx=UPsi~O?xxD*QC)qXkTV85o#~(#60ud zS=7pTe35uo!>~<$@j4)w!;ja&Up3&bSUQ1uu_7hxxumLX?775Qu=>h)Ax9fg^E6Qz z#knF>oQ)VJ_7_-D!JyGFL@8nfdJLOM#im@Ac0_UckAmA;6qC@yMd?{8SJ9L$>%Zw8 zeV6W@zqFi)R3CKg+iB9K&#;oxJ)O-?ce&nm+xi>lHeNHMCTDim)Fta5sAMt~A?@&n zFp`8}%mgw}^OT4Nz2s?X@Mr7bBxyzeXAF43)E^QRaCoMBHR+7sNTP~sP8rwW8RSt4 zxYB087ft;QkFs_z(>3kJHFPg{l-j*I>frDwHF&2PZkqQm>)<5i#aN$M1OB7|r?HZT z5&d;fQ{bT1{V6BWir%0oTf?X9$5OtXgu*&v;$P^;Hlo7sY~G33bCU&=WBL+jqZ*BW*;uFNXq|x9R`8KclMFMJiecWv z={M(_%k@eymt|6OQ?@17l8n>lIhcnK4<^;tpW`ypE)<)VZ`PF<&o@Wrj}9dwY`1OS zT$ix31FrmH_f2>AU$zs1L8<o6l4RFf)pEs@R`& zBdq2Q>5{D{TR;^V@?10(j#My{Q9UBdq{MmbKZS@WL>`Wnfb`Qn=2iN^0%lSxiq$e{ zN~!aFaR=+5De}50uCTE=MOPhqr3ppn%xdG4YH~CXiv>nIHxv>bA*U}A@Wg%1owo*~ z(crBVo@V#N0>S9Ww!IrWIyUZYTeqi?6zfel4s1%NHw|=e>+Ib2t8CaB z@cFSBD-iwE4BV>91=G_PRI=^41kXTE-F6R~=}P}~LuYaO*x2@>;0D4eX^&2>Ri3>L zA6yy{oV164KT`)M4I$vC%y5{)I{a5=IJd<`|0nCB(E}Q+EfRYL!!o9TuAn_=89={bdVpTW5>5!gw>qgKQp|ejjWXZ z(V-m~UQof^uj*@s;lYKW>eJMZg@&g_iq*dr^%WM3Ese49-L-uUIFgUeA^nGndPEM7 z>JcZ~5{w8q2u@i`vGsJdmULH)a}VUD7V9=@J{!Ph}SE|lQRrg$#PLtim=GB0YXwj(29zK&O4fJZlCzvx%6 z%f*j#O6IqoY=az%QH2H9J#Z=%rFWh-s_^rrBG@m6cpj4oc?Nu;qSEdaq>LMa4X7N& z8Ev$GQH8>3e~D-*_)DrySgaBvtKR9EYz-PjU-ogyZn(hw-8981-=867Xj=INpSY?H9yD z0)9%saeDDyU^ifbTiQdLARLKgM@H)eFM-Xa_=^UOFzXAcoXZdUj zCv5~u!II!L9Rc;cX5KGX+gx}%O`LPxLT#5Eao?z!`%Zse?2%JjkKC{OW_~Sn+6WM_%32z>UBjjzS==+rp{+ z)Ypg_g~pM%#_6iy;I?SU4PQ`KI%F@^Hc2<6_#PHhS%8iTJ%o?)NIHHJ>b+E=UDBGi z`K8V8OonXk_de`Oh9iML*e~=Ar+_2>Y;`pFZ9(@Pzw-LRarNihA>v7@pzaOh!g%NS zcwgFV9#Ge_!yzQbzZlZA=Qon3BJN4i zDzZFCGC!$2fO!*UKfrB7c8WY%}U=j(sBDhXtdn!ohwgXLpP3f$T zF>Qf_J!u+~E@8KW79YZx#8~ZYv-BTaWBh#iI3#9m4zKb#ATkM@ETeypPKv7Sx@HO~ z&l4iZtte%EI<)nZZ?@KI8M&RVc_8IgHd}{nAi0>!>y5ZJ5cfu0USHHb%Qc-f=8Af~ zt_`f2Sog0YuCUMRo~=HB#p1l9%)ufbmCmm?*R_Ulwg3*A5vF<6&UcORilg3n8;j#FVY!woIj@_B4$i=&b%Lw*-BY zlMNj)G6kXjYhMJ#E)o_%c?Up>w1=BA7`iR%0H^MJL^EXtYE*a=Vq+0FRK5 z_KF*;C#@^Uik%|IIN-5TbO2&ODD4CxfMUil+;xWwMBtPW7ANi8Mjh#_9CJsDg*#hX zc3tm`_;DgGNkaqOo#b1^M-!va7_p{=%NcLiv@>=x8~h2Wiz9M535d|;T9!1kdmL7G zG@ML@BZ*Afb}cQfnp%l2xy|FUJ1mZ9D4~Ya4dKRYd)Rj72f7isIueB(1FpVh;P4sU zvW8rbacU8`)$5tL#m%iW0e@2O&n<1DE&&&oHc?lA?t>Wf(MJkl1Tl5S!**W93SXc5 zt`>{F9UeuR!n;L1E_t;mS`(fMC~id`UbsofCNaWQFhay4$d zs#&;M;I$f#O`GT0yL3lu1zwM8yXP@mB|*FAITj!>;S35&Jzj@RUhQpQpKK_BwdVu{ z^Xx|tu(o3Ne3?5XZ@7CNHW5vdH2hhcu0ZP7O-^1nKYwkda_xL^uD^e-Se)2c-!6`y3#`=UA zt^_qW{1zOAZO7U6mvFxYyXG~&h2us^8U3C#`h7t7Hy;rGO%FH(Yic})=4i~%G_I%W z;1t;vX@ zj2ic*$w1-4aZu&j^mq(7G1DXA_#?oXfS-+H0Y4kZ0xoc@X!QPNj^ka@x5SQH*DO

iwIomrz+;jPRU0{VPUi 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 Date: Tue, 17 Jun 2025 13:40:58 +0200 Subject: [PATCH 23/34] dev: domain name in .env --- srcs/.env => .env | 1 + Makefile | 4 ++-- srcs/docker-compose.yml | 1 - srcs/requirements/nginx/conf/nginx.conf | 3 +-- 4 files changed, 4 insertions(+), 5 deletions(-) rename srcs/.env => .env (65%) diff --git a/srcs/.env b/.env similarity index 65% rename from srcs/.env rename to .env index e419ce1..e6fe604 100644 --- a/srcs/.env +++ b/.env @@ -1 +1,2 @@ +DOMAIN=mcolonna.42.fr DATABASE_PWD=SuperComplexDatabasePassword diff --git a/Makefile b/Makefile index 4aa5d62..5f796c5 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ BUILD_PATH=__build/ DOCKER=docker MKTEMP=mktemp -DOMAIN=mcolonna.42.fr +include .env SRC_COMPOSE=srcs/ SRC_WWW_MORE=srcs/www/ @@ -31,7 +31,7 @@ run : $(CERT_PATH_FILES) echoo "Running '$(SRC_COMPOSE)'..." cd -- $(SRC_COMPOSE) - $(DOCKER) compose up --build + DATABASE_PWD="$(DATABASE_PWD)" $(DOCKER) compose up --build cd - diff --git a/srcs/docker-compose.yml b/srcs/docker-compose.yml index 9b5547f..8d0c141 100644 --- a/srcs/docker-compose.yml +++ b/srcs/docker-compose.yml @@ -11,7 +11,6 @@ services: volumes: - www:/www:ro - ./__cert:/cert:ro - # domainname: mcolonna.42.fr # TODO(vm) useful? # TODO(any)(nocopy) wordpress: build: ./requirements/wordpress diff --git a/srcs/requirements/nginx/conf/nginx.conf b/srcs/requirements/nginx/conf/nginx.conf index 534f3d1..ce34f77 100644 --- a/srcs/requirements/nginx/conf/nginx.conf +++ b/srcs/requirements/nginx/conf/nginx.conf @@ -26,13 +26,12 @@ http { server { listen 443 ssl; - server_name mcolonna.42.fr; # TODO(any)(nocopy) ssl_certificate /cert/cert.crt; ssl_certificate_key /cert/cert.key; ssl_protocols TLSv1.3; error_page 497 =301 /497.php; - access_log /var/log/nginx/mcolonna.42.fr.access.log main; + access_log /var/log/nginx/access.log main; location / { root /www; From faf609b30f986b9d2ef51d84e1b0e50ec7a027d5 Mon Sep 17 00:00:00 2001 From: mcolonna Date: Tue, 17 Jun 2025 13:42:33 +0200 Subject: [PATCH 24/34] dev: minor --- Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 5f796c5..401dc87 100644 --- a/Makefile +++ b/Makefile @@ -32,7 +32,7 @@ run : $(CERT_PATH_FILES) echoo "Running '$(SRC_COMPOSE)'..." cd -- $(SRC_COMPOSE) DATABASE_PWD="$(DATABASE_PWD)" $(DOCKER) compose up --build - cd - + >/dev/null cd - ## Remove all content of the website. @@ -42,7 +42,7 @@ reset : echoo "Removing all data..." cd -- $(SRC_COMPOSE) docker compose down -v - cd - + >/dev/null cd - ## 'reset' then 'run' @@ -93,7 +93,7 @@ $(CERT_PATH_FILES) : echo "=====" echo - cd - + >/dev/null cd - ## Remove the SSL certificate. From 347b6219bcb4c5e096a739850993f5318c50522b Mon Sep 17 00:00:00 2001 From: mcolonna Date: Tue, 17 Jun 2025 13:56:07 +0200 Subject: [PATCH 25/34] change: use alpine:3.21.3 --- srcs/requirements/mariadb/Dockerfile | 3 +-- srcs/requirements/nginx/Dockerfile | 3 +-- srcs/requirements/wordpress/Dockerfile | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/srcs/requirements/mariadb/Dockerfile b/srcs/requirements/mariadb/Dockerfile index 475c0d9..fb783e6 100644 --- a/srcs/requirements/mariadb/Dockerfile +++ b/srcs/requirements/mariadb/Dockerfile @@ -1,5 +1,4 @@ -# TODO(any)(latest) -FROM alpine:latest +FROM alpine:3.21.3 RUN apk update RUN apk add mariadb diff --git a/srcs/requirements/nginx/Dockerfile b/srcs/requirements/nginx/Dockerfile index 68ae58d..a427065 100644 --- a/srcs/requirements/nginx/Dockerfile +++ b/srcs/requirements/nginx/Dockerfile @@ -1,5 +1,4 @@ -# TODO(any)(latest) -FROM alpine:latest +FROM alpine:3.21.3 EXPOSE 443 diff --git a/srcs/requirements/wordpress/Dockerfile b/srcs/requirements/wordpress/Dockerfile index bb99608..34c1bd8 100644 --- a/srcs/requirements/wordpress/Dockerfile +++ b/srcs/requirements/wordpress/Dockerfile @@ -1,5 +1,4 @@ -# TODO(any)(latest) -FROM alpine:latest +FROM alpine:3.21.3 # EXPOSE EXPOSE 9000 From 70e5998217a0686e52779140c2244be0a914024d Mon Sep 17 00:00:00 2001 From: mcolonna Date: Tue, 17 Jun 2025 14:05:08 +0200 Subject: [PATCH 26/34] dev: add useless docker network --- srcs/docker-compose.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/srcs/docker-compose.yml b/srcs/docker-compose.yml index 8d0c141..00c99ea 100644 --- a/srcs/docker-compose.yml +++ b/srcs/docker-compose.yml @@ -11,6 +11,8 @@ services: volumes: - www:/www:ro - ./__cert:/cert:ro + networks: + - network wordpress: build: ./requirements/wordpress @@ -21,6 +23,8 @@ services: condition: service_healthy secrets: - database-pwd + networks: + - network mariadb: build: ./requirements/mariadb @@ -28,6 +32,8 @@ services: - db:/db:rw secrets: - database-pwd + networks: + - network volumes: www: @@ -36,3 +42,7 @@ volumes: secrets: database-pwd: environment: "DATABASE_PWD" + +networks: + network: + driver: bridge From f92317ce675e683a3087935dcb6809bc2d14b8f6 Mon Sep 17 00:00:00 2001 From: mcolonna Date: Tue, 17 Jun 2025 14:14:51 +0200 Subject: [PATCH 27/34] change: containers always restart --- srcs/docker-compose.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/srcs/docker-compose.yml b/srcs/docker-compose.yml index 00c99ea..5ffc3be 100644 --- a/srcs/docker-compose.yml +++ b/srcs/docker-compose.yml @@ -13,6 +13,7 @@ services: - ./__cert:/cert:ro networks: - network + restart: always wordpress: build: ./requirements/wordpress @@ -25,6 +26,7 @@ services: - database-pwd networks: - network + restart: always mariadb: build: ./requirements/mariadb @@ -34,6 +36,7 @@ services: - database-pwd networks: - network + restart: always volumes: www: From 0b108ca152093339d2389d65b6a136ff4f105feb Mon Sep 17 00:00:00 2001 From: mcolonna Date: Tue, 17 Jun 2025 14:28:33 +0200 Subject: [PATCH 28/34] change: remove limits to database pwd * * still sql injection safe --- srcs/requirements/mariadb/run.sh | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/srcs/requirements/mariadb/run.sh b/srcs/requirements/mariadb/run.sh index 1319dd1..0ca41d3 100755 --- a/srcs/requirements/mariadb/run.sh +++ b/srcs/requirements/mariadb/run.sh @@ -17,16 +17,10 @@ then mariadb-install-db --user=www --datadir=/db echo "creating database..." DATABASE_PWD="$(cat /run/secrets/database-pwd)" - if ! [[ "$DATABASE_PWD" =~ ^[a-zA-Z0-9_]+$ ]] - then - echo "the DB password must contain only letters, digits or '_'." - echo - exit 1 - fi echo ' FLUSH PRIVILEGES; CREATE DATABASE wp; - GRANT ALL PRIVILEGES ON wp.* TO www IDENTIFIED BY "'$DATABASE_PWD'"; + GRANT ALL PRIVILEGES ON wp.* TO www IDENTIFIED BY FROM_BASE64("'$(echo $DATABASE_PWD | base64)'"); FLUSH PRIVILEGES; ' | mariadbd -u root --bootstrap echo From 4971d7967394e22703a8827b73610dc1f14e29b7 Mon Sep 17 00:00:00 2001 From: mcolonna Date: Tue, 17 Jun 2025 14:38:45 +0200 Subject: [PATCH 29/34] dev: .gitignore for .env --- .env | 2 -- .gitignore | 1 + env_template | 2 ++ 3 files changed, 3 insertions(+), 2 deletions(-) delete mode 100644 .env create mode 100644 env_template diff --git a/.env b/.env deleted file mode 100644 index e6fe604..0000000 --- a/.env +++ /dev/null @@ -1,2 +0,0 @@ -DOMAIN=mcolonna.42.fr -DATABASE_PWD=SuperComplexDatabasePassword diff --git a/.gitignore b/.gitignore index 7958fac..2a02a2e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ __* .__* +/.env diff --git a/env_template b/env_template new file mode 100644 index 0000000..7a3014c --- /dev/null +++ b/env_template @@ -0,0 +1,2 @@ +DOMAIN=mcolonna.42.fr +DATABASE_PWD=[insert_cool_password_here] From 39f90db91dde770f7f48c6ddfcfcd235ae0c4b41 Mon Sep 17 00:00:00 2001 From: mcolonna Date: Tue, 17 Jun 2025 15:22:16 +0200 Subject: [PATCH 30/34] change: volumes in custom directory --- Makefile | 4 +++- env_template | 1 + srcs/docker-compose.yml | 10 ++++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 401dc87..e1e2d98 100644 --- a/Makefile +++ b/Makefile @@ -31,7 +31,9 @@ run : $(CERT_PATH_FILES) echoo "Running '$(SRC_COMPOSE)'..." cd -- $(SRC_COMPOSE) - DATABASE_PWD="$(DATABASE_PWD)" $(DOCKER) compose up --build + mkdir -p $(VOLUMES_PATH)/www + mkdir -p $(VOLUMES_PATH)/db + DATABASE_PWD="$(DATABASE_PWD)" VOLUMES_PATH="$(VOLUMES_PATH)" $(DOCKER) compose up --build >/dev/null cd - diff --git a/env_template b/env_template index 7a3014c..2257a17 100644 --- a/env_template +++ b/env_template @@ -1,2 +1,3 @@ DOMAIN=mcolonna.42.fr DATABASE_PWD=[insert_cool_password_here] +VOLUMES_PATH=[insert_absolute_path] diff --git a/srcs/docker-compose.yml b/srcs/docker-compose.yml index 5ffc3be..d9e9bd7 100644 --- a/srcs/docker-compose.yml +++ b/srcs/docker-compose.yml @@ -40,7 +40,17 @@ services: volumes: www: + driver: local + driver_opts: + type: none + device: "${VOLUMES_PATH:?error}/www" + o: bind db: + driver: local + driver_opts: + type: none + device: "${VOLUMES_PATH:?error}/db" + o: bind secrets: database-pwd: From a1d2d83f60257be6d03b37a5577b7d5d043f9eb0 Mon Sep 17 00:00:00 2001 From: mcolonna Date: Fri, 20 Jun 2025 12:33:59 +0200 Subject: [PATCH 31/34] dev: mariadb users * other things also --- Makefile | 10 ++-- env_template | 1 + srcs/docker-compose.yml | 3 ++ srcs/requirements/mariadb/Dockerfile | 8 +-- .../mariadb/conf/mariadb-server.cnf | 6 +-- srcs/requirements/mariadb/healthcheck.sh | 5 ++ srcs/requirements/mariadb/ismariadbrunning.sh | 5 ++ srcs/requirements/mariadb/run.sh | 53 +++++++++++++++---- srcs/requirements/nginx/Dockerfile | 2 +- .../wordpress/conf/wwwmore/wp-config.php | 6 +-- srcs/requirements/wordpress/run.sh | 8 ++- 11 files changed, 79 insertions(+), 28 deletions(-) create mode 100755 srcs/requirements/mariadb/healthcheck.sh create mode 100755 srcs/requirements/mariadb/ismariadbrunning.sh diff --git a/Makefile b/Makefile index e1e2d98..7e8193a 100644 --- a/Makefile +++ b/Makefile @@ -4,9 +4,11 @@ DOCKER=docker MKTEMP=mktemp include .env +export DATABASE_PWD +export DATABASE_PWD_ROOT +export VOLUMES_PATH SRC_COMPOSE=srcs/ -SRC_WWW_MORE=srcs/www/ CERT_PATH=srcs/__cert/ CERT_PATH_FILES=$(addprefix $(CERT_PATH), ca.pem cert.key cert.crt ) @@ -33,7 +35,7 @@ run : $(CERT_PATH_FILES) cd -- $(SRC_COMPOSE) mkdir -p $(VOLUMES_PATH)/www mkdir -p $(VOLUMES_PATH)/db - DATABASE_PWD="$(DATABASE_PWD)" VOLUMES_PATH="$(VOLUMES_PATH)" $(DOCKER) compose up --build + $(DOCKER) compose up --build >/dev/null cd - @@ -41,7 +43,9 @@ run : $(CERT_PATH_FILES) reset : @$(_ECHO) - echoo "Removing all data..." + echoo "Resetting data..." + rm -f $(VOLUMES_PATH)/www/.installed + rm -f $(VOLUMES_PATH)/db/.installed cd -- $(SRC_COMPOSE) docker compose down -v >/dev/null cd - diff --git a/env_template b/env_template index 2257a17..8c039c1 100644 --- a/env_template +++ b/env_template @@ -1,3 +1,4 @@ DOMAIN=mcolonna.42.fr DATABASE_PWD=[insert_cool_password_here] +DATABASE_PWD_ROOT=[insert_other_cool_password_here] VOLUMES_PATH=[insert_absolute_path] diff --git a/srcs/docker-compose.yml b/srcs/docker-compose.yml index d9e9bd7..af5d6e2 100644 --- a/srcs/docker-compose.yml +++ b/srcs/docker-compose.yml @@ -34,6 +34,7 @@ services: - db:/db:rw secrets: - database-pwd + - database-pwd-root networks: - network restart: always @@ -55,6 +56,8 @@ volumes: secrets: database-pwd: environment: "DATABASE_PWD" + database-pwd-root: + environment: "DATABASE_PWD_ROOT" networks: network: diff --git a/srcs/requirements/mariadb/Dockerfile b/srcs/requirements/mariadb/Dockerfile index fb783e6..2a38d29 100644 --- a/srcs/requirements/mariadb/Dockerfile +++ b/srcs/requirements/mariadb/Dockerfile @@ -1,15 +1,17 @@ FROM alpine:3.21.3 RUN apk update -RUN apk add mariadb +RUN apk add mariadb mariadb-client RUN apk fix RUN rm -rf /etc/my.cnf.d/ RUN mkdir -p /etc/my.cnf.d/ COPY conf/mariadb-server.cnf /etc/my.cnf.d/mariadb-server.cnf COPY run.sh /run.sh +COPY ismariadbrunning.sh /ismariadbrunning.sh +COPY healthcheck.sh /healthcheck.sh -RUN addgroup -S www && adduser -S www www +RUN addgroup -S db && adduser -S db db RUN mkdir /db RUN chmod -R 666 /db @@ -18,4 +20,4 @@ EXPOSE 3306 # start CMD ["/run.sh"] -HEALTHCHECK --interval=1s --timeout=10s --start-period=600s --retries=1 CMD [ "sh", "-c", "! [ -z \"$(netstat -tuln | grep :3306)\" ]" ] +HEALTHCHECK --interval=1s --timeout=10s --start-period=600s --retries=1 CMD [ "/healthcheck.sh" ] diff --git a/srcs/requirements/mariadb/conf/mariadb-server.cnf b/srcs/requirements/mariadb/conf/mariadb-server.cnf index ce6f9a1..dfef44e 100644 --- a/srcs/requirements/mariadb/conf/mariadb-server.cnf +++ b/srcs/requirements/mariadb/conf/mariadb-server.cnf @@ -1,10 +1,6 @@ [client-server] -socket=/tmp/mysql.sock +socket=/run/mysql.sock port=3306 -[mysqld] -# fix from https://stackoverflow.com/questions/75696472/aborted-connection-3-to-db-unconnected-user-unauthenticated-host-172-21 -skip-grant-tables - [mariadb] datadir=/db diff --git a/srcs/requirements/mariadb/healthcheck.sh b/srcs/requirements/mariadb/healthcheck.sh new file mode 100755 index 0000000..4902823 --- /dev/null +++ b/srcs/requirements/mariadb/healthcheck.sh @@ -0,0 +1,5 @@ +#!/bin/sh +set -e + +/ismariadbrunning.sh && [ -f /db/.dockerhealthcheck ] +exit $? diff --git a/srcs/requirements/mariadb/ismariadbrunning.sh b/srcs/requirements/mariadb/ismariadbrunning.sh new file mode 100755 index 0000000..575a58d --- /dev/null +++ b/srcs/requirements/mariadb/ismariadbrunning.sh @@ -0,0 +1,5 @@ +#!/bin/sh +set -e + +! [ -z "$(netstat -tuln | grep :3306)" ] +exit $? diff --git a/srcs/requirements/mariadb/run.sh b/srcs/requirements/mariadb/run.sh index 0ca41d3..4f514bb 100755 --- a/srcs/requirements/mariadb/run.sh +++ b/srcs/requirements/mariadb/run.sh @@ -1,29 +1,59 @@ #!/bin/sh set -e -echo - -dirisempty() +sql_quote() { - [ -z "$( ls -A "$1" )" ] + echo "SELECT QUOTE(FROM_BASE64('$( echo -n "$1" | base64 )'));" | mariadb -u root -N } +rm -f /db/.dockerhealthcheck + +echo + # install database if doesn't exist -if dirisempty /db +if ! [ -f /db/.installed ] then - echo "database doesn't exist. creating it..." + echo "database doesn't exist." echo + + echo ">>> clean..." + rm -rf -- $(find /db -mindepth 1 -maxdepth 1) + + echo ">>> creating database..." chmod -R 777 /db - mariadb-install-db --user=www --datadir=/db - echo "creating database..." + mariadb-install-db --user=db --datadir=/db + echo + + echo ">>> running mariadbd..." DATABASE_PWD="$(cat /run/secrets/database-pwd)" - echo ' + DATABASE_PWD_ROOT="$(cat /run/secrets/database-pwd-root)" + # run mariadbd and wait for it to be working + mariadbd -u root & + while ! /ismariadbrunning.sh && kill -0 $! + do sleep 1; done + if ! kill -0 $! + then + echo + echo "failed when running mariadbd :(" + exit 1 + fi + echo + + echo ">>> configure..." + echo " FLUSH PRIVILEGES; CREATE DATABASE wp; - GRANT ALL PRIVILEGES ON wp.* TO www IDENTIFIED BY FROM_BASE64("'$(echo $DATABASE_PWD | base64)'"); + GRANT ALL PRIVILEGES ON wp.* TO db IDENTIFIED BY $( sql_quote "$DATABASE_PWD" ); + ALTER USER root@localhost IDENTIFIED BY $( sql_quote "$DATABASE_PWD_ROOT" ); FLUSH PRIVILEGES; - ' | mariadbd -u root --bootstrap + " | mariadb -u root + kill $! echo + + echo ">>> kill mariadbd..." + >/db/.installed echo "if this file exists, that means the database is entirely installed." + echo + echo "database created!" echo fi @@ -32,4 +62,5 @@ echo "to recreate a new database, remove the db volume of this compose." echo # run mariadb +touch /db/.dockerhealthcheck mariadbd -u root diff --git a/srcs/requirements/nginx/Dockerfile b/srcs/requirements/nginx/Dockerfile index a427065..b29e436 100644 --- a/srcs/requirements/nginx/Dockerfile +++ b/srcs/requirements/nginx/Dockerfile @@ -27,4 +27,4 @@ COPY conf/ /etc/nginx/ # start CMD ["nginx", "-g", "daemon off;"] -HEALTHCHECK --interval=1s --timeout=10s --start-period=60s --retries=1 CMD [ "sh", "-c", "! [ -z \"$(netstat -tuln | grep :443)\" ]" ] +HEALTHCHECK --interval=1s --timeout=10s --start-period=60s --retries=1 CMD [ "/ismariarunning.sh" ] diff --git a/srcs/requirements/wordpress/conf/wwwmore/wp-config.php b/srcs/requirements/wordpress/conf/wwwmore/wp-config.php index 57431bf..1b4379b 100644 --- a/srcs/requirements/wordpress/conf/wwwmore/wp-config.php +++ b/srcs/requirements/wordpress/conf/wwwmore/wp-config.php @@ -23,10 +23,10 @@ define( 'DB_NAME', 'wp' ); /** Database username */ -define( 'DB_USER', 'www' ); +define( 'DB_USER', 'db' ); # TODO /** Database password */ -define( 'DB_PASSWORD', `cat /run/secrets/database-pwd` ); +define( 'DB_PASSWORD', `cat /run/secrets/database-pwd` ); # TODO /** Database hostname */ define( 'DB_HOST', 'mariadb:3306' ); @@ -85,7 +85,7 @@ $table_prefix = 'wp_'; * * @link https://developer.wordpress.org/advanced-administration/debug/debug-wordpress/ */ -define( 'WP_DEBUG', false ); +define( 'WP_DEBUG', true ); # TODO /* Add any custom values between this line and the "stop editing" line. */ diff --git a/srcs/requirements/wordpress/run.sh b/srcs/requirements/wordpress/run.sh index 87345ce..95d29b6 100755 --- a/srcs/requirements/wordpress/run.sh +++ b/srcs/requirements/wordpress/run.sh @@ -8,10 +8,13 @@ dirisempty() [ -z "$( ls -A "$1" )" ] } -if dirisempty /www +if ! [ -f /www/.installed ] then - echo "download and uncompress wordpress release..." + echo "clean..." + rm -rf -- $(find /www -mindepth 1 -maxdepth 1) echo + + echo "download and uncompress wordpress release..." apk add curl apk fix rm -rf /build @@ -24,6 +27,7 @@ then echo "add files from /conf/wwwmore/" echo cp -r /conf/wwwmore/. /www + >/www/.installed echo "if this file exists, that means the database is entirely installed." echo "www directory created!" echo fi From 59e9c06425b71a13b228c5314aa805fc5fb0f078 Mon Sep 17 00:00:00 2001 From: mcolonna Date: Fri, 20 Jun 2025 17:54:31 +0200 Subject: [PATCH 32/34] tmp --- srcs/docker-compose.yml | 1 + srcs/requirements/wordpress/conf/wwwmore/wp-config.php | 6 +++--- srcs/requirements/wordpress/run.sh | 2 +- tmp | 8 ++++++++ 4 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 tmp diff --git a/srcs/docker-compose.yml b/srcs/docker-compose.yml index af5d6e2..17682c0 100644 --- a/srcs/docker-compose.yml +++ b/srcs/docker-compose.yml @@ -11,6 +11,7 @@ services: volumes: - www:/www:ro - ./__cert:/cert:ro + - ./__logs:/var/log/nginx:rw networks: - network restart: always diff --git a/srcs/requirements/wordpress/conf/wwwmore/wp-config.php b/srcs/requirements/wordpress/conf/wwwmore/wp-config.php index 1b4379b..472e505 100644 --- a/srcs/requirements/wordpress/conf/wwwmore/wp-config.php +++ b/srcs/requirements/wordpress/conf/wwwmore/wp-config.php @@ -23,10 +23,10 @@ define( 'DB_NAME', 'wp' ); /** Database username */ -define( 'DB_USER', 'db' ); # TODO +define( 'DB_USER', 'db' ); /** Database password */ -define( 'DB_PASSWORD', `cat /run/secrets/database-pwd` ); # TODO +define( 'DB_PASSWORD', `cat /run/secrets/database-pwd` ); /** Database hostname */ define( 'DB_HOST', 'mariadb:3306' ); @@ -85,7 +85,7 @@ $table_prefix = 'wp_'; * * @link https://developer.wordpress.org/advanced-administration/debug/debug-wordpress/ */ -define( 'WP_DEBUG', true ); # TODO +define( 'WP_DEBUG', false ); /* Add any custom values between this line and the "stop editing" line. */ diff --git a/srcs/requirements/wordpress/run.sh b/srcs/requirements/wordpress/run.sh index 95d29b6..21aa0d0 100755 --- a/srcs/requirements/wordpress/run.sh +++ b/srcs/requirements/wordpress/run.sh @@ -26,7 +26,7 @@ then echo echo "add files from /conf/wwwmore/" echo - cp -r /conf/wwwmore/. /www + cp -p -r /conf/wwwmore/. /www >/www/.installed echo "if this file exists, that means the database is entirely installed." echo "www directory created!" echo diff --git a/tmp b/tmp new file mode 100644 index 0000000..9718ad1 --- /dev/null +++ b/tmp @@ -0,0 +1,8 @@ +create in vbox: +- install debian iso from https://chuangtzu.ftp.acc.umu.se/debian-cd/current/amd64/iso-cd/debian-12.11.0-amd64-netinst.iso +- login as root +- # apt install sudo +- install 6 debs from https://download.docker.com/linux/debian/dists/bookworm/pool/stable/amd64/ +- # usermod -aG sudo username +- # usermod -aG docker username +- launch probalby \ No newline at end of file From 46457d81136c9afa1d2635e17fc5b318972cf495 Mon Sep 17 00:00:00 2001 From: mcolonna Date: Thu, 26 Jun 2025 10:58:07 +0200 Subject: [PATCH 33/34] fix: permissions on volumes --- srcs/requirements/mariadb/Dockerfile | 1 - srcs/requirements/mariadb/run.sh | 2 ++ srcs/requirements/wordpress/run.sh | 2 ++ 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/srcs/requirements/mariadb/Dockerfile b/srcs/requirements/mariadb/Dockerfile index 2a38d29..9e71757 100644 --- a/srcs/requirements/mariadb/Dockerfile +++ b/srcs/requirements/mariadb/Dockerfile @@ -13,7 +13,6 @@ COPY healthcheck.sh /healthcheck.sh RUN addgroup -S db && adduser -S db db RUN mkdir /db -RUN chmod -R 666 /db EXPOSE 3306 diff --git a/srcs/requirements/mariadb/run.sh b/srcs/requirements/mariadb/run.sh index 4f514bb..b96258a 100755 --- a/srcs/requirements/mariadb/run.sh +++ b/srcs/requirements/mariadb/run.sh @@ -1,6 +1,8 @@ #!/bin/sh set -e +chmod -R +rwX /db + sql_quote() { echo "SELECT QUOTE(FROM_BASE64('$( echo -n "$1" | base64 )'));" | mariadb -u root -N diff --git a/srcs/requirements/wordpress/run.sh b/srcs/requirements/wordpress/run.sh index 21aa0d0..708a6e3 100755 --- a/srcs/requirements/wordpress/run.sh +++ b/srcs/requirements/wordpress/run.sh @@ -8,6 +8,8 @@ dirisempty() [ -z "$( ls -A "$1" )" ] } +chmod -R +rwX /www + if ! [ -f /www/.installed ] then echo "clean..." From d10389f3092a2ca5e2cd0a25c0aeb30f563db4cc Mon Sep 17 00:00:00 2001 From: mcolonna Date: Thu, 26 Jun 2025 16:01:43 +0200 Subject: [PATCH 34/34] clean --- tmp | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 tmp diff --git a/tmp b/tmp deleted file mode 100644 index 9718ad1..0000000 --- a/tmp +++ /dev/null @@ -1,8 +0,0 @@ -create in vbox: -- install debian iso from https://chuangtzu.ftp.acc.umu.se/debian-cd/current/amd64/iso-cd/debian-12.11.0-amd64-netinst.iso -- login as root -- # apt install sudo -- install 6 debs from https://download.docker.com/linux/debian/dists/bookworm/pool/stable/amd64/ -- # usermod -aG sudo username -- # usermod -aG docker username -- launch probalby \ No newline at end of file

iwIomrz+;jPRU0{VPUi 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 - - - - - yippee - - - -