Add Docker configuration for deployment
- Dockerfile with multi-stage build (builder + runner) - docker-compose.yml with Traefik labels - Enable standalone output in Next.js config - Add public directory placeholder 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
948e9c9c05
commit
661f5fa601
|
|
@ -0,0 +1,41 @@
|
||||||
|
# Build stage
|
||||||
|
FROM node:20-alpine AS builder
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Copy package files
|
||||||
|
COPY package*.json ./
|
||||||
|
|
||||||
|
# Install dependencies
|
||||||
|
RUN npm ci
|
||||||
|
|
||||||
|
# Copy source code
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
# Build the application
|
||||||
|
RUN npm run build
|
||||||
|
|
||||||
|
# Production stage
|
||||||
|
FROM node:20-alpine AS runner
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
ENV NODE_ENV=production
|
||||||
|
|
||||||
|
# Create non-root user
|
||||||
|
RUN addgroup --system --gid 1001 nodejs
|
||||||
|
RUN adduser --system --uid 1001 nextjs
|
||||||
|
|
||||||
|
# Copy built assets
|
||||||
|
COPY --from=builder /app/public ./public
|
||||||
|
COPY --from=builder /app/.next/standalone ./
|
||||||
|
COPY --from=builder /app/.next/static ./.next/static
|
||||||
|
|
||||||
|
USER nextjs
|
||||||
|
|
||||||
|
EXPOSE 3000
|
||||||
|
|
||||||
|
ENV PORT=3000
|
||||||
|
ENV HOSTNAME="0.0.0.0"
|
||||||
|
|
||||||
|
CMD ["node", "server.js"]
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
project_name: "Nusqool Website Replica"
|
||||||
|
default_status: "To Do"
|
||||||
|
statuses: ["To Do", "In Progress", "Done"]
|
||||||
|
labels: []
|
||||||
|
milestones: []
|
||||||
|
date_format: yyyy-mm-dd
|
||||||
|
max_column_width: 20
|
||||||
|
default_editor: "nvim"
|
||||||
|
auto_open_browser: true
|
||||||
|
default_port: 6420
|
||||||
|
remote_operations: true
|
||||||
|
auto_commit: false
|
||||||
|
bypass_git_hooks: false
|
||||||
|
check_active_branches: true
|
||||||
|
active_branch_days: 30
|
||||||
|
|
@ -0,0 +1,41 @@
|
||||||
|
---
|
||||||
|
id: task-1
|
||||||
|
title: Finish Nusqool website replica
|
||||||
|
status: To Do
|
||||||
|
assignee: []
|
||||||
|
created_date: '2025-12-26 15:31'
|
||||||
|
labels: []
|
||||||
|
dependencies: []
|
||||||
|
priority: medium
|
||||||
|
---
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
<!-- SECTION:DESCRIPTION:BEGIN -->
|
||||||
|
Complete the Nusqool.com website replica with all remaining features and polish.
|
||||||
|
|
||||||
|
Current state:
|
||||||
|
- Basic structure and all sections implemented
|
||||||
|
- Responsive navigation with mobile menu
|
||||||
|
- Custom color palette and typography
|
||||||
|
- Placeholder images (need real photos)
|
||||||
|
|
||||||
|
Remaining work:
|
||||||
|
- Add actual images from original site or new photos
|
||||||
|
- Implement working links for all navigation items
|
||||||
|
- Add Calendly booking integration
|
||||||
|
- Create subpages (About Thu, TRE, Coaching, etc.)
|
||||||
|
- Add animations and micro-interactions
|
||||||
|
- Implement newsletter signup backend
|
||||||
|
- Test and optimize for all devices
|
||||||
|
- Deploy to production
|
||||||
|
<!-- SECTION:DESCRIPTION:END -->
|
||||||
|
|
||||||
|
## Acceptance Criteria
|
||||||
|
<!-- AC:BEGIN -->
|
||||||
|
- [ ] #1 Real images added to all sections
|
||||||
|
- [ ] #2 All navigation links functional
|
||||||
|
- [ ] #3 Subpages created for main menu items
|
||||||
|
- [ ] #4 Newsletter signup connected to backend
|
||||||
|
- [ ] #5 Deployed and accessible online
|
||||||
|
<!-- AC:END -->
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
services:
|
||||||
|
nusqool-staging:
|
||||||
|
build: .
|
||||||
|
container_name: nusqool-staging
|
||||||
|
restart: unless-stopped
|
||||||
|
labels:
|
||||||
|
- "traefik.enable=true"
|
||||||
|
- "traefik.http.routers.nusqool-staging.rule=Host(`nusqool-staging.jeffemmett.com`)"
|
||||||
|
- "traefik.http.services.nusqool-staging.loadbalancer.server.port=3000"
|
||||||
|
networks:
|
||||||
|
- traefik-public
|
||||||
|
|
||||||
|
networks:
|
||||||
|
traefik-public:
|
||||||
|
external: true
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
import type { NextConfig } from "next";
|
import type { NextConfig } from "next";
|
||||||
|
|
||||||
const nextConfig: NextConfig = {
|
const nextConfig: NextConfig = {
|
||||||
|
output: "standalone",
|
||||||
images: {
|
images: {
|
||||||
domains: ["images.squarespace-cdn.com"],
|
domains: ["images.squarespace-cdn.com"],
|
||||||
},
|
},
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue