From 3b8aca19992cf563fcb4590c9dc940f58bc45820 Mon Sep 17 00:00:00 2001 From: StepanovPlaton Date: Tue, 3 Feb 2026 02:37:10 +0400 Subject: [PATCH] Update docker deploy --- .dockerignore | 2 +- Dockerfile | 19 ++++++------ nginx.conf | 49 +++++------------------------- public/assets/images/particle.png | Bin 9641 -> 0 bytes 4 files changed, 18 insertions(+), 52 deletions(-) delete mode 100644 public/assets/images/particle.png diff --git a/.dockerignore b/.dockerignore index bb0e9eb..bd6836c 100644 --- a/.dockerignore +++ b/.dockerignore @@ -12,4 +12,4 @@ dist README.md LICENSE docs -screenshots +screenshots \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 9ce0cdf..0664425 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,14 +4,6 @@ FROM node:22-alpine AS builder # Set working directory WORKDIR /app -# Accept build arguments -ARG OAUTH_GITHUB_CLIENT_ID -ARG OAUTH_GITHUB_CLIENT_SECRET - -# Set environment variables from build args -ENV OAUTH_GITHUB_CLIENT_ID=${OAUTH_GITHUB_CLIENT_ID} -ENV OAUTH_GITHUB_CLIENT_SECRET=${OAUTH_GITHUB_CLIENT_SECRET} - # Copy package files COPY package.json package-lock.json* ./ @@ -21,19 +13,28 @@ RUN npm ci # Copy source code COPY . . +# Accept build arguments and set environment variables +ARG OAUTH_GITHUB_CLIENT_ID +ARG OAUTH_GITHUB_CLIENT_SECRET +ENV OAUTH_GITHUB_CLIENT_ID=${OAUTH_GITHUB_CLIENT_ID} +ENV OAUTH_GITHUB_CLIENT_SECRET=${OAUTH_GITHUB_CLIENT_SECRET} + # Build the application RUN npm run build # Stage 2: Production FROM nginx:alpine AS production +# Remove default nginx config +RUN rm -f /etc/nginx/conf.d/default.conf + # Copy built files from builder stage COPY --from=builder /app/dist /usr/share/nginx/html # Copy nginx configuration COPY nginx.conf /etc/nginx/conf.d/default.conf -# Expose port 8091 (for rootless podman) +# Expose port 8091 EXPOSE 8091 # Start nginx diff --git a/nginx.conf b/nginx.conf index 64520d6..b524baa 100644 --- a/nginx.conf +++ b/nginx.conf @@ -1,59 +1,24 @@ server { listen 8091; - server_name localhost; + server_name _; root /usr/share/nginx/html; index index.html; # Gzip compression gzip on; - gzip_vary on; - gzip_min_length 1024; - gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml+rss application/json application/javascript; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; - # Security headers - add_header X-Content-Type-Options "nosniff" always; - add_header X-Frame-Options "DENY" always; - add_header X-XSS-Protection "1; mode=block" always; - add_header Referrer-Policy "strict-origin-when-cross-origin" always; - - # Cache control for static assets - location ~* ^/_astro/ { - add_header Cache-Control "public, max-age=31536000, immutable" always; - try_files $uri =404; + # Cache static assets + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { + expires 1y; + add_header Cache-Control "public, immutable"; } - location ~* ^/assets/ { - add_header Cache-Control "public, max-age=31536000, immutable" always; - try_files $uri =404; - } - - location ~* ^/favicon/ { - add_header Cache-Control "public, max-age=31536000, immutable" always; - try_files $uri =404; - } - - location ~* ^/pio/ { - add_header Cache-Control "public, max-age=31536000, immutable" always; - try_files $uri =404; - } - - # CORS headers for RSS/Atom feeds - location ~* ^/(atom|rss)\.xml$ { - add_header Access-Control-Allow-Origin "*" always; - add_header Access-Control-Allow-Methods "GET" always; - add_header Access-Control-Max-Age "86400" always; - try_files $uri =404; - } - - # Main location - SPA fallback + # Main location location / { try_files $uri $uri/ $uri.html /index.html; } # Error pages error_page 404 /404.html; - error_page 500 502 503 504 /50x.html; - location = /50x.html { - root /usr/share/nginx/html; - } } diff --git a/public/assets/images/particle.png b/public/assets/images/particle.png deleted file mode 100644 index 18f2da00450de543e24526d83d4ca61a400a3aeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9641 zcmbVy2{@E(-}lTgBV%XAl4uedjD4v_G-J!&U}lWUGR$BYOSVwLSVAf^WC@cc+t|0t z5~3JdDEpmODw0BqqIbIQ`?-(j{f_7R-s5|(JXZe|KvtApV4e`5P%~ILvpb#p;KtoI2OG`@^p{;G8L7{jZ^z_n0A#}8Kv^BL3X=)!-*VaXAA42OMMErdy zaQTH$ywQ$k7JqZ&J{c+ahJ^*AH8sziIiqn#S0gCIM^pRo;lr9*I+{8<>Rg0+XjEVr zIZ{0^bpO97m{CK$LTJHZw4gx5Z;E8kpztsw1+J`rDG?C-581%bzYWDTnPwz8SW{a= z>$g&W0x4eq;DWG6M0s{VF5gKM5!ByjLgZxKyC_XBfs_94#4GItOqMAo=#oYf}n_#qQ2$dWb6oL;5 zqW{ZPxPOU^(9zb=K_H!Jfs~*#p(_72foet$qZ%o2y{50Ot;Ka2UPlY9rH$6nQ`0(x z*3$Y5Y8OPIc}M+6s4iOT(0_w+gN8y5Bma+JiWk~DC?tT)RhSk)_MvJ92l^-={xKuk zG>9G)!ez{rPWRvYtxQdEAwk|WI(Hz{@t6t1%G}gI`>=t5x{ikSpW@otp{)W#!^nYN zR4X$h1+H;4Xfz61PwODro2+$E-N2LTsjls<=dFHNi=wY?K-SXN);Ub^)Yhl`Yra{K zSNQJ`_}6^O|L6SUAvA6hlIj0zI=@r%ckG}oX`x)NM*W>SPSn$Xx9Bv)pW%Wgd;LxW zBL%PD{-<&^_^X@tzqY_%^UwHFxkUdTaq$-{G{`&b3^{~~_2F9Ue~dd#uJD?_6ZS7X zH2+T({~Y_bYyiK{hGo0fZPCx(1HtyQkuVZtwp+N+*nI8s!#Hwi` zuL(x%gLFo?Zhv3d=v!y3E@hk(UayW3Rv42ye|&#WbbK`Swj5|v`u+2`R}xT}9wcXp za!>Ixx(m_8q7Mm<%e<%FTUp^Hxh$^Fx#2ulMgeK%yvIAgf~kJ>W1TFmV5VmLK8X@% zsvFK^qx$EK*q~y3z7+Flr95%tyMMbBQwnzQY-f9v|Hc|%TOTJZc9>5oD(EolryeR+ zjQOoigeAq)Y$3P~?OR#i-AdC$zJNa|j%Z#8z41YL;#6bwo0mUB%jeyB=9~AC_I_?} zkrjX}V|!Ypm_C(!Tgu(0+U(6!zIUv&A?{YYrkw?+ijx;kVn-oUuE9TR$_QQ_M~5KG z@|{QhhtBgeYY>~sk7Dl12=vBmpkg&~9AJn(8J)Nvm*R3Lc6{%%c8wuv7 z1GgofdUo?OV|i%b0LB`~T_2;LOY*Ly(Nr~&QZ<9{iA5+<$63`|cvX!)J-Lu`fKd`Y ze&(D&>`sx_eppBCQ)uL}XZhxg_^K0jnnuv+t&zes>c&!f#|*YFEraLfaXL_-A?My3 zz3lv4QyspTh`INg$j9-DJeSAQ*AqXeZTC%1-OySFo41>*)8Za7n*2spBkjB^a@c!3 zh1$Ah@;4Yw?shr^3M2!~KhSRLJ_Pc<5FTA7*CES{eZicz>(}A8TtBQEMXeC>zi3bs z#9Q0NI%UYxb=Ryu((E!{r}E3_P=j~;G`Vm~fTPPM^1Gc(z%d^JP5~d?#*%fI^Q#Xx z>mW)U)%ri8M|xiHKM+njd;sI0THodQg4iwShRY&U(Qnnw?Xpl7WRFpJ?)5o-YV&kv zIA-xVguN{FcX@dkA#KPwe=X|n3vo9?zXweb0k^}yUF*PBNdaGDn@Z#}X(+>NB~Ze_ zp4>^a6|N~{xR|G0Ii5J=ztsQYYPpvF=kiRsnXdR}Ll2zcH?7|bc48oaJj{Kkuc z9^&+^)Z~P3ety+&( zLnlkI(&{5rk_apch9H}okdEV+0o9-s13u8~Bqyld(rinOFf z0NzyD%lZfsakIdfqbO2(Jp~fluw_>$_ruZ=e*K2P%-Hie-}(AJIhG6*NG|r6A}bW zN;P4U?-4zsP{^8#WkeTz1S=m8hpKpVh{PhzWSrdE-en8obl4Vn zD;>5ZkKMjzj#!-cx7T&L!N05oRV`dU5p(Ln<;te_NvbP5uLWQG#gSEn1Z??Die*TK zhdnw<9Ag|^y_;7h1I!JSD)A$171D zcN1NRSeJMTgt-X7U&oGMJdGY9t(AHo(e zcBnh^X5G6T1Qz8@{~G#Mpv?Y+hK*4MBP>Jdj?Q4FoGkDueG-ZaxC-uoF`o+!`0`IR zpXB4WQi^NbSx5jVdo`6!wu=JH_$K`%ZO^g|4LD9xk~zG90z}7=Owqqp{=KXM;@5}+KA18qFYQnGqVE?e% z+~dsF!-ePAnW~=DOMz3GydsWV+He5_|9cw1d5)@7jbc$3+HyEd)X#}Oe3d?H4dfN7 zGp5DcJGzRZ9H>K09@i>4*(@{Ec-nLHp178G+LMviUh}Yt2yl7*ms z4inFjiz+wbXJ!NTww|ht?)T0z5q|IWDnDh6nS^`H8(9O5fW(tOwL@a1?jF^BI_^HC zrgGyvm^qmDN!PClnkwjrunr#{MhKb_ep)CR!tZafYQF#2(OGL~>6Ha8tZ~Z@s+}Qz z`0+iblDzH|15tJ9G@hY%`uS-HFczw8pNw6Z9hvKOyJCu&YpDB%Sf%HFJt2s?!ch}M zzRCNP_xziSB}#vkjsx<{oIT|vR&TNZ{yDDon67#n{e+aUjx}QcP-tk#ZaDT1E&^LQ zawT67sw*@AT@kb71lxhF!+4*0Z=rQd= zg~B#ugWy>*`d<*EkR#Cdl8QO4O&>|&C}~~y<+Xe4vV)V#D8E;CWO^bS8aN>!U$leA zV2ejpXpbH)B018+ZYuCBf80xzWbja>__zZczd1H{(8fg}2G+7D3VeF$$k>ITUtgkX z8dy7==hZre4%Q&W96zmjkNe(mEngduA~CR0)ywkv)VceC1)SuK)1Qx#Wp2>Q)Jy7b{dNp>0kC)U6y$UZMToX+aQGOtab6scNMy zJ;~k1Tu*b7P#J-?lLT*r$2NS_cY0fD&)$;a`kSdlo~PA`wMA6gv_{K$ zGuiJs0q9GPtGkj3{LOT^Qq`Ib|AOjB)(9k$Y4@bP&KczWtPCWe#DmDO_ML2sp#Lmj zM|pmf62EH4Ze6-GB7s63K+5`alpwy9r;a@Bdf^6?#pZpuU!NGM_L+Fh4qAz!8Hp`x z*FKYtFGEs2YeSOTe5q|2mjV@hHn$r%UsPRpqPl2R{lxj-yR^i1v_@!*1b@)d!#bQ#Im{^zW`4r>l zZ?&ukPJDW@`tSzE^P$AkCTPcI;x&oZ)-Q!fe*YKmg(?{vp?sXDe3ABi_BHob^byVI zuh$Z?2+K`v#;x>g`jgdZM)PJ%1-=nBP6c8}y)N^bL>D#0boI43Opr7?tB;=9CZt>@A8_&>5jtkFmpzb4NP z_Ge?S4p9`iG8LRD7)AZrC1#mxoOaD=cicVb=aKcRVu_X2VHvKS3ZMcf_E&?BA1YNW zN_Nt;tE1|!FZ+>_yWXscm|E!#6W|@mZ6;$(iLOcT6smSL96}!5DIjD^tP@IZoNwKX zv^q+ih^8j=&1lrFr`=?eZkO+l)AsZ1J+vTcCpPW%kuCCY#u)x^Mf`PvQHg5BsB@$B z0R1@Cpn_$U#r+La7dX50az6_(OGr_E1Kgc%4lLOXudilisarl7m7u3i8Cu!&yRpl+ zzgbnL2?ESajjGR^5BE18R(g1zHlcQQD2Vd<4c++go>`?dPhUSh0~vj=_~r^tdv503 zLh$~!3nkN;qc?ry=LEjwRBPQRYIL7a&{nR9j98My>BwGc#>!7?C>N6?5bCo8A$=8y z-U)**h^m(_>bq8acME`S@?h>fJ$4u#$>vO1;qR7EUw_0Dd*99YdI!p!KIf^=C(z(3 ziQ3OgG;Lxm<`dgCcDhD>Tj6;~!b!9Cu$i6Zd*r9oSn49w;!mf*GBt!avAKbyRILDEG+W^Gs ze^l<_YjE9vYFCazr1P+hr6}s516;jW56l$CFYvb66g(<%EhcPoa@Sg~J2WwVI$^3T zqS`?`fGJy5!k#YFp4+~ zGH*U#LaGQ-9?5%$?^1`X;zudtdyzdBqQ7tjf@K~m+_;} z!4jlI^*P$cFe6DlH-+48_W915)6fABrm@LV7k^WNMX^s?m#j5vTWpnu)x0`XonkO) z0~2L0l(cU9={?#1gOF6v=ZMMmv7hl=wc;U;oH$3F)~?yDEES*CDnG9s1M_yIz+nDP zsi#%Dt{rRPNv;mIi4!Tm9#91p5LhhL11kh%-0+gNKSn+>f2a_e-B;N$aPGa zrKWTXm&K>ybupN2Sj}#4s8v5C~VeburVWMYxmNK@o?A-T6XyHWpyE zojv#?52I=Q$s;7~V6(Ko!sw$+U(NdJxI=yJL+7);$sgQb&$=4t;Ik99`-&~@SWnbu zzrgC5bsPfeumlI1D|WX}3L;O~i+S8t7}o^CwFGj-=>aXEze-nVOY(} zYU<>Np$(kb=NxlanqG-b1IHT64mUY}4 z5zo?Ux;uRS;kr}Cc0T{txzn@AQr~$pKP1}1YD6Sh8ueU7sQCbI>73=kzB?7ll`~3x zwUm*;1Ft0FoiVrj&b#o`^O|h$vO0|)Kp*dp6K_1!;QOo21TQ%q)L}2!Vxej)5qrf` zeU`Q9s@CSOR9q%kXmp~!L-vZ;k8=HWJ*6jjbAJr+!HFA_Z94pD*_#HbVJ#)H$BKm6r4&I{d zmhga)G^9KsY+!^_wGcX{{-oJJaJjvFUNTI$v|O3JJO(Sf*d_6>ttlAqP&cBIzP-v_ zCV_2h@?CChi*8G=Si|P>f+`6&|$+`q3ZrTe9I zGjU?EU(8Lp|6p&&x^A2QO)n;mss z!p(K;{%F^Db&D+rH?q{LDH94|9<>J~Z|v?cJ!fHj8k_p)#~l+wuH$Jl!Vv-Q!d~Bp z;&rU49>BfsZ!;I7#Ulh`3eMn^Cph;!|9EghL%rdcO_H%Xq!akAX^S zNfZb+xY&KN&3{4BpCW+~(d~{#u4m zWf5*WJAE3G11j3v=&H|BkUN(U(fjTuOGT*=b>L)1WR4By_7v#ej0B4hnJv*E zgi**{h>%yWw}(vZFQA)^vdOu^xYC69l7KM}U_VKFY0vkCpXpnNoU5z^y6YFd>as>= z`0DZLP0%Kf4zie|E6T&$^yl}vu+LZpf(%~~adQ=)oJ5%jxgq{dL!UpM8o#PXP_h5~ z4Mp1b3{;yB>s{;M1?-0)bq(5pNgwXVmc~C~o_4Wh``4DP-Ra*_bjhw$sT4)d@NEQT zy&bub-tADkdEBkx8~bv5tag51{r1tOQ{xVY)~UMQE%wL@d=C4Y(`=DeJYXK)R3t_x zCQEszuNAHo1w-mqi&rrS4?bx%zySAv82MlKb!fMztTLb9`lQFC?0M^nuO{xJv5pw| z-_BK86T>M;*jJ^G&F4ejS~s+#rl2U|?c3r#4cQv?;)9qm23$*Tz{(kT>9HCAAMhVr>o18-Kz`CAa(uR zr2c4Qr}@<;tH_??#0NPTm-wV1Rka3RyAc;sKT`W_Pm1GwTA=H29|OYl>B{$dV74xE zx7oVy1RJS%(&QX3Q*J}elz<|!drzi}FnUya6&N{K4zFS}hf(cug5(pz%jjo}B;0qr z`mtyz0+)*|E?0FRwVZMS2T{l>7vXdI4V@w3;5c??@th#3<>nub0A2!*Xn2X>2#GzI zIhps+e0SC^Wb@v@mXkp)Qj(G)dj!(0NoWxbfsri0F6inU!jz|=k#gem-g@|0NaIHJ z0n^n;9Fa_3Pa1s2PEbbzGx^vx(+xaNXP z!3`tH-``)Dv+}qTEK5wes$Ft)zdp^1XFIh1jxmF44c6gcc= zek*9&S}DEJTP!>kw7-9Qv~ZtuZIW}-r9HbjdQfMnlSUSH5eZEo+i>|S9|hg72c1!# zO?e5a;IrGOYh}j(CA~u;aRy@`ww4lkG)Jk@1O9e?p(e>FreQQC0uT~hM{A{h_QJ}S%9ML1M)pIm{Z+vph zB{>g0@uI7d%az$_Q^gO6x4MOxhR@0&WDdv^!g`;VD34GxPy<<6S=^vNZ#k_(}v-bvEqGfa6EEyH~YYe{`qc#$XC!n_GU z3wgDC4U^i}S2_F?Pk~ojxJ~jT+;u(F6D!a3J>(u!NH>&p$jh6YBi}9wHlxqLyT#?_QGq1)gWH?)oiT_hIhp)UOY`Yaf~%On$3vu*7|H&rH%` zxg=EtMcyqqRd3AQ6ODJeaIityG`CjI*++aOLRsX!Yy39XAmqj5Ns9Y7+Kp}%cf~xv zmbKZPQR`I-?!Nw8>Qj%i;)mu|0`6^RMiGuXD6D@o7QY;XV?JLLm-{1JH$4+eFaTy2 zdXWH20-Uvkow}FCKhFLLj=lRi##r;aT#U&+cU%@H{K8T_ytE|8ep zk-c!TSCo}eaqh$NHSBF!X@`&IU7{(4z+V-Nt$IcXVd}1G<)rzp&Y;x}KXOG|e!dU%9rfD8|3Qo}2dX~o>;$0x* zO)cZ++BcSdy?5uEm&md2S?lwhRrBWg%-sU7)`^uVYP{&SqpBDSXG%#LhWf79UH!J< zgB^-{Hw)Z-K>7SQeNKwGl05$b-U4Yl5qoq;idhKQhx^3)?x{8HaA{|7C+lN!QWZ