diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..e6a8e6f --- /dev/null +++ b/.env.example @@ -0,0 +1,4 @@ +COMPOSE_PROJECT=openocd-python-docs +MODE=prod +DOMAIN=openocd-python.warehack.ing +VITE_HMR_HOST= diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..b3e6f1e --- /dev/null +++ b/Dockerfile @@ -0,0 +1,32 @@ +# --- Stage: deps --- +FROM node:22-alpine AS deps +WORKDIR /app +COPY package.json package-lock.json ./ +RUN npm ci + +# --- Stage: build --- +FROM deps AS build +COPY . . +RUN npm run build + +# --- Stage: dev --- +FROM node:22-alpine AS dev +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY . . +EXPOSE 4321 +CMD ["npm", "run", "dev", "--", "--host", "0.0.0.0"] + +# --- Stage: prod --- +FROM caddy:2-alpine AS prod +COPY --from=build /app/dist /srv +COPY <<'CADDYFILE' /etc/caddy/Caddyfile +:80 { + root * /srv + file_server + encode gzip + try_files {path} {path}/index.html =404 + header Cache-Control "public, max-age=3600" +} +CADDYFILE +EXPOSE 80 diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..995d2bc --- /dev/null +++ b/Makefile @@ -0,0 +1,24 @@ +.PHONY: dev prod build logs down clean restart shell + +dev: + docker compose --profile dev up -d --build && docker compose --profile dev logs -f + +prod: + docker compose --profile prod up -d --build && sleep 3 && docker compose --profile prod logs --tail 50 + +build: + docker compose --profile prod build --no-cache + +logs: + docker compose logs -f + +down: + docker compose --profile dev --profile prod down + +clean: + docker compose --profile dev --profile prod down -v --rmi local + +restart: down prod + +shell: + docker compose exec docs-prod sh diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..d8d2bd0 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,42 @@ +services: + docs-dev: + build: + context: . + target: dev + profiles: + - dev + volumes: + - ./src:/app/src + - ./public:/app/public + - ./astro.config.mjs:/app/astro.config.mjs + env_file: .env + labels: + caddy: ${DOMAIN} + caddy.reverse_proxy: "{{upstreams 4321}}" + caddy.reverse_proxy.flush_interval: "-1" + caddy.reverse_proxy.transport: "http" + caddy.reverse_proxy.transport.read_timeout: "0" + caddy.reverse_proxy.transport.write_timeout: "0" + caddy.reverse_proxy.transport.keepalive: "5m" + caddy.reverse_proxy.transport.keepalive_idle_conns: "10" + caddy.reverse_proxy.stream_timeout: "24h" + caddy.reverse_proxy.stream_close_delay: "5s" + networks: + - caddy + + docs-prod: + build: + context: . + target: prod + profiles: + - prod + restart: unless-stopped + labels: + caddy: ${DOMAIN} + caddy.reverse_proxy: "{{upstreams 80}}" + networks: + - caddy + +networks: + caddy: + external: true