From 8eb41f8fa48552107c1516b25377719905648831 Mon Sep 17 00:00:00 2001 From: Troy Date: Thu, 10 Apr 2025 10:48:00 +0100 Subject: [PATCH] fix: remove duplicate dates on articles --- package-lock.json | 14 +- package.json | 2 +- src/components/Article.astro | 7 +- src/content/posts/website/index.mdx | 212 ++++++++++++++++++ src/content/posts/website/showcase.avif | Bin 0 -> 31737 bytes .../projects/3d-package-design/index.mdx | 1 - .../projects/a-long-way-down/index.mdx | 1 - src/content/projects/astronaut/index.mdx | 1 - .../digital-artifact-corridor/index.mdx | 1 - src/content/projects/discord-bot/index.mdx | 1 - src/content/projects/firespline/index.mdx | 1 - .../projects/kraken-in-the-cupboard/index.mdx | 1 - src/content/projects/logofolio/index.mdx | 1 - .../projects/megascans-artworks/index.mdx | 1 - src/content/projects/mortis/index.mdx | 1 - src/content/projects/nightmare/index.mdx | 1 - src/content/projects/packard/index.mdx | 1 - src/content/projects/pasikdhar/index.mdx | 1 - .../projects/sixth-form-artworks/index.mdx | 1 - .../projects/studying-spider/index.mdx | 1 - .../terrys-mango-juice-n-stuff/index.mdx | 1 - src/content/projects/the-batman/index.mdx | 1 - src/content/projects/tomb/index.mdx | 1 - .../untitledarmy-inspired-character/index.mdx | 1 - src/content/projects/webboss/index.mdx | 1 - src/icons/cat.svg | 6 + src/layouts/Cv.astro | 6 +- src/pages/404.astro | 1 - 28 files changed, 230 insertions(+), 38 deletions(-) create mode 100644 src/content/posts/website/index.mdx create mode 100644 src/content/posts/website/showcase.avif create mode 100644 src/icons/cat.svg diff --git a/package-lock.json b/package-lock.json index c787ce8..5fe8a2d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,7 @@ "@iconify-json/mdi": "^1.2.3", "@tailwindcss/typography": "^0.5.16", "@types/node": "^22.14.0", - "npm-check-updates": "^17.1.16", + "npm-check-updates": "^17.1.18", "prettier": "^3.5.3", "prettier-plugin-astro": "^0.14.1", "prettier-plugin-tailwindcss": "^0.6.11" @@ -5930,9 +5930,9 @@ } }, "node_modules/npm-check-updates": { - "version": "17.1.16", - "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-17.1.16.tgz", - "integrity": "sha512-9nohkfjLRzLfsLVGbO34eXBejvrOOTuw5tvNammH73KEFG5XlFoi3G2TgjTExHtnrKWCbZ+mTT+dbNeSjASIPw==", + "version": "17.1.18", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-17.1.18.tgz", + "integrity": "sha512-bkUy2g4v1i+3FeUf5fXMLbxmV95eG4/sS7lYE32GrUeVgQRfQEk39gpskksFunyaxQgTIdrvYbnuNbO/pSUSqw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -7654,9 +7654,9 @@ } }, "node_modules/vite": { - "version": "6.2.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.4.tgz", - "integrity": "sha512-veHMSew8CcRzhL5o8ONjy8gkfmFJAd5Ac16oxBUjlwgX3Gq2Wqr+qNC3TjPIpy7TPV/KporLga5GT9HqdrCizw==", + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.5.tgz", + "integrity": "sha512-j023J/hCAa4pRIUH6J9HemwYfjB5llR2Ps0CWeikOtdR8+pAURAk0DoJC5/mm9kd+UgdnIy7d6HE4EAvlYhPhA==", "license": "MIT", "dependencies": { "esbuild": "^0.25.0", diff --git a/package.json b/package.json index 3f9bbb6..87fff70 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "@iconify-json/mdi": "^1.2.3", "@tailwindcss/typography": "^0.5.16", "@types/node": "^22.14.0", - "npm-check-updates": "^17.1.16", + "npm-check-updates": "^17.1.18", "prettier": "^3.5.3", "prettier-plugin-astro": "^0.14.1", "prettier-plugin-tailwindcss": "^0.6.11" diff --git a/src/components/Article.astro b/src/components/Article.astro index e960167..63a0022 100644 --- a/src/components/Article.astro +++ b/src/components/Article.astro @@ -9,11 +9,6 @@ import RelatedArticles from "@components/RelatedArticles.astro"; const { article, isPost = false } = Astro.props; const { Content } = await article.render(); -let datesMatch = false; -if (article.data.date.getTime() == article.data.updated?.getTime()) { - datesMatch = true; -} - const listFormatter = new Intl.ListFormat("en-GB", { style: "long", type: "conjunction", @@ -41,7 +36,7 @@ const listFormatter = new Intl.ListFormat("en-GB", {
{ - datesMatch ? ( + !article.data.updated ? (

diff --git a/src/content/posts/website/index.mdx b/src/content/posts/website/index.mdx new file mode 100644 index 0000000..ef3753f --- /dev/null +++ b/src/content/posts/website/index.mdx @@ -0,0 +1,212 @@ +--- +title: "Website" +date: 2025-04-07 +description: "An overview of what I am using to host my digital content." +image: + url: "showcase.avif" + alt: "Website showcase" +categories: ["personal"] +tags: ["self-host", "forgejo", "docker", "vps"] +draft: true +--- + +This post will outline my workflow of using a self-hosted Forgejo instance and Actions runner to automatically deploy my personal site and any software releases, all without having to rely on another provider. + +![Website showcase](showcase.avif) + +## Steps + +### Private image access login? + +```sh +echo '' | docker login code.troylusty.com -u troy --password-stdin +``` + +```sh +echo $(htpasswd -nB user) | sed -e s/\\$/\\$\\$/g +``` + +### Aliases for updating VPS and pruning Docker + +```sh +echo 'alias dockerclean="docker system prune -a --volumes"' >> .bashrc +echo 'alias updateall="sudo apt update && sudo apt upgrade && sudo apt autoremove"' >> .bashrc +``` + +Thanks to [Tech Tales](https://tech-tales.blog/posts/2025/01-forgejo-runner-update) for the clean instructions on how to setup an Actions runner with Forgejo. + +```sh +docker compose run --rm forgejo-runner 'forgejo-runner' 'generate-config' > forgejo-runner/config.yml +``` + +Setup `container.docker_host: "unix:///var/run/docker.sock"` and `container.network: "forgejo"` and any labels such as `runner.labels: ["ubuntu-latest:docker://gitea/runner-images:ubuntu-latest"]` + +``` +docker compose run --rm -it forgejo-runner 'forgejo-runner' 'register' +``` + +Input `http://forgejo:3000` as the domain since forgejo is the container name in Docker and port 3000 is its relevant port. + +## Docker compose + +```yaml +services: + traefik: + image: traefik:latest + container_name: traefik + command: + - "--providers.docker" + - "--providers.docker.exposedbydefault=false" + - "--entryPoints.websecure.address=:443" + - "--certificatesresolvers.myresolver.acme.tlschallenge=true" + - "--certificatesresolvers.myresolver.acme.email=traefik@troylusty.com" + - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json" + - "--entrypoints.web.address=:80" + - "--entrypoints.web.http.redirections.entrypoint.to=websecure" + - "--entrypoints.web.http.redirections.entrypoint.scheme=https" + - "--ping=true" + labels: + - "traefik.enable=true" + - "com.centurylinklabs.watchtower.enable=true" + - "traefik.http.middlewares.securityHeaders.headers.stsSeconds=31536000" + - "traefik.http.middlewares.securityHeaders.headers.stsIncludeSubdomains=true" + - "traefik.http.middlewares.securityHeaders.headers.frameDeny=true" + - "traefik.http.middlewares.securityHeaders.headers.contentTypeNosniff=true" + - "traefik.http.middlewares.securityHeaders.headers.contentSecurityPolicy=default-src 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; base-uri 'none'; form-action 'self'; object-src 'none'; frame-ancestors 'none'; upgrade-insecure-requests" + - "traefik.http.middlewares.securityHeaders.headers.referrerPolicy=no-referrer" + - "traefik.http.middlewares.securityHeaders.headers.permissionsPolicy=accelerometer=(), autoplay=(), camera=(), cross-origin-isolated=(), display-capture=(), encrypted-media=(), fullscreen=(), geolocation=(), gyroscope=(), keyboard-map=(), magnetometer=(), microphone=(), midi=(), payment=(), picture-in-picture=(), publickey-credentials-get=(), screen-wake-lock=(), sync-xhr=(self), usb=(), web-share=(), xr-spatial-tracking=(), clipboard-read=(), clipboard-write=(), gamepad=(), hid=(), idle-detection=(), interest-cohort=(), serial=(), unload=()" + ports: + - "80:80" + - "443:443" + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - letsencrypt:/letsencrypt + restart: unless-stopped + networks: + - traefik + healthcheck: + test: ["CMD", "traefik", "healthcheck", "--ping"] + depends_on: + watchtower: + condition: service_healthy + + watchtower: + image: containrrr/watchtower:latest + command: --label-enable --interval 1800 --rolling-restart --cleanup --remove-volumes + container_name: watchtower + networks: + - traefik + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - /home/troy/.docker/config.json:/config.json + restart: unless-stopped + healthcheck: + test: ["CMD", "/watchtower", "--health-check"] + + personalsite: + image: code.troylusty.com/troy/troylusty.com:latest + container_name: personalsite + labels: + - "traefik.enable=true" + - "traefik.http.routers.personalsite.rule=Host(`troylusty.com`)" + - "traefik.http.routers.personalsite.entrypoints=websecure" + - "traefik.http.routers.personalsite.tls.certresolver=myresolver" + - "com.centurylinklabs.watchtower.enable=true" + - "traefik.http.routers.personalsite.middlewares=securityHeaders" + restart: unless-stopped + networks: + - traefik + depends_on: + traefik: + condition: service_healthy + + zolapress: + image: code.troylusty.com/troy/zolapress:latest + container_name: zolapress + profiles: + - donotstart + labels: + - "traefik.enable=true" + - "traefik.http.routers.zolapress.rule=Host(`edu.troylusty.com`)" + - "traefik.http.routers.zolapress.entrypoints=websecure" + - "traefik.http.routers.zolapress.tls.certresolver=myresolver" + - "com.centurylinklabs.watchtower.enable=true" + - "traefik.http.middlewares.auth.basicauth.users=troy:$$2y$$05$$fgVNzDsxXDq4co3aTh/OMOKZdLzUiM9XPEU5DXCivc9sYUZy/oq1W" + - "traefik.http.routers.zolapress.middlewares=securityHeaders, auth" + restart: unless-stopped + networks: + - traefik + depends_on: + traefik: + condition: service_healthy + + unduck: + image: code.troylusty.com/troy/unduck:latest + container_name: unduck + labels: + - "traefik.enable=true" + - "traefik.http.routers.unduck.rule=Host(`unduck.troylusty.com`)" + - "traefik.http.routers.unduck.entrypoints=websecure" + - "traefik.http.routers.unduck.tls.certresolver=myresolver" + - "com.centurylinklabs.watchtower.enable=true" + - "traefik.http.routers.unduck.middlewares=securityHeaders" + restart: unless-stopped + networks: + - traefik + depends_on: + traefik: + condition: service_healthy + + forgejo: + image: codeberg.org/forgejo/forgejo:10 + container_name: forgejo + restart: unless-stopped + networks: + - traefik + - forgejo + labels: + - "traefik.enable=true" + - "traefik.http.routers.forgejo.rule=Host(`code.troylusty.com`)" + - "traefik.http.routers.forgejo.entrypoints=websecure" + - "traefik.http.routers.forgejo.tls.certresolver=myresolver" + - "com.centurylinklabs.watchtower.enable=true" + - "traefik.http.routers.forgejo.middlewares=securityHeaders" + - "traefik.http.services.forgejo.loadbalancer.server.port=3000" + - "traefik.docker.network=traefik" + volumes: + - ./forgejo:/data + ports: + - "2222:22" + depends_on: + traefik: + condition: service_healthy + + forgejo-runner: + image: code.forgejo.org/forgejo/runner:6.0.1 + container_name: forgejo-runner + user: 0:0 + depends_on: + forgejo: + condition: service_started + networks: + - forgejo + labels: + - "com.centurylinklabs.watchtower.enable=true" + volumes: + - ./forgejo-runner:/data + - ./forgejo-runner/config.yml:/data/config.yml + - /var/run/docker.sock:/var/run/docker.sock + restart: unless-stopped + command: forgejo-runner -c /data/config.yml daemon + +networks: + traefik: + external: false + name: traefik + forgejo: + external: false + name: forgejo + +volumes: + letsencrypt: +``` diff --git a/src/content/posts/website/showcase.avif b/src/content/posts/website/showcase.avif new file mode 100644 index 0000000000000000000000000000000000000000..395dbe23afd9f0ff48407c14976831417ae343a0 GIT binary patch literal 31737 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�-<3ZsJ}(mThy1=bIltsO;MMZOggjCq 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 + + + + + diff --git a/src/layouts/Cv.astro b/src/layouts/Cv.astro index f54aaff..f6137df 100644 --- a/src/layouts/Cv.astro +++ b/src/layouts/Cv.astro @@ -11,10 +11,10 @@ import icon from "public/assets/icon.png";

- {CV.TITLE}{CV.DESCRIPTION}{CV.TITLE}{CV.DESCRIPTION}

Digital designer.