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: .
|
||||
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 }}
|
||||
|
||||
94
Dockerfile
94
Dockerfile
@@ -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"]
|
||||
|
||||
@@ -3,8 +3,7 @@ import type { NextConfig } from "next";
|
||||
const nextConfig: NextConfig = {
|
||||
experimental: {
|
||||
optimizePackageImports: ["@chakra-ui/react"]
|
||||
},
|
||||
output: "standalone"
|
||||
}
|
||||
};
|
||||
|
||||
export default nextConfig;
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
});
|
||||
|
||||
@@ -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}>
|
||||
|
||||
@@ -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}
|
||||
|
||||
Reference in New Issue
Block a user