Compare commits

...

74 Commits

Author SHA1 Message Date
Patrick Asmus (ws06-vm)
4a3948a995 change
Some checks failed
📚 Documentation / Docker Hub Description (push) Has been cancelled
2025-06-08 20:31:02 +02:00
Patrick Asmus (ws06-vm)
a6a3a667ac Merge branch 'master' of https://git.techniverse.net/scriptos/3proxy-docker
Some checks failed
📚 Documentation / Docker Hub Description (push) Has been cancelled
🧪 Tests / Check for GitLeaks (push) Has been cancelled
🧪 Tests / Lint the chart (push) Has been cancelled
🧪 Tests / Build the docker image (push) Has been cancelled
🧪 Tests / Try to use the docker image (auth no) (push) Has been cancelled
🧪 Tests / Try to use the docker image (auth yes) (push) Has been cancelled
2025-06-08 20:29:37 +02:00
Patrick Asmus (ws06-vm)
006e4b0fb8 first commit - enable ipv6 2025-06-08 20:28:47 +02:00
dependabot[bot]
5d1c1ff91b Enable ipv6 2025-06-08 20:28:41 +02:00
dependabot[bot]
62aa4d4d4e
Bump library/gcc from 14.2.0 to 15.1.0 in the docker group (#73) 2025-05-07 09:43:27 +00:00
Pаramtamtām
df2468d8de
Update release.yml 2025-03-14 14:02:17 +04:00
dependabot[bot]
53e8111ec3
Bump library/gcc from 13.3.0 to 14.2.0 in the docker group (#69)
Bumps the docker group with 1 update: library/gcc.


Updates `library/gcc` from 13.3.0 to 14.2.0

---
updated-dependencies:
- dependency-name: library/gcc
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: docker
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-10 14:52:36 +04:00
Pаramtamtām
821281d71f
⬆️ chore(docker): Bump 3proxy version to 0.9.5 (#70) 2025-03-10 14:50:20 +04:00
Pаramtamtām
e646bd801e
fix(helm): Fix for values that supports templating (#67) 2025-02-03 20:42:08 +04:00
Pаramtamtām
9791f4a007
Update release.yml 2025-02-03 17:50:29 +04:00
Pаramtamtām
29d2351597
dockerfile improving (#66) 2025-02-02 19:30:22 +04:00
Paramtamtam
46cfd03a37
fix the CI 2025-02-02 17:06:10 +04:00
Pаramtamtām
873c511f96
feat: Add helm chart for the app (#65) 2025-02-02 16:56:47 +04:00
Paramtamtam
38425621b6
chore(docs): Update readme file (closes #64) 2024-12-17 22:47:10 +04:00
Paramtamtam
4d191d65b6
ci: 👷 CI system updated 2024-12-17 22:16:53 +04:00
dependabot[bot]
d4459e5346
Bump gcc from 13.2.0 to 13.3.0 in the docker group (#63) 2024-12-01 22:37:20 +00:00
Pаramtamtām
1f42c9285b
Allow to configure log output and make CI great again (#60) 2024-11-12 15:38:36 +04:00
Pаramtamtām
2a4024db68
Delete .github/workflows/dependabot.yml 2024-11-01 11:47:29 +04:00
dependabot[bot]
8cdaa01188
Bump docker/build-push-action from 5 to 6 in the github-actions group (#53) 2024-07-01 17:32:45 +00:00
Pаramtamtām
e4e42b94a3
Update dependabot.yml 2024-04-27 14:35:34 +04:00
Pаramtamtām
a4ae4feb1f
Update README.md 2024-04-02 13:42:59 +04:00
Pаramtamtām
276efbfeae
Update CHANGELOG.md 2024-04-02 13:38:39 +04:00
Mario Trangoni
eabbb17fa5
fix: put EXTRA_CONFIG before the proxy starts (#49)
Signed-off-by: Mario Trangoni <mjtrangoni@gmail.com>
2024-04-02 13:36:30 +04:00
dependabot[bot]
37066552b8
Bump the any group with 1 update (#48) 2024-04-02 05:47:45 +00:00
Pаramtamtām
fb681a846e
Update dependabot.yml 2024-03-19 09:56:31 +04:00
Paramtamtam
dcf291de25
docs(readme): 📚 Readme file updated 2024-03-16 18:48:32 +04:00
Paramtamtam
4f60889624
feat: EXTRA_CONFIG environment variable is supported 2024-03-16 18:43:37 +04:00
dependabot[bot]
298e65c0b0
Bump peter-evans/dockerhub-description from 3 to 4 (#45) 2024-02-01 22:49:23 +00:00
dependabot[bot]
f3596b86ea
Bump actions/download-artifact from 3 to 4 (#44) 2024-01-02 08:11:28 +00:00
dependabot[bot]
513a467b11
Bump actions/upload-artifact from 3 to 4 (#43)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 3 to 4.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-02 12:09:00 +04:00
Pаramtamtām
7b2e6ac6da
Update dependabot.yml 2023-10-05 11:15:06 +04:00
Pаramtamtām
a44fde46e6
Update dependabot.yml 2023-10-02 12:30:48 +04:00
Pаramtamtām
283a52abe6
Update dependabot.yml 2023-10-02 11:36:41 +04:00
dependabot[bot]
63731eca8c
Bump docker/setup-buildx-action from 2 to 3 (#39) 2023-10-02 07:10:12 +00:00
dependabot[bot]
7dd058d8aa
Bump docker/login-action from 2 to 3 (#38) 2023-10-02 06:54:11 +00:00
dependabot[bot]
7490d4dce8
Bump docker/build-push-action from 4 to 5 (#40) 2023-10-02 06:53:50 +00:00
dependabot[bot]
6d215e502c
Bump actions/checkout from 3 to 4 (#41) 2023-10-02 06:53:37 +00:00
dependabot[bot]
d8f9aa2024
Bump docker/setup-qemu-action from 2 to 3 (#42) 2023-10-02 06:53:27 +00:00
dependabot[bot]
98a8747a3c
Bump gcc from 12.2.0 to 13.2.0 (#37) 2023-09-02 15:25:54 +00:00
Pаramtamtām
1febd8abe7
Create dependabot.yml 2023-09-02 06:51:05 -07:00
Paramtamtam
e5e9f108eb
Fix: Missing port definitions when EXTRA_ACCOUNTS is set 2023-08-24 19:31:57 +04:00
dependabot[bot]
7b6870751c
Bump docker/build-push-action from 3 to 4 (#33) 2023-02-01 17:11:51 +00:00
Paramtamtam
a1a23544ac
fix: frop ppc64le arch support 2023-01-23 01:19:08 +04:00
Paramtamtam
713f37e79c
docs(readme): file updated 2023-01-23 00:34:40 +04:00
Paramtamtam
597d6e28ec
feat: multiarch image (#31) 2023-01-23 00:24:45 +04:00
Paramtamtam
40678de18c
Update README.md 2022-12-27 11:49:17 +04:00
Paramtamtam
770665806e
feat: Multiple accounts (#29) 2022-12-08 20:20:33 +04:00
dependabot[bot]
7be7f47fe4
Bump gcc from 12.1.0 to 12.2.0 (#25) 2022-09-01 17:40:35 +00:00
Paramtamtam
fb24456662
Entrypoint script replaced with mustpl (#24) 2022-08-26 17:05:50 +04:00
Paramtamtam
2e9ef61cf8
wip: readme file 2022-08-16 10:23:46 +04:00
Paramtamtam
d332716996
rename variables 2022-08-16 10:19:53 +04:00
Paramtamtam
7200ecad96
dns resolvers changing using environment variables 2022-08-16 10:08:19 +04:00
Paramtamtam
93902a6aef
fix 3proxy version in the dockerfile 2022-06-12 13:30:42 +04:00
Paramtamtam
5f29bf16d7
update renovate config 2022-06-12 13:27:19 +04:00
Paramtamtam
1619760057
Update tests.yml 2022-06-12 13:39:28 +05:00
Paramtamtam
ab12170222
update renovate config 2022-06-10 11:59:54 +04:00
renovate[bot]
f28aed423b
Update dependency z3APA3A/3proxy to v0.9.4 (#23)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2022-06-10 12:41:12 +05:00
Paramtamtam
1506af7c6c
update renovate config 2022-06-10 11:35:33 +04:00
Paramtamtam
68bef38402
update renovate config 2022-06-10 11:33:31 +04:00
Paramtamtam
e17a4f6856
update renovate config 2022-06-10 11:21:48 +04:00
Paramtamtam
1ae0ac52cf
dockerfile fix 2022-06-10 11:06:09 +04:00
Paramtamtam
f82ce4fac2
renovate 2022-06-10 11:04:26 +04:00
dependabot[bot]
30724ceee3
Bump docker/login-action from 1 to 2 (#21) 2022-06-01 17:08:32 +00:00
dependabot[bot]
a057e3fb1f
Bump docker/setup-buildx-action from 1 to 2 (#20) 2022-06-01 17:04:52 +00:00
dependabot[bot]
fa2bd9ac44
Bump docker/build-push-action from 2 to 3 (#19) 2022-06-01 17:04:29 +00:00
dependabot[bot]
66c11e684a
Bump gcc from 11.3.0 to 12.1.0 (#18) 2022-06-01 17:03:56 +00:00
Paramtamtam
541fac5147
Update release.yml 2022-05-12 17:25:00 +05:00
Paramtamtam
978cd98ff3
Update tests.yml 2022-05-12 17:24:37 +05:00
dependabot[bot]
5591967c35
Bump actions/upload-artifact from 2 to 3 (#16) 2022-05-01 17:24:57 +00:00
dependabot[bot]
f426c0f7e9
Bump gcc from 11.2.0 to 11.3.0 (#15) 2022-05-01 17:24:45 +00:00
dependabot[bot]
c374a6f597
Bump actions/download-artifact from 2 to 3 (#14) 2022-05-01 17:24:32 +00:00
dependabot[bot]
7650a0e75b
Bump actions/checkout from 2 to 3 (#13) 2022-04-01 21:06:32 +00:00
dependabot[bot]
9fd0a90c69
Bump actions/labeler from 3 to 4 (#12) 2022-04-01 21:05:59 +00:00
dependabot[bot]
752502d85a
Bump busybox from 1.34.0-glibc to 1.34.1-glibc (#11) 2021-11-01 19:09:53 +00:00
25 changed files with 1236 additions and 343 deletions

View File

@ -1,8 +1,6 @@
.editorconfig
.git
.github
.idea
.vscode
temp
tmp
LICENSE
## Ignore everything
*
## Except the following files (and directories)
!/3proxy.cfg.json
!/3proxy.cfg.mustach

View File

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

View File

@ -1,16 +1,17 @@
# Docs: <https://docs.github.com/en/free-pro-team@latest/github/administering-a-repository/customizing-dependency-updates>
# 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}
reviewers: [tarampampam]
assignees: [tarampampam]
- package-ecosystem: docker
directory: /
groups: {docker: {patterns: ['*']}}
schedule: {interval: monthly}
reviewers: [tarampampam]
assignees: [tarampampam]

21
.github/labeler.yml vendored
View File

@ -1,21 +0,0 @@
docs:
- '**/*.md'
- '**/*.MD'
.github:
- '.github/**/*'
CI:
- '.github/workflows/**/*'
- '.github/actions/**/*'
docker:
- 'Dockerfile'
- 'docker/**/*'
- '.dockerignore'
- 'docker-entrypoint.sh'
- '3proxy.cfg'
dev:
- '.gitignore'
- '.editorconfig'

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

View File

@ -1,12 +0,0 @@
name: labeler
on: [pull_request_target]
jobs:
triage:
runs-on: ubuntu-20.04
steps:
- uses: actions/labeler@v3 # Action page: <https://github.com/actions/labeler>
with:
repo-token: "${{ secrets.GITHUB_TOKEN }}"
sync-labels: true

View File

@ -1,42 +1,86 @@
name: release
# 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: # Docs: <https://git.io/JeBz1#release-event-release>
types: [published]
release: {types: [published]}
workflow_dispatch: {}
jobs:
docker-image:
name: Build docker image
runs-on: ubuntu-20.04
build-docker-image:
name: Build the docker image
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v2
- uses: gacts/github-slug@v1
id: slug
- uses: docker/setup-buildx-action@v1
- name: Login to default Container Registry
uses: docker/login-action@v1 # Action page: <https://github.com/docker/login-action>
- uses: actions/checkout@v4
- uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_LOGIN }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v1 # Action page: <https://github.com/docker/login-action>
- uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GHCR_PASSWORD }}
- uses: docker/build-push-action@v2 # Action page: <https://github.com/docker/build-push-action>
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: .
file: Dockerfile
push: true
platforms: linux/amd64,linux/arm64
tags: |
tarampampam/3proxy:${{ steps.slug.outputs.version-semantic }}
tarampampam/3proxy:latest
ghcr.io/${{ github.actor }}/3proxy:${{ steps.slug.outputs.version-semantic }}
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

View File

@ -1,103 +1,73 @@
name: tests
# 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: {}
pull_request:
paths-ignore: ['**.md']
jobs: # Docs: <https://git.io/JvxXE>
concurrency:
group: ${{ github.ref }}
cancel-in-progress: true
jobs:
gitleaks:
name: Gitleaks
runs-on: ubuntu-20.04
name: Check for GitLeaks
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v2
with:
fetch-depth: 0
- {uses: actions/checkout@v4, with: {fetch-depth: 0}}
- uses: gacts/gitleaks@v1
- name: Check for GitLeaks
uses: zricethezav/gitleaks-action@v1.6.0 # Action page: <https://github.com/zricethezav/gitleaks-action>
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 docker image
runs-on: ubuntu-20.04
name: Build the docker image
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v2
- name: Build docker image
run: docker build -f ./Dockerfile --tag 3proxy:local .
- name: Scan image
uses: anchore/scan-action@v3 # action page: <https://github.com/anchore/scan-action>
with:
image: 3proxy:local
fail-build: true
severity-cutoff: low # negligible, low, medium, high or critical
- name: Save docker image
run: docker save 3proxy:local > ./docker-image.tar
- name: Upload artifact
uses: actions/upload-artifact@v2
- 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
scan-image:
name: Scan docker image
runs-on: ubuntu-20.04
needs: [build-image]
steps:
- name: Download built docker image
uses: actions/download-artifact@v2
with:
name: docker-image
path: .artifact
- name: Prepare image to run
working-directory: .artifact
run: docker load < docker-image.tar
- name: Scan image
uses: anchore/scan-action@v3 # action page: <https://github.com/anchore/scan-action>
with:
image: 3proxy:local
fail-build: true
severity-cutoff: low # negligible, low, medium, high or critical
try-to-use:
name: Build and use docker image (auth ${{ matrix.auth }})
runs-on: ubuntu-20.04
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:
- name: Download builded docker image
uses: actions/download-artifact@v2
- uses: actions/download-artifact@v4
with:
name: docker-image
path: .artifact
- name: Prepare image to run
working-directory: .artifact
- working-directory: .artifact
run: docker load < docker-image.tar
- name: Start server without auth setup
if: matrix.auth != 'yes'
- if: matrix.auth != 'yes'
run: docker run --rm -d -p "3128:3128/tcp" -p "1080:1080/tcp" 3proxy:local
- name: Start server with auth setup
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" 3proxy:local
- name: Pause
run: sleep 3
- 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: |
@ -106,7 +76,6 @@ jobs: # Docs: <https://git.io/JvxXE>
--connect-timeout 3 \
--max-time 3 \
https://www.cloudflare.com/robots.txt
- name: Try to use SOCKS proxy
if: matrix.auth != 'yes'
run: |
@ -115,7 +84,6 @@ jobs: # Docs: <https://git.io/JvxXE>
--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: |
@ -125,7 +93,15 @@ jobs: # Docs: <https://git.io/JvxXE>
--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: |
@ -135,6 +111,4 @@ jobs: # Docs: <https://git.io/JvxXE>
--connect-timeout 3 \
--max-time 3 \
https://www.cloudflare.com/robots.txt
- name: Stop container
run: docker stop $(docker ps -a --filter ancestor=3proxy:local -q)
- run: docker stop $(docker ps -a --filter ancestor=3proxy:local -q)

View File

@ -1,30 +0,0 @@
#!/bin/3proxy
config /etc/3proxy/3proxy.cfg
# you may use system to execute some external command if proxy starts
system "echo `which 3proxy`': Starting 3proxy'"
# We can configure nservers to avoid unsafe gethostbyname() usage
nserver 1.0.0.1
nserver 1.1.1.1
nserver 8.8.4.4
nserver 8.8.8.8
# nscache is good to save speed, traffic and bandwidth
nscache 65536
# Here we can change timeout values
timeouts 1 5 30 60 180 1800 15 60
# Logging docs: <https://3proxy.org/doc/howtor.html#LOGFORMAT>
log /dev/stdout
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 1024
#AUTH_SETTINGS
proxy -a -p3128
socks -a -p1080
flush

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

View File

@ -1,64 +0,0 @@
# Changelog
All notable changes to this package will be documented in this file.
The format is based on [Keep a Changelog][keepachangelog] and this project adheres to [Semantic Versioning][semver].
## v1.5.0
### Fixed
- Docker image building optimized
### Added
- Healthcheck in the dockerfile
## v1.4.0
### Changed
- 3proxy updated from `0.9.3` up to `0.9.4`
## v1.3.0
### Changed
- Logging in JSON format
## v1.2.0
### Changed
- 3proxy updated from `0.8.13` up to `0.9.3`
## v1.1.0
### Removed
- Environment variable `AUTH_REQUIRED` support
### Changed
- Proxy error pages a little bit styled
## v1.0.0
### Fixed
- Dockerfile and docker entry-point script cleanup
## v0.1.1
### Fixed
- Docker entry-point script clean
## v0.1.0
### Changed
- First project release
[keepachangelog]:https://keepachangelog.com/en/1.0.0/
[semver]:https://semver.org/spec/v2.0.0.html

View File

@ -1,23 +1,26 @@
# Image page: <https://hub.docker.com/_/gcc>
FROM gcc:11.2.0 as builder
# syntax=docker/dockerfile:1
# e.g.: `docker build --build-arg "VERSION=0.9.4" .`
ARG VERSION="0.9.4"
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 clone --branch "${VERSION}" https://github.com/z3APA3A/3proxy.git /tmp/3proxy
&& 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/z3APA3A/3proxy/blob/0.9.3/src/proxy.c>
&& sed -i 's~\(<\/head>\)~<style>html,body{background-color:#222526;color:#fff;font-family:sans-serif;\
text-align:center;display:flex;flex-direction:column;justify-content:center}h1,h2{margin-bottom:0;font-size:2.5em}\
h2::before{content:'"'"'Proxy error'"'"';display:block;font-size:0.4em;color:#bbb;font-weight:100}\
h3,p{color:#bbb}</style>\1~' ./src/proxy.c \
# 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
@ -31,10 +34,11 @@ RUN set -x \
&& strip ./bin/TrafficPlugin.ld.so \
&& strip ./bin/PCREPlugin.ld.so \
&& strip ./bin/TransparentPlugin.ld.so \
&& strip ./bin/SSLPlugin.ld.so
&& strip ./bin/SSLPlugin.ld.so \
&& cp /lib/$(gcc -dumpmachine)/libdl.so.* /tmp/3proxy/
# Prepare filesystem for 3proxy running
FROM busybox:1.34.0-glibc as buffer
FROM docker.io/library/alpine:latest AS buffer
# create a directory for the future root filesystem
WORKDIR /tmp/rootfs
@ -44,19 +48,23 @@ 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 \
&& wget -O ./bin/dumb-init "https://github.com/Yelp/dumb-init/releases/download/v1.2.5/dumb-init_1.2.5_x86_64" \
&& chmod +x ./bin/dumb-init
&& 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 binaries
COPY --from=builder /lib/x86_64-linux-gnu/libdl.so.* ./lib/
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 3proxy.cfg ./etc/3proxy/3proxy.cfg
COPY docker-entrypoint.sh ./docker-entrypoint.sh
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
FROM busybox:1.34.0-glibc
# Merge into a single layer
FROM docker.io/library/busybox:stable-glibc
LABEL \
org.opencontainers.image.title="3proxy" \
@ -72,10 +80,12 @@ COPY --from=buffer /tmp/rootfs /
# Use an unprivileged user
USER 3proxy:3proxy
# Docs: <https://docs.docker.com/engine/reference/builder/#healthcheck>
HEALTHCHECK --interval=5s --timeout=2s --retries=2 --start-period=2s CMD \
netstat -ltn | grep 3128 && netstat -ltn | grep 1080
ENTRYPOINT [ \
"/bin/mustpl", \
"-f", "/etc/3proxy/3proxy.cfg.json", \
"-o", "/etc/3proxy/3proxy.cfg", \
"/etc/3proxy/3proxy.cfg.mustach", \
"--", "/bin/dumb-init" \
]
ENTRYPOINT ["/bin/dumb-init", "--"]
CMD ["/docker-entrypoint.sh", "/bin/3proxy", "/etc/3proxy/3proxy.cfg"]
CMD ["/bin/3proxy", "/etc/3proxy/3proxy.cfg"]

156
README.md
View File

@ -1,106 +1,138 @@
<p align="center">
<img src="https://hsto.org/webt/kp/e1/ud/kpe1udvcjss_-wtmrws-w9radke.png" width="96" alt="" />
</p>
# This is a fork of
https://github.com/tarampampam/3proxy-docker
# Docker image with [3proxy][link_3proxy]
[![Build Status][badge_build_status]][link_build_status]
[![Release Status][badge_release_status]][link_build_status]
[![Image size][badge_size_latest]][link_docker_hub]
[![Docker Pulls][badge_docker_pulls]][link_docker_hub]
[![License][badge_license]][link_license]
## Why this image created?
3proxy is awesome and lightweight proxy-server. This image contains stable version with it and can be configured using environment variables. By default, it uses anonymous (information about client hiding) proxy settings. Logging in JSON format.
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)
| 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
[![image stats](https://dockeri.co/image/tarampampam/3proxy)][link_docker_tags]
| Registry | Image |
|----------------------------------------|------------------------------|
| [GitHub Container Registry][link_ghcr] | `ghcr.io/tarampampam/3proxy` |
| [Docker Hub][link_docker_hub] (mirror) | `tarampampam/3proxy` |
All supported image tags [can be found here][link_docker_tags].
> [!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.
## Supported environment variables
All supported image tags can be [found here][link_docker_tags].
Variable name | Description | Example
---------------- | ----------------------------------------- | ---------------
`PROXY_LOGIN` | Authorization login | `username`
`PROXY_PASSWORD` | Authorization password | `password`
> Starting with version 1.8.2, the `arm64` architecture is supported (in addition to `amd64`):
## How can I use this?
```shell
docker run --rm mplatform/mquery ghcr.io/tarampampam/3proxy:1.8.2
For example:
```bash
$ docker run --rm -d \
-p "3128:3128/tcp" \
-p "1080:1080/tcp" \
tarampampam/3proxy:latest
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
```
Or with auth settings:
## 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" \
-e "PROXY_LOGIN=evil" \
-e "PROXY_PASSWORD=live" \
tarampampam/3proxy:latest
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
New versions publishing is very simple - just make required changes in this repository, update [changelog file](CHANGELOG.md) and "publish" new release using repo releases page.
Publishing a new version is straightforward:
Docker images will be build and published automatically.
1. Make the necessary changes in this repository.
2. "Publish" a new release on the repository's releases page.
> New release will overwrite the `latest` docker image tag in both registers.
Docker images will be automatically built and published.
## Changes log
[![Release date][badge_release_date]][link_releases]
[![Commits since latest release][badge_commits_since_release]][link_commits]
Changes log can be [found here][link_changes_log].
> 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 will find any package errors, please, [make an issue][link_create_issue] in current repository.
If you encounter any issues, please [open an issue][link_create_issue] in this repository.
## License
WTFPL. Use anywhere for your pleasure.
This project is licensed under the WTFPL. Use it freely and enjoy!
[badge_build_status]:https://img.shields.io/github/workflow/status/tarampampam/3proxy-docker/tests/master?logo=github&label=build
[badge_release_status]:https://img.shields.io/github/workflow/status/tarampampam/3proxy-docker/release?logo=github&label=release
[badge_release_date]:https://img.shields.io/github/release-date/tarampampam/3proxy-docker.svg?style=flat-square&maxAge=180
[badge_commits_since_release]:https://img.shields.io/github/commits-since/tarampampam/3proxy-docker/latest.svg?style=flat-square&maxAge=180
[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
[badge_license]:https://img.shields.io/github/license/tarampampam/3proxy-docker.svg?longCache=true
[badge_size_latest]:https://img.shields.io/docker/image-size/tarampampam/3proxy/latest?maxAge=30
[badge_docker_pulls]:https://img.shields.io/docker/pulls/tarampampam/3proxy.svg
[link_releases]:https://github.com/tarampampam/3proxy-docker/releases
[link_commits]:https://github.com/tarampampam/3proxy-docker/commits
[link_changes_log]:https://github.com/tarampampam/3proxy-docker/blob/master/CHANGELOG.md
[link_issues]:https://github.com/tarampampam/3proxy-docker/issues
[link_pulls]:https://github.com/tarampampam/3proxy-docker/pulls
[link_build_status]:https://github.com/tarampampam/3proxy-docker/actions
[link_create_issue]:https://github.com/tarampampam/3proxy-docker/issues/new
[link_license]:https://github.com/tarampampam/3proxy-docker/blob/master/LICENSE
[link_docker_tags]:https://hub.docker.com/r/tarampampam/3proxy/tags
[link_docker_hub]:https://hub.docker.com/r/tarampampam/3proxy/
[link_3proxy]:https://github.com/z3APA3A/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,12 +0,0 @@
#!/bin/sh
set -e
PROXY_LOGIN=${PROXY_LOGIN:-} # string
PROXY_PASSWORD=${PROXY_PASSWORD:-} # string
if [ -n "$PROXY_LOGIN" ] && [ -n "$PROXY_PASSWORD" ]; then
echo "$0: setup '${PROXY_LOGIN}:${PROXY_PASSWORD}' as proxy user";
sed -i "s~#AUTH_SETTINGS~users ${PROXY_LOGIN}:CL:${PROXY_PASSWORD}\nauth strong\nallow ${PROXY_LOGIN}~" /etc/3proxy/3proxy.cfg
fi;
exec "$@"