分类目录归档:System Maintenance

关于 Docker 中 tty 尺寸不太对的问题

不知道为啥就是不行,不过本来就对 docker 这玩意没啥好感。

$ docker exec -it foo /bin/bash
foo@649fb21d747c:~$ stty size
0 0
foo@649fb21d747c:~$ reset -w
foo@649fb21d747c:~$ stty size
24 80
foo@649fb21d747c:~$ # That was still wrong. Now resize the terminal to get a SIGWINCH.
foo@649fb21d747c:~$ stty size
69 208
foo@649fb21d747c:~$ exit
exit
$ docker exec -it foo /bin/bash # Try it again.
foo@649fb21d747c:~$ stty size
69 208
foo@649fb21d747c:~$ # Doesn't happen anymore for this session.

 

Docker 的生命周期

Docker 这东西的文档过于不好用了,或者说我没看对地方,总之就是我一直都不怎么会用。直到我看到了这张图:

这下子就清楚很多了。我们一般用 docker exec 命令来在里面运行一个 bash,然后再继续进行操作,这个操作需要 container 在 running 状态下才能执行。

总结一下最简单的使用场景,pull 一个 imgae以后,启动一个 container,然后再把它删掉:

docker pull <image_name>
docker run -itd --name <container_name> <image> # Started a docker in background
docker exec -ti <container_name> <command>
docker stop <container_name>
docker rm <container_name>

然后就行了

一个完整的 BT 客户端安装记录

博客里面此类文章版本实在太多,每次我自己装一遍都要参考两三篇文章也实在是蛋疼,于是整理一下。

Compiler and Depencency

首先是一些依赖包的安装:

# gcc-8 Prerequisites (optional)
add-apt-repository ppa:ubuntu-toolchain-r/test
# Compiler
apt install gcc-8 g++-8 # (optional)
apt install build-essential checkinstall pkg-config automake libtool git
# Libtorrent Dependency
apt install libboost-dev libboost-system-dev libboost-python-dev libboost-chrono-dev libboost-random-dev libssl-dev libgeoip-dev
# Deluge Dependency
apt install python-pip python-attr python-chardet python-click python-colorama  python-openssl python-pam python-pyasn1 python-pyasn1-modules python-serial python-service-identity python-twisted-bin python-twisted-core python-zope.interface python-twisted python-openssl python-setuptools intltool geoip-database python-notify python-pygame python-glade2 librsvg2-common xdg-utils python-mako
apt install python-automat python-constantly python-hyperlink python-incremental # Only on Ubuntu 18.04+ (16.04 do not have these packages)
# qBittorrent Dependency
apt-get install qtbase5-dev qttools5-dev-tools libqt5svg5-dev

libtorrent

考虑到双栈 IP 汇报的问题,仍然使用 libtorrent 1.0.11

首先应该打上 std=c++11 的 patch:

diff -uNr libtorrent/bindings/python/compile_flags.in libtorrent-cpp11/bindings/python/compile_flags.in
--- libtorrent/bindings/python/compile_flags.in	2018-04-18 06:49:46.350053702 +0000
+++ libtorrent-cpp11/bindings/python/compile_flags.in	2018-04-18 07:58:13.883000009 +0000
@@ -1 +1 @@
-@COMPILETIME_OPTIONS@ @CPPFLAGS@ @LIBS@ @BOOST_CPPFLAGS@ @BOOST_SYSTEM_LIB@ @BOOST_PYTHON_LIB@ @PTHREAD_LIBS@ @OPENSSL_LIBS@ @OPENSSL_LDFLAGS@ @OPENSSL_INCLUDES@ -I@top_srcdir@/include
+@COMPILETIME_OPTIONS@ @CXXFLAGS@ @CPPFLAGS@ @LIBS@ @BOOST_CPPFLAGS@ @BOOST_SYSTEM_LIB@ @BOOST_PYTHON_LIB@ @PTHREAD_LIBS@ @OPENSSL_LIBS@ @OPENSSL_LDFLAGS@ @OPENSSL_INCLUDES@ -I@top_srcdir@/include
diff -uNr libtorrent/bindings/python/setup.py libtorrent-cpp11/bindings/python/setup.py
--- libtorrent/bindings/python/setup.py	2018-04-18 06:49:46.350053702 +0000
+++ libtorrent-cpp11/bindings/python/setup.py	2018-04-18 07:59:26.123112215 +0000
@@ -104,7 +104,7 @@
 		library_dirs = parse_cmd(extra_cmd, '-L'),
 		extra_link_args = ldflags.split() + arch(),
 		extra_compile_args = parse_cmd(extra_cmd, '-D', True) + arch() \
-			+ target_specific(),
+			+ target_specific() + ['-std=c++11'],
 		libraries = ['torrent-rasterbar'] + parse_cmd(extra_cmd, '-l'))]
 
 setup(name = 'python-libtorrent',

然后是编译:

git clone https://github.com/arvidn/libtorrent.git libtorrent-1.0.11
git checkout RC_1_0
./autotool.sh
./configure --enable-python-binding --with-libiconv --disable-debug --enable-encryption --with-libgeoip=system CXXFLAGS=-std=c++11
# if compile on armhf (SoYouStart ARM)
# ./configure --enable-python-binding --with-libiconv --disable-debug --enable-encryption --with-libgeoip=system CXXFLAGS=-std=c++11 --with-boost-libdir=/usr/lib/arm-linux-gnueabihf
make -j$(nproc)
checkinstall
ldconfig

Deluge

wget http://download.deluge-torrent.org/source/deluge-1.3.15.tar.gz
tar xzvf deluge*.tar.gz
python setup.py build
python setup.py install --install-layout=deb

注意这个最好别用 checkinstall 安装,可能会导致一些不可预知的错误。

qBittorrent

git clone https://github.com/qbittorrent/qBittorrent.git
# git clone https://github.com/c0re100/qBittorrent-Enhanced-Edition.git
git checkout <branch> # e.g. v4_1_x; v3_3_x
./configure
# ./configure --with-boost-libdir=/usr/lib/arm-linux-gnueabihf
make -j$(nproc)
checkinstall

systemd Example

deluged.service

$ cat /etc/systemd/system/deluged.service 
[Unit]
Description=Deluged
After=network-online.target

[Service]
ExecStart=/usr/bin/sudo -u <username> /usr/bin/deluged -d
ExecStop=/bin/kill -9 $(cat /run/deluged.pid)
Restart=always
PIDFile=/run/deluged.pid
TimeoutStopSec=300
RestartSec=3

[Install]
WantedBy=multi-user.target

deluge-web.service

$ cat /etc/systemd/system/deluge-web.service 
[Unit]
Description=Deluge-web
After=network-online.target deluged.service
Wants=deluged.service

[Service]
ExecStart=/usr/bin/sudo -u <username> /usr/bin/deluge-web
ExecStop=/bin/kill -9 $(cat /run/deluge-web.pid)
Restart=always
PIDFile=/run/deluge-web.pid
RestartSec=3

[Install]
WantedBy=multi-user.target

References

https://github.com/qbittorrent/qBittorrent/wiki/Compiling-qBittorrent-on-Debian-and-Ubuntu
https://dev.deluge-torrent.org/wiki/Installing/Source
https://github.com/amefs/QB/blob/master/setup/sources/libtorrent-rasterbar-RC_1_0.patch

关于 VMware 在 Linux Kernel 4.13+ 上无法正常启动的问题

在 Ubuntu 18.04 上使用 VMware 时,遇到了一个很奇怪的问题,在正常安装好了以后,运行 VMware 却报错:

/usr/lib/vmware/bin/vmware-modconfig: Relink `/lib/x86_64-linux-gnu/libbsd.so.0′ with `/lib/x86_64-linux-gnu/librt.so.1′ for IFUNC symbol `clock_gettime’

经查询以后,发现是大概是 VMware 自己代码写太差造成的问题,这个问题在 12.5+ 的版本都存在,需要对内核模块进行 patch 以后才能正常工作。

经过 patch 的内核模块在这里:https://github.com/mkubecek/vmware-host-modules

在这个 repo 中,不同的 branch 对应了不同版本的 VMware 的内核模块代码,切换到自己需要的版本以后,这样应用:

git clone https://github.com/mkubecek/vmware-host-modules.git
git checkout <branch>
make
make install
modprobe -r vmmon
insmod /lib/modules/$(uname -r)/misc/vmmon.ko
insmod /lib/modules/$(uname -r)/misc/vmnet.ko 
rm /usr/lib/vmware/lib/libz.so.1/libz.so.1
ln -s /lib/x86_64-linux-gnu/libz.so.1 /usr/lib/vmware/lib/libz.so.1/libz.so.1  # see https://communities.vmware.com/thread/572259
vmware-networks --start  # see https://forum.chakralinux.org/viewtopic.php?id=8579

之后正常运行 VMware 就可以了。

参考资料:

https://askubuntu.com/questions/966585/ubuntu-17-10-upgrade-broke-vmware-workstation-12-5
https://github.com/mkubecek/vmware-host-modules

关于 Linux Kernel 4.15 + gcc 7.3 编译内核模块时无法找到 stdarg.h 的问题

这是一个非常奇怪的错误,出现在 Ubuntu 18.04 上,默认安装的内核版本是 4.15,gcc 是 7.3,在编译内核模块时报错:

In file included from ./include/linux/list.h:9:0,
                 from ./include/linux/module.h:9,
                 from /root/Software/newbbr/tcp_tsunami.c:59:
./include/linux/kernel.h:6:10: fatal error: stdarg.h: No such file or directory
 #include <stdarg.h>
          ^~~~~~~~~~
compilation terminated.

gcc 认为找不到 stdarg.h。看这个错误的位置,个人认为应该不是我配置的问题或者是我代码的问题,搜索了一下,也有很多在 4.15 内核上出现的同样错误。目前没有什么很好的解决方案,暂时性的方案是在编译的 Makefile 里面加一行:

ccflags-y=-I/usr/lib/gcc/x86_64-linux-gnu/7/include

如果是 gcc 8,就相应把版本改成 8 就可以了

将 Linux 上的 VSCode 改为 Consolas 字体

Linux 上的 VSCode 写起代码来总让人觉得莫名烦躁,而 Windows 上面的 VSC 就赏心悦目很多,想了很久之后终于发现是默认字体的问题。Windows 上面的 VSC 默认是 Consolas 字体,在 Ubuntu 上面大概是 Droid Sans 家族的某种版本,实在是不好看,所以换掉。

首先要在 Ubuntu 上安装 Consolas:

wget https://down.gloriousdays.pw/Fonts/Consolas.zip
unzip Consolas.zip
sudo mkdir -p /usr/share/fonts/consolas
sudo cp consola*.ttf /usr/share/fonts/consolas/
sudo chmod 644 /usr/share/fonts/consolas/consola*.ttf
cd /usr/share/fonts/consolas
sudo mkfontscale && sudo mkfontdir && sudo fc-cache -fv

这样就装好了。用 fc-list 可以看所有安装的字体。

之后在 VSC 的 preference 中修改对应的项:

"editor.fontFamily": "'Consolas', 'Droid Sans Mono', 'monospace', monospace, 'Droid Sans Fallback'"

这样就可以了

无 root 权限的服务器使用的一些记录

在没有 root 权限的服务器上安装 pip

假设有这么一台服务器,你没有 root 权限,然后预配置的 tensorflow 环境很神奇地调用不了 GPU,只有 pip2 没有 pip3,python2 python3 都试过了都没法用 GPU,pip list 也显示安装了 tensorflow-gpu,且给你用户的人信誓旦旦地告诉你我这配置没问题,但是你就是用不了 GPU,那么怎么办呢?

解决方法还是比较简单的,首先在用户态安装一个 pip(本文要装 pip3)

wget https://bootstrap.pypa.io/get-pip.py && python3 get-pip.py --user

这时候 pip3 会被安装到 ~/.local/bin 下面,如果你的 PATH 里面有这个路径的话,直接 pip3 就可以运行。

然后就很简单了,该干嘛干嘛,比如安装 virtualenv 等等,只不过这时候你安装任何 python 包的时候,要加上 –user 参数,才能安装到 $HOME 下面,例如 pip3 install virtualenv –user。

我之前提到的那台服务器呢,在装了 pip3 以后,list 一下发现根本就没有 tensorflow-gpu,只有 tensorflow;pip2 里面有,但是调用不了显卡,搞不懂 IT 究竟是怎么配置的。最后我也懒得烦了,直接 virtualenv,装一个 tensorflow-gpu,问题就解决了。

安装一个简单的 deb 包(没有 dependency 问题那种)

apt download <package>
dpkg-deb -x package_x.y.z_x86_64.deb my-private-root
#dpkg-deb -e package_x.y.z_x86_64.deb my-private-control

然后就装在了你自己的 $HOME 下面。

如果你装的是 screen,且你对 /var/run/screen/ 也没权限的话,这么干:

mkdir ~/.screen && chmod 700 ~/.screen
export SCREENDIR=$HOME/.screen

然后把对应的内容添加到 .bashrc 里面去让你每次都可用,比如说:

PATH=~/usr/bin:$PATH
export SCREENDIR=$HOME/.screen

 

Ubuntu 18.04 LTS 盒子环境的部署

本文测试环境为 Hetzner E3-1245V2 独服,系统为官方的 Ubuntu 18.04 Minimal 模板。本文需要综合上一篇盒子配置文章阅读。

写在前面

经过长期的测试,考虑到双栈 IP 的需求,Deluge / qBittorrent 需要 libtorrent 1.0.11 版本才能正常汇报双栈 IP,所以本文很多操作都为了这个目标而设。

Deluge 1.3.15 官方 PPA 仍然没有更新 18.04 对应的二进制包,所幸 Ubuntu 官方源里面就是 1.3.15,理论上可以使用。但是考虑到使用 apt 安装会导致安装官方源中自带的 libtorrent 1.1.5 的依赖,因此选择完全编译安装 libtorrent 与 Deluge。

Wine 官方源也没有增加 Ubuntu 18.04 的支持,Ubuntu 官方源中有对应的 wine64 软件包,因此选择安装该包而非 Wine 官方的版本。

E3-1245V2 有自带 Intel 集显,考虑到 X11VNC 配合 Xorg 使用可以支持完整的键盘操作(VNCserver 存在无法输入 tab、WinKey 的问题,还有 24bit 显示导致 VMware 颜色错乱的问题),本文中选择安装 X11VNC。考虑到通用性,仍应参考上一篇文章使用 VNCserver。

环境的部署

本文所有编译环境采用最新的 gcc-8.1 完成,注意 Boost 需要最高 1.65.1 版本,这个和目前 Ubuntu 源中的版本一致。

# gcc-8 Prerequisites
add-apt-repository ppa:ubuntu-toolchain-r/test
# Compiler
apt install gcc-8 g++-8 build-essential checkinstall pkg-config automake libtool git
# Libtorrent Dependency
apt install libboost-dev libboost-system-dev libboost-python-dev libboost-chrono-dev libboost-random-dev libssl-dev libgeoip-dev
# Deluge Dependency
apt install python-pip python-attr python-automat python-chardet python-click python-colorama python-constantly python-hyperlink python-incremental python-openssl python-pam python-pyasn1 python-pyasn1-modules python-serial python-service-identity python-twisted-bin python-twisted-core python-zope.interface python-twisted python-openssl python-setuptools intltool geoip-database python-notify python-pygame python-glade2 librsvg2-common xdg-utils python-mako
# qBittorrent Dependency
apt-get install qtbase5-dev qttools5-dev-tools libqt5svg5-dev

libtorrent 1.0.11 的编译

综合参考 Deluge 的文档与 qBittorrent 的文档。

git clone https://github.com/arvidn/libtorrent.git libtorrent-1.0.11
git checkout $(git tag | grep libtorrent-1_0_ | sort -t _ -n -k 3 | tail -n 1)
./autotool.sh
./configure --enable-python-binding --with-libiconv --disable-debug --enable-encryption --with-libgeoip=system CXXFLAGS=-std=c++11
make -j$(nproc)
checkinstall
ldconfig

注意 libtorrent 1_0_x 的代码需要修改才能正常地引用 Boost,毛球说 RC_1_0 分支不存在本问题,未作测试。

//修改include/libtorrent/export.hpp
//那两个hpp文件在boost/config/detail/下,而不是boost/config/下

#if !defined(BOOST_COMPILER_CONFIG) && !defined(BOOST_NO_COMPILER_CONFIG)
#  include <boost/config/detail/select_compiler_config.hpp>
#endif
#ifdef BOOST_COMPILER_CONFIG
#  include BOOST_COMPILER_CONFIG
#endif

#if !defined(BOOST_PLATFORM_CONFIG) && !defined(BOOST_NO_PLATFORM_CONFIG)
#  include <boost/config/detail/select_platform_config.hpp>
#endif
#ifdef BOOST_PLATFORM_CONFIG
#  include BOOST_PLATFORM_CONFIG
#endif

Deluge 安装

wget http://download.deluge-torrent.org/source/deluge-1.3.15.tar.gz
tar xzvf deluge*.tar.gz
python setup.py build
python setup.py install

注意这种方式安装的 Deluge 默认在 /usr/local/bin 下,而不是像 deb 安装一样在 /usr/bin。如果需要安装在 /usr/bin 下,安装时添加参数 –install-layout=deb。

其他软件的部署

add-apt-repository ppa:transmissionbt/ppa
curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
dpkg --add-architecture i386 
apt install --install-recommends xorg x11vnc transmission-daemon sshfs nodejs firefox fonts-noto xfce4 wine-stable
apt install gtk3-engines-xfce xfce4-goodies xfce4-power-manager

Xorg 配置文件

位置在 /usr/share/X11/xorg.conf.d/20-intel.conf

Section "Device"
   Identifier  "Intel Graphics"
   Driver      "intel"
   Option      "AccelMethod"  "sna"
   Option      "TearFree"     "true"
EndSection

Section "Monitor"
    Identifier      "External VGA"
    Modeline        "1600x900_60.00"  118.25  1600 1696 1856 2112  900 903 908 934 -Hsync +Vsync
    Option          "PreferredMode" "1600x900_60.00"
EndSection

Section "Screen"
    Identifier    "Screen0"
    Device        "Device0"
    Monitor       "Monitor0"
    DefaultDepth  24
    SubSection "Display"
        Depth 24
        Modes "1600x900"
        Virtual 1600 900
    EndSubSection
EndSection

X11VNC 与 Xorg 的 systemd 启动脚本

# xserver.service
[Unit]
Description=Xserver
After=network-online.target

[Service]
ExecStart=/usr/bin/sudo /usr/bin/startx -- :0
Restart=always
Type=simple
RestartSec=3

[Install]
WantedBy=multi-user.target
# x11vnc.service
[Unit]
Description=X11vnc
After=network-online.target xserver.service
Wants=xserver.service

[Service]
ExecStart=/usr/bin/sudo /usr/bin/x11vnc -rfbport 25901 -rfbauth /root/.vnc/passwd  -display :0 -forever -nevershared -bg -repeat -nowf -o /root/.vnc/x11vnc.log
Restart=always
Type=forking
RestartSec=3

[Install]
WantedBy=multi-user.target

x11vnc 需要首先创建 ~/.vnc/passwd 文件,这个 VNCserver 运行的时候也会自动创建,我懒得重新建立就没研究这个,改日有空再写吧。

Xorg 默认启动的文件为 ~/.xinitrc

#!/bin/sh

# /etc/X11/xinit/xinitrc
#
# global xinitrc file, used by all X sessions started by xinit (startx)

# invoke global X session script
. /etc/X11/Xsession
exec startxfce4

参考资料

https://wiki.archlinux.org/index.php/Xinit_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)

https://wiki.archlinux.org/index.php/X11vnc_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)

https://blog.csdn.net/songbaiyao/article/details/72858087

https://wiki.archlinux.org/index.php/Xorg_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)

https://wiki.archlinux.org/index.php/Intel_graphics_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)

https://serverfault.com/questions/174003/how-can-opengl-graphics-be-displayed-remotely-using-vnc

https://askubuntu.com/questions/537787/enable-3d-hw-acceleration-on-vmware-workstation-10-on-ubuntu-14-04

https://github.com/qbittorrent/qBittorrent/wiki/Compiling-qBittorrent-on-Debian-and-Ubuntu

https://dev.deluge-torrent.org/wiki/Installing/Source

关于 qBittorrent 编译的一些问题

您可能是开源软件的受害者!

您可能是开源软件的受害者!

您可能是开源软件的受害者!

重要的事情说三遍。

实际上这次也没做什么理论上很麻烦的事情,就是 clone 一个 qBittorrent 4.0.4.3 的源码,配合 libtorrent 1.0.11 编译一下,理论上不应该有什么问题的对吧。然而就是出问题了……

编译的过程很顺利,安装 Deluge PPA 的 libtorrent-rasterbar-dev 和一些 boost 库之后开始编译,然后到了 linking 的过程就报错了:src/base/bittorrent/private/filterparserthread.cpp:99: reference to `boost::asio::ip::address_v4::address_v4(std::array<unsigned char, 4u> const&)'

按照 GitHub Issue #6721,这个问题可能是因为 std::arrayboost::array 这两个名称的选择在 libtorrent 和 qbittorrent 里面不同,在没有使用 stdc++11 编译的时候,使用的是 boost::array,反之使用 std::array,考虑到 qbittorrent 默认需要 C++ 11,所以 libtorrent 应该使用同样的 CXXFLAGS 编译才能在 linking 的时候不报错。因此既然出现了现在这个问题,就证明 Deluge PPA 的 libtorrent 是没有使用 C++11 编译的。

之前在编译 qb 3.3.16 的时候并没有出现这个错误,可能是 qb3 不要求 C++11 的原因。

那么如果要解决这个问题,就必须从源码开始编译 libtorrent。考虑到 lt1.1.x 至今无法解决 U2 的双栈 IP 汇报问题,因此只能采用 lt1.0。

git clone https://github.com/arvidn/libtorrent.git
cd libtorrent
git checkout $(git tag | grep libtorrent-1_0_ | sort -t _ -n -k 3 | tail -n 1)
./autotool.sh
./configure --disable-debug --enable-encryption --with-libgeoip=system CXXFLAGS=-std=c++11

在编译完成之后,checkinstall 安装,然后再去编译 qb 就应该可以了。

关于 Boost 版本

Boost 版本的选择也有一些讲究,Ubuntu Package 默认的是 1.58 版本的 boost,qb 经过测试,最高只能使用 1.65.1 版本的 boost,如果想要使用新一些的版本,只能自己编译。

我在编译 1.65.1 的时候,遇到了一个以前从来没有的问题,找不要 pyconfig.h,这个文件本应该存在于 /usr/include/python 或者 python2.7 或者 python3.5 的目录下(取决于默认 Python 版本),但是我那个 Python 2 就是没有这个文件,因此将 Python 默认改为 3.5(sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.5 10)才让 boost 的编译器找到对应的 Python 头文件。如果出现这样的问题需要注意。

使用 echo -e '#include <boost/version.hpp>\nBOOST_VERSION' | gcc -x c++ -E - 这个命令可以查看当前 include 的 boost 版本。

Python 版本切换的注意点

如果安装了 Deluge,然后再切换到 Python3,可能会让 Python 找不到 Deluge 的包,然后无法运行,解决方法是修改 /usr/bin/deluged 和 /usr/bin/deluge-web 的第一行,用 python2.7 运行。或者也可以编译完 boost 以后再把默认 python 改回来。

 

Syncthing 配合 Nextcloud 搭建私有云

写在前面

首先感谢 youlun 大佬介绍了 Syncthing 这个好用的文件同步工具,一次性解决了 Nextcloud 同步残废的问题。

有人可能会问,Nextcloud 不就已经可以搭建私有云平台了吗,为什么还要借助 Syncthing 这样一个同步工具呢?如果文件量不大的话,可能这并不是什么大问题,但是由于 Nextcloud 即使是使用它的客户端,也只能通过网页方式上传,在遇到较大的文件的时候,就会遇到各种各样的限制,比如上传超时或者是文件过大不能上传等等。但是 Syncthing 就不存在这样的问题,可以顺畅地进行文件同步。那么,有没有办法让二者配合工作,即 Syncthing 负责文件同步,Nextcloud 负责网页端的界面和移动端访问的功能呢?答案是有的,而且非常可行,考虑到没有现成的教程,因此在这里记录一下。

LNMP 环境部署

WebServer 环境依然使用了 LinuxEye 的 LNMP 一键包,需要注意的问题是 PHP 选择 7.1 版本(Nextcloud 13.0.1 的依赖),以及需要通过 addon.sh 安装 fileinfo 这个 PHP 模块。

Nextcloud 安装

在部署完成环境之后,添加一个 nginx vhost,现在最新版的一键包中已经加入了 Nextcloud 的 Rewrite Rule,这个给我们的安装带来了极大的方便,再也不用去折腾那些重写规则了。

然后需要调整一下 Zend OPcache 的设置,不然在下载源码之后无法进入配置。具体步骤为在 /usr/local/php/etc/php.d/ 文件夹中找到 opcache 的 .ini 配置文件,将里面的数值按照如下的错误信息调整:

之后在官网下载 tar.bz2 的安装包,解压之后拷贝进 wwwroot,注意这里需要将所有的文件权限改为 www:www,默认一般是登录的用户,会造成无法访问,之后在 MariaDB 中创建一个数据库,在初始化的时候填进 Nextcloud 中,这一步还是比较方便的。

然后更改一下 Nextcloud 的配置,消除缓存的警告。在 <site root>/config/config.php 中添加如下字段即可:

'memcache.local' => '\OC\Memcache\Redis',
'memcache.locking' => '\OC\Memcache\Redis',
'redis' => array(
   'host' => 'localhost',
   'port' => 6379,
),

至此 Nextcloud 应该就可以正常使用了。

Syncthing 的配置

首先需要安装 Syncthing,官方文档中给出了 Ubuntu .deb 的链接,按照它配置即可。

这时候就会遇到一个问题,Syncthing 需要以 www 用户启动才能在和 Nextcloud 一同工作时避免一些权限的问题,但是 www 用户默认是 nologin 配置的,如何登陆进这个用户完成一些初始的设置是一个比较麻烦的问题。由于 www 用户无法登录,所以不能使用一般的 su <user> 来进行用户切换,以该用户的权限启动一个 bash 又不能完成完整的用户环境切换操作。在搜索之后,以一种比较 Tricky 的方法登录了进去:

su -s /bin/bash www

这条命令的意思是 override www 默认的 shell,再登录,然后就会发现你已经切换到 www 用户下了。运行 syncthing,该做什么做什么。

Nginx 反代

Syncthing 默认监听 localhost:8384 端口,那么在远端 VPS 上,如何进行配置呢?有两个方案,一个是修改监听端口,让程序监听 0.0.0.0:8384,另外一个是通过 nginx 配置一个反代。显然,第二个方案无论是在安全性,还是便利性(不用在域名后面输入端口号)上都优于第一个,所以我们就采用第二个方案。

Nginx 配置文件的关键部分如下:

server {
  listen 80;
  listen 443 ssl http2;

  if ($ssl_protocol = "") { return 301 https://$host$request_uri; }

  location / {
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header Host localhost;
          proxy_set_header X-NginX-Proxy true;
          proxy_pass http://localhost:8384;
  }
}

需要注意的一点就是 proxy header 中的 Host 字段必须改为 localhost,否则 Syncthing 发现你的访问地址不是它的监听地址,就会拒绝访问,返回“Host check error“。

之后就是正常的 Syncthing 使用,这个不难,看官方文档就可以了。

Syncthing 和 Nextcloud 配合工作

一开始我以为,把 Syncthing 的同步文件夹设置为我的 Nextcloud 的数据目录就可以完成同步,实际上 Nextcloud 的文件列表并不是实时的,需要运行 OCC 重新进行扫描,但是这样的扫描并不能保证数据完全无损,而且在使用时也不可能频繁 SSH 上去进行重扫,因此必须采取其他的方法。

关于这个问题,官方给出的答案是 External Storage,在 Nextcloud 中启用 External Storage 这个组件以后,在设置中挂载外部的文件夹,这个可以是本地,也可以是 SFTP/FTP/Amazon S3/WebDAV 等等,在这个情况下,我们选择本地,然后添加对应的文件夹就可以在 Nextcloud 文件列表中看到我们的文件了,无论是网页版还是手机都可以。

Syncthing 自动启动

在 Ubuntu 上,我们通过 systemd 服务来完成:

[Unit]
Description=syncthing
After=network-online.target

[Service]
ExecStart=/usr/bin/syncthing -no-browser -home="/home/www/.config/syncthing"
ExecStop=/bin/kill -9 $(/bin/cat /run/syncthing.pid)
Restart=always
PIDFile=/run/syncthing.pid
TimeoutStopSec=300
User=www

[Install]
WantedBy=multi-user.target

在 Windows 上,我们可以通过这样一个 .bat 完成启动:

start "Syncthing" syncthing.exe -no-console -no-browser

参考资料

https://docs.syncthing.net/
https://docs.nextcloud.com/server/13/admin_manual/
https://serverfault.com/questions/333321/executing-a-command-as-a-nologin-user
https://www.jianshu.com/p/4235cc85c32d