Compare commits

...

11 Commits

Author SHA1 Message Date
6935d292b4 v5.4.0
Some checks failed
Docker (tags) / security (push) Failing after 1s
Docker (tags) / test (push) Has been skipped
Docker (tags) / release (push) Has been skipped
Docker (tags) / metadata (push) Has been skipped
2026-02-06 14:00:03 +00:00
3420824d7b feat(ci): replace npmci with szci across CI and images; add szci preinstalled images and make tini the PID 1 init in Docker images 2026-02-06 14:00:03 +00:00
f3c2510a24 v5.3.0 2026-02-06 10:06:40 +00:00
c3847a970e feat(docker): add Chromium support for Puppeteer/Playwright and npm build/release scripts 2026-02-06 09:31:43 +00:00
2a7eb157b6 v5.2.0
Some checks failed
Docker (tags) / security (push) Successful in 24s
Docker (tags) / test (push) Successful in 30s
Docker (tags) / metadata (push) Successful in 3s
Docker (tags) / release (push) Failing after 40s
2026-02-06 08:51:12 +00:00
74c7bcd053 feat(ci): switch CI to use @git.zone/tsdocker and add tsdocker config and image tests 2026-02-06 08:51:12 +00:00
e61aeaad2d docs: Update documentation for modernization changes
- Update readme.hints.md with Ubuntu 24.04 upgrade notes, package changes,
  MongoDB 8.0 details, and corrected NVM/Node version references
- Update readme.md with Ubuntu 24.04 tag description and adjusted image sizes
2026-02-06 08:48:25 +00:00
e1ad8c2d83 feat(core): Modernize Ubuntu base, NVM, Node.js, and MongoDB
Ubuntu 24.04 upgrade:
- Upgrade base from ubuntu:20.04 to ubuntu:24.04
- Remove Python 2 (EOL since 2020), keep Python 3
- Replace deprecated packages for 24.04 compatibility:
  gconf-service/libgconf-2-4 removed, libgcc1 → libgcc-s1,
  libappindicator1 → libayatana-appindicator3-1,
  libasound2 → libasound2t64
- Add libgbm1 and libatk-bridge2.0-0 for Chrome/Puppeteer

NVM & Node.js:
- Upgrade NVM from v0.33.8 to v0.40.1
- Upgrade Node.js from v20.x to v24.13.0 LTS across all images

MongoDB:
- Upgrade from 4.4 to 8.0
- Use modern gpg keyring approach instead of deprecated apt-key
- Update repository from bionic to noble
2026-02-06 08:44:56 +00:00
9aed8b7b40 fix(tests): Add shebangs, set -e, and comprehensive checks to Ubuntu test scripts
- Rewrite test_latest.sh with real tests for NVM, Node.js, pnpm, Bun, Deno, and version switching
- Add #!/bin/bash shebang and set -e to test_stable.sh and test_npmci.sh
2026-02-06 08:44:32 +00:00
165712267c fix(ci): Correct misleading workflow name, remove duplicate tapbundle
- Fix docker_nottags.yaml name from "Docker (tags)" to "Docker (non-tag pushes)"
- Remove duplicate @push.rocks/tapbundle entry in fossglobal preinstalled Dockerfile
2026-02-06 08:44:23 +00:00
391b13bf57 fix(metadata): Remove vestigial tsconfig.json, clean up package.json
- Remove tsconfig.json (no TypeScript source exists in this project)
- Remove unused files array (package is private: true)
- Fix author from "Lossless GmbH" to "Task Venture Capital GmbH" to match LICENSE
2026-02-06 08:44:16 +00:00
26 changed files with 302 additions and 360 deletions

View File

@@ -1,4 +1,4 @@
name: Docker (tags)
name: Docker (non-tag pushes)
on:
push:
@@ -6,7 +6,7 @@ on:
- '**'
env:
IMAGE: registry.gitlab.com/hosttoday/ht-docker-node:npmci
IMAGE: registry.gitlab.com/hosttoday/ht-docker-node:szci
NPMCI_COMPUTED_REPOURL: https://${{gitea.repository_owner}}:${{secrets.GITEA_TOKEN}}@gitea.lossless.digital/${{gitea.repository}}.git
NPMCI_TOKEN_NPM: ${{secrets.NPMCI_TOKEN_NPM}}
NPMCI_TOKEN_NPM2: ${{secrets.NPMCI_TOKEN_NPM2}}
@@ -24,22 +24,22 @@ jobs:
steps:
- uses: actions/checkout@v3
- name: Install pnpm and npmci
- name: Install pnpm and szci
run: |
pnpm install -g pnpm
pnpm install -g @ship.zone/npmci
npmci npm prepare
pnpm install -g @ship.zone/szci
szci npm prepare
- name: Audit production dependencies
run: |
npmci command npm config set registry https://registry.npmjs.org
npmci command pnpm audit --audit-level=high --prod
szci command npm config set registry https://registry.npmjs.org
szci command pnpm audit --audit-level=high --prod
continue-on-error: true
- name: Audit development dependencies
run: |
npmci command npm config set registry https://registry.npmjs.org
npmci command pnpm audit --audit-level=high --dev
szci command npm config set registry https://registry.npmjs.org
szci command pnpm audit --audit-level=high --dev
continue-on-error: true
test:
@@ -54,18 +54,18 @@ jobs:
- name: Prepare
run: |
pnpm install -g pnpm
pnpm install -g @ship.zone/npmci
npmci npm prepare
pnpm install -g @ship.zone/szci
szci npm prepare
- name: Test stable
run: |
npmci node install stable
npmci npm install
npmci npm test
szci node install stable
szci npm install
szci npm test
- name: Test build
run: |
npmci npm prepare
npmci node install stable
npmci npm install
npmci command npm run build
szci npm prepare
szci node install stable
szci npm install
szci command npm run build

View File

@@ -6,7 +6,7 @@ on:
- '*'
env:
IMAGE: code.foss.global/host.today/ht-docker-node:npmci
IMAGE: code.foss.global/host.today/ht-docker-node:szci
NPMCI_COMPUTED_REPOURL: https://${{gitea.repository_owner}}:${{secrets.GITEA_TOKEN}}@gitea.lossless.digital/${{gitea.repository}}.git
# NPMCI_TOKEN_NPM: ${{secrets.NPMCI_TOKEN_NPM}}
# NPMCI_TOKEN_NPM2: ${{secrets.NPMCI_TOKEN_NPM2}}
@@ -27,19 +27,19 @@ jobs:
- name: Prepare
run: |
pnpm install -g pnpm
pnpm install -g @ship.zone/npmci
npmci npm prepare
pnpm install -g @ship.zone/szci
szci npm prepare
- name: Audit production dependencies
run: |
npmci command npm config set registry https://registry.npmjs.org
npmci command pnpm audit --audit-level=high --prod
szci command npm config set registry https://registry.npmjs.org
szci command pnpm audit --audit-level=high --prod
continue-on-error: true
- name: Audit development dependencies
run: |
npmci command npm config set registry https://registry.npmjs.org
npmci command pnpm audit --audit-level=high --dev
szci command npm config set registry https://registry.npmjs.org
szci command pnpm audit --audit-level=high --dev
continue-on-error: true
test:
@@ -54,27 +54,27 @@ jobs:
- name: Prepare
run: |
pnpm install -g pnpm
pnpm install -g @ship.zone/npmci
npmci npm prepare
pnpm install -g @ship.zone/szci
szci npm prepare
- name: Test stable
run: |
npmci node install stable
npmci npm install
npmci npm test
szci node install stable
szci npm install
szci npm test
- name: Test build
run: |
npmci node install stable
npmci npm install
npmci command npm run build
szci node install stable
szci npm install
szci command npm run build
release:
needs: test
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
runs-on: ubuntu-latest
container:
image: code.foss.global/host.today/ht-docker-dbase:npmci
image: code.foss.global/host.today/ht-docker-dbase:szci
steps:
- uses: actions/checkout@v3
@@ -82,15 +82,22 @@ jobs:
- name: Prepare
run: |
pnpm install -g pnpm
pnpm install -g @ship.zone/npmci
pnpm install -g @git.zone/tsdocker@latest
- name: Release
run: |
npmci docker login
npmci docker build
npmci docker test
# npmci docker push gitea.lossless.digital
npmci docker push code.foss.global
- name: Login to registries
run: tsdocker login
- name: List discovered Dockerfiles
run: tsdocker list
- name: Build all images
run: tsdocker build
- name: Test images
run: tsdocker test
- name: Push to code.foss.global
run: tsdocker push code.foss.global
metadata:
needs: test
@@ -103,4 +110,4 @@ jobs:
- uses: actions/checkout@v3
- name: Trigger
run: npmci trigger
run: szci trigger

View File

@@ -1,9 +1,13 @@
FROM ubuntu:20.04
FROM ubuntu:24.04
LABEL author="Task Venture Capital GmbH <hello@task.vc>"
WORKDIR /workspace
# important environment variables
ENV NODE_VERSION_LTS="20.12.2" NODE_VERSION_STABLE="20.12.2" NVM_DIR="/usr/local/nvm"
ENV NODE_VERSION_LTS="24.13.0" NODE_VERSION_STABLE="24.13.0" NVM_DIR="/usr/local/nvm"
# Chromium paths for Puppeteer/Playwright compatibility
ENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser
ENV CHROME_BIN=/usr/bin/chromium-browser
# Set debconf to run non-interactively and install packages
RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections \
@@ -22,24 +26,23 @@ RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selectio
git \
make \
openssl \
python \
python3 \
rsync \
ssh \
wget \
unzip \
# puppeteer
gconf-service \
libasound2 \
libasound2t64 \
libatk1.0-0 \
libatk-bridge2.0-0 \
libc6 \
libcairo2 \
libcups2 \
libdbus-1-3 \
libexpat1 \
libfontconfig1 \
libgcc1 \
libgconf-2-4 \
libgbm1 \
libgcc-s1 \
libgdk-pixbuf2.0-0 \
libglib2.0-0 \
libgtk-3-0 \
@@ -62,29 +65,31 @@ RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selectio
libxtst6 \
ca-certificates \
fonts-liberation \
libappindicator1 \
libayatana-appindicator3-1 \
libnss3 \
lsb-release \
xdg-utils \
# network
iputils-ping \
dnsutils \
# init
tini \
# chrome
&& wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb \
&& apt install -y -q --no-install-recommends ./google-chrome-stable_current_amd64.deb \
# chromium (multi-arch compatible - works on both amd64 and arm64)
&& apt-get install -y -q --no-install-recommends chromium-browser \
# mongodb
&& curl -fsSL https://www.mongodb.org/static/pgp/server-4.4.asc | apt-key add - \
&& echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.4 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-4.4.list \
# mongodb 8.0
&& curl -fsSL https://www.mongodb.org/static/pgp/server-8.0.asc | \
gpg --dearmor -o /usr/share/keyrings/mongodb-server-8.0.gpg \
&& echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg ] https://repo.mongodb.org/apt/ubuntu noble/mongodb-org/8.0 multiverse" | \
tee /etc/apt/sources.list.d/mongodb-org-8.0.list \
&& apt-get update \
&& apt-get install -y -q --no-install-recommends \
mongodb-org \
&& apt-get install -y -q --no-install-recommends mongodb-org \
&& apt-get clean \
&& rm -r /var/lib/apt/lists/*
# Install nvm with node and npm
RUN curl https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
RUN mkdir -p $NVM_DIR && curl https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
# Make nvm available globally in all bash shells (interactive + non-interactive)
# IMPORTANT: Prepend to bashrc, before the "[ -z "$PS1" ] && return" line
@@ -132,5 +137,5 @@ ENV DENO_INSTALL="/root/.deno"
ENV PATH="$DENO_INSTALL/bin:$PATH"
# Set entrypoint to make nvm available in all runtime contexts
ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]
ENTRYPOINT ["/usr/bin/tini", "--", "/usr/local/bin/docker-entrypoint.sh"]
CMD ["bash"]

View File

@@ -4,7 +4,7 @@ LABEL author="Task Venture Capital GmbH <hello@task.vc>"
WORKDIR /workspace
# Important environment variables
ENV NODE_VERSION_LTS="20.18.2" \
ENV NODE_VERSION_LTS="24.13.0" \
NVM_DIR="/usr/local/nvm" \
BUN_INSTALL="/root/.bun" \
NVM_NODEJS_ORG_MIRROR="https://unofficial-builds.nodejs.org/download/release"
@@ -16,7 +16,8 @@ RUN apk add --no-cache \
git \
ca-certificates \
unzip \
libstdc++
libstdc++ \
tini
# Install NVM (latest version for better Alpine/musl support)
RUN mkdir -p $NVM_DIR && curl https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
@@ -41,7 +42,11 @@ SHELL ["/usr/local/bin/bash-with-nvm"]
ENV BASH_ENV=/etc/bash.bashrc
# Install Node.js LTS via NVM and Bun
RUN nvm install $NODE_VERSION_LTS \
# TARGETARCH fix: QEMU buildx can report wrong arch via uname -m
ARG TARGETARCH
RUN NVM_MUSL_ARCH=$([ "$TARGETARCH" = "arm64" ] && echo "arm64-musl" || echo "x64-musl") \
&& nvm_get_arch() { echo "$NVM_MUSL_ARCH"; } \
&& nvm install $NODE_VERSION_LTS \
&& nvm alias default $NODE_VERSION_LTS \
&& nvm use default \
&& curl -fsSL https://bun.sh/install | bash
@@ -50,5 +55,5 @@ ENV PATH="$BUN_INSTALL/bin:$NVM_DIR/versions/node/v$NODE_VERSION_LTS/bin:$PATH"
ENV NODE_PATH=$NVM_DIR/v$NODE_VERSION_LTS/lib/node_modules
# Set entrypoint to make nvm available in all runtime contexts
ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]
ENTRYPOINT ["/sbin/tini", "--", "/usr/local/bin/docker-entrypoint.sh"]
CMD ["bash"]

View File

@@ -4,7 +4,7 @@ LABEL author="Task Venture Capital GmbH <hello@task.vc>"
WORKDIR /workspace
# Important environment variables
ENV NODE_VERSION_LTS="20.18.2" \
ENV NODE_VERSION_LTS="24.13.0" \
NVM_DIR="/usr/local/nvm" \
NVM_NODEJS_ORG_MIRROR="https://unofficial-builds.nodejs.org/download/release"
@@ -17,6 +17,7 @@ RUN apk add --no-cache \
ca-certificates \
unzip \
libstdc++ \
tini \
deno
# Install NVM (latest version for better Alpine/musl support)
@@ -42,7 +43,11 @@ SHELL ["/usr/local/bin/bash-with-nvm"]
ENV BASH_ENV=/etc/bash.bashrc
# Install Node.js LTS via NVM (Deno already installed from Alpine repos)
RUN nvm install $NODE_VERSION_LTS \
# TARGETARCH fix: QEMU buildx can report wrong arch via uname -m
ARG TARGETARCH
RUN NVM_MUSL_ARCH=$([ "$TARGETARCH" = "arm64" ] && echo "arm64-musl" || echo "x64-musl") \
&& nvm_get_arch() { echo "$NVM_MUSL_ARCH"; } \
&& nvm install $NODE_VERSION_LTS \
&& nvm alias default $NODE_VERSION_LTS \
&& nvm use default
@@ -50,5 +55,5 @@ ENV PATH="$NVM_DIR/versions/node/v$NODE_VERSION_LTS/bin:$PATH"
ENV NODE_PATH=$NVM_DIR/v$NODE_VERSION_LTS/lib/node_modules
# Set entrypoint to make nvm available in all runtime contexts
ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]
ENTRYPOINT ["/sbin/tini", "--", "/usr/local/bin/docker-entrypoint.sh"]
CMD ["bash"]

View File

@@ -4,7 +4,7 @@ LABEL author="Task Venture Capital GmbH <hello@task.vc>"
WORKDIR /workspace
# Important environment variables
ENV NODE_VERSION_LTS="20.18.2" \
ENV NODE_VERSION_LTS="24.13.0" \
NVM_DIR="/usr/local/nvm" \
PNPM_HOME="/root/.local/share/pnpm" \
NVM_NODEJS_ORG_MIRROR="https://unofficial-builds.nodejs.org/download/release"
@@ -22,7 +22,8 @@ RUN apk add --no-cache \
unzip \
iputils \
bind-tools \
libstdc++
libstdc++ \
tini
# Install NVM (latest version for better Alpine/musl support)
RUN mkdir -p $NVM_DIR && curl https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
@@ -52,7 +53,13 @@ ENV PATH="$PNPM_HOME:$PATH"
# Install Node.js LTS via NVM and pnpm
# Use musl-specific builds from unofficial-builds for Alpine compatibility
RUN nvm install $NODE_VERSION_LTS \
# TARGETARCH fix: QEMU buildx can report wrong arch via uname -m, causing NVM
# to download x64 binaries on arm64. We create a temporary uname wrapper to
# ensure the correct architecture binary is downloaded.
ARG TARGETARCH
RUN NVM_MUSL_ARCH=$([ "$TARGETARCH" = "arm64" ] && echo "arm64-musl" || echo "x64-musl") \
&& nvm_get_arch() { echo "$NVM_MUSL_ARCH"; } \
&& nvm install $NODE_VERSION_LTS \
&& nvm alias default $NODE_VERSION_LTS \
&& nvm use default \
&& npm install -g pnpm \
@@ -63,5 +70,5 @@ ENV NODE_PATH=$NVM_DIR/v$NODE_VERSION_LTS/lib/node_modules
ENV PATH=$NVM_DIR/versions/node/v$NODE_VERSION_LTS/bin:$PATH
# Set entrypoint to make nvm available in all runtime contexts
ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]
ENTRYPOINT ["/sbin/tini", "--", "/usr/local/bin/docker-entrypoint.sh"]
CMD ["bash"]

View File

@@ -1,4 +1,4 @@
FROM host.today/ht-docker-node:alpine
FROM host.today/ht-docker-node:alpine-node
RUN apk update && apk add bash libc6-compat alpine-sdk
ENV PYTHONUNBUFFERED=1
RUN apk add --update --no-cache python3 && ln -sf python3 /usr/bin/python
@@ -7,4 +7,4 @@ RUN pip3 install --no-cache --upgrade pip setuptools
RUN apk add --update alpine-sdk && \
apk add libffi-dev openssl-dev && \
apk add python3-dev && \
pnpm install -g @ship.zone/npmci node-gyp
pnpm install -g @ship.zone/szci node-gyp

View File

@@ -1,4 +1,4 @@
FROM host.today/ht-docker-node:npmci
FROM host.today/ht-docker-node:szci
RUN npm install -g \
@git.zone/tsrun \
@git.zone/tstest \
@@ -9,5 +9,4 @@ RUN npm install -g \
@push.rocks/tapbundle \
axios \
@push.rocks/smartdelay \
@push.rocks/smartjson \
@push.rocks/tapbundle
@push.rocks/smartjson

View File

@@ -1,6 +0,0 @@
FROM host.today/ht-docker-node:latest
# Add Tini
ENV TINI_VERSION v0.19.0
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini
RUN chmod +x /tini
ENTRYPOINT ["/tini", "--"]

View File

@@ -1,4 +1,4 @@
FROM host.today/ht-docker-node:latest
LABEL author="Task Venture Capital GmbH <hello@task.vc>"
RUN pnpm install -g @ship.zone/npmci
RUN pnpm install -g @ship.zone/szci

View File

@@ -1,6 +1,6 @@
The MIT License (MIT)
Copyright (c) 2016 Lossless GmbH
Copyright (c) 2016 Task Venture Capital GmbH
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -1,125 +0,0 @@
#!/bin/bash
set -e
echo "🏔️ Building Multi-Architecture Alpine Docker Images"
echo "===================================================="
echo ""
# Color codes
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# Check if buildx is available
if ! docker buildx version &> /dev/null; then
echo -e "${YELLOW}⚠️ docker buildx not found. Installing...${NC}"
docker buildx create --use
fi
# Ensure buildx builder is running
echo -e "${BLUE}🔧 Setting up buildx builder...${NC}"
if ! docker buildx inspect default-builder &> /dev/null; then
docker buildx create --name default-builder --use
else
docker buildx use default-builder
fi
echo -e "${GREEN}✅ Buildx ready${NC}"
echo ""
# Build function for multi-arch
build_multiarch_image() {
local dockerfile=$1
local tag=$2
local description=$3
echo -e "${BLUE}📦 Building Multi-Arch: ${NC}${description}"
echo -e "${YELLOW} Dockerfile: ${NC}${dockerfile}"
echo -e "${YELLOW} Tag: ${NC}${tag}"
echo -e "${YELLOW} Platforms: ${NC}linux/amd64, linux/arm64"
if docker buildx build \
--platform linux/amd64,linux/arm64 \
-f "${dockerfile}" \
-t "${tag}" \
--load \
.; then
echo -e "${GREEN}✅ Success: ${NC}${tag} (amd64 + arm64)"
echo ""
else
echo -e "\033[0;31m❌ Failed: ${NC}${tag}"
echo ""
echo -e "${YELLOW}💡 Note: Multi-arch builds with --load only work for single platform.${NC}"
echo -e "${YELLOW} To test locally, build for your native platform:${NC}"
echo -e "${YELLOW} docker buildx build --platform linux/amd64 -f ${dockerfile} -t ${tag} --load .${NC}"
exit 1
fi
}
# Build function for single platform (for local testing)
build_native_image() {
local dockerfile=$1
local tag=$2
local description=$3
local platform=$(uname -m)
# Convert platform name
if [ "$platform" = "x86_64" ]; then
platform="linux/amd64"
elif [ "$platform" = "aarch64" ] || [ "$platform" = "arm64" ]; then
platform="linux/arm64"
fi
echo -e "${BLUE}📦 Building Native: ${NC}${description}"
echo -e "${YELLOW} Dockerfile: ${NC}${dockerfile}"
echo -e "${YELLOW} Tag: ${NC}${tag}"
echo -e "${YELLOW} Platform: ${NC}${platform} (native)"
if docker buildx build \
--platform "${platform}" \
-f "${dockerfile}" \
-t "${tag}" \
--load \
.; then
echo -e "${GREEN}✅ Success: ${NC}${tag} (${platform})"
echo ""
else
echo -e "\033[0;31m❌ Failed: ${NC}${tag}"
exit 1
fi
}
echo -e "${BLUE}════════════════════════════════════════${NC}"
echo -e "${BLUE}Building Alpine Images${NC}"
echo -e "${BLUE}════════════════════════════════════════${NC}"
echo ""
echo -e "${YELLOW}💡 Building for native platform only (for local testing)${NC}"
echo -e "${YELLOW} To build multi-arch for push to registry, use:${NC}"
echo -e "${YELLOW} docker buildx build --platform linux/amd64,linux/arm64 --push ...${NC}"
echo ""
# Build images for native platform (can be loaded for local testing)
build_native_image "Dockerfile_alpine_node" \
"ht-docker-node:alpine-node" \
"Alpine with Node.js LTS + NVM + pnpm"
build_native_image "Dockerfile_alpine_deno" \
"ht-docker-node:alpine-deno" \
"Alpine with Node.js LTS + NVM + Deno"
build_native_image "Dockerfile_alpine_bun" \
"ht-docker-node:alpine-bun" \
"Alpine with Node.js LTS + NVM + Bun"
# Summary
echo -e "${GREEN}════════════════════════════════════════${NC}"
echo -e "${GREEN}✨ All Alpine Images Built Successfully!${NC}"
echo -e "${GREEN}════════════════════════════════════════${NC}"
echo ""
echo "📋 Built Images (Native Platform):"
echo ""
docker images | grep "ht-docker-node:alpine" | awk '{printf " ✅ %-30s %10s\n", $1":"$2, $7" "$8}'
echo ""
echo -e "${YELLOW}💡 These images are built for your native architecture for local testing.${NC}"
echo -e "${YELLOW} In CI/CD, build with: docker buildx build --platform linux/amd64,linux/arm64 --push${NC}"
echo ""

View File

@@ -1,5 +1,29 @@
# Changelog
## 2026-02-06 - 5.4.0 - feat(ci)
replace npmci with szci across CI and images; add szci preinstalled images and make tini the PID 1 init in Docker images
- Replace @ship.zone/npmci with @ship.zone/szci in Gitea CI workflows (.gitea/workflows/docker_nottags.yaml, docker_tags.yaml) and update commands to use szci
- Add szci-specific Dockerfiles (Dockerfile_szci, Dockerfile_alpine-szci) and tests (test/test_szci.sh); remove npmci-specific files
- Install and use tini as PID 1 in multiple Dockerfiles and switch ENTRYPOINT to run tini for proper signal forwarding and zombie reaping
- Update metadata/manifest files (package.json, npmextra.json, readme.*, Dockerfile base tags) to reference szci and document the inclusion of tini
## 2026-02-06 - 5.3.0 - feat(docker)
add Chromium support for Puppeteer/Playwright and npm build/release scripts
- Add PUPPETEER_EXECUTABLE_PATH and CHROME_BIN env vars pointing to /usr/bin/chromium-browser for Puppeteer/Playwright compatibility
- Replace Google Chrome .deb download with apt-get install chromium-browser for multi-arch (amd64/arm64) compatibility
- Add npm scripts: 'build' -> 'tsdocker build' and 'release' -> 'tsdocker push' in package.json
## 2026-02-06 - 5.2.0 - feat(ci)
switch CI to use @git.zone/tsdocker and add tsdocker config and image tests
- Replace @ship.zone/npmci with @git.zone/tsdocker in CI workflow and use tsdocker commands: login, list, build, test, push
- Add npmextra.json configuration for @git.zone/tsdocker (registries, registryRepoMap, platforms, push/testDir)
- Add Dockerfile_alpine-npmci and per-image test scripts under test/ (alpine-bun, alpine-deno, alpine-node)
- Remove legacy Alpine Dockerfiles and legacy build/test scripts (Dockerfile_alpine_node/deno/bun/_npmci, build-alpine-images.sh, test-alpine-images.sh)
- Update LICENSE copyright owner to Task Venture Capital GmbH
## 2025-10-26 - 5.1.0 - feat(alpine-deno)
Improve alpine deno image: switch to alpine:edge and use native Deno package, remove glibc workaround, update NVM/PATH, add local tooling settings and expanded README

View File

@@ -16,18 +16,33 @@
"CI",
"git",
"ssh",
"npmci",
"szci",
"node version management",
"typescript"
]
}
},
"npmci": {
"szci": {
"dockerRegistries": [
"docker.io",
"registry.gitlab.com"
]
},
"@git.zone/tsdocker": {
"registries": [
"code.foss.global",
"registry.gitlab.com",
"docker.io"
],
"registryRepoMap": {
"code.foss.global": "host.today/ht-docker-node",
"registry.gitlab.com": "hosttoday/ht-docker-node",
"docker.io": "hosttoday/ht-docker-node"
},
"platforms": ["linux/amd64", "linux/arm64"],
"push": false,
"testDir": "./test"
},
"tsdoc": {
"legal": "\n## License and Legal Information\n\nThis repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository. \n\n**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.\n\n### Trademarks\n\nThis project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.\n\n### Company Information\n\nTask Venture Capital GmbH \nRegistered at District court Bremen HRB 35230 HB, Germany\n\nFor any legal inquiries or if you require further information, please contact us via email at hello@task.vc.\n\nBy using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.\n"
}

View File

@@ -1,34 +1,24 @@
{
"name": "ht-docker-node",
"version": "5.1.0",
"version": "5.4.0",
"description": "A Docker image that integrates Node.js with shipzone.io support.",
"main": "index.js",
"scripts": {
"test": "echo \"no npm test specified\"",
"build": "echo \"Not needed for now\""
"build": "tsdocker build",
"release": "tsdocker push"
},
"repository": {
"type": "git",
"url": "git+https://github.com/HostToday/ht-docker-node.git"
},
"author": "Lossless GmbH",
"author": "Task Venture Capital GmbH",
"license": "MIT",
"bugs": {
"url": "https://github.com/HostToday/ht-docker-node/issues"
},
"homepage": "https://github.com/HostToday/ht-docker-node#readme",
"private": true,
"files": [
"ts/*",
"ts_web/*",
"dist/*",
"dist_web/*",
"dist_ts_web/*",
"assets/*",
"cli.js",
"npmextra.json",
"readme.md"
],
"directories": {
"test": "test"
},
@@ -40,7 +30,7 @@
"CI",
"git",
"ssh",
"npmci",
"szci",
"node version management",
"typescript"
]

View File

@@ -1,6 +1,6 @@
# Technical Implementation Notes
## NVM Support (v5.0.147)
## NVM Support (v5.2.0)
### How NVM Works in This Image
@@ -30,7 +30,7 @@ The image provides full nvm support in three contexts:
- Critical for CI/CD workflow support
#### 4. ENV PATH Fallback
- Maintains `ENV PATH` pointing to default Node v20.12.2
- Maintains `ENV PATH` pointing to default Node v24.13.0
- Ensures non-bash shells (sh, dash) still have node access
- Backward compatible with existing usage
@@ -68,16 +68,29 @@ RUN node --version # Now shows v18.x.x
- ✅ Dockerfile RUN: `nvm install`, `nvm use`, version switching
- ✅ Runtime bash -c: All nvm commands work
- ✅ CI/CD workflows: Tested in .gitea/workflows context
- ✅ Backward compat: pnpm, npmci, ENV PATH fallback
- ✅ Backward compat: pnpm, szci, ENV PATH fallback
- ✅ Multi-stage builds: nvm available in all stages
- ✅ Interactive shells: Full nvm access
### Maintenance Notes
**If updating nvm version**: Modify line 86 in Dockerfile
**If updating nvm version**: Modify line 87 in Dockerfile (currently NVM v0.40.1)
**If base image changes**: Verify /etc/bash.bashrc structure still has early return pattern
## Ubuntu 24.04 Upgrade Notes
- Base image upgraded from Ubuntu 20.04 to 24.04
- Python 2 removed (EOL since 2020), Python 3 retained
- Package changes for 24.04 compatibility:
- `gconf-service` and `libgconf-2-4` removed (deprecated GConf)
- `libgcc1` replaced with `libgcc-s1`
- `libappindicator1` replaced with `libayatana-appindicator3-1`
- `libasound2` replaced with `libasound2t64` (t64 transition)
- `libgbm1` and `libatk-bridge2.0-0` added for Chrome/Puppeteer
- MongoDB upgraded from 4.4 to 8.0 (uses modern gpg keyring approach instead of deprecated apt-key)
- Node.js upgraded to v24.13.0 LTS (Krypton, supported until April 2028)
**If ENTRYPOINT conflicts**: Users can override with `--entrypoint` flag:
```bash
docker run --entrypoint /bin/bash image -c "commands"

View File

@@ -25,12 +25,11 @@ Perfect for complex builds requiring native dependencies and maximum compatibili
| Tag | Description | Use Case |
|-----|-------------|----------|
| `:latest` / `:lts` | Node.js LTS with NVM | General purpose, production builds |
| `:stable` | Node.js stable release | Latest stable features |
| `:npmci` | With npmci preinstalled | CI/CD pipelines |
| `:npmts` | npmci + npmts | TypeScript projects |
| `:npmpage` | npmci + npmts + npmpage | Static site generation |
| `:mongo` | npmci + npmts + MongoDB | Full-stack development |
| `:latest` | Node.js LTS with NVM (Ubuntu 24.04) | General purpose, production builds |
| `:lts` | Based on latest | Explicit LTS naming |
| `:szci` | With szci preinstalled | CI/CD pipelines |
> **All images include [tini](https://github.com/krallin/tini) as PID 1 init**, ensuring proper signal forwarding and zombie process reaping out of the box.
### Alpine-Based Images (Lightweight & Multi-Arch) ⚡
@@ -41,6 +40,7 @@ Perfect for complex builds requiring native dependencies and maximum compatibili
| `:alpine-node` | Node.js LTS + NVM + pnpm | ~200MB | amd64, arm64 |
| `:alpine-deno` | Node.js LTS + NVM + Deno | ~180MB | amd64, arm64 |
| `:alpine-bun` | Node.js LTS + NVM + Bun | ~150MB | amd64, arm64 |
| `:alpine-szci` | Alpine Node + szci + build tools | ~250MB | amd64, arm64 |
**✨ Multi-architecture magic:** Docker automatically selects the right image for your platform. Build on Mac, deploy on Linux servers—same Dockerfile, native speed everywhere.
@@ -260,31 +260,34 @@ nvm use 18
## 🏗️ Building Multi-Architecture Images
For teams building custom images:
This project uses [@git.zone/tsdocker](https://code.foss.global/git.zone/tsdocker) for Docker image management.
```bash
# Clone the repo
git clone https://github.com/HostToday/ht-docker-node.git
cd ht-docker-node
# Install tsdocker
pnpm install -g @git.zone/tsdocker@latest
# Build Alpine images (native platform for local testing)
chmod +x build-alpine-images.sh
./build-alpine-images.sh
# List all discovered Dockerfiles and their tags
tsdocker list
# Test the built images
chmod +x test-alpine-images.sh
./test-alpine-images.sh
# Build all images (multi-arch: amd64 + arm64)
tsdocker build
# Test all images
tsdocker test
# Push to a specific registry
tsdocker push code.foss.global
```
### Production Multi-Arch Builds
### Manual Builds
For publishing to registries:
For building individual images manually:
```bash
# Build for both amd64 and arm64, push to registry
docker buildx build \
--platform linux/amd64,linux/arm64 \
-f Dockerfile_alpine_node \
-f Dockerfile_alpine-node \
-t your-registry/your-image:alpine-node \
--push \
.
@@ -463,7 +466,7 @@ USER node
| Feature | Ubuntu `:latest` | Alpine `:alpine-node` |
|---------|------------------|----------------------|
| Base Size | ~800MB | ~200MB |
| Base Size | ~900MB | ~200MB |
| Build Tools | ✅ Full | ⚠️ Install separately |
| Compatibility | ✅ Maximum | ✅ Good (musl) |
| Multi-arch | ❌ amd64 only | ✅ amd64, arm64 |

View File

@@ -1,83 +0,0 @@
#!/bin/bash
set -e
echo "🧪 Testing Multi-Architecture Alpine Docker Images"
echo "==================================================="
echo ""
# Color codes
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m' # No Color
FAILED_TESTS=0
# Test function
test_image() {
local tag=$1
local description=$2
local test_cmd=$3
echo -e "${BLUE}🧪 Testing: ${NC}${description}"
echo -e "${YELLOW} Tag: ${NC}${tag}"
if docker run --rm "${tag}" bash -c "${test_cmd}"; then
echo -e "${GREEN}✅ Pass${NC}"
echo ""
return 0
else
echo -e "${RED}❌ Fail${NC}"
echo ""
((FAILED_TESTS++))
return 1
fi
}
# Test Alpine Images (Native Platform)
echo -e "${BLUE}════════════════════════════════════════${NC}"
echo -e "${BLUE}Testing Alpine Images (Native Platform)${NC}"
echo -e "${BLUE}════════════════════════════════════════${NC}"
echo ""
echo -e "${YELLOW}💡 These images are built for your native architecture${NC}"
echo -e "${YELLOW} They will run at full native speed without emulation${NC}"
echo ""
test_image "ht-docker-node:alpine-node" \
"Alpine with Node.js LTS + NVM + pnpm" \
"nvm --version && node --version && pnpm --version"
test_image "ht-docker-node:alpine-deno" \
"Alpine with Node.js LTS + NVM + Deno" \
"nvm --version && node --version && deno --version"
test_image "ht-docker-node:alpine-bun" \
"Alpine with Node.js LTS + NVM + Bun" \
"nvm --version && node --version && bun --version"
# Test NVM version switching (critical feature)
echo -e "${BLUE}════════════════════════════════════════${NC}"
echo -e "${BLUE}Testing NVM Version Switching${NC}"
echo -e "${BLUE}════════════════════════════════════════${NC}"
echo ""
test_image "ht-docker-node:alpine-node" \
"NVM version switching" \
"node --version && nvm install 18 && node --version | grep v18"
# Summary
echo -e "${BLUE}════════════════════════════════════════${NC}"
if [ $FAILED_TESTS -eq 0 ]; then
echo -e "${GREEN}✨ All Tests Passed! (0 failures)${NC}"
echo -e "${BLUE}════════════════════════════════════════${NC}"
echo ""
echo -e "${YELLOW}💡 In production, these same images will work natively on both amd64 and arm64${NC}"
echo ""
exit 0
else
echo -e "${RED}❌ Some Tests Failed (${FAILED_TESTS} failures)${NC}"
echo -e "${BLUE}════════════════════════════════════════${NC}"
echo ""
exit 1
fi

18
test/test_alpine-bun.sh Executable file
View File

@@ -0,0 +1,18 @@
#!/bin/bash
set -e
echo "Testing alpine-bun image..."
# Test NVM
echo "Testing NVM..."
nvm --version
# Test Node.js
echo "Testing Node.js..."
node --version
# Test Bun
echo "Testing Bun..."
bun --version
echo "alpine-bun tests passed!"

18
test/test_alpine-deno.sh Executable file
View File

@@ -0,0 +1,18 @@
#!/bin/bash
set -e
echo "Testing alpine-deno image..."
# Test NVM
echo "Testing NVM..."
nvm --version
# Test Node.js
echo "Testing Node.js..."
node --version
# Test Deno
echo "Testing Deno..."
deno --version
echo "alpine-deno tests passed!"

24
test/test_alpine-node.sh Executable file
View File

@@ -0,0 +1,24 @@
#!/bin/bash
set -e
echo "Testing alpine-node image..."
# Test NVM
echo "Testing NVM..."
nvm --version
# Test Node.js
echo "Testing Node.js..."
node --version
# Test pnpm
echo "Testing pnpm..."
pnpm --version
# Test NVM version switching
echo "Testing NVM version switching..."
nvm install 18
nvm use 18
node --version | grep v18
echo "alpine-node tests passed!"

View File

@@ -1 +1,32 @@
echo "this runs within latest container!";
#!/bin/bash
set -e
echo "Testing latest image..."
# Test NVM
echo "Testing NVM..."
nvm --version
# Test Node.js
echo "Testing Node.js..."
node --version
# Test pnpm
echo "Testing pnpm..."
pnpm --version
# Test Bun
echo "Testing Bun..."
bun --version
# Test Deno
echo "Testing Deno..."
deno --version
# Test NVM version switching
echo "Testing NVM version switching..."
nvm install 22
nvm use 22
node --version | grep v22
echo "latest tests passed!"

View File

@@ -1,10 +0,0 @@
# check if npmci is available
npm init -y
npmci -v
# TODO update npmci to not require package.json
npmci node install stable
# check if npm picks it up
npmci command pnpm install -g @gitzone/tsrun
npmci command tsrun -v

View File

@@ -1,3 +1,6 @@
#!/bin/bash
set -e
# npm
npm -v
node -v

13
test/test_szci.sh Normal file
View File

@@ -0,0 +1,13 @@
#!/bin/bash
set -e
# check if szci is available
npm init -y
szci -v
# TODO update szci to not require package.json
szci node install stable
# check if npm picks it up
szci command pnpm install -g @gitzone/tsrun
szci command tsrun -v

View File

@@ -1,14 +0,0 @@
{
"compilerOptions": {
"experimentalDecorators": true,
"useDefineForClassFields": false,
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"esModuleInterop": true,
"verbatimModuleSyntax": true
},
"exclude": [
"dist_*/**/*.d.ts"
]
}