From 62a03a5d1d7b29a5468c665c4b33df41fa115903 Mon Sep 17 00:00:00 2001 From: Robert Zhou Date: Fri, 8 May 2020 23:18:53 +0100 Subject: [PATCH] readme --- .env | 15 +++++-- Dockerfile | 3 +- README.md | 84 +++++++++++++++++++++++++++++---------- README_cn.md | 83 ++++++++++++++++++++++++++++++++++++++ conf/html/404.html | 10 +++++ conf/html/index.html | 10 +++++ docker-build.sh | 2 - docker-compose.yml | 20 +++++++--- docker-conf/config.json | 56 +++++++++++++------------- docker-conf/default.conf | 2 +- entrypoint.sh | 2 + images/v2rayn.png | Bin 0 -> 22110 bytes 12 files changed, 225 insertions(+), 62 deletions(-) create mode 100644 README_cn.md create mode 100644 conf/html/404.html create mode 100644 conf/html/index.html create mode 100644 images/v2rayn.png diff --git a/.env b/.env index 21e213b..15d53fe 100644 --- a/.env +++ b/.env @@ -1,6 +1,15 @@ -APP_NAME=myserver -APP_DOMAIN=example.com -ACME_EMAIL=myemail@example.com +#APP_NAME=myserver +#APP_DOMAIN=example.com +#ACME_EMAIL=myemail@example.com + +APP_NAME=vs +APP_DOMAIN=alibaba-portal.com +ACME_EMAIL=alphacodinghub@outlook.com + +LISTENING_PORT=3003 +CLIENT_ID=2e5762cc-20d2-42b1-b0ad-cbe55dc5fa35 +CLIENT_ALTERID=64 +CLIENT_WSPATH=/allproducts # with above settings, you can visit traefik dashboard at: # https://traefik.example.com diff --git a/Dockerfile b/Dockerfile index 72f1a44..ba35e6c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,8 +14,9 @@ LABEL Maintainer="George Zhou" \ Language="HTML" \ OS="Alpine Linux" \ Service="V2Ray" \ - Content="V2RAY" + Content="V2RAY and Nginx server" +ENV LISTENING_PORT 3456 ENV CLIENT_ID "2e5762cc-20d2-42b1-b0ad-cbe55dc5fa35" ENV CLIENT_ALTERID 64 ENV CLIENT_WSPATH "/allproducts" diff --git a/README.md b/README.md index 9ee552f..ae9ae0e 100644 --- a/README.md +++ b/README.md @@ -1,34 +1,76 @@ -# v2ray-ws-tls-all-in-one +# v2ray websocks tls + web all-in-one Docker ![](https://img.shields.io/badge/language-Web-orange.svg) ![](https://img.shields.io/badge/platform-Docker-lightgrey.svg)[![](https://img.shields.io/badge/Traefik-v2.x-blue.svg)](https://containo.us/traefik/) ![](https://img.shields.io/badge/license-MIT-000000.svg) -**A v2ray docker image work with nginx** +## [中文指引请点击此处](https://github.com/alphacodinghub/v2ray/blob/master/README_cn.md) -- v2ray work with websocket -- v2ray request proxy_pass by nginx -- custom v2ray settings -- add environment variables to edit optional setting - - CLIENT_ID (default ad806487-2d26-4636-98b6-ab85cc8521f7) - - CLIENT_ALTERID (default 64) - - CLIENT_WSPATH (default /ws) - - VER (default 4.23.1) -- don't need custom domain and ssl certificate -- only cost 1 pods +## V2Ray quick deployment using Traefik -**USE: deploy this image and add default secure route with port 8080 in arukas** +- The Docker image is based on the latest official release and integrated with Nginx and a basic website. +- Deployment using Traefik, easy operation. +- Traefik automatically manages ssl certificates. +- A basic static website is integrated with the image. It will redirect to baidu.com by default however you can replace it with your own real website. +- V2Ray parameters can be easily customized using the `.env` file. You don't need to change the `docker-compose.yml` file. +- Main parameters you can customize indlude domain name, UUID, v2ray listening port, and the camouflaged path. -- path to v2ray: https://your.domain/fuckgfw_letscrossgfw -- path to websites: /usr/share/nginx/html/ +## V2Ray server setup and configuration -实例教程参考 : +### 1. VPS -- [V2Ray+WebSocket+TLS+Nginx 配置与使用教程](https://doubibackup.com/v2ray-ws-tls-nginx.html) -- https://toutyrater.github.io/advanced/wss_and_web.html -- https://bawodu.com/openshift-v2ray/ +- To buy a VPS and install Docker engine and git tool. +- To buy a domain, e.g. example.com. +- Choose an app name for your V2Ray server, e.g. `myapp`. Your camouflaged website url will then be `https://myapp.example.com`. +- Configure the DNS to point the domain `myapp.example.com` to the IP address of your VPS. + +### 2. Clone this project to your VPS + +``` +- mkdir /app +- cd /app +- git clone https://github.com/alphacodinghub/v2ray-nginx-docker.git +- cd v2ray-nginx-docker +``` + +### 3. Configure VPS + +To edit `.env` file and set necessary parameters. These three parameters must be set to your own values: APP_NAME (as chosen in Step 1), APP_DOMAIN, ACME_EMAIL (your email address for Let's Encrypt to apply for and renew ssl certificates). All other parameters can use the default values as provided. The final `.env` file should look like this (you should set your own values): + +``` +APP_NAME=myapp +APP_DOMAIN=example.com +ACME_EMAIL=myemail@example.com +LISTENING_PORT=3033 +CLIENT_ID=2e5762cc-20d2-42b1-b0ad-cbe55dc5fa35 +CLIENT_ALTERID=64 +CLIENT_WSPATH=/allproducts +``` + +In the above settings, `CLIENT_WSPATH` is the so-called camouflaged path which should be set to the same value at the VPS server and user clients. + +### 4. Website settings + +By default, the caouflaged website will be redirected to baidu.com. You can copy your real website content to `./conf/html` folder to replace original files. + +### 5. Start V2Ray server + +After above settings, you can run the following command in folder `/app/v2ray-nginx-docker` to start the V2Ray server: `docker-compose up -d`. The `-d` option is to tell the programme to run in the background. + +Run this command to check the running containers: `docker ps`. + +To access to Traefik Dashboard:https://traefik.example.com +To visit the camouflaged website:https://myapp.example.com + +## Client configuration + +Download the Windows client V2RayN, run it and click the menu: server - add [VMess] server. Please set the values according to the below figure: +![v2ray配置](https://github.com/alphacodinghub/v2ray/blob/master/images/v2rayn.png) + +> **References** + +- [Official Project V Website](https://www.v2ray.com/) +- [新白话文教程-V2Ray 配置指南](https://guide.v2fly.org/) - Official Dockerfile - https://github.com/v2ray/ext -- https://toutyrater.github.io/app/docker-deploy-v2ray.html -- SSR proxy settings - a great explaination diff --git a/README_cn.md b/README_cn.md new file mode 100644 index 0000000..a5d0902 --- /dev/null +++ b/README_cn.md @@ -0,0 +1,83 @@ +# v2ray websocks tls + web all-in-one Docker + + +![](https://img.shields.io/badge/language-Web-orange.svg) +![](https://img.shields.io/badge/platform-Docker-lightgrey.svg)[![](https://img.shields.io/badge/Traefik-v2.x-blue.svg)](https://containo.us/traefik/) +![](https://img.shields.io/badge/license-MIT-000000.svg) + +## Traefik 快速部署 V2RAY + +- Docker 镜像基于 v2ray 官方最新版本,并集成 Nginx 服务器和一个简易网站 +- 使用 Traefik 反向代理进行部署,操作简单,系统稳定 +- Traefik 自动管理 Let's Encrypt,自动申请 ssl 证书,证书过期前自动更新 +- 集成了一个简易伪装网站,缺省跳转至百度;也可以作为正式网站使用,只要将网站内容放到指定目录即可 +- 可以定制 v2ray 参数,只要在.env 中按照模板设置相应参数即可,无需修改 docker-compose.yml +- 可以定制的 v2ray 参数包括:域名、UUID、监听端口、伪装路径等 + +## 服务器安装和配置步骤 + +### 1. 准备虚拟主机 + +- 申请虚拟主机,安装最新的 Docker 引擎和 git 工具。 +- 申请一个域名,例如 `example.com`。 +- 选择一个名字作为`v2ray`应用的名称,例如`myapp`,那么`https://myapp.example.com`就是那个伪装的网站入口。 +- 配置域名服务器,将`myapp.example.com`指向上一步申请的虚拟主机的 IP 地址。 + +### 2. 将本项目克隆到虚拟机相应目录,例如 /app/v2ray-nginx-docker + +```script class:"lineNo" +- mkdir /app +- cd /app +- git clone https://github.com/alphacodinghub/v2ray-nginx-docker.git +- cd v2ray-nginx-docker +``` + +### 3. 配置参数(服务器) + +紧接着修改`.env`文件,设定相关参数,以下三个参数必须设置:`APP_NAME`(第一步中选定的 v2ray 应用名称),`APP_DOMAIN`(第一步中申请的域名),`ACME_EMAIL`(你的 Email 地址,Let's Engcrypt 申请和更新证书的时候需要),其它参数都可以使用缺省参数,甚至可以从`.env`文件中去掉,`docker-compose.yml`中设置了缺省参数,可以打开查看。设置好的`.env`文件看起来这样: + +```env +APP_NAME=myapp +APP_DOMAIN=example.com +ACME_EMAIL=myemail@example.com +LISTENING_PORT=3033 +CLIENT_ID=2e5762cc-20d2-42b1-b0ad-cbe55dc5fa35 +CLIENT_ALTERID=64 +CLIENT_WSPATH=/allproducts +``` + +#### 上述配置中 + +``` +- LISTENING_PORT: 是v2ray服务的监听端口 +- CLIENT_ID: 是UUID,必须按规定的格式设置,v2ray用UUID加密传输,可以使用在线工具(https://www.uuidgenerator.net/)生成UUID +- CLIENT_ALTERID: 是`alterid`,为了进一步防止被探测,一个用户可以在主 UUID 的基础上,再额外生成多个 ID。这里只需要指定额UUUU ID 的数量,推荐值为 4。不指定的话,默认值是 0。最大值 65535。客户端也有对应的设置,客户端的这个值不能超过服务器端所指定的值 +- CLIENT_WSPATH: 设置的伪装路径,客户端的配置要和服务器端的一致 +- 如上配置的伪装网站为`https://myapp.example.com`,完整的v2ray伪装路径是`myapp.example.com/allproducts` +``` + +### 4. 伪装网站的配置 + +缺省情况下访问伪装网站`https://myapp.example.com`时会跳转至百度。可以将所需伪装成的网站拷贝至目录`./conf/html`下替换原有文件即可。如果直接访问伪装路径`https://myapp.example.com/allproducts`则会返回`Bad Request`。 + +### 5. 启动服务器 + +按上述步骤配置以后,在目录`/app/v2ray-nginx-docker`下运行下述命令即可: `docker-compose up -d`,其中参数`-d`表示在后台运行。查看启动的容器用这个命令: +`docker ps`。至此,服务器端的部署已经完成。 + +访问 Traefik Dashboard:https://traefik.example.com +访问伪装网站:https://myapp.example.com + +## 客户端配置 + +下载 Windows 客户端 V2RayN。 +打开软件,依次点击:服务器 - 添加[VMess]服务器,按下图配置参数: + +![v2ray配置](https://github.com/alphacodinghub/v2ray/blob/master/images/v2rayn.png) + +> **参考资料:** + +- [官方 Project V 网站](https://www.v2ray.com/) +- [新白话文教程-V2Ray 配置指南](https://guide.v2fly.org/) +- Official Dockerfile +- https://github.com/v2ray/ext diff --git a/conf/html/404.html b/conf/html/404.html new file mode 100644 index 0000000..23e030e --- /dev/null +++ b/conf/html/404.html @@ -0,0 +1,10 @@ + + + + HTML Meta Tag + + + +

Welcome to Baidu world!

+ + \ No newline at end of file diff --git a/conf/html/index.html b/conf/html/index.html new file mode 100644 index 0000000..23e030e --- /dev/null +++ b/conf/html/index.html @@ -0,0 +1,10 @@ + + + + HTML Meta Tag + + + +

Welcome to Baidu world!

+ + \ No newline at end of file diff --git a/docker-build.sh b/docker-build.sh index 693a938..6429358 100644 --- a/docker-build.sh +++ b/docker-build.sh @@ -1,6 +1,4 @@ #!/bin/bash -set -ex - TAG="4.23" docker build -t alphacodinghub/v2ray-nginx:$TAG . docker build -t alphacodinghub/v2ray-nginx:latest . diff --git a/docker-compose.yml b/docker-compose.yml index 667d7ce..d574010 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,7 +5,7 @@ services: #### Traefik Proxy Setup ##### ############################################### traefik: - image: traefik:v2.2 + image: traefik:v2.2.1 restart: always container_name: traefik ports: @@ -18,11 +18,10 @@ services: - --api.dashboard=true # <== Enabling the dashboard to view services, middlewares, routers, etc... - --api.debug=true # <== Enabling additional endpoints for debugging and profiling ## Log Settings (options: ERROR, DEBUG, PANIC, FATAL, WARN, INFO) - https://docs.traefik.io/observability/logs/ ## - - --log.level=WARN # <== Setting the level of the logs from traefik + - --log.level=DEBUG # <== Setting the level of the logs from traefik ## Provider Settings - https://docs.traefik.io/providers/docker/#provider-configuration ## - --providers.docker=true # <== Enabling docker as the provider for traefik - --providers.docker.exposedbydefault=false # <== Don't expose every container to traefik, only expose enabled ones - - --providers.docker.network=web # <== Operate on the docker network named web on frontend ## Entrypoints Settings - https://docs.traefik.io/routing/entrypoints/#configuration ## - --entrypoints.web.address=:80 # <== Defining an entrypoint for port :80 named web - --entrypoints.web-secured.address=:443 # <== Defining an entrypoint for https on port :443 named web-secured @@ -31,8 +30,8 @@ services: - --certificatesresolvers.mytlschallenge.acme.email=${ACME_EMAIL} # <== Setting email for certs - --certificatesresolvers.mytlschallenge.acme.storage=/letsencrypt/acme.json # <== Defining acme file to store cert information volumes: - - ./config/traefik/letsencrypt:/letsencrypt # <== Volume for certs (TLS) - - /var/run/docker.sock:/var/run/docker.sock # <== Volume for docker admin + - ./conf/traefik/letsencrypt:/letsencrypt # <== Volume for certs (TLS) + - /var/run/docker.sock:/var/run/docker.sock # <== Volume for docker admin. Don't change it! labels: #### Labels define the behavior and rules of the traefik proxy for this container #### traefik.enable: true # <== Enable traefik on itself to view dashboard and assign subdomain to view it @@ -57,11 +56,20 @@ services: ############################################## v2ray: image: alphacodinghub/v2ray-nginx + ports: + - ${LISTENING_PORT:-3003} container_name: v2ray restart: always + environment: + LISTENING_PORT: ${LISTENING_PORT:-3003} + CLIENT_ID: ${CLIENT_ID:-2e5762cc-20d2-42b1-b0ad-cbe55dc5fa35} + CLIENT_ALTERID: ${CLIENT_ALTERID:-64} + CLIENT_WSPATH: ${CLIENT_WSPATH:-/allproducts} + volumes: + - ./conf/html:/var/www/html labels: #### Labels define the behavior and rules of the traefik proxy for this container #### traefik.enable: true # <== Enable traefik to proxy this container - traefik.http.routers.v2ray.rule: Host(`$(APP_NAME).${APP_DOMAIN}`) # <== Your Domain Name for the https rule + traefik.http.routers.v2ray.rule: Host(`${APP_NAME}.${APP_DOMAIN}`) # && PathPrefix(`${CLIENT_WSPATH:-/allproducts}`) # <== Your Domain Name for the https rule traefik.http.routers.v2ray.entrypoints: web-secured # <== Defining entrypoint for https, **ref: line 31 traefik.http.routers.v2ray.tls.certresolver: mytlschallenge # <== Defining certsresolvers for https diff --git a/docker-conf/config.json b/docker-conf/config.json index d82b7e3..af48ce4 100644 --- a/docker-conf/config.json +++ b/docker-conf/config.json @@ -1,30 +1,30 @@ { - "log": { - "access": "/var/log/v2ray/access.log", - "error": "/var/log/v2ray/error.log", - "loglevel": "debug" - }, - "inbound": { - "port": 30003, - "listen":"127.0.0.1", - "protocol": "vmess", - "settings": { - "clients": [ - { - "id": "CLIENT_ID", - "alterId": CLIENT_ALTERID - } - ] - }, - "streamSettings":{ - "network":"ws", - "wsSettings": { - "path": "CLIENT_WSPATH" - } - } - }, - "outbound": { - "protocol": "freedom", - "settings": {} - } + "log": { + "access": "/var/log/v2ray/access.log", + "error": "/var/log/v2ray/error.log", + "loglevel": "debug" + }, + "inbound": { + "port": LISTENING_PORT, + "listen": "127.0.0.1", + "protocol": "vmess", + "settings": { + "clients": [ + { + "id": "CLIENT_ID", + "alterId": CLIENT_ALTERID + } + ] + }, + "streamSettings": { + "network": "ws", + "wsSettings": { + "path": "CLIENT_WSPATH" + } + } + }, + "outbound": { + "protocol": "freedom", + "settings": {} + } } diff --git a/docker-conf/default.conf b/docker-conf/default.conf index 8aa9304..d9558c5 100644 --- a/docker-conf/default.conf +++ b/docker-conf/default.conf @@ -9,7 +9,7 @@ server { location CLIENT_WSPATH { proxy_redirect off; - proxy_pass http://127.0.0.1:30003; + proxy_pass http://127.0.0.1:LISTENING_PORT; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; diff --git a/entrypoint.sh b/entrypoint.sh index 2665aa2..aa2c410 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -1,6 +1,8 @@ #!/bin/sh +sed -i "s/LISTENING_PORT/$LISTENING_PORT/g" /etc/v2ray/config.json sed -i "s/CLIENT_ID/$CLIENT_ID/g" /etc/v2ray/config.json sed -i "s/CLIENT_ALTERID/$CLIENT_ALTERID/g" /etc/v2ray/config.json sed -i "s#CLIENT_WSPATH#$CLIENT_WSPATH#g" /etc/v2ray/config.json sed -i "s#CLIENT_WSPATH#$CLIENT_WSPATH#g" /etc/nginx/conf.d/default.conf +sed -i "s/LISTENING_PORT/$LISTENING_PORT/g" /etc/nginx/conf.d/default.conf exec "$@" \ No newline at end of file diff --git a/images/v2rayn.png b/images/v2rayn.png new file mode 100644 index 0000000000000000000000000000000000000000..3a9a2c1de438cf826fa27809123c2ff53d50a823 GIT binary patch literal 22110 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 literal 0 HcmV?d00001