diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5108f88..baef907 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -32,10 +32,55 @@ jobs: platforms: linux/amd64,linux/arm64 tags: | ghcr.io/${{ github.actor }}/3proxy:latest - ghcr.io/${{ github.actor }}/3proxy:${{ steps.slug.outputs.version-semantic }} + ghcr.io/${{ github.actor }}/3proxy:${{ steps.slug.outputs.version }} ghcr.io/${{ github.actor }}/3proxy:${{ steps.slug.outputs.version-major }}.${{ steps.slug.outputs.version-minor }} ghcr.io/${{ github.actor }}/3proxy:${{ steps.slug.outputs.version-major }} docker.io/tarampampam/3proxy:latest - docker.io/tarampampam/3proxy:${{ steps.slug.outputs.version-semantic }} + docker.io/tarampampam/3proxy:${{ steps.slug.outputs.version }} docker.io/tarampampam/3proxy:${{ steps.slug.outputs.version-major }}.${{ steps.slug.outputs.version-minor }} docker.io/tarampampam/3proxy:${{ steps.slug.outputs.version-major }} + + helm-pack: + name: Pack the Helm chart + runs-on: ubuntu-latest + defaults: {run: {working-directory: ./deployments/helm}} + steps: + - uses: actions/checkout@v4 + - uses: azure/setup-helm@v4 + - {uses: gacts/github-slug@v1, id: slug} + - run: | + helm package \ + --app-version "${{ steps.slug.outputs.version }}" \ + --version "${{ steps.slug.outputs.version }}" . + - uses: actions/upload-artifact@v4 + with: + name: helm-chart + path: ./deployments/helm/*.tgz + if-no-files-found: error + retention-days: 1 + + helm-publish: + name: Put the Helm chart to the GitHub pages branch + runs-on: ubuntu-latest + needs: [helm-pack] + steps: + - {uses: actions/checkout@v4, with: {ref: gh-pages}} + - uses: azure/setup-helm@v4 + - uses: actions/download-artifact@v4 + with: {name: helm-chart, path: ./helm-charts} + - name: Update the index.yaml + run: | + helm repo index \ + --url https://${{ github.actor }}.github.io/${{ github.event.repository.name }}/helm-charts/ \ + --merge \ + ./helm-charts/index.yaml \ + ./helm-charts + - uses: yKicchan/generate-directory-listing-action@v1 + with: {target: ., ignore: "**/index.html", override: true} + - name: Commit and push the changes + run: | + git config user.name "${{ github.actor }}" + git config user.email "${{ github.actor }}@users.noreply.github.com" + git add . + git commit -m "Helm chart release" + git push origin gh-pages diff --git a/README.md b/README.md index a9dc6d4..1e28b95 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,12 @@ Image: ghcr.io/tarampampam/3proxy:1.8.2 | `EXTRA_CONFIG` | Additional 3proxy configuration (appended to the **end** of the config file, but before `proxy` and `flush`) | `# line 1\n# line 2` | | `LOG_OUTPUT` | Path for log output (`/dev/stdout` by default; set to `/dev/null` to disable logging) | `/tmp/3proxy.log` | +## Helm Chart + +To install it on Kubernetes (K8s), please use the Helm chart from [ArtifactHUB][artifact-hub]. + +[artifact-hub]:https://artifacthub.io/packages/helm/proxy-3proxy/proxy-3proxy + ## How to Use This Image Example usage: diff --git a/deployments/helm/Chart.yaml b/deployments/helm/Chart.yaml index 7ee94a2..e99d7b3 100644 --- a/deployments/helm/Chart.yaml +++ b/deployments/helm/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: proxy-3proxy -description: Tiny free proxy server +description: Powerful and lightweight proxy server, written in pure C type: application version: 0.0.0 # will be replaced by the release workflow diff --git a/deployments/helm/values.schema.json b/deployments/helm/values.schema.json index 4cc6774..0916678 100644 --- a/deployments/helm/values.schema.json +++ b/deployments/helm/values.schema.json @@ -42,6 +42,7 @@ "type": "object", "properties": { "enabled": {"type": "boolean"}, + "kind": {"type": "string"}, "replicas": {"type": "integer"}, "podAnnotations": { "type": "object", @@ -72,6 +73,7 @@ "probe": { "type": "object", "properties": { + "port": {"type": "string", "enum": ["http", "socks"]}, "interval": {"type": "integer"}, "initialDelay": {"type": "integer"} } @@ -192,7 +194,13 @@ {"type": "null"} ] }, - "port": {"type": "integer", "minimum": 1, "maximum": 65535} + "ports": { + "type": "object", + "properties": { + "http": {"type": "integer", "minimum": 1, "maximum": 65535}, + "socks": {"type": "integer", "minimum": 1, "maximum": 65535} + } + } } }, "ingress": { @@ -240,6 +248,120 @@ } } }, - "config": {} + "config": { + "type": "object", + "properties": { + "log": { + "type": "object", + "properties": { + "enabled": {"type": "boolean"}, + "output": { + "oneOf": [ + {"type": "string", "minLength": 2, "examples": ["/dev/stdout"]}, + {"type": "null"} + ] + } + } + }, + "auth": { + "type": "object", + "properties": { + "login": { + "type": "object", + "properties": { + "plain": { + "oneOf": [ + {"type": "string", "minLength": 1}, + {"type": "null"} + ] + }, + "fromSecret": { + "type": "object", + "properties": { + "enabled": {"type": "boolean"}, + "secretName": {"oneOf": [{"type": "string", "minLength": 1}, {"type": "null"}]}, + "secretKey": {"oneOf": [{"type": "string", "minLength": 1}, {"type": "null"}]} + } + }, + "fromConfigMap": { + "type": "object", + "properties": { + "enabled": {"type": "boolean"}, + "configMapName": {"oneOf": [{"type": "string", "minLength": 1}, {"type": "null"}]}, + "configMapKey": {"oneOf": [{"type": "string", "minLength": 1}, {"type": "null"}]} + } + } + } + }, + "password": { + "type": "object", + "properties": { + "plain": { + "oneOf": [ + {"type": "string", "minLength": 1}, + {"type": "null"} + ] + }, + "fromSecret": { + "type": "object", + "properties": { + "enabled": {"type": "boolean"}, + "secretName": {"oneOf": [{"type": "string", "minLength": 1}, {"type": "null"}]}, + "secretKey": {"oneOf": [{"type": "string", "minLength": 1}, {"type": "null"}]} + } + }, + "fromConfigMap": { + "type": "object", + "properties": { + "enabled": {"type": "boolean"}, + "configMapName": {"oneOf": [{"type": "string", "minLength": 1}, {"type": "null"}]}, + "configMapKey": {"oneOf": [{"type": "string", "minLength": 1}, {"type": "null"}]} + } + } + } + }, + "extraAccounts": { + "type": "object", + "properties": { + "plain": { + "type": "object", + "additionalProperties": {"type": "string", "minLength": 1} + }, + "fromSecret": { + "type": "object", + "properties": { + "enabled": {"type": "boolean"}, + "secretName": {"oneOf": [{"type": "string", "minLength": 1}, {"type": "null"}]}, + "secretKey": {"oneOf": [{"type": "string", "minLength": 1}, {"type": "null"}]} + } + }, + "fromConfigMap": { + "type": "object", + "properties": { + "enabled": {"type": "boolean"}, + "configMapName": {"oneOf": [{"type": "string", "minLength": 1}, {"type": "null"}]}, + "configMapKey": {"oneOf": [{"type": "string", "minLength": 1}, {"type": "null"}]} + } + } + } + } + } + }, + "dns": { + "type": "object", + "properties": { + "primaryResolver": {"oneOf": [{"type": "string", "minLength": 1}, {"type": "null"}]}, + "secondaryResolver": {"oneOf": [{"type": "string", "minLength": 1}, {"type": "null"}]} + } + }, + "limits": { + "type": "object", + "properties": { + "maxConnections": {"oneOf": [{"type": "integer", "minimum": 1}, {"type": "null"}]} + } + }, + "extraConfig": {"oneOf": [{"type": "string", "minLength": 1}, {"type": "null"}]} + } + } } } diff --git a/deployments/helm/values.yaml b/deployments/helm/values.yaml index b300377..35dc58c 100644 --- a/deployments/helm/values.yaml +++ b/deployments/helm/values.yaml @@ -17,7 +17,7 @@ deployment: # -- Enable deployment enabled: true # -- The deployment kind - kind: Deployment # TODO: add into schema + kind: Deployment # -- How many replicas to run replicas: 1 # -- Additional pod annotations (e.g. for mesh injection or prometheus scraping) @@ -36,7 +36,8 @@ deployment: runAsUser: 10001 # as defined in the Dockerfile runAsGroup: 10001 # as defined in the Dockerfile probe: - port: http # or socks # TODO: add into schema + # -- The port to probe (containerPort, "http" or "socks") + port: http # -- How often (in seconds) to perform the probe interval: 10 # -- Number of seconds after the container has started before liveness probes are initiated @@ -75,7 +76,7 @@ service: externalName: null # -- Sets the port, more information can be found here: # https://kubernetes.io/docs/concepts/services-networking/service/#field-spec-ports - ports: # TODO: add into schema + ports: # -- The port number for the proxy to listen on http: 3128 # -- The same, but for socks proxy