chaos
#分享
#Docker
需求描述 正常运行的sanic应用需要进行服务器迁移,首先想到的当然是通过docker 基本步骤 编写dockerfile 这里非必须在应用根目录下进行dockerfile的建立及编写,但是为了后续方便,强烈建议
在应用根目录新建Dockerfile文件 touch Dockerfile 内容 # 基础镜像,这里选用python3.8 FROM python:3.8 # 维护者(非必需) MAINTAINER <your_name> <your_email> # 指定工作目录 WORKDIR / # 将应用所需文件拷贝到容器中 COPY . / # 安装必要的python三方库,建议提前生成一个依赖库列表,为了后续的构建方便 # 这里推荐使用pipreqs三方库生成,这样能够最小化使用到的库数量 RUN pip install -r requirements.txt -i https://pypi.doubanio.com/simple # 暴露容器端口 EXPOSE <port_used>/tcp # 执行docker run会执行的命令,按照空格进行分割 CMD ["python", "/run.py"] 构建docker镜像 docker build -t <image_name> <Dockerfile_path> // 这里需要强调的是 <Dockerfile_path> 一定需要是一个目录,而不是dockerfile本身 其他 将镜像打包为tar文件,方便迁移 docker save -o <file_name.tar> <image_name> 将迁移的tar文件导入为镜像 docker load --input <file_name.tar>
chaos
#System
#日常使用
背景 WireGuard:是一个现代化的基于Linux内核态运行的高效、优雅的跨平台VPN实现方案;底层协议采用UDP进行数据传输 wg-easy:是一个使用Vue+wireguard开发的快速启动、管理、监控wg服务的docker镜像 需求: 异地组网:n台互相在异地的机器相互组成一个局域网并各自拥有自己在该虚拟内网中的独立ip地址,实现无障碍安全互访 无公网ip:这里不做标题党,具体的网络拓扑是: 1台具备公网ip的服务器 n-1台不具备公网ip并且藏在无数层NAT之后的机器 解决方案 总体思路 使用具备公网ip的服务器作为wg服务端,所有在vpn内的机器直接通过该设备进行流量转发 wg-easy启动在公网ip服务器,并统一通过面板为客户机下发配置文件 其他设备直接本机安装wg作为客户端 启动服务端(具备公网ip的机器) 这里采用docker-compose的方式进行启动,由于wg-easy具备一个漂亮的管理面板,故使用traefik对其进行管理
建立启动配置文件 version: "3.8" services: wg-easy: environment: # ⚠️ Required: # Change this to your host's public address - WG_HOST=<ur host domain> # - WG_DEFAULT_DNS=192.168.2.1 - WG_ALLOWED_IPS=<set default ACL in the clients> # Optional: - PASSWORD=<web ui's password> # - WG_PORT=51820 - WG_DEFAULT_ADDRESS=10.8.0.x # - WG_MTU=1420 image: weejewel/wg-easy container_name: wg_easy volumes: - <path_to_host>:/etc/wireguard # ports: # - "51820:51820/udp" # control port(main) # - "51821:51821/tcp" # web ui port network_mode: "host" # ⚠️Required restart: unless-stopped cap_add: - NET_ADMIN - SYS_MODULE labels: - traefik.
chaos
#System
#日常使用
背景 之前写过怎么在win平台使用frp搭配zerotierone搭建回校内网,详见这里 但是pc经常会出现关机等等意外情况,同时frp一定需要一台公网服务器,受限于国内带宽的高价,有时候该种解决方案并不是最优 本次介绍一种使用zerotier-one的官方服务进行内网组建同时搭配anyproxy的vpn方法 刚好趁此机会介绍一下在linux下的anyproxy的安装配置 产品简介 anyproxy 跨平台基于nodejs的快速http代理工具,不多介绍 zerotier-one 一款全平台的vpn子网组件工具 该工具会自动在转发、直通、p2p等方式中选择最优方案进行子网组建 官方提供转发服务器,虽然是在境外(速度相对较慢)但是聊胜于无,免费账号可以同时加入100台机器(甚至对于一个小团队都是够用的),不限制子网数量 动手吧! 安装anyproxy 首先确保有npm工具: npm -v 直接进行一个安装 sudo npm install anyproxy -g 启动测试 anyproxy --port <proxy port u wanna use> 配置开机启动 防止机器断电,还是配置一下开机自启比较好 为了方便(其实是我只会这一种),这里使用systemd的方式配置开机自启 具体systemd是什么请自行google,这里只需要知道该守护程序有两个可以放置配置文件的地方:/etc/systemd/system/或者/usr/lib/systemd/system/ 创建服务文件 sudo touch /usr/lib/systemd/system/anyproxy.service 编写服务文件(复制记得删除注释) [Unit] Description=Initiate the anyproxy server # 给出一个详细描述 After=network-online.target # 固定 [Service] Type=simple # 固定 ExecStart=/bin/bash <abspath_to_init.sh> # 需要将anyproxy的启动写成一个sh脚本,并放在任意位置,chmod给执行权限 Restart=on-abort # 固定 User=root # 固定 [Install] # 固定 WantedBy=default.target # 固定 重载 sudo systemctl daemon-reload 启动 sudo systemctl start anyproxy 查看运行状态 sudo systemclt status anyproxy 设置开机自启 sudo systemctl enable anyproxy 安装配置zerotier-one 下载 这里下载并安装 注册并创建一个子网 这里使用你喜欢的方式注册登录zerotier 点击Create A Network,稍等片刻点击进入创建好的子网 起一个喜欢的名字,其他保持默认即可 记下来最上边的Network ID,这个后边会用 加入网络 Linux 执行下列命令加入刚刚创建的子网 sudo zerotier-cli join <Network ID> 稍等片刻,回到网页后台会发现在Members区域出现了刚刚加入的机器,但是zerotier默认新加入的机器没有任何ip分配权限,需要点击最前边Auth?
chaos
#Python
#工程业务
概念 协程 通过async/await语法进行声明,是书写python异步应用的推荐方式 可等待对象 如果一个对象可以在await中使用,那么它就是可等待/awaitable对象 类型:协程、任务、Future async.sleep(delay, result=None, *, loop=None) 阻塞delay指定的秒数 sleep()总是为挂起当前任务,以允许其他任务运行 场景 Sanic后台任务执行失败被挂起,不报错,影响后续任务的进行 解决方案 对后台任务中可能出现失败的协程增设超时 asyncio.wait_for(aw,, timeout, *, loop=None) 等待aw可等待对象完成,指定timeout秒数后超时取消 timeout可以为None,也可以为float/int数值表示的等待秒数。如果timeout为None,则等待直到协程返回 如果发生超时,任务将取消并引发asyncio.TimeoutError 要避免任务取消,可以加上shield() 简单等待 asyncio.wait(aws, *, loop=None, return_when=ALL_CONPLETED) 并发地运行aws可迭代对象中的可等待对象并进入阻塞状态直到满足return_when所执行的条件 aws可迭代对象必须不为空 此函数不会引发asyncio.TimeoutError,当超时发生时,未完成的Future/Task将在指定秒数后返回;与wait_for()不同,wait()在超时后不会取消可等待对象
chaos
#Python
#深度学习
几个概念 预训练 自训练 自监督学习 半监督学习 监督学习 无监督学习 区分 预训练 广义上讲:是对一个模型进行“预先训练”,以完成后续的下游任务 狭义上讲(更常用):在大规模无标注语料上,用自监督的方式训练模型 自训练 常应用于CV领域 有一个Teacher模型$M_{teacher}$和一个Student模型$M_{student}$,首先在标注数据上训练$M_{teacher}$,然后用它对大规模无标注数据进行标注,把得到的结果(与少量有标签数据混合)当做伪标注数据去训练$M_{student}$ 使用少量的标记数据和大量的未标记数据对模型进行联合训练 预训练与自训练是同级概念,其中分别可以与“监督/半监督/无监督/自监督”进行组合 监督与无监督 无监督的典型任务是聚类算法 半监督 没有太多意义的一个概念 其中的代表即自训练,甚至基本等同 自监督 是狭义上“预训练”的实现方法 与完全不受监督的设置相比,自监督学习使用数据集本身的信息来构造伪标签 是一种具有监督形式的特殊形式的非监督学习方法