Fixed production issues, fixed render issues, adde
All checks were successful
Main / build-and-push-docker-image (20.x) (push) Successful in 8m4s
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:
2
.github/workflows/main.yml
vendored
2
.github/workflows/main.yml
vendored
@@ -53,6 +53,7 @@ jobs:
|
|||||||
context: .
|
context: .
|
||||||
push: ${{ !github.event.pull_request.head.repo.fork }}
|
push: ${{ !github.event.pull_request.head.repo.fork }}
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
build-args: API_URL=DATABASE_URL=${{ secrets.DATABASE_URL }}
|
||||||
- name: Build and Push Latest Docker Image
|
- name: Build and Push Latest Docker Image
|
||||||
id: build-and-push-latest
|
id: build-and-push-latest
|
||||||
uses: docker/build-push-action@v4
|
uses: docker/build-push-action@v4
|
||||||
@@ -61,3 +62,4 @@ jobs:
|
|||||||
context: .
|
context: .
|
||||||
push: true
|
push: true
|
||||||
tags: ${{ env.REGISTRY }}/${{ env.OWNER }}/${{ env.IMAGE_NAME }}:latest
|
tags: ${{ env.REGISTRY }}/${{ env.OWNER }}/${{ env.IMAGE_NAME }}:latest
|
||||||
|
build-args: DATABASE_URL=${{ secrets.DATABASE_URL }}
|
||||||
|
|||||||
94
Dockerfile
94
Dockerfile
@@ -1,72 +1,40 @@
|
|||||||
# syntax=docker.io/docker/dockerfile:1
|
# --- Stage 1: Dependencies ---
|
||||||
|
FROM node:20-alpine AS dependencies
|
||||||
FROM node:20-alpine AS base
|
|
||||||
|
|
||||||
# Enable Corepack
|
|
||||||
RUN corepack enable
|
RUN corepack enable
|
||||||
|
RUN corepack prepare yarn@stable --activate
|
||||||
# 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
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
COPY package.json yarn.lock .yarnrc.yml ./
|
||||||
|
RUN yarn install
|
||||||
|
|
||||||
# Install dependencies based on the preferred package manager
|
# --- Stage 2: Builder ---
|
||||||
COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* .npmrc* ./
|
FROM node:20-alpine AS builder
|
||||||
RUN \
|
RUN corepack enable
|
||||||
if [ -f yarn.lock ]; then yarn --frozen-lockfile; \
|
RUN corepack prepare yarn@stable --activate
|
||||||
elif [ -f package-lock.json ]; then npm ci; \
|
ARG DATABASE_URL
|
||||||
elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm i --frozen-lockfile; \
|
ENV DATABASE_URL=${DATABASE_URL}
|
||||||
else echo "Lockfile not found." && exit 1; \
|
RUN corepack enable
|
||||||
fi
|
RUN corepack prepare yarn@stable --activate
|
||||||
|
|
||||||
|
|
||||||
# Rebuild the source code only when needed
|
|
||||||
FROM base AS builder
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY --from=deps /app/node_modules ./node_modules
|
COPY --from=dependencies /app/node_modules ./node_modules
|
||||||
COPY . .
|
COPY . ./
|
||||||
|
RUN yarn prisma-gen
|
||||||
|
RUN yarn build
|
||||||
|
|
||||||
# Next.js collects completely anonymous telemetry data about general usage.
|
# --- Stage 3: Runner ---
|
||||||
# Learn more here: https://nextjs.org/telemetry
|
FROM node:20-alpine AS runner
|
||||||
# Uncomment the following line in case you want to disable telemetry during the build.
|
RUN corepack enable
|
||||||
# ENV NEXT_TELEMETRY_DISABLED=1
|
RUN corepack prepare yarn@stable --activate
|
||||||
|
ARG DATABASE_URL
|
||||||
RUN \
|
ENV DATABASE_URL=${DATABASE_URL}
|
||||||
if [ -f yarn.lock ]; then yarn run build; \
|
RUN corepack enable
|
||||||
elif [ -f package-lock.json ]; then npm run build; \
|
RUN corepack prepare yarn@stable --activate
|
||||||
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
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
COPY --from=dependencies /app/node_modules ./node_modules
|
||||||
ENV NODE_ENV=production
|
COPY --from=builder /app/src/prisma/generated ./src/prisma/generated
|
||||||
# Uncomment the following line in case you want to disable telemetry during runtime.
|
COPY --from=builder /app/.next ./.next
|
||||||
# ENV NEXT_TELEMETRY_DISABLED=1
|
COPY --from=builder /app/.yarn ./.yarn
|
||||||
|
COPY . ./
|
||||||
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
|
|
||||||
|
|
||||||
EXPOSE 3000
|
EXPOSE 3000
|
||||||
|
|
||||||
ENV PORT=3000
|
CMD ["yarn", "start"]
|
||||||
|
|
||||||
# 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"]
|
|
||||||
|
|||||||
@@ -3,8 +3,7 @@ import type { NextConfig } from "next";
|
|||||||
const nextConfig: NextConfig = {
|
const nextConfig: NextConfig = {
|
||||||
experimental: {
|
experimental: {
|
||||||
optimizePackageImports: ["@chakra-ui/react"]
|
optimizePackageImports: ["@chakra-ui/react"]
|
||||||
},
|
}
|
||||||
output: "standalone"
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default nextConfig;
|
export default nextConfig;
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ const StatsList = ({
|
|||||||
</Text>
|
</Text>
|
||||||
</VStack>
|
</VStack>
|
||||||
<Flex w="80%" flexDirection={{ base: "column", md: "row" }} gap={4}>
|
<Flex w="80%" flexDirection={{ base: "column", md: "row" }} gap={4}>
|
||||||
{groups ? (
|
{groups && groups >= 0 ? (
|
||||||
<SingleStatComponent
|
<SingleStatComponent
|
||||||
loading={loading}
|
loading={loading}
|
||||||
title="Groups Bot Helped"
|
title="Groups Bot Helped"
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ export default function RootLayout({
|
|||||||
isClient: typeof window !== "undefined"
|
isClient: typeof window !== "undefined"
|
||||||
});
|
});
|
||||||
const client = createClient({
|
const client = createClient({
|
||||||
url: process.env.NEXT_PUBLIC_GRAPHQL_URL || "",
|
url: "/api/graphql",
|
||||||
exchanges: [cacheExchange, ssr, fetchExchange],
|
exchanges: [cacheExchange, ssr, fetchExchange],
|
||||||
suspense: true
|
suspense: true
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -85,14 +85,10 @@ export default function Home() {
|
|||||||
);
|
);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!thirtyDayStatsFetching && thirtyDayStats.getStatsRange) {
|
if (!thirtyDayStatsFetching && thirtyDayStats && !thirtyDayStatsError) {
|
||||||
setLineChartArrState(lineChartArr(thirtyDayStats.getStatsRange));
|
setLineChartArrState(lineChartArr(thirtyDayStats.getStatsRange));
|
||||||
}
|
}
|
||||||
}, [
|
}, [thirtyDayStats, thirtyDayStatsError, thirtyDayStatsFetching]);
|
||||||
thirtyDayStats.getStatsRange,
|
|
||||||
thirtyDayStatsError,
|
|
||||||
thirtyDayStatsFetching
|
|
||||||
]);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Fragment>
|
<Fragment>
|
||||||
@@ -152,23 +148,46 @@ export default function Home() {
|
|||||||
</VStack>
|
</VStack>
|
||||||
</VStack>
|
</VStack>
|
||||||
<VStack gap={10} w="100%">
|
<VStack gap={10} w="100%">
|
||||||
<StatsList
|
{totalGroups ? (
|
||||||
title="Total Stats"
|
<StatsList
|
||||||
loading={totalStatsFetching || totalGroupsFetching}
|
title="Total Stats"
|
||||||
error={totalStatsError || totalGroupsError}
|
loading={totalStatsFetching || totalGroupsFetching}
|
||||||
groups={totalGroups.getTotalGroups}
|
error={totalStatsError || totalGroupsError}
|
||||||
links={totalStats.getTotalStats.linksDeleted}
|
groups={totalGroups.getTotalGroups}
|
||||||
commands={totalStats.getTotalStats.commandResponses}
|
links={totalStats.getTotalStats.linksDeleted}
|
||||||
triggers={totalStats.getTotalStats.timesTriggered}
|
commands={totalStats.getTotalStats.commandResponses}
|
||||||
/>
|
triggers={totalStats.getTotalStats.timesTriggered}
|
||||||
<StatsList
|
/>
|
||||||
title="Today's Stats"
|
) : (
|
||||||
loading={todaysStatsFetching}
|
<StatsList
|
||||||
error={todaysStatsError}
|
title="Total Stats"
|
||||||
links={todayStats.getTodayStats.linksDeleted}
|
loading={totalStatsFetching || totalGroupsFetching}
|
||||||
commands={todayStats.getTodayStats.commandResponses}
|
error={totalStatsError || totalGroupsError}
|
||||||
triggers={todayStats.getTodayStats.timesTriggered}
|
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>
|
||||||
<VStack w="95%" gap="5vh">
|
<VStack w="95%" gap="5vh">
|
||||||
<VStack gap={1}>
|
<VStack gap={1}>
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ const LineChartComponent = ({
|
|||||||
axisLine={false}
|
axisLine={false}
|
||||||
dataKey={chart.key("day")}
|
dataKey={chart.key("day")}
|
||||||
stroke={chart.color("border")}
|
stroke={chart.color("border")}
|
||||||
// label={{ value: "Day", position: "bottom" }}
|
// label={{ value: "Day", position: "bottom" }}
|
||||||
/>
|
/>
|
||||||
<YAxis
|
<YAxis
|
||||||
width="auto"
|
width="auto"
|
||||||
@@ -40,7 +40,7 @@ const LineChartComponent = ({
|
|||||||
tickLine={false}
|
tickLine={false}
|
||||||
tickMargin={10}
|
tickMargin={10}
|
||||||
stroke={chart.color("border")}
|
stroke={chart.color("border")}
|
||||||
// label={{ value: label, position: "left", angle: -90 }}
|
// label={{ value: label, position: "left", angle: -90 }}
|
||||||
/>
|
/>
|
||||||
<Tooltip
|
<Tooltip
|
||||||
animationDuration={100}
|
animationDuration={100}
|
||||||
|
|||||||
Reference in New Issue
Block a user