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

 更新时间:2026年04月28日 08:28:48   作者:杨瀚博  
这篇文章主要为大家详细介绍了linux宝塔面板使用API实现自动部署更新文件的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下

1. 背景

服务器使用宝塔面板管理服务器,服务器上部署了两个动态 网站和一个静态网站.网站不多,没有必要上流水线.每次都要经历一个繁琐的过程,并且都是手动操作,极容易出错.目前三个站点更新大体步骤如下:

  1. 停用管理端和移动端网站
  2. 编译管理段后端代码
  3. 编译移动端后端代码
  4. 编译管理端前端代码
  5. 上传管理段后端编译文件
  6. 上传移动端后端编译文件
  7. 压缩前端编译文件,并上传压缩文件
  8. 解压前端编译文件
  9. 启用管理端网站
  10. 启用移动端网站

一次两次更新还好,多网站,多频次更新,还是需要一个简单脚本实现自动化更新部署.

2. 开启API访问

登录宝塔面板,找到设置/面板设置>API接口,点击API接口配置获取接口密钥,以及配置IP白名单.配置图如下

3. 访问签名处理

访问接口时,需要添加签名参数,签名参数生成规是 token: md5(str(时间戳) + 密钥MD5),Python实现代码如下

# 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所有的请求都需要带上签名信息,我们这里对访问的接口 做一个统一的封装,使调用接口只关心业务参数,对一封装代码如下

# 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. 文件解压

文件解压接口,根据文件上传的路径,调用文件解压接口,实现文件解压功能,以及删除解压完成的zip文件,核心代码如下

# remote_zip 是服务上传的zip文件路径
# web_site_path 是网站解压路径
# 公众号: 小满小慢
 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. 停用启用网站

文件部署完成后,针对后端的任务,如果没有开启热启动,这里我们需要先获取站点信息,然后停用网站,再启动网站

获取网站信息

# 公众号: 小满小慢
# 返回信息说明: name 网站名称 path 网站路径 site_id 网站ID
sites_result = api._post('/data?action=getData', {
  'table': 'sites',
  'limit': 1000
})

停用网站

stop_result = api._post('/site?action=SiteStop', {
    'id': site_id,
    'name': site_name
})

启动网站

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
获取网站列表/data?action=getDataPOST
停用网站/site?action=SiteStopPOST
启用网站/site?action=SiteStartPOST

到此这篇关于linux宝塔面板使用API自动部署更新文件的完整指南的文章就介绍到这了,更多相关linux宝塔面板管理服务器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Ubuntu/Debian 自有软件包构建私有源详解

    Ubuntu/Debian 自有软件包构建私有源详解

    这篇文章主要介绍了Ubuntu/Debian 自有软件包构建私有源详解的相关资料,这里介绍详细步骤,需要的朋友可以参考下
    2016-11-11
  • Linux操作系统之逻辑卷管理LVM详解

    Linux操作系统之逻辑卷管理LVM详解

    文章介绍了Linux系统中的逻辑卷管理(LVM)技术,包括LVM的基本概念、卷类型(线性卷、条带卷)、操作(创建物理卷、卷组、逻辑卷,挂载等)和扩容等方法,以及常用命令总结,Lvm提供灵活的的存储管理方式,适用于需要动态扩展存储空间的场景
    2026-04-04
  • ubuntu16.04搭建nfs服务的方法

    ubuntu16.04搭建nfs服务的方法

    今天小编就为大家分享一篇关于ubuntu16.04搭建nfs服务的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • ubuntu 16.04 LTS 安装mongodb 3.2.8教程

    ubuntu 16.04 LTS 安装mongodb 3.2.8教程

    本篇文章主要介绍了ubuntu 16.04 LTS 安装mongodb 3.2.8教程,具有一定的参考价值,有需要的可以了解一下。
    2017-04-04
  • CentOS 7.2 安装MariaDB详细过程

    CentOS 7.2 安装MariaDB详细过程

    这篇文章主要为大家介绍了CentOS 7.2 安装MariaDBMariaDB数据库管理系统详细过程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • Linux文件操作实战之压缩,远程传输和终端计算速成

    Linux文件操作实战之压缩,远程传输和终端计算速成

    Linux终端操作是运维、开发必备基础,日常工作与面试均高频涉及,本文以实操为核心,讲解tar、scp、bc指令用法,补充面试题与热键,结合故事拆解Shell与内核交互逻辑,感兴趣的小伙伴可以了解下
    2026-01-01
  • Linux权限控制命令chmod、chown和chgrp的使用

    Linux权限控制命令chmod、chown和chgrp的使用

    这篇文章主要介绍了Linux权限控制命令chmod、chown和chgrp的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-07-07
  • Linux服务器挂载新硬盘方式

    Linux服务器挂载新硬盘方式

    本文详细记录了在一台主机上插上一块8T硬盘后遇到的问题及解决过程,初始问题包括无法重启和/etc/fstab文件配置错误,通过手动挂载、查看文件系统类型以及系统日志,最终确定是插槽顺序问题导致硬盘名称混乱,通过调整/etc/fstab文件中的挂载分区和文件系统类型
    2025-02-02
  • Linux如何设置java.library.path

    Linux如何设置java.library.path

    这篇文章主要介绍了Linux如何设置java.library.path问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • linux系统下定时执行php脚本的方法

    linux系统下定时执行php脚本的方法

    网站运营过程中,经常会遇到需要定时执行php脚本的情况,下面这篇文章主要介绍了linux系统下定时执行php脚本的方法,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-01-01

最新评论