frp教程

frp 是反向代理应用,支持 TCP/UDP/HTTP/HTTPS,可将内网服务暴露到公网。 安装目录:/root/frp 服务端配置 vim /root/frp/frps.ini [common] bind_port = 19000 allow_ports = 19001-19999 authentication_method = token token = XXXXXXXXXXXXXXXXXX log_file = /var/log/frp/frps.log log_max_days = 30 开机自启 vim /etc/systemd/system/frps.service [Unit] Description = frp server After = network.target syslog.target Wants = network.target [Service] Type = simple ExecStart = /root/frp/frps -c /root/frp/frps.ini [Install] WantedBy = multi-user.target systemctl enable --now frps 客户端配置 vim /root/frp/frpc.ini [common] server_addr = 公网IP或域名 server_port = 19000 authentication_method = token token = XXXXXXXXXXXXXXXXXX log_file = /var/log/frp/frpc.log log_max_days = 30 includes = /root/frp/servers/*.ini /root/frp/servers/ 下可配置多个转发规则: [name_ssh_01] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 19001 开机自启 vim /etc/systemd/system/frpc.service [Unit] Description = frp client After = network.target syslog.target Wants = network.target [Service] Type = simple ExecStart = /root/frp/frpc -c /root/frp/frpc.ini Restart = on-failure RestartSec = 60 [Install] WantedBy = multi-user.target systemctl enable --now frpc 无 systemd 时(手动 crontab) /root/start.sh ...

2018-04-16 · 1 分钟 · 180 字 · 王站站

minikube操作教程

安装 官方文档 amd64 curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 sudo install minikube-linux-amd64 /usr/local/bin/minikube arm64 curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-arm64 sudo install minikube-linux-arm64 /usr/local/bin/minikube 没安装 kubectl 可以使用 minikube kubectl -- 代替 kubectl 安装 官方文档 x86_64 curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" arm64 curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/arm64/kubectl" sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl kubectl version kubectl cluster-info kubectl get nodes 启动集群 minikube start --force kubectl get po -A minikube version Web 界面 ...

2018-04-09 · 2 分钟 · 343 字 · 王站站

ubuntu20.04系统dd成debian11并安装xray

将甲骨文 Ubuntu 20.04(1.4G)重装为 Debian 11(400MB),并部署 Xray。 1. 重装为 Debian 11 apt-get update apt-get install -y xz-utils openssl gawk file bash <(wget --no-check-certificate -qO- 'https://moeclub.org/attachment/LinuxShell/InstallNET.sh') \ -d 11 -v 64 -a -firmware -p "root密码" 等待约 20 分钟,失败则删除实例重试。 2. 初始化系统 timedatectl set-timezone Asia/Shanghai apt-get install -y nginx curl tar net-tools iftop # 配置 SSH authorized_keys ssh-keygen 3. 安装 Xray bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install -u root --version 1.5.3 cp config.json /usr/local/etc/xray/config.json 4. 配置 nginx mkdir -p /home/www/example.com vim /etc/nginx/sites-enabled/default # 设置 root /home/www/example.com systemctl restart nginx 5. 申请 SSL 证书 curl https://get.acme.sh | sh ~/.acme.sh/acme.sh --register-account -m email@gmail.com ~/.acme.sh/acme.sh --issue -d example.com --webroot /home/www/example.com/ mkdir -p /usr/local/etc/xray/cert ~/.acme.sh/acme.sh --installcert -d example.com \ --key-file /usr/local/etc/xray/cert/private.key \ --fullchain-file /usr/local/etc/xray/cert/cert.crt ~/.acme.sh/acme.sh --upgrade --auto-upgrade chmod -R 755 /usr/local/etc/xray/cert 6. 启动服务 systemctl restart xray nginx journalctl -u xray --output cat -f # 查看日志

2018-04-02 · 1 分钟 · 138 字 · 王站站

gorm中文文档

入门指南 概述 全功能 ORM 关联 (Has One、Has Many、Belongs To、Many To Many、多态、单表继承) Create、Save、Update、Delete、Find 前/后的勾子 基于Preload、Joins的预加载 事务、嵌套事务、保存点、回滚至保存点 Context、Prepared Statment 模式、DryRun 模式 批量插入、FindInBatches、查询至 Map SQL Builder, Upsert, Locking, Optimizer/Index/Comment Hints 复合主键 自动迁移 自定义 Logger 灵活的可扩展插件 API:Database Resolver(读写分离)、Prometheus… 所有特性都通过了测试 开发者友好 快速入门 package main import ( "gorm.io/gorm" "gorm.io/driver/sqlite" ) type Product struct { gorm.Model Code string Price uint } func main() { db, err := gorm.Open(sqlite.Open("test.db"), &amp;gorm.Config{}) if err != nil { panic("failed to connect database") } // 迁移 schema db.AutoMigrate(&amp;Product{}) // Create db.Create(&amp;Product{Code: "D42", Price: 100}) // Read var product Product db.First(&amp;product, 1) // 根据整形主键查找 db.First(&amp;product, "code = ?", "D42") // 查找 code 字段值为 D42 的记录 // Update - 将 product 的 price 更新为 200 db.Model(&amp;product).Update("Price", 200) // Update - 更新多个字段 db.Model(&amp;product).Updates(Product{Price: 200, Code: "F42"}) // 仅更新非零值字段 db.Model(&amp;product).Updates(map[string]interface{}{"Price": 200, "Code": "F42"}) // Delete - 删除 product db.Delete(&amp;product, 1) } 声明模型 type User struct { ID uint Name string Email *string Age uint8 Birthday *time.Time MemberNumber sql.NullString ActivedAt sql.NullTime CreatedAt time.Time UpdatedAt time.Time } gorm.Model ...

2018-03-26 · 10 分钟 · 2019 字 · 王站站

gin中文文档

Gin 是一个高性能 Go Web 框架。GitHub 安装 go get -u github.com/gin-gonic/gin import "github.com/gin-gonic/gin" Hello World package main import ( "net/http" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"message": "pong"}) }) r.Run() // 0.0.0.0:8080 } go run main.go 路由 HTTP 方法 router.GET("/someGet", getting) router.POST("/somePost", posting) router.PUT("/somePut", putting) router.DELETE("/someDelete", deleting) router.PATCH("/somePatch", patching) 路径参数 // 匹配 /user/john,不匹配 /user/ router.GET("/user/:name", func(c *gin.Context) { name := c.Param("name") c.String(http.StatusOK, "Hello %s", name) }) // 匹配 /user/john/send 等 router.GET("/user/:name/*action", func(c *gin.Context) { name := c.Param("name") action := c.Param("action") c.String(http.StatusOK, name+" is "+action) }) Query 参数 // /welcome?firstname=Jane&lastname=Doe router.GET("/welcome", func(c *gin.Context) { firstname := c.DefaultQuery("firstname", "Guest") lastname := c.Query("lastname") c.String(http.StatusOK, "Hello %s %s", firstname, lastname) }) Post 参数 router.POST("/form_post", func(c *gin.Context) { message := c.PostForm("message") nick := c.DefaultPostForm("nick", "anonymous") c.JSON(200, gin.H{"status": "posted", "message": message, "nick": nick}) }) 路由分组 v1 := router.Group("/v1") { v1.POST("/login", loginEndpoint) v1.POST("/submit", submitEndpoint) } 中间件 r := gin.New() r.Use(gin.Logger()) r.Use(gin.Recovery()) authorized := r.Group("/") authorized.Use(AuthRequired()) { authorized.POST("/login", loginEndpoint) } 文件上传 // 单文件 router.POST("/upload", func(c *gin.Context) { file, _ := c.FormFile("file") c.SaveUploadedFile(file, "./"+file.Filename) c.String(http.StatusOK, "'%s' uploaded!", file.Filename) }) // 多文件 router.POST("/upload", func(c *gin.Context) { form, _ := c.MultipartForm() files := form.File["upload[]"] for _, file := range files { c.SaveUploadedFile(file, "./"+file.Filename) } c.String(http.StatusOK, "%d files uploaded!", len(files)) }) 模型绑定 type Login struct { User string `form:"user" json:"user" binding:"required"` Password string `form:"password" json:"password" binding:"required"` } router.POST("/login", func(c *gin.Context) { var json Login if err := c.ShouldBindJSON(&json); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"status": "logged in"}) }) Cookie router.GET("/cookie", func(c *gin.Context) { cookie, err := c.Cookie("gin_cookie") if err != nil { c.SetCookie("gin_cookie", "test", 3600, "/", "localhost", false, true) } _ = cookie }) 优雅重启 srv := &http.Server{Addr: ":8080", Handler: router} go srv.ListenAndServe() quit := make(chan os.Signal, 1) signal.Notify(quit, os.Interrupt) <-quit ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() srv.Shutdown(ctx) 测试 func TestPingRoute(t *testing.T) { router := setupRouter() w := httptest.NewRecorder() req, _ := http.NewRequest("GET", "/ping", nil) router.ServeHTTP(w, req) assert.Equal(t, 200, w.Code) assert.Equal(t, "pong", w.Body.String()) } 参考 gin 中文文档

2018-03-19 · 2 分钟 · 326 字 · 王站站