2020年11月3日星期二

在 Linux 服务器部署 Halo

更新软件包

创建Halo用户,增加sudo权限,并切换至halo用户

adduser halo
usermod -aG sudo halo
su - halo
/usr/local/app/halo


更新软件包,确保服务器的软件包已经是最新的。

sudo apt-get update && sudo apt-get upgrade && sudo apt-get dist-upgrade

安装 Java 运行环境

若已经存在 Java 11运行环境的可略过这一步。

# 安装 OpenJRE  (Debian 10 中 OpenJDK 11作为默认Java软件包)
sudo apt-get install default-jdk

# 检测是否安装成功
java -version


从 1.4.3 起,版本要求为 11 以上的版本。1.4.3 以下需要 1.8 以上的版本。

下面是JDK完全卸载示例:(需要在root模式下进行操作)

打开命令终端,切换到root模式下

su root

1、移除所有 Java相关包 (Sun, Oracle, OpenJDK, IcedTea plugins, GIJ)

apt-cache search java | awk '{print($1)}' | grep -E -e '^(ia32-)?(sun|oracle)-java' -e '^openjdk-' -e '^icedtea' -e '^(default|gcj)-j(re|dk)' -e '^gcj-(.*)-j(re|dk)' -e 'java-common' | xargs sudo apt-get -y remove
sudo apt-get -y autoremove

进行更新 

sudo apt-get update

2、清除配置信息:

dpkg -l | grep ^rc | awk '{print($2)}' | xargs sudo apt-get -y purge

3、清除java配置及缓存:

bash -c 'ls -d /home/*/.java' | xargs sudo rm -rf

4、清除jvm文件夹里面的文件

 rm -rf /usr/lib/jvm/*

创建 Halo 用户

我们推荐创建一个低权限的用户运行 halo:

# 创建 halo 用户
sudo useradd -m halo
# 直接登录该用户
sudo su halo

安装 Halo

配置文件

请注意:配置文件的路径为 ~/.halo/application.yaml。

# 下载配置文件到 ~/.halo 目录
curl -o ~/.halo/application.yaml --create-dirs https://dl.halo.run/config/application-template.yaml

修改配置文件

完成上一步操作,我们就可以自己配置 Halo 的运行端口,以及数据库相关的配置了。

# 使用 Vim 工具修改配置文件
vim ~/.halo/application.yaml

打开之后我们可以看到

server:
port: 8090

# Response data gzip.
compression:
enabled: false
spring:
datasource:
# H2 database configuration.
driver-class-name: org.h2.Driver
url: jdbc:h2:file:~/.halo/db/halo
username: admin
password: 123456

# MySQL database configuration.
# driver-class-name: com.mysql.cj.jdbc.Driver
# url: jdbc:mysql://127.0.0.1:3306/halodb?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
# username: root
# password: 123456

# H2 database console configuration.
h2:
console:
settings:
web-allow-others: false
path: /h2-console
enabled: false

halo:
# Your admin client path is https://your-domain/{admin-path}
admin-path: admin

# memory or level
cache: memory
  1. 如果需要自定义端口,修改 server 节点下的 port 即可。
  2. 默认使用的是 H2 Database 数据库,这是一种嵌入式的数据库,使用起来非常方便。需要注意的是,默认的用户名和密码为 admin 和 123456,这个是自定义的,最好将其修改,并妥善保存。
  3. 如果需要使用 MySQL 数据库,需要将 H2 Database 的所有相关配置都注释掉,并取消 MySQL 的相关配置。另外,MySQL 的默认数据库名为 halodb,请自行配置 MySQL 并创建数据库,以及修改配置文件中的用户名和密码。
  4. h2 节点为 H2 Database 的控制台配置,默认是关闭的,如需使用请将 h2.console.settings.web-allow-others 和 h2.console.enabled 设置为 true。控制台地址即为 域名/h2-console。注意:非紧急情况,不建议开启该配置。
  5. server.compression.enabled 为 Gzip 功能配置,如有需要请设置为 true,需要注意的是,如果你使用 Nginx 或者 Caddy 进行反向代理的话,默认是有开启 Gzip 的,所以这里可以保持默认。
  6. halo.admin-path 为后台管理的根路径,默认为 admin,如果你害怕别人猜出来默认的 admin(就算猜出来,对方什么都做不了),请自行设置。仅支持一级,且前后不带 /。
  7. halo.cache 为系统缓存形式的配置,可选 memory 和 level,默认为 memory,将数据缓存到内存,使用该方式的话,重启应用会导致缓存清空。如果选择 level,则会将数据缓存到磁盘,重启不会清空缓存。如不知道如何选择,建议默认。

注意

使用 MySQL 之前,必须要先新建一个 halodb 数据库,MySQL 版本需 5.7 以上。

create database halodb character set utf8mb4 collate utf8mb4_bin;

运行 Halo

Halo 的整个应用程序只有一个 Jar 包,且不包含用户的任何配置,它放在任何目录都是可行的。需要注意的是,Halo 的整个额外文件全部存放在 ~/.halo 目录下,包括 application.yaml(用户配置文件),template/themes(主题目录),upload(附件上传目录),halo.db.mv(数据库文件)。一定要保证 ~/.halo 的存在,你博客的所有资料可都存在里面。所以你完全不需要担心安装包的安危,它仅仅是个服务而已。

# 下载最新的 Halo 安装包,{{version}} 为版本号,不带 v,更多下载地址请访问 https://halo.run/archives/download.html
wget https://dl.halo.run/release/halo-{{version}}.jar -O halo-latest.jar

# 启动测试
java -jar halo-latest.jar

如看到以下日志输出,则代表启动成功.

run.halo.app.listener.StartedListener    : Halo started at         http://127.0.0.1:8090
run.halo.app.listener.StartedListener : Halo admin started at http://127.0.0.1:8090/admin
run.halo.app.listener.StartedListener : Halo has started successfully!

提示

以上的启动仅仅为测试 Halo 是否可以正常运行,如果我们关闭 ssh 连接,Halo 也将被关闭。要想一直处于运行状态,请继续看下面的教程。

进阶配置

上面我们已经完成了 Halo 的整个配置和安装过程,接下来我们对其进行更完善的配置,比如:需要开机自启?,更简单的启动方式?

实现以上功能我们只需要新增一个配置文件即可,也就是使用 Systemd 来完成这些工作。

如果当前用户为 halo 用户,则需要退出 halo 用户,进入一个拥有管理员权限的用户下:

# 查看当前登录用户
whoami

# 退出 halo 登录,进入一个有管理员权限的用户
su xxx 或者直接 exit
# 下载 Halo 官方的 halo.service 模板
sudo curl -o /etc/systemd/system/halo.service --create-dirs https://dl.halo.run/config/halo.service

下载完成之后,我们还需要对其进行修改。

# 修改 halo.service
sudo vim /etc/systemd/system/halo.service

打开之后我们可以看到

[Unit]
Description=Halo Service
Documentation=https://halo.run
After=network-online.target
Wants=network-online.target

[Service]
User=halo
Type=simple
ExecStart=/usr/bin/java -server -Xms256m -Xmx256m -jar YOUR_JAR_PATH
ExecStop=/bin/kill -s QUIT $MAINPID
Restart=always
StandOutput=syslog

StandError=inherit

[Install]
WantedBy=multi-user.target

参数:

  • -Xms256m:为 JVM 启动时分配的内存,请按照服务器的内存做适当调整,512 M 内存的服务器推荐设置为 128,1G 内存的服务器推荐设置为 256,默认为 256。
  • -Xmx256m:为 JVM 运行过程中分配的最大内存,配置同上。
  • YOUR_JAR_PATH:Halo 安装包的绝对路径,例如 /www/wwwroot/halo-latest.jar。

提示

  1. 如果你不是按照上面的方法安装的 JDK,请确保 /usr/bin/java 是正确无误的。
  2. systemd 中的所有路径均要写为绝对路径,另外,~ 在 systemd 中也是无法被识别的,所以你不能写成类似 ~/halo-latest.jar 这种路径。
  3. 如何检验是否修改正确:把 ExecStart 中的命令拿出来执行一遍。
# 修改 service 文件之后需要刷新 Systemd
sudo systemctl daemon-reload

# 使 Halo 开机自启
sudo systemctl enable halo

# 启动 Halo
sudo service halo start

# 重启 Halo
sudo service halo restart

# 停止 Halo
sudo service halo stop

# 查看 Halo 的运行状态
sudo service halo status

完成以上操作即可通过 IP:端口 访问了。不过在此之前,最好先完成后续操作,我们还需要让域名也可以访问到 Halo,请继续看 配置域名访问。

更新 Halo


# 备份数据
cp -r ~/.halo ~/.halo.bak

# 备份旧的安装包
mv halo-latest.jar halo-latest.jar.bak

# 下载最新的 Halo 安装包,{{version}} 为版本号,不带 v,更多下载地址请访问 https://halo.run/archives/download.html
wget https://dl.halo.run/release/halo-{{version}}.jar -O halo-latest.jar

# 测试是否能够正常启动
java -jar halo-latest.jar

# 重启应用
service halo restart

2020年10月10日星期六

VirtualHere(usbys) 运行命令及 config.ini配置详解

vhui64客户端:下载页面
运行管理命令:
刷新配置:systemctl daemon-reload
启动服务: sudo systemctl start virtualhere.service
停止服务: sudo systemctl stop virtualhere.service
重启服务: sudo systemctl restart virtualhere.service
开机自启: sudo systemctl enable virtualhere.service
禁用自启: sudo systemctl disable virtualhere.service
服务运行脚本示例:
[Unit]
Description=VirtualHere Server
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/app/VirtualHere/vhusbd -b -i prefer ipv6 -c /usr/local/app/VirtualHere/config.ini

[Install]
WantedBy=multi-user.target

config.ini示例:
It=1722049634
License=0200000a2001,999,MCACDkn0jww6R5WOIjFqU/apAg4Um+mDkU2TBcC7fA1FrA==
AutoAttachToKernel=1  #(是否允许设备在远程用户不使用设备时可供主机使用)
TCPPort=57860
IgnoredDevices=0x7825[/0xA2A4]  #(忽略设备, VendorID 和 DeviceID) 
ServerName=USB Hub JYHZ

关于config.ini配置文件

所有 VirtualHere USB 服务器设置都存储在一个名为config.ini 的文本文件中,通常与 vhusbd 二进制文件位于同一目录中。
当作为守护程序或服务运行时,config.ini文件可能在 Linux 的 /root 或 Windows 的 c:windowssystem32 中。
当服务器最初启动时,或在没有 config.ini 文件的情况下启动时,它将使用合理的默认值,任何非默认值都将写入新的 config.ini。

关于config.ini配置的参数

所述的config.ini文件具有以下参数(它们不区分大小写),所述参数被输入到一个所述的 config.ininame=value 格式,每行一个。

以下是可选的参数:

ServerName 出现在客户端中的服务器名称,例如“Virtual USB Hub”。如果将此值设置为特殊字符串 HOSTNAME’ tabindex=”0” id=”MathJax-Element-1-Frame” >HOSTNAME ,它将采用服务器的主机名值。

License 服务器的许可证代码。注册服务器时,VirtualHere 通过电子邮件发送此值。

DeviceNicknames 这是格式,例如,如果设备插入相同的端口,地址总是相同的。您应该使用 VirtualHere 客户端通过右键单击设备并选择“重命名…”来设置昵称,而不是直接编辑此值,因为在连接客户端之前无法访问该地址。

UseAVAHI 1表示使用Bonjour在网络上广播此服务器的存在,0表示不使用广播消息在网络上宣传此服务器。默认为1开启。关闭此设置对于防火墙后面的客户端很有用,因为防火墙或子网会阻止 IP 广播数据包,他们宁愿直接在客户端中输入 IP 地址。

Hostname 这指定了与客户端通信时服务器的主机名。默认情况下,它是调用主机上的主机名实用程序的结果,但可以通过在此处指定一个值来覆盖。例如。USB服务器。请注意,如果网络上有多个 virtualhere 服务器,它们必须具有唯一的主机名

CompressionLimit 一旦 USB 传输大于此处指定的字节数,它将被压缩以节省网络传输时间。较小的值将使用更多的 CPU 来略微提高网络吞吐量,较大的值将使用较少的 CPU,但网络吞吐量会受到影响。从反复试验来看384似乎是正确的。

IgnoredDevices 这指定了插入服务器时要忽略的设备。此设置的格式 xxxx[/yyyy],xxxx/yyyy,... ,其中XXXX是设备的USB厂商ID和YYYY是设备的USB产品ID(可选)(没有前导零和值均为十六进制)。例如,在 Raspberry PI 上运行的 VirtualHere 会自动填充它,424/ec00因为这是内置于电路板中的基于 Raspberry Pi USB 的内部以太网适配器,不应共享。要找出特定设备的供应商/产品 ID,请将其插入并从 VirtualHere 客户端查看设备属性。您还可以为产品 ID 指定通配符,例如 424/*

IgnoredBuses (仅限 Linux)这指定要忽略的特定 USB 端口。它的格式hostcontroller-hub.port,hostcontroller-hub.port,…例如忽略连接到 Raspberry pi 上的端口 2 的设备,将此值设置为1-1.2

AllowedDevices 除此处列出的设备外,所有设备都将被忽略。它与IgnoredDevices设置相反。格式与IgnoredDevices设置相同,即 xxxx[/yyyy][,xxxx/yyyy,]... (无前导零)。如果此值为空,则将允许所有设备(同时考虑上面的IgnoredBuses和IgnoreDevices设置)您还可以为产品 ID 指定通配符,例如 424/*

AutoAttachToKernel 将此设置1为允许设备在远程用户不使用设备时可供主机使用。默认适用1于 NAS、Android 和 Debian(64/32 位)以及0所有其他平台

ClaimPorts (仅限 Linux)默认情况下这是0(关闭)。当设置为1virtualhere 服务器时,将阻止服务器内核与设备交互。将此值设置为 1 可使服务器与对其选择的配置 1 敏感的 USB 设备更兼容。当这个设置打开时,内核与设备的唯一交互是查询设备描述符,但是目前外部集线器不能在这个设置打开的情况下使用。

PingInterval 默认值为4秒。这是从服务器到客户端的 ping 消息之间的秒数。客户端需要使用PingTimeout响应(见下文),然后才会考虑丢弃套接字并清理连接。有时,如果网络连接不稳定,套接字可能会断开,并且此设置和以下设置有助于针对不稳定连接调整服务器,但是您几乎应该始终将这些设置保留为默认值。

PingTimeou t默认值为9秒。如果服务器在此时间之后没有收到来自客户端的响应 ping,则认为连接已断开并已清除。

ControlTimeout 默认值为3秒。如果设备表现不佳(由于某种原因卡住),则此设置会检测到并在此时间内向客户端返回错误,而不是无限期地等待…

UseAvahiServiceFile (仅限 Linux)如果设置为1,VirtualHere 服务器将向 Linux 操作系统上的内置 avahi-daemon 注册自己。默认是0这意味着 VirtualHere 服务器将使用其内置的小型 avahi 类型服务器 (mdns)

ReverseClients (新,如果您升级到(至少)服务器 2.4.5 和客户端 3.1.1,则可以直接在 GUI 或客户端 API 中进行配置,无需手动编辑服务器配置文件),此设置将使服务器启动到客户端的连接,而不是客户端启动连接的通常方式。这对于防火墙或 NAT 后面的服务器很有用。指定每个客户端的主机 ip 和可选端口,以逗号分隔。例如ReverseClients=192.168.2.129,192.168.2.110。如果未指定端口,则默认为 7573,这是标准的 virtualhere 反向查找端口。在客户端中,确保在右键单击 USB 集线器 -> 指定集线器 -> 防火墙/NAT下选中启用反向连接。服务器将尝试依次连接到每个客户端。

ReverseClientsRetryPeriod 默认为 15 秒。这是服务器尝试反向客户端的连接尝试之间的秒数(它还没有连接到)。

以下是高级参数,因此仅在购买的服务器上支持

TCPPort 这是 VirtualHere 服务器运行的 TCP 端口,如果未指定,则默认为7575. 您可以指定任何未使用的端口号,也可以使用 0 指定随机端口。(客户端仍然可以通过 bonjour 广播自动自动查找服务器)。

ClientIdMap 此设置允许您将客户端 ID重新映射到昵称。甲客户端ID是当在客户机的日志,它是由在客户机OS确定在自动传递和具有格式 <空间>(<用户名>)。例如,如果客户的用户名为“Michael Jones (michael)”,您可以将客户 ID 更改为“Mick”,那么这将出现在其他客户的使用信息中。这种设置格式是ClientIdMap=,[,,…]例如ClientIdMap=Michael Jones (michael),Mick,Steve Jones (steve),Steve. 客户端 ID 必须与客户端的用户名和全名完全匹配。这可以通过右键单击使用中的设备并查看属性中的 USER: 条目来找到。

HideClientInfo 默认值为0(false)。如果设置为1Device In-Use 信息不会显示给其他客户端

NetworkInterface ( Linux Only ) 这指定将服务器绑定到哪个网络接口。如果未指定(默认),则服务器将侦听所有网络接口上的传入客户端连接。否则,如果您有多个网卡并且只想侦听其中一个,请指定将服务器绑定到的 IP 地址。

ClientAuthorization 这指定了要运行以授权特定用户/设备组合的脚本。

ClientDeauthorization 与ClientAuthorization相同,除了在用户与设备断开连接时调用

SSLCert 用于 SSL 传输的 ssl PEM 证书文件(包含未加密的公钥和私钥)的完整路径。如果指定了此参数,则与服务器的所有通信都将通过 SSL 而不是普通 TCP 运行。端口将在下面的 sslPort 设置中指定。有关 SSL 的更多信息,请参见此处

SSLPort 如果指定了sslCert参数,则此端口将用于客户端通信。端口默认为7574

SSLUseClientCerts 将此参数设置1为打开客户端 SSL 证书。如果启用,VirtualHere 客户端必须在连接时向服务器提供 SSL 客户端证书

SSLCAFile 此文件包含使用服务器和客户端 SSL 证书的 PEM 编码证书颁发机构 (CA) 可信根证书。

VirtualHere 服务器还包含一个事件处理系统,可以将其配置为在特定时间调用脚本。这对于解决设备怪癖或执行特定操作(如日志记录)很有用,请参见 此处

{mtitle title=end/}

针对前述的问题,我们需要关注的是 AutoAttachToKernel 这个参数,这个参数决定了USB设备没有在被远程客户端时,能否被服务端主机使用。很显然,根据文档的描述,这项功能在NAS、Android 和 Debian平台默认是开启的,所以很不意外的,在openwrt系统开启VirtualHere后,系统的USB设备就不能再被主机自己使用。
解决方法很简单,那就是编写一个配置文件,将这个功能设置为开启就好了,下面来介绍如何解决。

创建config.ini配置文件

在不同的系统环境中,config.ini可能不会自动创建,我们需要手动来创建一个config.ini文件,在config.ini文件中写入以下参数:

AutoAttachToKernel=1

然后保存文件。前述的各项参数,不必全部写入config.ini配置文件,缺省项目会自动使用系统默认配置,只需写入需要修改的项即可。

附加config.ini启动VirtualHere

将config.ini保存到与VirtualHere程序相同的目录,输入以下命令启动VirtualHere,注意修改文件所在的路径。

/etc/VirtualHere/vhusbdx -b -c /etc/VirtualHere/config.ini

做完这些工作后,问题就解决了,现在USB设备没有被远程使用时,主机自身也可以使用。

VirtualHere常用命令

usage: vhusbdx [-bhliqnu] [-c <configuration file>] [-r <log file>]
options:
-b run as daemon in the background 作为守护程序运行在后台
-c configuration file 加载配置启动
-h display this usage 帮助
-l display license text 许可证信息
-i prefer ipv6 (dual/stack) 使用IPV6网络
-r log to file instead of syslog 输出日志文件

 注册示例:"可把网络设备上的USB设备映射到本地主机。启用后到 http://www.virtualhere.com/usb_client_software 下载对应构架的客户端到本地主机运行。<br />注册:在客户端的USB共享器上右键-设备信息-输入许可码(xxxxxxxxxxxx为设备信息中的s/n):xxxxxxxxxxxx,999,MCACDkn0jww6R5WOIjFqU/apAg4Um+mDkU2TBcC7fA1FrA=="))