├── .github └── workflows │ ├── dockerhub-description.yml │ └── image-build.yml ├── Dockerfile ├── README.EN.md ├── README.md ├── config-template-shadowsocks.json ├── config-template-vless.json ├── config └── config.json ├── docker-compose-dev.yml ├── docker-compose.yml ├── entrypoint.sh ├── gen-ss ├── gen-vless └── show-template /.github/workflows/dockerhub-description.yml: -------------------------------------------------------------------------------- 1 | name: Update Docker Hub Description 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | paths: 8 | - README.EN.md 9 | - .github/workflows/dockerhub-description.yml 10 | 11 | jobs: 12 | dockerHubDescription: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: actions/checkout@v4 16 | 17 | - name: Docker Hub Description 18 | uses: peter-evans/dockerhub-description@v3 19 | with: 20 | username: ${{ secrets.DOCKERHUB_USERNAME }} 21 | password: ${{ secrets.DOCKERHUB_TOKEN }} 22 | repository: itdoginfo/sing-box 23 | readme-filepath: ./README.EN.md -------------------------------------------------------------------------------- /.github/workflows/image-build.yml: -------------------------------------------------------------------------------- 1 | name: Build sing-box image 2 | 3 | on: 4 | push: 5 | branches: 6 | - 'main' 7 | schedule: 8 | - cron: '11 0 * * *' 9 | 10 | jobs: 11 | docker: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: Get latest release 15 | id: sing-box 16 | uses: pozetroninc/github-action-get-latest-release@v0.7.0 17 | with: 18 | owner: SagerNet 19 | repo: sing-box 20 | excludes: prerelease, draft 21 | - name: Check image 22 | id: image_exists 23 | continue-on-error: true 24 | uses: cloudposse/github-action-docker-image-exists@0.1.2 25 | with: 26 | registry: registry.hub.docker.com 27 | organization: "itdoginfo" 28 | repository: "sing-box" 29 | tag: ${{ steps.sing-box.outputs.release }} 30 | - name: Set up QEMU 31 | uses: docker/setup-qemu-action@v3 32 | if: always() && steps.image_exists.outcome == 'failure' 33 | - name: Set up Docker Buildx 34 | uses: docker/setup-buildx-action@v3 35 | if: always() && steps.image_exists.outcome == 'failure' 36 | - name: Login to Docker Hub 37 | uses: docker/login-action@v3 38 | if: always() && steps.image_exists.outcome == 'failure' 39 | with: 40 | username: ${{ secrets.DOCKERHUB_USERNAME }} 41 | password: ${{ secrets.DOCKERHUB_TOKEN }} 42 | - name: Build and push 43 | uses: docker/build-push-action@v6.2.0 44 | if: always() && steps.image_exists.outcome == 'failure' 45 | with: 46 | push: true 47 | build-args: RELEASE=${{ steps.sing-box.outputs.release }} 48 | tags: itdoginfo/sing-box:${{ steps.sing-box.outputs.release }} 49 | platforms: linux/386,linux/amd64,linux/arm64,linux/s390x -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | ARG RELEASE 2 | FROM ghcr.io/sagernet/sing-box:${RELEASE} AS sing-box 3 | 4 | FROM alpine:3.18.7 5 | 6 | RUN apk add --no-cache libqrencode jq coreutils bash && mkdir -p /etc/sing-box/ 7 | 8 | COPY --from=sing-box /usr/local/bin/sing-box /bin/sing-box 9 | COPY --from=ghcr.io/tarampampam/mustpl:0.1.1 /bin/mustpl /bin/mustpl 10 | COPY entrypoint.sh config-template* show-template /opt/ 11 | COPY gen* /bin/ 12 | 13 | ENTRYPOINT ["/opt/entrypoint.sh"] 14 | 15 | CMD ["sing-box", "--config", "/etc/sing-box/config.json", "run"] -------------------------------------------------------------------------------- /README.EN.md: -------------------------------------------------------------------------------- 1 | [![Docker Hub](https://img.shields.io/badge/%20-DockerHub-blue?logo=docker)](https://hub.docker.com/r/itdoginfo/sing-box) 2 | ![Docker Pulls](https://img.shields.io/docker/pulls/itdoginfo/sing-box) 3 | 4 | [![Docker Hub](https://img.shields.io/badge/%20-GitHub-black?logo=github)](https://github.com/itdoginfo/sing-box) 5 | ![GitHub Repo stars](https://img.shields.io/github/stars/itdoginfo/sing-box) 6 | 7 | Docker image for shadowsocks2022 and VLESS proxy server 8 | 9 | ## Install 10 | ``` 11 | mkdir sing-box && cd sing-box && wget https://raw.githubusercontent.com/itdoginfo/sing-box/main/docker-compose.yml 12 | ``` 13 | 14 | ### Shadowsocks2022 15 | Generate password 16 | ``` 17 | docker run itdoginfo/sing-box:v1.9.3 gen-ss 18 | ``` 19 | 20 | Paste the received password in the environment variable PASS. 21 | Specify the domain or IP address server. 22 | Specify protocol shadowsocks. 23 | 24 | For example: 25 | ``` 26 | environment: 27 | PROTOCOL: shadowsocks 28 | PASS: "ta87nmRO+LYN0P3Wx57ZTw==" 29 | SERVER: proxy.itdog.info 30 | ``` 31 | 32 | Container up 33 | ``` 34 | docker compose up -d 35 | ``` 36 | Available environment variables: 37 | - SERVER (required) 38 | - PASS (required) 39 | - [METHOD](https://sing-box.sagernet.org/configuration/outbound/shadowsocks/#method) 40 | - PORT 41 | - NAME 42 | 43 | ### VLESS 44 | Generate UIID, Private and public keys, Short ID 45 | ``` 46 | docker run itdoginfo/sing-box:v1.9.3 gen-vless 47 | ``` 48 | 49 | Paste the received values in the environment. 50 | Specify the domain or IP address server. 51 | Specify protocol vless. 52 | Specify site to mask the traffic (HTTP2, TLS 1.3, unblocked). 53 | 54 | For example: 55 | ``` 56 | environment: 57 | PROTOCOL: vless 58 | SERVER: proxy.itdog.info 59 | UUID: 71c48bba-6b5d-484d-83ef-b047ab96f1a3 60 | PRIVATE_KEY: KCaRO6tGf6dLXH21HOJkPaKYQAG64WdR4JVHx41TLnc 61 | PUBLIC_KEY: 3h_XmVpREusSRsLo8ii3GtIpGZf-2cP5iBrQ7uzVm2Q 62 | SHORT_ID: b627ec56b4f8ff40 63 | FAKE_SERVER: www.youtube.com 64 | ``` 65 | 66 | Container up 67 | ``` 68 | docker compose up -d 69 | ``` 70 | 71 | Available environment variables: 72 | - SERVER (required) 73 | - UUID (required) 74 | - PRIVATE_KEY (required) 75 | - PUBLIC_KEY (required) 76 | - SHORT_ID 77 | - FAKE_SERVER 78 | - PORT 79 | - NAME (config name) 80 | 81 | ## Configure clients 82 | Get configs for clients devices 83 | ``` 84 | docker exec sing-box show 85 | ``` 86 | 87 | ## Multi-accounting on Shadowsocks2022 88 | In docker-compose.yml uncomment 89 | ``` 90 | # volumes: 91 | # - ./config:/etc/sing-box/ 92 | ``` 93 | 94 | Download template config 95 | ``` 96 | mkdir config && wget -O config/config.json https://raw.githubusercontent.com/itdoginfo/sing-box/main/config/config.json 97 | ``` 98 | 99 | Generate mainpass and passwords for users 100 | ``` 101 | docker run itdoginfo/sing-box:v1.9.3 gen-ss 102 | ``` 103 | 104 | Specify this passwords in `config/config.json`. You can use any name you want. They will be displayed on the device when you add them 105 | 106 | With the container without volume up, you have to down\up. 107 | 108 | Adding/removing users requires restarting the sing-box 109 | ``` 110 | docker restart sing-box 111 | ``` 112 | 113 | ## Multi-accounting on VLESS 114 | Example coming soon -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Docker Hub](https://img.shields.io/badge/%20-DockerHub-blue?logo=docker)](https://hub.docker.com/r/itdoginfo/sing-box) 2 | ![Docker Pulls](https://img.shields.io/docker/pulls/itdoginfo/sing-box) 3 | 4 | [![Docker Hub](https://img.shields.io/badge/%20-GitHub-black?logo=github)](https://github.com/itdoginfo/sing-box) 5 | ![GitHub Repo stars](https://img.shields.io/github/stars/itdoginfo/sing-box) 6 | 7 | [English README](https://github.com/itdoginfo/sing-box/blob/main/README.EN.md) 8 | 9 | Docker image для поднятия proxy-сервера c технологиями shadowsocks2022 и VLESS. 10 | 11 | ## Установка 12 | ``` 13 | mkdir sing-box && cd sing-box && wget https://raw.githubusercontent.com/itdoginfo/sing-box/main/docker-compose.yml 14 | ``` 15 | 16 | ### Shadowsocks2022 17 | Сгенерировать пароль 18 | ``` 19 | docker run itdoginfo/sing-box:v1.9.3 gen-ss 20 | ``` 21 | 22 | Вставить полученный пароль в environment PASS. 23 | Там же указать домен сервера или его IP-адрес. 24 | Указать, что это shadowsocks 25 | 26 | Пример: 27 | ``` 28 | environment: 29 | PROTOCOL: shadowsocks 30 | PASS: "ta87nmRO+LYN0P3Wx57ZTw==" 31 | SERVER: proxy.itdog.info 32 | ``` 33 | 34 | Поднять контейнер 35 | ``` 36 | docker compose up -d 37 | ``` 38 | 39 | Доступные env переменные: 40 | - SERVER (обязательная) 41 | - PASS (обязательная) 42 | - [METHOD](https://sing-box.sagernet.org/configuration/outbound/shadowsocks/#method) 43 | - PORT 44 | - NAME (config name) 45 | 46 | ### VLESS 47 | Сгенерировать UIID, Private и public keys, Short ID 48 | ``` 49 | docker run itdoginfo/sing-box:v1.9.3 gen-vless 50 | ``` 51 | 52 | Вставить полученные значения в environment. 53 | Там же указать домен сервера или его IP-адрес. 54 | Указать, что это vless. 55 | Подобрать сайт, под который будет производиться маскировка (HTTP2, TLS 1.3, не заблокирован). 56 | 57 | Пример: 58 | ``` 59 | environment: 60 | PROTOCOL: vless 61 | SERVER: proxy.itdog.info 62 | UUID: 71c48bba-6b5d-484d-83ef-b047ab96f1a3 63 | PRIVATE_KEY: KCaRO6tGf6dLXH21HOJkPaKYQAG64WdR4JVHx41TLnc 64 | PUBLIC_KEY: 3h_XmVpREusSRsLo8ii3GtIpGZf-2cP5iBrQ7uzVm2Q 65 | SHORT_ID: b627ec56b4f8ff40 66 | FAKE_SERVER: www.youtube.com 67 | ``` 68 | 69 | Поднять контейнер 70 | ``` 71 | docker compose up -d 72 | ``` 73 | 74 | Доступные env переменные: 75 | - SERVER (обязательная) 76 | - UUID (обязательная) 77 | - PRIVATE_KEY (обязательная) 78 | - PUBLIC_KEY (обязательная) 79 | - SHORT_ID 80 | - FAKE_SERVER 81 | - PORT 82 | - NAME (config name) 83 | 84 | ## Настройка клиентов 85 | Получить данные для настройки устройств 86 | ``` 87 | docker exec sing-box show 88 | ``` 89 | 90 | # Работа с несколькими аккаунтами 91 | В docker-compose.yml раскоментировать 92 | ``` 93 | # volumes: 94 | # - ./config:/etc/sing-box/ 95 | ``` 96 | 97 | Скачать темплейт конфига 98 | ``` 99 | mkdir config && wget -O config/config.json https://raw.githubusercontent.com/itdoginfo/sing-box/main/config/config.json 100 | ``` 101 | 102 | При своём конфиге в docker-compose нужны только переменные SERVER(SS2022, VLESS) и PUBLIC_KEY(VLESS). 103 | 104 | ## Shadowsocks2022 105 | 106 | Сгенерировать mainpass и пароли для юзеров 107 | ``` 108 | docker run itdoginfo/sing-box:v1.9.3 gen-ss 109 | ``` 110 | 111 | Проставить их в `config/config.json`. Имена для юзеров любые, они будут отображаться при добавлении конфига на устройство. 112 | 113 | При уже поднятом контейнере без volume требуется down\up. 114 | 115 | При добавлении\удалении пользователей требуется рестарт sing-box 116 | ``` 117 | docker restart sing-box 118 | ``` 119 | 120 | # VLESS 121 | Сгенерировать ключи, short_id и первый UUID 122 | ``` 123 | docker run itdoginfo/sing-box:v1.9.3 gen-vless 124 | ``` 125 | PrivateKey, SHORT_ID подставить в объект **tls**. 126 | PublicKey в переменную docker-compose **PUBLIC_KEY**. 127 | 128 | UUID проставить первому юзеру. Для второго юзера снова запустить команду gen-vless. Брать только UUID для следующих юзеров. PrivateKey, PublicKey, SHORT_ID общие для всех. 129 | 130 | Пример конфигурации с двумя юзерами для SS2022 и VLESS: https://github.com/itdoginfo/sing-box/blob/main/config/config.json 131 | 132 | # Dev mode 133 | ``` 134 | docker compose -f docker-compose-dev.yml build 135 | docker compose -f docker-compose-dev.yml up 136 | ``` -------------------------------------------------------------------------------- /config-template-shadowsocks.json: -------------------------------------------------------------------------------- 1 | { 2 | "inbounds": [ 3 | { 4 | "type": "shadowsocks", 5 | "listen": "::", 6 | "listen_port": {{PORT}}, 7 | "network": "tcp", 8 | "method": "{{METHOD}}", 9 | "password": "{{PASS}}" 10 | } 11 | ] 12 | } -------------------------------------------------------------------------------- /config-template-vless.json: -------------------------------------------------------------------------------- 1 | { 2 | "inbounds": [ 3 | { 4 | "type": "vless", 5 | "listen": "::", 6 | "listen_port": {{PORT}}, 7 | "users": [ 8 | { 9 | "name": "{{NAME}}", 10 | "uuid": "{{UUID}}", 11 | "flow": "xtls-rprx-vision" 12 | } 13 | ], 14 | "tls": { 15 | "enabled": true, 16 | "server_name": "{{FAKE_SERVER}}", 17 | "reality": { 18 | "enabled": true, 19 | "handshake": { 20 | "server": "{{FAKE_SERVER}}", 21 | "server_port": 443 22 | }, 23 | "private_key": "{{PRIVATE_KEY}}", 24 | "short_id": [ 25 | "{{SHORT_ID}}" 26 | ], 27 | "max_time_difference": "5m" 28 | } 29 | } 30 | } 31 | ] 32 | } -------------------------------------------------------------------------------- /config/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "inbounds": [ 3 | { 4 | "type": "shadowsocks", 5 | "listen": "::", 6 | "listen_port": 80, 7 | "network": "tcp", 8 | "method": "2022-blake3-aes-128-gcm", 9 | "password": "bqiVe2GIty1zNj0k6qvQiQ==", 10 | "users": [ 11 | { 12 | "name": "user1", 13 | "password": "eNFPKAnNMSZnPnNetIqh+Q==" 14 | }, 15 | { 16 | "name": "user2", 17 | "password": "DO/NgDIj7JOM0M/uKOuz1A==" 18 | } 19 | ] 20 | }, 21 | { 22 | "type": "vless", 23 | "listen": "::", 24 | "listen_port": 443, 25 | "users": [ 26 | { 27 | "name": "user1", 28 | "uuid": "c2794de3-9d00-4408-bb39-c95cbf46caaa", 29 | "flow": "xtls-rprx-vision" 30 | }, 31 | { 32 | "name": "user2", 33 | "uuid": "96941b6d-c965-465a-a2f4-0f6b1e3c2657", 34 | "flow": "xtls-rprx-vision" 35 | } 36 | ], 37 | "tls": { 38 | "enabled": true, 39 | "server_name": "www.microsoft.com", 40 | "reality": { 41 | "enabled": true, 42 | "handshake": { 43 | "server": "www.microsoft.com", 44 | "server_port": 443 45 | }, 46 | "private_key": "qBYva0paWKZbFCQrrg2wEAX7YK2x-PVuG53rP_4ZvGs", 47 | "short_id": [ 48 | "5aa712c1b90e36a9" 49 | ], 50 | "max_time_difference": "5m" 51 | } 52 | } 53 | } 54 | ] 55 | } -------------------------------------------------------------------------------- /docker-compose-dev.yml: -------------------------------------------------------------------------------- 1 | services: 2 | sing-box: 3 | container_name: sing-box 4 | image: itdoginfo/sing-box:test 5 | build: 6 | context: . 7 | args: 8 | RELEASE: v1.9.3 9 | ports: 10 | - "443:443" 11 | environment: 12 | SERVER: test.com 13 | PUBLIC_KEY: yieryEYXzNejHPUqY7UnIHLKQOGvxAHfGkjsvTihO3w 14 | volumes: 15 | - ./config:/etc/sing-box/ -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | services: 2 | sing-box: 3 | container_name: sing-box 4 | image: itdoginfo/sing-box:v1.9.3 5 | ports: 6 | - "443:443" 7 | environment: 8 | PROTOCOL: shadowsocks 9 | PASS: "pass" 10 | SERVER: domain\ip 11 | #PUBLIC_KEY: 12 | restart: always 13 | # Enable for custom config (multiple accounts for example) 14 | # volumes: 15 | # - ./config:/etc/sing-box/ -------------------------------------------------------------------------------- /entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | mustpl -d '{"SERVER": "${SERVER:-SET_SERVER}", "PUBLIC_KEY": "${PUBLIC_KEY:-SET_PUBLIC_KEY}", "NAME": "${NAME:-ss}"}' -o /bin/show /opt/show-template 4 | chmod +x /bin/show 5 | 6 | if [ ! -f /etc/sing-box/config.json ] && [ "${PROTOCOL}" = "shadowsocks" ]; then 7 | mustpl -d '{"METHOD": "${METHOD:-2022-blake3-aes-128-gcm}", "PASS": "${PASS:-SET_PASSWORD}", "PORT": "${PORT:-443}"}' -o /etc/sing-box/config.json /opt/config-template-shadowsocks.json 8 | elif [ ! -f /etc/sing-box/config.json ] && [ "${PROTOCOL}" = "vless" ]; then 9 | mustpl -d '{"UUID": "${UUID:-SET_UUID}", "PRIVATE_KEY": "${PRIVATE_KEY:-SET_PRIVATE_KEY}", "SHORT_ID": "${SHORT_ID:-153bb5b1383b79fd}", "FAKE_SERVER": "${FAKE_SERVER:-www.google.com}", "PORT": "${PORT:-443}", "NAME": "${NAME:-vless}"}}' -o /etc/sing-box/config.json /opt/config-template-vless.json 10 | fi 11 | 12 | exec "$@" -------------------------------------------------------------------------------- /gen-ss: -------------------------------------------------------------------------------- 1 | sing-box generate rand --base64 16 -------------------------------------------------------------------------------- /gen-vless: -------------------------------------------------------------------------------- 1 | echo "UIID:" 2 | sing-box generate uuid 3 | echo "PRIVATE_KEY & PUBLIC_KEY:" 4 | sing-box generate reality-keypair 5 | echo "SHORT_ID:" 6 | sing-box generate rand --hex 8 -------------------------------------------------------------------------------- /show-template: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Main 4 | CONFIG=/etc/sing-box/config.json 5 | SERVER="{{SERVER}}" 6 | PROTOCOL=$(jq -r ".inbounds[].type" $CONFIG) 7 | NAME="{{NAME}}" 8 | 9 | # Shadowsocks 10 | METHOD=$(jq -r '.inbounds[] | select(.method | index("2022-")) | .method' $CONFIG) 11 | SERVER_KEY=$(jq -r '.inbounds[] | select(.method | index("2022-")) | .password' $CONFIG) 12 | PORT_SHADOWSOCKS=$(jq -r '.inbounds[] | select(.method | index("2022-")) | .listen_port' $CONFIG) 13 | COUNT_SHADOWSOCKS=$(jq -r '.inbounds[] | select(.method | index("2022-")) | .users | length' $CONFIG) 14 | 15 | # VLESS 16 | PUBLIC_KEY="{{PUBLIC_KEY}}" 17 | PORT_VLESS=$(jq -r '.inbounds[] | select(.type=="vless") | .listen_port' $CONFIG) 18 | SNI=$(jq -r '.inbounds[] | select(.type=="vless") | .tls.reality.handshake.server' $CONFIG) 19 | SID=$(jq -r '.inbounds[] | select(.type=="vless") | .tls.reality.short_id[]' $CONFIG) 20 | COUNT_VLESS=$(jq -r '.inbounds[] | select(.type=="vless") | .users | length' $CONFIG) 21 | 22 | readarray -t array < <(printf '%s' "$PROTOCOL") 23 | for i in "${array[@]}"; do 24 | if [ "$i" == shadowsocks ]; then 25 | if grep -q users $CONFIG; then 26 | for ((x = 0 ; x < $COUNT_SHADOWSOCKS ; x++ )); do 27 | CLIENT_NAME=$(jq -r ".inbounds[] | select(.method | index(\"2022-\")) | .users[$x].name" $CONFIG) 28 | CLIENT_KEY=$(jq -r ".inbounds[] | select(.method | index(\"2022-\")) | .users[$x].password" $CONFIG) 29 | BASE64=$(base64 -w 0 <<< $METHOD:$SERVER_KEY:$CLIENT_KEY) 30 | printf "\033[1m"%s"\033[0m\n" "$CLIENT_NAME Shadowsocks2022" 31 | printf "Clipboard string: ss://$BASE64@$SERVER:$PORT_SHADOWSOCKS#$CLIENT_NAME\n\n" 32 | printf "Manual config:\n" 33 | printf " Adress: $SERVER\n" 34 | printf " Port: $PORT_SHADOWSOCKS\n" 35 | printf " Password: $SERVER_KEY:$CLIENT_KEY\n" 36 | printf " Method\Security: $METHOD\n\n" 37 | echo "QRCode:" 38 | echo "ss://$BASE64@$SERVER:$PORT_SHADOWSOCKS#$CLIENT_NAME" | qrencode -t utf8 39 | echo -e "\n" 40 | done 41 | else 42 | BASE64=$(base64 -w 0 <<< $METHOD:$SERVER_KEY) 43 | printf "Clipboard string: ss://$BASE64@$SERVER:$PORT_SHADOWSOCKS#$NAME\n\n" 44 | printf "Manual config:\n" 45 | printf " Adress: $SERVER\n" 46 | printf " Port: $PORT_SHADOWSOCKS\n" 47 | printf " Password: $SERVER_KEY\n" 48 | printf " Method\Security: $METHOD\n\n" 49 | echo "QRCode:" 50 | echo "ss://$BASE64@$SERVER:$PORT_SHADOWSOCKS#$NAME" | qrencode -t utf8 51 | echo -e "\n" 52 | fi 53 | elif [ "$i" == vless ]; then 54 | for ((x = 0 ; x < $COUNT_VLESS ; x++ )); do 55 | CLIENT_UUID=$(jq -r ".inbounds[] | select(.type==\"vless\") | .users[$x].uuid" $CONFIG) 56 | CLIENT_NAME=$(jq -jr ".inbounds[] | select(.type==\"vless\") | .users[$x].name" $CONFIG) 57 | printf "\033[1m"%s"\033[0m\n" "$CLIENT_NAME VLESS" 58 | printf "Clipboard string: vless://$CLIENT_UUID@$SERVER:$PORT_VLESS/?type=tcp&encryption=none&flow=xtls-rprx-vision&sni=$SNI&fp=chrome&security=reality&pbk=$PUBLIC_KEY&sid=$SID#$CLIENT_NAME\n\n" 59 | printf "Manual config:\n" 60 | printf " Adress: $SERVER\n" 61 | printf " Port: $PORT_VLESS\n" 62 | printf " UUID: $CLIENT_UUID\n" 63 | printf " Reality: true, flow: xtls-rprx-vision\n" 64 | printf " Fake server (SNI, Server name): $SNI\n" 65 | printf " Public key: $PUBLIC_KEY\n" 66 | printf " Short ID: $SID\n\n" 67 | echo "QRCode:" 68 | echo "vless://$CLIENT_UUID@$SERVER:$PORT_VLESS?type=tcp&encryption=none&flow=xtls-rprx-vision&sni=$SNI&fp=chrome&security=reality&pbk=$PUBLIC_KEY&sid=$SID#$CLIENT_NAME" | qrencode -t utf8 69 | echo -e "\n" 70 | done 71 | fi 72 | done --------------------------------------------------------------------------------