最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

linux寶塔面板使用API自動部署更新文件的完整指南

 更新時間:2026年04月28日 08:28:48   作者:楊瀚博  
這篇文章主要為大家詳細介紹了linux寶塔面板使用API實現(xiàn)自動部署更新文件的相關方法,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下

1. 背景

服務器使用寶塔面板管理服務器,服務器上部署了兩個動態(tài) 網(wǎng)站和一個靜態(tài)網(wǎng)站.網(wǎng)站不多,沒有必要上流水線.每次都要經(jīng)歷一個繁瑣的過程,并且都是手動操作,極容易出錯.目前三個站點更新大體步驟如下:

  1. 停用管理端和移動端網(wǎng)站
  2. 編譯管理段后端代碼
  3. 編譯移動端后端代碼
  4. 編譯管理端前端代碼
  5. 上傳管理段后端編譯文件
  6. 上傳移動端后端編譯文件
  7. 壓縮前端編譯文件,并上傳壓縮文件
  8. 解壓前端編譯文件
  9. 啟用管理端網(wǎng)站
  10. 啟用移動端網(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=GetNetWorkPOST
文件上傳/files?action=uploadPOST
文件解壓/files?action=UnZipPOST
刪除文件/files?action=DeleteFilePOST
獲取網(wǎng)站列表/data?action=getDataPOST
停用網(wǎng)站/site?action=SiteStopPOST
啟用網(wǎng)站/site?action=SiteStartPOST

到此這篇關于linux寶塔面板使用API自動部署更新文件的完整指南的文章就介紹到這了,更多相關linux寶塔面板管理服務器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

彰化县| 郓城县| 菏泽市| 裕民县| 贡觉县| 大竹县| 连州市| 灵丘县| 凤凰县| 外汇| 那曲县| 安溪县| 绵竹市| 德惠市| 望江县| 定日县| 翼城县| 增城市| 凌源市| 西贡区| 常宁市| 新乐市| 从江县| 云龙县| 呼伦贝尔市| 青河县| 林口县| 万荣县| 田阳县| 平武县| 渑池县| 吉首市| 岐山县| 定襄县| 米脂县| 辽源市| 团风县| 德钦县| 洛宁县| 神池县| 郴州市|