惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
Stack Overflow Blog
Stack Overflow Blog
Hugging Face - Blog
Hugging Face - Blog
博客园_首页
T
The Blog of Author Tim Ferriss
博客园 - 叶小钗
N
Netflix TechBlog - Medium
腾讯CDC
C
Check Point Blog
P
Proofpoint News Feed
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI
S
SegmentFault 最新的问题
F
Fortinet All Blogs
美团技术团队
U
Unit 42
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 司徒正美
F
Full Disclosure
Recorded Future
Recorded Future
D
DataBreaches.Net
博客园 - 【当耐特】
Martin Fowler
Martin Fowler
J
Java Code Geeks
I
InfoQ
Y
Y Combinator Blog
A
About on SuperTechFans
AI
AI
爱范儿
爱范儿
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Forbes - Security
Forbes - Security
W
WeLiveSecurity
M
MIT News - Artificial intelligence
雷峰网
雷峰网
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Simon Willison's Weblog
Simon Willison's Weblog
Schneier on Security
Schneier on Security
The GitHub Blog
The GitHub Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
aimingoo的专栏
aimingoo的专栏
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
G
GRAHAM CLULEY
Know Your Adversary
Know Your Adversary
Latest news
Latest news
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
D
Docker
Recent Commits to openclaw:main
Recent Commits to openclaw:main
量子位
V2EX - 技术
V2EX - 技术
Project Zero
Project Zero

七米蓝

让OneDrive实现WebDAV服务 自建阿里云盘WebDAV功能并搬运资源 使用微软验证器同步Edge浏览器密码 在新版Edge浏览器启用B站HEVC、HDR、8K 记录几款软件的批处理快捷命令 提取UWP版office安装包 Link Start! 视频剪辑及辅助工具 浏览器脚本收藏 Edge使用文档
将手机内网穿透当作服务器并运行了几个项目
2020-09-24 · via 七米蓝
几个月没发新文章了,主要是因为我将大量精力投入了《Edge使用文档》的维护之中,修改了大概几百次了吧。与此同时我也玩了很多新的项目,积累了很多新的东西,现在可以发出来了。

一、背景介绍

这篇文章记录了我折腾这些项目的过程及经验,主要是为了方便自己阅读,属于实际应用层面,需要对Linux和termux有基础了解。所以对大佬来说过于基础,对于小白来说又可能看不懂。
我并非一口气就能折腾这么多东西的,而是发现一个东西捣鼓一段时间后,又发现新的东西,而新的又与旧的有联系,新旧滚雪球似的联系到了一起。
现在来记一笔流水账:

  • 最初的起源是捣鼓租的云服务器搭博客网站;
  • 然后发现了在手机上利用ksweb和SakuraFrp进行内网穿透搭网站的教程;
  • 接着发现了白嫖office365 E5全局管理员账号及利用github actions自动执行python续期脚本的教程;
  • 又接着尝试了一些自建网盘程序,比如Oneindex、OneManager、PyOne、cloudreve、可道云……等等;
  • 然后又发现了在安卓手机上利用termux安装Linux及搭建网站的教程;

…………

所以本文的内容庞杂无比,没有接触过相关项目可能一头雾水。
由于ksweb经常被杀后台,即使赋予全部权限、忽略电池优化、加入手机管家白名单、允许自启,仍然动不动就挂了,甚至在亮屏状态都能被杀掉,而termux在后台运行稳定,我忍无可忍,尽可能的把这些东西往termux上搬,目前已经实现了以下项目:

  • 1、Centos子系统,用来启动每个网站的内网穿透客户端及cloudreve客户端;
  • 2、具有webui的计划任务机制及进程崩溃后自动重启的进程守护机制;
  • 3、WordPress博客网站,不过变成了导航站,挂了手机上搭的一些小工具网站,这些小网站放在WordPress安装目录因此通过同一个域名就可以进入;
  • 4、可道云网盘,专门用来读取termux安装目录下的文件,可视化修改配置很方便;
  • 5、cloudreve网盘程序,用来挂载onedrive,稍微鸡肋了点,只能读取经过它上传到onedrive的文件,即在它的数据库中有记录的文件,也看中它的webdav功能,目前用来同步纯纯写作的文章,数据在本地和onedrive都有备份,不太容易丢失;
  • 6、定时执行用来玄学续期office365 E5的python脚本;
  • 7、OneDrive文件目录程序GoneList,加载速度很流畅,然而部署的时候困难重重;
  • 8、用于office E5玄学续期的Telegram机器人E5subBot,每五分钟执行一次;
  • 9、将ssh映射到公网方便用其他设备远程管理;
  • 10、网盘目录程序zfile,java环境部署非常顺利;
  • 11、sharelist多网盘挂载程序,挂载本地E5脚本日志方便随时观察运行状态,nodejs环境的部署也很顺利;
  • 12、nginx webui,有图形界面的nginx配置工具,当然对我来说最大的作用就是自动续签域名证书。(深刻的体现杀鸡用牛刀)
  • 13、Rclone同步网盘,虽然没法挂载到本地,但可以上传文件。
  • 14、aria2离线下载功能,对接到cloudreve的离线下载功能。

实现的项目

手机是老掉牙的华为畅享6,买了近4年了,屏幕高频率闪烁大概离坏掉不远了。我对于手机刷机是没什么经验的,到目前为止只是解了BL锁,在淘宝问了一圈能不能root都说搞不了╮( ̄▽ ̄")╭ ,而手机不能root意味着1024及以下端口全都用不了,不然我还能搞更多的东西出来。其实我也尝试过装宝塔面板来着,都装上了而且内网穿透之后能远程访问了,而nginx启动不了各种报错。

二、前提条件

这是我目前的情况:

  • 一个高速的代理工具,如果没有代理工具而且系统不换源,那么在线安装Linux软件寸步难行,安装国外来源的软件必须得开启代理,当然可以配置PAC模式自动代理;
  • SakuraFrp上注册并实名认证,创建相应的网站隧道。这是目前最实惠的内网穿透服务平台,在用户信息菜单中获取自己的访问秘钥,任何情况下都不能泄露访问秘钥,通过签到获得服务器流量,没有备案的域名只能使用国外节点服务器,速度难顶;
  • 一个域名,并非必须备案,但备案后可以很方便的使用各种云服务,将域名解析到SakuraFrp中创建的隧道域名或ip上;
  • mix文件管理器,获取文件路径、编辑配置文件很方便,在文件属性中点击文件路径一键复制文件路径,用代码编辑器编辑文件方便缩进,还可以挂载onedrive、webdav等,很多特性足以写一篇很长的说明文章;
  • termux下载地址:F-Droid。以及了解termux的基本操作:Termux 高级终端安装使用配置教程

三、termux文件体系

如果在termux里面安装了linux子系统,那么termux文件体系包含三个方面:termux本身文件体系手机储存文件体系linux子系统文件体系
termux本身文件体系也就是termux安装目录。按照数学集合关系解释的话,termux本身文件体系手机储存文件体系互相独立,linux子系统文件体系termux本身文件体系的子集。
termux可以很顺利的读取这三个文件系统,但在手机储存文件体系中执行任务受限,如解压。
linux子系统无法或者不方便读取termux本身文件体系中除自己的的文件、手机储存文件体系。就像虚拟机中的系统读取真机的文件,很麻烦。
所以在termux中直接安装软件的配置文件放在手机储存中方便处理一些,而在linux子系统中安装软件的配置文件最好就放在linux子系统home目录中。
以Centos为例,启动termux后新建centos文件夹并在这个文件夹中安装centos,那么在可道云中,从termux读取到Centos子系统root目录的路径就是:

/home/centos/centos-fs/root

即启动termux后所在的路径为termux的home文件夹,在termux中启动Centos后的路径就是Centos的root文件夹。

赋予termux读取手机储存权限:手动在手机应用管理界面开启,或执行以下命令后允许提示:

termux-setup-storage

直接cd在文件管理器中复制的路径就可以读取手机储存种的文件。
首次打开termux后的界面、或直接执行cd命令,使用pwd命令查看当前目录结构:

/data/data/com.termux/files/home

对于整个安卓环境而言,/data/data/com.termux为termux安装路径,
对于termux而言,/home为其根目录,首次打开termux并创建的文件存放于此处,相当于Linux的/root/文件夹。
执行cd $PREFIX,使用pwd命令查看当前目录结构:

/data/data/com.termux/files/usr

即为termux的/usr目录,相当于Linux的/usr/目录。
执行ls命令显示当前目录存在的文件及文件夹,执行ls -lh显示文件及文件夹的详细信息。

四、配置网站环境

1、换源

非必要步骤,将软件源换为国内能提高软件安装速度,但可能存在兼容性问题。执行以下命令换为清华源:

sed -i 's@^\(deb.*stable main\)$@#\1\ndeb https://mirrors.tuna.tsinghua.edu.cn/termux/termux-packages-24 stable main@' $PREFIX/etc/apt/sources.list

sed -i 's@^\(deb.*games stable\)$@#\1\ndeb https://mirrors.tuna.tsinghua.edu.cn/termux/game-packages-24 games stable@' $PREFIX/etc/apt/sources.list.d/game.list

sed -i 's@^\(deb.*science stable\)$@#\1\ndeb https://mirrors.tuna.tsinghua.edu.cn/termux/science-packages-24 science stable@' $PREFIX/etc/apt/sources.list.d/science.list

pkg update

若换源后出现软件安装报错等情况,那么就是软件或者手机存在兼容性问题,清空软件数据后老老实实的的从内置源安装软件。我的华为畅享6就是这种情况,系统为安卓6,无法安装最新版的termux所以从酷安下载的旧版本,而我的另一台realmeX换源后可正常安装软件,系统为安卓10,安装的最新版termux。

2、安装三件套

安装LNMP三件套及常用组件,执行pkg install命令安装:

pkg install nginx -y &&
pkg install mariadb -y &&
pkg install php -y &&
pkg install php-fpm -y &&
pkg install vim -y &&
pkg install openssh -y

3、配置nginx

进入nginx配置文件存放目录:

cd $PREFIX/etc/nginx/

备份nginx配置文件,复制并重命名:

cp nginx.conf bnginx.conf

为了方便编辑将整个配置转移到手机储存且可道云可以读取的目录,用txt文件作为配置文件而不再使用conf文件,这样使用可道云或文件管理器都可以编辑。
在mix文件管理器中创建相应文件夹及nginx.txt文件后,根据备份的bnginx.conf填写配置:

worker_processes  1;
events {
    worker_connections  100000;
}

######http段开始######
http {
    include      mime.types;
    default_type application/octet-stream;
    sendfile     on;
    keepalive_timeout 65;

######可道云开始######
    server {
        listen 8079;  
        server_name kod.chirmyram.top;
        rewrite ^(.*) https://$server_name$1 permanent; 
        }
        
    server {
        listen 8080 ssl;    
        server_name  kod.chirmyram.top;
        ssl_certificate      /data/data/com.termux/files/home/centos/centos-fs/home/ng/ngcert/chirmyram.top.fullchain.cer;
        ssl_certificate_key  /data/data/com.termux/files/home/centos/centos-fs/home/ng/ngcert/chirmyram.top.key;
        ssl_session_cache  
        shared:SSL:1m;          
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   /storage/3461-3833/htdocs/kod;
            index  index.html index.htm index.php;
            ######可道云伪静态
            if (!-e $request_filename){
            rewrite  ^(.*)$  /index.php?s=$1  last;   break;
            } 
        }
        
        location ~ \.php$ {
            root html;
            fastcgi_pass   127.0.0.1:9000;      
            fastcgi_index  index.php;         
            fastcgi_param  SCRIPT_FILENAME  /storage/3461-3833/htdocs/kod$fastcgi_script_name;    
            include fastcgi_params;   
            }
        }
######可道云结束######

######博客网站开始######
    server {
        listen 8089;  
        server_name sj.chirmyram.top;
        rewrite ^(.*) https://$server_name$1 permanent; 
        }
           
    server {
        listen 8090 ssl;    
        server_name  sj.chirmyram.top;
        ssl_certificate  /data/data/com.termux/files/home/centos/centos-fs/home/ng/ngcert/chirmyram.top.fullchain.cer;
        ssl_certificate_key  /data/data/com.termux/files/home/centos/centos-fs/home/ng/ngcert/chirmyram.top.key;
        ssl_session_cache  
        shared:SSL:1m;          
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        ######原链接重定向
        rewrite /archives/sitelist https://sj.chirmyram.top/$1 permanent;


        location / {
            root  /storage/3461-3833/htdocs/sjweb;
            index  index.html index.htm index.php;
            ######WordPress伪静态
            try_files $uri $uri/ /index.php?$args;
            }
            ######WordPress后台伪静态
            rewrite /wp-admin$ $scheme://$host$uri/ permanent;

        location ~ \.php$ {
            root html;
            fastcgi_pass   127.0.0.1:9000;      
            fastcgi_index  index.php;         
            fastcgi_param  SCRIPT_FILENAME  /storage/3461-3833/htdocs/sjweb$fastcgi_script_name;    
            include  fastcgi_params;   
            }
        }
######博客网站结束######

######cloudreve网盘开始######
    server {
        listen 4999;  
        server_name cd.chirmyram.top;
        rewrite ^(.*) https://$server_name$1 permanent;
        }
        
    server {
        listen 5000 ssl;
        server_name cd.chirmyram.top;
        ssl_certificate /data/data/com.termux/files/home/centos/centos-fs/home/ng/ngcert/chirmyram.top.fullchain.cer;
        ssl_certificate_key /data/data/com.termux/files/home/centos/centos-fs/home/ng/ngcert/chirmyram.top.key;
        ssl_session_cache  
        shared:SSL:1m;          
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        access_log off;

        location / {
            proxy_pass http://127.0.0.1:5001;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            }
        }
######cloudreve网盘结束######

######守护进程开始######
    server {
        listen 3999;
        server_name su.chirmyram.top;
        rewrite ^(.*) https://$server_name$1 permanent; 
        }

    server {
        listen 4000 ssl;
        server_name su.chirmyram.top;
        ssl_certificate /data/data/com.termux/files/home/centos/centos-fs/home/ng/ngcert/chirmyram.top.fullchain.cer;
        ssl_certificate_key /data/data/com.termux/files/home/centos/centos-fs/home/ng/ngcert/chirmyram.top.key;
        ssl_session_cache  
        shared:SSL:1m;          
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        access_log off;

        location / {
            proxy_pass http://127.0.0.1:4001;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            }
        }
######进程守护结束######
       
######gl网盘开始######
    server {
        listen 1999;  
        server_name gl.chirmyram.top localhost;
        rewrite ^(.*) https://$server_name$1 permanent;
        }
        
    server {
        listen 2001 ssl;
        server_name gl.chirmyram.top localhost;
        ssl_certificate /data/data/com.termux/files/home/centos/centos-fs/home/ng/ngcert/chirmyram.top.fullchain.cer;
        ssl_certificate_key /data/data/com.termux/files/home/centos/centos-fs/home/ng/ngcert/chirmyram.top.key;
        ssl_session_cache  
        shared:SSL:1m;          
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        access_log off;

        location / {
            proxy_pass http://127.0.0.1:2000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            }
        }
######gl网盘结束######

######zfile网盘开始######
    server {
        listen 2999;  
        server_name zf.chirmyram.top;
        rewrite ^(.*) https://$server_name$1 permanent;
        }
        
    server {
        listen 3001 ssl;
        server_name zf.chirmyram.top;
        ssl_certificate /data/data/com.termux/files/home/centos/centos-fs/home/ng/ngcert/chirmyram.top.fullchain.cer;
        ssl_certificate_key /data/data/com.termux/files/home/centos/centos-fs/home/ng/ngcert/chirmyram.top.key;
        ssl_session_cache  
        shared:SSL:1m;          
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        access_log off;

        location / {
            proxy_pass http://127.0.0.1:3000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            }
        }
######zfile网盘结束######

######jtimer开始######
    server {
        listen 5999;  
        server_name jt.chirmyram.top;
        rewrite ^(.*) https://$server_name$1 permanent;
        }
        
    server {
        listen 6001 ssl;
        server_name jt.chirmyram.top;
        ssl_certificate /data/data/com.termux/files/home/centos/centos-fs/home/ng/ngcert/chirmyram.top.fullchain.cer;
        ssl_certificate_key /data/data/com.termux/files/home/centos/centos-fs/home/ng/ngcert/chirmyram.top.key;
        ssl_session_cache  
        shared:SSL:1m;          
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        access_log off;

        location / {
            proxy_pass http://127.0.0.1:6000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            }
        }
######jtimer结束######

######sharelist开始######
    server {
        listen 6999;  
        server_name sl.chirmyram.top;
        rewrite ^(.*) https://$server_name$1 permanent;
        }
        
    server {
        listen 7000 ssl;
        server_name sl.chirmyram.top;
        ssl_certificate /data/data/com.termux/files/home/centos/centos-fs/home/ng/ngcert/chirmyram.top.fullchain.cer;
        ssl_certificate_key /data/data/com.termux/files/home/centos/centos-fs/home/ng/ngcert/chirmyram.top.key;
        ssl_session_cache  
        shared:SSL:1m;          
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        access_log off;

        location / {
            proxy_pass http://127.0.0.1:33001;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            }
        }
######sharelist结束######

######ngwebui开始######
    server {
        listen 7999;  
        server_name ng.chirmyram.top;
        rewrite ^(.*) https://$server_name$1 permanent;
        }
        
    server {
        listen 8001 ssl;
        server_name ng.chirmyram.top;
        ssl_certificate /data/data/com.termux/files/home/centos/centos-fs/home/ng/ngcert/chirmyram.top.fullchain.cer;
        ssl_certificate_key /data/data/com.termux/files/home/centos/centos-fs/home/ng/ngcert/chirmyram.top.key;
        ssl_session_cache  
        shared:SSL:1m;          
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        access_log off;

        location / {
            proxy_pass http://127.0.0.1:8000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            }
        }
######ngwebui结束######

}
######http段结束######

配置文件主要包含三部分,http、server、location,依次向下包含,注意花括号{}的配对数量一定要对。
查看nginx.txt的属性并复制其路径,回到termux中,由于vim编辑器不方便全选删除,为方便编辑所以利用rm命令删除原nginx配置文件,利用touch命令新建一个,再利用vim编辑:

rm nginx.conf
touch nginx.conf
vim nginx.conf

调出输入法键盘按i进入编辑模式,利用include读取手机储存配置文件,输入include和空格后粘贴刚刚复制的nginx.txt路径,注意最后输入英文分号结尾:

include /storage/3461-3833/htdocs/kod/files/nginx.txt;

ESC退出编辑模式,执行:wq保存更改内容并退出。
重载nginx配置:

nginx -s reload

4、配置mariadb

登录mariadb:

mysql -u $(whoami)

修改root用户的密码:

use mysql;
set password for 'root'@'localhost' = password('你的密码');

刷新权限并退出:

flush privileges;
quit;

5、配置nginx解析php

进入php-fpm配置目录修改配置文件:

cd $PREFIX/etc/php-fpm.d
vim www.conf

在第36行,不同版本可能不同,将listen后面的路径改为本地9000端口:

listen = /data/data/com.termux/files/usr/var/run/php-fpm.sock
to:
listen = 127.0.0.1:9000

6、启动三件套

执行以下命令:

nginx
php-fpm
nohup mysqld >/dev/null 2>&1 &

至此搭建网站的环境配置完毕。

五、配置Linux

termux虽然能模拟Linux终端,却并不兼容所有Linux软件,所以想要以更好的兼容性运行Linux软件还是得安装Linux子系统,但由于手机性能原因,安装的Linux依然是精简的。刚安装linux子系统后软件源中的软件可能很少,update和upgrade之后就会有丰富的软件源。
避免文件散乱难以整理,使用mkdir命令新建一个名为centos的文件夹:

mkdir centos

1、安装Centos

选择AnLinux这款软件提供的脚本安装,因为启动很简单。
AnLinux软件下载:F-Droid.选择系统后复制脚本命令到termux执行:

pkg install wget openssl-tool proot tar -y && hash -r && wget https://raw.githubusercontent.com/EXALAB/AnLinux-Resources/master/Scripts/Installer/CentOS/centos.sh && bash centos.sh

使用./命令执行启动脚本,启动Centos:

./start-centos.sh

Centos默认时区的时间比北京时间晚8小时,试了很多方法改时区但重启后都会失效,不得已只能在启动命令后再加上更改时区的命令:

export TZ='Asia/Shanghai'

安装自己所需组件:

yum -y install sudo wget vim python3 cronie
pip3 install requests

精简的Centos连sudo命令都没有,这个命令很常用当然得安上,wget用于下载文件,vim用于编辑文档,python用于执行脚本,cronie最初用于执行定时任务,后面发现了更方便的具有图形化界面的JTimer就替换掉它了,不过还是留着方便编写整个计划任务。我想要执行的python脚本还需要requests库,再安装requests。
由于linux版的frp客户端老是自己掉线,掉线了还得手动启动,就很麻烦,被这玩意儿折磨惨了,于是想着加个进程守护让它崩溃后自动重启,而且可以一次性启动多个客户端,不用在termux里面开多个会话窗口单独启动各个任务,大幅降低内存占用。稍微瞄了一眼supervisor手动配置,看起来好麻烦的样子,想装宝塔面板再装supervisor,我太依赖图形界面了,但因兼容问题宝塔安装出错,而且过于小题大做了,最后实在没办法了还是硬着头皮还是手动配置supervisor,果然强烈的需求才是进步的动力∠( ᐛ 」∠)_。
yum list命令可以看到精简版Centos默认仓库源没有supervisor,用yum update又嫌浪费时间,简便解决办法为安装epel仓库:

yum install epel-release -y
yum install supervisor

为方便管理将所有客户端及配置文件放到home目录,在home目录建立super文件夹并生成配置文件:

mkdir /home/super
echo_supervisord_conf > /home/super/supervisord.conf

直接运行echo_supervisord_conf会在/etc目录中生成配置文件。
编辑配置文件一度让我头大,运行的客户端命令不是./而是文件路径,蒙了好久,看了有关cloudereve设置宝塔进程守护的教程才明白该怎么设置。zfile和JTimer为脚本启动,一次启动就好,重试次数设置多了就会一直尝试启动,完全没必要。
编辑好的配置文件:

[inet_http_server]
port=0.0.0.0:4001  ;默认配置只能本地访问,配置成0.0.0.0可以通过外部查看监控界面
username=你的名字
password=你的密码

[supervisord]
logfile=/home/super/supervisord.log  ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=10KB       ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10          ; (num of main logfile rotation backups;default 10)
loglevel=info               ; (log level;default info; others: debug,warn,trace)
pidfile=/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false              ; (start in foreground if true;default false)
minfds=1024                 ; (min. avail startup file descriptors;default 1024)
minprocs=200                ; (min. avail process descriptors;default 200)

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///run/supervisor/supervisor.sock ; use a unix:// URL  for a unix socket
serverurl=http://127.0.0.1:4001
username=你的名字              ; should be same as http_username if set
password=你的密码                ; should be same as http_password if set

[program:sjweb]     ;进程名
command = /home/sjweb/frpc ;运行的命令
directory = /home/sjweb/   ;运行命令所在的文件夹
stdout_logfile = /home/sjweb/frpc.log  ;日志打印文件位置
autostart = true   ;是否设置启动后自动启进程
startsecs = 5 ;设置启动后几秒开始启进程
autorestart = true  ;是否自动重启
startretries = 9999999     ;重启次数
stdout_logfile_maxbytes = 10KB   ;日志最大容量,达到后新建一个日志文件

[program:kod]
command = /home/kod/frpc
directory = /home/kod/
stdout_logfile = /home/kod/frpc.log
autostart = true
startsecs = 5
autorestart = true
startretries = 9999999
stdout_logfile_maxbytes = 10KB

[program:cd]
command = /home/cd/frp/frpc
directory = /home/cd/frp/
stdout_logfile = /home/cd/frp/frpc.log
autostart = true
startsecs = 5
autorestart = true
startretries = 9999999
stdout_logfile_maxbytes = 10KB

[program:cloudreve]
command = /home/cd/cd/cloudreve
directory = /home/cd/cd/
stdout_logfile = /home/cd/cd/cloudereve.log
autostart = true
startsecs = 5
autorestart = true
startretries = 9999999
stdout_logfile_maxbytes = 10KB

[program:super]
command = /home/super/frpc
directory = /home/super/
stdout_logfile = /home/super/frpc.log
autostart = true
startsecs = 5
autorestart = true
startretries = 9999999
stdout_logfile_maxbytes = 10KB

[program:gl]
command = /home/gl/frp/frpc
directory = /home/gl/frp/
stdout_logfile = /home/gl/frp/frpc.log
autostart = true
startsecs = 5
autorestart = true
startretries = 9999999
stdout_logfile_maxbytes = 10KB

[program:gonelist]
command = /home/gl/gl/gl
directory = /home/gl/gl/
stdout_logfile = /home/gl/gl/gonelist.log
autostart = true
startsecs = 5
autorestart = true
startretries = 9999999
stdout_logfile_maxbytes = 10KB

[program:bot]
command = /home/bot/E5SubBot
directory = /home/bot/
stdout_logfile = /home/bot/bot.log
autostart = true
startsecs = 5
autorestart = true
startretries = 9999999
stdout_logfile_maxbytes = 10KB

[program:ssh]
command = /home/ssh/frpc
directory = /home/ssh/
stdout_logfile = /home/ssh/frpc.log
autostart = true
startsecs = 5
autorestart = true
startretries = 9999999
stdout_logfile_maxbytes = 10KB

[program:zf]
command = /home/zf/frp/frpc
directory = /home/zf/frp/
stdout_logfile = /home/zf/frp/frpc.log
autostart = true
startsecs = 5
autorestart = true
startretries = 9999999
stdout_logfile_maxbytes = 10KB

[program:zfile]
command = /home/zf/zf/bin/start.sh
directory = /home/zf/zf/bin/
stdout_logfile = /home/zf/zf/bin/zfile.log
autostart = true
startsecs = 5
autorestart = true
startretries = 1
stdout_logfile_maxbytes = 10KB

[program:jt]
command = /home/jt/frp/frpc
directory = /home/jt/frp/
stdout_logfile = /home/jt/frp/frpc.log
autostart = true
startsecs = 5
autorestart = true
startretries = 9999999
stdout_logfile_maxbytes = 10KB

[program:jtimer]
command = /home/jt/jt/start.sh
directory = /home/jt/jt/
stdout_logfile = /home/jt/jt/jt.log
autostart = true
startsecs = 5
autorestart = true
startretries = 9999999
stdout_logfile_maxbytes = 10KB

[program:sl]
command = /home/sl/frp/frpc
directory = /home/sl/frp/
stdout_logfile = /home/sl/frp/frpc.log
autostart = true
startsecs = 5
autorestart = true
startretries = 9999999
stdout_logfile_maxbytes = 10KB

[program:sharelist]
command = /home/sl/sl/app.js
directory = /home/sl/sl/
stdout_logfile = /home/sl/sl/app.log
autostart = true
startsecs = 5
autorestart = true
startretries = 9999999
stdout_logfile_maxbytes = 10KB

[program:ng]
command = /home/ng/frp/frpc
directory = /home/ng/frp/
stdout_logfile = /home/ng/frp/frpc.log
autostart = true
startsecs = 5
autorestart = true
startretries = 9999999
stdout_logfile_maxbytes = 10KB

[program:ngwebui]
command = /home/ng/ng/start.sh
directory = /home/ng/ng/
stdout_logfile = /home/ng/ng/ng.log
autostart = true
startsecs = 5
autorestart = true
startretries = 9999999
stdout_logfile_maxbytes = 10KB

[program:aria2]
command = /bin/aria2c
directory = /bin/
stdout_logfile = /bin/aria2.log
autostart = true
startsecs = 5
autorestart = true
startretries = 9999999
stdout_logfile_maxbytes = 10KB

启动supervisor:

supervisord -c /home/super/supervisord.conf

supervisor有web管理界面,默认端口为9001,设置登入账户及密码,配置nginx反向代理就可以用个域名实现网页端图形可视化管理。
supervisor

2、内网穿透

为方便以后远程操作首先映射ssh,使用pkg install openssh安装ssh后,用whoami查看用户名,使用passwd设置密码,使用sshd启动ssh,默认端口为8022。在SakuraFrp上建立TCP隧道进行穿透。

对于centos子系统,为避免文件混乱,依然用mkdir为每个网站的frp客户端新建一个文件夹,下载SakuraFrp的客户端并赋予执行权限,为方便启动将客户端重命名为frpc,最后启动。下好第一个赋予执行权限后复制到其他文件夹不再需要赋予执行权限。

mkdir /home/sjweb
cd /home/sjweb
wget https://qianqu.me/frp/frpc_linux_arm64 && chmod -R 777 frpc_linux_arm64
mv frpc_linux_arm64 frpc
./frpc

启动客户端后显示UI界面,点击Token后面的输入框,粘贴从SakuraFrp用户信息里面获取的访问秘钥,点击Login即可显示已经创建的隧道,点击单个隧道选中后字体变为绿色,按Ctrl+C启动隧道。如果同一个节点地区有多条隧道,点击地区名可同时选中多条隧道并同时启动。
SakuraFrp客户端启动后,会自动在当前目录生成名为客户端名.ini的配置文件,二次启动客户端时会直接读取配置文件启动。若需更换隧道,按Ctrl+C终止当前客户端,编辑配置文件重新启动,当然来的更快的就是直接删掉配置文件重新登录客户端。
由于网络环境不稳定等原因,二次启动客户端时可能失败,可多次尝试。

3、计划任务

按照原项目AutoApi的习惯,在Centos根目录下创建了一个名为1的文件夹,进入1文件夹,创建1.txt文件将获取的refresh _token填进去。
修改python脚本1.py第12行和第14行填入自己的应用ID和秘钥:

# -*- coding: UTF-8 -*-
import requests as req
import json,sys,time
#先注册azure应用,确保应用有以下权限:
#files:    Files.Read.All、Files.ReadWrite.All、Sites.Read.All、Sites.ReadWrite.All
#user:    User.Read.All、User.ReadWrite.All、Directory.Read.All、Directory.ReadWrite.All
#mail:  Mail.Read、Mail.ReadWrite、MailboxSettings.Read、MailboxSettings.ReadWrite
#注册后一定要再点代表xxx授予管理员同意,否则outlook api无法调用

###################################################################
#把下方单引号内的内容改为你的应用id                                         #
id=r'你的id'                         
#把下方单引号内的内容改为你的应用机密                                       #
secret=r'你的机密'                                           
###################################################################

path=sys.path[0]+r'/1.txt'
num1 = 0

def gettoken(refresh_token):
    headers={'Content-Type':'application/x-www-form-urlencoded'
            }
    data={'grant_type': 'refresh_token',
          'refresh_token': refresh_token,
          'client_id':id,
          'client_secret':secret,
          'redirect_uri':'http://localhost:53682/'
         }
    html = req.post('https://login.microsoftonline.com/common/oauth2/v2.0/token',data=data,headers=headers)
    jsontxt = json.loads(html.text)
    refresh_token = jsontxt['refresh_token']
    access_token = jsontxt['access_token']
    with open(path, 'w+') as f:
        f.write(refresh_token)
    return access_token
def main():
    fo = open(path, "r+")
    refresh_token = fo.read()
    fo.close()
    global num1
    access_token=gettoken(refresh_token)
    headers={
    'Authorization':access_token,
    'Content-Type':'application/json'
    }
    try:
        if req.get(r'https://graph.microsoft.com/v1.0/me/drive/root',headers=headers).status_code == 200:
            num1+=1
            print("<br/>1调用成功"+str(num1)+'次')
        if req.get(r'https://graph.microsoft.com/v1.0/me/drive',headers=headers).status_code == 200:
            num1+=1
            print("<br/>2调用成功"+str(num1)+'次')
        if req.get(r'https://graph.microsoft.com/v1.0/drive/root',headers=headers).status_code == 200:
            num1+=1
            print('<br/>3调用成功'+str(num1)+'次')
        if req.get(r'https://graph.microsoft.com/v1.0/users ',headers=headers).status_code == 200:
            num1+=1
            print('<br/>4调用成功'+str(num1)+'次')
        if req.get(r'https://graph.microsoft.com/v1.0/me/messages',headers=headers).status_code == 200:
            num1+=1
            print('<br/>5调用成功'+str(num1)+'次')    
        if req.get(r'https://graph.microsoft.com/v1.0/me/mailFolders/inbox/messageRules',headers=headers).status_code == 200:
            num1+=1
            print('<br/>6调用成功'+str(num1)+'次')    
        if req.get(r'https://graph.microsoft.com/v1.0/me/mailFolders/inbox/messageRules',headers=headers).status_code == 200:
            num1+=1
            print('<br/>7调用成功'+str(num1)+'次')
        if req.get(r'https://graph.microsoft.com/v1.0/me/drive/root/children',headers=headers).status_code == 200:
            num1+=1
            print('<br/>8调用成功'+str(num1)+'次')
        if req.get(r'https://api.powerbi.com/v1.0/myorg/apps',headers=headers).status_code == 200:
            num1+=1
            print('<br/>8调用成功'+str(num1)+'次') 
        if req.get(r'https://graph.microsoft.com/v1.0/me/mailFolders',headers=headers).status_code == 200:
            num1+=1
            print('<br/>9调用成功'+str(num1)+'次')
        if req.get(r'https://graph.microsoft.com/v1.0/me/outlook/masterCategories',headers=headers).status_code == 200:
            num1+=1
            print('<br/>10调用成功'+str(num1)+'次')
            print('<br/>结束时间为 : '+time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
    except:
        print("<br/>pass")
        pass
for _ in range(3):
    main()

由于原脚本中调用的库在python3中已改名,而且在现在的环境中执行不能输出执行时间,我稍微改了后面的时间输出,另外我用sharelist挂载本地文件为了保留格式方便预览,就使用md文件,输出日志加了换行符。

找了很久找到一款有图形界面的计划任务工具:JTimer。我用的Java版本,整体下载之后配置文件中的数据库地址改为127.0.0.1,含pom.xml的目录打包为jar:

yum install maven
mvn clean package -Dmaven.test.skip=true

创建start.sh脚本并赋予执行权限:

#!/bin/sh
java -jar jt.jar

最后写入进程守护就可以了。

记录一下之前设置计划任务的方式:
新建一个名为1.cron的文件(当然cron这个格式是我自定义的)填入定时任务配置:

0 */5 * * * * python3 /home/1/1.py >> /home/sl/sl/E5log/1.md 2>&1
0 0 */1 * * * pkill python3
0 0 */1 * * * sudo rm /home/sl/sl/E5log/1.md
0 0 */1 * * * sudo rm /home/super/frpc.log /home/super/frpc.log.*
0 0 */1 * * * sudo rm /home/super/supervisord.log /home/super/supervisord.log.*
0 0 */1 * * * sudo rm /home/sjweb/frpc.log /home/sjweb/frpc.log.*
0 0 */1 * * * sudo rm /home/kod/frpc.log /home/kod/frpc.log.*
0 0 */1 * * * sudo rm /home/cd/frp/frpc.log /home/cd/frp/frpc.log.*
0 0 */1 * * * sudo rm /home/cd/cd/cloudereve.log /home/cd/cd/cloudereve.log.*
0 0 */1 * * * sudo rm /home/gl/frp/frpc.log /home/gl/frp/frpc.log.*
0 0 */1 * * * sudo rm /home/gl/gl/gonelist.log /home/gl/gl/gonelist.log.*
0 0 */1 * * * sudo rm /home/bot/bot.log /home/bot/bot.log.*
0 0 */1 * * * sudo rm -r /home/bot/log
0 0 */1 * * * sudo rm /home/ssh/frpc.log /home/ssh/frpc.log.*
0 0 */1 * * * sudo rm /home/zf/frp/frpc.log /home/zf/frp/frpc.log.*
0 0 */1 * * * sudo rm /home/zf/zf/bin/zfile.log /home/zf/zf/bin/zfile.log.*
0 0 */1 * * * sudo rm /home/jt/frp/frpc.log /home/jt/frp/frpc.log.*
0 0 */1 * * * sudo rm /home/jt/jt/jt.log /home/jt/jt/jt.log.*
0 0 */1 * * * sudo rm /home/sl/frp/frpc.log /home/sl/frp/frpc.log.*
0 0 */1 * * * sudo rm /home/sl/sl/app.log /home/sl/sl/app.log.*
0 0 */1 * * * sudo rm /home/ng/frp/frpc.log /home/ng/frp/frpc.log.*
0 0 */1 * * * sudo rm /home/ng/ng/ng.log /home/ng/ng/ng.log.*
0 0 */1 * * * sudo rm /home/ng/nglog/nginxWebUI.log
0 0 */1 * * * sudo rm /bin/aria2.log /bin/aria2.log.*
0 30 1 * * 1 rclone delete cd:/ssl/ && rclone copy /home/ng/ngcert cd:/ssl

第一行任务为每五分钟执行一次python脚本并将日志输出到同目录的1.log文件中;
第二行为每小时杀一次python的所有进程,因为通过长期观察发现python执行脚本后进程仍然存在,然后进程一直累加,两三天之内就耗光了手机运存,最后软件被杀后台导致服务器宕机,造成每隔几天都要重启一次服务器,所以加了这条命令;
接下来的的是每小时清理一次其他进程的日志,不然日志越来越多很麻烦,为了顺眼就把清理同一目录日志文件的命令放到同一行来写,通过观察日志写入情况来监控运行状态。虽然启动Centos的同时也改了时区,但python日志中记录的时间仍然晚8小时,目前还没找到有效解决办法。
最后一行为每周星期一1点30分通过rclone备份ssl证书至Onedrive。
将1.cron设为cronie定时任务:

crontab /home/1/1.cron

cronie有以下常用命令:

crontab -l #查看当前已有定时任务
crontab -r #删除已有定时任务

回到Centos根目录,启动计划任务:

crond start

4、综合启动

先启动安卓代理软件,不然tg机器人无法连接到tg服务器导致启动失败。我将以下命令存放于QQ输入法云剪贴板中,每次需要启动时只需要粘贴进去执行就行,算是比较方便。

nohup sshd >/dev/null 2>&1 &
nohup nginx >/dev/null 2>&1 &
nohup mysqld >/dev/null 2>&1 &
nohup php-fpm >/dev/null 2>&1 &
./centos/start-centos.sh
cd / 
export TZ='Asia/Shanghai' 
supervisord -c /home/super/supervisord.conf ;
ls

先启动ssh,再以不输出日志文件的方式启动启动LNMP三件套,接着启动Centos,进入根目录启动计划任务及进程守护。启动进程守护即可同时自动启动所有配置好的客户端。启动cloudreve之前必须启动三件套,因为cloudreve启动时需要读取数据库,而mariadb未启动会造成数据库读取失败。最后的ls命令纯粹凑数的,是为了整体能流畅的执行下去,因外QQ输入法剪贴板不能保存空行。

六、运行项目

由于这些网站的搭建教程烂大街了,这也不是本篇文章的重点,就只是介绍一些自己遇到的关键点。我本来也想搭一个Typecho,但目前的正式版在安装时配置数据库存在问题,而测试版又有伪静态问题,反正存在各种问题就放弃转而安装WordPress。

1、自动跳转https

首先要实现的就是http自动跳转https,不然只能通过的带https前缀的链接进去网站可太难受了。当然本来搭的网站就是http的,那就不用进一步折腾了。
我的解决办法是在SakuraFrp上为每个网站创建http和https两个隧道(注意部分隧道不支持创建http隧道),然后配置nginx的自动跳转,即本地每个网站俩端口,以解决80和443用不了的问题,这些在上文中的nginx配置文件中都明显的体现出来。

2、phpmyadmin

以下简称pma。对于菜鸟来说,有图形界面的数据库管理工具方便的不得了,你可以把pma当做一个可以直接读取数据库的网站程序。
pma官网下载最新版并解压到一个文件夹,可以把它单独当一个网站,为它创建内网穿透隧道、配置单独的域名,专门弄个网站来管理数据库,也可以直接扔到其他网站子目录中,当做这个网站的子站点,省事省心。
pma在某些时候用Chromium系的浏览器上可能登录失败,在IE上可完美登陆。

3、伪静态

  • WordPress的伪静态为:

    location / {
     try_files $uri $uri/ /index.php?args;
     }
     rewrite /wp-admin$ $scheme://$host$uri/ permanent;
  • 可道云伪静态:

    if (!-e $request_filename){
    rewrite  ^(.*)$  /index.php?s=$1  last;   break;
    }

    可道云不开启伪静态无法安装webdav插件。

  • cloudreve

下载cloudereve解压,赋予执行权限并启动:

wget https://github.com/cloudreve/Cloudreve/releases/download/3.1.1/cloudreve_3.1.1_linux_arm64.tar.gz
tar -zxvf cloudreve_3.1.1_linux_arm64.tar.gz
chmod -R 777 cloudreve
./cloudreve

首次启动时,Cloudreve 会在同级目录下创建名为conf.ini的配置文件,修改此文件进行一些参数的配置,保存后重启 Cloudreve 生效。配置nginx反向代理实现https。

[System]
; 运行模式
Mode = master
; 监听端口
Listen = :5212
; 是否开启 Debug
Debug = false
; Session 密钥, 一般在首次启动时自动生成
SessionSecret = IBSUfS8kCKLSeS0i93bbhmxav1OUbw5LQXMQ8oOXJFQ9WCU8PqBmTjY07crdvGkl
; Hash 加盐, 一般在首次启动时自动生成
HashIDSalt = SeLBTR3CpkvRw8GpFF90uUmJNtf8G8Ps9V8bDYgyCuC1gCgS2KGANkuA4ZQf3A5f

; 数据库相关,如果你只想使用内置的 SQLite数据库,这一部分直接删去即可
[Database]
; 数据库类型,目前支持 sqlite | mysql
Type = mysql
; MySQL 端口
Port = 3306
; 用户名
User = root
; 密码
Password = 你的密码
; 数据库地址
Host = 127.0.0.1
; 数据库名称
Name = cd
; 数据表前缀
TablePrefix = cd-

; 从机模式下的配置
[Slave]
; 通信密钥
Secret = 1234567891234567123456789123456712345678912345671234567891234567
; 回调请求超时时间 (s)
CallbackTimeout = 20
; 签名有效期
SignatureTTL = 60

; 跨域配置
[CORS]
AllowOrigins = *
AllowMethods = OPTIONS,GET,POST
AllowHeaders = *
AllowCredentials = false

; 从机模式缩略图
[Thumbnail]
MaxWidth = 400
MaxHeight = 300
FileSuffix = ._thumb

可道云和cloudreve

4、GoneList

类似于OneIndex的一款OneDrive目录程序,由Go语言编写而成响应速度极快,美中不足的是拉取OneDrive文件较慢且文件一旦过多就容易失败,解决办法是先建一个空的公开子文件夹,搭建成功后再将文件移进去。
配置文件config.json

{
  "client_id": "你的id",
  "client_secret": "你的机密",
  "redirect_url": "http://localhost:2000/auth",
  "state": "GoneList",
  "token_path": "",
  "download_redirect_prefix": "",
  "server": {
    "port": 2000,
    "refresh_time": 1,
    "bind_global": true,
    "dist_path": "./dist/",
    "site_url": "http://localhost:2000/auth",
    "folder_sub": "/public"
  }
}

5、E5subBot

用于调用Office365的api实现玄学续期的Telegram机器人,由Go语言编写而成可直接执行。其最大问题就是国内无法直连tg的服务器,我尝试了很久linux无图形界面挂代理都失败了。比较简便的方法就是在手机上挂一个安卓代理软件,成功实现让bot动起来。项目本身也支持socks5代理,如果能找到比较稳定的socks5代理也可以加进配置文件:socks5: ip:端口
或者自己用brook在国外vps上搭一个socks5代理,这看起来属实多余,直接搭在vps上不好吗,搭建很简单,直接下载brook单程序、赋权、按照指定的端口不输出日志启动即可:

mkdir socks
cd socks
wget https://github.com/txthinking/brook/releases/download/v20210401/brook_linux_amd64
mv brook_linux_amd64 brook
chmod -R 777 brook
nohup /root/socks/brook socks5 --socks5 0.0.0.0:端口 >/dev/null 2>&1 &

不带socks5代理的配置文件config.yml

bot_token: 机器人token
admin: 管理员tgid
errlimit: 99999999999999999999
cron: "*/5 * * * *"
bindmax: 3
mysql:
  host: 127.0.0.1
  port: 3306
  user: 数据库用户名
  password: 数据库密码
  database: 数据库名

每五分钟执行一次,错误上限次数设置到超级大,即使任务执行出错,在有生之年都不会出现自动解绑的情况。

6、zfile

我觉得应该算是目前体验最好的OneDrive目录程序,而且难得支持挂载SharePoint文件,只不过java环境部署起来略微麻烦,好在过程顺利。
安装官方配置文件进行部署:

yum install -y java-1.8.0-openjdk unzip
cd ~
wget https://c.jun6.net/ZFILE/zfile-release.war
mkdir zfile && unzip zfile-release.war -d zfile && rm -rf zfile-release.war
chmod +x zfile/bin/*.sh

将启动脚本start.sh写入进程守护配置文件即可一并启动。

7、sharelist

此网盘程序集国内几大网盘于一身,能同时挂载多种网盘,另外特别的地方就在于它是需要nodejs环境运行的,虽然安装脚本会自动安装js,但为了节约时间就先自己安装js和其它组件:

yum install nodejs git -y

然后下载源码并赋予执行权限:

git clone https://github.com/reruin/sharelist.git
cd sharelist
chmod -R 777 app.js

我这里有点不同的就是不用安装官方文档说明的方式进行启动,安装nodejs后就可以直接运行app.js,如果报错就执行npm install补全所需模块。不用使用nodejs的pm2进程守护方式启动,因为可以直接执行所以就将将app.js写入supervisor配置文件实现一并启动。

8、nginx webui

这里深刻的体现出我杀鸡用牛刀,我部署nginx webui不是为了方便配置nginx而是为了其中一项自动续签泛域名证书的功能,原acme续签脚本用起来有些复杂,现在有webui了直接填进去就行~
当然也跟我的系统环境有关,我的nginx起初就装在termux里面而非linux子系统centos,相当于在宿主机外环境中,内环境没法干预到外环境,nginx迁移到内环境又有点麻烦,就变成这样了。
下载jar包,为方便后续配置再重命名为短名:

wget http://file.nginxwebui.cn/nginxWebUI-2.4.7.jar
mv nginxWebUI-2.4.7.jar ng.jar

选择mysql(mariadb)数据库,编写启动脚本start.sh

#!/bin/sh
java -jar ng.jar -Xmx64m --server.port=8000 --project.home=/home/ng/ng --spring.database.type=mysql --spring.datasource.url=jdbc:mysql://127.0.0.1:3306/数据库名 --spring.datasource.username=数据库用户名 --spring.datasource.password=数据库密码

jar包启动过程略慢,需要一两分钟的启动时间,此时访问链接会报错。初次启动会强制安装nginx,由于我不需要nginx了,所以随便点了安装后立即终止进程,再次启动就不会安装了。最为关键的一点是,生成的域名证书在termux的home目录中,在nginx中配置文件中填写证书目录要从termux的根目录开始:

/data/data/com.termux/files/home/centos/centos-fs...

否则会从termux的usr开始读取证书导致读取不到证书文件报错,即/data/data/com.termux/files/usr/...
最后nginx -s reload重载配置无报错的话,就大功告成了。

9、Rclone

Rclone可在不同网盘中转移文件,但由于termux的特殊性,无法将网盘挂载到本地文件。在无图形界面的linux系统环境中,它让我方便上传文件到OneDrive的行为变得可能,所以我用它来备份nginx webui生成的ssl证书。
centos自带的软件源安装rclone有些问题,如上文所述安装epel仓库后即可安装成功:

yum install epel-release -y
yum install rclone -y

配置文件路径:

/root/.config/rclone/rclone.conf

可以直接复制里面的配置拿来用。
由于手机用了代理导致配置的OneDrive直接上传文件可能失败,可以设置自定义代理规则绕过域名:

https://graph.microsoft.com

或者配置rclone连接cloudreve的webdav实现间接上传到OneDrive:

rclone copy /home/ng/ngcert cd:/ssl

添加到计划任务即可定时上传。

10、离线下载

刚开始踩了一个坑,使用的一键安装脚本:

wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/aria2.sh && chmod +x aria2.sh && bash aria2.sh
#备用地址
wget -N --no-check-certificate https://www.moerats.com/usr/shell/Aria2/aria2.sh && chmod +x aria2.sh && bash aria2.sh

因为配置过程是终端交互式的看上去比较方便,结果装aria2之前装了一大堆安装环境,装aria2的时候因为没有适配arm架构还启动失败,装了半天还装不上,空间占用还贼大,欲哭无泪。然而脚本还不带卸载安装环境的命令,不过通过查看脚本源码可以发现这些命令:

yum install nano -y
yum install crond -y
yum -y groupinstall "Development Tools"

特别是"Development Tools"这玩意儿,安装下来三四百兆接近半个G,我们可以反其道而行之卸载就干净不少:

yum remove nano
yum -y groupremove "Development Tools"

我这里发现crond并没有安装成功就不列出来了。然后转而使用centos官方源的aria2:

yum install aria2 -y

一条命令就能搞定,然后把之前用脚本安装的aria2的配置文件复制过来稍微改改就能用,并在同目录手动建立会话文件:

/root/.aria2/aria2.conf
touch /root/.aria2/aria2.session

启动命令为aria2c,有时候离线任务弄多了重启服务器后会自动下载,拦都拦不住,先杀掉aria2进程,再删除临时下载目录所有文件,最后清空配置文件同目录的会话文件:

true > /root/.aria2/aria2.session

清空命令true是个好命令,免去了先删除文件再创建文件的麻烦。将aria2写入supervisor配置文件实现进程守护,就可以减少一条启动命令。

七、挂载webdav

1、可道云的webdav

cloudreve与可道云都支持webdav,手机端支持webdav挂载的文件管理器,mix是我现在用的很顺手的文件管理器。如文章开头所说,挂载可道云的webdav可以很方便的编辑termux目录下的文件。
可道云可读取termux安装目录下所有文件,即相对于安卓环境而言,可以读取到:

/data/data/com.termux

点击可道云左下角用户头像进入后台管理,在储存中新增要挂载的储存位置。
储存目录填手机储存的某个文件夹路径,可管理当前路径下的所有文件。
若要读取Centos文件,填写:

/data/data/com.termux/files/home/centos/centos-fs/root/

路径中的centos文件夹是我自己新建的,直接安装的没有这个文件夹。
进入可道云文件管理界面,将左侧栏二级侧栏中的网络挂载添加到收藏夹中。进入插件管理中开启webdav服务,在个人中心可找到webdav链接。
在webdav挂载软件中输入以上链接及安装可道云时配置的账号密码即可成功连接。

2、cloudreve的webdav

在侧栏菜单WebDAV中创建新的账号,webdav登录账号为cloudreve登录账号,密码为生成的密码。

3、Windows挂载webdav

Windows资源管理器自带的映射功能可用来挂载webdav,在点击侧栏此电脑,顶栏横排菜单中的“映射网络驱动器”和“添加一个网络位置”就是挂载功能,但体验贼差劲,重启电脑后就失效了,得重新挂一遍。所以我用第三方软件RaiDrive挂载。
打开RaiDrive添加onedrive和webdav,挂载webdav功能在NAS选项中,勾选地址后面的方框启用ssl,即443端口,地址栏第一栏输入域名,下面一栏输入webdav链接剩余部分,直到方框描边由红变白。
RaiDrive不能通过可道云和cloudreve的webdav读取实际容量,显示的容量有点离谱。
挂载的网盘

八、ksweb及frp安卓端

虽然现在不用ksweb了,还是稍微记录一下关键配置部分。
想要建立多个网站,就在ksweb中添加多个主机,lighttpd和nginx可以配置ssl证书,但国内安卓端浏览器会报不安全。
frp安卓端无法使用新版SakuraFrp的配置文件,需要从新版配置文件中提取信息按以下配置填写,中文内容都是要改的:

[common]
server_addr = 服务器地址
server_port = 7000
tcp_mux = true
pool_count = 1
protocol = tcp
user = 访问秘钥
token = SakuraFrpClientToken
dns_server = 223.5.5.5

[隧道名称]
privilege_mode = true
type = http或者https
local_ip = 127.0.0.1
local_port = 本地端口
custom_domains = 绑定域名
use_encryption = false
use_compression = true

配置多个站点,则在其后继续填入以上内容。

参考资料

Termux 高级终端安装使用配置教程
https://www.sqlsec.com/2018/05/termux.html

旧手机上搭建网站+内网穿透
https://www.coolapk.com/feed/16506805?shareKey=ODYwYjJlODgxNzIzNWY2YzljZDI

AutoApi-普通版
https://github.com/wangziyingwen/AutoApi

Office 365 E5 账号申请及永久续期教程
https://logi.im/script/permanently-keeping-an-office-e5-account.html

cloudreve配置文件
https://docs.cloudreve.org/getting-started/config

Linux crontab 命令
https://www.runoob.com/linux/linux-comm-crontab.html

linux进程守护工具supervisor使用概述
https://blog.csdn.net/qingquanyingyue/article/details/104155897

本文作者:七米蓝
本文标题:《将手机内网穿透当作服务器并运行了几个项目》
本文链接:https://www.chirmyram.top/archives/phoneserver
版权声明:本博客文章均采用CC BY-NC-SA 4.0许可协议,转载请注明出处!