linux寶塔面板使用API自動部署更新文件的完整指南
1. 背景
服務器使用寶塔面板管理服務器,服務器上部署了兩個動態(tài) 網(wǎng)站和一個靜態(tài)網(wǎng)站.網(wǎng)站不多,沒有必要上流水線.每次都要經(jīng)歷一個繁瑣的過程,并且都是手動操作,極容易出錯.目前三個站點更新大體步驟如下:
- 停用管理端和移動端網(wǎng)站
- 編譯管理段后端代碼
- 編譯移動端后端代碼
- 編譯管理端前端代碼
- 上傳管理段后端編譯文件
- 上傳移動端后端編譯文件
- 壓縮前端編譯文件,并上傳壓縮文件
- 解壓前端編譯文件
- 啟用管理端網(wǎng)站
- 啟用移動端網(wǎng)站
一次兩次更新還好,多網(wǎng)站,多頻次更新,還是需要一個簡單腳本實現(xiàn)自動化更新部署.
2. 開啟API訪問
登錄寶塔面板,找到設置/面板設置>API接口,點擊API接口配置獲取接口密鑰,以及配置IP白名單.配置圖如下

3. 訪問簽名處理
訪問接口時,需要添加簽名參數(shù),簽名參數(shù)生成規(guī)是 token: md5(str(時間戳) + 密鑰MD5),Python實現(xiàn)代碼如下
# self.api_key 是在接口配置獲取的接口密鑰
# 公眾號: 小滿小慢
def _generate_sign(self) -> dict:
now_time = int(time.time())
api_key_md5 = hashlib.md5(self.api_key.encode()).hexdigest()
token_str = str(now_time) + api_key_md5
token = hashlib.md5(token_str.encode()).hexdigest()
return {
'request_token': token,
'request_time': now_time
}4. 通用請求處理
API所有的請求都需要帶上簽名信息,我們這里對訪問的接口 做一個統(tǒng)一的封裝,使調(diào)用接口只關心業(yè)務參數(shù),對一封裝代碼如下
# self.panel_url 配置的寶塔面板地址
# 公眾號: 小滿小慢
def _post(self, endpoint: str, data: dict = None) -> dict:
if data is None:
data = {}
sign_params = self._generate_sign()
all_data = {**data, **sign_params}
url = urljoin(self.panel_url, endpoint)
try:
response = requests.post(
url,
data=all_data,
timeout=self.request_timeout,
verify=False
)
response.raise_for_status()
result = response.json()
if result.get('status') == False:
raise Exception(f"地心俠士: API 錯誤: {result.get('msg', '未知錯誤')}")
return result
except requests.exceptions.RequestException as e:
raise Exception(f"地心俠士: 請求失敗: {e}")
5. 文件上傳
文件上傳比較特殊,這里需讀取本地文件,并上傳到服務器指定目錄,這里單獨封成一個方法.
# 公眾號: 小滿小慢
# 小游戲: 地心俠士
def upload_file(self, local_path: str, remote_path: str) -> bool:
try:
file_name = os.path.basename(local_path)
file_size = os.path.getsize(local_path)
remote_dir = os.path.dirname(remote_path)
print(f" 地心俠士 準備上傳: {file_name} ({file_size} bytes) -> {remote_path}")
sign_data = self._generate_sign()
data = {
'f_path': remote_dir,
'f_name': remote_path,
'f_size': file_size,
'f_start': 0,
'request_token': sign_data['request_token'],
'request_time': sign_data['request_time']
}
files = {
'blob': (file_name, open(local_path, 'rb'), 'application/octet-stream')
}
endpoint = '/files?action=upload'
url = urljoin(self.panel_url, endpoint)
headers = {
'Accept': '*/*',
'Accept-Encoding': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive'
}
response = requests.post(
url,
headers=headers,
data=data,
files=files,
timeout=self.request_timeout,
verify=False
)
files['blob'][1].close()
response.raise_for_status()
result = response.json()
if result.get('status') == False:
raise Exception(f"地心俠士 API 錯誤: {result.get('msg', '未知錯誤')}")
print(f" 地心俠士 [成功] 文件上傳完成: {file_name}")
return True
except Exception as e:
print(f" 地心俠士 [錯誤] 文件上傳失敗: {e}")
return False
6. 文件解壓
文件解壓接口,根據(jù)文件上傳的路徑,調(diào)用文件解壓接口,實現(xiàn)文件解壓功能,以及刪除解壓完成的zip文件,核心代碼如下
# remote_zip 是服務上傳的zip文件路徑
# web_site_path 是網(wǎng)站解壓路徑
# 公眾號: 小滿小慢
try:
unzip_result = api._post('/files?action=UnZip', {
'sfile': remote_zip,
'dfile': web_site_path,
'encoding': 'utf-8'
})
if unzip_result.get('status'):
print(f" 地心俠士 [成功] ZIP文件已解壓到: {web_site_path}")
try:
api._post('/files?action=DeleteFile', {
'path': remote_zip
})
print(f" 地心俠士 [成功] 已清理臨時ZIP文件")
except:
pass
else:
print(f" 地心俠士 [警告] 解壓可能有問題: {unzip_result.get('msg', '未知錯誤')}")
print(f" 地心俠士 請手動解壓: {remote_zip} -> {web_site_path}")
7. 停用啟用網(wǎng)站
文件部署完成后,針對后端的任務,如果沒有開啟熱啟動,這里我們需要先獲取站點信息,然后停用網(wǎng)站,再啟動網(wǎng)站
獲取網(wǎng)站信息
# 公眾號: 小滿小慢
# 返回信息說明: name 網(wǎng)站名稱 path 網(wǎng)站路徑 site_id 網(wǎng)站ID
sites_result = api._post('/data?action=getData', {
'table': 'sites',
'limit': 1000
})
停用網(wǎng)站
stop_result = api._post('/site?action=SiteStop', {
'id': site_id,
'name': site_name
})
啟動網(wǎng)站
start_result = api._post('/site?action=SiteStart', {
'id': site_id,
'name': site_name
})
8. 總結
使用腳本自動化部署,最重要的好處就是在腳本編寫完成后,完全解放雙手,并且不易出錯,當然也得做好備份.目前寶塔的API信息不多,當前部署需要的api信息匯總如下
| 功能 | 接口地址 | 方法 |
|---|---|---|
| 測試連接 | /system?action=GetNetWork | POST |
| 文件上傳 | /files?action=upload | POST |
| 文件解壓 | /files?action=UnZip | POST |
| 刪除文件 | /files?action=DeleteFile | POST |
| 獲取網(wǎng)站列表 | /data?action=getData | POST |
| 停用網(wǎng)站 | /site?action=SiteStop | POST |
| 啟用網(wǎng)站 | /site?action=SiteStart | POST |
到此這篇關于linux寶塔面板使用API自動部署更新文件的完整指南的文章就介紹到這了,更多相關linux寶塔面板管理服務器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
詳細介紹linux動態(tài)網(wǎng)絡和靜態(tài)網(wǎng)絡和克隆后的網(wǎng)絡配置
這篇文章主要介紹了詳細介紹linux動態(tài)網(wǎng)絡和靜態(tài)網(wǎng)絡和克隆后的網(wǎng)絡配置,具有一定的學習價值,有需要的可以了解一下。2016-11-11
Linux環(huán)境實現(xiàn)替換jar包中class文件
文章介紹了如何通過替換class文件來避免重復打包的問題,具體步驟包括查找目標文件目錄、解壓目標文件、替換已解壓文件、替換jar包文件等2025-11-11
Linux環(huán)境下python2.7.6升級python3.5.2
本篇文章主要介紹了centos7下python2.7.5升級到3.5.2,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04
虛擬機Centos7環(huán)境下實現(xiàn)安裝wget方式
wget是一款支持HTTP/HTTPS/FTP的下載工具,可后臺運行,若虛擬機Linux缺少wget,可通過刪除舊版本、下載并安裝rpm包解決,最后驗證安裝是否成功2025-07-07

