Fixed production issues, fixed render issues, added secret and env variables into dockerfile and gihub actions files, remade dockerfile and github actions
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