diff --git a/.github/workflows/docker-publish-bun.yml b/.github/workflows/docker-publish-bun.yml new file mode 100644 index 0000000..7ee79de --- /dev/null +++ b/.github/workflows/docker-publish-bun.yml @@ -0,0 +1,54 @@ +name: Docker (Bun) + +on: + workflow_dispatch: + +env: + REGISTRY: ghcr.io + IMAGE_OWNER: ${{ github.repository_owner }} + IMAGE_NAME: tg-chat-bot + +jobs: + build: + + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + id-token: write + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log into registry ${{ env.REGISTRY }} + if: github.event_name != 'pull_request' + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract Docker metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_OWNER }}/${{ env.IMAGE_NAME }} + tags: | + type=raw,value=latest,enable=${{ github.ref_name == 'master' }} + type=ref,event=branch + + - name: Build and push Docker image + id: build-and-push + uses: docker/build-push-action@v5 + with: + context: . + file: Dockerfile-bun + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 6b0735e..1c130f9 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -46,7 +46,7 @@ jobs: uses: docker/build-push-action@v5 with: context: . - file: Dockerfile-bun + file: Dockerfile push: ${{ github.event_name != 'pull_request' }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} diff --git a/Dockerfile b/Dockerfile index 9e73004..50bbd97 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,25 +1,28 @@ # ---- build ---- -FROM node:22-alpine AS builder +FROM node:20-alpine AS builder WORKDIR /app -COPY package*.json ./ -RUN npm ci --no-audit --no-fund +COPY package.json package-lock.json tsconfig*.json ./ +RUN npm ci -COPY . . -RUN npm run build +COPY src ./src +COPY assets ./assets -# only prod dependencies -RUN npm prune --omit=dev +RUN npx tsc -p tsconfig.build.json # ---- runtime ---- -FROM node:22-alpine AS runner +FROM node:20-alpine AS runner WORKDIR /app ENV NODE_ENV=production ENV IS_DOCKER=true -COPY --from=builder /app/package*.json ./ -COPY --from=builder /app/node_modules ./node_modules -COPY --from=builder /app/dist ./dist +COPY package.json package-lock.json ./ +RUN npm ci --omit=dev && npm cache clean --force -CMD [ "node", "dist/index.js" ] \ No newline at end of file +USER node + +COPY --from=builder --chown=node:node /app/dist ./dist +COPY --from=builder --chown=node:node /app/assets ./assets + +CMD ["node", "dist/index.js"] \ No newline at end of file