From 232d0d8762929ae965749d3503148f21512aa379 Mon Sep 17 00:00:00 2001 From: Mayne0213 Date: Mon, 5 Jan 2026 02:02:29 +0900 Subject: [PATCH] REFACTOR(repo): simplify project structure - Move services/nextjs/ to nextjs/ - Move Dockerfile.prod to Dockerfile at root - Remove deploy/ folder (K8s manifests moved to K3S-HOME/web-apps) - Remove .gitea/ workflows - Update GitHub Actions for new structure - Remove develop branch triggers --- .gitea/workflows/build.yml | 191 ------------------ .gitea/workflows/ci.yml | 45 ----- .github/workflows/build.yml | 126 +----------- .github/workflows/ci.yml | 16 +- deploy/docker/Dockerfile.prod => Dockerfile | 0 deploy/argocd/application-dev.yaml | 20 -- deploy/argocd/application-prod.yaml | 20 -- deploy/argocd/application.yaml | 36 ---- deploy/argocd/kustomization.yaml | 10 - deploy/docker/Dockerfile.dev | 26 --- deploy/docker/docker-compose.dev.yml | 27 --- deploy/docker/docker-compose.yml | 22 -- deploy/k8s/base/argocd-secret.yaml | 21 -- deploy/k8s/base/deployment.yaml | 53 ----- deploy/k8s/base/kustomization.yaml | 15 -- deploy/k8s/base/service.yaml | 15 -- deploy/k8s/overlays/dev/deployment-patch.yaml | 18 -- deploy/k8s/overlays/dev/ingress.yaml | 25 --- deploy/k8s/overlays/dev/kustomization.yaml | 21 -- deploy/k8s/overlays/dev/namespace.yaml | 7 - deploy/k8s/overlays/dev/resourcequota.yaml | 11 - .../k8s/overlays/prod/deployment-patch.yaml | 18 -- deploy/k8s/overlays/prod/ingress.yaml | 38 ---- deploy/k8s/overlays/prod/kustomization.yaml | 20 -- deploy/k8s/overlays/prod/resourcequota.yaml | 11 - {services/nextjs => nextjs}/.gitignore | 0 {services/nextjs => nextjs}/README.md | 0 .../nextjs => nextjs}/app/[locale]/layout.tsx | 0 .../nextjs => nextjs}/app/[locale]/page.tsx | 0 {services/nextjs => nextjs}/app/favicon.ico | Bin {services/nextjs => nextjs}/app/globals.css | 0 {services/nextjs => nextjs}/components.json | 0 .../components/landing/about.tsx | 0 .../components/landing/contact.tsx | 0 .../components/landing/grafana.tsx | 0 .../components/landing/hero.tsx | 0 .../components/landing/projects.tsx | 0 .../components/landing/section-header.tsx | 0 .../components/landing/skills.tsx | 0 .../components/ui/Particles.jsx | 0 .../components/ui/button.tsx | 0 .../nextjs => nextjs}/components/ui/card.tsx | 0 .../components/ui/dropdown-menu.tsx | 0 .../nextjs => nextjs}/components/ui/input.tsx | 0 .../components/ui/language-toggle.tsx | 0 .../components/ui/mode-toggle.tsx | 0 .../components/ui/separator.tsx | 0 .../components/ui/textarea.tsx | 0 .../components/widgets/Footer.tsx | 0 .../components/widgets/Header.tsx | 0 {services/nextjs => nextjs}/eslint.config.mjs | 0 {services/nextjs => nextjs}/i18n/request.ts | 0 {services/nextjs => nextjs}/i18n/routing.ts | 0 {services/nextjs => nextjs}/lib/utils.ts | 0 {services/nextjs => nextjs}/messages/de.json | 0 {services/nextjs => nextjs}/messages/en.json | 0 {services/nextjs => nextjs}/messages/ko.json | 0 {services/nextjs => nextjs}/middleware.ts | 0 {services/nextjs => nextjs}/next.config.ts | 0 {services/nextjs => nextjs}/package-lock.json | 0 {services/nextjs => nextjs}/package.json | 0 .../nextjs => nextjs}/postcss.config.mjs | 0 .../providers/theme-provider.tsx | 0 .../fonts/brand/SupremeLLTT-Black.woff2 | Bin .../fonts/brand/SupremeLLTT-BlackItalic.woff2 | Bin .../public/fonts/brand/SupremeLLTT-Bold.woff2 | Bin .../fonts/brand/SupremeLLTT-BoldFlat.woff2 | Bin .../brand/SupremeLLTT-BoldFlatItalic.woff2 | Bin .../fonts/brand/SupremeLLTT-BoldItalic.woff2 | Bin .../public/fonts/brand/SupremeLLTT-Book.woff2 | Bin .../fonts/brand/SupremeLLTT-BookItalic.woff2 | Bin .../fonts/brand/SupremeLLTT-Italic.woff2 | Bin .../fonts/brand/SupremeLLTT-Light.woff2 | Bin .../fonts/brand/SupremeLLTT-LightItalic.woff2 | Bin .../fonts/brand/SupremeLLTT-Medium.woff2 | Bin .../brand/SupremeLLTT-MediumItalic.woff2 | Bin .../fonts/brand/SupremeLLTT-Regular.woff2 | Bin .../public/fonts/brand/SupremeLLTT-Thin.woff2 | Bin .../fonts/brand/SupremeLLTT-ThinItalic.woff2 | Bin .../public/fonts/generated-fonts.css | 0 .../public/icons/docusaurus.svg | 0 .../public/jaejadle/home.png | Bin .../nextjs => nextjs}/public/joossam/home.png | Bin .../nextjs => nextjs}/public/joossam/main.png | Bin .../nextjs => nextjs}/public/jotion/home.png | Bin .../nextjs => nextjs}/public/jovies/home.png | Bin .../public/portfolio/home.png | Bin .../public/todoList/home.png | Bin {services/nextjs => nextjs}/public/window.svg | 0 {services/nextjs => nextjs}/tsconfig.json | 0 90 files changed, 17 insertions(+), 795 deletions(-) delete mode 100644 .gitea/workflows/build.yml delete mode 100644 .gitea/workflows/ci.yml rename deploy/docker/Dockerfile.prod => Dockerfile (100%) delete mode 100644 deploy/argocd/application-dev.yaml delete mode 100644 deploy/argocd/application-prod.yaml delete mode 100644 deploy/argocd/application.yaml delete mode 100644 deploy/argocd/kustomization.yaml delete mode 100644 deploy/docker/Dockerfile.dev delete mode 100644 deploy/docker/docker-compose.dev.yml delete mode 100644 deploy/docker/docker-compose.yml delete mode 100644 deploy/k8s/base/argocd-secret.yaml delete mode 100644 deploy/k8s/base/deployment.yaml delete mode 100644 deploy/k8s/base/kustomization.yaml delete mode 100644 deploy/k8s/base/service.yaml delete mode 100644 deploy/k8s/overlays/dev/deployment-patch.yaml delete mode 100644 deploy/k8s/overlays/dev/ingress.yaml delete mode 100644 deploy/k8s/overlays/dev/kustomization.yaml delete mode 100644 deploy/k8s/overlays/dev/namespace.yaml delete mode 100644 deploy/k8s/overlays/dev/resourcequota.yaml delete mode 100644 deploy/k8s/overlays/prod/deployment-patch.yaml delete mode 100644 deploy/k8s/overlays/prod/ingress.yaml delete mode 100644 deploy/k8s/overlays/prod/kustomization.yaml delete mode 100644 deploy/k8s/overlays/prod/resourcequota.yaml rename {services/nextjs => nextjs}/.gitignore (100%) rename {services/nextjs => nextjs}/README.md (100%) rename {services/nextjs => nextjs}/app/[locale]/layout.tsx (100%) rename {services/nextjs => nextjs}/app/[locale]/page.tsx (100%) rename {services/nextjs => nextjs}/app/favicon.ico (100%) rename {services/nextjs => nextjs}/app/globals.css (100%) rename {services/nextjs => nextjs}/components.json (100%) rename {services/nextjs => nextjs}/components/landing/about.tsx (100%) rename {services/nextjs => nextjs}/components/landing/contact.tsx (100%) rename {services/nextjs => nextjs}/components/landing/grafana.tsx (100%) rename {services/nextjs => nextjs}/components/landing/hero.tsx (100%) rename {services/nextjs => nextjs}/components/landing/projects.tsx (100%) rename {services/nextjs => nextjs}/components/landing/section-header.tsx (100%) rename {services/nextjs => nextjs}/components/landing/skills.tsx (100%) rename {services/nextjs => nextjs}/components/ui/Particles.jsx (100%) rename {services/nextjs => nextjs}/components/ui/button.tsx (100%) rename {services/nextjs => nextjs}/components/ui/card.tsx (100%) rename {services/nextjs => nextjs}/components/ui/dropdown-menu.tsx (100%) rename {services/nextjs => nextjs}/components/ui/input.tsx (100%) rename {services/nextjs => nextjs}/components/ui/language-toggle.tsx (100%) rename {services/nextjs => nextjs}/components/ui/mode-toggle.tsx (100%) rename {services/nextjs => nextjs}/components/ui/separator.tsx (100%) rename {services/nextjs => nextjs}/components/ui/textarea.tsx (100%) rename {services/nextjs => nextjs}/components/widgets/Footer.tsx (100%) rename {services/nextjs => nextjs}/components/widgets/Header.tsx (100%) rename {services/nextjs => nextjs}/eslint.config.mjs (100%) rename {services/nextjs => nextjs}/i18n/request.ts (100%) rename {services/nextjs => nextjs}/i18n/routing.ts (100%) rename {services/nextjs => nextjs}/lib/utils.ts (100%) rename {services/nextjs => nextjs}/messages/de.json (100%) rename {services/nextjs => nextjs}/messages/en.json (100%) rename {services/nextjs => nextjs}/messages/ko.json (100%) rename {services/nextjs => nextjs}/middleware.ts (100%) rename {services/nextjs => nextjs}/next.config.ts (100%) rename {services/nextjs => nextjs}/package-lock.json (100%) rename {services/nextjs => nextjs}/package.json (100%) rename {services/nextjs => nextjs}/postcss.config.mjs (100%) rename {services/nextjs => nextjs}/providers/theme-provider.tsx (100%) rename {services/nextjs => nextjs}/public/fonts/brand/SupremeLLTT-Black.woff2 (100%) rename {services/nextjs => nextjs}/public/fonts/brand/SupremeLLTT-BlackItalic.woff2 (100%) rename {services/nextjs => nextjs}/public/fonts/brand/SupremeLLTT-Bold.woff2 (100%) rename {services/nextjs => nextjs}/public/fonts/brand/SupremeLLTT-BoldFlat.woff2 (100%) rename {services/nextjs => nextjs}/public/fonts/brand/SupremeLLTT-BoldFlatItalic.woff2 (100%) rename {services/nextjs => nextjs}/public/fonts/brand/SupremeLLTT-BoldItalic.woff2 (100%) rename {services/nextjs => nextjs}/public/fonts/brand/SupremeLLTT-Book.woff2 (100%) rename {services/nextjs => nextjs}/public/fonts/brand/SupremeLLTT-BookItalic.woff2 (100%) rename {services/nextjs => nextjs}/public/fonts/brand/SupremeLLTT-Italic.woff2 (100%) rename {services/nextjs => nextjs}/public/fonts/brand/SupremeLLTT-Light.woff2 (100%) rename {services/nextjs => nextjs}/public/fonts/brand/SupremeLLTT-LightItalic.woff2 (100%) rename {services/nextjs => nextjs}/public/fonts/brand/SupremeLLTT-Medium.woff2 (100%) rename {services/nextjs => nextjs}/public/fonts/brand/SupremeLLTT-MediumItalic.woff2 (100%) rename {services/nextjs => nextjs}/public/fonts/brand/SupremeLLTT-Regular.woff2 (100%) rename {services/nextjs => nextjs}/public/fonts/brand/SupremeLLTT-Thin.woff2 (100%) rename {services/nextjs => nextjs}/public/fonts/brand/SupremeLLTT-ThinItalic.woff2 (100%) rename {services/nextjs => nextjs}/public/fonts/generated-fonts.css (100%) rename {services/nextjs => nextjs}/public/icons/docusaurus.svg (100%) rename {services/nextjs => nextjs}/public/jaejadle/home.png (100%) rename {services/nextjs => nextjs}/public/joossam/home.png (100%) rename {services/nextjs => nextjs}/public/joossam/main.png (100%) rename {services/nextjs => nextjs}/public/jotion/home.png (100%) rename {services/nextjs => nextjs}/public/jovies/home.png (100%) rename {services/nextjs => nextjs}/public/portfolio/home.png (100%) rename {services/nextjs => nextjs}/public/todoList/home.png (100%) rename {services/nextjs => nextjs}/public/window.svg (100%) rename {services/nextjs => nextjs}/tsconfig.json (100%) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml deleted file mode 100644 index f472681..0000000 --- a/.gitea/workflows/build.yml +++ /dev/null @@ -1,191 +0,0 @@ -name: Build Docker Image - -on: - push: - branches: [main, develop] - tags: - - 'v*' - workflow_dispatch: - -env: - REGISTRY: gitea0213.kro.kr - IMAGE_NAME: ${{ github.repository }} - DOCKER_HOST: tcp://172.17.0.1:2375 - -jobs: - build-and-push: - runs-on: ubuntu-24.04-arm - permissions: - contents: write - packages: write - - outputs: - image-tag: ${{ steps.meta.outputs.tags }} - image-digest: ${{ steps.build.outputs.digest }} - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Log in to Gitea Container Registry - run: | - echo "${{ secrets.GITEAREGISTRY }}" | docker login ${{ env.REGISTRY }} -u bluemayne --password-stdin - - - name: Lowercase repository name - id: lowercase - run: | - echo "repo=$(echo ${{ github.repository }} | tr '[:upper:]' '[:lower:]')" >> $GITHUB_OUTPUT - - - name: Extract metadata (tags, labels) - id: meta - uses: docker/metadata-action@v5 - with: - images: ${{ env.REGISTRY }}/${{ steps.lowercase.outputs.repo }} - tags: | - type=ref,event=branch - type=ref,event=pr - type=semver,pattern={{version}} - type=semver,pattern={{major}}.{{minor}} - type=sha,prefix={{branch}}-sha-,format=long - type=raw,value=latest,enable={{is_default_branch}} - - - name: Build and push Docker image - id: build - run: | - TAGS="${{ steps.meta.outputs.tags }}" - - # Build the image - docker build \ - -t $(echo "$TAGS" | head -n 1) \ - -f ./deploy/docker/Dockerfile.prod \ - ./services/nextjs - - # Tag all versions - FIRST_TAG=$(echo "$TAGS" | head -n 1) - echo "$TAGS" | while read tag; do - if [ "$tag" != "$FIRST_TAG" ]; then - docker tag "$FIRST_TAG" "$tag" - fi - done - - # Push all tags - echo "$TAGS" | while read tag; do - docker push "$tag" - done - - # Get digest - DIGEST=$(docker inspect --format='{{index .RepoDigests 0}}' "$FIRST_TAG" | cut -d'@' -f2) - echo "digest=$DIGEST" >> $GITHUB_OUTPUT - - - name: Extract SHA tag - id: extract-tag - run: | - # Extract the SHA-based tag from the tags list - TAGS="${{ steps.meta.outputs.tags }}" - echo "All tags:" - echo "$TAGS" - echo "---" - - # Get commit SHA (full 40 characters) - COMMIT_SHA="${{ github.sha }}" - - # Get current branch name - BRANCH_NAME="${{ github.ref_name }}" - echo "Branch: $BRANCH_NAME" - - # Method 1: Extract the full SHA tag from docker/metadata-action output - # docker/metadata-action creates: -sha- - SHA_TAG=$(echo "$TAGS" | grep -oE "${BRANCH_NAME}-sha-[a-f0-9]{40}" | head -n 1) - - # Method 2: If not found, try to extract any branch-sha- tag (fallback) - if [ -z "$SHA_TAG" ]; then - SHA_TAG=$(echo "$TAGS" | grep -oE "${BRANCH_NAME}-sha-[a-f0-9]+" | head -n 1) - if [ -n "$SHA_TAG" ]; then - echo "⚠️ Found SHA tag (may not be full 40 chars): $SHA_TAG" - fi - fi - - # Method 3: Fallback to commit SHA directly (construct the tag) - if [ -z "$SHA_TAG" ]; then - SHA_TAG="${BRANCH_NAME}-sha-$COMMIT_SHA" - echo "⚠️ Could not extract from tags, using commit SHA: $SHA_TAG" - fi - - if [ -z "$SHA_TAG" ]; then - echo "❌ ERROR: Failed to extract SHA tag" - exit 1 - fi - - echo "sha-tag=$SHA_TAG" >> $GITHUB_OUTPUT - echo "✅ Extracted SHA tag: $SHA_TAG" - - - name: Update kustomization with new image tag - env: - GITEA_TOKEN: ${{ secrets.GITEAREGISTRYTOKEN }} - run: | - git config --global user.name "gitea-actions[bot]" - git config --global user.email "gitea-actions[bot]@users.noreply.gitea.com" - - # Validate that SHA_TAG is not empty - SHA_TAG="${{ steps.extract-tag.outputs.sha-tag }}" - if [ -z "$SHA_TAG" ]; then - echo "❌ ERROR: SHA_TAG is empty, cannot update kustomization" - exit 1 - fi - - # Determine overlay based on branch - BRANCH_NAME="${{ github.ref_name }}" - if [ "$BRANCH_NAME" = "main" ]; then - OVERLAY="prod" - elif [ "$BRANCH_NAME" = "develop" ]; then - OVERLAY="dev" - else - echo "⚠️ Unknown branch: $BRANCH_NAME, skipping kustomization update" - exit 0 - fi - - KUSTOMIZATION_FILE="deploy/k8s/overlays/$OVERLAY/kustomization.yaml" - - # Check if kustomization file has images section - if grep -q "images:" "$KUSTOMIZATION_FILE"; then - echo "📝 Updating $KUSTOMIZATION_FILE with tag: $SHA_TAG" - - # Update kustomization.yaml with new image tag - # Handle both cases: newTag: (with value) and newTag: (empty) - sed -i.bak "s|newTag:.*|newTag: $SHA_TAG|" "$KUSTOMIZATION_FILE" - - # Verify the update was successful - if grep -q "newTag: $SHA_TAG" "$KUSTOMIZATION_FILE"; then - echo "✅ Successfully updated kustomization.yaml" - rm -f "$KUSTOMIZATION_FILE.bak" - else - echo "❌ ERROR: Failed to update kustomization.yaml" - cat "$KUSTOMIZATION_FILE" - exit 1 - fi - - # Commit and push if there are changes - if git diff --quiet; then - echo "No changes to commit" - else - git add "$KUSTOMIZATION_FILE" - git commit -m "Update $OVERLAY image to $SHA_TAG" - git push - echo "✅ Kustomization updated with new image tag: $SHA_TAG" - fi - else - echo "ℹ️ $OVERLAY overlay uses base image (latest tag), skipping kustomization update" - echo " Image built with tag: $SHA_TAG" - fi - - - name: Display image information - run: | - echo "✅ Image built and pushed successfully!" - echo "📦 Image tags:" - echo "${{ steps.meta.outputs.tags }}" - echo "🔖 SHA tag: ${{ steps.extract-tag.outputs.sha-tag }}" - echo "🔖 Digest: ${{ steps.build.outputs.digest }}" - echo "" - echo "🚀 Kustomization updated with new image tag" - echo " ArgoCD will automatically detect and deploy this new image" - echo " Monitor deployment at your ArgoCD dashboard" diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml deleted file mode 100644 index e2879a5..0000000 --- a/.gitea/workflows/ci.yml +++ /dev/null @@ -1,45 +0,0 @@ -name: CI - -on: - push: - branches: [main, develop] - pull_request: - branches: [main, develop] - -jobs: - lint-and-build: - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: '20' - cache: 'npm' - cache-dependency-path: services/nextjs/package-lock.json - - - name: Install dependencies - working-directory: services/nextjs - run: npm ci - - - name: Run ESLint - working-directory: services/nextjs - run: npm run lint - - - name: Build Next.js application - working-directory: services/nextjs - run: npm run build - env: - NEXT_TELEMETRY_DISABLED: 1 - - - name: Check build output - working-directory: services/nextjs - run: | - if [ ! -d ".next" ]; then - echo "Build failed: .next directory not found" - exit 1 - fi - echo "✅ Build completed successfully" diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a75539b..c7ee892 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,7 +2,7 @@ name: Build Docker Image on: push: - branches: [main, develop] + branches: [main] tags: - 'v*' workflow_dispatch: @@ -15,7 +15,7 @@ jobs: build-and-push: runs-on: ubuntu-24.04-arm permissions: - contents: write + contents: read packages: write outputs: @@ -47,19 +47,17 @@ jobs: with: images: ${{ env.REGISTRY }}/${{ steps.lowercase.outputs.repo }} tags: | - type=ref,event=branch - type=ref,event=pr + type=sha,prefix=sha-,format=long + type=raw,value=latest,enable={{is_default_branch}} type=semver,pattern={{version}} type=semver,pattern={{major}}.{{minor}} - type=sha,prefix={{branch}}-sha-,format=long - type=raw,value=latest,enable={{is_default_branch}} - name: Build and push Docker image id: build uses: docker/build-push-action@v5 with: - context: ./services/nextjs - file: ./deploy/docker/Dockerfile.prod + context: ./nextjs + file: ./Dockerfile push: true platforms: linux/arm64 tags: ${{ steps.meta.outputs.tags }} @@ -67,115 +65,9 @@ jobs: cache-from: type=gha cache-to: type=gha,mode=max - - name: Extract SHA tag - id: extract-tag - run: | - # Extract the SHA-based tag from the tags list - TAGS="${{ steps.meta.outputs.tags }}" - echo "All tags:" - echo "$TAGS" - echo "---" - - # Get commit SHA (full 40 characters) - COMMIT_SHA="${{ github.sha }}" - - # Get current branch name - BRANCH_NAME="${{ github.ref_name }}" - echo "Branch: $BRANCH_NAME" - - # Method 1: Extract the full SHA tag from docker/metadata-action output - # docker/metadata-action creates: -sha- - SHA_TAG=$(echo "$TAGS" | grep -oE "${BRANCH_NAME}-sha-[a-f0-9]{40}" | head -n 1) - - # Method 2: If not found, try to extract any branch-sha- tag (fallback) - if [ -z "$SHA_TAG" ]; then - SHA_TAG=$(echo "$TAGS" | grep -oE "${BRANCH_NAME}-sha-[a-f0-9]+" | head -n 1) - if [ -n "$SHA_TAG" ]; then - echo "⚠️ Found SHA tag (may not be full 40 chars): $SHA_TAG" - fi - fi - - # Method 3: Fallback to commit SHA directly (construct the tag) - if [ -z "$SHA_TAG" ]; then - SHA_TAG="${BRANCH_NAME}-sha-$COMMIT_SHA" - echo "⚠️ Could not extract from tags, using commit SHA: $SHA_TAG" - fi - - if [ -z "$SHA_TAG" ]; then - echo "❌ ERROR: Failed to extract SHA tag" - exit 1 - fi - - echo "sha-tag=$SHA_TAG" >> $GITHUB_OUTPUT - echo "✅ Extracted SHA tag: $SHA_TAG" - - - name: Update kustomization with new image tag - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - git config --global user.name "github-actions[bot]" - git config --global user.email "github-actions[bot]@users.noreply.github.com" - - # Validate that SHA_TAG is not empty - SHA_TAG="${{ steps.extract-tag.outputs.sha-tag }}" - if [ -z "$SHA_TAG" ]; then - echo "❌ ERROR: SHA_TAG is empty, cannot update kustomization" - exit 1 - fi - - # Determine overlay based on branch - BRANCH_NAME="${{ github.ref_name }}" - if [ "$BRANCH_NAME" = "main" ]; then - OVERLAY="prod" - elif [ "$BRANCH_NAME" = "develop" ]; then - OVERLAY="dev" - else - echo "⚠️ Unknown branch: $BRANCH_NAME, skipping kustomization update" - exit 0 - fi - - KUSTOMIZATION_FILE="deploy/k8s/overlays/$OVERLAY/kustomization.yaml" - - # Check if kustomization file has images section - if grep -q "images:" "$KUSTOMIZATION_FILE"; then - echo "📝 Updating $KUSTOMIZATION_FILE with tag: $SHA_TAG" - - # Update kustomization.yaml with new image tag - # Handle both cases: newTag: (with value) and newTag: (empty) - sed -i.bak "s|newTag:.*|newTag: $SHA_TAG|" "$KUSTOMIZATION_FILE" - - # Verify the update was successful - if grep -q "newTag: $SHA_TAG" "$KUSTOMIZATION_FILE"; then - echo "✅ Successfully updated kustomization.yaml" - rm -f "$KUSTOMIZATION_FILE.bak" - else - echo "❌ ERROR: Failed to update kustomization.yaml" - cat "$KUSTOMIZATION_FILE" - exit 1 - fi - - # Commit and push if there are changes - if git diff --quiet; then - echo "No changes to commit" - else - git add "$KUSTOMIZATION_FILE" - git commit -m "Update $OVERLAY image to $SHA_TAG" - git push - echo "✅ Kustomization updated with new image tag: $SHA_TAG" - fi - else - echo "ℹ️ $OVERLAY overlay uses base image (latest tag), skipping kustomization update" - echo " Image built with tag: $SHA_TAG" - fi - - name: Display image information run: | - echo "✅ Image built and pushed successfully!" - echo "📦 Image tags:" + echo "Image built and pushed successfully!" + echo "Image tags:" echo "${{ steps.meta.outputs.tags }}" - echo "🔖 SHA tag: ${{ steps.extract-tag.outputs.sha-tag }}" - echo "🔖 Digest: ${{ steps.build.outputs.digest }}" - echo "" - echo "🚀 Kustomization updated with new image tag" - echo " ArgoCD will automatically detect and deploy this new image" - echo " Monitor deployment at your ArgoCD dashboard" + echo "Digest: ${{ steps.build.outputs.digest }}" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e2879a5..afbf679 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,9 +2,9 @@ name: CI on: push: - branches: [main, develop] + branches: [main] pull_request: - branches: [main, develop] + branches: [main] jobs: lint-and-build: @@ -19,27 +19,27 @@ jobs: with: node-version: '20' cache: 'npm' - cache-dependency-path: services/nextjs/package-lock.json + cache-dependency-path: nextjs/package-lock.json - name: Install dependencies - working-directory: services/nextjs + working-directory: nextjs run: npm ci - name: Run ESLint - working-directory: services/nextjs + working-directory: nextjs run: npm run lint - name: Build Next.js application - working-directory: services/nextjs + working-directory: nextjs run: npm run build env: NEXT_TELEMETRY_DISABLED: 1 - name: Check build output - working-directory: services/nextjs + working-directory: nextjs run: | if [ ! -d ".next" ]; then echo "Build failed: .next directory not found" exit 1 fi - echo "✅ Build completed successfully" + echo "Build completed successfully" diff --git a/deploy/docker/Dockerfile.prod b/Dockerfile similarity index 100% rename from deploy/docker/Dockerfile.prod rename to Dockerfile diff --git a/deploy/argocd/application-dev.yaml b/deploy/argocd/application-dev.yaml deleted file mode 100644 index dd175ad..0000000 --- a/deploy/argocd/application-dev.yaml +++ /dev/null @@ -1,20 +0,0 @@ -apiVersion: argoproj.io/v1alpha1 -kind: Application -metadata: - name: portfolio-dev - namespace: argocd -spec: - project: default - source: - repoURL: https://github.com/Mayne0213/portfolio.git - targetRevision: develop - path: deploy/k8s/overlays/dev - destination: - server: https://kubernetes.default.svc - namespace: portfolio-dev - syncPolicy: - automated: - prune: true - selfHeal: true - syncOptions: - - CreateNamespace=true diff --git a/deploy/argocd/application-prod.yaml b/deploy/argocd/application-prod.yaml deleted file mode 100644 index 440aef3..0000000 --- a/deploy/argocd/application-prod.yaml +++ /dev/null @@ -1,20 +0,0 @@ -apiVersion: argoproj.io/v1alpha1 -kind: Application -metadata: - name: portfolio-prod - namespace: argocd -spec: - project: default - source: - repoURL: https://github.com/Mayne0213/portfolio.git - targetRevision: main - path: deploy/k8s/overlays/prod - destination: - server: https://kubernetes.default.svc - namespace: portfolio - syncPolicy: - automated: - prune: true - selfHeal: true - syncOptions: - - CreateNamespace=true diff --git a/deploy/argocd/application.yaml b/deploy/argocd/application.yaml deleted file mode 100644 index 96a52ca..0000000 --- a/deploy/argocd/application.yaml +++ /dev/null @@ -1,36 +0,0 @@ -apiVersion: argoproj.io/v1alpha1 -kind: Application -metadata: - name: portfolio - namespace: argocd - finalizers: - - resources-finalizer.argocd.argoproj.io -spec: - project: default - - source: - repoURL: https://github.com/Mayne0213/portfolio.git - targetRevision: main - path: deploy/argocd - - destination: - server: https://kubernetes.default.svc - namespace: argocd - - syncPolicy: - automated: - prune: true - selfHeal: true - allowEmpty: false - - syncOptions: - - CreateNamespace=true - - retry: - limit: 5 - backoff: - duration: 5s - factor: 2 - maxDuration: 3m - - revisionHistoryLimit: 10 diff --git a/deploy/argocd/kustomization.yaml b/deploy/argocd/kustomization.yaml deleted file mode 100644 index 6dfe32f..0000000 --- a/deploy/argocd/kustomization.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: kustomize.config.k8s.io/v1beta1 -kind: Kustomization - -resources: - # App of Apps Application (self-managing) - - application.yaml - - # Application deployments (prod and dev) - - application-prod.yaml - - application-dev.yaml diff --git a/deploy/docker/Dockerfile.dev b/deploy/docker/Dockerfile.dev deleted file mode 100644 index 6a25e7e..0000000 --- a/deploy/docker/Dockerfile.dev +++ /dev/null @@ -1,26 +0,0 @@ -# Development Dockerfile for Portfolio Next.js application -FROM node:20-alpine AS base - -# Install dependencies for development -RUN apk add --no-cache libc6-compat curl - -WORKDIR /app - -# Copy package files -COPY package.json package-lock.json* ./ - -# Install all dependencies (including dev dependencies) -RUN npm ci - -# Copy source code -COPY . . - -# Expose port -EXPOSE 3000 - -# Health check -HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ - CMD curl -f http://localhost:3000 || exit 1 - -# Default command (can be overridden in docker-compose) -CMD ["npm", "run", "dev"] diff --git a/deploy/docker/docker-compose.dev.yml b/deploy/docker/docker-compose.dev.yml deleted file mode 100644 index e19d7d9..0000000 --- a/deploy/docker/docker-compose.dev.yml +++ /dev/null @@ -1,27 +0,0 @@ -services: - # Development Portfolio Next.js Application - app: - build: - context: ../../services/nextjs - dockerfile: ../../deploy/docker/Dockerfile.dev - container_name: portfolio-app-dev - restart: unless-stopped - labels: - kompose.namespace: portfolio - ports: - - 3005:3000 - environment: - - NODE_ENV=development - - WATCHPACK_POLLING=true - networks: - - portfolio-network - volumes: - - ../../services/nextjs:/app - - /app/node_modules - - /app/.next - command: npm run dev - -networks: - portfolio-network: - driver: bridge - name: portfolio-network-dev diff --git a/deploy/docker/docker-compose.yml b/deploy/docker/docker-compose.yml deleted file mode 100644 index 7e32644..0000000 --- a/deploy/docker/docker-compose.yml +++ /dev/null @@ -1,22 +0,0 @@ -services: - # Production Portfolio Next.js Application - app: - image: portfolio-app - build: - context: ../../services/nextjs - dockerfile: ../../deploy/docker/Dockerfile.prod - container_name: portfolio-app-prod - restart: unless-stopped - labels: - kompose.namespace: portfolio - ports: - - 3005:3000 - environment: - - NODE_ENV=production - networks: - - portfolio-network - -networks: - portfolio-network: - driver: bridge - name: portfolio-network-prod diff --git a/deploy/k8s/base/argocd-secret.yaml b/deploy/k8s/base/argocd-secret.yaml deleted file mode 100644 index d5b2ce0..0000000 --- a/deploy/k8s/base/argocd-secret.yaml +++ /dev/null @@ -1,21 +0,0 @@ -apiVersion: v1 -kind: Secret -metadata: - name: argocd-token - namespace: portfolio -type: Opaque -stringData: - token: "" # ArgoCD 토큰을 여기에 설정하거나, kubectl create secret로 생성 ---- -# 사용 방법: -# 1. ArgoCD 토큰 생성: -# argocd account generate-token -# -# 2. Secret 생성: -# kubectl create secret generic argocd-token \ -# --from-literal=token='YOUR_TOKEN_HERE' \ -# -n portfolio -# -# 또는 이 파일을 수정하고: -# kubectl apply -f argocd-secret.yaml - diff --git a/deploy/k8s/base/deployment.yaml b/deploy/k8s/base/deployment.yaml deleted file mode 100644 index 3c8843f..0000000 --- a/deploy/k8s/base/deployment.yaml +++ /dev/null @@ -1,53 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: portfolio-app - labels: - app: portfolio-app -spec: - replicas: 1 - selector: - matchLabels: - app: portfolio-app - strategy: - type: RollingUpdate - rollingUpdate: - maxUnavailable: 1 - maxSurge: 1 - revisionHistoryLimit: 1 - template: - metadata: - labels: - app: portfolio-app - spec: - containers: - - name: portfolio-app - image: ghcr.io/mayne0213/portfolio:latest - imagePullPolicy: Always - ports: - - containerPort: 3000 - protocol: TCP - env: - - name: NODE_ENV - value: production - - name: PROMETHEUS_URL - value: "http://prometheus.monitoring.svc.cluster.local:9090" - resources: - requests: - memory: "100Mi" - cpu: "50m" - limits: - memory: "200Mi" - livenessProbe: - httpGet: - path: / - port: 3000 - initialDelaySeconds: 30 - periodSeconds: 10 - readinessProbe: - httpGet: - path: / - port: 3000 - initialDelaySeconds: 5 - periodSeconds: 5 - restartPolicy: Always diff --git a/deploy/k8s/base/kustomization.yaml b/deploy/k8s/base/kustomization.yaml deleted file mode 100644 index cda84b9..0000000 --- a/deploy/k8s/base/kustomization.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: kustomize.config.k8s.io/v1beta1 -kind: Kustomization - -resources: - - deployment.yaml - - service.yaml - # SealedSecret은 각 overlay에서 관리 - -commonLabels: - app.kubernetes.io/name: portfolio - app.kubernetes.io/component: web - -images: - - name: gitea0213.kro.kr/bluemayne/portfolio - newTag: latest diff --git a/deploy/k8s/base/service.yaml b/deploy/k8s/base/service.yaml deleted file mode 100644 index 4e5e3ff..0000000 --- a/deploy/k8s/base/service.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: portfolio-service - labels: - app: portfolio-app -spec: - type: ClusterIP - ports: - - name: http - port: 80 - targetPort: 3000 - protocol: TCP - selector: - app: portfolio-app diff --git a/deploy/k8s/overlays/dev/deployment-patch.yaml b/deploy/k8s/overlays/dev/deployment-patch.yaml deleted file mode 100644 index 91eb33b..0000000 --- a/deploy/k8s/overlays/dev/deployment-patch.yaml +++ /dev/null @@ -1,18 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: portfolio-app - labels: - environment: development -spec: - replicas: 1 - template: - spec: - containers: - - name: portfolio-app - resources: - requests: - memory: "50Mi" - cpu: "30m" - limits: - memory: "120Mi" diff --git a/deploy/k8s/overlays/dev/ingress.yaml b/deploy/k8s/overlays/dev/ingress.yaml deleted file mode 100644 index 79b1059..0000000 --- a/deploy/k8s/overlays/dev/ingress.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: portfolio-dev-ingress - annotations: - nginx.ingress.kubernetes.io/rewrite-target: / - nginx.ingress.kubernetes.io/ssl-redirect: "true" - cert-manager.io/cluster-issuer: "letsencrypt-prod" -spec: - ingressClassName: traefik - tls: - - hosts: - - dev.minjo0213.kro.kr - secretName: portfolio-dev-tls - rules: - - host: dev.minjo0213.kro.kr - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: portfolio-service - port: - number: 80 diff --git a/deploy/k8s/overlays/dev/kustomization.yaml b/deploy/k8s/overlays/dev/kustomization.yaml deleted file mode 100644 index 64d875c..0000000 --- a/deploy/k8s/overlays/dev/kustomization.yaml +++ /dev/null @@ -1,21 +0,0 @@ -apiVersion: kustomize.config.k8s.io/v1beta1 -kind: Kustomization - -namespace: portfolio-dev - -resources: - - ../../base - - resourcequota.yaml - - namespace.yaml - - ingress.yaml - -commonLabels: - environment: development - -# 이미지 태그 설정 -images: - - name: gitea0213.kro.kr/bluemayne/portfolio - newTag: develop-sha-59417db99e01138c0e756e7b425e6a6c328377a1 - -patchesStrategicMerge: - - deployment-patch.yaml diff --git a/deploy/k8s/overlays/dev/namespace.yaml b/deploy/k8s/overlays/dev/namespace.yaml deleted file mode 100644 index 08ed568..0000000 --- a/deploy/k8s/overlays/dev/namespace.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: portfolio-dev - labels: - environment: development - app: portfolio diff --git a/deploy/k8s/overlays/dev/resourcequota.yaml b/deploy/k8s/overlays/dev/resourcequota.yaml deleted file mode 100644 index b2b196e..0000000 --- a/deploy/k8s/overlays/dev/resourcequota.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: v1 -kind: ResourceQuota -metadata: - name: portfolio-dev-quota - namespace: portfolio-dev -spec: - hard: - requests.memory: "200Mi" - requests.cpu: "100m" - limits.memory: "400Mi" - pods: "6" diff --git a/deploy/k8s/overlays/prod/deployment-patch.yaml b/deploy/k8s/overlays/prod/deployment-patch.yaml deleted file mode 100644 index 0b81f1c..0000000 --- a/deploy/k8s/overlays/prod/deployment-patch.yaml +++ /dev/null @@ -1,18 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: portfolio-app - labels: - environment: production -spec: - replicas: 2 - template: - spec: - containers: - - name: portfolio-app - resources: - requests: - memory: "80Mi" - cpu: "20m" # Reduced from 50m based on actual usage (12m) - limits: - memory: "150Mi" diff --git a/deploy/k8s/overlays/prod/ingress.yaml b/deploy/k8s/overlays/prod/ingress.yaml deleted file mode 100644 index 70c4d9c..0000000 --- a/deploy/k8s/overlays/prod/ingress.yaml +++ /dev/null @@ -1,38 +0,0 @@ -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: portfolio-ingress - annotations: - # HTTP를 HTTPS로 자동 리다이렉트 - nginx.ingress.kubernetes.io/ssl-redirect: "true" - # cert-manager가 인증서를 자동으로 발급하도록 설정 - cert-manager.io/cluster-issuer: "letsencrypt-prod" -spec: - ingressClassName: traefik - # TLS 설정 - tls: - - hosts: - - minjo0213.kro.kr - - www.minjo0213.kro.kr - secretName: portfolio-tls - rules: - - host: minjo0213.kro.kr - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: portfolio-service - port: - number: 80 - - host: www.minjo0213.kro.kr - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: portfolio-service - port: - number: 80 diff --git a/deploy/k8s/overlays/prod/kustomization.yaml b/deploy/k8s/overlays/prod/kustomization.yaml deleted file mode 100644 index 4421184..0000000 --- a/deploy/k8s/overlays/prod/kustomization.yaml +++ /dev/null @@ -1,20 +0,0 @@ -apiVersion: kustomize.config.k8s.io/v1beta1 -kind: Kustomization - -namespace: portfolio - -resources: - - ../../base - - resourcequota.yaml - - ingress.yaml - -commonLabels: - environment: production - -# 이미지 태그 설정 -images: - - name: ghcr.io/mayne0213/portfolio - newTag: main-sha-7937ec4e7abb9d514f27a058c92636a809d607a4 - -patchesStrategicMerge: - - deployment-patch.yaml diff --git a/deploy/k8s/overlays/prod/resourcequota.yaml b/deploy/k8s/overlays/prod/resourcequota.yaml deleted file mode 100644 index 3c1485e..0000000 --- a/deploy/k8s/overlays/prod/resourcequota.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: v1 -kind: ResourceQuota -metadata: - name: portfolio-quota - namespace: portfolio -spec: - hard: - requests.memory: "400Mi" - requests.cpu: "250m" - limits.memory: "600Mi" - pods: "9" diff --git a/services/nextjs/.gitignore b/nextjs/.gitignore similarity index 100% rename from services/nextjs/.gitignore rename to nextjs/.gitignore diff --git a/services/nextjs/README.md b/nextjs/README.md similarity index 100% rename from services/nextjs/README.md rename to nextjs/README.md diff --git a/services/nextjs/app/[locale]/layout.tsx b/nextjs/app/[locale]/layout.tsx similarity index 100% rename from services/nextjs/app/[locale]/layout.tsx rename to nextjs/app/[locale]/layout.tsx diff --git a/services/nextjs/app/[locale]/page.tsx b/nextjs/app/[locale]/page.tsx similarity index 100% rename from services/nextjs/app/[locale]/page.tsx rename to nextjs/app/[locale]/page.tsx diff --git a/services/nextjs/app/favicon.ico b/nextjs/app/favicon.ico similarity index 100% rename from services/nextjs/app/favicon.ico rename to nextjs/app/favicon.ico diff --git a/services/nextjs/app/globals.css b/nextjs/app/globals.css similarity index 100% rename from services/nextjs/app/globals.css rename to nextjs/app/globals.css diff --git a/services/nextjs/components.json b/nextjs/components.json similarity index 100% rename from services/nextjs/components.json rename to nextjs/components.json diff --git a/services/nextjs/components/landing/about.tsx b/nextjs/components/landing/about.tsx similarity index 100% rename from services/nextjs/components/landing/about.tsx rename to nextjs/components/landing/about.tsx diff --git a/services/nextjs/components/landing/contact.tsx b/nextjs/components/landing/contact.tsx similarity index 100% rename from services/nextjs/components/landing/contact.tsx rename to nextjs/components/landing/contact.tsx diff --git a/services/nextjs/components/landing/grafana.tsx b/nextjs/components/landing/grafana.tsx similarity index 100% rename from services/nextjs/components/landing/grafana.tsx rename to nextjs/components/landing/grafana.tsx diff --git a/services/nextjs/components/landing/hero.tsx b/nextjs/components/landing/hero.tsx similarity index 100% rename from services/nextjs/components/landing/hero.tsx rename to nextjs/components/landing/hero.tsx diff --git a/services/nextjs/components/landing/projects.tsx b/nextjs/components/landing/projects.tsx similarity index 100% rename from services/nextjs/components/landing/projects.tsx rename to nextjs/components/landing/projects.tsx diff --git a/services/nextjs/components/landing/section-header.tsx b/nextjs/components/landing/section-header.tsx similarity index 100% rename from services/nextjs/components/landing/section-header.tsx rename to nextjs/components/landing/section-header.tsx diff --git a/services/nextjs/components/landing/skills.tsx b/nextjs/components/landing/skills.tsx similarity index 100% rename from services/nextjs/components/landing/skills.tsx rename to nextjs/components/landing/skills.tsx diff --git a/services/nextjs/components/ui/Particles.jsx b/nextjs/components/ui/Particles.jsx similarity index 100% rename from services/nextjs/components/ui/Particles.jsx rename to nextjs/components/ui/Particles.jsx diff --git a/services/nextjs/components/ui/button.tsx b/nextjs/components/ui/button.tsx similarity index 100% rename from services/nextjs/components/ui/button.tsx rename to nextjs/components/ui/button.tsx diff --git a/services/nextjs/components/ui/card.tsx b/nextjs/components/ui/card.tsx similarity index 100% rename from services/nextjs/components/ui/card.tsx rename to nextjs/components/ui/card.tsx diff --git a/services/nextjs/components/ui/dropdown-menu.tsx b/nextjs/components/ui/dropdown-menu.tsx similarity index 100% rename from services/nextjs/components/ui/dropdown-menu.tsx rename to nextjs/components/ui/dropdown-menu.tsx diff --git a/services/nextjs/components/ui/input.tsx b/nextjs/components/ui/input.tsx similarity index 100% rename from services/nextjs/components/ui/input.tsx rename to nextjs/components/ui/input.tsx diff --git a/services/nextjs/components/ui/language-toggle.tsx b/nextjs/components/ui/language-toggle.tsx similarity index 100% rename from services/nextjs/components/ui/language-toggle.tsx rename to nextjs/components/ui/language-toggle.tsx diff --git a/services/nextjs/components/ui/mode-toggle.tsx b/nextjs/components/ui/mode-toggle.tsx similarity index 100% rename from services/nextjs/components/ui/mode-toggle.tsx rename to nextjs/components/ui/mode-toggle.tsx diff --git a/services/nextjs/components/ui/separator.tsx b/nextjs/components/ui/separator.tsx similarity index 100% rename from services/nextjs/components/ui/separator.tsx rename to nextjs/components/ui/separator.tsx diff --git a/services/nextjs/components/ui/textarea.tsx b/nextjs/components/ui/textarea.tsx similarity index 100% rename from services/nextjs/components/ui/textarea.tsx rename to nextjs/components/ui/textarea.tsx diff --git a/services/nextjs/components/widgets/Footer.tsx b/nextjs/components/widgets/Footer.tsx similarity index 100% rename from services/nextjs/components/widgets/Footer.tsx rename to nextjs/components/widgets/Footer.tsx diff --git a/services/nextjs/components/widgets/Header.tsx b/nextjs/components/widgets/Header.tsx similarity index 100% rename from services/nextjs/components/widgets/Header.tsx rename to nextjs/components/widgets/Header.tsx diff --git a/services/nextjs/eslint.config.mjs b/nextjs/eslint.config.mjs similarity index 100% rename from services/nextjs/eslint.config.mjs rename to nextjs/eslint.config.mjs diff --git a/services/nextjs/i18n/request.ts b/nextjs/i18n/request.ts similarity index 100% rename from services/nextjs/i18n/request.ts rename to nextjs/i18n/request.ts diff --git a/services/nextjs/i18n/routing.ts b/nextjs/i18n/routing.ts similarity index 100% rename from services/nextjs/i18n/routing.ts rename to nextjs/i18n/routing.ts diff --git a/services/nextjs/lib/utils.ts b/nextjs/lib/utils.ts similarity index 100% rename from services/nextjs/lib/utils.ts rename to nextjs/lib/utils.ts diff --git a/services/nextjs/messages/de.json b/nextjs/messages/de.json similarity index 100% rename from services/nextjs/messages/de.json rename to nextjs/messages/de.json diff --git a/services/nextjs/messages/en.json b/nextjs/messages/en.json similarity index 100% rename from services/nextjs/messages/en.json rename to nextjs/messages/en.json diff --git a/services/nextjs/messages/ko.json b/nextjs/messages/ko.json similarity index 100% rename from services/nextjs/messages/ko.json rename to nextjs/messages/ko.json diff --git a/services/nextjs/middleware.ts b/nextjs/middleware.ts similarity index 100% rename from services/nextjs/middleware.ts rename to nextjs/middleware.ts diff --git a/services/nextjs/next.config.ts b/nextjs/next.config.ts similarity index 100% rename from services/nextjs/next.config.ts rename to nextjs/next.config.ts diff --git a/services/nextjs/package-lock.json b/nextjs/package-lock.json similarity index 100% rename from services/nextjs/package-lock.json rename to nextjs/package-lock.json diff --git a/services/nextjs/package.json b/nextjs/package.json similarity index 100% rename from services/nextjs/package.json rename to nextjs/package.json diff --git a/services/nextjs/postcss.config.mjs b/nextjs/postcss.config.mjs similarity index 100% rename from services/nextjs/postcss.config.mjs rename to nextjs/postcss.config.mjs diff --git a/services/nextjs/providers/theme-provider.tsx b/nextjs/providers/theme-provider.tsx similarity index 100% rename from services/nextjs/providers/theme-provider.tsx rename to nextjs/providers/theme-provider.tsx diff --git a/services/nextjs/public/fonts/brand/SupremeLLTT-Black.woff2 b/nextjs/public/fonts/brand/SupremeLLTT-Black.woff2 similarity index 100% rename from services/nextjs/public/fonts/brand/SupremeLLTT-Black.woff2 rename to nextjs/public/fonts/brand/SupremeLLTT-Black.woff2 diff --git a/services/nextjs/public/fonts/brand/SupremeLLTT-BlackItalic.woff2 b/nextjs/public/fonts/brand/SupremeLLTT-BlackItalic.woff2 similarity index 100% rename from services/nextjs/public/fonts/brand/SupremeLLTT-BlackItalic.woff2 rename to nextjs/public/fonts/brand/SupremeLLTT-BlackItalic.woff2 diff --git a/services/nextjs/public/fonts/brand/SupremeLLTT-Bold.woff2 b/nextjs/public/fonts/brand/SupremeLLTT-Bold.woff2 similarity index 100% rename from services/nextjs/public/fonts/brand/SupremeLLTT-Bold.woff2 rename to nextjs/public/fonts/brand/SupremeLLTT-Bold.woff2 diff --git a/services/nextjs/public/fonts/brand/SupremeLLTT-BoldFlat.woff2 b/nextjs/public/fonts/brand/SupremeLLTT-BoldFlat.woff2 similarity index 100% rename from services/nextjs/public/fonts/brand/SupremeLLTT-BoldFlat.woff2 rename to nextjs/public/fonts/brand/SupremeLLTT-BoldFlat.woff2 diff --git a/services/nextjs/public/fonts/brand/SupremeLLTT-BoldFlatItalic.woff2 b/nextjs/public/fonts/brand/SupremeLLTT-BoldFlatItalic.woff2 similarity index 100% rename from services/nextjs/public/fonts/brand/SupremeLLTT-BoldFlatItalic.woff2 rename to nextjs/public/fonts/brand/SupremeLLTT-BoldFlatItalic.woff2 diff --git a/services/nextjs/public/fonts/brand/SupremeLLTT-BoldItalic.woff2 b/nextjs/public/fonts/brand/SupremeLLTT-BoldItalic.woff2 similarity index 100% rename from services/nextjs/public/fonts/brand/SupremeLLTT-BoldItalic.woff2 rename to nextjs/public/fonts/brand/SupremeLLTT-BoldItalic.woff2 diff --git a/services/nextjs/public/fonts/brand/SupremeLLTT-Book.woff2 b/nextjs/public/fonts/brand/SupremeLLTT-Book.woff2 similarity index 100% rename from services/nextjs/public/fonts/brand/SupremeLLTT-Book.woff2 rename to nextjs/public/fonts/brand/SupremeLLTT-Book.woff2 diff --git a/services/nextjs/public/fonts/brand/SupremeLLTT-BookItalic.woff2 b/nextjs/public/fonts/brand/SupremeLLTT-BookItalic.woff2 similarity index 100% rename from services/nextjs/public/fonts/brand/SupremeLLTT-BookItalic.woff2 rename to nextjs/public/fonts/brand/SupremeLLTT-BookItalic.woff2 diff --git a/services/nextjs/public/fonts/brand/SupremeLLTT-Italic.woff2 b/nextjs/public/fonts/brand/SupremeLLTT-Italic.woff2 similarity index 100% rename from services/nextjs/public/fonts/brand/SupremeLLTT-Italic.woff2 rename to nextjs/public/fonts/brand/SupremeLLTT-Italic.woff2 diff --git a/services/nextjs/public/fonts/brand/SupremeLLTT-Light.woff2 b/nextjs/public/fonts/brand/SupremeLLTT-Light.woff2 similarity index 100% rename from services/nextjs/public/fonts/brand/SupremeLLTT-Light.woff2 rename to nextjs/public/fonts/brand/SupremeLLTT-Light.woff2 diff --git a/services/nextjs/public/fonts/brand/SupremeLLTT-LightItalic.woff2 b/nextjs/public/fonts/brand/SupremeLLTT-LightItalic.woff2 similarity index 100% rename from services/nextjs/public/fonts/brand/SupremeLLTT-LightItalic.woff2 rename to nextjs/public/fonts/brand/SupremeLLTT-LightItalic.woff2 diff --git a/services/nextjs/public/fonts/brand/SupremeLLTT-Medium.woff2 b/nextjs/public/fonts/brand/SupremeLLTT-Medium.woff2 similarity index 100% rename from services/nextjs/public/fonts/brand/SupremeLLTT-Medium.woff2 rename to nextjs/public/fonts/brand/SupremeLLTT-Medium.woff2 diff --git a/services/nextjs/public/fonts/brand/SupremeLLTT-MediumItalic.woff2 b/nextjs/public/fonts/brand/SupremeLLTT-MediumItalic.woff2 similarity index 100% rename from services/nextjs/public/fonts/brand/SupremeLLTT-MediumItalic.woff2 rename to nextjs/public/fonts/brand/SupremeLLTT-MediumItalic.woff2 diff --git a/services/nextjs/public/fonts/brand/SupremeLLTT-Regular.woff2 b/nextjs/public/fonts/brand/SupremeLLTT-Regular.woff2 similarity index 100% rename from services/nextjs/public/fonts/brand/SupremeLLTT-Regular.woff2 rename to nextjs/public/fonts/brand/SupremeLLTT-Regular.woff2 diff --git a/services/nextjs/public/fonts/brand/SupremeLLTT-Thin.woff2 b/nextjs/public/fonts/brand/SupremeLLTT-Thin.woff2 similarity index 100% rename from services/nextjs/public/fonts/brand/SupremeLLTT-Thin.woff2 rename to nextjs/public/fonts/brand/SupremeLLTT-Thin.woff2 diff --git a/services/nextjs/public/fonts/brand/SupremeLLTT-ThinItalic.woff2 b/nextjs/public/fonts/brand/SupremeLLTT-ThinItalic.woff2 similarity index 100% rename from services/nextjs/public/fonts/brand/SupremeLLTT-ThinItalic.woff2 rename to nextjs/public/fonts/brand/SupremeLLTT-ThinItalic.woff2 diff --git a/services/nextjs/public/fonts/generated-fonts.css b/nextjs/public/fonts/generated-fonts.css similarity index 100% rename from services/nextjs/public/fonts/generated-fonts.css rename to nextjs/public/fonts/generated-fonts.css diff --git a/services/nextjs/public/icons/docusaurus.svg b/nextjs/public/icons/docusaurus.svg similarity index 100% rename from services/nextjs/public/icons/docusaurus.svg rename to nextjs/public/icons/docusaurus.svg diff --git a/services/nextjs/public/jaejadle/home.png b/nextjs/public/jaejadle/home.png similarity index 100% rename from services/nextjs/public/jaejadle/home.png rename to nextjs/public/jaejadle/home.png diff --git a/services/nextjs/public/joossam/home.png b/nextjs/public/joossam/home.png similarity index 100% rename from services/nextjs/public/joossam/home.png rename to nextjs/public/joossam/home.png diff --git a/services/nextjs/public/joossam/main.png b/nextjs/public/joossam/main.png similarity index 100% rename from services/nextjs/public/joossam/main.png rename to nextjs/public/joossam/main.png diff --git a/services/nextjs/public/jotion/home.png b/nextjs/public/jotion/home.png similarity index 100% rename from services/nextjs/public/jotion/home.png rename to nextjs/public/jotion/home.png diff --git a/services/nextjs/public/jovies/home.png b/nextjs/public/jovies/home.png similarity index 100% rename from services/nextjs/public/jovies/home.png rename to nextjs/public/jovies/home.png diff --git a/services/nextjs/public/portfolio/home.png b/nextjs/public/portfolio/home.png similarity index 100% rename from services/nextjs/public/portfolio/home.png rename to nextjs/public/portfolio/home.png diff --git a/services/nextjs/public/todoList/home.png b/nextjs/public/todoList/home.png similarity index 100% rename from services/nextjs/public/todoList/home.png rename to nextjs/public/todoList/home.png diff --git a/services/nextjs/public/window.svg b/nextjs/public/window.svg similarity index 100% rename from services/nextjs/public/window.svg rename to nextjs/public/window.svg diff --git a/services/nextjs/tsconfig.json b/nextjs/tsconfig.json similarity index 100% rename from services/nextjs/tsconfig.json rename to nextjs/tsconfig.json