使用WebSocket

客户端:微信小程序
服务器:eggjs+egg-socket.io

弄清楚几个概念。

namespace

// client
import io from 'weapp.socket.io';
// 请求服务器的 'chat' namespace
const server = io('ws://localhost:7001/chat', {
  transports: ['websocket'],
});

// server
// 监听 'chat' namespace下的 one-event-name 事件
app.io.of('chat').route('one-event-name', xxx);

path

这个相当于http的请求路径。

// client
const server = io('ws://localhost:7001/chat', {
  path: '/socket', // default: socket.io
  transports: ['websocket'],
});

// server based on eggjs
config.io = {
    init: {
      path: '/socket',
    },
};

// server based on socket.io directly
const Server = require('socket.io');
const io = Server({
    path: '/socket',
    serveClient: false
  });

在服务端需要根据这个path做反向代理,比如:

location /socket {
  proxy_pass socket_server_address; // 支持socket协议的服务
}

使用的时候,约定好namespace,一般应用用一个namespace就可以。多个namespace可以使用同一个socket连接,也可以使用多个:

// @see https://github.com/socketio/socket.io-client/blob/master/docs/API.md
// By default, a single connection is used when connecting to different namespaces (to minimize resources):

const socket = io();
const adminSocket = io('/admin');
// a single connection will be established

// That behaviour can be disabled with the forceNew option:
const socket = io();
const adminSocket = io('/admin', { forceNew: true });
// will create two distinct connections

// Note: reusing the same namespace will also create two connections
const socket = io();
const socket2 = io();
// will also create two distinct connections

mongodb备份脚本

DUMP=/usr/local/mongodb/bin/mongodump    #mongodump命令路径


OUT_DIR=/data/mongodb_bak/mongodb_bak_now    #临时备份目录

TAR_DIR=/data/mongodb_bak/mongodb_bak_list    #备份存放路径

DATE=`date +%Y_%m_%d_%H_%M`   #获取当前系统时间 


DB_USER=YOUR_DB_USERNAME    #数据库账号 


DB_PASS=YOUR_DB_USER_PASSWORD    #数据库密码



DAYS=20    #DAYS=20代表删除20天前的备份,即只保留近20天的备份


TAR_BAK="mongodb_bak_$DATE.tar.gz"    #最终保存的数据库备份文件



cd $OUT_DIR



rm -rf $OUT_DIR/*



mkdir -p $OUT_DIR/$DATE

 
$DUMP -h YOUR_DB_HOST -u $DB_USER -p $DB_PASS --authenticationDatabase "YOUR_DB_NAME" -o $OUT_DIR/$DATE   #备份全部数据库


tar -zcvf $TAR_DIR/$TAR_BAK $OUT_DIR/$DATE    #压缩为.tar.gz格式



find $TAR_DIR/ -mtime +$DAYS -delete   #删除20天前的备份文件


exit

复制代码,命名为mongodb_bak.sh,加入系统定时任务。

crontab -e

windows修改远程桌面端口脚本


@echo off
color f0
echo 修改远程桌面3389端口(支持Windows 2003 2008 2008R2 2012 2012R2 7 8 10 )
echo 自动添加防火墙规则
echo %date%   %time%
echo    ARK
set /p c= 请输入新的端口:
if "%c%"=="" goto end
goto edit
:edit
netsh advfirewall firewall add rule name="Remote PortNumber" dir=in action=allow protocol=TCP localport="%c%"
netsh advfirewall firewall add rule name="Remote PortNumber" dir=in action=allow protocol=TCP localport="%c%"
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp" /v "PortNumber" /t REG_DWORD /d "%c%" /f
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v "PortNumber" /t REG_DWORD /d "%c%" /f
echo 修改成功
echo 重启后生效,按任意键重启
pause
shutdown /r /t 0
exit
:end
echo 修改失败
pause
复制内容,命名为xxx.bat双击即可执行

微信开发

最近想对微信小程序直播间升级,使用第三方IM平台融云,发现融云的小程序sdk需要5000块/月。

app端的sdk每月使用费是1200起,小程序的价格就很不理解。联系客服之后,解释说他们需要给微信平台付一定的域名费用。

acme.sh证书同步到华为云

项目代码

环境

  • 华为云 ubuntu 18.04
  • Docker version 19.03.8, build afacb8b7f0
  • docker-compose version 1.25.4, build 8d51620
  • image: neilpang/acme.sh v2.8.6
  • image: jenkins/jenkins:lts Jenkins ver. 2.204.5

目标

  • acme.sh自动更新证书
  • 使用华为云的负载均衡 https监听
  • 证书更新后自动同步到华为云

实现方案

  • server上通过docker部署acme.sh
  • 使用nodejs调用华为云api实现更新证书
  • 使用jenkins实现证书更新后自动调用nodejs

部署acme.sh实现自动更新证书

acme.sh可以通过aliyun_dns_api完成证书颁发,需要阿里云的app_key和app_secret。

参考链接

你可以直接安装acme.sh就能实现。但是当你有多个域名并且分布在多个阿里云帐号的时候,直接安装acme.sh可能解决不了问题(尝试过,但是没配置成功),而用docker跑acme.sh可以完美解决这个问题。所以这里用docker来跑acme.sh。

参考 ilaipi/acme.sh-docker 完成部署

自动更新证书到华为云

GitHub Repo 看源码部署

Jenkins自动同步到华为云

acme.sh有notify机制,notify到个人邮箱,jenkins配置一个任务,通过邮件触发(需要安装一个邮件触发的插件Poll Mailbox Trigger Plugin),检查到邮件就执行服务器上的自动更新代码。

(目前还在实验阶段)

在acme的容器内配置邮件发送服务,使用acme支持的mailgun,注册帐号并完成邮件认证。邮件认证的时候可能需要google voice号码(我认证的时候没有看到中国的选项)。最后调用acme.sh --set-notify --notify-hook mailgun来确认是否配置成功,配置成功的话会发邮件到接收邮箱。

在jenkins中配置的是outlook邮箱(host: imap-mail.outlook.com)。

Jenkins Advanced Email Properties

subjectContains=Renew *.xxxxxxx.com success
receivedXMinutesAgo=600 # 意思是10小时内发送的邮件。一般acme是凌晨0点后执行任务

Jenkins Schedule

TZ=Asia/Shanghai
H H(3-7)/3 * * *
# 这样的意思应该是早上3-7点之间执行3次

Mac上开发iOS App

注册成为开发者帐号之后,登录管理员帐号。

几个概念

Certificates   证书
Identifiers    对应App 开发时的Bundle id
Profiles       下载的文件名后缀是mobileprovision
Devices        内测的设备udid

Identifiers

开始开发app的时候,要确定app的bundle id,类似安卓app的包名,唯一标识app,关系到推送、app store内下载。

Certificates

证书。一个app理论上包括4个证书:

  • dev推送证书
  • 生产推送证书
  • dev签名证书
  • hoc & app store 签名证书

生成证书

1,打开Mac上自带的软件,Keychain Access(中文名应该是钥匙串)
2,点击菜单:Keychain Access --> Certificate Assistant --> Request a Certificate from a Certificate Authority...
3,填写邮箱,起一个名字。比如证书是dev签名证书,命名为  appName_dev_sign
4,选择保存到硬盘,得到.certSigningRequest后缀名的文件
5,打开开发者后台,证书管理页面,点击添加证书,根据需要选择Apple Development或者是iOS Distribution (App Store and Ad Hoc),点击下一步
6,上传文件的时候,选择第4步生成的文件,点击下一步即可
7,点击下载,保存到本机,双击,即安装证书到Keychain Access

收集Devices

开发、内测期间,需要安装真机测试的iOS设备,需要把udid添加进来。添加的方法可以百度。

创建Profiles

用于安装到真机或者打包导出、上传到app store。

插线安装到真机,需要创建iOS App Development类型的,选择Apple Development类型的证书。

需要打包内测分发的,需要创建Ad Hoc类型的,选择iOS Distribution (App Store and Ad Hoc)类型的证书。

需要上架App Store的,也选择iOS Distribution (App Store and Ad Hoc)类型的证书。

推荐命名方式 company_appName_dev/hoc/store

导出p12

在本机安装证书就可以右击证书,导出,生成一个p12文件。推送相关的需要p12。团队开发app时,一个人生成签名证书,把p12发给其他成员,其他成员双击即可。

Vim 编译安装 +python3支持

日常开发用vim,习惯了脱离鼠标写代码。

今天升级了一堆插件,然后打开Vim报错了,YouCompleteMe插件需要vim编译的时候支持python,所以重新编译vim。

从官方Repo clone代码:

# --depth=1 不拉log
git clone git@github.com:vim/vim.git --depth=1

参考

YouCompleteMe

https://github.com/wklken/k-vim

Configure

./configure --with-features=huge \
             --enable-multibyte \
             --enable-rubyinterp=dynamic \
             --with-ruby-command=/usr/local/opt/ruby/bin/ruby \
             --enable-python3interp=yes \
             --with-python3-config-dir=/usr/local/Cellar/python/3.7.6_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/config-3.7m-darwin \
             --enable-perlinterp=yes \
             --enable-luainterp=yes \
             --enable-gui=gtk2 \
             --enable-cscope \
             --prefix=/usr/local/vim8

执行这个命令,设置–with-python3-command=为本机的python3可执行文件路径。

Make & Install

make
sudo make install

Check

打开vim,命令模式执行:echo has(“python3”),返回1,表示已启用python3

这时候,vim插件的错误应该都没有了,可以正常使用。

Docker 常用命令

批量删除容器

docker ps -a | grep Exit | awk '{print $1}' | xargs docker rm

可以修改 grep Exitgrep Created,即根据状态,找到对应的全部id,然后传给docker rm命令,可以修改rm 为其它的命令。

批量删除镜像

docker images | grep '<none>' | awk '{print $3}' | xargs docker rmi -f

构建镜像

# -t 指定镜像名字和Tag
docker build  -t hcp-backend-dev:test .

启动镜像

# 启动镜像hcp-backend-dev:test,指定容器名字为hcp-backend-dev
docker run --name=hcp-backend-dev -dit hcp-backend-dev:test

全部删除docker所有东西

docker system prune --all

删除全部镜像

docker rmi -f $(docker images -a -q)

删除全部容器和挂载盘

docker rm -vf $(docker ps -a -q)

Docker容器迁移

参考链接

通过docker export导出镜像,然后到新服务器import为指定名字的镜像,启动时以新的镜像名来启动。对于volume的迁移,可以直接从源服务器scp传到新服务器。

相关命令:

docker export container_name -o filename.tar
# load image as image_name
docker import filename.tar image_name

Docker 安装优化

修改目录,配置加速

vim /etc/docker/daemon.json

{
"data-root": "/data/docker",
"registry-mirrors": ["https://${TO_BE_REPLACED}.mirror.aliyuncs.com"]
}

data-root 是要存放Docker镜像、容器文件的目录

registry-mirrors,使用阿里的,需要有阿里云帐号,到自己的后台去找地址。在控制台,找到“容器镜像服务 – 镜像中心 – 镜像加速器”,这个页面有个地址。复制即可。

重启docker

systemctl restart docker

Showdoc数据库sqlite3的使用

showdoc现在已经不支持MySQL了,只支持sqlite。通过官方的Docker安装方式安装后,进入Docker容器,默认没有安装sqlite数据库,可以执行apk install sqlite安装。容器是基于alpine linux的。

进入数据库直接复制数据

使用场景:有几个接口比较像,懒的一个个页面上复制,可通过sql直接复制。

INSERT INTO page (author_uid,author_username,item_id, cat_id, page_title, page_content, s_number, addtime, page_comments, is_del)
SELECT author_uid,author_username,item_id, 21, page_title, page_content, s_number, addtime, page_comments, is_del from page where cat_id=20;

批量修改

# replace
UPDATE YourTable a
SET a.StringColumn = REPLACE(a.StringColumn,',43,',',54,')
WHERE a.StringColumn like '%,43,%'
# substr
UPDATE YourTable
SET StringColumn = substr(StringColumn, 10, 4) # 从第10个开始,截取4个
WHERE StringColumn like '%,43,%'