fix(web): rename mail env vars and pass build context to Dockerfile to fix CMS white screen
All checks were successful
Build & Deploy / 🔍 Prepare (push) Successful in 10s
Build & Deploy / 🏗️ Build (push) Successful in 23m32s
Build & Deploy / 🚀 Deploy (push) Successful in 2m25s
Build & Deploy / 🧪 QA (push) Successful in 3m50s
Build & Deploy / 🧪 Post-Deploy Verification (push) Successful in 4m49s
Build & Deploy / 🔔 Notify (push) Successful in 3s
All checks were successful
Build & Deploy / 🔍 Prepare (push) Successful in 10s
Build & Deploy / 🏗️ Build (push) Successful in 23m32s
Build & Deploy / 🚀 Deploy (push) Successful in 2m25s
Build & Deploy / 🧪 QA (push) Successful in 3m50s
Build & Deploy / 🧪 Post-Deploy Verification (push) Successful in 4m49s
Build & Deploy / 🔔 Notify (push) Successful in 3s
This commit is contained in:
12
Dockerfile
12
Dockerfile
@@ -7,11 +7,23 @@ ARG NEXT_PUBLIC_BASE_URL
|
|||||||
ARG NEXT_PUBLIC_TARGET
|
ARG NEXT_PUBLIC_TARGET
|
||||||
ARG UMAMI_API_ENDPOINT
|
ARG UMAMI_API_ENDPOINT
|
||||||
ARG NPM_TOKEN
|
ARG NPM_TOKEN
|
||||||
|
ARG S3_ENDPOINT
|
||||||
|
ARG S3_ACCESS_KEY
|
||||||
|
ARG S3_SECRET_KEY
|
||||||
|
ARG S3_BUCKET
|
||||||
|
ARG S3_REGION
|
||||||
|
ARG S3_PREFIX
|
||||||
|
|
||||||
# Environment variables for Next.js build
|
# Environment variables for Next.js build
|
||||||
ENV NEXT_PUBLIC_BASE_URL=$NEXT_PUBLIC_BASE_URL
|
ENV NEXT_PUBLIC_BASE_URL=$NEXT_PUBLIC_BASE_URL
|
||||||
ENV NEXT_PUBLIC_TARGET=$NEXT_PUBLIC_TARGET
|
ENV NEXT_PUBLIC_TARGET=$NEXT_PUBLIC_TARGET
|
||||||
ENV UMAMI_API_ENDPOINT=$UMAMI_API_ENDPOINT
|
ENV UMAMI_API_ENDPOINT=$UMAMI_API_ENDPOINT
|
||||||
|
ENV S3_ENDPOINT=$S3_ENDPOINT
|
||||||
|
ENV S3_ACCESS_KEY=$S3_ACCESS_KEY
|
||||||
|
ENV S3_SECRET_KEY=$S3_SECRET_KEY
|
||||||
|
ENV S3_BUCKET=$S3_BUCKET
|
||||||
|
ENV S3_REGION=$S3_REGION
|
||||||
|
ENV S3_PREFIX=$S3_PREFIX
|
||||||
ENV SKIP_RUNTIME_ENV_VALIDATION=true
|
ENV SKIP_RUNTIME_ENV_VALIDATION=true
|
||||||
ENV CI=true
|
ENV CI=true
|
||||||
|
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ import { default as default_2ebf44fdf8ebc607cf0de30cff485248 } from "@/src/paylo
|
|||||||
import { default as default_a1c6da8fb7dd9846a8b07123ff256d09 } from "@/src/payload/components/IconSelector";
|
import { default as default_a1c6da8fb7dd9846a8b07123ff256d09 } from "@/src/payload/components/IconSelector";
|
||||||
import { ConvertInquiryButton as ConvertInquiryButton_09fd670bce023a947ab66e4eebea5168 } from "@/src/payload/components/ConvertInquiryButton";
|
import { ConvertInquiryButton as ConvertInquiryButton_09fd670bce023a947ab66e4eebea5168 } from "@/src/payload/components/ConvertInquiryButton";
|
||||||
import { AiAnalyzeButton as AiAnalyzeButton_51a6009c2b12d068d736ffd2b8182c71 } from "@/src/payload/components/AiAnalyzeButton";
|
import { AiAnalyzeButton as AiAnalyzeButton_51a6009c2b12d068d736ffd2b8182c71 } from "@/src/payload/components/AiAnalyzeButton";
|
||||||
|
import { BulkMailButton as BulkMailButton_ebc54eabb8a07878581b0043bd687708 } from "@/src/payload/components/BulkMailButton";
|
||||||
import { GanttChartView as GanttChartView_0162b82db971e8f1e27fbdd0aaa2f1f4 } from "@/src/payload/views/GanttChart";
|
import { GanttChartView as GanttChartView_0162b82db971e8f1e27fbdd0aaa2f1f4 } from "@/src/payload/views/GanttChart";
|
||||||
import { ChatWindowProvider as ChatWindowProvider_258e2d0901cb901e46c3eeed91676211 } from "@mintel/payload-ai/components/ChatWindow/index";
|
import { ChatWindowProvider as ChatWindowProvider_258e2d0901cb901e46c3eeed91676211 } from "@mintel/payload-ai/components/ChatWindow/index";
|
||||||
import { S3ClientUploadHandler as S3ClientUploadHandler_f97aa6c64367fa259c5bc0567239ef24 } from "@payloadcms/storage-s3/client";
|
import { S3ClientUploadHandler as S3ClientUploadHandler_f97aa6c64367fa259c5bc0567239ef24 } from "@payloadcms/storage-s3/client";
|
||||||
@@ -106,6 +107,8 @@ export const importMap = {
|
|||||||
ConvertInquiryButton_09fd670bce023a947ab66e4eebea5168,
|
ConvertInquiryButton_09fd670bce023a947ab66e4eebea5168,
|
||||||
"@/src/payload/components/AiAnalyzeButton#AiAnalyzeButton":
|
"@/src/payload/components/AiAnalyzeButton#AiAnalyzeButton":
|
||||||
AiAnalyzeButton_51a6009c2b12d068d736ffd2b8182c71,
|
AiAnalyzeButton_51a6009c2b12d068d736ffd2b8182c71,
|
||||||
|
"@/src/payload/components/BulkMailButton#BulkMailButton":
|
||||||
|
BulkMailButton_ebc54eabb8a07878581b0043bd687708,
|
||||||
"@/src/payload/views/GanttChart#GanttChartView":
|
"@/src/payload/views/GanttChart#GanttChartView":
|
||||||
GanttChartView_0162b82db971e8f1e27fbdd0aaa2f1f4,
|
GanttChartView_0162b82db971e8f1e27fbdd0aaa2f1f4,
|
||||||
"@mintel/payload-ai/components/ChatWindow/index#ChatWindowProvider":
|
"@mintel/payload-ai/components/ChatWindow/index#ChatWindowProvider":
|
||||||
|
|||||||
@@ -24,19 +24,19 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
h1 {
|
h1 {
|
||||||
@apply text-4xl md:text-8xl leading-[1.1] md:leading-[0.95] mb-6 md:mb-12;
|
@apply text-4xl md:text-6xl lg:text-8xl leading-[1.1] md:leading-[1] lg:leading-[0.95] mb-6 md:mb-8 lg:mb-12;
|
||||||
}
|
}
|
||||||
|
|
||||||
h2 {
|
h2 {
|
||||||
@apply text-2xl md:text-6xl leading-tight mb-4 md:mb-8 mt-12 md:mt-16;
|
@apply text-2xl md:text-4xl lg:text-6xl leading-tight mb-4 md:mb-6 lg:mb-8 mt-12 lg:mt-16;
|
||||||
}
|
}
|
||||||
|
|
||||||
h3 {
|
h3 {
|
||||||
@apply text-xl md:text-5xl leading-tight mb-3 md:mb-6 mt-8 md:mt-12;
|
@apply text-xl md:text-3xl lg:text-5xl leading-tight mb-3 md:mb-4 lg:mb-6 mt-8 lg:mt-12;
|
||||||
}
|
}
|
||||||
|
|
||||||
h4 {
|
h4 {
|
||||||
@apply text-lg md:text-3xl leading-tight mb-3 md:mb-4 mt-6 md:mt-8;
|
@apply text-lg md:text-2xl lg:text-3xl leading-tight mb-3 lg:mb-4 mt-6 lg:mt-8;
|
||||||
}
|
}
|
||||||
|
|
||||||
p {
|
p {
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.lead {
|
.lead {
|
||||||
@apply text-base md:text-2xl text-slate-600 mb-6 leading-relaxed;
|
@apply text-base md:text-xl lg:text-2xl text-slate-600 mb-6 leading-relaxed;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -92,15 +92,15 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.container {
|
.container {
|
||||||
@apply max-w-6xl mx-auto px-5 md:px-6 py-8 md:py-12;
|
@apply max-w-6xl mx-auto px-5 md:px-6 lg:px-8 py-8 md:py-10 lg:py-12;
|
||||||
}
|
}
|
||||||
|
|
||||||
.wide-container {
|
.wide-container {
|
||||||
@apply max-w-7xl mx-auto px-5 md:px-6 py-10 md:py-16;
|
@apply max-w-7xl mx-auto px-5 md:px-6 lg:px-8 py-10 md:py-12 lg:py-16;
|
||||||
}
|
}
|
||||||
|
|
||||||
.narrow-container {
|
.narrow-container {
|
||||||
@apply max-w-4xl mx-auto px-5 md:px-6 py-6 md:py-10;
|
@apply max-w-4xl mx-auto px-5 md:px-6 lg:px-8 py-6 md:py-8 lg:py-10;
|
||||||
}
|
}
|
||||||
|
|
||||||
.highlighter-tag {
|
.highlighter-tag {
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ export default function LandingPage() {
|
|||||||
</H3>
|
</H3>
|
||||||
</Reveal>
|
</Reveal>
|
||||||
|
|
||||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-8 relative z-10">
|
<div className="grid grid-cols-1 md:grid-cols-1 lg:grid-cols-2 gap-8 lg:gap-12 relative z-10">
|
||||||
{[
|
{[
|
||||||
{
|
{
|
||||||
icon: <ConceptCommunication className="w-8 h-8" />,
|
icon: <ConceptCommunication className="w-8 h-8" />,
|
||||||
@@ -136,7 +136,7 @@ export default function LandingPage() {
|
|||||||
|
|
||||||
{/* Section 04: Target Group */}
|
{/* Section 04: Target Group */}
|
||||||
<Section number="04" title="Für wen" borderTop>
|
<Section number="04" title="Für wen" borderTop>
|
||||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-4 md:gap-6 relative z-10">
|
<div className="grid grid-cols-1 md:grid-cols-1 lg:grid-cols-2 gap-4 md:gap-6 lg:gap-10 relative z-10">
|
||||||
<Reveal>
|
<Reveal>
|
||||||
<Card variant="glass" padding="normal" techBorder className="group">
|
<Card variant="glass" padding="normal" techBorder className="group">
|
||||||
<div className="space-y-4 md:space-y-6 relative overflow-hidden">
|
<div className="space-y-4 md:space-y-6 relative overflow-hidden">
|
||||||
@@ -215,8 +215,8 @@ export default function LandingPage() {
|
|||||||
},
|
},
|
||||||
].map((service, i) => (
|
].map((service, i) => (
|
||||||
<Reveal key={i} delay={0.1 + i * 0.15}>
|
<Reveal key={i} delay={0.1 + i * 0.15}>
|
||||||
<div className="group py-8 md:py-16 border-b border-slate-100 last:border-b-0 cursor-pointer transition-all duration-500">
|
<div className="group py-8 md:py-12 lg:py-16 border-b border-slate-100 last:border-b-0 cursor-pointer transition-all duration-500">
|
||||||
<div className="flex flex-col md:flex-row md:items-start gap-6 md:gap-16">
|
<div className="flex flex-col md:flex-row md:items-start gap-6 md:gap-10 lg:gap-16">
|
||||||
{/* Number + Binary */}
|
{/* Number + Binary */}
|
||||||
<div className="shrink-0 flex md:block items-baseline gap-4">
|
<div className="shrink-0 flex md:block items-baseline gap-4">
|
||||||
<span className="text-4xl md:text-6xl font-black text-slate-100 group-hover:text-slate-200 transition-colors duration-500 tracking-tighter block leading-none">
|
<span className="text-4xl md:text-6xl font-black text-slate-100 group-hover:text-slate-200 transition-colors duration-500 tracking-tighter block leading-none">
|
||||||
@@ -280,13 +280,13 @@ export default function LandingPage() {
|
|||||||
<Section number="06" title="Kontakt" borderTop>
|
<Section number="06" title="Kontakt" borderTop>
|
||||||
<div className="relative py-4 md:py-12" id="contact">
|
<div className="relative py-4 md:py-12" id="contact">
|
||||||
<Reveal>
|
<Reveal>
|
||||||
<div className="space-y-8 md:space-y-16">
|
<div className="space-y-8 md:space-y-12 lg:space-y-16">
|
||||||
<H1 className="text-3xl md:text-8xl">
|
<H1 className="text-4xl md:text-6xl lg:text-8xl">
|
||||||
Lassen Sie uns <br />
|
Lassen Sie uns <br />
|
||||||
<span className="text-slate-400">starten.</span>
|
<span className="text-slate-400">starten.</span>
|
||||||
</H1>
|
</H1>
|
||||||
|
|
||||||
<div className="flex flex-col md:flex-row gap-6 md:gap-16 items-start relative z-10">
|
<div className="flex flex-col md:flex-row gap-6 md:gap-10 lg:gap-16 items-start relative z-10">
|
||||||
<div className="space-y-4 md:space-y-8 flex-1">
|
<div className="space-y-4 md:space-y-8 flex-1">
|
||||||
<LeadText className="text-lg md:text-3xl text-slate-400">
|
<LeadText className="text-lg md:text-3xl text-slate-400">
|
||||||
Beschreiben Sie kurz Ihr Vorhaben. Ich melde mich{" "}
|
Beschreiben Sie kurz Ihr Vorhaben. Ich melde mich{" "}
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ export const HeroSection: React.FC = () => {
|
|||||||
initial={{ opacity: 0, scale: 0.95 }}
|
initial={{ opacity: 0, scale: 0.95 }}
|
||||||
animate={{ opacity: 1, scale: 1 }}
|
animate={{ opacity: 1, scale: 1 }}
|
||||||
transition={{ duration: 1, delay: 0.2 }}
|
transition={{ duration: 1, delay: 0.2 }}
|
||||||
className="mb-4 md:mb-10 inline-flex items-center gap-3 md:gap-4 px-4 md:px-6 py-2 border border-slate-100 bg-white/40 backdrop-blur-sm rounded-full"
|
className="mb-4 md:mb-8 lg:mb-10 inline-flex items-center gap-3 md:gap-4 px-4 md:px-6 py-2 border border-slate-100 bg-white/40 backdrop-blur-sm rounded-full"
|
||||||
>
|
>
|
||||||
<div className="flex gap-1">
|
<div className="flex gap-1">
|
||||||
<div className="w-1 h-1 rounded-full bg-blue-500 animate-pulse" />
|
<div className="w-1 h-1 rounded-full bg-blue-500 animate-pulse" />
|
||||||
@@ -59,7 +59,7 @@ export const HeroSection: React.FC = () => {
|
|||||||
</motion.div>
|
</motion.div>
|
||||||
|
|
||||||
{/* Headline */}
|
{/* Headline */}
|
||||||
<h1 className="text-3xl md:text-[11rem] font-black tracking-tighter leading-[0.9] md:leading-[0.8] text-slate-900 mb-6 md:mb-12 uppercase">
|
<h1 className="text-4xl md:text-8xl lg:text-[10rem] xl:text-[11rem] font-black tracking-tighter leading-[0.9] md:leading-[0.85] lg:leading-[0.8] text-slate-900 mb-6 md:mb-8 lg:mb-12 uppercase">
|
||||||
<div className="block">
|
<div className="block">
|
||||||
<GlitchText delay={0.5} duration={1.2}>
|
<GlitchText delay={0.5} duration={1.2}>
|
||||||
Websites
|
Websites
|
||||||
@@ -80,9 +80,9 @@ export const HeroSection: React.FC = () => {
|
|||||||
initial={{ opacity: 0, y: 20 }}
|
initial={{ opacity: 0, y: 20 }}
|
||||||
animate={{ opacity: 1, y: 0 }}
|
animate={{ opacity: 1, y: 0 }}
|
||||||
transition={{ duration: 1, delay: 0.8 }}
|
transition={{ duration: 1, delay: 0.8 }}
|
||||||
className="flex flex-col items-center gap-6 md:gap-12"
|
className="flex flex-col items-center gap-6 md:gap-8 lg:gap-12"
|
||||||
>
|
>
|
||||||
<p className="text-base md:text-3xl text-slate-400 font-medium max-w-2xl leading-relaxed px-4">
|
<p className="text-base md:text-xl lg:text-3xl text-slate-400 font-medium max-w-2xl leading-relaxed px-4">
|
||||||
Ein Entwickler. Ein Ansprechpartner.{" "}
|
Ein Entwickler. Ein Ansprechpartner.{" "}
|
||||||
<br className="hidden md:block" />
|
<br className="hidden md:block" />
|
||||||
<span className="text-slate-900 font-bold tracking-tight">
|
<span className="text-slate-900 font-bold tracking-tight">
|
||||||
|
|||||||
@@ -82,9 +82,9 @@ export const Section: React.FC<SectionProps> = ({
|
|||||||
|
|
||||||
<div className={cn("relative z-10", containerClass)}>
|
<div className={cn("relative z-10", containerClass)}>
|
||||||
{hasSidebar ? (
|
{hasSidebar ? (
|
||||||
<div className="grid grid-cols-1 md:grid-cols-12 gap-4 md:gap-24">
|
<div className="grid grid-cols-1 md:grid-cols-12 gap-4 md:gap-12 lg:gap-24">
|
||||||
{/* Sidebar: Number & Title */}
|
{/* Sidebar: Number & Title */}
|
||||||
<div className="md:col-span-3">
|
<div className="md:col-span-4 lg:col-span-3">
|
||||||
<div className="md:sticky md:top-40 flex flex-col gap-4 md:gap-8">
|
<div className="md:sticky md:top-40 flex flex-col gap-4 md:gap-8">
|
||||||
<div className="flex items-end md:flex-col md:items-start gap-6 md:gap-8">
|
<div className="flex items-end md:flex-col md:items-start gap-6 md:gap-8">
|
||||||
{number && (
|
{number && (
|
||||||
@@ -124,7 +124,7 @@ export const Section: React.FC<SectionProps> = ({
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Main Content */}
|
{/* Main Content */}
|
||||||
<div className="md:col-span-9">{children}</div>
|
<div className="md:col-span-8 lg:col-span-9">{children}</div>
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<div className="w-full">{children}</div>
|
<div className="w-full">{children}</div>
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ const envExtension = {
|
|||||||
// Mail Configuration
|
// Mail Configuration
|
||||||
MAIL_HOST: z.string().optional(),
|
MAIL_HOST: z.string().optional(),
|
||||||
MAIL_PORT: z.coerce.number().optional().default(587),
|
MAIL_PORT: z.coerce.number().optional().default(587),
|
||||||
MAIL_USER: z.string().optional(),
|
MAIL_USERNAME: z.string().optional(),
|
||||||
MAIL_PASS: z.string().optional(),
|
MAIL_PASSWORD: z.string().optional(),
|
||||||
MAIL_FROM: z.string().optional().default("marc@mintel.me"),
|
MAIL_FROM: z.string().optional().default("marc@mintel.me"),
|
||||||
MAIL_RECIPIENTS: z.string().optional().default("marc@mintel.me"),
|
MAIL_RECIPIENTS: z.string().optional().default("marc@mintel.me"),
|
||||||
|
|
||||||
@@ -21,6 +21,14 @@ const envExtension = {
|
|||||||
.optional()
|
.optional()
|
||||||
.default("https://analytics.infra.mintel.me"),
|
.default("https://analytics.infra.mintel.me"),
|
||||||
|
|
||||||
|
// S3 Storage (Required for importMap at build-time)
|
||||||
|
S3_ENDPOINT: z.string().optional(),
|
||||||
|
S3_ACCESS_KEY: z.string().optional(),
|
||||||
|
S3_SECRET_KEY: z.string().optional(),
|
||||||
|
S3_BUCKET: z.string().optional(),
|
||||||
|
S3_REGION: z.string().optional(),
|
||||||
|
S3_PREFIX: z.string().optional(),
|
||||||
|
|
||||||
// Error Tracking
|
// Error Tracking
|
||||||
SENTRY_DSN: z.string().optional(),
|
SENTRY_DSN: z.string().optional(),
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -24,8 +24,8 @@ function getTransporter() {
|
|||||||
port: env.MAIL_PORT,
|
port: env.MAIL_PORT,
|
||||||
secure: env.MAIL_PORT === 465,
|
secure: env.MAIL_PORT === 465,
|
||||||
auth: {
|
auth: {
|
||||||
user: env.MAIL_USER,
|
user: env.MAIL_USERNAME,
|
||||||
pass: env.MAIL_PASS,
|
pass: env.MAIL_PASSWORD,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
18
apps/web/test-env.ts
Normal file
18
apps/web/test-env.ts
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
import { z } from "zod";
|
||||||
|
import { validateMintelEnv } from "@mintel/next-utils";
|
||||||
|
|
||||||
|
const envExtension = {
|
||||||
|
SENTRY_DSN: z.string().url().nullish().or(z.literal("")),
|
||||||
|
};
|
||||||
|
|
||||||
|
process.env.SENTRY_DSN = " ";
|
||||||
|
console.log("Empty Space:");
|
||||||
|
try {
|
||||||
|
validateMintelEnv(envExtension);
|
||||||
|
} catch (e) {}
|
||||||
|
|
||||||
|
process.env.SENTRY_DSN = "\n";
|
||||||
|
console.log("Newline:");
|
||||||
|
try {
|
||||||
|
validateMintelEnv(envExtension);
|
||||||
|
} catch (e) {}
|
||||||
Reference in New Issue
Block a user