diff --git a/Dockerfile b/Dockerfile index c59490b6..3d0a0f68 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,20 @@ FROM node:24-alpine AS builder +# OCI Image Labels - Build Args for dynamic values +ARG VERSION="dev" +ARG REVISION="" +ARG CREATED="" +ARG LICENSE="AGPL-3.0" + WORKDIR /app ARG BUILD=oss ARG DATABASE=sqlite +# Derive title and description based on BUILD type +ARG IMAGE_TITLE="Pangolin" +ARG IMAGE_DESCRIPTION="Identity-aware VPN and proxy for remote access to anything, anywhere" + RUN apk add --no-cache curl tzdata python3 make g++ # COPY package.json package-lock.json ./ @@ -69,4 +79,17 @@ RUN chmod +x /usr/local/bin/pangctl ./dist/cli.mjs COPY server/db/names.json ./dist/names.json COPY public ./public +# OCI Image Labels +# https://github.com/opencontainers/image-spec/blob/main/annotations.md +LABEL org.opencontainers.image.source="https://github.com/fosrl/pangolin" \ + org.opencontainers.image.url="https://github.com/fosrl/pangolin" \ + org.opencontainers.image.documentation="https://docs.pangolin.net" \ + org.opencontainers.image.vendor="Fossorial" \ + org.opencontainers.image.licenses="${LICENSE}" \ + org.opencontainers.image.title="${IMAGE_TITLE}" \ + org.opencontainers.image.description="${IMAGE_DESCRIPTION}" \ + org.opencontainers.image.version="${VERSION}" \ + org.opencontainers.image.revision="${REVISION}" \ + org.opencontainers.image.created="${CREATED}" + CMD ["npm", "run", "start"] diff --git a/Makefile b/Makefile index ae31f50c..13dc601f 100644 --- a/Makefile +++ b/Makefile @@ -3,6 +3,25 @@ major_tag := $(shell echo $(tag) | cut -d. -f1) minor_tag := $(shell echo $(tag) | cut -d. -f1,2) +# OCI label variables +CREATED := $(shell date -u +"%Y-%m-%dT%H:%M:%SZ") +REVISION := $(shell git rev-parse HEAD 2>/dev/null || echo "unknown") + +# Common OCI build args for OSS builds +OCI_ARGS_OSS = --build-arg VERSION=$(tag) \ + --build-arg REVISION=$(REVISION) \ + --build-arg CREATED=$(CREATED) \ + --build-arg IMAGE_TITLE="Pangolin" \ + --build-arg IMAGE_DESCRIPTION="Identity-aware VPN and proxy for remote access to anything, anywhere" + +# Common OCI build args for Enterprise builds +OCI_ARGS_EE = --build-arg VERSION=$(tag) \ + --build-arg REVISION=$(REVISION) \ + --build-arg CREATED=$(CREATED) \ + --build-arg LICENSE="Fossorial Commercial" \ + --build-arg IMAGE_TITLE="Pangolin EE" \ + --build-arg IMAGE_DESCRIPTION="Pangolin Enterprise Edition - Identity-aware VPN and proxy for remote access to anything, anywhere" + .PHONY: build-release build-sqlite build-postgresql build-ee-sqlite build-ee-postgresql build-release: build-sqlite build-postgresql build-ee-sqlite build-ee-postgresql @@ -15,6 +34,7 @@ build-sqlite: docker buildx build \ --build-arg BUILD=oss \ --build-arg DATABASE=sqlite \ + $(OCI_ARGS_OSS) \ --platform linux/arm64,linux/amd64 \ --tag fosrl/pangolin:latest \ --tag fosrl/pangolin:$(major_tag) \ @@ -30,6 +50,7 @@ build-postgresql: docker buildx build \ --build-arg BUILD=oss \ --build-arg DATABASE=pg \ + $(OCI_ARGS_OSS) \ --platform linux/arm64,linux/amd64 \ --tag fosrl/pangolin:postgresql-latest \ --tag fosrl/pangolin:postgresql-$(major_tag) \ @@ -45,6 +66,7 @@ build-ee-sqlite: docker buildx build \ --build-arg BUILD=enterprise \ --build-arg DATABASE=sqlite \ + $(OCI_ARGS_EE) \ --platform linux/arm64,linux/amd64 \ --tag fosrl/pangolin:ee-latest \ --tag fosrl/pangolin:ee-$(major_tag) \ @@ -60,6 +82,7 @@ build-ee-postgresql: docker buildx build \ --build-arg BUILD=enterprise \ --build-arg DATABASE=pg \ + $(OCI_ARGS_EE) \ --platform linux/arm64,linux/amd64 \ --tag fosrl/pangolin:ee-postgresql-latest \ --tag fosrl/pangolin:ee-postgresql-$(major_tag) \ @@ -74,9 +97,16 @@ build-release-arm: fi @MAJOR_TAG=$$(echo $(tag) | cut -d. -f1); \ MINOR_TAG=$$(echo $(tag) | cut -d. -f1,2); \ + CREATED=$$(date -u +"%Y-%m-%dT%H:%M:%SZ"); \ + REVISION=$$(git rev-parse HEAD 2>/dev/null || echo "unknown"); \ docker buildx build \ --build-arg BUILD=oss \ --build-arg DATABASE=sqlite \ + --build-arg VERSION=$(tag) \ + --build-arg REVISION=$$REVISION \ + --build-arg CREATED=$$CREATED \ + --build-arg IMAGE_TITLE="Pangolin" \ + --build-arg IMAGE_DESCRIPTION="Identity-aware VPN and proxy for remote access to anything, anywhere" \ --platform linux/arm64 \ --tag fosrl/pangolin:latest-arm64 \ --tag fosrl/pangolin:$$MAJOR_TAG-arm64 \ @@ -86,6 +116,11 @@ build-release-arm: docker buildx build \ --build-arg BUILD=oss \ --build-arg DATABASE=pg \ + --build-arg VERSION=$(tag) \ + --build-arg REVISION=$$REVISION \ + --build-arg CREATED=$$CREATED \ + --build-arg IMAGE_TITLE="Pangolin" \ + --build-arg IMAGE_DESCRIPTION="Identity-aware VPN and proxy for remote access to anything, anywhere" \ --platform linux/arm64 \ --tag fosrl/pangolin:postgresql-latest-arm64 \ --tag fosrl/pangolin:postgresql-$$MAJOR_TAG-arm64 \ @@ -95,6 +130,12 @@ build-release-arm: docker buildx build \ --build-arg BUILD=enterprise \ --build-arg DATABASE=sqlite \ + --build-arg VERSION=$(tag) \ + --build-arg REVISION=$$REVISION \ + --build-arg CREATED=$$CREATED \ + --build-arg LICENSE="Fossorial Commercial" \ + --build-arg IMAGE_TITLE="Pangolin EE" \ + --build-arg IMAGE_DESCRIPTION="Pangolin Enterprise Edition - Identity-aware VPN and proxy for remote access to anything, anywhere" \ --platform linux/arm64 \ --tag fosrl/pangolin:ee-latest-arm64 \ --tag fosrl/pangolin:ee-$$MAJOR_TAG-arm64 \ @@ -104,6 +145,12 @@ build-release-arm: docker buildx build \ --build-arg BUILD=enterprise \ --build-arg DATABASE=pg \ + --build-arg VERSION=$(tag) \ + --build-arg REVISION=$$REVISION \ + --build-arg CREATED=$$CREATED \ + --build-arg LICENSE="Fossorial Commercial" \ + --build-arg IMAGE_TITLE="Pangolin EE" \ + --build-arg IMAGE_DESCRIPTION="Pangolin Enterprise Edition - Identity-aware VPN and proxy for remote access to anything, anywhere" \ --platform linux/arm64 \ --tag fosrl/pangolin:ee-postgresql-latest-arm64 \ --tag fosrl/pangolin:ee-postgresql-$$MAJOR_TAG-arm64 \ @@ -118,9 +165,16 @@ build-release-amd: fi @MAJOR_TAG=$$(echo $(tag) | cut -d. -f1); \ MINOR_TAG=$$(echo $(tag) | cut -d. -f1,2); \ + CREATED=$$(date -u +"%Y-%m-%dT%H:%M:%SZ"); \ + REVISION=$$(git rev-parse HEAD 2>/dev/null || echo "unknown"); \ docker buildx build \ --build-arg BUILD=oss \ --build-arg DATABASE=sqlite \ + --build-arg VERSION=$(tag) \ + --build-arg REVISION=$$REVISION \ + --build-arg CREATED=$$CREATED \ + --build-arg IMAGE_TITLE="Pangolin" \ + --build-arg IMAGE_DESCRIPTION="Identity-aware VPN and proxy for remote access to anything, anywhere" \ --platform linux/amd64 \ --tag fosrl/pangolin:latest-amd64 \ --tag fosrl/pangolin:$$MAJOR_TAG-amd64 \ @@ -130,6 +184,11 @@ build-release-amd: docker buildx build \ --build-arg BUILD=oss \ --build-arg DATABASE=pg \ + --build-arg VERSION=$(tag) \ + --build-arg REVISION=$$REVISION \ + --build-arg CREATED=$$CREATED \ + --build-arg IMAGE_TITLE="Pangolin" \ + --build-arg IMAGE_DESCRIPTION="Identity-aware VPN and proxy for remote access to anything, anywhere" \ --platform linux/amd64 \ --tag fosrl/pangolin:postgresql-latest-amd64 \ --tag fosrl/pangolin:postgresql-$$MAJOR_TAG-amd64 \ @@ -139,6 +198,12 @@ build-release-amd: docker buildx build \ --build-arg BUILD=enterprise \ --build-arg DATABASE=sqlite \ + --build-arg VERSION=$(tag) \ + --build-arg REVISION=$$REVISION \ + --build-arg CREATED=$$CREATED \ + --build-arg LICENSE="Fossorial Commercial" \ + --build-arg IMAGE_TITLE="Pangolin EE" \ + --build-arg IMAGE_DESCRIPTION="Pangolin Enterprise Edition - Identity-aware VPN and proxy for remote access to anything, anywhere" \ --platform linux/amd64 \ --tag fosrl/pangolin:ee-latest-amd64 \ --tag fosrl/pangolin:ee-$$MAJOR_TAG-amd64 \ @@ -148,6 +213,12 @@ build-release-amd: docker buildx build \ --build-arg BUILD=enterprise \ --build-arg DATABASE=pg \ + --build-arg VERSION=$(tag) \ + --build-arg REVISION=$$REVISION \ + --build-arg CREATED=$$CREATED \ + --build-arg LICENSE="Fossorial Commercial" \ + --build-arg IMAGE_TITLE="Pangolin EE" \ + --build-arg IMAGE_DESCRIPTION="Pangolin Enterprise Edition - Identity-aware VPN and proxy for remote access to anything, anywhere" \ --platform linux/amd64 \ --tag fosrl/pangolin:ee-postgresql-latest-amd64 \ --tag fosrl/pangolin:ee-postgresql-$$MAJOR_TAG-amd64 \ @@ -201,27 +272,51 @@ build-rc: echo "Error: tag is required. Usage: make build-release tag="; \ exit 1; \ fi + @CREATED=$$(date -u +"%Y-%m-%dT%H:%M:%SZ"); \ + REVISION=$$(git rev-parse HEAD 2>/dev/null || echo "unknown"); \ docker buildx build \ --build-arg BUILD=oss \ --build-arg DATABASE=sqlite \ + --build-arg VERSION=$(tag) \ + --build-arg REVISION=$$REVISION \ + --build-arg CREATED=$$CREATED \ + --build-arg IMAGE_TITLE="Pangolin" \ + --build-arg IMAGE_DESCRIPTION="Identity-aware VPN and proxy for remote access to anything, anywhere" \ --platform linux/arm64,linux/amd64 \ --tag fosrl/pangolin:$(tag) \ - --push . + --push . && \ docker buildx build \ --build-arg BUILD=oss \ --build-arg DATABASE=pg \ + --build-arg VERSION=$(tag) \ + --build-arg REVISION=$$REVISION \ + --build-arg CREATED=$$CREATED \ + --build-arg IMAGE_TITLE="Pangolin" \ + --build-arg IMAGE_DESCRIPTION="Identity-aware VPN and proxy for remote access to anything, anywhere" \ --platform linux/arm64,linux/amd64 \ --tag fosrl/pangolin:postgresql-$(tag) \ - --push . + --push . && \ docker buildx build \ --build-arg BUILD=enterprise \ --build-arg DATABASE=sqlite \ + --build-arg VERSION=$(tag) \ + --build-arg REVISION=$$REVISION \ + --build-arg CREATED=$$CREATED \ + --build-arg LICENSE="Fossorial Commercial" \ + --build-arg IMAGE_TITLE="Pangolin EE" \ + --build-arg IMAGE_DESCRIPTION="Pangolin Enterprise Edition - Identity-aware VPN and proxy for remote access to anything, anywhere" \ --platform linux/arm64,linux/amd64 \ --tag fosrl/pangolin:ee-$(tag) \ - --push . + --push . && \ docker buildx build \ --build-arg BUILD=enterprise \ --build-arg DATABASE=pg \ + --build-arg VERSION=$(tag) \ + --build-arg REVISION=$$REVISION \ + --build-arg CREATED=$$CREATED \ + --build-arg LICENSE="Fossorial Commercial" \ + --build-arg IMAGE_TITLE="Pangolin EE" \ + --build-arg IMAGE_DESCRIPTION="Pangolin Enterprise Edition - Identity-aware VPN and proxy for remote access to anything, anywhere" \ --platform linux/arm64,linux/amd64 \ --tag fosrl/pangolin:ee-postgresql-$(tag) \ --push . @@ -231,27 +326,51 @@ build-rc-arm: echo "Error: tag is required. Usage: make build-rc-arm tag="; \ exit 1; \ fi + @CREATED=$$(date -u +"%Y-%m-%dT%H:%M:%SZ"); \ + REVISION=$$(git rev-parse HEAD 2>/dev/null || echo "unknown"); \ docker buildx build \ --build-arg BUILD=oss \ --build-arg DATABASE=sqlite \ + --build-arg VERSION=$(tag) \ + --build-arg REVISION=$$REVISION \ + --build-arg CREATED=$$CREATED \ + --build-arg IMAGE_TITLE="Pangolin" \ + --build-arg IMAGE_DESCRIPTION="Identity-aware VPN and proxy for remote access to anything, anywhere" \ --platform linux/arm64 \ --tag fosrl/pangolin:$(tag)-arm64 \ --push . && \ docker buildx build \ --build-arg BUILD=oss \ --build-arg DATABASE=pg \ + --build-arg VERSION=$(tag) \ + --build-arg REVISION=$$REVISION \ + --build-arg CREATED=$$CREATED \ + --build-arg IMAGE_TITLE="Pangolin" \ + --build-arg IMAGE_DESCRIPTION="Identity-aware VPN and proxy for remote access to anything, anywhere" \ --platform linux/arm64 \ --tag fosrl/pangolin:postgresql-$(tag)-arm64 \ --push . && \ docker buildx build \ --build-arg BUILD=enterprise \ --build-arg DATABASE=sqlite \ + --build-arg VERSION=$(tag) \ + --build-arg REVISION=$$REVISION \ + --build-arg CREATED=$$CREATED \ + --build-arg LICENSE="Fossorial Commercial" \ + --build-arg IMAGE_TITLE="Pangolin EE" \ + --build-arg IMAGE_DESCRIPTION="Pangolin Enterprise Edition - Identity-aware VPN and proxy for remote access to anything, anywhere" \ --platform linux/arm64 \ --tag fosrl/pangolin:ee-$(tag)-arm64 \ --push . && \ docker buildx build \ --build-arg BUILD=enterprise \ --build-arg DATABASE=pg \ + --build-arg VERSION=$(tag) \ + --build-arg REVISION=$$REVISION \ + --build-arg CREATED=$$CREATED \ + --build-arg LICENSE="Fossorial Commercial" \ + --build-arg IMAGE_TITLE="Pangolin EE" \ + --build-arg IMAGE_DESCRIPTION="Pangolin Enterprise Edition - Identity-aware VPN and proxy for remote access to anything, anywhere" \ --platform linux/arm64 \ --tag fosrl/pangolin:ee-postgresql-$(tag)-arm64 \ --push . @@ -261,27 +380,51 @@ build-rc-amd: echo "Error: tag is required. Usage: make build-rc-amd tag="; \ exit 1; \ fi + @CREATED=$$(date -u +"%Y-%m-%dT%H:%M:%SZ"); \ + REVISION=$$(git rev-parse HEAD 2>/dev/null || echo "unknown"); \ docker buildx build \ --build-arg BUILD=oss \ --build-arg DATABASE=sqlite \ + --build-arg VERSION=$(tag) \ + --build-arg REVISION=$$REVISION \ + --build-arg CREATED=$$CREATED \ + --build-arg IMAGE_TITLE="Pangolin" \ + --build-arg IMAGE_DESCRIPTION="Identity-aware VPN and proxy for remote access to anything, anywhere" \ --platform linux/amd64 \ --tag fosrl/pangolin:$(tag)-amd64 \ --push . && \ docker buildx build \ --build-arg BUILD=oss \ --build-arg DATABASE=pg \ + --build-arg VERSION=$(tag) \ + --build-arg REVISION=$$REVISION \ + --build-arg CREATED=$$CREATED \ + --build-arg IMAGE_TITLE="Pangolin" \ + --build-arg IMAGE_DESCRIPTION="Identity-aware VPN and proxy for remote access to anything, anywhere" \ --platform linux/amd64 \ --tag fosrl/pangolin:postgresql-$(tag)-amd64 \ --push . && \ docker buildx build \ --build-arg BUILD=enterprise \ --build-arg DATABASE=sqlite \ + --build-arg VERSION=$(tag) \ + --build-arg REVISION=$$REVISION \ + --build-arg CREATED=$$CREATED \ + --build-arg LICENSE="Fossorial Commercial" \ + --build-arg IMAGE_TITLE="Pangolin EE" \ + --build-arg IMAGE_DESCRIPTION="Pangolin Enterprise Edition - Identity-aware VPN and proxy for remote access to anything, anywhere" \ --platform linux/amd64 \ --tag fosrl/pangolin:ee-$(tag)-amd64 \ --push . && \ docker buildx build \ --build-arg BUILD=enterprise \ --build-arg DATABASE=pg \ + --build-arg VERSION=$(tag) \ + --build-arg REVISION=$$REVISION \ + --build-arg CREATED=$$CREATED \ + --build-arg LICENSE="Fossorial Commercial" \ + --build-arg IMAGE_TITLE="Pangolin EE" \ + --build-arg IMAGE_DESCRIPTION="Pangolin Enterprise Edition - Identity-aware VPN and proxy for remote access to anything, anywhere" \ --platform linux/amd64 \ --tag fosrl/pangolin:ee-postgresql-$(tag)-amd64 \ --push . @@ -314,16 +457,52 @@ create-manifests-rc: echo "All RC multi-arch manifests created successfully!" build-arm: - docker buildx build --platform linux/arm64 -t fosrl/pangolin:latest . + @CREATED=$$(date -u +"%Y-%m-%dT%H:%M:%SZ"); \ + REVISION=$$(git rev-parse HEAD 2>/dev/null || echo "unknown"); \ + docker buildx build \ + --build-arg VERSION=dev \ + --build-arg REVISION=$$REVISION \ + --build-arg CREATED=$$CREATED \ + --build-arg IMAGE_TITLE="Pangolin" \ + --build-arg IMAGE_DESCRIPTION="Identity-aware VPN and proxy for remote access to anything, anywhere" \ + --platform linux/arm64 \ + -t fosrl/pangolin:latest . build-x86: - docker buildx build --platform linux/amd64 -t fosrl/pangolin:latest . + @CREATED=$$(date -u +"%Y-%m-%dT%H:%M:%SZ"); \ + REVISION=$$(git rev-parse HEAD 2>/dev/null || echo "unknown"); \ + docker buildx build \ + --build-arg VERSION=dev \ + --build-arg REVISION=$$REVISION \ + --build-arg CREATED=$$CREATED \ + --build-arg IMAGE_TITLE="Pangolin" \ + --build-arg IMAGE_DESCRIPTION="Identity-aware VPN and proxy for remote access to anything, anywhere" \ + --platform linux/amd64 \ + -t fosrl/pangolin:latest . dev-build-sqlite: - docker build --build-arg DATABASE=sqlite -t fosrl/pangolin:latest . + @CREATED=$$(date -u +"%Y-%m-%dT%H:%M:%SZ"); \ + REVISION=$$(git rev-parse HEAD 2>/dev/null || echo "unknown"); \ + docker build \ + --build-arg DATABASE=sqlite \ + --build-arg VERSION=dev \ + --build-arg REVISION=$$REVISION \ + --build-arg CREATED=$$CREATED \ + --build-arg IMAGE_TITLE="Pangolin" \ + --build-arg IMAGE_DESCRIPTION="Identity-aware VPN and proxy for remote access to anything, anywhere" \ + -t fosrl/pangolin:latest . dev-build-pg: - docker build --build-arg DATABASE=pg -t fosrl/pangolin:postgresql-latest . + @CREATED=$$(date -u +"%Y-%m-%dT%H:%M:%SZ"); \ + REVISION=$$(git rev-parse HEAD 2>/dev/null || echo "unknown"); \ + docker build \ + --build-arg DATABASE=pg \ + --build-arg VERSION=dev \ + --build-arg REVISION=$$REVISION \ + --build-arg CREATED=$$CREATED \ + --build-arg IMAGE_TITLE="Pangolin" \ + --build-arg IMAGE_DESCRIPTION="Identity-aware VPN and proxy for remote access to anything, anywhere" \ + -t fosrl/pangolin:postgresql-latest . test: docker run -it -p 3000:3000 -p 3001:3001 -p 3002:3002 -v ./config:/app/config fosrl/pangolin:latest diff --git a/package.json b/package.json index af6a8dde..9d8c409b 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "private": true, "type": "module", - "description": "Tunneled Reverse Proxy Management Server with Identity and Access Control and Dashboard UI", + "description": "Identity-aware VPN and proxy for remote access to anything, anywhere and Dashboard UI", "homepage": "https://github.com/fosrl/pangolin", "repository": { "type": "git",