From a96b74eeb41ac059207e6194680c76a3dbd7a5bb Mon Sep 17 00:00:00 2001 From: corgifist Date: Mon, 21 Jul 2025 19:18:31 +0300 Subject: [PATCH] build: added `Dockerfile` and `docker-compose.yaml` --- .dockerignore | 2 + docker-compose.yaml | 12 ++ next.config.ts | 2 +- public/clipfusion-community-logo.png | Bin 0 -> 3619 bytes public/clipfusion-community-logo.svg | 106 ++++++++++++++++++ src/Dockerfile | 50 +++++++++ .../clipfusion-logo/ClipFusionLogo.tsx | 2 +- src/components/dashboard/Dashboard.tsx | 2 +- 8 files changed, 173 insertions(+), 3 deletions(-) create mode 100644 .dockerignore create mode 100644 docker-compose.yaml create mode 100644 public/clipfusion-community-logo.png create mode 100644 public/clipfusion-community-logo.svg create mode 100644 src/Dockerfile diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..9b76e35 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +.next/ +node_modules/ \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..9bead98 --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,12 @@ +services: + web: + build: + context: . + dockerfile: ./src/Dockerfile + target: runner + ports: + - "3000:3000" + +networks: + default: + name: clipfusion-network \ No newline at end of file diff --git a/next.config.ts b/next.config.ts index e9ffa30..12cecbe 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/public/clipfusion-community-logo.png b/public/clipfusion-community-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c5e7c667c0775e918074175b6e0ff0c2af1dc3b3 GIT binary patch literal 3619 zcmds)|4$QV9LG;Ij=4CUk_EB0ZX-H2EJFhUl%gB65JjeNh}43y0#fL@(t%(pRkKV- zkZ$S#1*sbY#$oB8-&AP3FVZg7a)Z&<(hVX_QE5vRX>U;4?kUTD*!}~_(lJwqj%+3@eZCBPT=tz;Q#-aTz@M zAT@bUW<|5ZG{nHA_I^I}E3&S0lg@r;&(;&hm>;g6TvPDV>w=Ws>-yeh6Ab5G36Y&y zKzlX^T{SIyN9Xy+wcn>McxR1eweC_kj{Mg%E2>r0I}1_PXPDJyrEyx0H=r`=xGbst z77d1ZNnV@%wO5}zqj*$u+N{r>FiH=|}}7A$Q}grKLYtq`>N zO9(o%8*C)#We5rmf3YWi%kozpMe!4FQxbDE!-IIs+H|dNC?|~-n;tXf&z=wIi=_4Y zZr6%6arag97Ags|men)nLkZkVn7^Os@&9`MX2_)JM_E>QEN>f;3idmLG%Dg zIAz#k$}h5HUAFfU6**0`1_X(n44y=gw!JQTMzbzQ%czYnH@R7q`uMT^HdwqsJUq7o zg1!RhigggQHU)xqZ(asLXJ6n6nH8;$=UiyL$*szCnN4im!%mmnK(7&3;w=nG^Z+qt z%3|LBj~K5f{&=?9HGfjy9@oT`$hkK&`maWDD?OU+8lsBst@v0Qa_S~R?`q>EaW4EK zsTR_s3i+&BRuK%UIjnBeHy&^3i0w`yr?99ejR{EW)PP&AL{-Ss@1+6cH%8XB2mQJ%*Gmw!NP1uXe9JZ_-Hh74e+f zw}~UJ69#qX6Qqh1)H?i!vb0ZccknI z`;VS?1OOJ7mJ~f~w^|bK9+XXq_^H?CD7>z{A8$(+jzGp+d0l%6x760im(Qw};o@RhOKT#MH)Zn(Dowsb4Lr9kZVBdA3 zhyv}=dV5B^Bu$!)D-@{Y0g&T5f}jOe@Qd$W|0|FRZxo-8yJx_Q^n)!Ep$Z3~mJo6Te~tGfMVUwppq0U^%G@RwKZ;9sGP$!6g9RJBj1gR)9VVm~3oLc8KEoAg zcQ%0lD&%u|e1>Ur2y^mzF4M)ie!M{;B6uGq3~cH`M%4*Q0f2{kd$$mz1~%>+p`&-# zWL#6vtoCHg0FklDNR~!SXT$m&2T;8DVmYG~*kXQO6nFnjf!j6g!S$7RZcTe|r*7T@ zx$Hvtiyg)OC*}@TAT&hgc{m#_0VfMp5tyyOTaFm#hZ;x&M5zR8(=8fVGYAc`p)ram zVz8Zmx_FVU3V$e;UqhW&D*0&aVzsAiKCk_ax?W$HG0YW6#@VWoHu<%Q5_K%mmY^Y) zIgQfA_0*>2xW}DF>E5P^l6mD(Ium3N-|gH{S{;^zFB78qz!$CSAt-sN1hjy}M@J2! zfVySVq8I~Uq&k6Ap9^xq@Hn~Y1h6il6p&^AMhg()?_CO6wL3)fxRp23XwgZc$28%6 zBg%dQ2~{=8=M8y-AWqvv$Q0WyUO*^PzzvL5oVUf)c3KZ&91QQ%t>2-gWx}Ao^{6Wr z&$bUwI}Fv^GVF&i#QG?_@5)kxM>^Ai4YfW9R+`k`5hB literal 0 HcmV?d00001 diff --git a/public/clipfusion-community-logo.svg b/public/clipfusion-community-logo.svg new file mode 100644 index 0000000..a2750e5 --- /dev/null +++ b/public/clipfusion-community-logo.svg @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Dockerfile b/src/Dockerfile new file mode 100644 index 0000000..b153901 --- /dev/null +++ b/src/Dockerfile @@ -0,0 +1,50 @@ +FROM node:lts-alpine3.22 AS base + +FROM base AS deps +RUN apk add --no-cache libc6-compat +WORKDIR /app + +COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* .npmrc* ./ +RUN \ + if [ -f yarn.lock ]; then yarn --frozen-lockfile; \ + elif [ -f package-lock.json ]; then npm ci; \ + elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm i --frozen-lockfile; \ + else echo "Lockfile not found." && exit 1; \ + fi + +FROM base AS builder +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY . . + +ENV NEXT_TELEMETRY_DISABLED=1 + +RUN \ + if [ -f yarn.lock ]; then yarn run build; \ + elif [ -f package-lock.json ]; then npm run build; \ + elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm run build; \ + else echo "Lockfile not found." && exit 1; \ + fi + +FROM base AS runner +WORKDIR /app + +ENV NODE_ENV=production +ENV NEXT_TELEMETRY_DISABLED=1 + +RUN addgroup --system --gid 1001 nodejs +RUN 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 + +ENV PORT=3000 + +ENV HOSTNAME="0.0.0.0" +CMD ["node", "server.js"] \ No newline at end of file diff --git a/src/components/clipfusion-logo/ClipFusionLogo.tsx b/src/components/clipfusion-logo/ClipFusionLogo.tsx index eaf41ec..7b1bf59 100644 --- a/src/components/clipfusion-logo/ClipFusionLogo.tsx +++ b/src/components/clipfusion-logo/ClipFusionLogo.tsx @@ -8,7 +8,7 @@ export const ClipFusionLogo = (props: { className?: string }): ReactNode => (
- ClipFusion Logo + ClipFusion Logo {props.children}
); \ No newline at end of file diff --git a/src/components/dashboard/Dashboard.tsx b/src/components/dashboard/Dashboard.tsx index 7566d7a..e24d860 100644 --- a/src/components/dashboard/Dashboard.tsx +++ b/src/components/dashboard/Dashboard.tsx @@ -32,7 +32,7 @@ export const Dashboard = (): ReactNode => { -

ClipFusion

+

Community