How to set up and use proxy in your server | Docker | Docker-compose | Proxy.py

I wanted to run a proxy in my server, I tried everything but still failed to set it up. I tried mitmproxy, squid, and some other proxies that I forgot, yet I somehow failed in all of them.
After researching a little more I finally found a solution that works perfectly. Proxy.py
This awesome tool is written in python, has docker configurations, and HTTPS certificate generator.
So let's start.
I reckon that you are already on your server's terminal, you have git and python3-virtualenv installed.
git clone https://github.com/abhinavsingh/proxy.py.git
cd proxy.py
python3 -m venv env
. env/bin/activate
pip install -r requirements.txt
So if you run all commands so far, you should be good.
Now, this is where we do a little customization. In proxy.py docs, they are building and running containers through docker engine, but we will create our own docker-compose file for more comfort.
if you don't have already installed docker and docker-compose please follow these links:
for docker: docker/download
for docker-compose (ubuntu): linuxize/docker-compose
Let's dig in.
create a file called docker-compose.yml in our cloned directory (proxy.py)
nano docker-compose.yml
paste this context
version: "3"
services:
proxy:
build: .
container_name: custom-proxy
ports:
- "8899:8899"
restart: always
if you have an entry for hosts file you can use extra-hosts
here is sample
services:
proxy:
build: .
container_name: custom-proxy
ports:
- "8899:8899"
restart: always
extra_hosts:
- "example.com:1.2.3.4"
Let me break these lines for you
proxy is just the name of the service
build is where our Dockerfile is located (yes it's in the current directory!)
container_name is not necessary, I just did it because I like it that way
ports: we expose the ports to the public (proxy.py default is 8899)
restart: always is simply saying start running container again if an error occurs
That's that.
Now that we have our docker-compose file we can update and run our containers more easily! Run the following command to build and get your container up.
sudo docker-compose build
when this command finishes you'll have something like this
...
Step 14/15 : ENTRYPOINT [ "proxy" ]
---> Using cache
---> a18dd7a78abb
Step 15/15 : CMD [ "--hostname=0.0.0.0" ]
---> Using cache
---> 012db77b2da2
Successfully built 012db77b2da2
Successfully tagged proxypy_proxy:latest
to get you container up and running
sudo docker-compose up
note: add -d parameter at the end to run in the background
Creating exbir-proxy ... done
Attaching to exbir-proxy
exbir-proxy | 2020-12-04 18:43:35,267 - pid:1 [I] load_plugins:334 - Loaded plugin proxy.http.proxy.HttpProxyPlugin
exbir-proxy | 2020-12-04 18:43:35,268 - pid:1 [I] listen:113 - Listening on 0.0.0.0:8899
exbir-proxy | 2020-12-04 18:43:35,277 - pid:1 [I] start_workers:136 - Started 2 workers
CONGRATULATIONS! your proxy works in your server on port 8899!
At this point, I have a little bonus for you. If you have your own customizations too, to make docker-compose controls easier, go ahead and make temporary alias for yourself.
alias dd="sudo docker-compose down -v && sudo docker-compose build && sudo docker-compose up -d"
You can add it to your .bashrc (or other shells) file if you want to make it permanent.
Please ask me any questions related to this post!
Comments
Join the discussionThis is a good guide but in case you wanted to use Docker, they have started releasing official images too. Hence the steps you just mentioned can be skipped.


