Compare commits
80 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1f42c9285b | ||
|
|
2a4024db68 | ||
|
|
8cdaa01188 | ||
|
|
e4e42b94a3 | ||
|
|
a4ae4feb1f | ||
|
|
276efbfeae | ||
|
|
eabbb17fa5 | ||
|
|
37066552b8 | ||
|
|
fb681a846e | ||
|
|
dcf291de25 | ||
|
|
4f60889624 | ||
|
|
298e65c0b0 | ||
|
|
f3596b86ea | ||
|
|
513a467b11 | ||
|
|
7b2e6ac6da | ||
|
|
a44fde46e6 | ||
|
|
283a52abe6 | ||
|
|
63731eca8c | ||
|
|
7dd058d8aa | ||
|
|
7490d4dce8 | ||
|
|
6d215e502c | ||
|
|
d8f9aa2024 | ||
|
|
98a8747a3c | ||
|
|
1febd8abe7 | ||
|
|
e5e9f108eb | ||
|
|
7b6870751c | ||
|
|
a1a23544ac | ||
|
|
713f37e79c | ||
|
|
597d6e28ec | ||
|
|
40678de18c | ||
|
|
770665806e | ||
|
|
7be7f47fe4 | ||
|
|
fb24456662 | ||
|
|
2e9ef61cf8 | ||
|
|
d332716996 | ||
|
|
7200ecad96 | ||
|
|
93902a6aef | ||
|
|
5f29bf16d7 | ||
|
|
1619760057 | ||
|
|
ab12170222 | ||
|
|
f28aed423b | ||
|
|
1506af7c6c | ||
|
|
68bef38402 | ||
|
|
e17a4f6856 | ||
|
|
1ae0ac52cf | ||
|
|
f82ce4fac2 | ||
|
|
30724ceee3 | ||
|
|
a057e3fb1f | ||
|
|
fa2bd9ac44 | ||
|
|
66c11e684a | ||
|
|
541fac5147 | ||
|
|
978cd98ff3 | ||
|
|
5591967c35 | ||
|
|
f426c0f7e9 | ||
|
|
c374a6f597 | ||
|
|
7650a0e75b | ||
|
|
9fd0a90c69 | ||
|
|
752502d85a | ||
|
|
d72e72e7fc | ||
|
|
b345e9859a | ||
|
|
6e5b989498 | ||
|
|
f62172c9dc | ||
|
|
078a3d9b79 | ||
|
|
659fd3d395 | ||
|
|
bf160a071e | ||
|
|
93339d5159 | ||
|
|
1ef63988a7 | ||
|
|
921fc47ade | ||
|
|
e2d06289c4 | ||
|
|
009ec66d86 | ||
|
|
19c9d5528e | ||
|
|
edc91855c5 | ||
|
|
e53ceaa3e3 | ||
|
|
8c5b04a0df | ||
|
|
ce90d6dc89 | ||
|
|
b8ab9af377 | ||
|
|
6bd02fba06 | ||
|
|
97e1214f68 | ||
|
|
6f590edfc5 | ||
|
|
9d5ceade36 |
6
.dockerignore
Normal file
6
.dockerignore
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
## Ignore everything
|
||||||
|
*
|
||||||
|
|
||||||
|
## Except the following files (and directories)
|
||||||
|
!/3proxy.cfg.json
|
||||||
|
!/3proxy.cfg.mustach
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# EditorConfig docs: <https://editorconfig.org/>
|
||||||
|
|
||||||
root = true
|
root = true
|
||||||
|
|
||||||
[*]
|
[*]
|
||||||
@@ -5,8 +7,9 @@ charset = utf-8
|
|||||||
end_of_line = lf
|
end_of_line = lf
|
||||||
insert_final_newline = true
|
insert_final_newline = true
|
||||||
indent_style = space
|
indent_style = space
|
||||||
indent_size = 4
|
indent_size = 2
|
||||||
trim_trailing_whitespace = true
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
[*.{yml, yaml, sh, conf}]
|
[{*.yml,*.yaml}]
|
||||||
indent_size = 2
|
ij_any_spaces_within_braces = false
|
||||||
|
ij_any_spaces_within_brackets = false
|
||||||
|
|||||||
3
.github/CODEOWNERS
vendored
Normal file
3
.github/CODEOWNERS
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# @link <https://help.github.com/en/articles/about-code-owners>
|
||||||
|
|
||||||
|
* @tarampampam
|
||||||
16
.github/dependabot.yml
vendored
Normal file
16
.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# 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
13
.github/release.yml
vendored
Normal 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
7
.github/renovate.json
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
||||||
|
"extends": [
|
||||||
|
"github>tarampampam/.github//renovate/default",
|
||||||
|
":rebaseStalePrs"
|
||||||
|
]
|
||||||
|
}
|
||||||
19
.github/workflows/documentation.yml
vendored
Normal file
19
.github/workflows/documentation.yml
vendored
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
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 # Action page: <https://github.com/peter-evans/dockerhub-description>
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKER_LOGIN }}
|
||||||
|
password: ${{ secrets.DOCKER_USER_PASSWORD }}
|
||||||
|
repository: tarampampam/3proxy
|
||||||
50
.github/workflows/release.yml
vendored
50
.github/workflows/release.yml
vendored
@@ -1,4 +1,7 @@
|
|||||||
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:
|
on:
|
||||||
release: # Docs: <https://git.io/JeBz1#release-event-release>
|
release: # Docs: <https://git.io/JeBz1#release-event-release>
|
||||||
@@ -9,25 +12,26 @@ jobs:
|
|||||||
name: Build docker image
|
name: Build docker image
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Check out code
|
- uses: actions/checkout@v4
|
||||||
uses: actions/checkout@v2
|
- {uses: gacts/github-slug@v1, id: slug}
|
||||||
|
- uses: docker/setup-qemu-action@v3
|
||||||
- name: Generate image tag value
|
- uses: docker/setup-buildx-action@v3
|
||||||
run: echo "::set-env name=IMAGE_TAG::${GITHUB_REF##*/[vV]}" # `/refs/tags/v1.2.3` -> `1.2.3`
|
- uses: docker/login-action@v3 # Action page: <https://github.com/docker/login-action>
|
||||||
|
with:
|
||||||
- name: Make docker login
|
username: ${{ secrets.DOCKER_LOGIN }}
|
||||||
run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_LOGIN }}" --password-stdin &> /dev/null
|
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||||
|
- uses: docker/login-action@v3 # Action page: <https://github.com/docker/login-action>
|
||||||
- name: Build image
|
with:
|
||||||
run: |
|
registry: ghcr.io
|
||||||
docker build \
|
username: ${{ github.actor }}
|
||||||
--build-arg "BUILD_DATE=`date -u +'%Y-%m-%dT%H:%M:%SZ'`" \
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
--tag "tarampampam/3proxy:${IMAGE_TAG}" \
|
- uses: docker/build-push-action@v6 # Action page: <https://github.com/docker/build-push-action>
|
||||||
--tag "tarampampam/3proxy:latest" \
|
with:
|
||||||
-f ./Dockerfile .
|
context: .
|
||||||
|
push: true
|
||||||
- name: Push version image
|
platforms: linux/amd64,linux/arm64
|
||||||
run: docker push "tarampampam/3proxy:${IMAGE_TAG}"
|
tags: |
|
||||||
|
tarampampam/3proxy:${{ steps.slug.outputs.version-semantic }}
|
||||||
- name: Push latest image
|
tarampampam/3proxy:latest
|
||||||
run: docker push "tarampampam/3proxy:latest"
|
ghcr.io/${{ github.actor }}/3proxy:${{ steps.slug.outputs.version-semantic }}
|
||||||
|
ghcr.io/${{ github.actor }}/3proxy:latest
|
||||||
|
|||||||
118
.github/workflows/tests.yml
vendored
118
.github/workflows/tests.yml
vendored
@@ -1,84 +1,100 @@
|
|||||||
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:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches: [master, main]
|
||||||
- master
|
tags-ignore: ['**']
|
||||||
tags-ignore:
|
pull_request: {}
|
||||||
- '**'
|
|
||||||
pull_request:
|
concurrency:
|
||||||
schedule:
|
group: ${{ github.ref }}
|
||||||
- cron: '0 0 * * 0' # once in a week, docs: <https://git.io/JvxXE#onschedule>
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs: # Docs: <https://git.io/JvxXE>
|
jobs: # Docs: <https://git.io/JvxXE>
|
||||||
docker-image:
|
gitleaks:
|
||||||
name: Build and use docker image
|
name: Check for GitLeaks
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Check out code
|
- {uses: actions/checkout@v4, with: {fetch-depth: 0}}
|
||||||
uses: actions/checkout@v2
|
- uses: gacts/gitleaks@v1
|
||||||
|
|
||||||
- name: Build docker image
|
build-image:
|
||||||
run: docker build -f ./Dockerfile --tag image:local .
|
name: Build the docker image
|
||||||
|
runs-on: ubuntu-latest
|
||||||
- name: Run docker image with default settings
|
steps:
|
||||||
run: |
|
- uses: actions/checkout@v4
|
||||||
docker run --rm -d \
|
- run: docker build -f ./Dockerfile --tag 3proxy:local .
|
||||||
-p "3128:3128/tcp" \
|
- run: docker save 3proxy:local > ./docker-image.tar
|
||||||
-p "1080:1080/tcp" \
|
- uses: actions/upload-artifact@v4
|
||||||
image:local
|
with:
|
||||||
|
name: docker-image
|
||||||
- name: Pause
|
path: ./docker-image.tar
|
||||||
run: sleep 2
|
retention-days: 1
|
||||||
|
|
||||||
|
try-to-use:
|
||||||
|
name: Build and 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
|
- name: Try to use HTTP proxy
|
||||||
|
if: matrix.auth != 'yes'
|
||||||
run: |
|
run: |
|
||||||
curl -v --fail \
|
curl -v --fail \
|
||||||
--proxy http://127.0.0.1:3128 \
|
--proxy http://127.0.0.1:3128 \
|
||||||
--connect-timeout 3 \
|
--connect-timeout 3 \
|
||||||
--max-time 3 \
|
--max-time 3 \
|
||||||
https://github.com/robots.txt
|
https://www.cloudflare.com/robots.txt
|
||||||
|
|
||||||
- name: Try to use SOCKS proxy
|
- name: Try to use SOCKS proxy
|
||||||
|
if: matrix.auth != 'yes'
|
||||||
run: |
|
run: |
|
||||||
curl -v --fail \
|
curl -v --fail \
|
||||||
--proxy socks5://127.0.0.1:1080 \
|
--proxy socks5://127.0.0.1:1080 \
|
||||||
--connect-timeout 3 \
|
--connect-timeout 3 \
|
||||||
--max-time 3 \
|
--max-time 3 \
|
||||||
https://github.com/robots.txt
|
https://www.cloudflare.com/robots.txt
|
||||||
|
- name: Try to use HTTP proxy (with auth)
|
||||||
- name: Stop container
|
if: matrix.auth == 'yes'
|
||||||
run: docker stop $(docker ps -a --filter ancestor=image:local -q)
|
|
||||||
|
|
||||||
- name: Run docker image with auth settings
|
|
||||||
run: |
|
|
||||||
docker run --rm -d \
|
|
||||||
-p "3128:3128/tcp" \
|
|
||||||
-p "1080:1080/tcp" \
|
|
||||||
-e "PROXY_LOGIN=evil" \
|
|
||||||
-e "PROXY_PASSWORD=live" \
|
|
||||||
image:local
|
|
||||||
|
|
||||||
- name: Pause
|
|
||||||
run: sleep 2
|
|
||||||
|
|
||||||
- name: Try to use HTTP proxy
|
|
||||||
run: |
|
run: |
|
||||||
curl -v --fail \
|
curl -v --fail \
|
||||||
--proxy http://127.0.0.1:3128 \
|
--proxy http://127.0.0.1:3128 \
|
||||||
--proxy-user evil:live \
|
--proxy-user evil:live \
|
||||||
--connect-timeout 3 \
|
--connect-timeout 3 \
|
||||||
--max-time 3 \
|
--max-time 3 \
|
||||||
https://github.com/robots.txt
|
https://www.cloudflare.com/robots.txt
|
||||||
|
- name: Try to use HTTP proxy (with auth, extra user)
|
||||||
- name: Try to use SOCKS proxy
|
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: |
|
run: |
|
||||||
curl -v --fail \
|
curl -v --fail \
|
||||||
--proxy socks5://127.0.0.1:1080 \
|
--proxy socks5://127.0.0.1:1080 \
|
||||||
--proxy-user evil:live \
|
--proxy-user evil:live \
|
||||||
--connect-timeout 3 \
|
--connect-timeout 3 \
|
||||||
--max-time 3 \
|
--max-time 3 \
|
||||||
https://github.com/robots.txt
|
https://www.cloudflare.com/robots.txt
|
||||||
|
- run: docker stop $(docker ps -a --filter ancestor=3proxy:local -q)
|
||||||
- name: Stop container
|
|
||||||
run: docker stop $(docker ps -a --filter ancestor=image:local -q)
|
|
||||||
|
|||||||
29
3proxy.cfg
29
3proxy.cfg
@@ -1,29 +0,0 @@
|
|||||||
#!/usr/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
|
|
||||||
|
|
||||||
log /dev/stdout
|
|
||||||
logformat "- +_L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T"
|
|
||||||
|
|
||||||
maxconn 1024
|
|
||||||
|
|
||||||
#AUTH_SETTINGS
|
|
||||||
|
|
||||||
proxy -a -p3128
|
|
||||||
socks -a -p1080
|
|
||||||
|
|
||||||
flush
|
|
||||||
24
3proxy.cfg.json
Normal file
24
3proxy.cfg.json
Normal 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}"
|
||||||
|
}
|
||||||
39
3proxy.cfg.mustach
Normal file
39
3proxy.cfg.mustach
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
#!/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 (max 5 servers)
|
||||||
|
{{#name_servers}}
|
||||||
|
nserver {{ . }}
|
||||||
|
{{/name_servers}}
|
||||||
|
|
||||||
|
# nscache is good to save speed, traffic and bandwidth
|
||||||
|
nscache {{ name_servers_cache }}
|
||||||
|
|
||||||
|
# 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 {{ 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.extra_accounts.*}} {{ * }}:CL:{{ . }}{{/auth.extra_accounts.*}}
|
||||||
|
auth strong
|
||||||
|
allow {{ auth.login }}{{#auth.extra_accounts.*}},{{ * }}{{/auth.extra_accounts.*}}
|
||||||
|
{{/auth.password=}}{{/auth.login=}}
|
||||||
|
|
||||||
|
{{^extra_config=}}
|
||||||
|
|
||||||
|
# Additional configuration
|
||||||
|
{{extra_config}}
|
||||||
|
{{/extra_config=}}
|
||||||
|
|
||||||
|
proxy -a -p{{ ports.proxy }}
|
||||||
|
socks -a -p{{ ports.socks }}
|
||||||
|
|
||||||
|
flush
|
||||||
36
CHANGELOG.md
36
CHANGELOG.md
@@ -1,36 +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.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
|
|
||||||
123
Dockerfile
123
Dockerfile
@@ -1,59 +1,90 @@
|
|||||||
# Image page: <https://hub.docker.com/_/alpine>
|
# syntax=docker/dockerfile:1
|
||||||
FROM alpine:latest as builder
|
|
||||||
|
|
||||||
# e.g.: `docker build --build-arg "VERSION=0.8.13" .`
|
FROM gcc:13.2.0 AS builder
|
||||||
ARG VERSION="0.8.13"
|
|
||||||
|
|
||||||
|
# renovate: source=github-tags name=z3APA3A/3proxy
|
||||||
|
ARG Z3PROXY_VERSION=0.9.4
|
||||||
|
|
||||||
|
# Fetch 3proxy sources
|
||||||
RUN set -x \
|
RUN set -x \
|
||||||
&& apk add --no-cache \
|
&& git -c advice.detachedHead=false clone --depth 1 --branch "${Z3PROXY_VERSION}" https://github.com/z3APA3A/3proxy.git /tmp/3proxy
|
||||||
linux-headers \
|
|
||||||
build-base \
|
|
||||||
git \
|
|
||||||
&& git clone --branch ${VERSION} https://github.com/z3APA3A/3proxy.git /tmp/3proxy \
|
|
||||||
&& cd /tmp/3proxy \
|
|
||||||
&& echo '#define ANONYMOUS 1' >> /tmp/3proxy/src/3proxy.h \
|
|
||||||
&& 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~' /tmp/3proxy/src/proxy.c \
|
|
||||||
&& cat ./src/proxy.c | grep '</head>' \
|
|
||||||
&& make -f Makefile.Linux
|
|
||||||
|
|
||||||
FROM alpine:latest
|
WORKDIR /tmp/3proxy
|
||||||
|
|
||||||
# e.g.: `docker build --build-arg "BUILD_DATE=`date -u +'%Y-%m-%dT%H:%M:%SZ'`" .`
|
# Patch sources
|
||||||
ARG BUILD_DATE
|
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>: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
|
||||||
|
|
||||||
|
# Prepare filesystem for 3proxy running
|
||||||
|
FROM 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 /lib/*-linux-gnu/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 busybox:stable-glibc
|
||||||
|
|
||||||
LABEL \
|
LABEL \
|
||||||
org.label-schema.name="3proxy" \
|
org.opencontainers.image.title="3proxy" \
|
||||||
org.label-schema.description="Tiny free proxy server" \
|
org.opencontainers.image.description="Tiny free proxy server" \
|
||||||
org.label-schema.url="https://github.com/tarampampam/3proxy-docker" \
|
org.opencontainers.image.url="https://github.com/tarampampam/3proxy-docker" \
|
||||||
org.label-schema.vcs-url="https://github.com/tarampampam/3proxy-docker" \
|
org.opencontainers.image.source="https://github.com/tarampampam/3proxy-docker" \
|
||||||
org.label-schema.docker.cmd="docker run --rm -d -p \"3128:3128/tcp\" -p \"1080:1080/tcp\" this_image" \
|
org.opencontainers.image.vendor="Tarampampam" \
|
||||||
org.label-schema.vendor="tarampampam" \
|
org.opencontainers.image.licenses="WTFPL"
|
||||||
org.label-schema.build-date="$BUILD_DATE" \
|
|
||||||
org.label-schema.license="WTFPL" \
|
|
||||||
org.label-schema.schema-version="1.0"
|
|
||||||
|
|
||||||
COPY 3proxy.cfg /etc/3proxy/3proxy.cfg
|
# Import from builder
|
||||||
COPY docker-entrypoint.sh /docker-entrypoint.sh
|
COPY --from=buffer /tmp/rootfs /
|
||||||
COPY --from=builder /tmp/3proxy/src/3proxy /usr/bin/3proxy
|
|
||||||
|
|
||||||
RUN set -x \
|
|
||||||
# Unprivileged user creation <https://stackoverflow.com/a/55757473/12429735RUN>
|
|
||||||
&& adduser \
|
|
||||||
--disabled-password \
|
|
||||||
--gecos "" \
|
|
||||||
--home /nonexistent \
|
|
||||||
--shell /sbin/nologin \
|
|
||||||
--no-create-home \
|
|
||||||
--uid 10001 \
|
|
||||||
3proxy \
|
|
||||||
&& chown 3proxy:3proxy -R /etc/3proxy
|
|
||||||
|
|
||||||
# Use an unprivileged user
|
# Use an unprivileged user
|
||||||
USER 3proxy:3proxy
|
USER 3proxy:3proxy
|
||||||
|
|
||||||
ENTRYPOINT ["/docker-entrypoint.sh"]
|
ENTRYPOINT [ \
|
||||||
|
"/bin/mustpl", \
|
||||||
|
"-f", "/etc/3proxy/3proxy.cfg.json", \
|
||||||
|
"-o", "/etc/3proxy/3proxy.cfg", \
|
||||||
|
"/etc/3proxy/3proxy.cfg.mustach", \
|
||||||
|
"--", "/bin/dumb-init" \
|
||||||
|
]
|
||||||
|
|
||||||
CMD ["/usr/bin/3proxy", "/etc/3proxy/3proxy.cfg"]
|
CMD ["/bin/3proxy", "/etc/3proxy/3proxy.cfg"]
|
||||||
|
|||||||
67
README.md
67
README.md
@@ -10,31 +10,53 @@
|
|||||||
[![Docker Pulls][badge_docker_pulls]][link_docker_hub]
|
[![Docker Pulls][badge_docker_pulls]][link_docker_hub]
|
||||||
[![License][badge_license]][link_license]
|
[![License][badge_license]][link_license]
|
||||||
|
|
||||||
## Why this image created?
|
## Why was 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.
|
3proxy is an awesome and lightweight proxy server. This image contains the stable version and can be configured using environment variables. By default, it uses anonymous proxy settings to hide client information and logs in JSON format.
|
||||||
|
|
||||||
> Page on `hub.docker.com` can be [found here][link_docker_hub].
|
> Page on `hub.docker.com` can be [found here][link_docker_hub].
|
||||||
|
|
||||||
TCP ports:
|
TCP ports:
|
||||||
|
|
||||||
Port number | Description
|
| Port number | Description |
|
||||||
----------- | -----------
|
|-------------|---------------------------------------------------------|
|
||||||
`3128` | [HTTP proxy](https://3proxy.org/doc/man8/proxy.8.html)
|
| `3128` | [HTTP proxy](https://3proxy.org/doc/man8/proxy.8.html) |
|
||||||
`1080` | [SOCKS proxy](https://3proxy.org/doc/man8/socks.8.html)
|
| `1080` | [SOCKS proxy](https://3proxy.org/doc/man8/socks.8.html) |
|
||||||
|
|
||||||
## Supported tags
|
## Supported tags
|
||||||
|
|
||||||
[][link_docker_tags]
|
| Registry | Image |
|
||||||
|
|----------------------------------------|------------------------------|
|
||||||
|
| [GitHub Container Registry][link_ghcr] | `ghcr.io/tarampampam/3proxy` |
|
||||||
|
| [Docker Hub][link_docker_hub] | `tarampampam/3proxy` |
|
||||||
|
|
||||||
All supported image tags [can be found here][link_docker_tags].
|
All supported image tags [can be found here][link_docker_tags].
|
||||||
|
|
||||||
|
Since v1.8.2 architecture `arm64` (and `amd64` of course) is supported:
|
||||||
|
|
||||||
|
```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
|
## Supported environment variables
|
||||||
|
|
||||||
Variable name | Description | Example
|
| Variable name | Description | Example |
|
||||||
---------------- | ----------------------------------------- | ---------------
|
|----------------------|-----------------------------------------------------------------------------------------------------------------------|-----------------------------------|
|
||||||
`PROXY_LOGIN` | Authorization login | `username`
|
| `PROXY_LOGIN` | Authorization login (empty by default) | `username` |
|
||||||
`PROXY_PASSWORD` | Authorization password | `password`
|
| `PROXY_PASSWORD` | Authorization password (empty by default) | `password` |
|
||||||
|
| `EXTRA_ACCOUNTS` | Additional proxy users | `{"evil":"live", "guest":"pass"}` |
|
||||||
|
| `PRIMARY_RESOLVER` | Primary nameserver (dns resolver; `1.0.0.1` by default) | `8.8.8.8:5353/tcp` |
|
||||||
|
| `SECONDARY_RESOLVER` | Secondary nameserver (dns resolver; `8.8.4.4` by default) | `2001:4860:4860::8844` |
|
||||||
|
| `MAX_CONNECTIONS` | Maximal connections count (`1024` by default) | `2056` |
|
||||||
|
| `PROXY_PORT` | HTTP proxy port number (`3128` by default) | `8080` |
|
||||||
|
| `SOCKS_PORT` | SOCKS proxy port number (`1080` by default) | `8888` |
|
||||||
|
| `EXTRA_CONFIG` | Additional 3proxy configuration (will be added to the **end** of the config file, but before the `proxy` and `flush`) | `# line 1\n# line 2` |
|
||||||
|
| `LOG_OUTPUT` | Log output file path (`/dev/stdout` by default, set `/dev/null` to disable logging) | `/tmp/3proxy.log` |
|
||||||
|
|
||||||
## How can I use this?
|
## How can I use this?
|
||||||
|
|
||||||
@@ -44,10 +66,10 @@ For example:
|
|||||||
$ docker run --rm -d \
|
$ docker run --rm -d \
|
||||||
-p "3128:3128/tcp" \
|
-p "3128:3128/tcp" \
|
||||||
-p "1080:1080/tcp" \
|
-p "1080:1080/tcp" \
|
||||||
tarampampam/3proxy:latest
|
ghcr.io/tarampampam/3proxy:latest
|
||||||
```
|
```
|
||||||
|
|
||||||
Or with auth settings:
|
Or with auth & resolver settings:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ docker run --rm -d \
|
$ docker run --rm -d \
|
||||||
@@ -55,29 +77,31 @@ $ docker run --rm -d \
|
|||||||
-p "1080:1080/tcp" \
|
-p "1080:1080/tcp" \
|
||||||
-e "PROXY_LOGIN=evil" \
|
-e "PROXY_LOGIN=evil" \
|
||||||
-e "PROXY_PASSWORD=live" \
|
-e "PROXY_PASSWORD=live" \
|
||||||
tarampampam/3proxy:latest
|
-e "PRIMARY_RESOLVER=2001:4860:4860::8888" \
|
||||||
|
ghcr.io/tarampampam/3proxy:latest
|
||||||
```
|
```
|
||||||
|
|
||||||
## Changes log
|
## Releasing
|
||||||
|
|
||||||
[![Release date][badge_release_date]][link_releases]
|
Publishing new versions is very simple: just make the required changes in this repository, update the [changelog file](CHANGELOG.md), and "publish" a new release using the repository's releases page.
|
||||||
[![Commits since latest release][badge_commits_since_release]][link_commits]
|
|
||||||
|
|
||||||
Changes log can be [found here][link_changes_log].
|
Docker images will be built and published automatically.
|
||||||
|
|
||||||
|
> The new release will overwrite the `latest` docker image tag in both registries.
|
||||||
|
|
||||||
## Support
|
## Support
|
||||||
|
|
||||||
[![Issues][badge_issues]][link_issues]
|
[![Issues][badge_issues]][link_issues]
|
||||||
[![Issues][badge_pulls]][link_pulls]
|
[![Issues][badge_pulls]][link_pulls]
|
||||||
|
|
||||||
If you will find any package errors, please, [make an issue][link_create_issue] in current repository.
|
If you find any errors, please, [make an issue][link_create_issue] in the current repository.
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
WTFPL. Use anywhere for your pleasure.
|
WTFPL. Use anywhere for your pleasure.
|
||||||
|
|
||||||
[badge_build_status]:https://img.shields.io/github/workflow/status/tarampampam/3proxy-docker/tests/master?logo=github&label=build
|
[badge_build_status]:https://img.shields.io/github/actions/workflow/status/tarampampam/3proxy-docker/tests.yml?branch=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_status]:https://img.shields.io/github/actions/workflow/status/tarampampam/3proxy-docker/release.yml?logo=github&label=release
|
||||||
[badge_release_date]:https://img.shields.io/github/release-date/tarampampam/3proxy-docker.svg?style=flat-square&maxAge=180
|
[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_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_issues]:https://img.shields.io/github/issues/tarampampam/3proxy-docker.svg?style=flat-square&maxAge=180
|
||||||
@@ -95,4 +119,5 @@ WTFPL. Use anywhere for your pleasure.
|
|||||||
[link_license]:https://github.com/tarampampam/3proxy-docker/blob/master/LICENSE
|
[link_license]:https://github.com/tarampampam/3proxy-docker/blob/master/LICENSE
|
||||||
[link_docker_tags]:https://hub.docker.com/r/tarampampam/3proxy/tags
|
[link_docker_tags]:https://hub.docker.com/r/tarampampam/3proxy/tags
|
||||||
[link_docker_hub]:https://hub.docker.com/r/tarampampam/3proxy/
|
[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/z3APA3A/3proxy
|
[link_3proxy]:https://github.com/z3APA3A/3proxy
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
#!/usr/bin/env 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 "$@"
|
|
||||||
Reference in New Issue
Block a user