技术积累
日进一寸

Nextcloud在家庭Nas(非80/443)配置ssl证书实现https访问

imajeason阅读(271)

概述

家庭环境,这里特指中国大陆家庭拨号上网环境,首先是80与443端口都是不通的,要想实现https,配置相对比较麻烦。

  • 1、如果拨号环境没有公网ip或要用443端口,也就是没法通过默认的https端口实现加密访问,就需要使用frp之类的服务将内网的nextcloud映射出去。
  • 2、如果有公网ip,可以端口映射使用非80/443端口,例如9988端口等映射出去。

关联视频1:https://youtu.be/deA0M1zedlI

考虑到网盘需要较高的安全性,毕竟是隐私数据,不能接受被入侵,就一定要开启ssl证书访问。

如果你已经在内网nas搭建好了nextcloud,就直接直接到frp中转部分或者端口映射部分。

如果没有搭建nextcloud,链接如下:

nextcloud搭建

要想实现https服务的前提是把nextcloud服务映射到公网:

一共有3个方案,分别是frp转发、ipv4独立ip端口映射、ipv6独立ip开放。

本视频后续操作是frp转发方案,如果做成一个视频,时长有点太长了。

其他方案后面会陆续出视频。

首先是第一个方案frp转发

这个方案的好处是,家庭网络不需要在路由器上做端口映射,这就意味着不需要独立ip,也不需要担心在家庭网络开放服务从而导致运营商以此为借口搞什么幺蛾子,比如警告停止提供服务等,毕竟在中国大陆,私自在家庭网络中提供服务是不被允许的,即使我们搭建这种服务的目的是自用,不会跟你讲道理的。

优点很明显,缺点当然也是有的,就是需要有一台有独立ip的服务器。同样因为国内vps价格高,带宽小。我的选择是购买cn2-gia网络的搬瓦工服务器,我在简介里放了个推荐链接,大家有需要的可以去挑选一台。

cn2与cn2-gia的区别还是很大的,gia是专用网络,任意时间段都可以有几十m的速度,基本上可以把家庭网络跑满,达到在路由器上开启端口映射直接提供服务的水平。

现在我已经准备好了一台机器,我们还需要一个域名,域名的选择比较多,有啥用啥,愿意花钱的可以考虑自行购买com域名,一年一百来块,次之是6位数xyz域名,一年10块左右,最后是不花钱的方案,去  申请一个4级域名,可是可以用的。

有了域名,把域名解析到服务器ip上,解析的做法是做一条A记录,填写一个子域名名称,例如  pan.888888.xyz,只需要填写pan,ip地址就填写自己的服务器ip。

现在准备工作已经做好了。

下一步要搭建frp了。看拓扑图。

FRP拓扑

下面我们先做服务器端,在frp服务器上操作。

1、安装nginx代理工具。

nginx的作用是代理,也就是把frp转发后的端口再做一次代理,代理到80/443端口,并且挂上证书。

sudo yum update
sudo yum install nginx

修改nginx配置

cd /etc/nginx/conf.d/

vi pan.conf

server {
    listen 80;
    server_name zhangdaqi.duckdns.org;
    rewrite ^(.*) https://$server_name:443$1 permanent;
}

server {
    listen 443 ssl;
    server_name zhangdaqi.duckdns.org;
    charset utf-8;

    ssl_certificate /etc/letsencrypt/live/zhangdaqi.duckdns.org/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/zhangdaqi.duckdns.org/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;

    index index.html index.php;
    root /html/zhangdaqi.duckdns.org;
    #charset koi8-r;
    #access_log logs/host.access.log main;
    location / { 
        #proxy_redirect on ;
        proxy_pass http://127.0.0.1:7001;
        proxy_ssl_session_reuse off;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;

        # Show real IP in v2ray access.log
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

2、域名解析

在域名网站做一条解析
A记录   pan      ip地址

3、申请证书

我喜欢用certbot工具申请,这是Let’s Encrypt 的证书申请工具,申请到的证书有效期三个月,到期前可以进行证书更新。

安装certbot

yum install python-urllib3
yum install python-requests
yum install certbot

申请证书。

certbot certonly --standalone -d pan.abc.com

定时任务,自动更新证书。

修改nginx证书相关配置,完整配置类似下面,注意修改为自己的域名,以及frp端口。

现在重启nginx,就可以刷新web,实现了https。

4、搭建frp服务。

使用的操作系统是debian11

然后在我们的内网的一台机器上做frp服务,与服务器端进行数据交换。

5、openwrt配置frp

如果你有openwrt,主路由旁路由都没关系,安装frp内网穿透工具,也是可以的,配置如下。

配置nextcloud conf允许我们的域名和服务器访问。

重启服务后,理论上已经可以通过域名https访问你的nextcloud服务了,但是会报证书错误。

此为第一个方案,其他方法不久就会更新。

frp安装

imajeason阅读(123)

frp是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https 协议。

官方网站:https://gofrp.org/zh-cn/

具体实现:

1、需要一个公网ip地址,用来安装部署frp服务端frps

2、需要在内网环境中部署一台frp客户端frpc,当做代理服务器

3、用户访问公网ip地址,会先连接到frp客户端,再根据相应的规则去匹配转发,把请求发送到内网中其他主机上

4、在服务端需要开启相应的端口(7000,7001,7002,7003等)

安装部署:

1、下载frps

frp压缩包同时包含了 frps(frp 服务端)和frpc(frp 客户端)

下载地址:https://github.com/fatedier/frp/releases

2、服务端部署

#创建目录

mkdir -p /data/soft
mkdir -p /data/server

上传安装包frp_0.52.3_linux_amd64.tar.gz到/data/soft目录下面

#解压
cd /data/soft
wget https://github.com/fatedier/frp/releases/download/v0.52.3/frp_0.52.3_linux_amd64.tar.gz
tar zxvf frp_0.52.3_linux_amd64.tar.gz
mv /data/soft/frp_0.52.3_linux_amd64 /data/server/frp
#修改服务端配置文件
cp /data/server/frp/frps.toml /data/server/frp/frps.toml.bak

vi /data/server/frp/frps.toml

[common]
bind_addr = 0.0.0.0
bind_port = 7000
vhost_http_port = 7001
vhost_https_port = 7002
tcp_mux = true
authentication_method = token
token = 123456

:wq! #保持退出

#后台启动

nohup /data/server/frp/frps -c /data/server/frp/frps.toml > /dev/null 2>&1 &

#添加服务端开机启动

vi /usr/lib/systemd/system/frps.service

[Unit]
Description=frps
StartLimitIntervalSec=0
[Service]
Type=simple
Restart=always
RestartSec=1
User=root
WorkingDirectory=/data/server/frp
ExecStart=/usr/bin/env ./frps -c ./frps.toml
[Install]
WantedBy=multi-user.target

:wq! #保持退出

#重新加载 systemd 配置
systemctl daemon-reload
#启动frp
systemctl start frps
#停止frp
systemctl stop frps
#重启frp
systemctl restart frps
#查看frp状态
systemctl status frps
#服务在系统开机启动时自动启动
systemctl enable frps

3、客户端部署

#创建目录
mkdir -p /data/soft
mkdir -p /data/server

上传安装包frp_0.52.3_linux_amd64.tar.gz到/data/soft目录下面

#解压
cd /data/soft
tar zxvf frp_0.52.3_linux_amd64.tar.gz
mv /data/soft/frp_0.52.3_linux_amd64 /data/server/frp
#修改客户端配置文件
cp /data/server/frp/frpc.toml /data/server/frp/frpc.toml.bak

vi /data/server/frp/frpc.toml #编辑配置文件

[common]
server_addr = 1.2.3.4 #服务端的ip地址
server_port = 7000 #服务端的端口
tcp_mux = true #优化传输,和服务端必须一致
authentication_method = token #身份验证方式,和服务端必须一致 
token = 123456 #token设置密码,用于通过身份验证创建连接,和服务端必须一致
[tcp]
type = tcp #代理类型,包含 tcp, udp, http, https 等 
local_ip = 192.168.128.198 #要转发到的真实ip地址 
local_port = 3389 #要转发到的真实ip地址的端口 
remote_port = 7003  #远程服务器的代理端口
[http]
type = http #代理类型,包含 tcp, udp, http, https 等 
local_ip = 192.168.199.239 #要转发到的真实ip地址 
local_port = 7001 #要转发到的真实ip地址的端口 
custom_domains = zhangdaqi.duckdns.org #服务器域名或外网ip

:wq! #保持退出

#后台启动客户端
nohup /data/server/frp/frpc -c /data/server/frp/frpc.toml > /dev/null 2>&1 &

#添加客户端开机启动服务

vi /usr/lib/systemd/system/frpc.service

[Unit]
Description=frpc
StartLimitIntervalSec=0
[Service]
Type=simple
Restart=always
RestartSec=1
User=root
WorkingDirectory=/data/server/frp
ExecStart=/usr/bin/env ./frpc -c ./frpc.toml
[Install]
WantedBy=multi-user.target

:wq! #保持退出

#重新加载 systemd 配置
systemctl daemon-reload
#启动frp
systemctl start frpc
#停止frp
systemctl stop frpc
#重启frp
systemctl restart frpc
#查看frp状态
systemctl status frpc
#服务在系统开机启动时自动启动
systemctl enable frpc

4、验证

现在可以通过外网ip+端口来访问内网的服务器了。

内网端口暴露在公网上,请务必设置强密码,不要使用弱口令,很容易被攻击!

至此,Linux下使用frp搭建内网穿透服务器完成。

原文链接:https://www.osyunwei.com/archives/14110.html

Docker搭建Nextcloud容器实现自建网盘服务

imajeason阅读(183)

之前做了好多视频,都有讲到nextcloud搭建,但是没有一篇单独的文章写文档,此篇补全这个遗憾。

之前关注我的朋友可能知道,我所有的应用都是在nextcloud中部署的,nextcloud当然也不例外。

以unraid为例,先获取镜像:

docker pull linuxserver/nextcloud:27.1.4

然后启动容器。

注意:

/mnt/user/appdata/是unraid中的一个典型容器路径,而/mnt/user/appdata/nextcloud是nextcloud的专用路径。

这个路径要改成你自己的,不要直接复制。

puid与guid是你的第一个普通用户的id和组id,可以通过id 用户名查看。

注意以下操作是在nas的命令行里操作的。

docker run -d \
--name nextcloud \
-p 8444:443 \
-p 8180:80 \
-v /mnt/user/appdata/nextcloud/data:/data \
-v /mnt/user/appdata/nextcloud:/config \
-e PUID=1000 \
-e GUID=100 \
-e TZ=Asia/Shanghai \
--restart unless-stopped \
linuxserver/nextcloud:27.1.4

等待容器启动,即可通过8180或者8443这个端口在内网访问网盘服务了。

下载youtube|bilibili视频的免费工具,从视频到合集一网打尽

imajeason阅读(204)

本文章内容包括

vividl下载工具下载安装使用说明
youtubedl-material容器的安装使用
yt-dlp命令行下载工具说明

之前我在nas上搭建一个流媒体下载的工具

http://192.168.188.100:17442/#/home

可以用来下载在线视频网站的视频,其实这个下载工具背后使用的工具叫yt-dlp,非常好用

youtubedl-material

但是我近来下载合集比较多,如果用这个下载了之后视频我还要从nas上进行整理再传到我的网盘中,通过webdav服务进行观看,就比较麻烦

所以我就用了一段时间的yt-dlp

就是在win10中安装yt-dlp这个命令行工具,然后通过命令来下载

再结合ffmpeg等工具就可以在下载完的同时把媒体文件转换成自己需要的格式

但是我发现时间长了,还是不尽兴,命令行太麻烦了。

幸好,我找到了这样一款功能简洁的基于yt-lp的下载工具,这个软件本质上就是调用yt-dlp命令来实现下载,跟命令行上能做的一样多。

就是这个工具vividl是一个开源免费工具

https://github.com/Bluegrams/Vividl

这个工具仅有windows版本

https://sourceforge.net/projects/vividl/files/

大名鼎鼎的sourceforge,下载的时候需要开梯子

下载下来安装上即可,因为是基于.net开发的,所以安装会依赖.net,如果没有的话去下载安装一下net再安装

使用的时候要注意

如果要下载youtube这种需要梯子的网站的视频也是需要设置梯子的

下载目的文件夹也需要设置一下

下载播放列表

需要添加下载任务的时候选择download playlist

这样就可以愉快的进行下载了

下面是web版本的安装。通过docker-compose就可以启动

注意,http_proxy与http_proxy是梯子的地址,设置你自己的,既然你有nas,搭建一个openwrt旁路由应该不是什么难事

version: "2"
services:
    ytdl_material:
        environment: 
            ytdl_mongodb_connection_string: 'mongodb://ytdl-mongo-db:27017'
            ytdl_use_local_db: 'false'
            write_ytdl_config: 'true'
            http_proxy: ""
            https_proxy: ""
        restart: always
        container_name: youtubedl-material
        volumes:
            - ./youtubedl-material/appdata:/app/appdata
            - ./youtubedl-material/subscriptions:/app/subscriptions
            - ./youtubedl-material/users:/app/users
            - ./download/audio:/app/audio
            - ./download/video:/app/video

        ports:
            - "17442:17442"
        image: tzahi12345/youtubedl-material:4.3.2

        
    ytdl-mongo-db:
        # If you are using a Raspberry Pi, use mongo:4.4.18
        image: mongo:4
        logging:
            driver: "none"          
        container_name: mongodb-ytdl
        restart: always
        volumes:
            - ./youtubedl-material/db/:/data/db

再然后

如果上面两个工具都不能满足你的需求,那就直接用命令行吧

既然你选择使用命令行了,我相信安装python和配置环境变量都难不倒你

再去下载转码工具ffmpeg,也把它配置到环境变量的path中

此时保证打开cmd或者powershell中执行ffmpeg有出书工具说明

输入python会进入python交互工具,就安装成功了

这时候在命令行中执行

pip install yt-dlp -i https://pypi.tuna.tsinghua.edu.cn/simple

等待安装完毕在命令行中就有了yt-dlp命令

yt-dlp命令详细使用方法请移步:https://www.dongvps.com/2023-12-14/yt-dlp/

yt-dlp

开源图片应用immich升级,智能图片分类功能可以在老机器上运行了

imajeason阅读(186)

之前的时候immich在我的e3 1265l的机器上无法运行,缺少avx支持,现在新版已经不需要这个了,可以运行成功自动分类了。

immich
最好的备份图片应用immich

安装也有变化,多了个typesense

官方安装文档:https://immich.app/docs/install/docker-compose

内容如下:

Step 1 – Download the required files

创建一个immich的根目录,用于存放immich相关的文件,已经运行容器的目录

mkdir ./immich-appcd ./immich-app
cd  ./immich-app

下载docker-compose.yml and example.env,

wget https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml

我做了修改,主要是修改postgres的数据目录与typesense的数据目录,方便备份,官方的是通过docker自行创建的,不便于备份恢复。

version: "3"

#
# WARNING: Make sure to use the docker-compose.yml of the current release:
#
# https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
#
# The compose file on main may not be compatible with the latest release.
#


services:
  immich-server:
    container_name: immich_server
    image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
    command: [ "start.sh", "immich" ]
    volumes:
      - ${UPLOAD_LOCATION}:/usr/src/app/upload
      - /etc/localtime:/etc/localtime:ro
    env_file:
      - .env
    ports:
      - 2283:3001
    depends_on:
      - redis
      - database
      - typesense
    restart: always

  immich-microservices:
    container_name: immich_microservices
    image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
    # extends:
    #   file: hwaccel.yml
    #   service: hwaccel
    command: [ "start.sh", "microservices" ]
    volumes:
      - ${UPLOAD_LOCATION}:/usr/src/app/upload
      - /etc/localtime:/etc/localtime:ro
    env_file:
      - .env
    depends_on:
      - redis
      - database
      - typesense
    restart: always

  immich-machine-learning:
    container_name: immich_machine_learning
    image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
    volumes:
      - model-cache:/cache
    env_file:
      - .env
    restart: always

  typesense:
    container_name: immich_typesense
    image: typesense/typesense:0.24.1@sha256:9bcff2b829f12074426ca044b56160ca9d777a0c488303469143dd9f8259d4dd
    environment:
      - TYPESENSE_API_KEY=${TYPESENSE_API_KEY}
      - TYPESENSE_DATA_DIR=/data
      # remove this to get debug messages
      - GLOG_minloglevel=1
    volumes:
      - /srv/dev-disk-by-label-data/databases/immich_typesense/tsdata:/data
    restart: always

  redis:
    container_name: immich_redis
    image: redis:6.2-alpine@sha256:80cc8518800438c684a53ed829c621c94afd1087aaeb59b0d4343ed3e7bcf6c5
    restart: always

  database:
    container_name: immich_postgres
    image: postgres:14-alpine@sha256:50d9be76e9a90da4c781554955e0ffc79d9d5c4226838e64b36aacc97cbc35ad
    env_file:
      - .env
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_USER: ${DB_USERNAME}
      POSTGRES_DB: ${DB_DATABASE_NAME}
    volumes:
      - /srv/dev-disk-by-label-data/databases/immich_postgres/pgdata:/var/lib/postgresql/data
    restart: always

volumes:
  model-cache:

下载env文件,这个文件是immich的配置文件,创建容器的时候会读取这里面的配置:

wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env

修改env文件的TYPESENSE_API_KEY,设置一个api key,长一点的,恢复容器的时候这个key要保持一致。

修改UPLOAD_LOCATION,这个就是指定immich上传的图片的存放路径,如果不修改的话,就会在最开始创建的./immich-app中,因为我们要在这个目录启动容器。

其他的不需要修改

(可选) Get hwaccel.yml 文件是转码配置,用不到的吧。

wget https://github.com/immich-app/immich/releases/latest/download/hwaccel.yml

启动容器即可,启动后访问nas的2283端口即可。

docker-compose up -d     # or `docker compose up -d` based on your docker-compose version

升级容器。

docker-compose pull && docker-compose up -d     # Or `docker compose up -d`

NAS全平台同步神器Rsync

imajeason阅读(711)

nas玩久了,数据就多起来了,还有些数据非常重要

之前跟大家分享过,数据备份的三二一原则,三份相同的数据,我们需要让nas自行的进行完整的备份,至少每天一次。

对于普通文档类数据,备份只是把数据备份出来,不需要考虑文件的属性

但是对于一些应用类数据,比如docker用到的文件,如果备份的文件权限变了,等你需要复制回去进行应用恢复的时候就会发现各种权限带来的问题

所以备份是需要专用工具的,而不是直接的复制粘贴

rsync正是数据同步的神器,而且在大部分的nas系统上,rsync几乎是标配,我们只需要学会使用它

Rsync是一款开源的、快速的、多功能的、可实现全量及增量(全量备份是指全部备份,增量备份是在上一次备份的基础上只备份更新的内容)的本地货远程数据同步备份的优秀工具。Rsync可以在大部分的操作系统上安装运行,包括windows。

rsync可以根据同步文件的大小和修改时间等信息来判断文件是否需要同步,从而实现增量备份,而且能够同步文件的属性信息来确保文件的元信息一致。

rsync有三种模式

1、本地模式比较简单,跟我们的复制粘贴一样,但是不同处在于它可以复制文件的属性、属主等权限类信息,非常牛批

2、shell模式,就是通过ssh命令实现文件的同步,这里的ssh命令特指linux系的操作系统,也就是说通过ssh命令获取对端的shell权限来进行同步

这个模式是linux系统中比较常用的同步模式,因为这种同步不需要对端做任何的修改,只需要开放ssh即可

3、daemon模式,是守护进程的方式传输数据,需要搭建服务

daemon模式是nas上比较常用的模式,但是ssh模式也是可以的

全局域网只需要有一台rsync服务,就可以让所有的rsync客户端实现数据的定时同步,非常方便

OMV中rsync使用

首先是omv,就是点点点就行

创建用户,创建目录,赋予权限

开启服务,设置账户和目录

rsync -av gits/ [email protected]::backup

群晖中rsync使用

首先需要开启ssh

群晖比较简单,打开后台,找到文件服务的rsync,开启22,注意,这里开启的是ssh模式

这样就开启了rsync服务

如果将群晖作为客户端使用需要去套件中间,安装backup

在shell中测试,gits是需要备份的目录,后面是目标路径,这里是群晖

rsync -av gits/ [email protected]::backup

不过还是建议使用daemon模式,群晖开启daemon模式也需要去命令行里操作

# 创建用户
rsync_backup
注意还要让用户对需要同步的目录有读写权限
/volume1/storages/omv_backup/ 

配置文件


uid             = rsync_backup
gid             = 0
use chroot      = no
max connections = 4
pid file        = /var/run/rsyncd.pid
timeout         = 600
auth users = rsync_backup
secrets file = /etc/rsync.password
[backups_synology]
    path = /volume1/storages/omv_backup/
    comment = Backups_omv
    read only = FALSE

创建密码文件/etc/rsync.password,权限600

rsync_backup:123456

然后去控制面板关闭rsync,再开启,实现重启。

unraid中rsync使用

unraid内置了rsync,但是没有提供操作界面,我们可以通过命令行来启动rsync服务

具体的操作也要去命令行里操作

考虑到unraid系统的特殊性,建议将unraid作为服务器使用

创建目录

mkdir -p /boot/custom/etc/
mkdir -p /boot/custom/etc/rc.d

 将rsyncd.conf文件同时放到/boot/custom/etc/etc下,两份一样内容。

rsyncd.conf文件,内容:

uid             = rsync_backup
gid             = rsync_backup
use chroot      = no
max connections = 4
pid file        = /var/run/rsyncd.pid
timeout         = 600
auth users = rsync_backup
secrets file = /etc/rsync.password

[backups_synology]
    path = /mnt/user/backup/synology
    comment = Backups_synology
    read only = FALSE
[backups_omv]
    path = /mnt/user/backup/omv/
    comment = Backups_omv
    read only = FALSE

创建密码文件

useradd rsync_backup -s /sbin/nologin -M
mkdir /mnt/user/backup/omv -p

chown rsync_backup.rsync_backup /mnt/user/backup

echo "rsync_backup:123456">/etc/rsync.password

chmod 600 /etc/rsync.password # 注意权限

将配置持久化(unraid操作)

touch /boot/custom/etc/rc.d/S20-init.rsyncd

内容如下:
S20-init.rsyncd

#!/bin/bash
if ! grep ^rsync /etc/inetd.conf > /dev/null ; then
cat <<-EOF >> /etc/inetd.conf
rsync   stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/bin/rsync --daemon
EOF
read PID < /var/run/inetd.pid
kill -1 ${PID}
fi
cp /boot/custom/etc/rsyncd.conf /etc/rsyncd.conf

这是初始化文件,因为unraid在重启后会丢失配置,需要将配置初始化到flash中。

编辑初始化文件

vi /boot/config/go

将下面的内容放在末尾,后续每次执行初始化,都会初始化rsync服务端的配置

/boot/custom/etc/rc.d/S20-init.rsyncd

如果此时rsync没有运行

ps aux|grep rsync
# 如果没运行
rsync --daemon

大家可以根据自己的nas系统与操作系统组合,选择合适的rsync搭配方案

选择能够方便的进行定时任务的设备作为客户端,客户端可以作为数据源推送数据到服务器,也可以从rsync服务器拉取数据进行同步

也就是说,rsync客户端的选择与源数据在哪台设备上并没有关系

windows中rsync使用

我们首先安装windows版,方便没有linux客户端的朋友进行测试

windows系统安装rsync服务

cwRsync4.2.0下载地址:https://www.jb51.net/softs/39404.html?spm=a2c6h.12873639.article-detail.5.1aa02876MqUwGv

https://www.itefix.net/cwrsync

链接:https://pan.baidu.com/s/1CnY_6DQPLWahb9OqY9Xr4g 
提取码:5r2a 

下载rsync

下载解压后,得到server和client,根据需要安装

windows版rsync server,安装完成后,进入安装的目录,安装路径下默认配置rsyncd.conf

# C:\Program Files (x86)\ICW

use chroot = false
strict modes = false
hosts allow = *   #允许任意IP
lock file = rsyncd.lock 
max connections = 5
port = 28950   #指定端口号
charset=UTF-8  #指定字符集
#pid = 0
uid = 0    #运行rsync守护进程的用户 0为不限制
gid = 0    #运行rsync守护进程的组   0为不限制
log file = rsyncd.log  #日志文件存放位置
 
# Module definitions
# Remember cygwin naming conventions : c:\work becomes /cygwin/c/work
#
#[test]
#path = /cygdrive/c/work
#read only = false
#transfer logging = yes
 
[data]
path = /cygdrive/f/backup
auth users = zhangdaqi       #指定授权用户名
secrets file = etc/rsyncd.secrets  #指定密码存储文件
read only = no         
transfer logging = yes
hosts allow = *

特殊之处在于路径,这里要注意。确保指定的path存在,我这里设置的是F:\backup

/cygdrive/c/work 相当于c:/work 

通过 菜单–cwRsyncServer–02. Prep a Dir for Upload 设置目录权限,需要设置成600,也就是指定的用户可以读写,其他用户和用户组都没有权限。

密码文件rsyncd.secrets的格式是 用户名:密码

rsyncuser:rsyncpass

需将其权限设置为600,即其他组没有读权限。同时要保证用户cwRsyncServer既是该文件拥有者又对其具有读写权限。

此处需要确保账户zhangdaqi存在,如果没有就创建一个

修改完毕后,win+R 跳出输入框,输入services.msc就可以打开服务,去win 的服务中启动cwrsync。

windows客户端

这里最好是把rsync 客户端(注意,不是服务端)的路径加到环境变量中,不然操作的时候需要带着rsync的绝对路径,不是很方便

在windows cmd中执行命令

rsync -vzrtopg --progress --delete [email protected]::test /cygdrive/d/rsyncBackup --password-file=/cygdrive/c/etc/rsyncd.secrets

(–password-file也可以写前边)

rsyncd.secrets密码文件,名字随便起,格式,只写密码

rsyncpass

设置密码访问权限chown.exe可从服务端拷贝过来

同样的,目录权限需要设置成600,也就是指定的用户可以读写,其他用户和用户组都没有权限。

chmod -c 600 /cygdrive/c/etc/rsyncd.secrets
chown administrator /cygdrive/c/etc/rsyncd.secrets

可访问局域网中所有的rsync服务,包括windows、unraid等标准rsync服务。

rsync -vzrtopg --progress --delete /cygdrive/d/rsyncBackup/ 192.168.1.82::test

rsync -vzrtopg --progress --delete /cygdrive/d/rsyncBackup/ [email protected]::test --password-file=/cygdrive/c/etc/rsyncd.secrets

掌握了rsync,定时同步重要数据,可保数据无忧

我是张大七,下期再见。

5分钟搭建AI机器女友

imajeason阅读(747)

这是一个AI女友的项目,可以在本地运行,也可以挂载到telegram机器人,实现一个基于gpt4的AI女友。

首先看效果,telegram聊天

原项目首页

https://github.com/EniasCailliau/GirlfriendGPT/

因为初始设定都是英文人设,我就fork了一下代码,修改成了中文人设

https://github.com/imajeason/GirlfriendGPT

这个项目可以本地直接运行

创建一个python环境

git clone

安装依赖

python main

会提示申请api,我们就去申请api

设置

export STEAMSHIP_API_KEY=xxxxxxxxxxxxxxx

python main

就可以聊天了

现在我们要部署到云上的话,需要申请telegram bot机器人token

打开telegram,搜索bot father

申请,复制token

python deploy

设置项目名称

打开steamship页面

填写token等

现在就可以在telegram中搜索机器人,跟它聊天了

简单聊两句

本项目实际部署在steamship,有一美元的免费额度,超了后就不能聊天了,如果你喜欢这个项目就去交钱吧

另外收到的语音讲英文很ok,但是讲中文实在蹩脚

这个项目中使用了elevenlabs的语音接口生成语音信息,如果你喜欢这个项目就去开会员,然后自己生成喜欢的语音风格,定制你的专属女友声音。

拿到elevenlabs的api在这里修改token和语音id

另外就是ai发送的照片信息

你也可以自己定制喜欢的女友长相

需要修改提示词,在代码的这里修改。

Tailscale高级功能篇(tailscale Funnel)——实现不需要独立ip的公网访问

imajeason阅读(1392)

多朋友没有独立ip,但是又想把nas上的服务映射到公网上使用。

比较简单的方案是通过zerotier,tailscale,wireguard等虚拟内网工具,把需要访问的设备都加到虚拟内网中,通过穿透实现异地访问服务。

其实tailscale本身可以提供类似于群晖的公网访问。

这个工具叫Tailscale Funnel 

基本原理是在tailscale会给你的设备分配一个二级域名,你通过二级域名的访问会被转发到指定的内网服务上,来实现。

这个服务是免费的

下面开始配置

首先要去tailscale管理页面开启它,先登录你的tailscale

https://login.tailscale.com/admin/dns

系统会分配一个默认的二级域名

然后激活magicDNS

然后激活https

打开access controls页面,激活funnel

建议使用完整功能的linux系统操作,方便把局域网中其他设备的服务映射出去,我这里以ubuntu20为例。

首先安装tailscale,打开
https://pkgs.tailscale.com/stable/

找到对应的平台安装tailscale

申请证书

tailscale cert 
#会提示需要输入三级域名,格式是   node_name.tailxxx.ts.net
# 输入正确的节点域名,重新执行
tailscale cert g4560.tail471ed.ts.net

首先确保这台机器上的服务正常启动了,注意一定要localhost也就是127.0.0.1的本机服务,这是funnel的限制,不要问我为什么不能直接把127.0.0.1写成局域网的其他设备ip,tailscale不让!!!那如果想映射局域网的其他设备怎么办,后面讲。

tailscale serve https / http://127.0.0.1:9091
tailscale funnel 443 on
tailscale funnel status
#https://example.pango-lin.ts.net (Funnel on)

可以看到已经激活了

但是如果你现在访问它是访问不了的,因为域名生效是需要时间的,稍等片刻一般来说就能更新出来

不用等很久就可以访问了

如果我们想把局域网中其他的服务访问出去怎么办

要么你在有服务的节点上安装tailscale启用funnel

如果那台机器不方便使用funnel怎么办,比如它是一台群晖

办法总是有的,我们在一台可以安装tailscale的节点上,这台机器可以是虚拟机

通过nginx先把服务给代理一下,本机上就可以通过localhost访问到了

比如,我现在要把我的jellyfin服务映射出去。

http://192.168.188.167:8096

就需要nginx之类的反代工具了,其他的类似的caddy也是可以的,不过我个人是喜欢用nginx的。

首先安装nginx

sudo apt install nginx -y

创建并配置/etc/nginx/conf.d/jellyfin.conf


server {
    listen 8801;
    
    server_name _;
    charset utf-8;


    keepalive_timeout 70;

    location / {
        # proxy_redirect off;
        proxy_pass http://192.168.188.167:8096; # 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;
    }


}

重启nginx使配置生效

systemctl restart nginx

查看服务是否已经启动

netstat -nltp
# 看到8801已经启动了

重新配置funnel 443指向8096

tailscale serve https / http://127.0.0.1:8096
tailscale funnel 443 on
tailscale funnel status
#https://example.pango-lin.ts.net (Funnel on)

刷新你的页面,可以看到页面已经变成了jellyfin,至此就完成了内网服务到公网的映射。

速度取决于你的搭建tailscale的节点到tailscale的服务器的速度,并不快,但是免费的服务

这个funnel功能适合实在没有办法的朋友,可以用于一些文字类的内网服务或者用于临时的内网服务管理。

你可能要问能不能搭建一个中间服务器提速啊

你是不是傻,如果你能自己搭建中间服务器,你有一台独立ip的vps,你还需要这个东西做什么呢,直接搭建ngrok、frp等等,他不香么

Headscale-ui使用

imajeason阅读(1718)

给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的使用说明就这么多了

有问题的跟我留言,

开源版tailscale,headscale搭建

imajeason阅读(4490)

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端耗费的时间长一些,难度不高