diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..44a7446 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,41 @@ +# use the official Bun image +# see all versions at https://hub.docker.com/r/oven/bun/tags +FROM oven/bun:1 AS base +WORKDIR /usr/src/app + +# install dependencies into temp directory +# this will cache them and speed up future builds +FROM base AS install +RUN mkdir -p /temp/dev +COPY package.json bun.lockb /temp/dev/ +RUN cd /temp/dev && bun install --frozen-lockfile + +# install with --production (exclude devDependencies) +RUN mkdir -p /temp/prod +COPY package.json bun.lockb /temp/prod/ +RUN cd /temp/prod && bun install --frozen-lockfile --production + +# copy node_modules from temp directory +# then copy all (non-ignored) project files into the image +FROM base AS prerelease +COPY --from=install /temp/dev/node_modules node_modules +COPY . . + +# build +ENV NODE_ENV=production +RUN bun run build + +# copy production dependencies and source code into final image +FROM base AS release + +RUN mkdir .next + +COPY --from=install /temp/prod/node_modules node_modules +COPY --from=prerelease /usr/src/app/public ./public +COPY --from=prerelease /usr/src/app/.next/standalone ./ +COPY --from=prerelease /usr/src/app/.next/static ./.next/static + +# run the app +USER bun +EXPOSE 3000/tcp +ENTRYPOINT [ "bun", "run", "start" ] diff --git a/docker/dev/docker-compose.yaml b/docker/dev/docker-compose.yaml new file mode 100644 index 0000000..e08ad7d --- /dev/null +++ b/docker/dev/docker-compose.yaml @@ -0,0 +1,8 @@ +services: + + portfolio: + container_name: markus_portfolio + image: markusthielker/portfolio:v2.0.0 + restart: unless-stopped + ports: + - "80:3000" diff --git a/docker/prod/docker-compose.yaml b/docker/prod/docker-compose.yaml new file mode 100644 index 0000000..017a6d4 --- /dev/null +++ b/docker/prod/docker-compose.yaml @@ -0,0 +1,19 @@ +services: + + portfolio: + container_name: markus_portfolio + image: markusthielker/portfolio:v2.0.0 + restart: unless-stopped + networks: + - web + labels: + - traefik.enable=true + - traefik.http.routers.markus-dev-portfolio.rule=Host(`thielker.dev`) + - traefik.http.routers.markus-dev-portfolio.entrypoints=websecure + - traefik.http.routers.markus-dev-portfolio.tls=true + - traefik.http.routers.markus-dev-portfolio.tls.certresolver=lets-encrypt + - com.centurylinklabs.watchtower.enable=true + +networks: + web: + external: true diff --git a/next.config.ts b/next.config.ts index e9ffa30..8c49b3f 100644 --- a/next.config.ts +++ b/next.config.ts @@ -1,7 +1,7 @@ -import type { NextConfig } from "next"; +import type { NextConfig } from 'next'; const nextConfig: NextConfig = { - /* config options here */ + output: 'standalone', }; export default nextConfig; diff --git a/package.json b/package.json index a5721d6..a780e5a 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "scripts": { "dev": "next dev", "build": "next build", - "start": "next start", + "start": "next start -H 0.0.0.0", "lint": "next lint" }, "dependencies": {