# server-xray Yet another unofficial [xray](https://github.com/XTLS/Xray-core) server container with x86 and arm/arm64 (Raspberry Pi) support. ![docker-build](https://github.com/samuelhbne/server-xray/workflows/docker-buildx-latest/badge.svg) ## [Optional] How to build server-xray docker image ```shell $ git clone https://github.com/samuelhbne/server-xray.git $ cd server-xray $ docker build -t samuelhbne/server-xray -f Dockerfile.amd64 . ... ``` ### NOTE1 - Please replace "amd64" with the arch match the current box accordingly. For example: "arm64" for AWS ARM64 platform like A1, t4g instance or 64bit Ubuntu on Raspberry Pi. "arm" for 32bit Raspbian. ## How to start the container ```shell $ docker run --rm -it samuelhbne/server-xray server-xray -- [-r|--request-domain ] [-c|--cert-path ] [-k|--hook ] -k|--hook [Optional] DDNS update or notifing URL to be hit. Multiple allowed -r|--request-domain [Optional] Domain name to request for letsencrypt cert. Multiple allowed -c|--cert-path [Optional] Reading TLS certs from folder //. Multiple allowed --ltx [p=443,]d=domain.com,u=uuid[:level[:email]][,f=[fallback-host]:fb-port:[fb-path]] --ltt [p=443,]d=domain.com,u=uuid[:level[:email]][,f=[fallback-host]:fb-port:[fb-path]] --lttw [p=443,]d=domain.com,u=uuid[:level[:email]][,f=[fallback-host]:fb-port:[fb-path]],w=/webpath --lttg [p=443,]d=domain.com,u=uuid[:level[:email]],s=/svcpath,g=grpcport --mtt [p=443,]d=domain.com,u=uuid[:level[:email]][,f=[fallback-host]:fb-port:[fb-path]] --mttw [p=443,]d=domain.com,u=uuid[:level[:email]][,f=[fallback-host]:fb-port:[fb-path]],w=/webpath --ttt [p=443,]d=domain.com,u=passwd[:email][,f=[fallback-host]:fb-port:[fb-path]] --tttw [p=443,]d=domain.com,u=passwd[:email][,f=[fallback-host]:fb-port:[fb-path]],w=/webpath --stdin Read XRay config from stdin instead of auto generation $ docker run --name server-xray -p 80:80 -p 443:2443 -d samuelhbne/server-xray --ltx p=2443,d=mydomain.duckdns.org,u=bec24d96-410f-4723-8b3b-46987a1d9ed8,f=:8080 -r mydomain.duckdns.org ... ``` ### NOTE2 - Please replace the port 443 (-p 443:2443) with the port number you choose for Xray incoming connection. - Port 80 export (-p 80:80) is necessary for Letsencrypt cert requesting, so don't miss it. - Please replace "bec24d96-410f-4723-8b3b-46987a1d9ed8" with the uuid you set for Xray client auth. - Please replace mydomain.duckdns.org with the domain-name for Letsencrypt cert request. - You can optionally assign a HOOK-URL to update the DDNS domain-name pointing to the current server public IP address. ## How to verify if server-xray is running properly Try to connect the server from Xray compatible mobile app like [v2rayNG](https://github.com/2dust/v2rayNG) for Android or [Shadowrocket](https://apps.apple.com/us/app/shadowrocket/id932747118) for iOS with the host-name, port, UUID etc. set above. Or verify it from Ubuntu / Debian / Raspbian client host follow the instructions below. ### Verifying server-xray connection with proxy-xray ```shell $ docker run --rm -it samuelhbne/proxy-xray proxy-xray -- [options] --ltx uuid@xray-host:port --ltt uuid@xray-host:port --lttw uuid@xray-host:port:/webpath --lttg uuid@xray-host:port:/svcpath --mtt uuid@xray-host:port --mttw uuid@xray-host:port:/webpath --ttt password@xray-host:port --tttw password@xray-host:port:/webpath --stdin Read XRay config from stdin instead of auto generation $ docker run --name proxy-xray -p 1080:1080 -d samuelhbne/proxy-xray --ltx bec24d96-410f-4723-8b3b-46987a1d9ed8@mydomain.duckdns.org:443 ... $ curl -sSx socks5h://127.0.0.1:1080 http://ifconfig.co 12.34.56.78 ``` ### NOTE4 - First we ran proxy-xray which created a SOCKS5 proxy that tunneling traffic through your Xray server. - Then a curl qery was sent to ifconfig.co through the Xray server via the socks5 port served by proxy-xray. - Like this: curl --> proxy-xray --> server-xray --> ifconfig.co website. - You should get the public IP address of your Xray server if all go well. - Please have a look over the sibling project [proxy-xray](https://github.com/samuelhbne/proxy-xray) for more details. ## How to stop and remove the running container ```shell $ docker stop server-xray ... $ docker rm server-xray ... ``` ## More complex examples ### 1. Running a XTLS and Trojan server with DDNS auto-update and Letsencrypt cert auto-request The following command will: 1. Update domain1 and domain2 with the current IP address server-xray running 2. Request TLS certs from Letsencrypt for domain1 and domain2 3. Create Vless+TLS+Websocket server on port 443 with the cert of domain1 4. Create Trojan server on port 8443 with the cert of domain2 as fallback 5. Port 80 must be exported for domain ownership verification ```shell $ docker run --name server-xray -p 80:80 -p 443:443 -p 8443:8443 -d samuelhbne/server-xray \ --lttx p=443,d=domain1.duckdns.org,u=bec24d96-410f-4723-8b3b-46987a1d9ed8,f=:8443 \ --ttt p=2443,d=domain2.duckdns.org,u=trojan_pass -r domain1.duckdns.org -k https://duckdns.org/update/domain1/c9711c65-db21-4f8c-a790-2c32c93bde8c \ -r domain2.duckdns.org -k https://duckdns.org/update/domain2/c9711c65-db21-4f8c-a790-2c32c93bde8c ... ``` #### XTLS connection verifying instructions ```shell $ docker run --name proxy-xray -p 1080:1080 -d samuelhbne/proxy-xray --ltx \ bec24d96-410f-4723-8b3b-46987a1d9ed8@mydomain.duckdns.org:443 $ curl -sSx socks5h://127.0.0.1:1080 http://ifconfig.co 12.34.56.78 $ docker exec -it proxy-xray /status.sh VPS-Server: domain1.duckdns.org Xray-URL: vless://bec24d96-410f-4723-8b3b-46987a1d9ed8@domain1.duckdns.org:443?security=xtls&type=tcp&flow=xtls-rprx-direct#domain1.duckdns.org:443 [QR-Code] ... ``` #### Trojan connection verifying instructions ```shell $ docker run --name proxy-xray2 -p 2080:1080 -d samuelhbne/proxy-xray --ttt \ trojan_pass@domain2.duckdns.org:8443 $ curl -sSx socks5h://127.0.0.1:2080 http://ifconfig.co 12.34.56.78 $ docker exec -it proxy-xray2 /status.sh VPS-Server: mydomain.duckdns.org Xray-URL: trojan://trojan_pass@domain2.duckdns.org:8443#domain2.duckdns.org:8443 [QR-Code] ... ``` ### 2. Running a Vless+TLS+Websocket server with existing TLS cert The following command will: 1. Assume to read TLS cert from /home/ubuntu/cert/mydomain.duckdns.org/fullchain.cer 2. Assume to read private key from /home/ubuntu/cert/mydomain.duckdns.org/mydomain.duckdns.org.key 3. Assume mydomain.duckdns.org has been resolved to the current server 4. Run Xray in Vless+TLS+Websocket mode on default port 443 with the given cert 5. Fallback to microsoft.com if client handshake failed (Anti-detection) ```shell $ docker run --name server-xray -p 443:443 -v /home/ubuntu/cert:/opt/cert -d samuelhbne/server-xray \ --lttw d=mydomain.duckdns.org,u=bec24d96-410f-4723-8b3b-46987a1d9ed8,w=/websocket,f=microsoft.com:80 \ -c /opt/cert ... ``` #### Websocket connection verifying instructions ```shell $ docker run --name proxy-xray -p 1080:1080 -d samuelhbne/proxy-xray --lttw \ bec24d96-410f-4723-8b3b-46987a1d9ed8@mydomain.duckdns.org:443:/websocket $ curl -sSx socks5h://127.0.0.1:1080 http://ifconfig.co 12.34.56.78 $ docker exec -it proxy-xray /status.sh VPS-Server: mydomain.duckdns.org Xray-URL: vless://bec24d96-410f-4723-8b3b-46987a1d9ed8@mydomain.duckdns.org:443?security=tls&type=ws&path=%2Fwebsocket#mydomain.duckdns.org:443 [QR-Code] ... ``` ### 3. Running a Vless+TLS+gRPC server with Nginx in front of, with given TLS cert The following command will: 1. Assume to read TLS cert from /home/ubuntu/cert/mydomain.duckdns.org/fullchain.cer 2. Assume to read private key from /home/ubuntu/cert/mydomain.duckdns.org/mydomain.duckdns.org.key 3. Assume mydomain.duckdns.org has been resolved to the current server 4. Run Xray in Vless+TLS+gRPC mode on port 65443 with the given cert 5. Run nginx on port 443 as a front to protect gRPC backend from detection 6. Only port 443 will be available for access from internet ```shell $ docker run --name server-xray -p 443:443 -v /home/ubuntu/cert:/opt/cert -d samuelhbne/server-xray \ -c /opt/cert --lttg port=443,domain=mydomain.duckdns.org,user=bec24d96-410f-4723-8b3b-46987a1d9ed8,service=/gsvc,gport=65443 ... ``` #### gRPC connection verifying instructions ```shell $ docker run --name proxy-xray -p 1080:1080 -d samuelhbne/proxy-xray --lttg \ bec24d96-410f-4723-8b3b-46987a1d9ed8@mydomain.duckdns.org:443:/gsvc $ curl -sSx socks5h://127.0.0.1:1080 http://ifconfig.co 12.34.56.78 $ docker exec -it proxy-xray /status.sh VPS-Server: mydomain.duckdns.org Xray-URL: vless://bec24d96-410f-4723-8b3b-46987a1d9ed8@mydomain.duckdns.org:443?security=tls&type=grpc&serviceName=/gsvc&mode=gun#mydomain.duckdns.org:443 [QR-Code] ... ```