diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..d4e40b1 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,47 @@ +name: Build and Deploy Docker Images +on: + push: + branches: + - preview + +jobs: + build_and_deploy: + runs-on: ubuntu-latest + + env: + DANAK_SERVER: "https://captain.dev.danakcorp.com" + APP_TOKEN: 5a61a966132eff42f415e52f4ff8aded79e7ebb2f467d431f572f096145d09f4 + APP_NAME: dmenu-plus-front + GITHUB_TOKEN: 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 + + steps: + - name: Check out repositorys + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: zmihamid + password: ${{ env.GITHUB_TOKEN }} + + - name: Preset Image Name + run: echo "IMAGE_URL=$(echo ghcr.io/zmihamid/${{ github.event.repository.name }}:$(echo ${{ github.sha }} | cut -c1-7) | tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV + + - name: Build and push Docker Image + uses: docker/build-push-action@v5 + with: + context: . + file: ./Dockerfile + push: true + tags: ${{ env.IMAGE_URL }} + + - name: Install CapRover CLI + run: npm install -g caprover + + - name: deploy to server + run: | + caprover deploy -a $APP_NAME -u $DANAK_SERVER --appToken $APP_TOKEN -i "$IMAGE_URL" diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..3d7d975 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,43 @@ +FROM node:20-alpine AS base + +RUN apk add --no-cache tzdata && \ + cp /usr/share/zoneinfo/Asia/Tehran /etc/localtime && \ + echo "Asia/Tehran" > /etc/timezone + + +# RUN corepack enable && corepack prepare pnpm@latest --activate +WORKDIR /app + +FROM base AS deps +RUN apk add --no-cache libc6-compat git +COPY package*.json ./ +RUN npm ci --ignore-scripts --loglevel info + +FROM base AS builder +WORKDIR /build +COPY --from=deps /app/node_modules ./node_modules +COPY . . +RUN npm run build && npm ci --omit=dev --ignore-scripts --loglevel info + +FROM base AS runner +WORKDIR /app + +ENV NODE_ENV=production +ENV NEXT_TELEMETRY_DISABLED=1 + +RUN addgroup -S appgroup && adduser -S appuser -G appgroup +RUN mkdir .next && chown appuser:appgroup .next + +COPY --from=builder --chown=appuser:appgroup /build/.next/standalone ./ +COPY --from=builder --chown=appuser:appgroup /build/.next/static ./.next/static +COPY --from=builder --chown=appuser:appgroup /build/public ./public +COPY --from=builder --chown=appuser:appgroup /build/package.json ./package.json + +USER appuser + +EXPOSE 3000 +ENV PORT=3000 +ENV HOSTNAME="0.0.0.0" +ENV NEXT_PUBLIC_API_BASE_URL=https://api.danakcorp.com/ + +CMD ["node", "server.js"] \ No newline at end of file diff --git a/next.config.ts b/next.config.ts index e9ffa30..ef2c3d5 100644 --- a/next.config.ts +++ b/next.config.ts @@ -1,7 +1,53 @@ import type { NextConfig } from "next"; const nextConfig: NextConfig = { + output: "standalone", /* config options here */ + poweredByHeader: false, + images: { + domains: ["*"], + remotePatterns: [ + { + protocol: "https", + hostname: "**", + }, + { + protocol: "http", + hostname: "**", + }, + ], + }, + headers: async () => [ + { + source: "/:path*", + headers: [ + { + key: "X-DNS-Prefetch-Control", + value: "on", + }, + { + key: "Strict-Transport-Security", + value: "max-age=63072000; includeSubDomains; preload", + }, + { + key: "X-XSS-Protection", + value: "1; mode=block", + }, + { + key: "X-Frame-Options", + value: "SAMEORIGIN", + }, + { + key: "X-Content-Type-Options", + value: "nosniff", + }, + { + key: "Referrer-Policy", + value: "origin-when-cross-origin", + }, + ], + }, + ], }; export default nextConfig;