Commit 1127d9de authored by nanahira's avatar nanahira

first

parent 7da120d4
Pipeline #532 failed with stages
in 2 minutes and 31 seconds
stages:
- build
- deploy
variables:
GIT_DEPTH: "1"
CONTAINER_TEST_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
CONTAINER_RELEASE_IMAGE: $CI_REGISTRY_IMAGE:latest
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
build:
stage: build
tags:
- docker
script:
- docker build --pull -t $CONTAINER_TEST_IMAGE .
- docker push $CONTAINER_TEST_IMAGE
deploy_latest:
stage: deploy
tags:
- docker
script:
- docker pull $CONTAINER_TEST_IMAGE
- docker tag $CONTAINER_TEST_IMAGE $CONTAINER_RELEASE_IMAGE
- docker push $CONTAINER_RELEASE_IMAGE
only:
- master
deploy_tag:
stage: deploy
tags:
- docker
variables:
CONTAINER_TAG_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG
script:
- docker pull $CONTAINER_TEST_IMAGE
- docker tag $CONTAINER_TEST_IMAGE $CONTAINER_TAG_IMAGE
- docker push $CONTAINER_TAG_IMAGE
only:
- tags
FROM golang as builder
RUN go env -w GO111MODULE=auto \
&& go env -w CGO_ENABLED=0 \
&& go env -w GOPROXY=https://goproxy.cn,https://gocenter.io,https://goproxy.io,direct \
&& go get golang.org/x/net/websocket
WORKDIR /usr/src/app
COPY ./main.go ./
RUN go build -ldflags "-s -w -extldflags '-static'" -o maotama-server main.go
FROM debian:buster-slim
RUN apt update && \
apt -y install dnsutils && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
COPY ./entrypoint.sh /
COPY --from=builder /usr/src/app/maotama-server /usr/bin/
WORKDIR /data
ENV TZ Asia/Shanghai
ENTRYPOINT [ "/entrypoint.sh" ]
CMD [ "/usr/bin/maotama-server" ]
#!/bin/bash
export ADDRESS=$(dig whoami.cloudflare ch txt @1.0.0.1 +short | sed 's/\"//g')
exec "$@"
package main
import (
"fmt"
"log"
"net"
"net/http"
"os"
"golang.org/x/net/websocket"
)
var IP = os.Getenv("ADDRESS")
func transfer(local *net.UDPConn, remote *net.UDPConn, remotAddr *net.UDPAddr) {
buffer := make([]byte, 2048)
for {
length, _, _ := local.ReadFromUDP(buffer)
remote.WriteToUDP(buffer[:length], remotAddr)
}
}
func serverTransfer(client *net.UDPConn, remoteAddr *net.UDPAddr, channel chan []byte) {
for {
message := <-channel
client.WriteToUDP(message, remoteAddr)
}
}
func listenUDP(ws *websocket.Conn) {
server, err := net.ListenUDP("udp", nil)
if err != nil {
log.Println(err)
return
}
clients := make(map[string]chan []byte)
reply := fmt.Sprintf("LISTEN %s:%d", IP, server.LocalAddr().(*net.UDPAddr).Port)
ws.Write([]byte(reply))
for {
message := make([]byte, 2048)
length, clientAddr, _ := server.ReadFromUDP(message)
channel, ok := clients[clientAddr.String()]
if !ok {
client, err := net.ListenUDP("udp", nil)
if err != nil {
log.Println(err)
return
}
reply = fmt.Sprintf("CONNECT %s:%d", IP, client.LocalAddr().(*net.UDPAddr).Port)
ws.Write([]byte(reply))
_, remoteAddr, _ := client.ReadFromUDP(make([]byte, 2048))
reply = fmt.Sprintf("CONNECTED %s:%d", IP, client.LocalAddr().(*net.UDPAddr).Port)
ws.Write([]byte(reply))
client.WriteToUDP(message[:length], remoteAddr)
go transfer(client, server, clientAddr)
channel := make(chan []byte)
clients[clientAddr.String()] = channel
go serverTransfer(client, remoteAddr, channel)
} else {
channel <- message[:length]
}
}
}
func handler(ws *websocket.Conn) {
defer ws.Close()
go listenUDP(ws)
ws.Read(make([]byte, 1))
log.Println("Websocket disconnected")
}
func main() {
http.Handle("/", websocket.Handler(handler))
log.Println("Maotama server started on " + IP)
err := http.ListenAndServeTLS(":10800", "./cert/fullchain.pem",
"./cert/privkey.pem", nil)
if err != nil {
panic("ListenAndServe: " + err.Error())
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment