技术积累
日进一寸

启用ipv6以及如何做基于ipv6的ddns实现内网设备穿透

imajeason阅读(4067)

通过访问以下网站可以查询自己是否开启了ipv6

https://ip.zxinc.org/ipquery/

ipv6查询

https://ipw.cn/

ipv6地址查询

ipv6的制定是为了解决ipv4不足的问题,ipv6一共有2的128次方地址,这个数字有多大,最经典的形容是我们可以给地球上的每一粒沙子分配一个地址。

把这个数字展开,没有存储设备能存下它们,你可以认为是无限大。

而ipv4地址数量只有43亿,ip数量早已严重不足,催生了nat 网络的发展,一方面通过nat我们可以让许多设备共享一个ip地址,另一方面,nat阻挡了处在不同网络中设备的直连,这也是为什么我们需要zerotier,tailscale内网穿透工具。

ipv4 nat技术本身也提供了一定的安全上的防护,而ipv6不需要nat进行映射,每台设备都是独立的公网ip,所以nat无法提供安全保障了,就需要防火墙来提供

还有就是ipv4能否访问ipv6网络呢,可以是可以,需要对客户端进行特殊配置,安装一些转换工具,操作相对来说比较繁琐,现在绝大部分地区都可以直接使用ipv6了,建议还是开启ipv6。

开启ipv6

以lede/openwrt x86为例,建议大家直接去官网下载https://openwrt.org/zh/downloads

登录openwrt主路由后台,打开网络-接口

如果现在已有wan6,删除它,保存。

重新打开网络-接口,设置lan

ipv6分配长度64

高级设置,使用内置的ipv6勾选

dhcp服务器,ipv6,依次是混合,服务器,混合,无状态+有状态

保存

回到网络-接口-打开wan口的编辑,配置如下:

保存。

会跳转回网络-接口,刷新一下,如果你的运营商支持ipv6,那么网络接口中会多了一个wan6口,这个口有一个很长的ipv6地址,这就是获取到了。

如果你的设置跟我的类似的话就是成功了,现在路由器已经获取到ipv6地址了。

配置局域网设备

打开你的局域网的设备,以windows为例,最好是直接重启电脑。

重启电脑完成后,win键-输入cmd(快捷键Win+R)

输入ipconfig /all

执行后即可查看本地网络,如果获取成功了的话,ipv6那里会有至少4个ip6地址

首选的ipv6地址是固定的,这个地址不怎么会变的,坚决不能泄露,为什么呢

因为ipv6的安全措施之一就是ipv6地址是无限的,在不知道你的ipv6地址的情况下,是无法攻击你的,也没办法跟ipv4一样,通过漫无目的的扫描来找到网络中的设备。

所以,ipv6地址保密本身就是最强的安全措施。

那你要问了,那我访问人家网站,人家不就知道我的ip了么

你再往下看,有许多临时ipv6地址。

打开一个ipv6地址查询网站,比如

https://ip.zxinc.org/ipquery/

会显示你当前的ip,可以看到ipv6地址就是首选的临时ipv6地址,这个地址的有效期非常短

ipv6查询

这也是为什么你会有许多临时ipv6地址,你上网的过程中,机器会随机的使用一个地址作为当前的ipv6地址,每个ipv6地址都有存活期。

也就是说,你访问一个网站,这个网站看到的你的ipv6地址也是一直在变化。

ipv6地址本身就是一个隐私,固定ipv6地址切勿泄露

ipv6 DDNS

但是呢许多朋友用ipv6地址得一个最大需求就是通过ipv6访问自己家庭网络中的设备。

通过ddns解析到自己的内网ipv6设备上,从而实现公网访问。

那我们要解析出来的地址不就是一直变得么,是的,他确实是一直变得,反正是自动的,你管他呢。

但是要想公网访问你的内网设备,是要经过你的路由器得,路由器是自带防火墙的,你要去防火墙上允许它。

openwrt来说,防火墙-通信规则中,从lan到wan是通的,否则无法联网,但是从lan到wan是禁止的

如果想要通过公网ipv6地址访问内网中的设备,是千万不能从这里直接修改转发的,一旦这里的允许wan到lan的转发,那内网的所有设备就彻底暴漏在互联网中了,极其危险。

正确的做法是在通信规则中逐个开放自己想要开放的ip或者端口

openwrt ipv6转发

一旦打开上面得防火墙限制,现在通过访问许可的ipv6地址,就可以访问到指定的设备了,但是刚才讲了,这个ipv6地址会一直变,我们需要ddns,ddns就是动态解析,ipv6变成什么,解析得目标地址就变成什么。

如何做ipv6解析得呢,以阿里云为例,添加AAAA记录,就是指向ipv6地址得

ddns实现

需要有一个脚本时时刻刻检测当前我的访问地址,但是这个问题就大了。

ipv4 nat的话,我们只需要在局域网中某一台设备上执行更新ddns的操作即可,现在每一台设备都是独立的ipv6 ip,这意味着每一个设备都需要单独的ddns操作。

nas,pc,路由器,虚拟机,所有的设备。

DDNS项目

我发现了一个极好的项目:https://github.com/jeessy2/ddns-go/

项目介绍里有完整的使用说明,我就不挨着给大家演示了,简单说一下,一看就懂。

这么来说,大家就能明白了,所有的设备,只要有独立ip,要想被访问它就需要单独的进行dns解析。

对我来说,这样其实是很麻烦的,我期望的方案是只有一台设备做ddns,然后这台设备为其他的局域网服务进行端口转发,这样一方面安全性提高了,另一方面配置起来更容易。

于是我找到了这样一个项目socatg,项目主页

https://gitee.com/drophair/luci-app-socatg

https://github.com/big-tooth/luci-app-socatg/

这个项目的作用就是把局域网的ipv4服务映射到路由的ipv6地址上,就可以完美的实现我们需要的功能了。

可以直接去此网盘下载。

https://pan.baidu.com/s/1GUZKwKfNByt2L1FeP_pVgw?pwd=mcnm
cd /tmp/upload

opkg update

opkg install luci-app-socat.ipk
opkg install luci-i18n-socat-zh-cn.ipk

安装完成后

要想使用,首先要启动服务socat,停止服务也是在这里。

现在就可以把内网服务映射到ipv6,现在我们就可以通过ipv6访问内网服务了。

而ddns就只需要在openwrt上部署自动更新脚本即可。

如何在openwrt上运行ddns,以cloudflare为例

opkg update
opkg install luci-i18n-ddns-zh-cn ddns-scripts-cloudflare bind-host bind-libs ca-certificates

刷新页面

先去Cloudflare做一个dns解析,AAAA就是ipv6解析。

在 Cloudflare 的 API 中,用户名对应 Cloudflare 账户的登录邮箱,密码对应的则是 API Key。
登录 Cloudflare 账户之后,访问 API 令牌页面 https://dash.cloudflare.com/profile/api-tokens 即可在下方看到 API 密钥,在下方的 Global API Key 的右侧点击查看,输入 Cloudflare 账户的密码之后即可获取 API Key。

保存,重新加载查看是否更新到ipv6.

现在就可以通过访问

http://域名:端口

来访问内网服务了,这样最大的好处是不需要在每台内网服务器上配置ddns相关的脚本或者容器,跟ipv4实现了一样的用法

Docker搭建WordPress版Webstack网址导航站

imajeason阅读(2458)

为什么选择WebStack

之前给大家分享过我的nas导航站,链接均为自建服务,但是我需要日常查看很多科技新闻和资讯,所以nas导航之外我还有需要一个新闻与工具的个人导航站,找来找去找到了Webstack网址导航

项目主页:https://github.com/WebStackPage/WebStackPage.github.io/

官方Demo: ➡️ www.webstack.cc

但是官方项目是一个纯静态站,纯静态站意味着增删链接都要修改代码。

一个工具越有用,用的越多,相应的需求也会变多,所以静态站无法满足我的需求

然后我发现还有Webstack Typecho版与Webstack wordpress版

看了下wordpress版本实际上就是通过模板加载了webstack的页面,然后添加链接,通过wordpress的php方法调用链接内容,对于熟悉wordpress的朋友会非常方便,但实际上上,即使不熟悉wordpress也没关系,看完这个视频就会了。

项目主页: https://github.com/owen0o0/WebStack

感谢作者的无私分享

整体说明

我假定你也跟我一样把这个服务搭建在内容的nas中。

硬件以及系统:Linux服务器一台,我使用的omv5,unraid,truenas scale均可

安装Docker

内容(略)

portainer容器创建,一定要装一个,不装你就亏大了。

注意:data目录根据你的真实目录修改。

docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v /srv/dev-disk-by-label-data/dockers/portainer/data:/data portainer/portainer-ce

创建MariaDB容器

我内网中有一个mariadb容器,里面有几十个数据库,给内网所有的服务器提供数据存储服务,希望大家也这样做,千万不要给每一个服务单独搭建一个容器,浪费资源是一方面,管理起来也非常不爽

如果你已经有mysql或者mariadb的服务了,就可以直接跳过此部分。

mariadb是mysql的完全开源版,大家放心使用,现在的mariadb就是以前的mysql,现在的mysql不是以前的mysql。

如果你没有的话首先去创建一个mariadb容器:

# 启动mariadb
docker run -d \
  --name mariadb \
  -v /srv/dev-disk-by-label-data/dockers/mariadb/data/:/var/lib/mysql/
  -e MYSQL_ROOT_PASSWORD=123456 \
  -p 3307:3306 \
mariadb

数据库的账号密码 root 123456

我习惯于使用navicat管理数据库,如果你不喜欢可以安装一个网页版的mysql管理工具phpmyadmin

docker run -d \
  --name phpmyadmin \
  -e PMA_HOST=mariadb \
  -p 8001:80 \
  -h phpmyadmin \
  --restart=always \
  --link mariadb \
  phpmyadmin/phpmyadmin:latest

phpmyadmin安装完成后,浏览器中打开 http://ip:8001

有工具的直接去工具中执行sql操作

创建一个wordpress可用的数据库wordpresslink,因为是内网,我们直接用root账户就行了,不用额外创建用户。

如果你觉得不安全可以再创建一个专用的账户:

GRANT all on wordpresslink.* TO ‘links’@’%’ IDENTIFIED BY ‘123456’;
flush privileges ;

创建Wordpress容器

docker run -d \
--name wordpresslink \
-p 8884:80 \
-e WORDPRESS_DB_HOST=192.168.188.100:3307 \
-e WORDPRESS_DB_NAME=wordpresslink \
-e WORDPRESS_DB_USER=links \
-e WORDPRESS_DB_PASSWORD=123456 \
-v /srv/dev-disk-by-label-data/dockers/wordpress/wordpresslink/html:/var/www/html \
-v /srv/dev-disk-by-label-data/dockers/wordpress/wordpresslink/config/:/config \
wordpress

容器启动成功的话就打开http://ip:8886

开始安装wordpress,填一下配置,安装成功后登陆后正常

wordpress安装完毕。

配置Wordpress

修改/srv/dev-disk-by-label-data/dockers/wordpress/links/html

这个目录对应着wp容器中的/var/www/html

存放的是wordpress源码

需要修改htaccess文件,把原内容删除,添加以下内容

# LoadModule rewrite_module     modules/mod_rewrite.so

# Apache 规则
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

WordPress 后台「设置」栏目 -> 固定链接 -> 保存更改

安装WebStack

前往https://github.com/owen0o0/WebStack下载项目文件是个zip文件

WordPress 后台「主题」栏目 -> 上传主题 -> 启用主题

配置WebStack

使用WebStack

设置链接目录

添加一个链接

外观-菜单,创建一个菜单,将链接目录放入菜单

刷新主页查看效果

WebStack说明

Headscale-ui使用

imajeason阅读(5799)

给Headscale搭建一个内网穿透设备管理界面,实现一个易用的开源版Tailscale

前面做了一期自建内网穿透工具headscale服务搭建的视频,有一些朋友反馈没有界面不方便后续使用

今天我们就给headscale一个界面,实现一个更加接近tailscale的管理后台

首先回顾一下headscale搭建过程

观看本期视频之前首先要看我之前搭建headscale服务的视频

需要derp服务的就看derp服务的视频

确保服务可用的情况下,继续

现在headscale服务器上有了nginx反向代理,将headscale的端口代理到了443端口,也就是默认的https端口上

打开浏览器显示是有证书的页面,且无任何错误信息

headscale-ui项目首页:https://github.com/gurucomputing/headscale-ui

根据项目描述得知,headscale-ui是静态网站,那就好说了,因为我们已经使用了nginx做headscale的反向代理

 再给ui也代理一下就可以了,打开release,找到最新的压缩包,复制下载地址

现在ssh到服务器,下载它

yum update
yum install unzip wget
mkdir -p /html/headscale-ui 
cd /html/headscale-ui
wget https://github.com/gurucomputing/headscale-ui/releases/download/2022.09.13-beta/headscale-ui.zip
unzip headscale-ui.zip
chown -R nginx:nginx /html/headscale-ui

 然后修改nginx配置,derper.conf从哪里来的,不知道的看我headscale服务搭建篇

cd /etc/nginx/conf.d/
vim derper.conf
# 增加配置
location /web {
        alias /html/headscale-ui/web;
        try_files $uri $uri/ /index.html;
}
# 

下面为完整配置

server {
    listen 80;
    server_name t.dongvps.com;
    rewrite ^(.*) https://$server_name$1 permanent;
}

server {listen 443 ssl;
    
    server_name t.dongvps.com;
    charset utf-8;

    ssl_certificate /etc/letsencrypt/live/t.dongvps.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/t.dongvps.com/privkey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 5m;
    keepalive_timeout 70;


    location / {
        proxy_redirect off;
        proxy_pass http://127.0.0.1:8080; # port
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    location /web {
        alias /html/headscale-ui/web;
        try_files $uri $uri/ /index.html;
    }

}

按esc 输入:wq 保存后,重启nginx服务

systemctl restart nginx

打开浏览器输入 

https://t.dongvps.com/web

不出意外的话,你就能打开首页了

会提示输出apikey,点击settings

回到ssh,如果你是用的docker

docker container ls
# 获取到容器的id
 docker exec id headscale apikeys create
 # 获取到一个apikey

如果是go自行安装的headscale服务

那就直接执行

headscale apikeys create

得到apikey,得到的apikey填入设置,以及headscale的服务首页也填上

保存之后就可以了

这里就要注意了,重点说明

因为是静态站,所以服务端是不保存任何信息的,这意味着你刚才填写的apikey只在你当前浏览器上保存着,无论你更换一个浏览器还是更换一台电脑,都需要重新设置apikey

t同时也意味着这个页面只要开着谁都可以访问,只不过只有你可以生成apikey所以只有你自己可以管理你的headscale服务

基于以上情况,我建议大家尽量使用命令行来操作

下面简单说一下headscale-ui的使用

设置完apikey之后,userview可以查看namespace命名空间

headscale-ui

z在这个界面可以添加命名空间,每一个命名空间可以认为是一个虚拟子网,同一个命名空间的设备才能互通

device view可以查看已经加入的设备

此处可以修改设备名称,给设备加tag,选择是否允许该设备为指定网段启用虚拟路由

而新增设备的话,同样的需要先在设备上通过tailscale命令发起,获取到key

填写过来,选择命名空间,添加即可

好了,headscale ui的使用说明就这么多了

有问题的跟我留言,

自建知识管理平台trilium

imajeason阅读(1775)

j今天跟大家聊聊笔记应用,最早的时候我们用系统自带的笔记本,只有文字,一个自带笔记本解决一切,然后就放在电脑硬盘里,那时候我觉得硬盘就是世界上最安全的文档居所

h后来有一个应用叫evernote,进入中国市场后,它得名字叫某象笔记,那时候无数人赞美它,给它钱,成为它的用户

一个随手笔记凭什么收我的钱,更多的人觉得免费账户就可以了,

eevernote官方对此表示了强烈不满,一再降低免费账户的终端限制数量,然后在运行中不停的校验连接的终端数量,极大的降低了用户体验,那段时间我是直接骂它娘的

再就是无处不在的广告,即使你交了会员费,广告也不会放过你,我不晓得evernote官方在想什么,或许它认为用户习惯已经养成,只能乖乖交钱

于是,这个应用成了一坨狗屎,不停的给用户喂,为你写诗

z在这期间有有道云笔记,为知笔记,但是他们只是evernote的模仿者,即使有一些自己的特色,但是并不足以取而代之

b不久后一个划时代的应用出现了,它叫notion,这个应用是如此的强大,

在整个架构上它是一个wiki,无线目录层级,每一层都可以存放内容

z在功能上,它有很多非常高级的特性,甚至有database功能,

但是在中国大陆你是打不开这个应用的,这是每一个涉及到内容分享功能的应用的宿命

d即使如此,notion依旧拥有巨大的用户群体,足以昭示它的强大

w我甚至为它掏了钱,还把evernote上所有的笔记一篇篇的放到了notion上,然后删掉了evernote

为什么我还在寻找笔记应用呢,

互联网发展太快,互联网的服务更新换代太快了,一代又一代

s商业公司的寿命是短暂的,而商业产品的寿命是更加短暂的,强大如谷歌,被杀死的应用也是不计其数

w未来比notion更加优秀的知识管理工具一定会出现,那时候我又要经历一次数据的大迁移,这个过程是痛苦的甚至是具有风险的

无论是学习还是工作,抑或是生活,我们都有很多需要记录的文字,这个需求确实永恒的,

从第一次摸到那排列奇怪的键盘,从第一次走入陌生的网易聊天室,从申请的第一个邮箱账号,从申请的第一个qq号

在互联网上,你的数据从来就不属于你,而是被用来叫价的筹码

w我需要一个可以由我掌控的应用,管理属于我的数据,

似乎markdown就可以帮我完成这一切

我试图使用vscode+git+gitlab的方案,通过markdown插件实现了图文笔记编辑展示,实现版本管理与数据备份

但是我很快意识到这样的方式只能实现基本的笔记应用,这远远不够

y于是我总在有意无意的关注笔记应用

z终于有一天,我发现了一个叫trilium的docker镜像

好奇心驱使下,我搜到了这样的评价:超高自由度的个人知识库

分层级的知识库

首先,它是一个分层级的知识库,同notion一样,在trilium中,文件夹的概念消失了,一切内容都是节点,一个节点可以是内容节点,同时也是父节点,每一层节点都可以有自己单独的内容格式存放单独的内容,并且组成更加复杂的结构

g更加神奇的是,trilium中节点可以被复用,同一个节点可以是不同节点的子节点,通过这种克隆和分支,trilium中的节点不是分支树,而是一个网状树

z这个功能有什么用呢,一个节点的不同维度可以成为一个特征节点,一个节点无论被多少节点引用,只要一次修改,所有的视图中都可以看到这个修改

b版本管理

trilium会把每次保存的内容保存成一个新的版本,这意味着你可以轻易找到被你删掉的内容,误删除,误修改都不是事。

在任何商业产品中,版本管理都是超高级的vip功能

j加密笔记

每一篇笔记都是可以单独加密的,这个功能有多好只有用的到的人才懂啊

w网页剪辑

z这个功能基本不需要多说,笔记应用必备,一键保存我们找到的文档到笔记中,也可以把网页截图保存

l另外,trilium会把内容自动保存在对应日期节点中,这个不知道能不能修改成可以自由选择,知道的朋友请告诉我

f富文本支持

通过markdown实现,笔记编辑使用的是ckeditor,支持直接粘贴markdown内容,如果你在使用其他的笔记应用,要想使用trilium是没有迁移困难的

d多媒体和文件管理

ttrilium的文件管理不依赖外部目录,这些多媒体文件也是节点的形式存在在trilium数据库中,这意味着,它可以很容易实现全平台同步

f值得一说的功能

btrilium中没有文件夹与笔记的区别,只有节点,而节点是有属性的

笔记类型,文本就是普通笔记

关系图,可以做类似族谱的东西

x渲染笔记,

h画布,顾名思义,画布可以直接用来画图,我测试了一下,这个画布甚至支持手写板压感。。。

s书,应该主要是做读书笔记之类的

w网页视图,

d代码,支持多种常见代码格式,码农应该很喜欢

以上是笔记相关的功能

多平台支持

ttrilium可以作为一个单独的本地笔记应用来使用,数据的备份可以通过把数据同步到网盘里来实现

d但是作为一个docker爱好者,对服务平台的搭建是必不可少的

ttrilium可以通过docker镜像搭建成一个服务,然后其他的终端可以直接与服务器定时的同步,来保证笔记数据的一致

l另外windows客户端也可以是可以作为服务端来使用,如果是单机使用 可以以此用来给浏览器剪辑插件使用

搭建trilium服务非常简单

docker run -d --restart unless-stopped --stop-timeout 300 \
	--name trilium \
	-p 8080:8080 \
	-v /srv/dev-disk-by-label-data/dockers/trilium:/home/node/trilium-data \
	-v /srv/dev-disk-by-label-data/dockers/trilium/backup:/home/node/trilium-data/backup \
	-e TZ=Asia/Shanghai \
zadam/trilium:0.54.3

z注意-v 后面的冒号前面的是你的nas或者linux服务器的真实目录,需要根据你的情况自行修改,冒号后面的是容器内的目录,不要修改

r然后在windows客户端,填上搭建的服务,http://ip:8080,提示同步成功后就可以了

每次修改完毕后,左下角的同步标识会标记星号,定时自动同步,也可以手动同步

e而浏览器插件剪辑也需要与服务器端进行同步,填写上服务器端的ip和端口以及密码

x现在就可以愉快的使用这个笔记应用了

s说实话,这个笔记应用对我来说几乎是一个完美的应用,除了它没有移动客户端

z在移动端如果想要使用的话,只能通过内网穿透然后在移动端通过浏览器打开服务端来使用,虽然颇有不便,但是应急还是可以的

r如果对此你颇有不屑,认为没有移动端的应用不是好应用,但我想说的是,对于一个功能如此强大的笔记应用,要完全在移动端复现它的功能并不容易

z做一个免费开源的笔记应用,它已经足够好了,如果您有足够的实力,请给它做一个移动端,如果它足够好用,我相信,会有足够多的人愿意为此付费。

从txt到markdown

c从某象到notion

w我们有很多需要记录的思维碎片,但互联网是不可靠的

j几乎没有可以永久为我们提供服务的互联网存在

s随着互联网基础设施的升级,互联网用户的需求也在快速的变化,那些曾经辉煌美好的应用慢慢的死掉,一起埋葬的还有我们人生的美好回忆

不知道从何开始我有了积攒数据的习惯,尽可能把一些重要的数据存放在我自己的手中,

硬盘1t不够就4t,4t不够就10t

1块不够就2块,2块不够就4块

nas一台不够就两台,两台不够就三台

r人们常说时间可以消磨一切,那是因为人无法记住很多东西,时间消磨得不是痛苦或者美好,而是记忆

有了那些不灭的记忆我才之所以是我

j就让nas中一块块的硬盘帮我们保存记忆

以上,请享受trilium为你准备的美好

别忘了关注,我是张大七

那下期再见了。

开源版tailscale,headscale搭建

imajeason阅读(37343)

Headscale 是什么 上一期视频讲了tailscale,Tailscale 是一个收费的vpn服务,免费用户有诸多限制,为了破除这些限制,有开源项目重新把tailscale实现了一遍,项目名称叫headscale

是由欧洲航天局的 Juan Font 使用 Go 语言开发,在 BSD 许可下发布,实现了 Tailscale 控制服务器的所有主要功能,可以部署在企业内部,没有任何设备数量的限制,且所有的网络流量都由自己控制。

目前 Headscale 还没有可视化界面,所有的操作都需要在命令行中完成,但是命令并不多,操作也不复杂。

因为是自建服务,那能自定义的配置就多了,任意定义网段,任意定义命名空间

udp直连会被运营商限速,所以会出现速度骤降,但是ping非常稳定,传速速度页非常稳定。

Headscale 部署

Headscale 部署在 Linux 主机上,随便找台有独立ip的vps就可以了,但是要注意,如果需要穿透的内网无法打洞成功那么流量就会由服务器中转,这意味着穿透后的速度会直接的受限于节点跟服务器之间的网络情况,所以尽量选择离你近的服务器,即使打洞失败了,至少网络还是稳定的,通畅的。

项目主页:https://github.com/juanfont/headscale/

# 下载服务端
wget --output-document=/usr/local/bin/headscale \
https://github.com/juanfont/headscale/releases/download/v0.17.0-alpha4/headscale_0.17.0-alpha4_linux_amd64
# 设置执行权限
chmod +x /usr/local/bin/headscale

准备

#创建配置目录:
mkdir -p /etc/headscale

#创建目录用来存储数据与证书:
mkdir -p /var/lib/headscale

#创建空的 SQLite 数据库文件:
touch /var/lib/headscale/db.sqlite

# 从example 创建 Headscale 配置文件:
wget https://github.com/juanfont/headscale/raw/main/config-example.yaml -O /etc/headscale/config.yaml
  • server_url 设置为 http://<PUBLIC_IP>:8080,将 <PUBLIC_IP> 替换为公网 IP 或者域名。
  • 可自定义私有网段,也可同时开启 IPv4 和 IPv6:
  • ip_prefixes: # - fd7a:115c:a1e0::/48 - 10.1.0.0/16
  • 随机端口要打开,否则同一个内网中多个终端会有问题
  • randomize_client_port: true

创建 SystemD service 配置文件:

# /etc/systemd/system/headscale.service
[Unit]
Description=headscale controller
After=syslog.target
After=network.target

[Service]
Type=simple
User=headscale
Group=headscale
ExecStart=/usr/local/bin/headscale serve
Restart=always
RestartSec=5

# Optional security enhancements
NoNewPrivileges=yes
PrivateTmp=yes
ProtectSystem=strict
ProtectHome=yes
ReadWritePaths=/var/lib/headscale /var/run/headscale
AmbientCapabilities=CAP_NET_BIND_SERVICE
RuntimeDirectory=headscale

[Install]
WantedBy=multi-user.target
# 创建 headscale 用户:

useradd headscale -d /home/headscale -m

# 修改 /var/lib/headscale 目录的 owner:

chown -R headscale:headscale /var/lib/headscale

#修改配置文件中的 `unix_socket`:


unix_socket: /var/run/headscale/headscale.sock

# Reload SystemD 以加载新的配置文件:

systemctl daemon-reload

#启动 Headscale 服务并设置开机自启:

systemctl enable --now headscale

# 查看运行状态:

systemctl status headscale

# 查看占用端口:

ss -tulnp|grep headscale

# 创建一个 namespace,以便后续客户端接入,例如:
headscale namespaces create default

# 查看命名空间:

headscale namespaces list

客户端安装

目前除了 iOS 客户端,其他平台的客户端都有办法自定义 Tailscale 的控制服务器,headscale仅仅是实现了tailscale服务端的功能。

OSSupports headscale
LinuxYes
OpenBSDYes
FreeBSDYes
macOSYes (see /apple on your headscale for more information)
WindowsYes docs
AndroidYes docs
iOSNot yet

Windows客户端

打开http://ip:8080/windows

下载一个注册表修改工具,执行一下

安装tailscale客户端

启动,登陆的时候就会去我们自己的服务器认证了

认证成功获取到ip,客户端就加入网络了

而且windows端做路由也是可以的,如果需要,加上参数–advertise-routes=192.168.188.0/24

打开cmd,执行

tailscale up  --login-server=http://ip:8080 --accept-routes=true --accept-dns=false --advertise-routes=192.168.188.0/24

再去服务器端查看route,激活路由

headscale routes list -i 1
headscale routes enable -i 1 -r "192.168.188.0/24"

linux客户端

直接下载。查看最新版本:https://pkgs.tailscale.com/stable/

wget https://pkgs.tailscale.com/stable/tailscale_1.28.0_amd64.tgz
tar zxvf tailscale_1.28.0_amd64.tgz x tailscale_1.28.0_amd64/

将二进制文件复制到官方软件包默认的路径下:

cp tailscale_1.28.0_amd64/tailscaled /usr/sbin/tailscaled
cp tailscale_1.28.0_amd64/tailscale /usr/bin/tailscale
chmod +x /usr/sbin/tailscaled
chmod +x /usr/bin/tailscale

将 systemD service 配置文件复制到系统路径下:

cp tailscale_1.28.0_amd64/systemd/tailscaled.service /lib/systemd/system/tailscaled.service

将环境变量配置文件复制到系统路径下:

cp tailscale_1.28.0_amd64/systemd/tailscaled.defaults /etc/default/tailscaled
# 启动 tailscaled.service 并设置开机自启:
systemctl enable --now tailscaled
# 查看服务状态:
systemctl status tailscaled

Tailscale 接入:

tailscale up --login-server=http://ip:8080 --accept-routes=true --accept-dns=false
# 如果申请为虚拟网关,需要指定
tailscale up --login-server=http://ip:8080 --accept-routes=true --accept-dns=false --advertise-routes=192.168.188.0/24
# 打开转发
echo 'net.ipv4.ip_forward = 1' | tee /etc/sysctl.d/ipforwarding.conf
echo 'net.ipv6.conf.all.forwarding = 1' | tee -a /etc/sysctl.d/ipforwarding.conf
sysctl -p /etc/sysctl.d/ipforwarding.conf

执行完上面的命令后,会出现下面的信息:

To authenticate, visit:

http://xxxxxx:8080/register?key=905cf165204800247fbd33989dbc22be95c987286c45aac303393704

在浏览器中打开该链接,就会出现如下的界面:

https://jsdelivr.icloudnative.io/gh/yangchuansheng/imghosting3@main/uPic/2022-03-20-17-06-08qWbz.png

将其中的命令复制粘贴到 headscale 所在机器的终端中,并将 NAMESPACE 替换为前面所创建的 namespace。

headscale -n default nodes register --key d1614a1407b7554cd368db21f383197802d9c95249130d7b3db256458d9a4043
# 注册成功,查看注册的节点:
headscale nodes list
# 许可路由的话,通过上个命令就可以看到linux节点的id,就是1,2,3,……
# 查看改节点的路由,假如id是1
headscale routes list -i 1
# 许可网关
headscale routes enable -i 1 -r "192.168.188.0/24"
# 再次查看虚拟网关状态,id是1
headscale routes list -i 1
# enabled就是已经启用了

回到 Tailscale 客户端所在的 Linux 主机,可以看到 Tailscale 会自动创建相关的路由表和 iptables 规则。路由表可通过以下命令查看:

ip route show table 52

群晖客户端

项目地址:https://github.com/tailscale/tailscale-synology

下载安装包手动上传到webui,安装启用

登录到ssh命令行

tailscale up --login-server=http://ip:8080 --accept-dns=false

剩下的步骤跟linux一致

如果需要群晖做虚拟网关的话,添加参数–advertise-routes=192.168.199.0/24

tailscale up --login-server=http://ip:8080 --accept-dns=false --advertise-routes=192.168.199.0/24

openwrt客户端

项目地址:https://github.com/adyanth/openwrt-tailscale-enabler

按照项目的安装说明安装即可

安装完成,启动服务后,执行跟linux和群晖相同的命令

tailscale up --login-server=http://ip:8080 --accept-dns=false --advertise-routes=192.168.199.0/24

安卓客户端

稍微麻烦些,需要自己去github上生成release,这里就不写了,直接提供包出来

重点就是指定服务器的地址,如果不指定的话认证服务器是指向tailscale的

要想自己指定服务器需要从项目代码中自己生成一个

可以在github上操作,总体来说费劲一点,这不是本期视频的重点,我就直接把我生成的客户端放到蓝凑云了

https://wws.lanzouw.com/iRZcQ0als9sh 密码:dwsn

安装完成后别直接登录,

登陆页面,右上角有一个use login server,

打开,填上自己的服务器的ip和端口登录,同样会跳转到一个页面

复制给出的命令,修改namespace为default

去服务端命令行执行一下,认证成功

安卓端就搞定了

总体而言,除了安卓端麻烦些,openwrt端耗费的时间长一些,难度不高

zerotier的最佳替代者tailscale

imajeason阅读(5910)

闲话tailscale

前面讲了zerotier,我的评价是zerotier是最简单易用的内网穿透工具,上手容易,操作逻辑非常清晰。

但是没有一个产品会满足所有人的需求,在众多的同类产品中,tailscale无疑是最好的哪个,但是你要问我zerotier与tailscale哪个好,我只能说,我也不知道。

Tailscale 是什么

WireGuard 是一个易于配置、快速且安全的开源 VPN,它利用了最新的加密技术。目的是提供一种更快、更简单、更精简的通用 VPN,它可以轻松地在树莓派这类低端设备到高端服务器上部署。

但是不同于VPN,WireGuard 没有 VPN 网关,所有节点之间都可以点对点(P2P)连接,全互联模式(full mesh),效率更高,速度更快,成本更低。

wireguard图

简而言之,我们可以将 Tailscale 看成是更为易用、功能更完善的 WireGuard。

Tailscale 是一款商业产品,个人用户在接入设备不超过 20 台的情况下是可以免费使用的

(虽然有一些限制,比如子网网段无法自定义,且无法设置多个子网,只能配置一个虚拟路由)。

对于大部份用户来说, Tailscale 已经足够了,如果你有更高的需求,比如自定义网段,可以选择付费。

相比于zerotier,Tailscale更容易添加虚拟路由,任何一个节点就都可以被设置为路由,从而让所在内网被其他节点访问到。

如果你有更高的需求,更多的客户端数量,更多的虚拟网段,更多的虚拟路由,那就需要headscale,不过本期内容是tailscale,headscale等下期。

tailscale可以做什么

  • 让内网内所有的设备和服务都可以被其他节点访问到

使用tailscale

1、申请账户,可以直接使用谷歌账号、github账号

官方网站:申请账号 Tailscale

tips:建议使用微软账号,没有被墙。

登陆成功后,主页上赫然显示所有平台的客户端下载按钮

2、首先是windows,下载安装启动,一气合成。

点击会打开浏览器跳转到tailscale主页,登录状态的话会显示认证成功。

windows客户端就这么好了。

tailscale up --accept-routes=true --accept-dns=false --advertise-routes=192.168.188.0/24

3、linux客户端

直接下载。例如:

https://pkgs.tailscale.com/stable/

wget https://pkgs.tailscale.com/stable/tailscale_1.28.0_amd64.tgz

解压:

tar zxvf tailscale_1.28.0_amd64.tgz x tailscale_1.28.0_amd64/ x 

tailscale_1.28.0_amd64/tailscale x tailscale_1.28.0_amd64/tailscaled x tailscale_1.28.0_amd64/systemd/ x tailscale_1.28.0_amd64/systemd/tailscaled.defaults x tailscale_1.28.0_amd64/systemd/tailscaled.service

将二进制文件复制到官方软件包默认的路径下:

cp tailscale_1.28.0_amd64/tailscaled /usr/sbin/tailscaled
cp tailscale_1.28.0_amd64/tailscale /usr/bin/tailscale
chmod +x /usr/sbin/tailscaled
chmod +x /usr/bin/tailscale

将 systemD service 配置文件复制到系统路径下:

cp tailscale_1.28.0_amd64/systemd/tailscaled.service /lib/systemd/system/tailscaled.service

将环境变量配置文件复制到系统路径下:

cp tailscale_1.28.0_amd64/systemd/tailscaled.defaults /etc/default/tailscaled

启动 tailscaled.service 并设置开机自启:

$ systemctl enable --now tailscaled

查看服务状态:

$ systemctl status tailscaled

Tailscale 接入:

tailscale up --accept-routes=true --accept-dns=false
# tailscale up --accept-routes=true --accept-dns=false --advertise-routes=192.168.188.0/24

这里推荐将 DNS 功能关闭,因为它会覆盖系统的默认 DNS。如果你对 DNS 有需求,可自己研究官方文档,这里不再赘述。

打开后台

4、openwrt客户端,下载对应版本

https://github.com/adyanth/openwrt-tailscale-enabler

  • 解压到根目录:
tar x -zvC / -f openwrt-tailscale-enabler-v1.28.0-e707d17-autoupdate.tgz
  • 安装依赖:
opkg update opkg install libustream-openssl ca-bundle kmod-tun
  • 启动服务,第一次启动
/etc/init.d/tailscale start 
tailscale up --accept-dns=false --advertise-routes=192.168.188.0/24

因为是第一次启动,会下载 tailscale packag, 会非常慢,等待完成

设置自启动

/etc/init.d/tailscale enable

检查是否存在以下文件

ls /etc/rc.d/S*tailscale*

同样的,完成后去tailscale后台查看是否获取到ip了

设置为虚拟路由的情况

此时未完,打开openwrt的接口,查看是否由tailscale接口了,如果没有就创建一个,防火墙区域,设置为lan

https://yomis.blog/content/images/2022/04/Screenshot-2022-04-23-at-04.01.46.jpg

此时此刻,虚拟路由应该生效了,openwrt所在子网的设备均可被其他节点访问到

5、群晖客户端

https://github.com/tailscale/tailscale-synology

群晖客户端简单了,下载对应版本的包,手动安装

启动,打开tailscale登录页面,认证

群晖担任虚拟路由的情况,同样的,去ssh执行

tailscale up --accept-routes=true --accept-dns=false --advertise-routes=192.168.188.0/24

记得,启动虚拟路由必须去tailscale后端去打开,路由才会生效。

至于安卓与ios客户端就不说了,大同小异的,macos的请自行查找吧

结语

tailscale作为一款商业软件限制还是有的,无法自定义虚拟子网段,最多20台设备的额度,但是大部分人的需求已经足够满足了

至于打洞后的速度,除了打洞本身需要的时间有一些不同,zerotier与tailscale基本没有性能上的差异,他们都是最优秀的内网穿透工具。

本期视频到这里了,我是张大七,下期见。

[万能docker]优秀开源音乐服务器Navidrome

imajeason阅读(4678)

闲话

有朋友问有没有好用的自建音乐服务,答案显而易见是有的,他就是navidrome。

这期视频给大家展示一下基本的使用情况以及如何获取免费的mp3音乐资源。

它是一个全平台支持的音乐服务,服务可以安装在三大系统上,当然也可以直接docker中部署容器。

Navidrome特性

主要特性包括:

  • 处理非常大的音乐收藏库,
  • 几乎可播放任何音频格式
  • 读取并使用你精心标记的各种元数据
  • 多用户,每个用户都有自己的播放次数、播放列表、收藏夹等
  • 资源占用率非常低
  • 多平台,在 macOS、Linux 和 Windows 上运行。还提供 Docker 镜像
  • 适用于所有主要平台的即用型二进制文件,包括 Raspberry Pi
  • 自动监控你的库的变化,导入新文件和重新加载新的元数据
  • 基于 Material UI 的主题、现代和响应式的 Web 界面
  • 与所有 Subsonic/Madsonic/Airsonic 客户端兼容
  • 在传输中进行转码,可按用户/播放器设置,支持 Opus 编码
  • 支持中文界面

第三方客户端支持非常丰富

navidrome部署

申请lastfm api,用来同步红心

https://www.last.fm/api/authentication

docker安装

docker run -d \
   --name navidrome \
   --restart=unless-stopped \
   --user $(id -u):$(id -g) \
   -v /srv/dev-disk-by-label-data/musics/navidrome:/music \
   -v /srv/dev-disk-by-label-data/dockers/navidrome/data:/data \
   -p 4533:4533 \
   -e ND_LOGLEVEL=info \
   -e ND_LASTFM_SECRET=xxxx \
   -e ND_LASTFM_APIKEY=xxxx \
   -e ND_LASTFM_ENABLED=true \
   -e ND_LASTFM_LANGUAGE=zh \
   -e ND_TRANSCODINGCACHESIZE=200 \
   -e ND_ENABLETRANSCODINGCONFIG=true \
   -e ND_LOGLEVEL=info \
deluan/navidrome:latest

/srv/dev-disk-by-label-data/dockers/navidrome/data 用来存放配置文件,但是因为参数都写在生成docker的env里了,配置文件无所谓了

/srv/dev-disk-by-label-data/musics/navidrome 用来存放音乐文件,目录也可以扫描,直接网里丢就行

navidrome使用

部署完成后,浏览器打开ip:4533

注册账号,使用即可

文件放到音乐目录后刷新页面就可以看到音乐列表了

移动端,我使用了substreamer

服务器就是ip:4533,账号密码就是申请的密码

为了使用方便,建议配合内网穿透使用,否则出了家门就听不了歌,我们这个服务还有什么意义呢

音乐获取:产生的一切法律责任自行承担

mp3自建服务有了,辣么mp3从哪里来呀,答案是网易云音乐,但是下载要收费的,不要怕。

这时候你需要一个基于openwrt的路由器,软路由也是一样可以的。

https://github.com/maxlicheng/luci-app-unblockmusic/releases

这个插件的工作原理:

  • 其原理是采用 [QQ/虾米/百度/酷狗/酷我/咕咪/JOOX]等音源 替换网易云变灰歌曲链接
  • 通俗地理解就是通过脚本,将主流客户端的音乐链接汇集到一个客户端上

下载完成后,上传到openwrt,opkg install 逐个安装

安装完成后,打开路由器界面,就有unblock了

选择一下,启动

现在,如果你的这台pc的路由正是指向这台路由器,那么网易云音乐应该可以直接下载了,如果路由器是旁路由,你的pc并没有指向它

那就单独设置网易云音乐代理

自定义代理,旁路由ip,5200端口

重启网易云音乐,再次尝试下载,ok啦

想下就下吧,不过要悄悄的用哈,一般人我不告诉他。

内网穿透神器zerotier的正确打开方式

imajeason阅读(4611)

内网穿透神器zerotier,从会用到用好

大家好,今天跟大家深入的探讨一下我一直在用的内网穿透工具zerotier。

至于其他的内网穿透方案,都略逊于zerotier方案,要么是太复杂,要么是需要购买服务器自建服务,要么是稳定性不如zerotier,后面有机会逐一给大家介绍。

我知道很多朋友已经使用过zerotier,但是也请不要走开,我会说一些大家很少听到的zerotier的事情,一方面方便大家排障,更重要的是提高内网穿透的速度以及使用的方便度。

zerotier原理

为照顾没使用过zerotier的朋友,我先给大家介绍下zerotier的工作原理

zerotier内网穿透的核心是UDP打洞,不论两台设备是否在同一个内网中,只要这两个局域网的NAT方式达到了打洞的要求,就可以进行打洞,也就是建立一条隧道

打洞技术的原理比较简单,就是NAT内网的节点需要在NAT上建立自己的一条转发映射关系(这就是所谓的在NAT上打下一个洞),然后外网的节点就通过这个”洞”来进行通信。

提高zerotier性能

了解了zerotier工作原理总结一下提高zerotier性能的方法

1、网络环境,选择相对优秀的运营商,以山东为例,联通直接给公网ip,首选;电信公网ip需要申请,也可;移动铁通嘛,NAT方式不适合打洞,据说有的能够打洞成功,但是大部分情况是无法打洞的;

即使你有独立ip,zerotier也是需要的,因为你不可能把你网络中所有的设备都开放到公网,你要是真的那么做,就等着被入侵吧。

2、zerotier增加路由条目,每个内网环境只需要增加一条路由,登录一台设备到zerotier中就可以被其他网络访问到,不需要每个提供服务的设备单独安装,安装zerotier的首选设备是路由,现在许多路由系统内置了zerotier,不需要单独安装;

3、理论上任何一台设备都可以作为路由使用,让许可设备通过内网ip访问到,但是不同设备允许转发的配置不一样的,openwrt的比较简单,

iptables -I FORWARD -i zt3jnsuifh -j ACCEPT
iptables -I FORWARD -o zt3jnsuifh -j ACCEPT
iptables -t nat -I POSTROUTING -o zt3jnsuifh -j MASQUERADE
# zt3jnsuifh 为虚拟网卡名字
# 通过 ip a可以查看
# 同时要去常规设置,允许转发

4、在打洞失败的情况下,所有的流量都会通过zerotier的公共服务进行数据中转,而zerotier是在海外的,如果你在中国大陆,想要提速,就需要建立moon服务器,moon服务提供的功能相当于frp,国内的vps相对来说价格较高,可以考虑购买香港服务器

在你网络情况比较好的情况下,是不需要自建moon服务器,因为每次打洞都成功,moon根本不会被访问到。

以上就是使用zerotier的一些要点

zerotier的安装教程,视频里我就不说了,我会写到文档里,大家需要的就去看吧

我只说下,使用的流程

1、申请zerotier账号,开通网络,免费额度足够你用了,查看虚拟网络id

2、如果你路由器内置了zerotier,直接填上申请到的虚拟网络id

3、打开zerotier后台,勾选加入的路由设备

4、windows端安装zerotier较为简单,exe安装包直接装,启动后加入网络,填上申请到的虚拟网络id

5、linux端

curl -s <https://install.zerotier.com> | sudo bash

加入网络

#将网络ID替换成你自己的即可
sudo zerotier-cli join  8bd5124fd****3d4
sudo systemctl enable zerotier-one.service

6移动端,直接搜索zerotier one安装,加入网络即可

记得,新设备加入都要去zerotier后台许可。

好了,本期内容就这么多,感谢大家观看,下期见。

[Docker Can]在nas上基于docker自建简洁照片备份应用immirch,同步手机图片和视频

imajeason阅读(3196)

nextcloud不适合图片同步

本期视频搭建一个手机图片视频的应用Immich。

在使用这个图片备份服务之前我一直使用nextcloud备份我的多媒体文件和各种文档,众所周知,虽然nextcloud功能强大,但是速度实在不敢恭维

上传还好,预览真的是一塌糊涂,即使开启了memcached,仍旧是慢

为什么Immich

有人给我推荐了一个,图片同步服务 Immich,我暂时没有把这个应用映射到公网,也不打算映射到公网,毕竟都是手机里的私人照片。

同步快,有多快呢,我的感觉是跟局域网里往nas读写速度是一样的,比nextcloud快了不是一点半点

预览快,之前nextcloud中,打开图片目录那就是一种折磨,很久都无法刷新出来

但是immich,瞬间出图,体验真的是好的不得了

至于稳定性与数据安全性,应为immich仅仅是把图片同步到了指定的目录中,并进行索引,以及生成缩略图,即使immich服务删除掉,目录中的内容也是不受影响的,所以只要存放图片的目录做了数据冗余,那么这些图片视频就是安全的

app也非常简洁,功能不多,贵在同步功能好用

许多朋友之所以离不开群晖,很大一部分原因是群晖的moments功能可以对图片进行自动分类

immich也有此功能,但是根据项目描述,内置的深度学习算法需要cpu具备avx与avx与AVX2

如果是比较老的cpu,比如我这台nas是j1900,是无法使用图片智能分类功能的

用以下命令可以查看是否有avx与avx2

more /proc/cpuinfo | grep flags

安装

immich需要大量的组件,官方只提供了docker-compose安装方案,也就是必须命令行安装

前置条件:确保docker-compose可用,而且大于1.26.2,如果不是的话升级它

# 查看版本
docker-compose --version
# 如果版本太低就要升级
# 找到并修改原命令
whereis docker-compose
mv /usr/bin/docker-compose /usr/bin/docker-compose.bak

sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.26.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 确认
docker-compose --version
# 如果报错,重新登陆ssh

如果是普通linux操作系统安装,使用以下命令

执行后会安装docker,进而下载默认的docker-compose以及env文件进行默认配置的安装,安装完毕后会启动一个2283的服务,直接可以用了,图片视频会保存在./immich-app/immich-data,也就是当前目录下创建了一个immich-app目录。

curl -o- https://raw.githubusercontent.com/immich-app/immich/main/install.sh | bash

不过我还是建议大家自行下载yml文件修改进行安装

首先确保docker已经在运行中,创建一个作业目录,这是一个临时目录

mkdir immichdocker
cd immichdocker

下载docker-compose.yml

wget https://raw.githubusercontent.com/immich-app/immich/main/docker/docker-compose.yml

打开这个文件是这样的,唯一可能被修改的是2283端口可以修改为你需要的端口,但是理论上这个端口是不会被占用的,因为据我所知没有应用会默认使用这个端口,除非自行修改过,总之,这个文件几乎不用修改

version: "3.8"

services:
  immich-server:
    image: altran1502/immich-server:release
    entrypoint: ["/bin/sh", "./start-server.sh"]
    volumes:
      - ${UPLOAD_LOCATION}:/usr/src/app/upload
    env_file:
      - .env
    environment:
      - NODE_ENV=production
    depends_on:
      - redis
      - database
    restart: always

  immich-microservices:
    image: altran1502/immich-server:release
    entrypoint: ["/bin/sh", "./start-microservices.sh"]
    volumes:
      - ${UPLOAD_LOCATION}:/usr/src/app/upload
    env_file:
      - .env
    environment:
      - NODE_ENV=production
    depends_on:
      - redis
      - database
    restart: always

  immich-machine-learning:
    image: altran1502/immich-machine-learning:release
    entrypoint: ["/bin/sh", "./entrypoint.sh"]
    volumes:
      - ${UPLOAD_LOCATION}:/usr/src/app/upload
    env_file:
      - .env
    environment:
      - NODE_ENV=production
    depends_on:
      - database
    restart: always

  immich-web:
    image: altran1502/immich-web:release
    entrypoint: ["/bin/sh", "./entrypoint.sh"]
    env_file:
      - .env
    restart: always

  redis:
    container_name: immich_redis
    image: redis:6.2
    restart: always

  database:
    container_name: immich_postgres
    image: postgres:14
    env_file:
      - .env
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_USER: ${DB_USERNAME}
      POSTGRES_DB: ${DB_DATABASE_NAME}
      PG_DATA: /var/lib/postgresql/data
    volumes:
      - pgdata:/var/lib/postgresql/data
    restart: always

  immich-proxy:
    container_name: immich_proxy
    image: altran1502/immich-proxy:release
    ports:
      - 2283:80
    logging:
      driver: none
    depends_on:
      - immich-server
    restart: always

volumes:
  pgdata:

下载.env

wget -O .env https://raw.githubusercontent.com/immich-app/immich/main/docker/.env.example

打开后内容如下

其中必须修改的

1、UPLOAD_LOCATION 这个参数指定存放照片的真实绝对路径,我指定的是

/srv/dev-disk-by-label-data/storages/immich

这是omv的典型路径,我共享出来的storages下面创建了一个目录用于存放immich的内容

如果是普通linux的话,大概率是/data/immich之类,酌情修改

2、JWT_SECRET 这个项指定一个类似加密私钥的东西,必须修改,且不能泄露

###################################################################################
# Database
###################################################################################

DB_HOSTNAME=immich_postgres
DB_USERNAME=postgres
DB_PASSWORD=postgres
DB_DATABASE_NAME=immich

# Optional Database settings:
# DB_PORT=5432

###################################################################################
# Redis
###################################################################################

REDIS_HOSTNAME=immich_redis

# Optional Redis settings:
# REDIS_PORT=6379
# REDIS_DBINDEX=0
# REDIS_PASSWORD=
# REDIS_SOCKET=

###################################################################################
# Upload File Config
###################################################################################
UPLOAD_LOCATION=/srv/dev-disk-by-label-data/storages/immich

###################################################################################
# JWT SECRET
###################################################################################
JWT_SECRET=zheshiyigejwtsecretbixuxiugaierqiebunengxielou

###################################################################################
# MAPBOX
####################################################################################

# ENABLE_MAPBOX is either true of false -> if true, you have to provide MAPBOX_KEY
ENABLE_MAPBOX=false
MAPBOX_KEY=

####################################################################################
# WEB - Optional
####################################################################################

# Custom message on the login page, should be written in HTML form.
# For example VITE_LOGIN_PAGE_MESSAGE="This is a demo instance of Immich.<br><br>Email: <i>[email protected]</i><br>Password: <i>demo</i>"

启动安装

docker-compose up -d

这个命令需要的时间会比较长,这取决于你的网络

安装完成后,打开浏览器,输入ip:2283

注册账号,搞定。

手机app可以去谷歌市场/F-Droid/ios市场搜索immich下载即可

请尽情使用吧。

万能Docker,自建私人书库

imajeason阅读(2902)

现在电子书已经成为书籍最流行的存储方式,我们可以很容易的获取到很多的电子书资源。

随着硬盘里的资源越来越多,电子书的管理就是一个很大的问题,一个电子书城成为显而易见的选择,我选择的方案是Calibre电子书库。

PC版Calibre书城

calibre – E-book management

来到官方网站,可以直接下载一个桌面版的calibre电子书管理工具。

  • 这是一个非常强大的电子书管理工具,可以手动修改书籍的元信息,可以从网络中获取书籍的元数据
  • 可以将电子书转换成任何格式,可以制作电子书
  • 甚至还提供了rss功能,可以定时抓取订阅网站的内容
  • 提供了大量的插件,让客户端功能无比强大
  • 甚至可以直接启动一个电子书城,然后就可以从局域网的浏览器中访问书城

WEB书城

但是这个书城的体验并不是很好,一方面要启动这个书城需要一直开启pc客户端,另一方面自带书城的电子书格式有一些显示异常。

这时候我们需要calibre-web出场,为了使用它,pc客户端是必须的,用来管理数据库,web与pc共用了同一个数据库

https://github.com/janeczku/calibre-web

跟pc客户端一样,web版也是用python编写,用pip命令可以直接安装

Docker版

但是为了保持物理服务器系统的干净整洁,docker版才是我的菜

calibre-web有两个比较常用的镜像

technosoft2000/calibre-web与linuxserver/calibre-web
2000版在linuxserver版基础上做了一点修改,但是更新较少,毕竟是个人作品
我使用了2000版,大家可以酌情选择,如果使用linuxserver版会稍微有一些不同,我都写出来
docker pull technosoft2000/calibre-web
docker pull linuxserver/calibre-web
docker run -d \
--name calibre-web \
-p 8083:8083 \
-v /srv/dev-disk-by-label-data/dockers/calibre-web:/calibre-web \
-v /srv/dev-disk-by-label-data/dockers/calibre-web/config:/calibre-web/config \
-v /srv/dev-disk-by-label-data/dockers/calibre-web/app:/calibre-web/app \
-v /srv/dev-disk-by-label-data/dockers/calibre-web/kindlegne:/calibre-web/kindlegen \
-v /srv/dev-disk-by-label-data/books:/books \
-e PUID=1000 \
-e PGID=1000 \
technosoft2000/calibre-web
docker run -d \
--name calibre-web \
-p 8083:8083 \
-v /srv/dev-disk-by-label-data/dockers/calibre-web/config:/config \
-v /srv/dev-disk-by-label-data/books:/books \
-e PUID=1000 \
-e PGID=1000 \
linuxserver/calibre-web

创建一个专用目录/srv/dev-disk-by-id-ata/book ,用samba共享出来,

在windows上映射成本地磁盘z: pc版管理数据库,

在z:创建一个书库 calibre-web是docker端,配置 /srv/dev-disk-by-id-ata/book : /books

启动容器后,打开web页面会填路径就是/books

这样,客户端与web端管理的是同一个书城数据库了。

在pc客户端上添加的书籍在web端也可以查看并管理

web端的优点就是这个服务是7*24的

公网访问

然后考虑到读书是随时随地进行的,移动设备要想访问到这个书库

有两个方案,

第一个方案安装内网穿透的工具,比如frp,zerotier,这里推荐zerotier,免费不说,速度也不错的

第二个方案就是直接把网站映射到公网上,让这个书城变成一个真正的电子书网站,但是考虑到安全性,如果需要公网访问的务必要启用https,而不是http裸奔

我是个数据收集控

我收集了大量的电子书籍与影视资源

喜欢的朋友加群讨论nas,docker以及各种资源。