Fixed production issues, fixed render issues, adde
All checks were successful
Main / build-and-push-docker-image (20.x) (push) Successful in 8m4s

d secret and env variables into dockerfile and gihub actions files, remade dockerfile and github actions

added build stage

fix build step

remove the second section

asdas

test new file

fix env variables

env

enable corepack

test yarn install

new base

remove corepack

fix yarn install

yarn install

new base (again)

new base

corepack

install yarn

enable corepack

revert base

fix yarn

yarn install

fix build errors

new file

remove in-line comment

update copy command

copy node_monudes

test

workdir top level

ls app folder

test ls

update yarn install

copy more files

remove copy

fix copy

move workdir to top level

fix copy

check folder

test

fix copy - last try

prisma gen

database url secret / env variable for ci/cd

args

env var

args

fix env

fix copy

fix build file name

fix start command

added copy

ANOTHER COPY

copy prisma generated files, fix start command

remove standalone config

fix urql url

update display
This commit is contained in:
2025-12-05 20:37:26 -05:00
parent 1893b8b371
commit e0974d1468
7 changed files with 80 additions and 92 deletions

View File

@@ -53,6 +53,7 @@ jobs:
context: .
push: ${{ !github.event.pull_request.head.repo.fork }}
tags: ${{ steps.meta.outputs.tags }}
build-args: API_URL=DATABASE_URL=${{ secrets.DATABASE_URL }}
- name: Build and Push Latest Docker Image
id: build-and-push-latest
uses: docker/build-push-action@v4
@@ -61,3 +62,4 @@ jobs:
context: .
push: true
tags: ${{ env.REGISTRY }}/${{ env.OWNER }}/${{ env.IMAGE_NAME }}:latest
build-args: DATABASE_URL=${{ secrets.DATABASE_URL }}

View File

@@ -1,72 +1,40 @@
# syntax=docker.io/docker/dockerfile:1
FROM node:20-alpine AS base
# Enable Corepack
# --- Stage 1: Dependencies ---
FROM node:20-alpine AS dependencies
RUN corepack enable
# Set Yarn to the latest stable version
RUN yarn set version stable
# Install dependencies only when needed
FROM base AS deps
# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
RUN apk add --no-cache libc6-compat
RUN corepack prepare yarn@stable --activate
WORKDIR /app
COPY package.json yarn.lock .yarnrc.yml ./
RUN yarn install
# Install dependencies based on the preferred package manager
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
# Rebuild the source code only when needed
FROM base AS builder
# --- Stage 2: Builder ---
FROM node:20-alpine AS builder
RUN corepack enable
RUN corepack prepare yarn@stable --activate
ARG DATABASE_URL
ENV DATABASE_URL=${DATABASE_URL}
RUN corepack enable
RUN corepack prepare yarn@stable --activate
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
COPY --from=dependencies /app/node_modules ./node_modules
COPY . ./
RUN yarn prisma-gen
RUN yarn build
# Next.js collects completely anonymous telemetry data about general usage.
# Learn more here: https://nextjs.org/telemetry
# Uncomment the following line in case you want to disable telemetry during the build.
# 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
# Production image, copy all the files and run next
FROM base AS runner
# --- Stage 3: Runner ---
FROM node:20-alpine AS runner
RUN corepack enable
RUN corepack prepare yarn@stable --activate
ARG DATABASE_URL
ENV DATABASE_URL=${DATABASE_URL}
RUN corepack enable
RUN corepack prepare yarn@stable --activate
WORKDIR /app
ENV NODE_ENV=production
# Uncomment the following line in case you want to disable telemetry during runtime.
# ENV NEXT_TELEMETRY_DISABLED=1
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
COPY --from=builder /app/public ./public
# Automatically leverage output traces to reduce image size
# https://nextjs.org/docs/advanced-features/output-file-tracing
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
USER nextjs
COPY --from=dependencies /app/node_modules ./node_modules
COPY --from=builder /app/src/prisma/generated ./src/prisma/generated
COPY --from=builder /app/.next ./.next
COPY --from=builder /app/.yarn ./.yarn
COPY . ./
EXPOSE 3000
ENV PORT=3000
# server.js is created by next build from the standalone output
# https://nextjs.org/docs/pages/api-reference/config/next-config-js/output
ENV HOSTNAME="0.0.0.0"
CMD ["node", "server.js"]
CMD ["yarn", "start"]

View File

@@ -3,8 +3,7 @@ import type { NextConfig } from "next";
const nextConfig: NextConfig = {
experimental: {
optimizePackageImports: ["@chakra-ui/react"]
},
output: "standalone"
}
};
export default nextConfig;

View File

@@ -33,7 +33,7 @@ const StatsList = ({
</Text>
</VStack>
<Flex w="80%" flexDirection={{ base: "column", md: "row" }} gap={4}>
{groups ? (
{groups && groups >= 0 ? (
<SingleStatComponent
loading={loading}
title="Groups Bot Helped"

View File

@@ -20,7 +20,7 @@ export default function RootLayout({
isClient: typeof window !== "undefined"
});
const client = createClient({
url: process.env.NEXT_PUBLIC_GRAPHQL_URL || "",
url: "/api/graphql",
exchanges: [cacheExchange, ssr, fetchExchange],
suspense: true
});

View File

@@ -85,14 +85,10 @@ export default function Home() {
);
useEffect(() => {
if (!thirtyDayStatsFetching && thirtyDayStats.getStatsRange) {
if (!thirtyDayStatsFetching && thirtyDayStats && !thirtyDayStatsError) {
setLineChartArrState(lineChartArr(thirtyDayStats.getStatsRange));
}
}, [
thirtyDayStats.getStatsRange,
thirtyDayStatsError,
thirtyDayStatsFetching
]);
}, [thirtyDayStats, thirtyDayStatsError, thirtyDayStatsFetching]);
return (
<Fragment>
@@ -152,23 +148,46 @@ export default function Home() {
</VStack>
</VStack>
<VStack gap={10} w="100%">
<StatsList
title="Total Stats"
loading={totalStatsFetching || totalGroupsFetching}
error={totalStatsError || totalGroupsError}
groups={totalGroups.getTotalGroups}
links={totalStats.getTotalStats.linksDeleted}
commands={totalStats.getTotalStats.commandResponses}
triggers={totalStats.getTotalStats.timesTriggered}
/>
<StatsList
title="Today's Stats"
loading={todaysStatsFetching}
error={todaysStatsError}
links={todayStats.getTodayStats.linksDeleted}
commands={todayStats.getTodayStats.commandResponses}
triggers={todayStats.getTodayStats.timesTriggered}
/>
{totalGroups ? (
<StatsList
title="Total Stats"
loading={totalStatsFetching || totalGroupsFetching}
error={totalStatsError || totalGroupsError}
groups={totalGroups.getTotalGroups}
links={totalStats.getTotalStats.linksDeleted}
commands={totalStats.getTotalStats.commandResponses}
triggers={totalStats.getTotalStats.timesTriggered}
/>
) : (
<StatsList
title="Total Stats"
loading={totalStatsFetching || totalGroupsFetching}
error={totalStatsError || totalGroupsError}
groups={0}
links={0}
commands={0}
triggers={0}
/>
)}
{todayStats ? (
<StatsList
title="Today's Stats"
loading={todaysStatsFetching}
error={todaysStatsError}
links={todayStats.getTodayStats.linksDeleted}
commands={todayStats.getTodayStats.commandResponses}
triggers={todayStats.getTodayStats.timesTriggered}
/>
) : (
<StatsList
title="Today's Stats"
loading={todaysStatsFetching}
error={todaysStatsError}
links={0}
commands={0}
triggers={0}
/>
)}
</VStack>
<VStack w="95%" gap="5vh">
<VStack gap={1}>

View File

@@ -32,7 +32,7 @@ const LineChartComponent = ({
axisLine={false}
dataKey={chart.key("day")}
stroke={chart.color("border")}
// label={{ value: "Day", position: "bottom" }}
// label={{ value: "Day", position: "bottom" }}
/>
<YAxis
width="auto"
@@ -40,7 +40,7 @@ const LineChartComponent = ({
tickLine={false}
tickMargin={10}
stroke={chart.color("border")}
// label={{ value: label, position: "left", angle: -90 }}
// label={{ value: label, position: "left", angle: -90 }}
/>
<Tooltip
animationDuration={100}