Compare commits

...

No commits in common. "gh-pages" and "master" have entirely different histories.

33 changed files with 1452 additions and 99 deletions

6
.dockerignore Normal file
View File

@ -0,0 +1,6 @@
## Ignore everything
*
## Except the following files (and directories)
!/3proxy.cfg.json
!/3proxy.cfg.mustach

15
.editorconfig Normal file
View File

@ -0,0 +1,15 @@
# EditorConfig docs: <https://editorconfig.org/>
root = true
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 2
trim_trailing_whitespace = true
[{*.yml,*.yaml}]
ij_any_spaces_within_braces = false
ij_any_spaces_within_brackets = false

3
.github/CODEOWNERS vendored Normal file
View File

@ -0,0 +1,3 @@
# @link <https://help.github.com/en/articles/about-code-owners>
* @tarampampam

17
.github/dependabot.yml vendored Normal file
View File

@ -0,0 +1,17 @@
# yaml-language-server: $schema=https://json.schemastore.org/dependabot-2.0.json
# docs: https://docs.github.com/en/free-pro-team@latest/github/administering-a-repository/customizing-dependency-updates
version: 2
updates:
- package-ecosystem: github-actions
directory: /
groups: {github-actions: {patterns: ['*']}}
schedule: {interval: monthly}
assignees: [tarampampam]
- package-ecosystem: docker
directory: /
groups: {docker: {patterns: ['*']}}
schedule: {interval: monthly}
assignees: [tarampampam]

13
.github/release.yml vendored Normal file
View File

@ -0,0 +1,13 @@
# yaml-language-server: $schema=https://json.schemastore.org/github-release-config.json
# docs: https://docs.github.com/en/repositories/releasing-projects-on-github/automatically-generated-release-notes
changelog:
categories:
- title: 🛠 Fixes
labels: [type:fix, type:bug]
- title: 🚀 Features
labels: [type:feature, type:feature_request]
- title: 📦 Dependency updates
labels: [dependencies]
- title: Other Changes
labels: ['*']

7
.github/renovate.json vendored Normal file
View File

@ -0,0 +1,7 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"github>tarampampam/.github//renovate/default",
":rebaseStalePrs"
]
}

22
.github/workflows/documentation.yml vendored Normal file
View File

@ -0,0 +1,22 @@
# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json
# docs: https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions
name: 📚 Documentation
on:
push:
branches: [master, main]
paths: ['README.md']
jobs:
docker-hub-description:
name: Docker Hub Description
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: peter-evans/dockerhub-description@v4
with:
username: ${{ secrets.DOCKER_LOGIN }}
password: ${{ secrets.DOCKER_USER_PASSWORD }}
repository: tarampampam/3proxy

86
.github/workflows/release.yml vendored Normal file
View File

@ -0,0 +1,86 @@
# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json
# docs: https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions
name: 🚀 Release
on:
release: {types: [published]}
workflow_dispatch: {}
jobs:
build-docker-image:
name: Build the docker image
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_LOGIN }}
password: ${{ secrets.DOCKER_PASSWORD }}
- uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- {uses: gacts/github-slug@v1, id: slug}
- uses: docker/setup-qemu-action@v3
- uses: docker/setup-buildx-action@v3
- uses: docker/build-push-action@v6
with:
context: .
push: true
platforms: linux/amd64,linux/arm64
tags: |
ghcr.io/${{ github.actor }}/3proxy:latest
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 }}
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
needs: [build-docker-image]
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: gacts/directory-listing@v1, with: {overwrite: 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

114
.github/workflows/tests.yml vendored Normal file
View File

@ -0,0 +1,114 @@
# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json
# docs: https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions
name: 🧪 Tests
on:
workflow_dispatch: {}
push:
branches: [master, main]
paths-ignore: ['**.md']
tags-ignore: ['**']
pull_request:
paths-ignore: ['**.md']
concurrency:
group: ${{ github.ref }}
cancel-in-progress: true
jobs:
gitleaks:
name: Check for GitLeaks
runs-on: ubuntu-latest
steps:
- {uses: actions/checkout@v4, with: {fetch-depth: 0}}
- uses: gacts/gitleaks@v1
lint-charts:
name: Lint the chart
runs-on: ubuntu-latest
defaults: {run: {working-directory: ./deployments/helm}}
steps:
- uses: actions/checkout@v4
- uses: azure/setup-helm@v4
- run: helm dependency update .
- run: helm template . > /dev/null
- run: helm lint --strict .
build-image:
name: Build the docker image
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: docker build -f ./Dockerfile --tag 3proxy:local .
- run: docker save 3proxy:local > ./docker-image.tar
- uses: actions/upload-artifact@v4
with:
name: docker-image
path: ./docker-image.tar
retention-days: 1
try-to-use:
name: Try to use the docker image (auth ${{ matrix.auth }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
auth: [yes, no]
needs: [build-image]
steps:
- uses: actions/download-artifact@v4
with:
name: docker-image
path: .artifact
- working-directory: .artifact
run: docker load < docker-image.tar
- if: matrix.auth != 'yes'
run: docker run --rm -d -p "3128:3128/tcp" -p "1080:1080/tcp" 3proxy:local
- if: matrix.auth == 'yes'
run: docker run --rm -d -p "3128:3128/tcp" -p "1080:1080/tcp" -e "PROXY_LOGIN=evil" -e "PROXY_PASSWORD=live" -e 'EXTRA_ACCOUNTS={"foo":"bar"}' 3proxy:local
- run: sleep 3
- name: Try to use HTTP proxy
if: matrix.auth != 'yes'
run: |
curl -v --fail \
--proxy http://127.0.0.1:3128 \
--connect-timeout 3 \
--max-time 3 \
https://www.cloudflare.com/robots.txt
- name: Try to use SOCKS proxy
if: matrix.auth != 'yes'
run: |
curl -v --fail \
--proxy socks5://127.0.0.1:1080 \
--connect-timeout 3 \
--max-time 3 \
https://www.cloudflare.com/robots.txt
- name: Try to use HTTP proxy (with auth)
if: matrix.auth == 'yes'
run: |
curl -v --fail \
--proxy http://127.0.0.1:3128 \
--proxy-user evil:live \
--connect-timeout 3 \
--max-time 3 \
https://www.cloudflare.com/robots.txt
- name: Try to use HTTP proxy (with auth, extra user)
if: matrix.auth == 'yes'
run: |
curl -v --fail \
--proxy http://127.0.0.1:3128 \
--proxy-user foo:bar \
--connect-timeout 3 \
--max-time 3 \
https://www.cloudflare.com/robots.txt
- name: Try to use SOCKS proxy (with auth)
if: matrix.auth == 'yes'
run: |
curl -v --fail \
--proxy socks5://127.0.0.1:1080 \
--proxy-user evil:live \
--connect-timeout 3 \
--max-time 3 \
https://www.cloudflare.com/robots.txt
- run: docker stop $(docker ps -a --filter ancestor=3proxy:local -q)

3
.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
## IDEs
/.vscode
/.idea

View File

24
3proxy.cfg.json Normal file
View File

@ -0,0 +1,24 @@
{
"log": {
"output": "${LOG_OUTPUT:-/dev/stdout}"
},
"name_servers": [
"${PRIMARY_RESOLVER:-1.0.0.1}",
"${SECONDARY_RESOLVER:-8.8.4.4}",
"1.1.1.1",
"9.9.9.9",
"8.8.8.8"
],
"name_servers_cache": 65536,
"max_connections": "${MAX_CONNECTIONS:-1024}",
"auth": {
"login": "${PROXY_LOGIN:-}",
"password": "${PROXY_PASSWORD:-}",
"extra_accounts": ${EXTRA_ACCOUNTS:-{}}
},
"ports": {
"proxy": "${PROXY_PORT:-3128}",
"socks": "${SOCKS_PORT:-1080}"
},
"extra_config": "${EXTRA_CONFIG}"
}

44
3proxy.cfg.mustach Normal file
View File

@ -0,0 +1,44 @@
#!/bin/3proxy
config /etc/3proxy/3proxy.cfg
system "echo `which 3proxy`': Starting 3proxy'"
{{#name_servers}}
nserver {{ . }}
{{/name_servers}}
nscache {{ name_servers_cache }}
timeouts 1 5 30 60 180 1800 15 60
log {{ log.output }}
logformat "-\""+_G{""time_unix"":%t, ""proxy"":{""type:"":""%N"", ""port"":%p}, ""error"":{""code"":""%E""}, ""auth"":{""user"":""%U""}, ""client"":{""ip"":""%C"", ""port"":%c}, ""server"":{""ip"":""%R"", ""port"":%r}, ""bytes"":{""sent"":%O, ""received"":%I}, ""request"":{""hostname"":""%n""}, ""message"":""%T""}"
maxconn {{ max_connections }}
{{#auth.login}}
{{#auth.password}}
users {{ auth.login }}:CL:{{ auth.password }}
auth strong
allow {{ auth.login }}
{{/auth.password}}
{{/auth.login}}
# Listen on both IPv4 and IPv6 for incoming and outgoing traffic
external 0.0.0.0
external ::
internal 0.0.0.0
internal ::
{{#extra_config}}
# Additional configuration
{{extra_config}}
{{/extra_config}}
# IPv4 & IPv6 Support for SOCKS5 & HTTP
proxy -a -p{{ ports.proxy }}
socks -a -p{{ ports.socks }}
proxy -6 -a -p{{ ports.proxy }}
socks -6 -a -p{{ ports.socks }}
flush

91
Dockerfile Normal file
View File

@ -0,0 +1,91 @@
# syntax=docker/dockerfile:1
FROM docker.io/library/gcc:15.1.0 AS builder
# renovate: source=github-tags name=3proxy/3proxy
ARG Z3PROXY_VERSION=0.9.5
# Fetch 3proxy sources
RUN set -x \
&& git -c advice.detachedHead=false clone --depth 1 --branch "${Z3PROXY_VERSION}" https://github.com/3proxy/3proxy.git /tmp/3proxy
WORKDIR /tmp/3proxy
# Patch sources
RUN set -x \
&& echo '#define ANONYMOUS 1' >> ./src/3proxy.h \
# proxy.c source: <https://github.com/3proxy/3proxy/blob/0.9.3/src/proxy.c>
&& sed -i 's~\(<\/head>\)~<style>:root{--color-bg-primary:#fff;--color-text-primary:#131313;--color-text-secondary:#232323}\
@media (prefers-color-scheme: dark){:root{--color-bg-primary:#212121;--color-text-primary:#fafafa;--color-text-secondary:#bbb}}\
html,body{height:100%;font-family:sans-serif;background-color:var(--color-bg-primary);color:var(--color-text-primary);margin:0;\
padding:0;text-align:center}body{align-items:center;display:flex;justify-content:center;flex-direction:column;height:100vh}\
h1,h2{margin-bottom:0;font-size:2.5em}h2::before{content:'"'"'Proxy error'"'"';display:block;font-size:.4em;\
color:var(--color-text-secondary);font-weight:100}h3,p{color:var(--color-text-secondary)}</style>\1~' ./src/proxy.c \
&& cat ./src/proxy.c | grep '</head>'
# And compile
RUN set -x \
&& echo "" >> ./Makefile.Linux \
&& echo "PLUGINS = StringsPlugin TrafficPlugin PCREPlugin TransparentPlugin SSLPlugin" >> ./Makefile.Linux \
&& echo "LIBS = -l:libcrypto.a -l:libssl.a -ldl" >> ./Makefile.Linux \
&& make -f Makefile.Linux \
&& strip ./bin/3proxy \
&& strip ./bin/StringsPlugin.ld.so \
&& strip ./bin/TrafficPlugin.ld.so \
&& strip ./bin/PCREPlugin.ld.so \
&& strip ./bin/TransparentPlugin.ld.so \
&& strip ./bin/SSLPlugin.ld.so \
&& cp /lib/$(gcc -dumpmachine)/libdl.so.* /tmp/3proxy/
# Prepare filesystem for 3proxy running
FROM docker.io/library/alpine:latest AS buffer
# create a directory for the future root filesystem
WORKDIR /tmp/rootfs
# prepare the root filesystem
RUN set -x \
&& mkdir -p ./etc ./bin ./usr/local/3proxy/libexec ./etc/3proxy \
&& echo '3proxy:x:10001:10001::/nonexistent:/sbin/nologin' > ./etc/passwd \
&& echo '3proxy:x:10001:' > ./etc/group \
&& apk add --no-cache --virtual .build-deps curl ca-certificates \
&& update-ca-certificates \
&& curl -SsL -o ./bin/dumb-init "https://github.com/Yelp/dumb-init/releases/download/v1.2.5/dumb-init_1.2.5_$(arch)" \
&& chmod +x ./bin/dumb-init \
&& apk del .build-deps
COPY --from=builder /tmp/3proxy/libdl.so.* ./lib/
COPY --from=builder /tmp/3proxy/bin/3proxy ./bin/3proxy
COPY --from=builder /tmp/3proxy/bin/*.ld.so ./usr/local/3proxy/libexec/
COPY --from=ghcr.io/tarampampam/mustpl:0.1.1 /bin/mustpl ./bin/mustpl
COPY 3proxy.cfg.json ./etc/3proxy/3proxy.cfg.json
COPY 3proxy.cfg.mustach ./etc/3proxy/3proxy.cfg.mustach
RUN chown -R 10001:10001 ./etc/3proxy
# Merge into a single layer
FROM docker.io/library/busybox:stable-glibc
LABEL \
org.opencontainers.image.title="3proxy" \
org.opencontainers.image.description="Tiny free proxy server" \
org.opencontainers.image.url="https://github.com/tarampampam/3proxy-docker" \
org.opencontainers.image.source="https://github.com/tarampampam/3proxy-docker" \
org.opencontainers.image.vendor="Tarampampam" \
org.opencontainers.image.licenses="WTFPL"
# Import from builder
COPY --from=buffer /tmp/rootfs /
# Use an unprivileged user
USER 3proxy:3proxy
ENTRYPOINT [ \
"/bin/mustpl", \
"-f", "/etc/3proxy/3proxy.cfg.json", \
"-o", "/etc/3proxy/3proxy.cfg", \
"/etc/3proxy/3proxy.cfg.mustach", \
"--", "/bin/dumb-init" \
]
CMD ["/bin/3proxy", "/etc/3proxy/3proxy.cfg"]

9
LICENSE Normal file
View File

@ -0,0 +1,9 @@
Copyright (C) tarampampam <github.com/tarampampam>
Everyone is permitted to copy and distribute verbatim or modified copies of this license
document, and changing it is allowed as long as the name is changed.
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING,
DISTRIBUTION AND MODIFICATION
0. You just DO WHAT THE FUCK YOU WANT TO.

141
README.md
View File

@ -1,3 +1,138 @@
> [!TIP]
> This branch contains content that is available via GitHub Pages
> here - [tarampampam.github.io/3proxy-docker](https://tarampampam.github.io/3proxy-docker/)
# This is a fork of
https://github.com/tarampampam/3proxy-docker
# Docker image with [3proxy][link_3proxy]
3proxy is a powerful and lightweight proxy server. This image includes the stable version and can be easily
configured using environment variables. By default, it operates with anonymous proxy settings to hide client
information and logs activity in JSON format.
> Page on `hub.docker.com` can be [found here][link_docker_hub].
TCP ports:
| Port number | Description |
|-------------|---------------------------------------------------------|
| `3128` | [HTTP proxy](https://3proxy.org/doc/man8/proxy.8.html) |
| `1080` | [SOCKS proxy](https://3proxy.org/doc/man8/socks.8.html) |
## Supported tags
| Registry | Image |
|----------------------------------------|------------------------------|
| [GitHub Container Registry][link_ghcr] | `ghcr.io/tarampampam/3proxy` |
| [Docker Hub][link_docker_hub] (mirror) | `tarampampam/3proxy` |
> [!NOTE]
> Its recommended to avoid using the `latest` tag, as **major** upgrades may include breaking changes.
> Instead, use specific tags in `X.Y.Z` format for version consistency.
All supported image tags can be [found here][link_docker_tags].
> Starting with version 1.8.2, the `arm64` architecture is supported (in addition to `amd64`):
```shell
docker run --rm mplatform/mquery ghcr.io/tarampampam/3proxy:1.8.2
Image: ghcr.io/tarampampam/3proxy:1.8.2
* Manifest List: Yes (Image type: application/vnd.docker.distribution.manifest.list.v2+json)
* Supported platforms:
- linux/amd64
- linux/arm64
```
## Supported Environment Variables
| Variable Name | Description | Example |
|----------------------|-----------------------------------------------------------------------------------------------------------------------|-----------------------------------|
| `PROXY_LOGIN` | Authorization login (empty by default) | `username` |
| `PROXY_PASSWORD` | Authorization password (empty by default) | `password` |
| `EXTRA_ACCOUNTS` | Additional proxy users (JSON object format) | `{"evil":"live", "guest":"pass"}` |
| `PRIMARY_RESOLVER` | Primary DNS resolver (`1.0.0.1` by default) | `8.8.8.8:5353/tcp` |
| `SECONDARY_RESOLVER` | Secondary DNS resolver (`8.8.4.4` by default) | `2001:4860:4860::8844` |
| `MAX_CONNECTIONS` | Maximum number of connections (`1024` by default) | `2056` |
| `PROXY_PORT` | HTTP proxy port (`3128` by default) | `8080` |
| `SOCKS_PORT` | SOCKS proxy port (`1080` by default) | `8888` |
| `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:
```bash
docker run --rm -d \
-p "3128:3128/tcp" \
-p "1080:1080/tcp" \
ghcr.io/tarampampam/3proxy:1
```
With authentication and custom resolver settings:
```bash
docker run --rm -d \
-p "3128:3128/tcp" \
-p "1080:1080/tcp" \
-e "PROXY_LOGIN=evil" \
-e "PROXY_PASSWORD=live" \
-e "PRIMARY_RESOLVER=2001:4860:4860::8888" \
ghcr.io/tarampampam/3proxy:1
```
Docker compose example:
```yaml
services:
3proxy:
image: ghcr.io/tarampampam/3proxy:1
environment:
PROXY_LOGIN: evil
PROXY_PASSWORD: live
MAX_CONNECTIONS: 10000
PROXY_PORT: 8000
SOCKS_PORT: 8001
PRIMARY_RESOLVER: 77.88.8.8
SECONDARY_RESOLVER: 8.8.8.8
ports:
- '8000:8000/tcp'
- '8001:8001/tcp'
```
## Releasing
Publishing a new version is straightforward:
1. Make the necessary changes in this repository.
2. "Publish" a new release on the repository's releases page.
Docker images will be automatically built and published.
> Note: The `latest` tag will be overwritten in both registries when a new release is published.
## Support
[![Issues][badge_issues]][link_issues]
[![Issues][badge_pulls]][link_pulls]
If you encounter any issues, please [open an issue][link_create_issue] in this repository.
## License
This project is licensed under the WTFPL. Use it freely and enjoy!
[badge_issues]:https://img.shields.io/github/issues/tarampampam/3proxy-docker.svg?style=flat-square&maxAge=180
[badge_pulls]:https://img.shields.io/github/issues-pr/tarampampam/3proxy-docker.svg?style=flat-square&maxAge=180
[link_issues]:https://github.com/tarampampam/3proxy-docker/issues
[link_pulls]:https://github.com/tarampampam/3proxy-docker/pulls
[link_create_issue]:https://github.com/tarampampam/3proxy-docker/issues/new
[link_docker_tags]:https://hub.docker.com/r/tarampampam/3proxy/tags
[link_docker_hub]:https://hub.docker.com/r/tarampampam/3proxy/
[link_ghcr]:https://github.com/tarampampam/3proxy-docker/pkgs/container/3proxy
[link_3proxy]:https://github.com/3proxy/3proxy

View File

@ -0,0 +1,13 @@
# yaml-language-server: $schema=https://json.schemastore.org/chart.json
apiVersion: v2
name: proxy-3proxy
description: Powerful and lightweight proxy server, written in pure C
type: application
version: 0.0.0 # will be replaced by the release workflow
appVersion: 0.0.0 # will be replaced by the release workflow
icon: https://github.com/user-attachments/assets/023186cf-b153-459c-8417-038fd87a2065
home: https://github.com/3proxy/3proxy
sources: [https://github.com/tarampampam/3proxy-docker]
keywords: [proxy, 3proxy, http, socks]

View File

@ -0,0 +1,35 @@
# 3proxy
Important note: Since the chart is released together with the app under the same version (i.e., the chart version
matches the app version), its versioning is not compatible with semantic versioning (SemVer). I will do my best to
avoid non-backward-compatible changes in the chart, but due to Murphy's Law, I cannot guarantee that they will
never occur.
Also, this chart does not include Ingress configuration. If you need it, please, create it manually.
## Usage
```shell
helm repo add proxy-3proxy https://tarampampam.github.io/3proxy-docker/helm-charts
helm repo update
helm install my-3proxy proxy-3proxy/proxy-3proxy --version <version_here>
```
Alternatively, add the following lines to your `Chart.yaml`:
```yaml
dependencies:
- name: proxy-3proxy
version: <version_here>
repository: https://tarampampam.github.io/3proxy-docker/helm-charts
```
And override the default values in your `values.yaml`:
```yaml
proxy-3proxy:
# ...
service: {ports: {http: 3128}}
# ...
```

View File

@ -0,0 +1,52 @@
{{/* Define namespace of chart, useful for multi-namespace deployments */}}
{{- define "proxy-3proxy.namespace" -}}
{{- if .Values.namespaceOverride }}
{{- .Values.namespaceOverride }}
{{- else }}
{{- .Release.Namespace }}
{{- end }}
{{- end }}
{{/* Expand the name of the chart */}}
{{- define "proxy-3proxy.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
Create a default fully qualified app name.
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
If release name contains chart name it will be used as a full name.
*/}}
{{- define "proxy-3proxy.fullname" -}}
{{- if .Values.fullnameOverride }}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- $name := default .Chart.Name .Values.nameOverride }}
{{- if contains $name .Release.Name }}
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- end }}
{{- end }}
{{/* Create chart name and version as used by the chart label */}}
{{- define "proxy-3proxy.chart" -}}
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/* Common labels */}}
{{- define "proxy-3proxy.commonLabels" -}}
helm.sh/chart: {{ include "proxy-3proxy.chart" . }}
{{ include "proxy-3proxy.selectorLabels" . }}
{{- if .Chart.AppVersion }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}
{{/* Selector labels */}}
{{- define "proxy-3proxy.selectorLabels" -}}
app.kubernetes.io/name: {{ include "proxy-3proxy.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}

View File

@ -0,0 +1,194 @@
{{- if .Values.deployment.enabled }}
apiVersion: apps/v1
kind: {{ .Values.deployment.kind | default "Deployment" }}
metadata:
name: {{ include "proxy-3proxy.fullname" . }}
namespace: {{ template "proxy-3proxy.namespace" . }}
labels:
{{- include "proxy-3proxy.commonLabels" . | nindent 4 }}
spec:
{{- with .Values.deployment }}
replicas: {{ .replicas | default 1 }}
selector:
matchLabels:
{{- include "proxy-3proxy.selectorLabels" $ | nindent 6 }}
template:
metadata:
{{- with .podAnnotations }}
annotations:
{{- tpl (toYaml .) $ | nindent 8 }}
{{- end }}
labels:
{{- include "proxy-3proxy.commonLabels" $ | nindent 8 }}
{{- with .labels }}
{{- tpl (toYaml .) $ | nindent 8 }}
{{- end }}
spec:
automountServiceAccountToken: false
{{- with .imagePullSecrets }}
imagePullSecrets:
{{- tpl (toYaml .) $ | nindent 8 }}
{{- end }}
containers:
- name: {{ include "proxy-3proxy.fullname" $ }}
{{- with .securityContext }}
securityContext:
{{- toYaml . | nindent 12 }}
readOnlyRootFilesystem: false
{{- end }}
{{- with $.Values.image }}
image: "{{ .repository }}:{{ .tag | default $.Chart.AppVersion }}"
imagePullPolicy: {{ .pullPolicy | default "IfNotPresent" }}
{{- end }}
ports:
- name: http
containerPort: 3128
protocol: TCP
- name: socks
containerPort: 1080
protocol: TCP
env:
- {name: PROXY_PORT, value: "3128"}
- {name: SOCKS_PORT, value: "1080"}
{{- with $.Values.config }}
{{- with .log }}
{{- $logOutputEnvName := "LOG_OUTPUT" }}
{{- if eq .enabled false }}
- {name: {{ $logOutputEnvName }}, value: "/dev/null"}
{{- else if .output }}
- {name: {{ $logOutputEnvName }}, value: "{{ .output }}"}
{{- end }}
{{- end }}
{{- with .auth.login }}
{{- $authLoginEnvName := "PROXY_LOGIN" }}
{{- if .plain }}
- {name: {{ $authLoginEnvName }}, value: "{{ .plain }}"}
{{- else if .fromSecret.enabled }}
- name: {{ $authLoginEnvName }}
valueFrom:
secretKeyRef:
name: {{ tpl .fromSecret.secretName $ | quote }}
key: {{ tpl .fromSecret.secretKey $ | quote }}
{{- else if .fromConfigMap.enabled }}
- name: {{ $authLoginEnvName }}
valueFrom:
configMapKeyRef:
name: {{ tpl .fromConfigMap.configMapName $ | quote }}
key: {{ tpl .fromConfigMap.configMapKey $ | quote }}
{{- end }}
{{- end }}
{{- with .auth.password }}
{{- $authPasswordEnvName := "PROXY_PASSWORD" }}
{{- if .plain }}
- {name: {{ $authPasswordEnvName }}, value: "{{ .plain }}"}
{{- else if .fromSecret.enabled }}
- name: {{ $authPasswordEnvName }}
valueFrom:
secretKeyRef:
name: {{ tpl .fromSecret.secretName $ | quote }}
key: {{ tpl .fromSecret.secretKey $ | quote }}
{{- else if .fromConfigMap.enabled }}
- name: {{ $authPasswordEnvName }}
valueFrom:
configMapKeyRef:
name: {{ tpl .fromConfigMap.configMapName $ | quote }}
key: {{ tpl .fromConfigMap.configMapKey $ | quote }}
{{- end }}
{{- end }}
{{- with .auth.extraAccounts }}
{{- $extraAuthAccountsEnvName := "EXTRA_ACCOUNTS" }}
{{- if .plain }}
- name: {{ $extraAuthAccountsEnvName }}
value: >-
{{ .plain | toJson }}
{{- else if .fromSecret.enabled }}
- name: {{ $extraAuthAccountsEnvName }}
valueFrom:
secretKeyRef:
name: {{ tpl .fromSecret.secretName $ | quote }}
key: {{ tpl .fromSecret.secretKey $ | quote }}
{{- else if .fromConfigMap.enabled }}
- name: {{ $extraAuthAccountsEnvName }}
valueFrom:
configMapKeyRef:
name: {{ tpl .fromConfigMap.configMapName $ | quote }}
key: {{ tpl .fromConfigMap.configMapKey $ | quote }}
{{- end }}
{{- end }}
{{- if .dns.primaryResolver }}
- {name: PRIMARY_RESOLVER, value: "{{ .dns.primaryResolver }}"}
{{- end }}
{{- if .dns.secondaryResolver }}
- {name: SECONDARY_RESOLVER, value: "{{ .dns.secondaryResolver }}"}
{{- end }}
{{- if ne .limits.maxConnections nil }}
- {name: MAX_CONNECTIONS, value: "{{ .limits.maxConnections }}"}
{{- end }}
{{- if .extraConfig }}
- name: EXTRA_CONFIG
value: >-
{{ .extraConfig }}
{{- end }}
{{- with $.Values.deployment.env }}
{{- tpl (toYaml .) $ | nindent 12 }}
{{- end }}
{{- end }}
{{- with .args }}
args:
{{- tpl (toYaml .) $ | nindent 12 }}
{{- end }}
{{- with .probe }}
livenessProbe:
tcpSocket: {port: "{{ .port }}"}
periodSeconds: {{ .interval }}
initialDelaySeconds: {{ .initialDelay }}
readinessProbe:
tcpSocket: {port: "{{ .port }}"}
periodSeconds: {{ .interval }}
initialDelaySeconds: {{ .initialDelay }}
{{- end }}
{{- with .resources }}
resources:
{{- toYaml . | nindent 12 }}
{{- end }}
{{- with .volumeMounts }}
volumeMounts:
{{- tpl (toYaml .) $ | nindent 12 }}
{{- end }}
{{- with .volumes }}
volumes:
{{- tpl (toYaml .) $ | nindent 8 }}
{{- end }}
{{- with .nodeSelector }}
nodeSelector:
{{- tpl (toYaml .) $ | nindent 8 }}
{{- end }}
{{- with .affinity }}
affinity:
{{- tpl (toYaml .) $ | nindent 8 }}
{{- end }}
{{- with .tolerations }}
tolerations:
{{- tpl (toYaml .) $ | nindent 8 }}
{{- end }}
{{- end }}
{{- end }}

View File

@ -0,0 +1,29 @@
{{- if .Values.service.enabled }}
apiVersion: v1
kind: Service
metadata:
name: {{ include "proxy-3proxy.fullname" . }}
namespace: {{ template "proxy-3proxy.namespace" . }}
labels:
{{- include "proxy-3proxy.commonLabels" . | nindent 4 }}
spec:
{{- with .Values.service }}
type: {{ .type }}
{{- with .externalName }}
externalName: {{ . }}
{{- end }}
ports:
- name: http
port: {{ .ports.http }}
targetPort: http
protocol: TCP
- name: socks
port: {{ .ports.socks }}
targetPort: socks
protocol: TCP
selector:
{{- include "proxy-3proxy.selectorLabels" $ | nindent 4 }}
{{- end }}
{{- end }}

View File

@ -0,0 +1,367 @@
{
"$schema": "https://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"nameOverride": {
"oneOf": [
{"type": "string", "minLength": 1},
{"type": "null"}
]
},
"fullnameOverride": {
"oneOf": [
{"type": "string", "minLength": 1},
{"type": "null"}
]
},
"namespaceOverride": {
"oneOf": [
{"type": "string", "minLength": 1},
{"type": "null"}
]
},
"image": {
"type": "object",
"properties": {
"repository": {"type": "string", "minLength": 1},
"tag": {
"oneOf": [
{"type": "string", "minLength": 1},
{"type": "null"}
]
},
"pullPolicy": {
"oneOf": [
{"type": "string", "enum": ["Always", "IfNotPresent", "Never"]},
{"type": "null"}
]
}
}
},
"deployment": {
"type": "object",
"properties": {
"enabled": {"type": "boolean"},
"kind": {"type": "string"},
"replicas": {"type": "integer"},
"podAnnotations": {
"type": "object",
"additionalProperties": {"type": "string", "minLength": 1}
},
"labels": {
"type": "object",
"additionalProperties": {"type": "string", "minLength": 1}
},
"imagePullSecrets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {"type": "string"}
},
"minProperties": 1
}
},
"securityContext": {
"type": "object",
"properties": {
"runAsNonRoot": {"type": "boolean"},
"runAsUser": {"type": "integer"},
"runAsGroup": {"type": "integer"}
}
},
"probe": {
"type": "object",
"properties": {
"port": {"type": "string", "enum": ["http", "socks"]},
"interval": {"type": "integer"},
"initialDelay": {"type": "integer"}
}
},
"resources": {
"type": "object",
"properties": {
"requests": {
"type": "object",
"properties": {
"cpu": {"type": "string"},
"memory": {"type": "string"}
}
},
"limits": {
"type": "object",
"properties": {
"cpu": {"type": "string"},
"memory": {"type": "string"}
}
}
}
},
"volumes": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {"type": "string"},
"configMap": {
"type": "object",
"properties": {
"name": {"type": "string"}
}
},
"secret": {
"type": "object",
"properties": {
"secretName": {"type": "string"}
}
},
"persistentVolumeClaim": {
"type": "object",
"properties": {
"claimName": {"type": "string"}
}
}
}
}
},
"volumeMounts": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {"type": "string"},
"mountPath": {"type": "string"},
"subPath": {"type": "string"},
"readOnly": {"type": "boolean"}
}
}
},
"nodeSelector": {
"type": "object",
"additionalProperties": {"type": "string", "minLength": 1}
},
"affinity": {
"type": "object",
"properties": {
"nodeAffinity": {"type": "object"},
"podAffinity": {"type": "object"},
"podAntiAffinity": {"type": "object"}
}
},
"tolerations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {"type": "string"},
"operator": {"type": "string"},
"value": {"type": "string"},
"effect": {"type": "string"}
}
}
},
"env": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {"type": "string"},
"value": {"type": "string"},
"valueFrom": {"type": "object"}
}
}
},
"args": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
}
}
}
},
"service": {
"type": "object",
"properties": {
"enabled": {"type": "boolean"},
"type": {
"type": "string",
"enum": ["ClusterIP", "NodePort", "LoadBalancer", "ExternalName"]
},
"externalName": {
"oneOf": [
{"type": "string", "minLength": 1},
{"type": "null"}
]
},
"ports": {
"type": "object",
"properties": {
"http": {"type": "integer", "minimum": 1, "maximum": 65535},
"socks": {"type": "integer", "minimum": 1, "maximum": 65535}
}
}
}
},
"ingress": {
"type": "object",
"properties": {
"enabled": {"type": "boolean"},
"className": {
"oneOf": [
{"type": "string", "minLength": 1},
{"type": "null"}
]
},
"annotations": {
"type": "object",
"additionalProperties": {"type": "string", "minLength": 1}
},
"hosts": {
"type": "array",
"items": {
"type": "object",
"properties": {
"host": {"type": "string", "minLength": 1},
"paths": {
"type": "array",
"items": {
"type": "object",
"properties": {
"path": {"type": "string", "minLength": 1},
"pathType": {"type": "string", "minLength": 1}
}
}
}
}
}
},
"tls": {
"type": "array",
"items": {
"type": "object",
"properties": {
"hosts": {"type": "array"},
"secretName": {"type": "string"}
}
}
}
}
},
"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"}]}
}
}
}
}

View File

@ -0,0 +1,149 @@
# -- The name of the Helm release
fullnameOverride: null
# -- This is to override the chart name
nameOverride: null
# -- Override the default Release Namespace for Helm
namespaceOverride: null
image:
# -- The image repository to pull from
repository: ghcr.io/tarampampam/3proxy
# -- Defines the image pull policy
pullPolicy: IfNotPresent
# -- Overrides the image tag whose default is the chart appVersion
tag: null
deployment:
# -- Enable deployment
enabled: true
# -- The deployment kind
kind: Deployment
# -- How many replicas to run
replicas: 1
# -- Additional pod annotations (e.g. for mesh injection or prometheus scraping)
# It supports templating. One can set it with values like some/name: '{{ template "some.name" . }}'
# For more information checkout: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
podAnnotations: {} # supports templating
# -- Additional deployment labels (e.g. for filtering deployment by custom labels)
labels: {} # supports templating
# -- This is for the secretes for pulling an image from a private repository more information can be found
# here: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
imagePullSecrets: [] # supports templating
# -- Security context for the pod, more information can be found here:
# https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#security-context-1
securityContext:
runAsNonRoot: true
runAsUser: 10001 # as defined in the Dockerfile
runAsGroup: 10001 # as defined in the Dockerfile
probe:
# -- 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
initialDelay: 2
# -- Resource limits and requests, more information can be found here:
# https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
resources:
requests: {memory: 16Mi}
limits: {memory: 128Mi}
# -- Additional volumes to add to the pod, more information can be found here:
# https://kubernetes.io/docs/concepts/storage/volumes/
volumes: [] # supports templating
# -- Additional volumeMounts to add to the container (for instance when using fs storage driver)
volumeMounts: [] # supports templating
# -- Node selector for pod assignment, more information can be found here:
# https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/
nodeSelector: {} # supports templating
# -- Affinity for pod assignment, more information can be found here:
# https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/
affinity: {} # supports templating
# -- Tolerations for pod assignment, more information can be found here:
# https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/
tolerations: [] # supports templating
# -- The list of additional environment variables to set in the container
env: [] # supports templating
# -- The list of additional arguments to pass to the container
args: [] # supports templating
service:
# -- Enable service
enabled: true
# -- Sets the service type more information can be found here:
# https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types
type: ClusterIP
# -- External name for the service (for type=ExternalName)
externalName: null
# -- Sets the port, more information can be found here:
# https://kubernetes.io/docs/concepts/services-networking/service/#field-spec-ports
ports:
# -- The port number for the proxy to listen on
http: 3128
# -- The same, but for socks proxy
socks: 1080
config:
log:
# -- Enable logging (set to false to disable)
enabled: true
# -- The output log file
# @default /dev/stdout
output: null
auth:
login:
# -- Username (login) for proxy authentication, provided as a plain value
plain: null
fromSecret:
# -- Enable getting the username from a secret
enabled: false
secretName: null # supports templating
secretKey: null # supports templating
fromConfigMap:
# -- Enable getting the username from a config map
enabled: false
configMapName: null # supports templating
configMapKey: null # supports templating
password:
# -- Password for proxy authentication, provided as a plain value
plain: null
fromSecret:
# -- Enable getting the password from a secret
enabled: false
secretName: null # supports templating
secretKey: null # supports templating
fromConfigMap:
# -- Enable getting the password from a config map
enabled: false
configMapName: null # supports templating
configMapKey: null # supports templating
extraAccounts:
# -- The list of additional accounts to add to the configuration (a hashmap of username:password)
plain: {}
fromSecret:
# -- Enable getting the extra accounts from a secret (the value should be a JSON object)
enabled: false
secretName: null # supports templating
secretKey: null # supports templating
fromConfigMap:
# -- Enable getting the extra accounts from a config map (the value should be a JSON object)
enabled: false
configMapName: null # supports templating
configMapKey: null # supports templating
dns:
# -- Primary DNS server
# @default 1.0.0.1 (Cloudflare)
primaryResolver: null
# -- Secondary DNS server
# @default 8.8.4.4 (Google)
secondaryResolver: null
limits:
# -- The maximum number of connections
# @default 1024
maxConnections: null
# -- Additional 3proxy configuration (appended to the end of the config file, but before `proxy` and `flush`),
# new lines should be separated by `\n`, i.e.: "# line 1\n# line 2"
extraConfig: null

21
docker-compose.yaml Normal file
View File

@ -0,0 +1,21 @@
version: "3.8"
services:
3proxy-docker:
container_name: 3proxy-server
hostname: 3proxy-server
build:
context: .
dockerfile: Dockerfile
network_mode: host
restart: unless-stopped
environment:
PROXY_LOGIN: username
PROXY_PASSWORD: "Password"
PRIMARY_RESOLVER: 1.1.1.1
SECONDARY_RESOLVER: 152.53.118.246
MAX_CONNECTIONS: 1024
PROXY_PORT: 3128
SOCKS_PORT: 1080
labels:
com.centurylinklabs.watchtower.enable: "false"

View File

@ -1 +0,0 @@
repositoryID: 4166fa62-8485-47cb-8512-1ce4880385a4

File diff suppressed because one or more lines are too long

View File

@ -1,93 +0,0 @@
apiVersion: v1
entries:
proxy-3proxy:
- apiVersion: v2
appVersion: 1.12.0
created: "2025-03-10T11:00:04.924236554Z"
description: Powerful and lightweight proxy server, written in pure C
digest: b16afb04a3e6cf976a46f6cdf8d0882fc73acd94c05d6d033bb54de91cf69f36
home: https://github.com/3proxy/3proxy
icon: https://github.com/user-attachments/assets/023186cf-b153-459c-8417-038fd87a2065
keywords:
- proxy
- 3proxy
- http
- socks
name: proxy-3proxy
sources:
- https://github.com/tarampampam/3proxy-docker
type: application
urls:
- https://tarampampam.github.io/3proxy-docker/helm-charts/proxy-3proxy-1.12.0.tgz
version: 1.12.0
- apiVersion: v2
appVersion: 1.11.1
created: "2025-03-10T11:00:04.923741728Z"
description: Powerful and lightweight proxy server, written in pure C
digest: f0c6b3df125f7839a0b70b10d5e3a36834880a54fab4a44b92afb8863e554ecd
home: https://github.com/3proxy/3proxy
icon: https://github.com/user-attachments/assets/023186cf-b153-459c-8417-038fd87a2065
keywords:
- proxy
- 3proxy
- http
- socks
name: proxy-3proxy
sources:
- https://github.com/tarampampam/3proxy-docker
type: application
urls:
- https://tarampampam.github.io/3proxy-docker/helm-charts/proxy-3proxy-1.11.1.tgz
version: 1.11.1
- apiVersion: v2
appVersion: 1.11.0
created: "2025-03-10T11:00:04.923248695Z"
description: Powerful and lightweight proxy server, written in pure C
digest: 3d63ce7bdc724821288e79ce33dba2151179c7eed8c8e4d925d2510385018921
home: https://github.com/3proxy/3proxy
icon: https://github.com/user-attachments/assets/023186cf-b153-459c-8417-038fd87a2065
keywords:
- proxy
- 3proxy
- http
- socks
name: proxy-3proxy
sources:
- https://github.com/tarampampam/3proxy-docker
type: application
urls:
- https://tarampampam.github.io/3proxy-docker/helm-charts/proxy-3proxy-1.11.0.tgz
version: 1.11.0
- apiVersion: v2
appVersion: 1.11.0-rc2
created: "2025-03-10T11:00:04.922760302Z"
description: Powerful and lightweight proxy server, written in pure C
digest: a72c75287756edac2fa714fec47f61aa367b8ba72ce7a2dc342fc7f0eb4796b8
home: https://github.com/3proxy/3proxy
icon: https://github.com/user-attachments/assets/023186cf-b153-459c-8417-038fd87a2065
keywords:
- proxy
- 3proxy
- http
- socks
name: proxy-3proxy
sources:
- https://github.com/tarampampam/3proxy-docker
type: application
urls:
- https://tarampampam.github.io/3proxy-docker/helm-charts/proxy-3proxy-1.11.0-rc2.tgz
version: 1.11.0-rc2
- apiVersion: v2
appVersion: 1.11.0-rc1
created: "2025-03-10T11:00:04.922228296Z"
description: Powerful and lightweight proxy server, written in pure C
digest: 1cf9495476a0382c8a79f249042fad8a52304cc54c717a095460ef0c204cc055
icon: https://github.com/user-attachments/assets/023186cf-b153-459c-8417-038fd87a2065
name: proxy-3proxy
sources:
- https://github.com/tarampampam/3proxy-docker
type: application
urls:
- https://tarampampam.github.io/3proxy-docker/helm-charts/proxy-3proxy-1.11.0-rc1.tgz
version: 1.11.0-rc1
generated: "2025-03-10T11:00:04.920781104Z"

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long