Online.net 服务器监控脚本

今天的kimsufi 4C没抢到。不过这个垃圾网还不如oline的。就找了个脚本改改 部署方便些

脚本

脚本使用python3.6编写,下面是脚本

需要更改的是价格。这个脚本是根据价格判断需要的服务器是否有货的

地址的话 这个是官网默认的地址,如果有活动的话 如果活动的界面跟这个地址的界面一样的话 直接改地址就可以了

# coding:utf-8
import time
from datetime import datetime
import requests
from bs4 import BeautifulSoup
## 需要监控的价格
prices = ['6.99','16.99', '19.99','15.99'] #15.99不是特价款
# 通知的server酱的key  https://sc.ftqq.com 这里注册 然后去用微信扫描生成一个key就行了
keys = [
    'xxxxxxx',
]
# 检查间隔
check_interval = 60
# 服务器列表订购列表
url = "https://console.online.net/en/order/server"
notified = {}
## 通知次数
notice_times = 50
timeout = 20
# 获得购买页面
def get_page():
    with requests.get(url) as resp:
        return resp.content
# 发送消息通知
def send_message(key, text, desp=''):
    url = f"https://sc.ftqq.com/{key}.send"
    data = {
        'text': text,
        'desp': desp
    }
    requests.post(url, data=data, timeout=timeout)
# 检查每条数据是不是有货
def check_server(tr):
    tds = tr.find_all('td')
    if tds and tds[-1].find('form'): #有form就是有货啊
        tds_text = [td.text for td in tds]
        price = tds_text[-2].replace(' € pre-tax', '').strip()
        details = '\n\n'.join(tds_text[:-1])
        if price in prices:
            if notified.get(price, 0) < notice_times:
                send_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
                text = f"{price}O有货啦"
                desp = details + '\n\n 监控时间:   ' + send_time + '\n\n 购买地址:   ' + url
                notified[price] = notified.get(price, 0) + 1
                print(f"{price}O有货了,第{notified[price]}次通知")
                for key in keys:
                    send_message(key, text, desp)
                    time.sleep(1)
            else:
                print(f'{price}O的相关信息超过最大通知次数,不再微信通知...')
        else:
            notified.setdefault(price, 0)
# 跑脚本
def run():
    content = get_page()
    if not content:
        print('没有返回任何内容')
        return
    soup = BeautifulSoup(content, 'html.parser')
    trs = soup.find_all('tr')
    for tr in trs:
        check_server(tr)
def main():
    while True:
        try:
            run()
            print(
                f"{check_interval}秒后再次检查,当前时间: { datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
            time.sleep(check_interval)
        except Exception as e:
            print(e)
            pass
if __name__ == '__main__':
    main()

部署和运行

这里只说ubuntu 16.04
服务器上的python版本太低 这里自己装个pyenv

sudo apt-get install -y build-essential libbz2-dev libssl-dev libreadline-dev \
                        libsqlite3-dev tk-dev
sudo apt-get install -y libpng-dev libfreetype6-dev
curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash

然后根据自己的shell设置好

一般在 ~/.profile 或者 ~/.bashrc 我是zsh 就在 ~/.zshrc

export PATH="~/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

然后 使配置生效 (后面的文件名根据你自己的shell改):

source ~/.bashrc

安装python

pyenv install 3.6.2

我使用的是screen运行,这样就算终端断掉 也可以继续监控

screen -S online_mon

然后使用3.6.2版本的python

pyenv shell 3.6.2

安装依赖包

pip install requests
pip install BeautifulSoup4

运行
这里的xxx.py就是脚本的名字

python xxx.py

然后? 然后就是等了。。

C语言3 -变量

变量声明

变量类型 变量名;

变量类型 用来说明宽度是多大

int 4个字节
short 2个字节
char 1个字节

变量名的命名规则

  1. 只能以字母、数组、下划线组成,却第一个元素必须是字母或者下划线
  2. 区分大小写
  3. 不能使用C语言的关键字

全局变量

  1. 编译的时候就已经确定了内存地址和宽度,变量名就是内存地址的别名
  2. 如果不重新编译,全局变量的内存地址不管。游戏外挂中的找“基址”,其实就是找全局变量
  3. 全局变量中的值任何程序都可以改,是公用的

例子:CE搜索基址

ce找到x地址并修改地址内数据后

局部变量

  1. 局部变量是函数内部申请的,如果函数没有执行,那么局部变量没有内存空间。
  2. 局部变量的内存是在堆栈中分配的,程序执行时才分配。我们无法预知程序何时执行,也就意味着,我们无法确定局部变量的内存地址。
  3. 因为局部变量地址内存是不确定的,所以,局部变量只能在函数内部使用,其他函数不能使用

关于变量的初始值

  1. 全局变量是可以没有初始值而直接使用的,系统默认初始值为0
  2. 局部变量在使用前必须要复制,请说明为什么?

C语言2-参数的传递与返回值

short plus(short x,short y,short z,short m)
{
        return x+y+z+m;
}
void main()                        //入口程序 程序开始执行的地方
{
        //调用函数
        plus(1,2,3,4);
        return;                        //执行结束
}
找到plus函数的反汇编  理解每一行汇编代码  找到参数是如何传递  返回值是如何返回的

plus函数对应反汇编代码和意义

调用函数调用:

push 4
push 3
push 2
push 1
call  (plus) 0041100f
add esp,10h

下面是call内部

push    ebp
mov     ebp,esp
sub     esp,40h
以上三步都是为了提升堆栈,并且方便使用ebp寻址。并且esp在此时提升了 0x40,留下了 0x40大小的缓冲区

push    ebx
push    esi
push    edi
以上三条目的是为了保存函数调用前的三个寄存器的值,方便函数结束后恢复原值

lea     edi,[ebp-40h]       执行后edi=刚刚提升堆栈时的esp
mov     ecx,10h
mov     eax,0cccccccch
rep stos    dword ptr [edi]
此步骤将缓冲区全部置CC  CC在硬编码中标志着中断

movsx   eax,word ptr [ebp+8]
movsx   ecx,word ptr [ebp+0ch]
add     eax,ecx
movsx   edx,word ptr [ebp+10h]
add     eax,edx
movsx   ecx,word ptr [ebp+14h]
add     eax,ecx
这里就是真正的计算过程 

堆栈没有变化

pop     edi
pop     esi
pop     ebx
恢复备份的三个寄存器

mov     esp,ebp
pop     ebp
ret
恢复堆栈

出了call,在调用后执行的语句

恢复堆栈,返回调用地址  此时并没有平衡堆栈,据观察在调用后会使用
add esp,10h
恢复堆栈 

此时,已恢复堆栈,但是堆栈上留下一堆垃圾信息,这些信息随时都可以被利用!

Ubuntu下安装Transmission 挂PT 并配置域名访问

安装 Transmission

sudo apt-get install transmission-daemon

修改配置文件

先停止transmission

sudo service transmission-daemon stop

编辑

sudo vim /etc/transmission-daemon/settings.json
第14行修改为“dht-enabled”: false,
第15行是下载目录修改成你自己的“download-dir”: “/home/transmission/downloads”,
第20行修改为“encryption”: 2,
第23行修改为  "incomplete-dir": "/home/transmission/tmp",
第49行修改自定义的密码“rpc-password”: “123456”,
第52行修改成自定义的登录账号名称“rpc-username”: “transmission”,
第54行修改为“rpc-whitelist-enabled”: false,

建立文件夹和修改权限

sudo mkdir -p /home/transmission/downloads
sudo mkdir -p /home/transmission/tmp
sudo usermod -a -G transmission root
sudo chgrp -R transmission /home/transmission
  

检查目录用户组

cd /home/transmission
ls -lh

出现如下所示就OK

drwxr-xr-x 3 root transmission 4.0K Jun 10 01:51 debian-transmission
drwxrwxrwx 2 root transmission 4.0K Jun 10 01:49 downloads

美化

项目地址 : https://github.com/ronggang/transmission-web-control

cd /usr/share/transmission/web
sudo mv index.html index.original.html
sudo wget https://github.com/ronggang/transmission-web-control/raw/master/release/src.tar.gz
sudo tar -xzvf src.tar.gz
sudo mv src.tar.gz

启动transmission

sudo service transmission-daemon start

配置反向代理

这里使用caddy 方便快捷
安装caddy

cd
sudo wget -N --no-check-certificate https://raw.githubusercontent.com/luodaoyi/SimplesScript/master/caddy_install.sh
sudo chmod +x caddy_install.sh
sudo ./caddy_install.sh install http.filemanager

这里要提前解析好自己的域名到服务器的ip 否则无法申请自动成功ssl证书

echo "https://yourdomain {
 gzip
 tls youemail
 proxy / http://127.0.0.1:9091
}" > /usr/local/caddy/Caddyfile

重启caddy

sudo service caddy restart

好了至此安装完毕。打开你的域名看看吧!

VMware Fusion 10 Pro 序列号

111

VMware Fusion 10 Pro 序列号 导入虚拟机 以及下载地址

VMware Fusion 10 Mac 虚拟软件已于今年10月发布。新版的VMware Fusion 10 将兼容 macOS High Sierra,同时还支持最新 MacBook Pro 上的 Touch Bar。Fusion 10 还会改进图形性能和准确性,并采用苹果 Metal 技术。

那么下面的东西将会是你喜欢的东西, 如果你有能力支付昂贵的费用,还请支持正版,双十一购买会便宜点。

FG3TU-DDX1M-084CY-MFYQX-QC0RD

此激活码可激活Fusion 10 Pro

导入vm虚拟机 要把整个目录的目录名加上后缀 .vmwarevm 就可以直接打开了。

下载地址:
https://www.vmware.com/products/fusion/fusion-evaluation.html

Nginx 反向代理nuget配置文件

2

前提条件 域名要解析到服务器ip上去

ubuntu16.04 安装Nginx

非常简单,因为需要喜欢内容所以装的是full版本

sudo apt update -y sudo apt install nginx-full -y

安装好之后配置好反向代理

ssl证书

我使用的是 certbot 自动获取的 Let’s Encrypt 证书

安装 certbot

sudo apt-get update -y
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update -y
sudo apt-get install python-certbot-nginx -y

使用

sudo certbot --nginx

Let’s Encrypt 证书 有效期很短 但是certbot可以一键更新

certbot renew 

添加到cron自动任务就可以自动更新证书了

还有如果想测试下更新用这个指令

sudo certbot renew --dry-run

最终配置文件

proxy_cache_path /usr/local/data/nginx_cache levels=1:2 keys_zone=tmp-nuget:100m inactive=7d max_size=10g;
server {
        listen 80;
        #监听端口#
        server_name nuget.luodaoyi.com;
        #设置server name#
        charset utf-8;
        #设置字符编码为utf-8,可根据实际情况调整#
        location / {
                proxy_cache tmp-nuget;
                proxy_cache_valid  200 206 304 301 302 1d;
                proxy_cache_valid any 1d;
                proxy_cache_key $host$uri$is_args$args;
                add_header X-Via $server_addr;
                add_header X-Cache $upstream_cache_status;
                proxy_redirect off;
                proxy_pass https://www.nuget.org;
                proxy_set_header Host www.nuget.org;
                proxy_set_header User-Agent $http_user_agent;
                proxy_set_header Referer https://www.nuget.org;
                proxy_set_header Accept-Encoding "";
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                subs_filter 'www.nuget.org' 'nuget.luodaoyi.com';
                subs_filter 'api.nuget.org' 'api.nuget.luodaoyi.com';
                subs_filter_types text/css text/xml text/javascript;
        }
        listen 443 ssl http2; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/nuget.luodaoyi.com/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/nuget.luodaoyi.com/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
        listen 80;
        #监听端口#
        server_name api.nuget.luodaoyi.com;
        #设置server name#
        charset utf-8;
        #设置字符编码为utf-8,可根据实际情况调整#
        location / {
                proxy_cache tmp-nuget;
                proxy_cache_valid  200 206 304 301 302 1d;
                proxy_cache_valid any 1d;
                proxy_cache_key $host$uri$is_args$args;
                add_header X-Via $server_addr;
                add_header X-Cache $upstream_cache_status;
                proxy_redirect off;
                proxy_pass https://api.nuget.org/;
                proxy_set_header Host api.nuget.org;
                proxy_set_header User-Agent $http_user_agent;
                proxy_set_header Referer https://api.nuget.org;
                proxy_set_header Accept-Encoding "";
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                subs_filter 'www.nuget.org' 'nuget.luodaoyi.com';
                subs_filter 'api.nuget.org' 'api.nuget.luodaoyi.com';
                subs_filter_types text/css text/xml text/javascript;
        }
        listen 443 ssl http2; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/nuget.luodaoyi.com/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/nuget.luodaoyi.com/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

我的nuget

nuget:

https://nuget.luodaoyi.com

nuget api:

https://api.nuget.luodaoyi.com

Python 多版本共存之pyenv

经常遇到这样的情况:

  • 系统自带的 Python 是 2.6,自己需要 Python 2.7 中的某些特性;
  • 系统自带的 Python 是 2.x,自己需要 Python 3.x;

此时需要在系统中安装多个 Python,但又不能影响系统自带的 Python,即需要实现
Python 的多版本共存。pyenv 就是这样一个 Python 版本管理器。

安装 pyenv

在终端执行如下命令以安装 pyenv 以及几个插件:

$ curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash
$ echo 'export PYENV_ROOT="$HOME/.pyenv"'>> ~/.bashrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"'>> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
$ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc
$ exec $SHELL -l

安装 Python

查看可安装的版本

$ pyenv install --list

该命令会列出可以用 pyenv 安装的 Python 版本,仅列举几个:

2.7.8   # Python 2 最新版本
3.4.1   # Python 3 最新版本
anaconda-4.0.0  # 支持 Python 2.6 和 2.7
anaconda3-4.0.0 # 支持 Python 3.3 和 3.4

其中形如 x.x.x 这样的只有版本号的为 Python 官方版本,其他的形如 xxxxx-x.x.x
这种既有名称又有版本后的属于 “衍生版” 或发行版。

安装 Python 的依赖包

在安装 Python 时需要首先安装其依赖的其他软件包,已知的一些需要预先安装的库如下。

在 CentOS/RHEL/Fedora 下:

sudo yum install readline readline-devel readline-static
sudo yum install openssl openssl-devel openssl-static
sudo yum install sqlite-devel
sudo yum install bzip2-devel bzip2-libs

在 Ubuntu下:

sudo apt-get update
sudo apt-get install make build-essential libssl-dev zlib1g-dev
sudo apt-get install libbz2-dev libreadline-dev libsqlite3-dev wget curl
sudo apt-get install llvm libncurses5-dev libncursesw5-dev

安装指定版本

使用如下命令即可安装 python 3.4.1:

$ pyenv install 3.4.1 -v

该命令会从 github 上下载 python 的源代码,并解压到 /tmp 目录下,然后在
/tmp 中执行编译工作。
若依赖包没有安装,则会出现编译错误,需要在安装依赖包后重新执行该命令。

如果网络不太好,用 pyenv 下载会比较慢,可以先执行该命令,然后到 ~/.pyenv/cache
目录下查看要下载的文件的文件名,然后自己到官方网站下载,并将文件放在 ~/.pyenv/cache
目录下。pyenv 会检查文件的完整性,若确认无误,则不会再重新下载。

对于科研环境,更推荐安装专为科学计算准备的 Anaconda 发行版,
pyenv install anaconda-4.0.0 安装 Python 2.x 版本,
pyenv install anaconda3-4.0.0 安装 Python 3.x 版本;

更新数据库

安装完成之后需要对数据库进行更新:

$ pyenv rehash

查看当前已安装的 python 版本

$ pyenv versions
* system (set by /home/seisman/.pyenv/version)
3.4.1

其中的星号表示当前正在使用的是系统自带的 python。

设置全局的 python 版本

$ pyenv global 3.4.1
$ pyenv versions
system
* 3.4.1 (set by /home/seisman/.pyenv/version)

当前全局的 python 版本已经变成了 3.4.1。也可以使用 pyenv localpyenv shell
临时改变 python 版本。

确认 python 版本

$ python
Python 3.4.1 (default, Sep 10 2014, 17:10:18)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

使用 python

  • 输入 python 即可使用新版本的 python;
  • 系统自带的脚本会以 /usr/bin/python 的方式直接调用老版本的 python,

    因而不会对系统脚本产生影响;
  • 使用 pip 安装第三方模块时会安装到 ~/.pyenv/versions/3.4.1 下,

    不会和系统模块发生冲突。
  • 使用 pip 安装模块后,可能需要执行 pyenv rehash 更新数据库;

使用 USTC 镜像

如果使用 pip 安装模块时速度比较慢,可以考虑使用中科大 LUG 提供的镜像,可以大大提供 pip 安装模块的速度。

编辑 ~/.pip/pip.conf 文件(如果没有则创建之),将 index-url 开头的一行修改为下面一行:

[global]
index-url = https://pypi.mirrors.ustc.edu.cn/simple

安装pyenv-virtualenv

pyenv-virtual是pyenv的插件,它支持管理多个virtualenv

git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc

创建virtualenv

pyenv virtualenv 3.5.1 aiohttp-virtual-env
  • 创建aiohttp-virtual-env之前,须先安装Python 3.5.1(通过系统或pyenv安装)。
  • aiohttp-virtual-env存储在~/.pyenv/versions/3.5.1/envs目录中,且在~/.pyenv/versions目录中建立同名符号链接。

删除virtualenv

pyenv uninstall aiohttp-virtual-env

列出virtualenv

pyenv virtualenvs

激活/禁用virtualenv

pyenv activate aiohttp-virtual-env
pyenv deactivate

配置Upstart脚本

若python程序须要通过Upstart启动,则其Upstart脚本可以类似:

# service name
description "service description ..."
respawn
setuid
setgid
env PYENV_ROOT=/home//.pyenv
env PATH=/home//.pyenv/bin:/sbin:/usr/sbin:/bin:/usr/bin
env PYENV_VERSION=
chdir
script
        eval "$(pyenv init -)"
        exec ./
end script
# vim: ts=4 sw=4 sts=4 ft=upstart

# service name
description "service description ..."
respawn
setuid
setgid
env PYENV_ROOT=/home//.pyenv
env PATH=/home//.pyenv/shims:/home//.pyenv/bin:/sbin:/usr/sbin:/bin:/usr/bin
env PYENV_VERSION=
chdir
exec ./
# vim: ts=4 sw=4 sts=4 ft=upstart
  • username为服务运行的用户名,通常为PYENV_ROOT所属用户
  • group为服务运行的组名,通常为PYENV_ROOT所属组。
  • PYENV_VERSION为Python版本号或virtualenv的名字。
  • app dir为Python程序的目录。
  • app为Python程序或启动脚本。

参考

修订历史

  • 2013-10-04:初稿;
  • 2014-10-07:将 Python 依赖包一段的位置提前;
  • 2016-07-30:使用 pyenv-installer 安装;
  • 2016-10-19:中科大 pypi 镜像;
  • 2017-11-24: 增加pyenv-virtualenv 说明和Upstart脚本

计算机中的运算

计算机只认识0和1,计算机能做的运算归根结底也就是直接对0和1做运算(通常称为 位运算)

  1. 与运算

两个位都为1时,结果为1 and(&)

  1. 或运算

只要有一个为1 就是1 or(|)

  1. 异或运算

不一样的时候是1 xor(^)

  1. 非运算(单目运算)

0变1 1变0 not(~)

  1. 左移

各二进制位全部左移若干位,高位丢弃,低位补0 shl(>) 在汇编中shr补0,sar补符号位

计算机中的加减乘除

加法

以下计算假设数据宽度均为一个字节 (8Bit)

不考虑进位的情况异或按位相加的结果类似,所以加法可分为两步

  1. 加数异或运算,获得值
  2. 加数运算。判断是否有进位
  3. 如果计算后为0 说明第一步即为结果,如果不为零则需要把运算后的值左移一位,
  4. 继续重复上述过程 直到不再进位时为最终结果
4+5的运算过程
4 => 0000 0100
5 => 0000 0101
1) 异或
        0000 0100
        0000 0101
    xor ---------
        0000 0001
2) 判断是否有进位 两个加数判断
        0000 0100
        0000 0101
    and ---------
        0000 0100
与运算后并不为0  说明 有进位 此位不为0 因为发生了进位所以要左移一位继续异或
3) 有进位 继续异或 判断需要进位的左移一位,进位操作后继续异或
        0000 0001
        0000 1000
    xor ---------
        0000 1001
4) 判断上一步操作是否进位
        0000 0001
        0000 1000
    and ---------
        0000 0000
结果为零 说明没有任何进位 则上一步结果 0000 1001 为4+5的值
0000 1001 十进制为9  证明计算正确

减法

计算机做减法,就是做加法

4-5 = ?
4-5 = 4+ (-5)
4  => 0000 0100
-5 => 1111 1011
1) 异或
        0000 0100
        1111 1011
    xor ---------
        1111 1111
2) 判断是否有进位 两个加数判断
        0000 0100
        1111 1011
    and ---------
        0000 0000
结果为零 说明没有任何进位 则上一步结果 1111 1111 为4+(-5)的值
1111 1111 十进制为-1  证明计算正确

乘法

X * Y 本质为 Y 个 X 相加

除法

X / Y 本质为减法 Y 一共能减去多少次Y

进制和内存

数据宽度

因为计算机受硬件制约,数据都是有长度限制的(数据宽度),超过最多宽度的数据会被丢弃

计算机中常见的数据宽度:

  1. 位(BIT) -> 一个0或1
  2. 字节(BYTE) =8位 范围 0-> FF
  3. 字(Word) = 16位 0->FFFF
  4. 双字(DoubleWord) = 32位 0-FFFFFFFF

超过范围的数会被丢弃

有符号数和无符号数

有符号数还是无符号数是个人约定的

无符号数规则

本身是什么,那么内存中就存什么,也就是本身的绝对值

有符号数规则

如果最高位是0 那么是正数,编码规则跟无符号数一样
如果最高位是1 这个数就是负数,编码规则往下看

有符号数 编码规则

规则 正数 负数
原码 最高位为符号位,其余各位为数值本身的绝对值
反码 反码与原码相同 符号位为1,其余位对原码取反
补码 补码与原码相同 符号位为1,其余位对原码取反加1

举例: (数据宽度 8bit 1字节)

10进制数 原码 反码 补码
1 0000 0001 0000 0001 0000 0001
-1 1000 0001 1111 1110 1111 1111
-7 1000 0111 1111 1000 1111 1001

正数原码存储,负数补码存储

家里没公网ip的新选择

我的就没有。。。

我办理的联通的宽带,但是小区木有联通宽带 然后给弄的华数宽带

后来我发现华数宽带可以—多拨。。上下行都叠加

但是还是没有公网ip。我家里有个gen8服务器,直接装了dsm

于是找了个所谓ipv4的玩意

然后把盒子wan扣连接到路由器 lan口插到gen8的dsm上。设置双网口

跑了docker

dsm 6.x 可以用虚拟机 就跑了个arch

用上面docker中的harpoxy炮三层tcp代理,就可以在办公室远程连接arch了

dsm还有个web station 可以直接跑php

我的小博客就是跑在这个上面的https://luodaoyi.com

因为ip是国内的 所以必须要beian

还有。。。
Let’s Encrypt 也可以直接申请证书了。。因为80 443都可以用了