iOS App技术支持网址(URL)
如果您在使用过程中有问题请留言或发邮件我。 邮箱地址:long2ice@gmail.com 谢谢! If you have any questions, please leave a message or send me an email. Email:long2ice@gmail.com Thank you!
如果您在使用过程中有问题请留言或发邮件我。 邮箱地址:long2ice@gmail.com 谢谢! If you have any questions, please leave a message or send me an email. Email:long2ice@gmail.com Thank you!
简介 之前一直使用gatus来监控一些服务,但是最近发现了一个更强大的开源项目uptime-kuma,web 界面功能更加丰富,遂决定转向uptime-kuma。 项目地址 https://github.com/louislam/uptime-kuma 安装 最方便的方式就是使用docker-compose。 version: "3" services: uptime-kuma: image: louislam/uptime-kuma container_name: uptime-kuma volumes: - uptime-kuma-data:/app/data - /var/run/docker.sock:/var/run/docker.sock restart: always network_mode: host volumes: uptime-kuma-data: 支持多种类型监控 http ping tcp dns docker … 支持多种类型告警 飞书 邮件 Telegram 企业微信 webhook … 最后 总的使用下来还是非常不错的。
起因 最近在开发中涉及到了 webssh 的需求,于是就有了这篇文章,主要是记录一下开发过程中遇到的问题,以及解决方案。 技术架构 Golang Fiber Vue xterm.js 方案 主要是希望前端通过 websocket 连接后端,后端通过 ssh 连接远程服务器,然后将两者的数据流进行转发,这样就实现了 webssh 的功能。 前端部分代码 <template> <div id="xterm" class="xterm" /> </template> <script> import "xterm/css/xterm.css"; import { Terminal } from "xterm"; import { FitAddon } from "xterm-addon-fit"; import { AttachAddon } from "xterm-addon-attach"; export default { name: "Terminal", props: { url: { type: String, default: "", }, visible: { type: Boolean, default: false, }, }, watch: { visible: { handler(value) { if ( value && this.socket !== undefined && this.socket.readyState === 3 ) { this.initSocket(); } }, }, wsUrl: { handler(value) { this.initSocket(); }, }, }, mounted() { this.initSocket(); }, beforeDestroy() { this.socket.close(); this.term.dispose(); }, methods: { initTerm() { const term = new Terminal({ fontSize: 14, cursorBlink: true, }); const attachAddon = new AttachAddon(this.socket); const fitAddon = new FitAddon(); term.loadAddon(attachAddon); term.loadAddon(fitAddon); term.open(document.getElementById("xterm")); fitAddon.fit(); term.focus(); this.term = term; }, initSocket() { this.socket = new WebSocket(this.url); this.socketOnClose(); this.socketOnOpen(); this.socketOnError(); }, socketOnOpen() { this.socket.onopen = () => { // 链接成功后 this.initTerm(); }; }, socketOnClose() { this.socket.onclose = () => { this.$emit("terminalClose"); this.term.dispose(); }; }, socketOnError() { this.socket.onerror = () => { // console.log('socket 链接失败') }; }, }, }; </script> <style scoped> .xterm { height: 600px; } </style> 后端部分代码 package api import ( "context" "github.com/gofiber/websocket/v2" "github.com/google/uuid" "github.com/helloyi/go-sshclient" log "github.com/sirupsen/logrus" "gitlab.com/merico-dev/DevOpsPublic/brooder/db" "gitlab.com/merico-dev/DevOpsPublic/brooder/services" "golang.org/x/crypto/ssh" "io" ) type WsReaderWriter struct { *websocket.Conn } func (w *WsReaderWriter) Write(p []byte) (n int, err error) { writer, err := w.Conn.NextWriter(websocket.TextMessage) if err != nil { return 0, err } defer writer.Close() return writer.Write(p) } func (w *WsReaderWriter) Read(p []byte) (n int, err error) { var msgType int var reader io.Reader for { msgType, reader, err = w.Conn.NextReader() if err != nil { return 0, err } if msgType != websocket.TextMessage { continue } return reader.Read(p) } } func Shell(c *websocket.Conn) { uid, err := uuid.Parse(c.Params("uid")) if err != nil { log.Error(err) } mc := db.Client.Machine.GetX(context.Background(), uid) service, err := services.NewSSHService(mc.MachineIP) if err != nil { log.Error(err) } config := &sshclient.TerminalConfig{ Term: "xterm", Height: 40, Weight: 80, Modes: ssh.TerminalModes{ ssh.ECHO: 1, ssh.TTY_OP_ISPEED: 14400, ssh.TTY_OP_OSPEED: 14400, }, } rw := &WsReaderWriter{c} if err = service.Client().Terminal(config).SetStdio(rw, rw, rw).Start(); err != nil { log.Error(err) } }
一直以来,使用普通方式打包的 Python 项目的 Docker 镜像都非常大,大概有一个多 G 的样子,比如下面这个例子。 FROM python:3 RUN mkdir -p /telsearch WORKDIR /telsearch COPY pyproject.toml poetry.lock /telsearch/ RUN pip3 install poetry ENV POETRY_VIRTUALENVS_CREATE false RUN poetry install --no-root --no-dev COPY . /telsearch 足足有 1.5 个 G,非常的浪费磁盘空间,那么,有没有什么方法可以减小镜像大小呢? 答案就是 Docker 的多阶段构建,官方文档在这里:https://docs.docker.com/develop/develop-images/multistage-build/。 FROM python:3.9 as builder RUN mkdir -p /telsearch WORKDIR /telsearch COPY pyproject.toml poetry.lock /telsearch/ ENV POETRY_VIRTUALENVS_CREATE false RUN pip3 install pip --upgrade && pip3 install poetry --upgrade --pre && poetry install --no-root --only main FROM python:3.9-slim WORKDIR /telsearch COPY --from=builder /usr/local/lib/python3.9/site-packages /usr/local/lib/python3.9/site-packages COPY --from=builder /usr/local/bin/ /usr/local/bin/ COPY . /telsearch CMD ["uvicorn" ,"telsearch.app:app", "--host", "0.0.0.0"] 使用了新的方式打包之后,镜像大小减小到了 284MB,减小了非常之多。 ...
起因 最近在使用 portainer 管理多个机器上的 Docker 的时候,需要开启 docker 的远程 api 访问,但是如果直接开启的话会直接暴露到公网,容易被扫端口然后入侵机器,而自己生成 tls 证书什么的又比较麻烦,于是在 Google 搜索中发现了一个项目,https://github.com/kekru/docker-remote-api-tls。 简介 简单看了一下项目的介绍,其实就是通过容器内部的 nginx 对挂载进容器的docker.sock做了反代,并且提供了自动生成证书的功能,还不错,虽然只有几十颗星,不过正是我想要的。 部署 项目本身是一个 docker 项目,使用docker-compose就可以启动,并且项目里面也提供了示例。 version: "3.4" services: remote-api: image: kekru/docker-remote-api-tls:v0.4.0 ports: - 2376:443 environment: - CREATE_CERTS_WITH_PW=supersecret - CERT_HOSTNAME=remote-api.example.com volumes: - <local cert dir>:/data/certs - /var/run/docker.sock:/var/run/docker.sock:ro CREATE_CERTS_WITH_PW: 证书密码,随便设置一个就行。 CERT_HOSTNAME:证书的域名,需要和 portainer 里面的域名保持一直,不过好像不支持 ip,只能用域名。 然后执行docker compose up -d就启动了。 证书 启动后会在<local cert dir>生成证书文件,使用client子目录下面的文件就可以通过 api 连接了。 目录结构大概是这样: ❯ tree certs/ certs/ ├── ca-cert.pem ├── ca-key.pem ├── client │ ├── ca.pem │ ├── cert.pem │ └── key.pem ├── server-cert.pem └── server-key.pem 1 directory, 7 files