From aa0c6138c219583756339f5c7bd6362c014a2cfc Mon Sep 17 00:00:00 2001 From: Ou Date: Thu, 24 Oct 2024 02:17:47 +0800 Subject: [PATCH] chore: support docker --- .dockerignore | 12 ++++++++ .github/workflows/docker.yml | 49 ++++++++++++++++++++++++++++++++ Dockerfile | 13 +++++++++ docker-compose.yml | 14 ++++++++++ package.json | 2 +- vite.config.ts | 54 +++++++++++++++++++++++------------- 6 files changed, 124 insertions(+), 20 deletions(-) create mode 100644 .dockerignore create mode 100644 .github/workflows/docker.yml create mode 100644 Dockerfile create mode 100644 docker-compose.yml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..bc1a548 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,12 @@ +node_modules/ +dist/ +.vercel +.output +.vinxi +.cache +.data +.wrangler +.env +.env.* +dev-dist +*.tsbuildinfo \ No newline at end of file diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml new file mode 100644 index 0000000..da3e7f5 --- /dev/null +++ b/.github/workflows/docker.yml @@ -0,0 +1,49 @@ +name: Publish Docker image + +on: + push: + tags: + - 'v*' + workflow_dispatch: + +jobs: + build-docker: + name: Push Docker image to multiple registries + runs-on: ubuntu-latest + permissions: + packages: write + contents: read + steps: + - name: Check out the repo + uses: actions/checkout@v4 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to the Container registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v5 + with: + images: ghcr.io/${{ github.repository }} + + - name: Build and push + uses: docker/build-push-action@v5 + with: + context: . + file: ./Dockerfile + platforms: | + linux/amd64 + linux/arm64 + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..b1e3f74 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,13 @@ +FROM node:20.12.2-alpine as builder +WORKDIR /usr/src +COPY . . +RUN corepack enable +RUN pnpm install +RUN pnpm run build + +FROM node:20.12.2-alpine +WORKDIR /usr/app +COPY --from=builder /usr/src/dist/output ./output +ENV HOST=0.0.0.0 PORT=4444 NODE_ENV=production +EXPOSE $PORT +CMD ["node", "output/server/index.mjs"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..faf1589 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,14 @@ +version: '3' + +services: + newsnow: + image: ourongxing/newsnow:latest + container_name: newsnow + restart: always + ports: + - '4444:4444' + environment: + - G_CLIENT_ID= + - G_CLIENT_SECRET= + - JWT_SECRET= + - INIT_TABLE=true diff --git a/package.json b/package.json index e3df736..21905ea 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "build": "vite build", "lint": "eslint", "favicon": "tsx ./scripts/favicon.ts", - "start": "PORT=4444 node --env-file .env.server dist/output/server/index.mjs", + "start": "node --env-file .env.server dist/output/server/index.mjs", "preview": "CF_PAGES=1 pnpm run build && wrangler pages dev", "deploy": "CF_PAGES=1 pnpm run build && wrangler pages deploy", "typecheck": "tsc --noEmit -p tsconfig.node.json && tsc --noEmit -p tsconfig.app.json", diff --git a/vite.config.ts b/vite.config.ts index e161928..5189fd8 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -12,6 +12,7 @@ import { VitePWA } from "vite-plugin-pwa" import { projectDir } from "./shared/dir" const isCF = process.env.CF_PAGES +const isVercel = process.env.VERCEL dotenv.config({ path: join(projectDir, ".env.server"), @@ -57,6 +58,39 @@ const pwaOption: Partial = { } +const nitroOption: Parameters[0] = { + experimental: { + database: true, + }, + sourceMap: false, + database: { + default: { + connector: "sqlite", + }, + }, + alias: { + "@shared": join(projectDir, "shared"), + "#": join(projectDir, "server"), + }, + preset: "node-server", +} + +if (isVercel) { + nitroOption.preset = "vercel-edge" + // You can use other online database, do it yourself. For more info: https://db0.unjs.io/connectors + nitroOption.database = undefined +} else if (isCF) { + nitroOption.preset = "cloudflare-workers" + nitroOption.database = { + default: { + connector: "cloudflare-d1", + options: { + bindingName: "NEWSNOW_DB", + }, + }, + } +} + export default defineConfig({ define: { __G_CLIENT_ID__: `"${process.env.G_CLIENT_ID}"`, @@ -70,24 +104,6 @@ export default defineConfig({ unocss(), react(), VitePWA(pwaOption), - nitro({ - experimental: { - database: true, - }, - sourceMap: false, - database: { - default: { - connector: isCF ? "cloudflare-d1" : "sqlite", - options: { - bindingName: "NEWSNOW_DB", - }, - }, - }, - alias: { - "@shared": join(projectDir, "shared"), - "#": join(projectDir, "server"), - }, - preset: isCF ? "cloudflare-pages" : "node-server", - }), + nitro(nitroOption), ], })