1 Commits

Author SHA1 Message Date
1f593e6431 Update Node.js to v24.12.0
All checks were successful
test-build / build (pull_request) Successful in 43s
2025-12-24 00:02:36 +00:00
27 changed files with 6207 additions and 3216 deletions

View File

@@ -1,340 +0,0 @@
name: release-image
on:
push:
branches:
- release
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-js
steps:
- name: Checkout
uses: actions/checkout@v6
with:
ref: release
- name: Set up Node
uses: actions/setup-node@v6
with:
node-version: 24.14.0
- name: Set up Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: 1.3.10
- name: Install Dependencies
run: bun install --frozen-lockfile
- name: Cache Astro Build Cache
uses: actions/cache@v5
with:
path: |
.astro
node_modules/.vite
key: ${{ runner.os }}-astro-${{ hashFiles('**/*.astro', 'astro.config.mjs') }}
restore-keys: |
${{ runner.os }}-astro-
# - name: Lint Code
# run: bun run lint
- name: Build Project
run: bun run build
- name: ntfy Failed
uses: niniyas/ntfy-action@master
if: failure()
with:
url: '${{ secrets.NTFY_URL }}'
topic: '${{ secrets.NTFY_TOPIC }}'
title: 'Test Failure - Site Documentation'
priority: 4
headers: '{"Authorization": "Bearer ${{ secrets.NTFY_CRED }}"}'
tags: action,failed
details: 'During release tests failed for building Site Documentation'
icon: 'https://cdn.jsdelivr.net/gh/selfhst/icons/png/gitea.png'
actions: '[{"action": "view", "label": "Open Gitea", "url": "https://gitea.alexlebens.dev/alexlebens/site-documentation/actions?workflow=release-image.yaml", "clear": true}]'
image: true
guarddog:
runs-on: ubuntu-js
steps:
- name: Checkout
uses: actions/checkout@v6
with:
ref: release
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: '3.12'
- name: Install GuardDog
run: |
python3 -m pip install --upgrade pip
python3 -m pip install guarddog
- name: Run GuardDog
run: |
guarddog npm scan ./
- name: ntfy Failed
uses: niniyas/ntfy-action@master
if: failure()
with:
url: '${{ secrets.NTFY_URL }}'
topic: '${{ secrets.NTFY_TOPIC }}'
title: 'Security Failure - Site Documentation'
priority: 4
headers: '{"Authorization": "Bearer ${{ secrets.NTFY_CRED }}"}'
tags: action,failed
details: 'During release guarddog scan failed for Site Documentation'
icon: 'https://cdn.jsdelivr.net/gh/selfhst/icons/png/gitea.png'
actions: '[{"action": "view", "label": "Open Gitea", "url": "https://gitea.alexlebens.dev/alexlebens/site-documentation/actions?workflow=release-image.yaml", "clear": true}]'
image: true
semantic-release:
needs: [ build, guarddog ]
runs-on: ubuntu-js
outputs:
new-release-published: ${{ steps.semantic.outputs.new-release-published }}
new-release-version: ${{ steps.semantic.outputs.new-release-version }}
new-release-git-tag: ${{ steps.semantic.outputs.new-release-git-tag }}
steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 0
token: ${{ secrets.BOT_TOKEN }}
- name: Set up Node
uses: actions/setup-node@v6
with:
node-version: 24.14.0
- name: Set up Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: 1.3.10
- name: Install Dependencies
run: bun install --frozen-lockfile
- name: Run Semantic Release
id: semantic
env:
GITEA_TOKEN: ${{ secrets.BOT_TOKEN }}
GITHUB_TOKEN: ${{ secrets.BOT_TOKEN }}
NODE_PATH: ${{ github.workspace }}/node_modules
run: |
bun run semantic-release
release-harbor:
runs-on: ubuntu-js
needs: semantic-release
if: ${{ needs.semantic-release.outputs.new-release-published == 'true' }}
steps:
- name: Checkout
uses: actions/checkout@v6
with:
ref: release
- name: Login to Harbor Registry
uses: docker/login-action@v4
with:
registry: ${{ vars.REGISTRY_HOST }}
username: ${{ vars.REGISTRY_USER }}
password: ${{ secrets.REGISTRY_SECRET }}
- name: Login to Docker
uses: docker/login-action@v4
with:
registry: ${{ vars.DH_REGISTRY }}
username: ${{ secrets.DH_USERNAME }}
password: ${{ secrets.DH_TOKEN }}
- name: Create Kubeconfig
run: |
mkdir $HOME/.kube
echo "${{ secrets.KUBECONFIG_BUILDX }}" > $HOME/.kube/config
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v4
with:
driver: kubernetes
driver-opts: |
namespace=gitea
qemu.install=true
buildkitd-config-inline: |
[registry."docker.io"]
mirrors = ["harbor.alexlebens.net/proxy-hub.docker/"]
- name: Available Platforms
run: echo ${{ steps.buildx.outputs.platforms }}
- name: Extract Metadata
id: meta
uses: docker/metadata-action@v6
with:
images: |
${{ vars.REGISTRY_HOST }}/images/site-documentation
tags: |
type=ref,event=branch
type=sha,format=long
type=raw,value=latest,enable=${{ needs.semantic-release.outputs.new-release-published == 'true' }}
type=semver,pattern={{version}},value=${{ needs.semantic-release.outputs.new-release-version }}
type=semver,pattern={{major}}.{{minor}},value=${{ needs.semantic-release.outputs.new-release-version }}
type=semver,pattern={{major}},value=${{ needs.semantic-release.outputs.new-release-version }}
- name: Build and Push Image
uses: docker/build-push-action@v7
with:
context: .
push: true
platforms: linux/amd64
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
build-args: |
APP_VERSION=${{ needs.semantic-release.outputs.new-release-version }}
COMMIT_SHA=${{ github.sha }}
IS_RELEASE=true
file: ./Dockerfile
cache-from: type=gha
cache-to: type=gha,mode=max
- name: ntfy Success
uses: niniyas/ntfy-action@master
if: success()
with:
url: '${{ secrets.NTFY_URL }}'
topic: '${{ secrets.NTFY_TOPIC }}'
title: 'Release Success - Site Documentation'
priority: 3
headers: '{"Authorization": "Bearer ${{ secrets.NTFY_CRED }}"}'
tags: action,successfully,completed
details: 'Harbor Image for Site Documentation has been released!'
icon: 'https://cdn.jsdelivr.net/gh/selfhst/icons/png/gitea.png'
- name: ntfy Failed
uses: niniyas/ntfy-action@master
if: failure()
with:
url: '${{ secrets.NTFY_URL }}'
topic: '${{ secrets.NTFY_TOPIC }}'
title: 'Release Failure - Site Documentation'
priority: 4
headers: '{"Authorization": "Bearer ${{ secrets.NTFY_CRED }}"}'
tags: action,failed
details: 'Harbor Image for Site Documentation has failed to be released.'
icon: 'https://cdn.jsdelivr.net/gh/selfhst/icons/png/gitea.png'
actions: '[{"action": "view", "label": "Open Gitea", "url": "https://gitea.alexlebens.dev/alexlebens/site-documentation/actions?workflow=release-image.yml", "clear": true}]'
image: true
release-gitea:
runs-on: ubuntu-js
needs: [ semantic-release, release-harbor ]
if: |
always() &&
needs.semantic-release.outputs.new-release-published == 'true'
steps:
- name: Checkout
uses: actions/checkout@v6
with:
ref: release
- name: Login to Gitea Registry
uses: docker/login-action@v4
with:
registry: ${{ vars.REPOSITORY_HOST }}
username: ${{ gitea.actor }}
password: ${{ secrets.REPOSITORY_TOKEN }}
- name: Login to Docker
uses: docker/login-action@v4
with:
registry: ${{ vars.DH_REGISTRY }}
username: ${{ secrets.DH_USERNAME }}
password: ${{ secrets.DH_TOKEN }}
- name: Create Kubeconfig
run: |
mkdir $HOME/.kube
echo "${{ secrets.KUBECONFIG_BUILDX }}" > $HOME/.kube/config
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v4
with:
driver: kubernetes
driver-opts: |
namespace=gitea
qemu.install=true
buildkitd-config-inline: |
[registry."docker.io"]
mirrors = ["harbor.alexlebens.net/proxy-hub.docker/"]
- name: Available Platforms
run: echo ${{ steps.buildx.outputs.platforms }}
- name: Extract Metadata
id: meta
uses: docker/metadata-action@v6
with:
images: |
${{ vars.REPOSITORY_HOST }}/${{ gitea.repository }}
tags: |
type=ref,event=branch
type=sha,format=long
type=raw,value=latest,enable=${{ needs.semantic-release.outputs.new-release-published == 'true' }}
type=semver,pattern={{version}},value=${{ needs.semantic-release.outputs.new-release-version }}
type=semver,pattern={{major}}.{{minor}},value=${{ needs.semantic-release.outputs.new-release-version }}
type=semver,pattern={{major}},value=${{ needs.semantic-release.outputs.new-release-version }}
- name: Build and Push Image
uses: docker/build-push-action@v7
with:
context: .
push: true
platforms: linux/amd64
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
build-args: |
APP_VERSION=${{ needs.semantic-release.outputs.new-release-version }}
COMMIT_SHA=${{ github.sha }}
IS_RELEASE=true
file: ./Dockerfile
cache-from: type=gha
cache-to: type=gha,mode=max
- name: ntfy Success
uses: niniyas/ntfy-action@master
if: success()
with:
url: '${{ secrets.NTFY_URL }}'
topic: '${{ secrets.NTFY_TOPIC }}'
title: 'Release Success - Site Documentation'
priority: 3
headers: '{"Authorization": "Bearer ${{ secrets.NTFY_CRED }}"}'
tags: action,successfully,completed
details: 'Gitea Image for Site Documentation has been released!'
icon: 'https://cdn.jsdelivr.net/gh/selfhst/icons/png/gitea.png'
- name: ntfy Failed
uses: niniyas/ntfy-action@master
if: failure()
with:
url: '${{ secrets.NTFY_URL }}'
topic: '${{ secrets.NTFY_TOPIC }}'
title: 'Release Failure - Site Documentation'
priority: 4
headers: '{"Authorization": "Bearer ${{ secrets.NTFY_CRED }}"}'
tags: action,failed
details: 'Gitea Image for Site Documentation has failed to be released.'
icon: 'https://cdn.jsdelivr.net/gh/selfhst/icons/png/gitea.png'
actions: '[{"action": "view", "label": "Open Gitea", "url": "https://gitea.alexlebens.dev/alexlebens/site-documentation/actions?workflow=release-image.yaml", "clear": true}]'
image: true

View File

@@ -0,0 +1,98 @@
name: release-image
on:
push:
tags:
- 0.*
workflow_dispatch:
jobs:
release:
runs-on: ubuntu-js
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Login to Registry
uses: docker/login-action@v3
with:
registry: ${{ vars.REPOSITORY_HOST }}
username: ${{ gitea.actor }}
password: ${{ secrets.REPOSITORY_TOKEN }}
- name: Login to Registry
uses: docker/login-action@v3
with:
registry: ${{ vars.REGISTRY_HOST }}
username: ${{ vars.REGISTRY_USER }}
password: ${{ secrets.REGISTRY_SECRET }}
- name: Create Kubeconfig
run: |
mkdir $HOME/.kube
echo "${{ secrets.KUBECONFIG_BUILDX }}" > $HOME/.kube/config
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v3
with:
driver: kubernetes
driver-opts: |
namespace=gitea
qemu.install=true
buildkitd-config-inline: |
[registry."docker.io"]
mirrors = ["harbor.alexlebens.net/proxy-hub.docker/"]
- name: Available Platforms
run: echo ${{ steps.buildx.outputs.platforms }}
- name: Extract Metadata
id: meta
uses: docker/metadata-action@v5
with:
tags: |
type=ref,event=branch
type=ref,event=tag
images: |
${{ vars.REPOSITORY_HOST }}/${{ gitea.repository }}
${{ vars.REGISTRY_HOST }}/images/site-documentation
- name: Build and Push Image
uses: docker/build-push-action@v6
with:
context: .
push: true
platforms: linux/amd64
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
file: ./Dockerfile
- name: ntfy Success
uses: niniyas/ntfy-action@master
if: success()
with:
url: '${{ secrets.NTFY_URL }}'
topic: '${{ secrets.NTFY_TOPIC }}'
title: 'Release Success - Site Documentation'
priority: 3
headers: '{"Authorization": "Bearer ${{ secrets.NTFY_CRED }}"}'
tags: action,successfully,completed
details: 'Image for Site Documentation has been released!'
icon: 'https://cdn.jsdelivr.net/gh/selfhst/icons/png/gitea.png'
- name: ntfy Failed
uses: niniyas/ntfy-action@master
if: failure()
with:
url: '${{ secrets.NTFY_URL }}'
topic: '${{ secrets.NTFY_TOPIC }}'
title: 'Release Failure - Site Documentation'
priority: 4
headers: '{"Authorization": "Bearer ${{ secrets.NTFY_CRED }}"}'
tags: action,failed
details: 'Image for Site Documentation has failed to be released.'
icon: 'https://cdn.jsdelivr.net/gh/selfhst/icons/png/gitea.png'
actions: '[{"action": "view", "label": "Open Gitea", "url": "https://gitea.alexlebens.dev/alexlebens/site-documentation/actions?workflow=release-image.yml", "clear": true}]'
image: true

View File

@@ -13,7 +13,7 @@ on:
jobs: jobs:
renovate: renovate:
runs-on: ubuntu-latest runs-on: ubuntu-latest
container: ghcr.io/renovatebot/renovate:43 container: ghcr.io/renovatebot/renovate:42
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v6 uses: actions/checkout@v6
@@ -25,10 +25,8 @@ jobs:
RENOVATE_ENDPOINT: ${{ vars.INSTANCE_URL }} RENOVATE_ENDPOINT: ${{ vars.INSTANCE_URL }}
RENOVATE_REPOSITORIES: alexlebens/site-documentation RENOVATE_REPOSITORIES: alexlebens/site-documentation
RENOVATE_GIT_AUTHOR: Renovate Bot <renovate-bot@alexlebens.net> RENOVATE_GIT_AUTHOR: Renovate Bot <renovate-bot@alexlebens.net>
RENOVATE_REDIS_URL: ${{ vars.RENOVATE_REDIS_URL }}
LOG_LEVEL: info LOG_LEVEL: info
RENOVATE_TOKEN: ${{ secrets.RENOVATE_TOKEN }} RENOVATE_TOKEN: ${{ secrets.RENOVATE_TOKEN }}
RENOVATE_GIT_PRIVATE_KEY: ${{ secrets.RENOVATE_GIT_PRIVATE_KEY }} RENOVATE_GIT_PRIVATE_KEY: ${{ secrets.RENOVATE_GIT_PRIVATE_KEY }}
RENOVATE_GITHUB_COM_TOKEN: ${{ secrets.RENOVATE_GITHUB_COM_TOKEN }} RENOVATE_GITHUB_COM_TOKEN: ${{ secrets.RENOVATE_GITHUB_COM_TOKEN }}
RENOVATE_REGISTRY_ALIASES: '{"dhi.io": "dhi.io"}' RENOVATE_REDIS_URL: ${{ vars.RENOVATE_REDIS_URL }}
RENOVATE_HOST_RULES: '[{"matchHost":"dhi.io","hostType":"docker","username":"${{ secrets.RENOVATE_DHI_USER }}","password":"${{ secrets.RENOVATE_DHI_TOKEN }}"}]'

View File

@@ -4,9 +4,6 @@ on:
push: push:
branches: branches:
- main - main
paths-ignore:
- '.gitea/workflows/**'
- '**.md'
pull_request: pull_request:
branches: branches:
@@ -19,34 +16,25 @@ jobs:
- name: Checkout - name: Checkout
uses: actions/checkout@v6 uses: actions/checkout@v6
- name: Set up Node - name: Set up pnpm
uses: pnpm/action-setup@v4
with:
version: 10.x
- name: Set up Node.js
uses: actions/setup-node@v6 uses: actions/setup-node@v6
with: with:
node-version: 24.14.0 node-version: 24.11.1
cache: pnpm
- name: Set up Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: 1.3.10
- name: Install Dependencies - name: Install Dependencies
run: bun install --frozen-lockfile run: pnpm install
- name: Cache Astro Build Cache
uses: actions/cache@v5
with:
path: |
.astro
node_modules/.vite
key: ${{ runner.os }}-astro-${{ hashFiles('**/*.astro', 'astro.config.mjs') }}
restore-keys: |
${{ runner.os }}-astro-
# - name: Lint Code # - name: Lint Code
# run: bun run lint # run: pnpm lint
- name: Build Project - name: Build Project
run: bun run build run: pnpm build
- name: ntfy Failed - name: ntfy Failed
uses: niniyas/ntfy-action@master uses: niniyas/ntfy-action@master
@@ -62,38 +50,3 @@ jobs:
icon: 'https://cdn.jsdelivr.net/gh/selfhst/icons/png/gitea.png' icon: 'https://cdn.jsdelivr.net/gh/selfhst/icons/png/gitea.png'
actions: '[{"action": "view", "label": "Open Gitea", "url": "https://gitea.alexlebens.dev/alexlebens/site-documentation/actions?workflow=test-build.yaml", "clear": true}]' actions: '[{"action": "view", "label": "Open Gitea", "url": "https://gitea.alexlebens.dev/alexlebens/site-documentation/actions?workflow=test-build.yaml", "clear": true}]'
image: true image: true
guarddog:
runs-on: ubuntu-js
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: '3.12'
- name: Install GuardDog
run: |
python3 -m pip install --upgrade pip
python3 -m pip install guarddog
- name: Run GuardDog
run: |
guarddog npm scan ./
- name: ntfy Failed
uses: niniyas/ntfy-action@master
if: failure()
with:
url: '${{ secrets.NTFY_URL }}'
topic: '${{ secrets.NTFY_TOPIC }}'
title: 'Security Failure - Site Documentation'
priority: 4
headers: '{"Authorization": "Bearer ${{ secrets.NTFY_CRED }}"}'
tags: action,failed
details: 'Guarddog scan failed for Site Documentation'
icon: 'https://cdn.jsdelivr.net/gh/selfhst/icons/png/gitea.png'
actions: '[{"action": "view", "label": "Open Gitea", "url": "https://gitea.alexlebens.dev/alexlebens/site-documentation/actions?workflow=test-build.yaml", "clear": true}]'
image: true

2
.npmrc Normal file
View File

@@ -0,0 +1,2 @@
engine-strict=true
save-exact=true

View File

@@ -1,18 +0,0 @@
{
"branches": ["release"],
"tagFormat": "${version}",
"plugins": [
"@semantic-release/commit-analyzer",
"@semantic-release/release-notes-generator",
"@semantic-release/changelog",
"semantic-release-export-data",
["@semantic-release/npm", { "npmPublish": false }],
["@semantic-release/git", {
"assets": ["package.json", "CHANGELOG.md"],
"message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
}],
["@saithodev/semantic-release-gitea", {
"giteaUrl": "https://gitea.alexlebens.dev"
}]
]
}

View File

@@ -1,9 +0,0 @@
# [0.2.0](http://gitea-http.gitea:3000/alexlebens/site-documentation/compare/0.1.7...0.2.0) (2026-03-12)
### Features
* add robots ([4ef4353](http://gitea-http.gitea:3000/alexlebens/site-documentation/commit/4ef43534a0f26bc5593258c9cd6a31d62283929d))
* switch to bun ([7413830](http://gitea-http.gitea:3000/alexlebens/site-documentation/commit/74138302a4c2ad45a850459c47a17dd09014f3ad))
* trigger minor version update ([7a9b62d](http://gitea-http.gitea:3000/alexlebens/site-documentation/commit/7a9b62dc048ffd947bb6dd41523091bbc9346e84))
* use alpine-dev for bun builder ([4575bfb](http://gitea-http.gitea:3000/alexlebens/site-documentation/commit/4575bfb9138bc9ca5f9d93e845155fc56d3a8491))

View File

@@ -1,35 +1,35 @@
ARG REGISTRY=dhi.io ARG REGISTRY=docker.io
FROM ${REGISTRY}/bun:1.3.10-alpine3.22-dev AS builder FROM ${REGISTRY}/node:24.12.0-alpine3.22 AS base
LABEL version="0.0.5"
LABEL description="Astro based documentation website"
ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH"
RUN corepack enable
WORKDIR /app WORKDIR /app
COPY package.json bun.lock ./ COPY package.json pnpm-lock.yaml ./
FROM builder AS prod-deps FROM base AS prod-deps
RUN --mount=type=cache,id=bun,target=/root/.bun/install/cache \ RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --prod --frozen-lockfile
bun install --production --frozen-lockfile
FROM builder AS build-deps FROM prod-deps AS build-deps
RUN --mount=type=cache,id=bun,target=/root/.bun/install/cache \ RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile
bun install --frozen-lockfile
FROM build-deps AS build FROM build-deps AS build
COPY . . COPY . .
RUN bun run build RUN pnpm run build
RUN pnpm prune --prod
FROM ${REGISTRY}/bun:1.3.10-alpine3.22 AS runtime FROM base AS runtime
WORKDIR /app
COPY --from=prod-deps /app/node_modules /app/node_modules COPY --from=prod-deps /app/node_modules /app/node_modules
COPY --from=build /app/dist /app/dist COPY --from=build /app/dist /app/dist
ARG APP_VERSION=latest
ARG APP_VERSION
ENV HOST=0.0.0.0 ENV HOST=0.0.0.0
ENV SITE_URL=https://docs.alexlebens.dev
ENV PORT=4321 ENV PORT=4321
LABEL version=$APP_VERSION
LABEL description="Astro based documentation website"
EXPOSE $PORT EXPOSE $PORT
CMD ["bun", "run", "./dist/server/entry.mjs"] CMD ["node", "./dist/server/entry.mjs"]

View File

@@ -1,4 +1,4 @@
# Starlight # Starlight Starter Kit: Basics
[![Built with Starlight](https://astro.badg.es/v2/built-with-starlight/tiny.svg)](https://starlight.astro.build) [![Built with Starlight](https://astro.badg.es/v2/built-with-starlight/tiny.svg)](https://starlight.astro.build)
@@ -6,7 +6,9 @@
pnpm create astro@latest -- --template starlight pnpm create astro@latest -- --template starlight
``` ```
## Project Structure > 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun!
## 🚀 Project Structure
Inside of your Astro + Starlight project, you'll see the following folders and files: Inside of your Astro + Starlight project, you'll see the following folders and files:
@@ -29,12 +31,19 @@ Images can be added to `src/assets/` and embedded in Markdown with a relative li
Static assets, like favicons, can be placed in the `public/` directory. Static assets, like favicons, can be placed in the `public/` directory.
## Commands ## 🧞 Commands
All commands are run from the root of the project, from a terminal: All commands are run from the root of the project, from a terminal:
| Command | Action | | Command | Action |
| :--------------------- | :----------------------------------------------- | | :--------------------- | :----------------------------------------------- |
| `bun install` | Installs dependencies | | `pnpm install` | Installs dependencies |
| `bun run dev` | Starts local dev server at `localhost:4321` | | `pnpm dev` | Starts local dev server at `localhost:4321` |
| `bun run build` | Build your production site to `./dist/` | | `pnpm build` | Build your production site to `./dist/` |
| `pnpm preview` | Preview your build locally, before deploying |
| `pnpm astro ...` | Run CLI commands like `astro add`, `astro check` |
| `pnpm astro -- --help` | Get help using the Astro CLI |
## 👀 Want to learn more?
Check out [Starlights docs](https://starlight.astro.build/), read [the Astro documentation](https://docs.astro.build), or jump into the [Astro Discord server](https://astro.build/chat).

View File

@@ -2,11 +2,9 @@
import { defineConfig } from "astro/config"; import { defineConfig } from "astro/config";
import node from "@astrojs/node"; import node from "@astrojs/node";
import sitemap from '@astrojs/sitemap'; import tailwindcss from "@tailwindcss/vite";
import starlight from "@astrojs/starlight"; import starlight from "@astrojs/starlight";
import starlightThemeRapide from 'starlight-theme-rapide' import catppuccin from "@catppuccin/starlight";
import tailwindcss from '@tailwindcss/vite';
const getSiteURL = () => { const getSiteURL = () => {
if (process.env.SITE_URL) { if (process.env.SITE_URL) {
@@ -15,62 +13,52 @@ const getSiteURL = () => {
return "http://localhost:4321"; return "http://localhost:4321";
}; };
// https://astro.build/config
export default defineConfig({ export default defineConfig({
site: getSiteURL(), site: getSiteURL(),
security: { csp: true },
prefetch: true,
integrations: [ integrations: [
sitemap(), tailwindcss(),
starlight({ starlight({
title: "Alex Lebens Docs", title: "My Docs",
customCss: [
'./src/styles/custom.css',
],
social: [ social: [
{ {
icon: "external", icon: "github",
label: "Homepage", label: "GitHub",
href: "https://www.alexlebens.dev", href: "https://github.com/withastro/starlight",
}, },
], ],
plugins: [ plugins: [
starlightThemeRapide() catppuccin({
dark: { flavor: "macchiato", accent: "sapphire" },
light: { flavor: "latte", accent: "sky" }
})
], ],
sidebar: [ sidebar: [
{
label: "Guides",
items: [
// Each item here is one entry in the navigation menu.
{ label: "Example Guide", slug: "guides/example" },
],
},
{ {
label: "Reference", label: "Reference",
autogenerate: { directory: "reference" }, autogenerate: { directory: "reference" },
}, },
{
label: "Guides",
autogenerate: { directory: "guides" },
},
{
label: "Applications",
autogenerate: { directory: "applications" },
},
], ],
}), }),
], ],
markdown: {
syntaxHighlight: false,
},
plugins: { plugins: {
'@tailwindcss/postcss': {}, "@tailwindcss/postcss": {},
}, },
vite: { vite: {
plugins: [tailwindcss()], plugins: [tailwindcss()],
}, },
output: 'static',
adapter: node({ adapter: node({
mode: 'standalone', mode: "standalone",
}), }),
}); });

2470
bun.lock

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
{ {
"name": "site-documentation", "name": "site-documentation",
"type": "module", "type": "module",
"version": "0.2.0", "version": "0.0.5",
"scripts": { "scripts": {
"dev": "astro dev", "dev": "astro dev",
"build": "astro build", "build": "astro build",
@@ -12,37 +12,27 @@
"astro": "astro" "astro": "astro"
}, },
"dependencies": { "dependencies": {
"@astrojs/mdx": "^5.0.0", "@astrojs/mdx": "4.3.13",
"@astrojs/node": "^10.0.1", "@astrojs/node": "9.5.1",
"@astrojs/sitemap": "^3.7.1", "@astrojs/starlight": "^0.37.1",
"@astrojs/starlight": "^0.38.1", "@catppuccin/starlight": "1.0.2",
"@tailwindcss/postcss": "^4.2.1", "@tailwindcss/postcss": "^4.1.17",
"@tailwindcss/vite": "^4.2.1", "@tailwindcss/vite": "^4.1.17",
"astro": "^6.0.4", "astro": "5.16.6",
"sanitize-html": "^2.17.1", "motion": "^12.23.26",
"sanitize-html": "^2.17.0",
"sharp": "^0.34.5", "sharp": "^0.34.5",
"starlight-theme-rapide": "^0.5.2", "tailwindcss": "^4.1.17"
"tailwindcss": "^4.2.1"
}, },
"devDependencies": { "devDependencies": {
"@eslint-react/eslint-plugin": "^2.13.0",
"@saithodev/semantic-release-gitea": "^2.1.0",
"@semantic-release/changelog": "^6.0.3",
"@semantic-release/commit-analyzer": "^13.0.1",
"@semantic-release/git": "^10.0.1",
"@semantic-release/release-notes-generator": "^14.1.0",
"@tailwindcss/forms": "^0.5.11",
"@tailwindcss/typography": "^0.5.19", "@tailwindcss/typography": "^0.5.19",
"@typescript-eslint/parser": "^8.57.0", "@typescript-eslint/parser": "8.50.1",
"eslint": "^10.0.3", "eslint": "9.39.2",
"eslint-config-prettier": "^10.1.8", "eslint-config-prettier": "10.1.8",
"eslint-plugin-astro": "^1.6.0", "eslint-plugin-astro": "1.5.0",
"prettier": "^3.8.1", "prettier": "^3.7.4",
"prettier-plugin-astro": "^0.14.1", "prettier-plugin-astro": "^0.14.1",
"prettier-plugin-tailwindcss": "^0.7.2", "prettier-plugin-tailwindcss": "^0.7.2",
"semantic-release": "^25.0.3", "typescript-eslint": "8.50.1"
"semantic-release-export-data": "^1.2.0",
"typescript": "^5.9.3",
"typescript-eslint": "^8.57.0"
} }
} }

5972
pnpm-lock.yaml generated Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 9.9 KiB

After

Width:  |  Height:  |  Size: 696 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 MiB

BIN
src/assets/houston.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

View File

@@ -0,0 +1,11 @@
---
title: Example Guide
description: A guide in my new Starlight docs site.
---
Guides lead a user through a specific task they want to accomplish, often with a sequence of steps.
Writing a good guide requires thinking about what your users are trying to do.
## Further reading
- Read [about how-to guides](https://diataxis.fr/how-to-guides/) in the Diátaxis framework

View File

@@ -1,75 +0,0 @@
---
title: Talos Upgrade 1.12.0
description: Steps followed for the v1.12.0 upgrade process
---
The upgrade to this version was more extension as there have been migrations to using configuration documents. This required rewriting the configuration document to a series of patches and provide a deterministic generation command for the different host types. In addition there was also a change to storage layout to separate ceph, local-path, and ephemeral storage on the NUC hosts.
## Preparation
The NUC hosts are to be wiped since because of the storage reconfiguration. For the RPIs only the first command with proper image was needed. The new configuration format could be applied later. Both the node and the disks have to be removed.
The following command is used to upgrade the image. This was first to ensure the boot after wipe would still be v1.12.0 to use the updated configuration documents.
```bash
talosctl upgrade --nodes 10.232.1.23 --image factory.talos.dev/metal-installer/495176274ce8f9e87ed052dbc285c67b2a0ed7c5a6212f5c4d086e1a9a1cf614:v1.12.0
```
Wipe command.
```bash
talosctl reset --system-labels-to-wipe EPHEMERAL,STATE --reboot -n 10.232.1.23
```
## Remove old references
Remove the node from the cluster.
```bash
kubectl delete node talos-9vs-6hh
```
Exec into the rook-ceph-tools container in order to remove the disk from the cluster.
```bash
kubectl -n rook-ceph exec -it $(kubectl -n rook-ceph get pod -l "app=rook-ceph-tools" -o jsonpath='{.items\[\*].metadata.name}') -- bash
```
Inside the rook-ceph-tools container remove the OSD/disk and the node:
```bash
ceph osd tree
```
```bash
ceph osd out 0
```
```bash
ceph osd purge 0 --yes-i-really-mean-it
```
```bash
ceph osd crush remove talos-9vs-6hh
```
# Apply new configuration
The wiped node should now be in maintenance mode and ready to be configured. Use the generate command in the README of the talos-config repo to make the configuration to be supplied.
```bash
talosctl apply-config -f generated/worker-nuc.yaml -n 10.232.1.23 --insecure
```
Add the required labels if Talos does not add them:
```yaml
node-role.kubernetes.io/bgp: '65020'
node-role.kubernetes.io/local-storage-node: local-storage-node
node-role.kubernetes.io/rook-osd-node: rook-osd-node
```
## Verification
Verify the disks have been created:
```bash
talosctl get disks -n 10.232.1.23
```
Verify the mount paths and volumes are created:
```bash
talosctl -n 10.232.1.23 ls /var/mnt
```
```bash
talosctl -n 10.232.1.23 get volumestatuses
```

View File

@@ -1,68 +0,0 @@
---
title: Talos Upgrade Generic
description: Steps followed for the standard upgrade process
---
This is the standard upgrade process for Talos. Relatively simple, just verify, run commands, and verify.
## Health Check
### Etcd
Check status of etcd, ensure there is a leader and there are no errors.
```bash
talosctl -n 10.232.1.11,10.232.1.12,10.232.1.13 etcd status
```
### Ceph
Check if ceph is healthy:
Either browse to the [webpage](https://ceph.alexlebens.net/#/dashboard), or run the following commands on the tools container
```bash
kubectl -n rook-ceph exec -it $(kubectl -n rook-ceph get pod -l "app=rook-ceph-tools" -o jsonpath='{.items\[\*].metadata.name}') -- bash
```
Inside the rook-ceph-tools container check the status:
```bash
ceph status
```
### Cloudnative-PG
Check the status of the Cloudnative-PG clusters to ensure they are all healthy. There is potential data loss if a worker node has a failure or the local volume isn't reattached.
[Dashboard](https://grafana.alexlebens.net/d/cloudnative-pg/cloudnativepg)
### Garage
Check the status of the Garage cluster to ensure there is no data loss of the local S3 store. This will result in data loss of short term WALs if this cluster fails
[Dashboard](https://garage-webui.alexlebens.net/)
## Upgrade
Reference the [config repo](https://gitea.alexlebens.dev/alexlebens/talos-config/src/branch/main) for the exact commands, links to the factory page, and update the image versions. Each type has its own image string.
As an example to upgrade a NUC node:
```bash
talosctl upgrade --nodes 10.232.1.23 --image factory.talos.dev/metal-installer/495176274ce8f9e87ed052dbc285c67b2a0ed7c5a6212f5c4d086e1a9a1cf614:v1.12.0
```
# Apply new configuration
Use the generate command in the README of the talos-config repo to make the configuration to be supplied.
As an example to apply that generated config to a NUC node:
```bash
talosctl apply-config -f generated/worker-nuc.yaml -n 10.232.1.23
```
## Verification
Verify all is health on the dashboard:
```bash
talosctl -n 10.232.1.23 dashboard
```

View File

@@ -1,30 +1,36 @@
--- ---
title: Documentation for my Homelab title: Welcome to Starlight
description: Guides and reference for my homelab infrastructure. description: Get started building your docs site with Starlight.
template: splash template: splash
hero: hero:
tagline: Guides and reference for my homelab infrastructure. tagline: Congrats on setting up a new Starlight project!
image: image:
file: ../../assets/autumn_mountain.png file: ../../assets/houston.webp
actions: actions:
- text: Introduction - text: Example Guide
link: /reference/introduction/ link: /guides/example/
icon: right-arrow icon: right-arrow
- text: Read the Starlight docs
link: https://starlight.astro.build
icon: external
variant: minimal
--- ---
import { Card, CardGrid, LinkCard } from '@astrojs/starlight/components'; import { Card, CardGrid } from '@astrojs/starlight/components';
## Hightlights ## Next steps
<CardGrid stagger> <CardGrid stagger>
<LinkCard <Card title="Update content" icon="pencil">
title="Homepage" Edit `src/content/docs/index.mdx` to see this page change.
description="Visit my homepage to see what I'm up to and learn more about me." </Card>
href="https://www.alexlebens.dev" <Card title="Add new content" icon="add-document">
></LinkCard> Add Markdown or MDX files to `src/content/docs` to create new pages.
<LinkCard </Card>
title="Read the Starlight docs" <Card title="Configure your site" icon="setting">
description="This site is built with Starlight, the Astro documentation theme. Check out the docs to learn more." Edit your `sidebar` and other config in `astro.config.mjs`.
href="https://starlight.astro.build/" </Card>
></LinkCard> <Card title="Read the docs" icon="open-book">
Learn more in [the Starlight Docs](https://starlight.astro.build/).
</Card>
</CardGrid> </CardGrid>

View File

@@ -0,0 +1,11 @@
---
title: Example Reference
description: A reference page in my new Starlight docs site.
---
Reference pages are ideal for outlining how things work in terse and clear terms.
Less concerned with telling a story or addressing a specific use case, they should give a comprehensive outline of what you're documenting.
## Further reading
- Read [about reference](https://diataxis.fr/reference/) in the Diátaxis framework

View File

@@ -1,16 +0,0 @@
---
title: Introduction
description: Overiew of the homelab
sidebar:
order: 1
---
Overview of the homelab.
# Hardware
Currently using a mix of RPIs, Intel based NUCs, Synology NAS, and Ubiquity networking.
# Software
Kubernetes for the main cluster. Docker managed by Komodo for the single hosts.

View File

@@ -1,14 +0,0 @@
// https://docs.astro.build/en/guides/integrations-guide/sitemap/#usage
import type { APIRoute } from 'astro';
const getRobotsTxt = (sitemapURL: URL) => `\
User-agent: *
Allow: /
Sitemap: ${sitemapURL.href}
`;
export const GET: APIRoute = ({ site }) => {
const sitemapURL = new URL('sitemap-index.xml', site);
return new Response(getRobotsTxt(sitemapURL));
};

View File

@@ -1,34 +0,0 @@
@import 'tailwindcss';
@plugin '@tailwindcss/typography';
/* Custom colors */
@theme {
--color-midnight: #0c354d;
--color-turquoise: #0da797;
--color-steel: #4682b4;
--color-bermuda: #7fbab4;
--color-desert: #f9deb2;
--color-bronze: #9e7f5e;
--color-gitea-primary: #609926;
--color-gitea-secondary: #4c7a33;
}
@layer starlight, rapide, overrides;
@layer overrides {
:root {
--sl-color-accent-high: var(--color-steel);
--sl-color-accent-high: var(--color-steel);
--sl-color-accent-low: var(--color-bermuda);
}
:root[data-theme='light'] {
--sl-color-accent: var(--color-steel);
--sl-color-accent-high: var(--color-steel);
--sl-color-accent-low: var(--color-turquoise);
}
.site-title:where(.astro-gmuhlsjs) {
color: var(--color-turquoise);
}
}

View File

@@ -1,9 +1,7 @@
/** @type {import('tailwindcss').Config} */ /** @type {import('tailwindcss').Config} */
module.exports = { module.exports = {
content: ['./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}', '*.{js,ts,jsx,tsx,mdx}'], content: ['./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}', '*.{js,ts,jsx,tsx,mdx}'],
darkMode: ['class', '[data-theme="dark"]'], darkMode: 'class',
theme: { theme: {},
extend: {},
},
plugins: [require('@tailwindcss/typography')], plugins: [require('@tailwindcss/typography')],
}; };