diff --git a/.gitea/workflows/develop.yaml b/.gitea/workflows/develop.yaml new file mode 100644 index 0000000000000..9f210e2273bc5 --- /dev/null +++ b/.gitea/workflows/develop.yaml @@ -0,0 +1,36 @@ +name: Push Develop + +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: . + file: docker/Dockerfile + # for this project, we keep docker in its own folder, to keep it isolated from upstream + 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..9cf2d43f084f5 --- /dev/null +++ b/.gitea/workflows/docker.yaml @@ -0,0 +1,37 @@ +name: Push Docker + +on: + push: + tags: + - '*-*-*' + # 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: . + file: docker/Dockerfile + # for this project, we keep docker in its own folder, to keep it isolated from upstream + 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 + 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/docker-compose.yml b/docker/docker-compose.yml new file mode 100644 index 0000000000000..7c498c62a7661 --- /dev/null +++ b/docker/docker-compose.yml @@ -0,0 +1,28 @@ +services: + readme_stats: + container_name: readme_stats + env_file: + - .env + expose: + - $port + init: true + image: digitaladapt/github-readme-stats:latest + restart: unless-stopped + + 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" + volumes: + - ./Caddyfile:/etc/caddy/Caddyfile:ro + diff --git a/docker/readme.md b/docker/readme.md new file mode 100644 index 0000000000000..8a7931055236a --- /dev/null +++ b/docker/readme.md @@ -0,0 +1,32 @@ +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:** +* 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, 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. + +``` +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 +``` + diff --git a/express.js b/express.js index 92a7fb1673908..65de51bc842f5 100644 --- a/express.js +++ b/express.js @@ -18,6 +18,14 @@ router.get("/gist", gistCard); app.use("/api", router); const port = process.env.PORT || process.env.port || 9000; -app.listen(port, "0.0.0.0", () => { +const server = app.listen(port, "0.0.0.0", () => { console.log(`Server running on port ${port}`); }); + +/* stop gracefully when requested */ +process.on("SIGTERM", () => { + console.log("stopping, received SIGTERM signal"); + server.close(() => { + process.exit(); + }); +});