雲主機上運作 nps
建立映射目錄
mkdir -p ~/docker/nps/config
拉取鏡像
docker pull oldiy/nps-server
運作容器
建立容器
docker run -d --name nps --net=host -v /root/docker/nps/config:/nps/conf oldiy/nps-server
現在 nps 已經開始運作了。
停止運作容器
docker stop nps
為什麼這裡要停止運作呢?
因為這時候在 config 目錄下已經生成了一些配置檔案,考慮到安全性,我們需要做一些改動。
修改配置
vim /root/docker/nps/config/nps.conf
打開後重點關注下面這幾項:
...
bridge_port=8024 # 用戶端連接配接端口
...
web_username=admin # 背景管理使用者名
web_password=123 # 背景管理密碼
web_port = 8080 # 背景管理端口
...
以上是預設的配置,建議改掉。
啟動容器
docker start nps
現在可以在網頁端通路 <ip_addr>:<web_port>,并通過使用者名 <web_username> 和密碼 <web_password> 登入背景管理界面了。
能夠成功通路後,繼續下面的步驟。
添加用戶端
點選左側菜單欄的 用戶端 選項,再點選新增。
設定一個 用戶端驗證密鑰,這裡可以随便填。壓縮、加密願意的話也可以選 yes。
設定好後點選 新增 即可。
留意一下這裡的 id 和 vkey。
本地機上運作 npc
本地機建議選擇一台 7*24 小時運作的裝置,一般是路由器或者 NAS ,我這裡就選擇群晖了,DSM 有很好用的 docker 圖形化管理套件,是以下面用圖形化界面示範如何部署 npc 。
拉取鏡像
點選菜單欄中的系統資料庫,搜尋 npc-client,下載下傳第一個就行。
建立容器
點選菜單欄中的映像,找到下載下傳好的npc,啟動。
在進階設定->網絡中注意勾選使用與 Docker Host 相同的網絡。
再到進階設定->環境中修改兩個環境變量:
-
SERVERIP
對應雲主機的 <ip>:<bridge_port>
-
VKEY
對應上面添加過的用戶端的 vkey
接着一路點選 應用,啟動容器即可。
這時候在 nps 背景可以看到用戶端已經線上。
背景配置 nps
前面部署 nps 時候已經配置了一部分了,接下來要配置的就是具體需要穿透的端口了。
添加 tcp 隧道
這裡舉例配置一下 Jellyfin 的 http 端口 8096。
進入 nps 背景管理,點選左側菜單欄的 用戶端 選項,再點選新增。
-
類型
這裡選 tcp 不用動它。
-
備注
随便填,友善自己記就行。
-
伺服器端口
指外放通路端口,我這裡跟 Jellyfin 内網一緻了,這裡隻是為了示範用預設,等下就會改掉。
-
目标
指内網對應服務的位址和端口。
-
用戶端 id
就是上面我說了要留意一下的 id,我這裡是 3。
然後點選 新增。
這樣一條隧道就添加好了。
至此内網穿透算是部署好了。
嘗試通路一下 Jellyfin。
容器保活
有時候運作的容器會自己挂掉,雖然不經常發生,但是偶爾來一次,遇上剛好要用的時候就很煩人。
下載下傳示範我在服務端如何讓容器保活的,方法比較粗暴但有效。
建立目錄
建立目錄來存放腳本和日志檔案。
mkdir -p /root/docker/nps/script
mkdir -p /root/docker/nps/log
擷取容器 ID
docker ps -q --no-trunc
會得到一長串 ID,記下來 <nps_id>。
如果你傳回了多個 ID,那你應該知道要怎麼區分那個是 nps 的。
keepActive.sh
建立 bash 腳本,放到 /root/docker/nps/script/keepActive.sh
#!/bin/bash
cur=$(cd $(dirname $0); pwd -P)
log="$cur/../log/log"
a=$(docker ps -q --no-trunc | grep '<nps_id>') # 這裡其實就是去比對看看目前運作中的容器有沒有nps,<nps_id>改成上一步擷取到的。
if [[ "_$a" == "_" ]]; then
docker restart nps # 第一次重新開機 nps
if [[ $? == 0 ]]; then
echo "Revive $(date +'%F %T')" >> $log
else
echo "Failed $(date +'%F %T')" >> $log
systemctl restart docker.service # 重新開機失敗大機率是 docker 服務挂了,這裡重新開機服務
docker restart nps
echo "Restart $(date +'%F %T')" >> $log
fi
else
echo "Active $(date +'%F %T')" >> $log
fi
如果是服務 docker 挂了,且重新開機失敗,那就不是保不保活的問題了,登上伺服器檢查吧。
crontab.set
建立一個 crontab.set,用來配置定時任務。這個檔案就随便放了,一次性的。
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
* * * * * /root/docker/nps/script/keepActive.sh
接着運作:
crontab crontab.set
這裡是配置一分鐘運作一次 keepActive.sh 腳本,是以如果 nps 挂了,一分鐘内它就會重新開機了。
如果你還配置了其他的定時任務,那你應該知道怎麼設定 crontab,别把以前配置的任務給覆寫了。