内网穿透 frp

这篇已经是老版本的frp了,我更新了一篇:</tech/2023/12/10/nat-proxy-frp.html>

这篇文章只列出一些点和代码,作为手册用,不做过多描述。

什么是内网穿透

转自百度百科:

内网穿透,即NAT穿透,网络连接时术语。计算机是局域网内时,外网与内网的计算机节点需要连接通信,有时就会出现不支持内网穿透。内网穿透,就是能让外网的电脑找到处于内网的电脑。

网络上比较有名的商业产品是花生壳。个人使用的话可以使用frp自建,详细过程请看下文。

frp server

docker run -itd --name frps --net=host --restart=always -v /var/local/frp/frps.ini:/tmp/frps.ini alexzhuo/frp /usr/bin/frp/frps -c /tmp/frps.ini

frps.ini内容大致如下:

[common]
bind_addr = 0.0.0.0
bind_port = 7000
vhost_http_port = 80
vhost_https_port = 443
dashboard_port = 7500
# dashboard 用户名密码可选,默认都为 admin
dashboard_user = admin
dashboard_pwd = admin

[ssh]
type = tcp
auth_token = 123
bind_addr = 0.0.0.0
listen_port = xxx

[web]
type = http
custom_domains = frp.test.org
auth_token = 123

frp client

#!/bin/bash

mkdir -p /var/local/frp
cd /var/local/frp

cat <<EOF > frpc.ini
[common]
server_addr = xx.xx.xx.xx
server_port = 7000
auth_token = 123

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22

[web]
type = http
local_port = 8080
EOF

docker run -itd --name frpc --net=host --restart=always -v /var/local/frp/frpc.ini:/tmp/frpc.ini alexzhuo/frp /usr/bin/frp/frpc -c /tmp/frpc.ini

HTML5 audio 实验 - tommy351

这是一篇,很古老的文章。。。。。然而这又是一篇和我blog有着一些联系的文章。。。我blog右边的播放器,其实就是来源于此文。

鉴于互联网上消失的人越来越多,为了给自己留个纪念,把他这篇文章转载过来做个留念。

作者现在仍然活跃在前端开发的技术栈中,可以参考他的github@tommy351

寒假即将结束,不巧膝盖突然中了一箭,便决定实验 HTML5 audio标签的效果,虽然已有 jPlayer 这款轻便好用的播放器,但不折腾一下就没办法消磨时间了,所以本次的实验品完全由我操刀。

开始之前

首先必须了解 audio 标签的使用方式:

<audio controls>
  <source src="music.mp3">
  <source src="music.ogg">
</audio>

输入以上代码后,便可在网页中看到浏览器内建的播放器。每种浏览器支援的播放类型不一,最保险的方法是备妥mp3、ogg。

为了浪费时间,当然不可能用浏览器的预设介面,所以删除controls属性,透过 JavaScript 操作:

var audio = document.getElementsByTagName('audio')[0];
// 播放
audio.play();
// 暫停
audio.pause();

只需要懂这两个函数,就可製作最基础的播放器了,其他複杂的指令可参阅文末的参考出处。

介面

写网页时,比起最重要的 JavaScript,我习惯先写 CSS,最初的参考范本是 Mac 的 CoverFlow。

经过一连串绞尽脑汁,写了一堆乱七八糟的 CSS 之后,成品如下。

无论是倒影、中间的圆圈进度表都与 CoverFlow 非常相像,但这种样式实在 太麻烦了 不便使用者操作,所以从 Premium Pixels 偷点子过来,稍微加油添醋一下,完成了播放器介面 Ver. 2。

Ver.2 与 Ver.1 完全不像?这种事情不重要啦!

##核心

介面完成自爽一下之后,就得面对麻烦的 JavaScript 了,播放、暂停非常简单,按钮按下去执行乡对应的动作即可,然而音量调整与进度条该如何处理呢?

虽然本次的重点是消磨时间,但再去造一个轮子实在他妈的太累了,于是 聪明如我 请到了 jQuery UI,Slider 功能压缩后需要约 20KB 的空间,有点庞大不过方便就好。

时间的控制方式如下,单位为秒数,例如跳至第 100 秒的位置:

audio.currentTime = 100;

音量的控制方式如下,范围为 0~1,例如将音量调整至一半大小:

audio.volume = 0.5;

audio可绑定play, pause, ended, progress, canplay, timeupdate等事件。play与pause如字面上意思,分别为播放、暂停后生效。

audio.addEventListener('play', function(){
  play.title = 'pause';
}, false);

audio.addEventListener('pause', function(){
  play.title = 'play';
}, false);

ended为结束后生效,当音乐结束后,可透过此事件让时间归零。

audio.addEventListener('ended', function(){
  this.currentTime = 0;
}, false);

当音乐档桉开始载入后,便会启动progress事件,可透过此事件监测下载进度。Firefox 可能会发生问题,建议搭配durationchange事件使用。

audio.addEventListener('progress', function(){
  var endVal = this.seekable && this.seekable.length ? this.seekable.end(0) : 0;
  buffer.style.width = (100 / (this.duration || 1) * endVal) + '%';
}, false);

当音乐下载到一定程度后,canplay事件便会生效,一般会透过此事件初始化播放器。相同类型的事件还有很多,依照启动顺序分别为:loadstart, durationchange, loadeddata, progress, canplay, canplaythrough。

timeupdate会在音乐播放时不断生效,可透过此事件更新时间。

audio.addEventListener('timeupdate', function(){
  progress.style.width = (this.currentTime / this.duration) * 100 + '%';
}, false);

##播放列表

一个播放器的基础功能就此完成,能够播放、暂停、调整音量、调整时间。但这显然还不够,播放列表对于播放器而言相当重要。(大概啦)

不要吐槽为啥播放列表裡全是动漫歌,林北就是宅啦…

与自己的逻辑奋战大约一晚后,有播放列表、随机播放、重複播放(单首、全部)功能的播放器于焉完成。只需要 214 行、约 6KB 的代码(未压缩)即可完成,应该能算是轻便简易了。

##后记

播放列表的製作过程有点髒,中途还重构了几次,所以直接看范例应该会比较快,若对于范例内的程式码感到疑惑,可在下方留言。

范例内已设定了一些参数,可在js/script.js内更改。第 5 行的continous参数为连续播放,第6行的autoplay参数为自动播放,第7行的playlist阵列请自行设定,压缩档内不会附带范例内的音乐档桉。playlist阵列的格式如下:

var playlist = [
  {
    title: 'Tell Your World',
    artist: 'livetune feat.初音ミク',
    album: 'Tell Your World',
    cover: 'cover/tell_your_world.jpg',
    mp3: 'music/tell_your_world.mp3',
    ogg: 'music/tell_your_world.ogg'
  }
];

title为标题,artist为演出者,album为专辑名称,cover为专辑封面的路径,mp3、ogg分别为音乐档桉的路径,建议备妥两种格式的档桉,要不然 Firefox 和 Opera 不就只能去死了吗?

因为做到最后头脑快爆炸了,懒得做 Flash fallback,IE 请去死一死吧。

下载

参考


harbor 测试连接成功但同步失败

在进行 harbor 同步时候遇到了这个问题,记录下来。

harbor是什么

Harbor 是 VMware 公司开源的企业级 Registry 项目,可以帮助用户迅速搭建一个企业级的 Docker registry 服务。它以 Docker 公司开源的 registry 为基础,提供了管理UI, 基于角色的访问控制(Role Based Access Control),AD/LDAP 集成、以及审计日志(Audit logging) 等企业用户需求的功能,同时还原生支持中文。

问题背景

背景很简单,就是在新的机器上运行了一个新的 Harbor:

wget https://storage.googleapis.com/harbor-releases/harbor-offline-installer-v1.3.0.tgz
tar xzvf harbor-offline-installer-v1.3.0.tgz
cd harbor
./install.sh

在进行 replication 同步时,测试可以连通,log显示无法同步,与github上的这个issue描述基本一致:

https://github.com/vmware/harbor/issues/3856

2017-12-22T14:37:07Z [INFO] initializing: repository: crm/mysql, tags: [], source URL: http://registry:5000, destination URL: http://reg1.rainbow.com, insecure: true, destination user: admin
2017-12-22T14:37:07Z [INFO] initialization completed: project: crm, repository: crm/mysql, tags: [latest v1.0.0], source URL: http://registry:5000, destination URL: http://reg1.rainbow.com, insecure: true, destination user: admin
2017-12-22T14:37:07Z [ERROR] [transfer.go:204]: an error occurred while creating project crm on http://reg1.rainbow.com with user admin : failed to create project crm on http://reg1.rainbow.com with user admin: 301

从下文贡献者 @reasonerjt 回复的答案

This is because you are running a 1.3.0 build on your remote target, and the request failed due to API security enforcement. This should be fixed if you upgrade your source env to 1.3.0 also.

可以知道,这是两个harbor版本不一致造成的:我的源 Harbor 版本为 1.2.2 版本,新环境中的 Harbor 为 1.3.0。

其他问题

在运行过程中,也出现了下面这个现象:

​ harbor-adminserver 容器始终无法启动。

查看日志可以了解到,secretkey_path 是个文件夹,通过删除data文件夹后重新install解决。

参考资料