From e80dacb176f8751bd45ef83d265f3d144364adc3 Mon Sep 17 00:00:00 2001 From: Andrew Stowell Date: Fri, 24 May 2024 11:31:48 -0400 Subject: [PATCH 01/15] initial functional docker setup for anuraghazra/github-readme-stats --- Caddyfile.example | 4 ++++ Dockerfile | 13 +++++++++++++ docker-compose.yml.example | 22 ++++++++++++++++++++++ env.example | 5 +++++ express.js | 11 ++++++++++- readme-docker.md | 35 +++++++++++++++++++++++++++++++++++ 6 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 Caddyfile.example create mode 100644 Dockerfile create mode 100644 docker-compose.yml.example create mode 100644 env.example create mode 100644 readme-docker.md diff --git a/Caddyfile.example b/Caddyfile.example new file mode 100644 index 0000000000000..d899cf0fca0d3 --- /dev/null +++ b/Caddyfile.example @@ -0,0 +1,4 @@ +readme-stats.example.com { + reverse_proxy readme_stats:9000 +} + diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000000..1b1458fec2f01 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,13 @@ +FROM node:lts-alpine + +# setup folder within the docker container with this app's files +WORKDIR /app +COPY . . + +# add express.js as dependency and download node modules +RUN npm install express.js + +# start the app, on the supplied port +EXPOSE $port +CMD [ "node", "express.js" ] + diff --git a/docker-compose.yml.example b/docker-compose.yml.example new file mode 100644 index 0000000000000..f49c1cba1925f --- /dev/null +++ b/docker-compose.yml.example @@ -0,0 +1,22 @@ +services: + readme_stats: + build: . + container_name: readme_stats + restart: unless-stopped + env_file: + - .env + expose: + - $port + + caddy: + image: caddy + restart: unless-stopped + ports: + - "80:80" + - "443:443" + - "443:443/udp" + depends_on: + - readme_stats + volumes: + - ./Caddyfile:/etc/caddy/Caddyfile:ro + diff --git a/env.example b/env.example new file mode 100644 index 0000000000000..849d93dc7b1e2 --- /dev/null +++ b/env.example @@ -0,0 +1,5 @@ +# github token +PAT_1= +# port to listen on +port=9000 + diff --git a/express.js b/express.js index ddc69ba7cba8e..a30cb510f400e 100644 --- a/express.js +++ b/express.js @@ -7,7 +7,16 @@ import gistCard from "./api/gist.js"; import express from "express"; const app = express(); -app.listen(process.env.port || 9000); +const server = app.listen(process.env.port || 9000); +console.log("started, awaiting requests"); + +/* stop gracefully when requested */ +process.on("SIGTERM", () => { + console.log("stopping, received SIGTERM signal"); + server.close(() => { + process.exit(); + }); +}); app.get("/", statsCard); app.get("/pin", repoCard); diff --git a/readme-docker.md b/readme-docker.md new file mode 100644 index 0000000000000..5a792bcb95855 --- /dev/null +++ b/readme-docker.md @@ -0,0 +1,35 @@ +Get dynamically generated GitHub stats on your READMEs, with the ease of docker! + +Fork of [https://github.com/anuraghazra/github-readme-stats](https://github.com/anuraghazra/github-readme-stats), gently wrapped in docker. + +**Steps to setup:** +* clone this repo into a folder. +* copy docker-compose.yml.example to docker-compose.yml. +* copy env.example to .env and update. +* copy Caddyfile.example to Caddyfile and update. +* and start with `docker compose up -d`. + +docker-compose.yml.example has a very simple Caddy reverse proxy, for automatic https. + +Files have example in their name, so that when you update, your local settings won't be overridden. + +``` +git clone https://code.digitaladapt.com/andrew/github-readme-stats.git +cd github-readme-stats +cp docker-compose.yml.example docker-compose.yml +cp env.example .env +vim .env +# add your github token + +cp Caddyfile.example Caddyfile +vim Caddyfile +# configure your domain + +docker compose up -d +``` + +You might ask, why should I trust your docker image? + +The answer is, you don't have to, there isn't an image, +just a few commands in the Dockerfile, which you can and should look at. + From 47b3cbf8f38725ec0d7a0564fe4084db6da535cc Mon Sep 17 00:00:00 2001 From: Andrew Stowell Date: Fri, 24 May 2024 11:33:54 -0400 Subject: [PATCH 02/15] my personal setup, compose file to tie into my reverse proxy managed elsewhere. --- compose.yaml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 compose.yaml diff --git a/compose.yaml b/compose.yaml new file mode 100644 index 0000000000000..8864596b8d301 --- /dev/null +++ b/compose.yaml @@ -0,0 +1,21 @@ +# `docker network create proxied --internal --ipv6` +# `docker network create public --ipv6` +networks: + proxied: + external: true + public: + external: true + +services: + readme_stats: + build: . + container_name: readme_stats + restart: always + env_file: + - .env + networks: + - public + - proxied + expose: + - $port + From e7e13c3dadcfd39051a17ac39271abbe58a68b09 Mon Sep 17 00:00:00 2001 From: Andrew Stowell Date: Sat, 25 May 2024 06:32:47 -0400 Subject: [PATCH 03/15] tell watchtower not to watch, as there aren't published images to pull --- compose.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/compose.yaml b/compose.yaml index 8864596b8d301..b2c1188c8f1ac 100644 --- a/compose.yaml +++ b/compose.yaml @@ -10,6 +10,8 @@ services: readme_stats: build: . container_name: readme_stats + labels: + - "com.centurylinklabs.watchtower.enable=false" restart: always env_file: - .env From 8811f28e50bc60d6a308c6cac5af1dd276505119 Mon Sep 17 00:00:00 2001 From: Andrew Stowell Date: Wed, 29 May 2024 12:18:13 -0400 Subject: [PATCH 04/15] sorting list of networks in my compose file. --- compose.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compose.yaml b/compose.yaml index b2c1188c8f1ac..b9f46dc6d3133 100644 --- a/compose.yaml +++ b/compose.yaml @@ -16,8 +16,8 @@ services: env_file: - .env networks: - - public - proxied + - public expose: - $port From 45edbcdfe4dea0065d1a9b9119c6a22555802504 Mon Sep 17 00:00:00 2001 From: Andrew Stowell Date: Thu, 30 May 2024 14:10:22 -0400 Subject: [PATCH 05/15] hourly health check --- compose.yaml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/compose.yaml b/compose.yaml index b9f46dc6d3133..6780cc102d3ef 100644 --- a/compose.yaml +++ b/compose.yaml @@ -20,4 +20,11 @@ services: - public expose: - $port + healthcheck: + test: wget --no-verbose -O - --tries=1 http://localhost:$$port/?username=digitaladapt | grep 'GitHub Stats' || exit 1 + interval: 60m # hourly + retries: 3 + start_interval: 1s + start_period: 10s + timeout: 5s From 54d6e2e585eafad26fdd36a3a81ca767c8cf5c28 Mon Sep 17 00:00:00 2001 From: Andrew Stowell Date: Thu, 30 May 2024 14:48:56 -0400 Subject: [PATCH 06/15] ensure watchtower monitors node image, while we use a custom container. --- compose.yaml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/compose.yaml b/compose.yaml index 6780cc102d3ef..3071ab960e544 100644 --- a/compose.yaml +++ b/compose.yaml @@ -28,3 +28,10 @@ services: start_period: 10s timeout: 5s + # special container, just for watchtower, to monitor underlying image + readme_stats_monitor: + image: node:lts-alpine + container_name: readme_stats_monitor + restart: no + entrypoint: "/bin/true" + From 368d3414c1a27f87023f1354045eafb6f8bff14c Mon Sep 17 00:00:00 2001 From: Andrew Stowell Date: Tue, 25 Jun 2024 09:23:40 -0400 Subject: [PATCH 07/15] enabled init, to prevent zombie processes caused by health check. --- compose.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/compose.yaml b/compose.yaml index 3071ab960e544..90151b1fa7b1d 100644 --- a/compose.yaml +++ b/compose.yaml @@ -20,6 +20,7 @@ services: - public expose: - $port + init: true healthcheck: test: wget --no-verbose -O - --tries=1 http://localhost:$$port/?username=digitaladapt | grep 'GitHub Stats' || exit 1 interval: 60m # hourly From c13c03a0d8ca7860b1aaea13813841e43d421c82 Mon Sep 17 00:00:00 2001 From: DevGnome Date: Thu, 19 Sep 2024 13:32:52 -0400 Subject: [PATCH 08/15] removing internal proxied network, that is not useful. --- compose.yaml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/compose.yaml b/compose.yaml index 90151b1fa7b1d..90c47a92ecf69 100644 --- a/compose.yaml +++ b/compose.yaml @@ -1,8 +1,5 @@ -# `docker network create proxied --internal --ipv6` # `docker network create public --ipv6` networks: - proxied: - external: true public: external: true @@ -16,7 +13,6 @@ services: env_file: - .env networks: - - proxied - public expose: - $port From 17e3a7bb8d4d83c17f7cdc594626f65a27e6cf64 Mon Sep 17 00:00:00 2001 From: Andrew Stowell Date: Tue, 20 May 2025 19:58:05 -0400 Subject: [PATCH 09/15] reorganized a bit --- .env | 1 + .gitignore | 2 +- compose.yaml | 21 ++++++++++----------- 3 files changed, 12 insertions(+), 12 deletions(-) create mode 120000 .env diff --git a/.env b/.env new file mode 120000 index 0000000000000..2d44bf58a94d1 --- /dev/null +++ b/.env @@ -0,0 +1 @@ +host.env \ No newline at end of file diff --git a/.gitignore b/.gitignore index b1d9a017c5b80..680adbc5bcc82 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ .vercel -.env +host.env node_modules *.lock .idea/ diff --git a/compose.yaml b/compose.yaml index 90c47a92ecf69..5ce4e9ee5934f 100644 --- a/compose.yaml +++ b/compose.yaml @@ -1,4 +1,3 @@ -# `docker network create public --ipv6` networks: public: external: true @@ -7,16 +6,10 @@ services: readme_stats: build: . container_name: readme_stats - labels: - - "com.centurylinklabs.watchtower.enable=false" - restart: always env_file: - .env - networks: - - public expose: - - $port - init: true + - ${port} healthcheck: test: wget --no-verbose -O - --tries=1 http://localhost:$$port/?username=digitaladapt | grep 'GitHub Stats' || exit 1 interval: 60m # hourly @@ -24,11 +17,17 @@ services: start_interval: 1s start_period: 10s timeout: 5s + init: true + labels: + - "com.centurylinklabs.watchtower.enable=false" # built, disable watchtower + networks: + - public + restart: always - # special container, just for watchtower, to monitor underlying image + # allow watchtower to monitor for update to base image, since our container is built readme_stats_monitor: - image: node:lts-alpine container_name: readme_stats_monitor - restart: no entrypoint: "/bin/true" + image: node:lts-alpine + restart: no From 278ccfeeca3705d012c18bd7b40482b0f7ee6975 Mon Sep 17 00:00:00 2001 From: Andrew Stowell Date: Tue, 20 May 2025 20:10:19 -0400 Subject: [PATCH 10/15] moved github username to config --- compose.yaml | 2 +- docker-compose.yml.example | 8 ++++++++ env.example | 2 ++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/compose.yaml b/compose.yaml index 5ce4e9ee5934f..569a3eef02762 100644 --- a/compose.yaml +++ b/compose.yaml @@ -11,7 +11,7 @@ services: expose: - ${port} healthcheck: - test: wget --no-verbose -O - --tries=1 http://localhost:$$port/?username=digitaladapt | grep 'GitHub Stats' || exit 1 + test: wget --no-verbose -O - --tries=1 http://localhost:$$port/?username=$$GH_UN | grep 'GitHub Stats' || exit 1 interval: 60m # hourly retries: 3 start_interval: 1s diff --git a/docker-compose.yml.example b/docker-compose.yml.example index f49c1cba1925f..b0cf85f559ec1 100644 --- a/docker-compose.yml.example +++ b/docker-compose.yml.example @@ -7,6 +7,14 @@ services: - .env expose: - $port + healthcheck: + test: wget --no-verbose -O - --tries=1 http://localhost:$$port/?username=$$GH_UN | grep 'GitHub Stats' || exit 1 + interval: 60m # hourly + retries: 3 + start_interval: 1s + start_period: 10s + timeout: 5s + init: true caddy: image: caddy diff --git a/env.example b/env.example index 849d93dc7b1e2..537160957ff65 100644 --- a/env.example +++ b/env.example @@ -1,5 +1,7 @@ # github token PAT_1= +# github username +GH_UN= # port to listen on port=9000 From eb5b652b73c56c9aba15620d4fae6deed5474fae Mon Sep 17 00:00:00 2001 From: Andrew Stowell Date: Thu, 22 May 2025 16:13:23 -0400 Subject: [PATCH 11/15] normalizing config across projects --- compose.yaml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/compose.yaml b/compose.yaml index 569a3eef02762..18da5d717d76f 100644 --- a/compose.yaml +++ b/compose.yaml @@ -20,9 +20,16 @@ services: init: true labels: - "com.centurylinklabs.watchtower.enable=false" # built, disable watchtower + logging: + driver: syslog + options: + tag: readme_stats networks: - public restart: always + user: ${USER_ID}:${GROUP_ID} + volumes: + - /etc/localtime:/etc/localtime:ro # read-only # allow watchtower to monitor for update to base image, since our container is built readme_stats_monitor: @@ -30,4 +37,5 @@ services: entrypoint: "/bin/true" image: node:lts-alpine restart: no + user: ${USER_ID}:${GROUP_ID} From 71dbeca70c24a64b8bfcc35ecb6770c0ef56ea04 Mon Sep 17 00:00:00 2001 From: Andrew Stowell Date: Fri, 18 Jul 2025 14:05:42 -0400 Subject: [PATCH 12/15] added auto discovery for homepage and autokuma --- compose.yaml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/compose.yaml b/compose.yaml index 18da5d717d76f..aeb585dab8742 100644 --- a/compose.yaml +++ b/compose.yaml @@ -3,9 +3,9 @@ networks: external: true services: - readme_stats: + readme-stats: build: . - container_name: readme_stats + container_name: readme-stats env_file: - .env expose: @@ -20,6 +20,11 @@ services: init: true labels: - "com.centurylinklabs.watchtower.enable=false" # built, disable watchtower + - homepage.group=Sites + - homepage.name=Github Readme Stats + - homepage.icon=github + - homepage.href=https://readme.digitaladapt.com + - kuma.__docker logging: driver: syslog options: From 12216a3a05ce03381d3344c35ffcf4ec2327d60b Mon Sep 17 00:00:00 2001 From: Andrew Stowell Date: Sun, 14 Jun 2026 18:37:27 -0400 Subject: [PATCH 13/15] adding Gitea workflows to sync to GitHub and push to Docker Hub --- .gitea/workflows/develop.yaml | 34 ++++++++++++++++++++++++++++++++ .gitea/workflows/docker.yaml | 35 +++++++++++++++++++++++++++++++++ .gitea/workflows/publish.yaml | 37 +++++++++++++++++++++++++++++++++++ 3 files changed, 106 insertions(+) create mode 100644 .gitea/workflows/develop.yaml create mode 100644 .gitea/workflows/docker.yaml create mode 100644 .gitea/workflows/publish.yaml diff --git a/.gitea/workflows/develop.yaml b/.gitea/workflows/develop.yaml new file mode 100644 index 0000000000000..dc72f100bf18c --- /dev/null +++ b/.gitea/workflows/develop.yaml @@ -0,0 +1,34 @@ +name: Push Docker + +on: + push: + branches: + - 'main' + - 'develop' + +jobs: + docker: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build image + uses: docker/build-push-action@v5 + with: + context: . + push: true + platforms: linux/amd64,linux/arm64 + tags: | + ${{ vars.DOCKERHUB_TARGET }}:develop + diff --git a/.gitea/workflows/docker.yaml b/.gitea/workflows/docker.yaml new file mode 100644 index 0000000000000..82de495d24708 --- /dev/null +++ b/.gitea/workflows/docker.yaml @@ -0,0 +1,35 @@ +name: Push Docker + +on: + push: + tags: + - '[0-9.]+-[0-9]+-[0-9]+' + # for this project, we do "YYYY-MM-DD" for version numbers, due to unversioned upstream + +jobs: + docker: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build image + uses: docker/build-push-action@v5 + with: + context: . + push: true + platforms: linux/amd64,linux/arm64 + tags: | + ${{ vars.DOCKERHUB_TARGET }}:latest + ${{ vars.DOCKERHUB_TARGET }}:${{ github.ref_name }} + diff --git a/.gitea/workflows/publish.yaml b/.gitea/workflows/publish.yaml new file mode 100644 index 0000000000000..eba581a414a1c --- /dev/null +++ b/.gitea/workflows/publish.yaml @@ -0,0 +1,37 @@ +name: Sync GitHub + +on: + push: + branches: + - '**' + +jobs: + sync: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Configure Git + run: | + git config --global user.name "Andrew Sync" + git config --global user.email "sync@digitaladapt.com" + + - name: Add GitHub Remote + env: + SYNC_TOKEN: ${{ secrets.SYNC_GITHUB_TOKEN }} + SYNC_TARGET: ${{ vars.SYNC_GITHUB_TARGET }} + run: | + git remote add github "https://digitaladapt:${SYNC_TOKEN}@github.com/$SYNC_TARGET" + + - name: Push Current Branch + run: | + git push github HEAD:${GITHUB_REF_NAME} + + - name: Push Tags + run: | + git push github --tags + From 94379d943e5c6b22c369032ee3941847e494cd0f Mon Sep 17 00:00:00 2001 From: Andrew Stowell Date: Wed, 17 Jun 2026 10:04:47 -0400 Subject: [PATCH 14/15] full refactor, moving everything into docker folder, making image on docker hub instead of instructing people to build it themselves, no more dev-dependencies, etc. --- .env | 1 - .gitea/workflows/develop.yaml | 3 +- .gitea/workflows/docker.yaml | 3 +- .gitignore | 2 +- Caddyfile.example | 4 -- Dockerfile | 13 ------ compose.yaml | 46 ------------------- docker/.editorconfig | 3 ++ docker/Caddyfile | 6 +++ docker/Dockerfile | 36 +++++++++++++++ .../docker-compose.yml | 22 ++++----- readme-docker.md => docker/readme.md | 17 +++---- env.example | 7 --- 13 files changed, 67 insertions(+), 96 deletions(-) delete mode 120000 .env delete mode 100644 Caddyfile.example delete mode 100644 Dockerfile delete mode 100644 compose.yaml create mode 100644 docker/.editorconfig create mode 100644 docker/Caddyfile create mode 100644 docker/Dockerfile rename docker-compose.yml.example => docker/docker-compose.yml (50%) rename readme-docker.md => docker/readme.md (60%) delete mode 100644 env.example diff --git a/.env b/.env deleted file mode 120000 index 2d44bf58a94d1..0000000000000 --- a/.env +++ /dev/null @@ -1 +0,0 @@ -host.env \ No newline at end of file diff --git a/.gitea/workflows/develop.yaml b/.gitea/workflows/develop.yaml index dc72f100bf18c..a68c560692698 100644 --- a/.gitea/workflows/develop.yaml +++ b/.gitea/workflows/develop.yaml @@ -27,8 +27,9 @@ jobs: uses: docker/build-push-action@v5 with: context: . + file: docker/Dockerfile push: true - platforms: linux/amd64,linux/arm64 + platforms: linux/amd64 tags: | ${{ vars.DOCKERHUB_TARGET }}:develop diff --git a/.gitea/workflows/docker.yaml b/.gitea/workflows/docker.yaml index 82de495d24708..45300b837c5be 100644 --- a/.gitea/workflows/docker.yaml +++ b/.gitea/workflows/docker.yaml @@ -27,8 +27,9 @@ jobs: uses: docker/build-push-action@v5 with: context: . + file: docker/Dockerfile push: true - platforms: linux/amd64,linux/arm64 + platforms: linux/amd64 tags: | ${{ vars.DOCKERHUB_TARGET }}:latest ${{ vars.DOCKERHUB_TARGET }}:${{ github.ref_name }} diff --git a/.gitignore b/.gitignore index 680adbc5bcc82..b1d9a017c5b80 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ .vercel -host.env +.env node_modules *.lock .idea/ diff --git a/Caddyfile.example b/Caddyfile.example deleted file mode 100644 index d899cf0fca0d3..0000000000000 --- a/Caddyfile.example +++ /dev/null @@ -1,4 +0,0 @@ -readme-stats.example.com { - reverse_proxy readme_stats:9000 -} - diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 1b1458fec2f01..0000000000000 --- a/Dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM node:lts-alpine - -# setup folder within the docker container with this app's files -WORKDIR /app -COPY . . - -# add express.js as dependency and download node modules -RUN npm install express.js - -# start the app, on the supplied port -EXPOSE $port -CMD [ "node", "express.js" ] - diff --git a/compose.yaml b/compose.yaml deleted file mode 100644 index aeb585dab8742..0000000000000 --- a/compose.yaml +++ /dev/null @@ -1,46 +0,0 @@ -networks: - public: - external: true - -services: - readme-stats: - build: . - container_name: readme-stats - env_file: - - .env - expose: - - ${port} - healthcheck: - test: wget --no-verbose -O - --tries=1 http://localhost:$$port/?username=$$GH_UN | grep 'GitHub Stats' || exit 1 - interval: 60m # hourly - retries: 3 - start_interval: 1s - start_period: 10s - timeout: 5s - init: true - labels: - - "com.centurylinklabs.watchtower.enable=false" # built, disable watchtower - - homepage.group=Sites - - homepage.name=Github Readme Stats - - homepage.icon=github - - homepage.href=https://readme.digitaladapt.com - - kuma.__docker - logging: - driver: syslog - options: - tag: readme_stats - networks: - - public - restart: always - user: ${USER_ID}:${GROUP_ID} - volumes: - - /etc/localtime:/etc/localtime:ro # read-only - - # allow watchtower to monitor for update to base image, since our container is built - readme_stats_monitor: - container_name: readme_stats_monitor - entrypoint: "/bin/true" - image: node:lts-alpine - restart: no - user: ${USER_ID}:${GROUP_ID} - diff --git a/docker/.editorconfig b/docker/.editorconfig new file mode 100644 index 0000000000000..a05ab458849a0 --- /dev/null +++ b/docker/.editorconfig @@ -0,0 +1,3 @@ +[Caddyfile] +indent_style = tab + diff --git a/docker/Caddyfile b/docker/Caddyfile new file mode 100644 index 0000000000000..370ac2bbbcc52 --- /dev/null +++ b/docker/Caddyfile @@ -0,0 +1,6 @@ +readme-stats.example.com { + ## optional, force all requests to return your github stats + #uri query username ${github_username:anuraghazra} + reverse_proxy readme_stats:${port:9000} +} + diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000000000..8052b75417b0a --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,36 @@ +FROM node:lts-alpine + +# environment variables +ENV port=9000 +ENV github_username=anuraghazra + +# setup folder within the docker container with this app's files +WORKDIR /app +COPY ./api /app/api +COPY ./scripts /app/scripts +COPY ./src /app/src +COPY ./themes /app/themes +COPY ./express.js /app/express.js +COPY ./package.json /app/package.json +COPY ./package-lock.json /app/package-lock.json + +# prepare script uses a dev-dependency, so remove it, +# move express from dev-dependency to regular dependency +# then finally install all non-dev dependencies +RUN npm pkg delete scripts.prepare \ + && npm pkg set dependencies.express="$(node -p "require('./package.json').devDependencies.express")" \ + && npm pkg delete devDependencies.express \ + && npm ci --omit=dev + +# healthcheck +HEALTHCHECK --interval=60m \ + --retries=3 \ + --start-interval=1s \ + --start-period=10s \ + --timeout=5s \ + CMD wget --no-verbose -O - --tries=1 "http://127.0.0.1:$port/api/?username=$github_username" | grep 'GitHub Stats' || exit 1 + +# start the app, on the supplied port +EXPOSE $port +CMD [ "node", "express.js" ] + diff --git a/docker-compose.yml.example b/docker/docker-compose.yml similarity index 50% rename from docker-compose.yml.example rename to docker/docker-compose.yml index b0cf85f559ec1..7c498c62a7661 100644 --- a/docker-compose.yml.example +++ b/docker/docker-compose.yml @@ -1,30 +1,28 @@ services: readme_stats: - build: . container_name: readme_stats - restart: unless-stopped env_file: - .env expose: - $port - healthcheck: - test: wget --no-verbose -O - --tries=1 http://localhost:$$port/?username=$$GH_UN | grep 'GitHub Stats' || exit 1 - interval: 60m # hourly - retries: 3 - start_interval: 1s - start_period: 10s - timeout: 5s init: true + image: digitaladapt/github-readme-stats:latest + restart: unless-stopped caddy: - image: caddy + ## optional, make caddy wait until the service is ready + #depends_on: + # readme_stats: + # condition: service_healthy + ## optional, make variables in .env file available to use in your Caddyfile + #env_file: + # - .env + image: caddy:lates restart: unless-stopped ports: - "80:80" - "443:443" - "443:443/udp" - depends_on: - - readme_stats volumes: - ./Caddyfile:/etc/caddy/Caddyfile:ro diff --git a/readme-docker.md b/docker/readme.md similarity index 60% rename from readme-docker.md rename to docker/readme.md index 5a792bcb95855..8a7931055236a 100644 --- a/readme-docker.md +++ b/docker/readme.md @@ -2,14 +2,16 @@ Get dynamically generated GitHub stats on your READMEs, with the ease of docker! Fork of [https://github.com/anuraghazra/github-readme-stats](https://github.com/anuraghazra/github-readme-stats), gently wrapped in docker. +Now as an image on Docker Hub. + **Steps to setup:** -* clone this repo into a folder. -* copy docker-compose.yml.example to docker-compose.yml. -* copy env.example to .env and update. -* copy Caddyfile.example to Caddyfile and update. +* add the readme_stats service to your existing docker-compose.yml. +* configure your .env to have `PAT_1=`. +* optionally configure `port`, and `github_username` +* update your existing Caddyfile. * and start with `docker compose up -d`. -docker-compose.yml.example has a very simple Caddy reverse proxy, for automatic https. +docker-compose.yml.example, Caddyfile.example, and env.example have a very simple working example using Caddy reverse proxy. Files have example in their name, so that when you update, your local settings won't be overridden. @@ -28,8 +30,3 @@ vim Caddyfile docker compose up -d ``` -You might ask, why should I trust your docker image? - -The answer is, you don't have to, there isn't an image, -just a few commands in the Dockerfile, which you can and should look at. - diff --git a/env.example b/env.example deleted file mode 100644 index 537160957ff65..0000000000000 --- a/env.example +++ /dev/null @@ -1,7 +0,0 @@ -# github token -PAT_1= -# github username -GH_UN= -# port to listen on -port=9000 - From a596d6a8fad0fd1dd5b7d227b9a9b9615f64827b Mon Sep 17 00:00:00 2001 From: Andrew Stowell Date: Wed, 17 Jun 2026 12:13:08 -0400 Subject: [PATCH 15/15] standardizing gitea action files, attempting to build for arm64, and commenting on all differences. --- .gitea/workflows/develop.yaml | 5 +++-- .gitea/workflows/docker.yaml | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.gitea/workflows/develop.yaml b/.gitea/workflows/develop.yaml index a68c560692698..9f210e2273bc5 100644 --- a/.gitea/workflows/develop.yaml +++ b/.gitea/workflows/develop.yaml @@ -1,4 +1,4 @@ -name: Push Docker +name: Push Develop on: push: @@ -28,8 +28,9 @@ jobs: with: context: . file: docker/Dockerfile + # for this project, we keep docker in its own folder, to keep it isolated from upstream push: true - platforms: linux/amd64 + platforms: linux/amd64,linux/arm64 tags: | ${{ vars.DOCKERHUB_TARGET }}:develop diff --git a/.gitea/workflows/docker.yaml b/.gitea/workflows/docker.yaml index 45300b837c5be..9cf2d43f084f5 100644 --- a/.gitea/workflows/docker.yaml +++ b/.gitea/workflows/docker.yaml @@ -3,7 +3,7 @@ name: Push Docker on: push: tags: - - '[0-9.]+-[0-9]+-[0-9]+' + - '*-*-*' # for this project, we do "YYYY-MM-DD" for version numbers, due to unversioned upstream jobs: @@ -28,8 +28,9 @@ jobs: with: context: . file: docker/Dockerfile + # for this project, we keep docker in its own folder, to keep it isolated from upstream push: true - platforms: linux/amd64 + platforms: linux/amd64,linux/arm64 tags: | ${{ vars.DOCKERHUB_TARGET }}:latest ${{ vars.DOCKERHUB_TARGET }}:${{ github.ref_name }}