1. 生成公钥和私钥

ssh-keygen -t rsa
按照提示输入完后,会在~/.ssh目录下生成id_rsa和id_rsa.pub这两个文件

2.与服务器建立联系

ssh-copy-id root@192.168.0.100 //示例ip
接下来会要求输入连接密码,验证成功后

3.无密码登陆服务器

尝试以下命令,看是不是直接登陆成功了:
ssh root@192.168.0.100
就是这么简单

include 不对parent造成过滤

1
2
3
4
5
6
7
8
9
10
11
12
include: [
{
attributes: ['id'],
model: models.Post,
where: {
isActive: 1
},
required: false
// 解决的代码就是这一行,加上 required: false.
//默认required=true,include 会去对 parent 造成过滤
}
]

findAllAndCount在有include的时候count条数不对


Sequelize查询的数据表只有10条数据,但查询结果是20,只要不加include条件就是正确的10,是带上了include中的model表的数据的10条

1
2
distinct:true 
//这一句可以去重,它返回的 count 不会把你的 include 的数量算进去

说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
const res = await ctx.model.Guarantee.findAll({
// where,
// where: {
// guarantee_num: '111',
// '$project.project_name$': '龙岗街道育贤小学教学楼等楼宇整治改造工程'
// },
where: {
guarantee_num: '111',
// '$project.project_name$': '龙岗街道育贤小学教学楼等楼宇整治改造工程'
},
limit,
offset,
include: [{
model: ctx.model.Project,
include: [{
//展示所有嵌套
all: true,
//深度递归嵌套,出来嵌套内容
// nested: true
}],
}],
// 用于返回唯一不同的值
distinct: true,
//如果 plain 是 TRUE ,则 sequelize 将只返回结果集的第一条记录。如果是 FALSE, 则是全部记录。
plain: false,
// 设置为 true,即可返回源数据
raw: false,
order: [
['created_at', 'DESC']
]
})

前提:

1.谷歌云
2.node环境、ubuntu

安装node环境

1
2
3
sudo apt install npm
sudo npm install n -g
sudo n stable

安装 shadowsocks

1
npm install -g shadowsocks

找到shadowsocks配置文件路径

linux环境下缺省shadowsocks配置文件路径
/usr/local/lib/node_modules/shadowsocks/config.json

修改配置config.json

1
2
3
4
5
6
7
8
{  
"server":"0.0.0.0",#更改服务器IP
"server_port":9000, #更改连接端口
"local_port":1080,
"password":"pass",#更改密码
"timeout":600,
"method":"aes-256-cfb"
}

启动shadowsocks

1
$ pm2 start ssserver

我有很多自己的个人代码是跑在家里的服务器中的.一般来说都是自动化的处理我的一些生活问题,与数据收集等相关活动.
所以一般没有客户端访问家里服务器的需求.
但是很多时候脑子突发奇想.有一些小点子,一些小的bug或者小的优化,代码修改完成之后,有一个部署到需求.
因为家里服务器没有一个稳定的外网IP的,外网不能直接连接服务器.
所以我们需要 内网穿透

ngrok

选择ngrok的原因很简单,配置方便,并且支持tcp协议.
支持tcp协议代表,我可以直接在外面用SSH来访问家里的机器.

用法

首先你需要去官网注册一个账号
下载ngrok,并且解压到一个你喜欢的目录下面
去官网复制你的授权码
授权ngrok
ngrok authtoken 授权码

http

ngrok http 8080

tcp

ngrok tcp 22

最终你会得到,一个外网可以访问的地址.
用这个地址就可以直接访问到你本机的端口了.

当我们拥有这样一个公网地址之后,我们就可以ssh来控制家里的机器
或者使用github的webhook来做一切你想要做的事情.

环境

1、代码通过git管理,放在了coding上(放在github或者其他平台也都可以)
2、服务器用的阿里云
3、服务器用的ubuntu 16.04
4、客户端用的mac
5、docker镜像平台为dockerhub

准备

1、服务器开通SSH
2、服务器安装Docker
3、掌握基本的shell命令

开始

1、服务器 安装docker
https://docs.docker.com/install/
2、服务器拉取docker jenkins镜像:

1
docker pull jenkins:latest

3.服务器运行dokcer jenkins容器:

1
sudo docker run -d --name jenkins_node -p 49002:8080 -v /var/jenkins_node:/var/jenkins_home jenkins:lates

Map command 键

Mac 和 win的键盘不一样,但使用 Mac 一年时间感觉 Mac 键盘部局还是比较好用的。为了按键匹配把 Alt 和 Win 键换一下,可以直接在 Mac的设置中设置:

Setting -> Keyboard -> Modifier Keys… -> Select Keyboard (choose USB Keyboard) -> switch Option Key and Command Key

这样设置完之后 Win键就和 Command 对应了,Command + C, Command + V 用起来习惯多了。

设置多媒体键

经常听音乐,所以常需要调节音量,但 F1-F12已经被我改为普通功能了,所以不能直接改过来用作多媒体控制(我主要用来控制音量)在 zhihu 上找到有人推荐Karabiner 下载了一个来玩,感觉还是蛮好用的。

这里我将87键键盘的右上角三个键 Ps/SR, ScLk, Pa/Br 键对应到音量静音、减、增三个键,这个功能有预置,可以直接搜索到并 enable 即可:

另外也可以自定义按键对应:

打开 private.xml 输入需要定制的内容

1
2
3
4
5
6
7
8
9
<?xml version="1.0"?>
<!-- 这里我把 Insert 键换成 Launchpad 键-->
<root>
<item>
<name>Insert Key Launchpad</name>
<identifier>private_pc_insert_to_launchpad</identifier>
<autogen>__KeyToKey__ KeyCode::PC_INSERT,KeyCode::LAUNCHPAD</autogen>
</item>
</root>

保存后 reload 即可。

更多例子参考官方样例中的代码

有了高效的工具就剩下好好工作了~

报错:

1
2
3
4
5
6
7
8
root@iZ94t4csjq4Z:~# mongo
MongoDB shell version v3.4.7
connecting to: mongodb://127.0.0.1:27017
2018-03-21T02:45:58.758+0800 W NETWORK [thread1] Failed to connect to 127.0.0.1:27017, in(checking socket for error after poll), reason: Connection refused
2018-03-21T02:45:58.791+0800 E QUERY [thread1] Error: couldn't connect to server 127.0.0.1:27017, connection attempt failed :
connect@src/mongo/shell/mongo.js:237:13
@(connect):1:6
exception: connect failed

解决方法:

1
2
3
4
sudo rm /var/lib/mongodb/mongod.lock
sudo mongod --repair --dbpath /var/lib/mongodb
sudo mongod --fork --logpath /var/lib/mongodb/mongodb.log --dbpath /var/lib/mongodb
sudo service mongodb start

报错:

1
2
root@iZ94t4csjq4Z:~# sudo service mongodb start
Failed to start mongodb.service: Unit mongodb.service is masked.
1
2
root@iZ94t4csjq4Z:~# sudo chown -R mongodb:mongodb /var/lib/mongodb
root@iZ94t4csjq4Z:~# sudo systemctl start mongod

等了好久好久,今天终于见到你了。

首先你可以查看下官方提供的支持申请通配符证书的客户端列表:https://letsencrypt.org/docs/client-options/。

这些客户端支持最新的ACME v2接口,而这个接口目前已经正式支持申请通配符证书啦。

这里,我使用acme.sh(https://github.com/Neilpang/acme.sh)这个Client,它是直接在bash下运行,使用非常简单,而且支持大多数DNS服务器的API自动验证!

1、安装acme.sh

1
curl https://get.acme.sh | sh

一句话完成安装,安装过程分为:

1)复制acme.sh的程序文件到当前用户主目录,比如root用户的:~/.acmh.sh目录下

2)创建一个alias:acme.sh=~/.acme.sh/acme.sh

2、装完后,就可以开始申请证书了,这里我用的是阿里云的DNS,所以为了能配合完成自动验证,需要在acme.sh的配置中写入阿里云的密钥信息:

1
2
3
4
5
vim ~/.acmh.sh/account.conf

#添加阿里云密钥,改成自己的
Ali_Key="xxxx"
Ali_Secret="xxxxx"

3、最后,重点来了,通配符证书申请命令(以我自己的域名为例):

1
acme.sh  --issue -d junyao.tech  -d *.junyao.tech  --dns dns_ali

注意,这里–dns参数使用的是dns_ali,告诉acme.sh使用阿里云的DNS接口去自动验证。(好处:全程无干预,不需要暂停web服务器!)

4、查看生成的证书文件,证书默认生成在:~/.acme.sh/junyao.tech下:

5、最后,就是配置Apache、NGINX啦。这里以nginx为例子:

首先我们要把生成的证书文件复制出来,这里我放到/etc/nginx/ssl/目录下,运行下面命令:

1
2
3
4
acme.sh --install-cert -d junyao.tech \
--cert-file /etc/nginx/ssl/junyao.tech-cert.pem \
--key-file /etc/nginx/ssl/junyao.tech-key.pem \
--fullchain-file /etc/nginx/ssl/junyao.tech-fullchain.pem

6.配置Nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {  
listen 80;
listen 443 ssl;
server_name junyao.tech;
#error_page 404 =/404.html;
location / {
root /alidata/www;
index index.html;
}
ssl_certificate /etc/nginx/ssl/junyao.tech/junyao.tech-fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/junyao.tech/junyao.tech-key.pem;

ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers AESGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL;
ssl_prefer_server_ciphers on;
}

最后reload一下 nginx

总结:

这里把几个命令整一起,方便使用。

首先,我这里用的阿里云的解析,所以,需要提前设定阿里云的密钥,方法是:

1
2
3
4
5
vim ~/.acmh.sh/account.conf

#添加阿里云密钥,改成自己的
Ali_Key="xxxx"
Ali_Secret="xxxxx"

保存之后,后面使用这个参数时(–dns dns_ali),就自动读这个信息了。

下面是把申请证书和复制证书放在一个文件(new_https.sh)中执行了,只需要传入参数(申请的域名),完成后,只需要去手动修改下apache的配置即可(nginx同理)

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
if [ ! -n "$1" ] ;then
echo "please input domain"
else
/root/.acme.sh/acme.sh --issue -d $1 -d *.$1 --dns dns_ali
mkdir /etc/nginx/ssl/$1
/root/.acme.sh/acme.sh --install-cert -d $1 \
--cert-file /etc/nginx/ssl/$1/$1-cert.pem \
--key-file /etc/nginx/ssl/$1/$1-key.pem \
--fullchain-file /etc/nginx/ssl/$1/$1-fullchain.pem
fi

使用方法:

1
new_https.sh junyao.tech

mongodb基础篇

先讲讲简单的monngodb部署docker.
MongoDB 是一款较为常用的NOSQL 数据库,结合 Docker 使用,能实现轻松配置部署、迁移,本文以下为简要介绍如何在 Docker 中部署并使用 MongoDB。下文主要分为几个部分,内容如下:

MongoDB 镜像安装
MongoDB 容器创建
MongoDB 容器数据目录挂载
MongoDB 数据迁移
MongoDB 常用 Docker 命令

MongoDB Docker 镜像安装

MongoDB 提供官方镜像,下载安装镜像方法如下:

1
docker pull mongo

以上命令为安装 MongoDB 最新版本的镜像。

MongoDB Docker 容器创建

MongoDB Docker 容器创建有以下几个问题:
1- MongoDB 容器基本创建方法和数据目录挂载
2- MongoDB 容器的数据迁移
3- MongoDB 设置登录权限问题

MongoDB 容器基本创建方法和数据目录挂载

MongoDB 容器基本创建命令如下:

1
2
docker run -p 27017:27017 -v <LocalDirectoryPath>:/data/db --name docker_mongodb -d mongo

在上面的命令中,几个命令参数的详细解释如下:

-p 指定容器的端口映射,mongodb 默认端口为 27017
-v 为设置容器的挂载目录,这里是将即本机中的目录挂载到容器中的/data/db中,作为 mongodb 的存储目录
–name 为设置该容器的名称
-d 设置容器以守护进程方式运行
以上是 MongoDB 容器创建后的信息。

随后我们创建一个test_database的数据库,然后在创建一个test_collection的集合.

容器数据迁移

接下来,我们先停止刚才创建的 docker_mongodb 容器,命令如下:

1
docker stop docker_mongodb

然后我们再创建一个新的 MongoDB 容器,挂载刚才刚刚的数据目录,命令如下:

1
2
docker run -p 27017:27017 -v <LocalDirectoryPath>:/data/db --name docker_mongodb_migration -d mongo

我们可以容器查询命令,查看当前 Docker 的容器状态,命令如下:

1
docker container ls -a

这里的 -a 参数是查看所有的容器,包括已经停止的容器。
连接数据库,可以看到我们看到我们再 docker_mongodb 中创建的数据,这里表明我们新创建的 docker_mongodb_migration 挂载的数据目录和 docker_mongodb 相同,利用这一方法,我们可以实现简单的数据迁移。

MongoDB 的 Docker 常用命令

查看当前运行的容器
1
2
3
4
# 查看正在运行的容器
docker container ls
# 查看所有容器
docker container ls -a
停止容器
1
2
3
4
# 指定 CONTAINER ID 停止容器
docker stop <CONTAINER ID>
# 指定容器名称停止容器
docker stop <CONTAINER NAME>
启动已经停止的容器
1
2
3
4
# 指定容器 CONTAINER ID 启动容器
docker start <CONTAINER ID>
# 指定容器名称启动容器
docker start <CONTAINER NAME>
重启已经运行的容器
1
2
3
4
# 指定容器 CONTAINER ID 重启容器
docker restart <CONTAINER ID>
# 指定容器名称重启容器
docker restart <CONTAINER NAME>
进入 mongo 交互模式
1
docker exec -it <CONTAINER NAME> mongo admin

node 基础篇

再讲讲简单的node部署docker.

一直以来,在微信中内嵌视频总是收到IOS及微信的双重限制,主要是必须被调用原生播放器,但是我希望在HTML的文档流中内嵌视频,而不调用原生组件,其方法是

第一步:调用createjs框架

1
<script src='/path/createjs-2015.11.26.min.js'></script>

第二步:DOM部分:

1
2
<canvas id="canvas" width="640" height="1008"></canvas>
<video id="video" ></video>

第三步;CSS部分:我使用的是全屏幕绘制,将视频元素隐藏

1
2
3
4
5
6
7
8
9
10
11
canvas{
position:absolute;
width:100%;
height:100%;
top:0px;
left:0px;
}
#video{
display:none;
}

第四步:JS部分:

以下是设置video元素的属性

1
2
3
4
5
var video = document.getElementById('video');
video.src = 'images/video.mp4';
video.setAttribute('webkit-playsinline',true); //IOS内连方式播放视频
video.setAttribute('playsinline',true);//IOS微信浏览器内连方式播放视频
video.setAttribute('x5-video-player-type','h5');//Android微信浏览器启用h5播放器

以下开始绘制视频

1
2
3
4
5
var stage = new createjs.Stage('canvas');  //设置舞台
var bitmap = new createjs.Bitmap(video); //载入视频
stage.addChild(bitmap);
createjs.Ticker.setFPS(25); //设置帧率
createjs.Ticker.on('tick',stage); //刷新舞台

演示地址

DEMO

0%