From bcd360dc3356559e8be605e7dcf455f64aa09335 Mon Sep 17 00:00:00 2001 From: Ali Alavi Date: Tue, 1 Sep 2026 12:08:01 +0000 Subject: [PATCH 1/5] build: add production Dockerfile, docker-compose, .env.prod, and standalone next config --- .dockerignore | 11 ++++++++++ .env.prod | 3 +++ .gitignore | 1 + Dockerfile | 54 ++++++++++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 18 ++++++++++++++++ next.config.ts | 2 +- runner.sh | 3 +++ 7 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 .dockerignore create mode 100644 .env.prod create mode 100644 Dockerfile create mode 100644 docker-compose.yml create mode 100755 runner.sh diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..f8b438e --- /dev/null +++ b/.dockerignore @@ -0,0 +1,11 @@ +Dockerfile +docker-compose.yml +.dockerignore +node_modules +npm-debug.log +README.md +.next +.git +.gitignore +.env*.local +.env.development diff --git a/.env.prod b/.env.prod new file mode 100644 index 0000000..3c7c3ab --- /dev/null +++ b/.env.prod @@ -0,0 +1,3 @@ +PORT=3000 +NODE_ENV=production +NEXT_TELEMETRY_DISABLED=1 diff --git a/.gitignore b/.gitignore index dfb192b..67f3f55 100644 --- a/.gitignore +++ b/.gitignore @@ -32,6 +32,7 @@ yarn-error.log* # env files (can opt-in for committing if needed) .env* +!.env.prod # vercel .vercel diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..34ef2fa --- /dev/null +++ b/Dockerfile @@ -0,0 +1,54 @@ +# syntax=docker/dockerfile:1.7 + +# ────────────────────────────────────────────────────────────────────────── +# مرحلهٔ ۱ — deps: آماده‌سازی وابستگی‌ها با کش npm +# ────────────────────────────────────────────────────────────────────────── +FROM node:22-alpine AS deps +RUN apk add --no-cache libc6-compat +WORKDIR /app + +COPY package.json package-lock.json* ./ +RUN --mount=type=cache,target=/root/.npm npm ci --prefer-offline --no-audit --fund=false + +# ────────────────────────────────────────────────────────────────────────── +# مرحلهٔ ۲ — builder: ساخت خروجی بهینه‌شده standalone برای Next.js +# ────────────────────────────────────────────────────────────────────────── +FROM node:22-alpine AS builder +WORKDIR /app + +COPY --from=deps /app/node_modules ./node_modules +COPY . . + +ENV NEXT_TELEMETRY_DISABLED=1 +ENV NODE_ENV=production + +RUN npm run build + +# ────────────────────────────────────────────────────────────────────────── +# مرحلهٔ ۳ — runner: سرور مینیمال، سبک و امن standalone در محیط پروداکشن +# ────────────────────────────────────────────────────────────────────────── +FROM node:22-alpine AS runner +WORKDIR /app + +ENV NODE_ENV=production +ENV NEXT_TELEMETRY_DISABLED=1 +ENV PORT=3000 +ENV HOSTNAME="0.0.0.0" + +# ایجاد کاربر غیر روت برای امنیت کانتینر +RUN addgroup --system --gid 1001 nodejs && \ + adduser --system --uid 1001 nextjs + +COPY --from=builder /app/public ./public +COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static + +USER nextjs + +EXPOSE 3000 + +# هلث‌چک کانتینر +HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \ + CMD wget -qO- http://127.0.0.1:3000/ || exit 1 + +CMD ["node", "server.js"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..dce49fb --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,18 @@ +services: + web: + build: + context: . + dockerfile: Dockerfile + image: teamby-landing:latest + container_name: teamby_landing + restart: unless-stopped + env_file: + - .env.prod + ports: + - "8065:3000" + healthcheck: + test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:3000/ || exit 1"] + interval: 30s + timeout: 5s + retries: 3 + start_period: 15s diff --git a/next.config.ts b/next.config.ts index e9ffa30..68a6c64 100644 --- a/next.config.ts +++ b/next.config.ts @@ -1,7 +1,7 @@ import type { NextConfig } from "next"; const nextConfig: NextConfig = { - /* config options here */ + output: "standalone", }; export default nextConfig; diff --git a/runner.sh b/runner.sh new file mode 100755 index 0000000..04e450b --- /dev/null +++ b/runner.sh @@ -0,0 +1,3 @@ +#!/bin/bash +set -e +git pull origin master --rebase && docker compose up -d --build From 4752f9a7f9657f13212b670ada79ab9f0b041c90 Mon Sep 17 00:00:00 2001 From: Ali Alavi Date: Tue, 1 Sep 2026 12:18:38 +0000 Subject: [PATCH 2/5] fix: attach to external teamby_backend_teamby network --- docker-compose.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index dce49fb..9acadbc 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -16,3 +16,9 @@ services: timeout: 5s retries: 3 start_period: 15s + networks: + - teamby_backend_teamby + +networks: + teamby_backend_teamby: + external: true From 91dddba990953cc19fe41bd6a9fc44189174cbcb Mon Sep 17 00:00:00 2001 From: Ali Alavi Date: Tue, 1 Sep 2026 12:28:02 +0000 Subject: [PATCH 3/5] feat: replace default nextjs favicon with TeamBy logo and metadata icons --- app/apple-icon.png | Bin 0 -> 5107 bytes app/favicon.ico | Bin 25931 -> 7593 bytes app/icon.png | Bin 0 -> 5107 bytes app/icon.svg | 268 +++++++++++++++++++++++++++++++++++++++++++++ app/layout.tsx | 9 +- public/favicon.ico | Bin 0 -> 7593 bytes 6 files changed, 275 insertions(+), 2 deletions(-) create mode 100644 app/apple-icon.png create mode 100644 app/icon.png create mode 100644 app/icon.svg create mode 100644 public/favicon.ico diff --git a/app/apple-icon.png b/app/apple-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..65f62af27b9312ef13f296695b2f3634c037c5a6 GIT binary patch literal 5107 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 VRMN~p4AuYu002ovPDHLkV1oLVtL6Xz literal 0 HcmV?d00001 diff --git a/app/favicon.ico b/app/favicon.ico index 718d6fea4835ec2d246af9800eddb7ffb276240c..bc64c2abe711d85b1deadb3e93207042959a7487 100644 GIT binary patch literal 7593 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 literal 25931 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 LrJugUA?W`A8`#=m diff --git a/app/icon.png b/app/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..65f62af27b9312ef13f296695b2f3634c037c5a6 GIT binary patch literal 5107 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 VRMN~p4AuYu002ovPDHLkV1oLVtL6Xz literal 0 HcmV?d00001 diff --git a/app/icon.svg b/app/icon.svg new file mode 100644 index 0000000..4ebb7c4 --- /dev/null +++ b/app/icon.svg @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/layout.tsx b/app/layout.tsx index c004173..edbebdc 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -19,6 +19,13 @@ export const metadata: Metadata = { title: "TeamBy.ai - AI-Powered Management for Team Leads", description: "TeamBy unifies your work and uses AI to optimize workflows, meetings, and costs—so you can manage smarter without chasing updates.", + icons: { + icon: [ + { url: "/assets/images/logo_icon.svg", type: "image/svg+xml" }, + { url: "/favicon.ico", sizes: "any" }, + ], + apple: "/assets/images/logo_icon.png", + }, }; export default function RootLayout({ @@ -28,11 +35,9 @@ export default function RootLayout({ }>) { return ( - {children} ); } - diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..bc64c2abe711d85b1deadb3e93207042959a7487 GIT binary patch literal 7593 zcmaKwRaDeb*Z+Sr)Q}F{B{ih9fW%PJokN3kcOyecH-gebNjE46NJ~${A`tH3y>i_@CYc60RWt#Bqy!wpIeizra`Pl z61D2JJHDj;V#*hXTV{d+k%AXXJtOnURc#+k{y>PIa!qVN@4Qk)GcvB5B;plN|g z6$Tg5?Hc*@%{L=gbzRPy{-(E*q_($hJqVTI@}_ip;Ux{Co~gIyH%=g9g|YX(U9p6& zFK)uUpH{ro|9B*&tSut8@5hF_?kHN8U3e$(RZA2DAOPayl#FhM|^Y^EA9oF+>t~;mq z9(8xD6Hroc3jQpIbpY$G2-9H2z08)!u`A)%h%XKG zwA37SPVCJK%MN@*{Mzm^A)pCekl|BRFD|FSKCT^Q%*Ji;m1ZXK&8{>9T3P~`;-IHN zjqT6te{}l4M`=$3-GBux(q((N3H1iKxnS=ulY>_dJuQj`5d=)48ylwA;QDHXQ<(ISwTw+N)j4_lGpVogapW;8Wp^||wU zkV7~bnSiIC5d>9?V0zbseO3azZbK*CCLdY#j%;#;{^=A@l2@0jm9Yr_U)0R-@0j6# z)a(@)cmV*Ay#K0s+F&%9MuGA%#9Z(4)rZ}NIuEPC0V8Ufu_#4rmXxO@%V-R)F^cJ& z&s#mV#F{pcPd(PVrMfZLi3w6uQlQZ-DR5ME0?F~eXr&FGgKxEdzI4k|b(P6|-)f0p zC=cOFR(!5%uljw}xgP{P+R2?WqC;XKpx$NIcax-M9d@X83Ylaqvfl+OC-GXb3>y&O zv*`o@aBzWb$mHyTHYKqT$LdLaE?N`|w8Ncb#qK3<&px9O%Aw0Ko2P*gz?J>3MT8h| z8zJOKPw$nlplfpT9{HQR%4KJ2GD6kD7VO3Wi4MP{Z+E2zU(`2E5fg$5x4bB!gioyq zMV=zXXf+?*llfkhwQB9ok6Z>!u0X0$c5nn}EgZ(YeDz zS}||n;tFGq&|)0-YBef1$_U2}{_kd7{}s}vqjR#OiB zfVmGhrUviN2U0BVt-i{YBVJfC8Kfgvmg&Hqmy$)30kGvDophFdIg>`4b$Cf_3*iJ> zIupDH2sPG;DAFJnLNNRnyj9V9WFc;Bgnyh%lwBL=U~grjR^7?h?S4Y3YxBLK9Qt3% zMqGwSI(sL-oW((>zcd4m3%oD0NOi6k3{0K`6L8Y0Vl32Yl~BFWPZS@c=ELw|FFzV9 zX{6!Mc(3}jV#G;^uG7Ts;swg}ctcLS1|*8Ly1h9=mCUCia6qW)qDznP_I23<29{b+k-XweBCmGKR7taPVgV9Aldc=XtLK_NtPjX!q zvf@}bd4CdT6vDIi;Y&$;bhH`N>`a72>LlTbj{duZ6L%~9mDcu)covm zH>;dqbzR|ilb{m&{vu@WX^ZV@&=ttiSFYO$JqEa#!l$ek%i|CU&oXl{e1P5o( zj;Ypr4&#!5i=qCK21OII$9d?#AN>vQ1A3;ZjS_8h9+TX-+BFhv;zL%nCz>$A> zq~;`r&$*JAlQ{p(t>zRI=~8mAH;#6H*+=~ArKKiWlVKG@30IbTxqunf%uP>!@xu(& zFb~{&yu0@Z;0>u)SZ$rQ!qcBdWCfmttX{RO@_vx{mI2FcOJ>Wk%h3xx|LnH~^=A1sM8tTsTD#ZhqxtP7}u>_g?vJi{IsDY|p;W+PH@Oue?cNAH&%0BRDI#h7;kFeIlOsz-OxqPOr#|o#(e@R;xg2++>Uaw*{ z-b!TW63k!4s1l~V+pgAo>5LNWafqUbf<@V2Qov&Ldbhq#@Q|&~Ws>Y>k?&^y;8#3b zhw(IOIak>%)8Pp(rH8$XRs0-}6&kF^8b+)OLI;As|H^jDVt|Sic(tHFw=p8^UtIKdMcMOQ+g2@?(^kRFZhf1& zGqcZ4sZ&e=xnM2QNqL5asN08l&EKQE4_+r}M3zGELr>&&1h}hG@TBi4hJC8k8zldL zQ<`wq+71Yb=_#bdb$bsdSp z?|QWEWlS31K<6S|I3OfR zJ?J0{BRuXn3Zac|GA#b6b?V-sosj(J5Y@T<5#$#Xy(2t0ZnD9KgVcDlae3U$0(3S# zSv0IASHtY3fEief^ZReXVE`$-5zNdICn&9@I$~9lvRYpER@4IP5Z~{Pc&$KzoODv% z&5W4`pOF(;Op{5Alf&qTn|*P}ZIO^%8omN7Z!OULFf-oFvRKA6;->k&5j4aBEk zdefgUn_hR{#Mf|_&j|ZB;x*FCn7f4e5R130IpJHN156fz;Bs(IL2n_!ivW7pk9dm< z$crn+J?Rs1DA%qNeOVED|psn@A zY5N1VZbf%6M}`t!lnJ`4%Ro_!XtXr{n&#T<9m@EfbYC(&U1uVCGzA~H1HOb%o*gN8 zO|=j(+zZPErm(daJnQKerI(R`*WF#;^$Y~BbhQF`1QV;#L*qrGglk<|cjN-~L%Qcj z_LDEUKIXkjfmnMKeW6)YH7F1IjsxvU&^+~04fVPv>atnvWconyakjC6F31p@ zz|^LaMjd+$e3_?w@sQ|q+4sC02kV1Q+SE^yOTQCLQ1znXdV%*--O(58+ z-F_V|It60^nX?yvMlhG>{bwksyU+ILIs9fnHLqecuj;_U6bqFZ0!M-Y$zlxKs-hAx zv|3;S!Lo)fF4lc0L`M*vu%2R2Z*x@r4j5~r~-<_niz z^&DZ>h)Hvn{qVq_EP6;=0dcQ}Lp!8~oIvQ&Wgz+mJkRF{n46okNVvlOO14ZxBG@_) zWUj1DhO8<7#`$m!OeXKewHI|mm`p%Fm}muO+|Q+@kAYT!E47|OCJW$VQs*MDWMPU} zWg%{?ELEvAsRUd;P29ie?nvFK;GW2 z0w7s{fdE<_wAr{1!Oh0(wP14*qqO7YsteyB*r;FB=O4@37h#eBs!Rj(@_Pw#Tz7U* za+S#T(8tcAB10>`bb z#0KW#wFc?czm}NM)9UUgWuM(#q!C09^4mYb@B_SO(eGC(z}=!^cNI9fVaL9ddxZi( z&9O7I9y8%N_E*!-2qF91?EoG>Biq`{dJTGau7zNBI}V3cMT<0NvUQc6n{V-4REZ)xml|Hw%A&_j$OBZhrd9 zL_9u~>KL^mI5u!1oe{wyPhd6x)?oCcL|cT3M*F>zt$kBLv$7cL)n_xm)WNbRGkI)D z_ETyajFhRE&0!Zc#K6aLk#v5fO6KKP8Dsr)Ex(!6DKYLj8kIZX(5Oj1E2zk=Wi;B@ zEGVh-2eA(mf(Rw%dMFb0CHDW!R+4{fG&pSayRoKyDKOogs3X9`aj475VIg<7ukMi7 z)y31UUcEA;)NAwsk1CIk040axZHD0kEG@5W?U&0x6cxwMnxjtdQyt1ytSW^$(KM*Y zO>jI`sM1TaDU?NwJk-YVvg|pIE#O;<8U0SEib!pFktnFKUd9oVQ%QbV2`j*=-coJT z+6rwx-K6T&v2Ok{#aeVU=$U2*<3(FN{8O$Wu_m;3bk!5>5PvVP;H45haInpqb(CFX zpVQ$`BU~MzPCO``#=$3Ssgy#I!*F7y_LUXkPJr}tKZ&6ciiuBEt=Gd-Agwp9tit($ zOX^fw!MgI#|TjjV)0u725-d$>xNi1<|`tS9=QFjD2w|j+l$Lz0%nnka14$nseU4>QBmARozY60uZ5D^%oW9Ei4I-t7bAKDN82A?-jqe%hPcVEJh59ZVD&AFOd~6ZzASP0XRr5?# z`ic-Mh>*&)3Rs;DtrC65)kbmrrByEUVZ`%hrgk^ikm;s8!%_7|<#l_g+v}=0v3G1T zANA8zC8*LS-*T)->2I}Q4}U2Reh5(J`HP-Y=VsM3RlMRP@l{FY&)gez;VMdhXnj~+ zP3>uW(332-%;L5l(op+l@QVf?<5TA0woH-jNW>3Jub2BRT<4=TTsKw`@|li}rz6w9 zjGz1&YZNe%=|F?MoZIUhc*7-6ir%KDSUqG57iHJFQ6(o=&Q?eEZDEW_-9pOM!)l9X z7sXx`4c-A`;Hwq_cPwfOx4KFDV+oEy)wjuNl3gyur><$!E*}^jY`EVUtLG{;Qi&RT zPcSi3#qm`%!T-KX85J+Of}bH&^OntrT-m9l+{X6@LsqjY&2Cl(mq$4ZSucaIdZ!Wz z%z{Jfx2I`8U6jMbm4=0{f!M4J2sIsSFRD@_*j}V#_^{Ulu zaxuj)>65{z%N+I#jru0F!iLLZaqImJgS1Z5Lp8-8(+Dtsqj%g|b9f|$=u2}N^VWdA zP5()ncVP1s7HGCofW4p{1P-b@9(x*FOt5fZ~3B(T0BNkTxzA1SqvdI@;&vR+n z7RZCJ;pkB1ZigGY=f*EWCAe}w!{5Z!5tQA%wwgPpr@J0dCwn5x`9()OrnQN+QbdL2 zzyY`lY;r#TL$=pLR~~RE)!O!#MJ$)b)3d{_N}o3$?~`YvZfaHAw@`2EFMNc5mBgYk z$zx`$sPP6dRW#9KXmDB+$V$MZL~?JU0KF(rbV@Y7k|2eQn1KqpF*!ZvNmaT-+EEOF z(fpM*gI|Zj^-Cba)Zm1d@^51T_q=DYIcb;BEvQ|%1vJkHy_{#*g@mT+DXa8z4L4B1 zE!q!LwzNXp9a>Hs^g3%=)*Wlyug$>(2`7HA{wwjH3r9EHLxWU*Hz8dI>_QJ2VVy)bsgSZDPBlPq$Xm8L zQp(*omvgi_Y%A9eG{h*4y`)=&5?Do+LgNHKSaLi$M_n%0jf^C68_`wcex^l*X4mD_ zLj@e_u=c$H3tWTRB?VE;u~&47nBDxAFGl<4n8yY2-qJjJW=sEOf8F|iqZ7g<7lDTv z>j6-wh*9uaqgfOwiQuTNf2G43RLs*VSg4R2{7}e8VXonV!XV$U;wIbJ?mBvR*893t z$x8+6g)9Pb47;5`2w0MJ1%Jjx>mDcDQ~1tu@r>RC1Gqj&=|IacYP@84MYMs=j3Y## z!h>N$5P=#ZMmwe{@_~$l#-;K5(j##iE~sQEGjM+|3G(UvdV`y&3t^K_JlAGTbQJru zuK1yFf}ur(t>CU#?zMk2b40t&*RzG{<+E0*90c5F03HI2R!uy6+>ihKGf+_>$jyrz zG(8FL<1QCsXvK+=&PC!y;G<;{#zNm0mS{pE?G8CfrLEODf2+!m>yA5MoasS6fJ-W4 zRP=NX=?}j)h{mNGVm|f=lKI6Oey~x!;$e?^hC`)*11#&+g8r$T3q!C@fOl!;;WC)KHNq@33+GSN>_ zwybjG=rQQIE76i3abKI#WQb=F__@!GRK}d04SQmpqz5?C@U#B1@Qnlk&FNbx+mPcx;AvoiVD1VP^ zDiFJ=o-kflP8(gs1iY^^Cupf>Xm{)2ZaH>!bg``b1gfs7!Jc8bO_-KaC@z7&o0$zV z?BO^W*~IcDNYhdimwwC0HSwO|4BZ-kjp>WT#dRhJ9FI`m77~M_FRfY20h^C>-Y&lF zmPc_#Dd$SXF>bw)D~R+zwxpCQQ25%CDj3JqdCrR57V4ae<_JWc%Xc?%O<=hz7r&5- zqU*rTd#jlc_A06b4_il02m&L7L!dDB9Z2g)WR;wMSeP*OPjD(^rBq3&(oC;2?$(i` zkZU)D>(w_GiQ8i6Xdg$m_`bU*SE9P8GW?0|3dq2`7fX5Nc0}Ke~UOga*^KZUoGoEx0K*EJX5&kkPHe7=BFMQw{B@^pk zt;d)pl}i^rDWadKyV2t=nSfTJB@>m-UBRvD&(fW@oXraZWA+%7YclmG@iUv4|&YuxzH8s z6i2#(TEBqBpC`|Wv|@T~LrHf4;H$N;t89usn3;egV}dy>8vuU~@2q4vSfB4}Vqh&D zz!i$5b$#seT4{`n&YHkqeQGffUAqc!A}w4B^~{=X~euZzl)F!V@tqt=r@ z5e`H{GS?K6p<8r+?Xf(%;3oF6JV0apljW7@6-xLl@XJ@j*rkBrZx(o0Z5pfojKlj} zZEt6|rIYM}PF7Mp@<5^gFrVbZpssN+-VsUL1=P4y`13adz>qL)i#SB5?U50Xw zrOmn$THCNq0?htocK^yF)>Lgl(|R@+>O7aoo~kB4Uw!zd zi{>WL#r7y_EFI}!5}t2nj>b!oYkWE{^+xi@D7X7sbxleutf{HNu2r||iM*e$qW}eR z2DFCGjLA?9pB$_n+LLWJ)$Ec|u~82-IXOo@ka%V*s1$k$* dn{Gcgggic;g(^N!<2`-Qn*n_c{{O#o{vWnL?gIb- literal 0 HcmV?d00001 From 3401d7ed5fb2b35d647868f7af0344da981765f5 Mon Sep 17 00:00:00 2001 From: Ali Alavi Date: Tue, 1 Sep 2026 16:10:05 +0000 Subject: [PATCH 4/5] ci: add Jenkinsfile for automated CI/CD pipeline on push --- Jenkinsfile | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 Jenkinsfile diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..9f1d030 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,52 @@ +pipeline { + environment { + develop_server_ip = '' + develop_server_name = '' + production_server_ip = "88.99.212.243" + production_server_name = "newhorizon_germany_001_server" + project_path = "/projects/teamby/teamby_landing" + version = "master" + gitBranch = "origin/master" + } + agent any + stages { + stage('deploy') { + steps { + script { + if (gitBranch == "origin/master") { + try { + withCredentials([usernamePassword(credentialsId: production_server_name, usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD')]) { + sh 'sshpass -p $PASSWORD ssh -p 1782 $USERNAME@$production_server_ip -o StrictHostKeyChecking=no "cd $project_path && ./runner.sh"' + } + } catch (Exception e) { + def lastCommit = sh(script: 'git log -1 --pretty=format:"%h - %s (%an)"', returnStdout: true).trim() + sh """ + curl -s -F chat_id=-1002316394394 \ + -F message_thread_id=1629 \ + -F document=@/var/jenkins_home/jobs/${env.JOB_NAME}/builds/${env.BUILD_NUMBER}/log \ + -F caption='Project name: #${env.JOB_NAME} \ +Build status is FAILED \ +Build url: ${BUILD_URL} \ +Last Commit: ${lastCommit}' \ + https://api.telegram.org/bot7207581748:AAH1y1pW8L9K_jWlKx3Xj_xV3pZl4Zq9V1Y/sendDocument || true + """ + currentBuild.result = 'FAILURE' + throw e + } + def lastCommit = sh(script: 'git log -1 --pretty=format:"%h - %s (%an)"', returnStdout: true).trim() + sh """ + curl -s -F chat_id=-1002316394394 \ + -F message_thread_id=1629 \ + -F document=@/var/jenkins_home/jobs/${env.JOB_NAME}/builds/${env.BUILD_NUMBER}/log \ + -F caption='Project name: #${env.JOB_NAME} \ +Build status is SUCCESS \ +Build url: ${BUILD_URL} \ +Last Commit: ${lastCommit}' \ + https://api.telegram.org/bot7207581748:AAH1y1pW8L9K_jWlKx3Xj_xV3pZl4Zq9V1Y/sendDocument || true + """ + } + } + } + } + } +} From 02aa5eea4bb30f0577499fc8073d83e3b3ef1c21 Mon Sep 17 00:00:00 2001 From: Ali Alavi Date: Tue, 1 Sep 2026 16:11:35 +0000 Subject: [PATCH 5/5] docs: enable automated CI/CD pipeline in README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index e215bc4..645b60b 100644 --- a/README.md +++ b/README.md @@ -34,3 +34,4 @@ You can check out [the Next.js GitHub repository](https://github.com/vercel/next The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. +# TeamBy Landing Page - Automated CI/CD Enabled