当前位置: 首页 > news >正文

linux宝塔面板使用API自动部署更新文件

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

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
http://www.jsqmd.com/news/1070256/

相关文章:

  • MobaXterm中文版:Windows远程管理的终极一体化解决方案,告别繁琐工具切换!
  • AI工具学生认证失败率高达68%?资深教育技术官亲授5类高危错误+3种备用验证路径,错过再等半年
  • 无纺布裁切边缘整齐,使用CO2激光高效加工
  • 三步搞定微信聊天记录永久备份:免费开源工具完整指南
  • 立宏安全> LMC3-50 RFID安全门开关> 安全联锁开关 > 磁感应开关
  • 商铺小流量用气,罗茨流量计为什么更合适?
  • 如何快速打造你的专属开源输入法:四叶草拼音完全指南
  • 解析AI搜索获客适合谁,看GEO优化布局与实际场景匹配
  • 2026 企业智能体开发平台全景评测:八大主流平台横向对比
  • 今天不整合AI工具,明天就掉出核心供应商名录:制造业Tier-1厂商强制AI接入倒计时启动
  • 我教这个龙虾学会抢微信红包: QClaw说我帮你搞定语音提醒 !
  • 安得卫士新一代综合数据安全解决方案:为企业数据构筑全生命周期防线
  • GitHub Desktop中文汉化终极指南:3分钟打造完美中文界面
  • TTS模型选型避坑指南:实测17款AI语音引擎在儿童/老年/方言场景下的WER误差率对比(附开源测试集)
  • AI驱动的元宇宙数字人量产流水线(含完整Prompt Engineering SOP+Unity XR Pipeline配置包)
  • while与do-while循环总结
  • 牛客网热度最高|一线大厂Java面试八股文(完整版·面面俱到)
  • 发现本地AI虚拟主播技术框架:Neuro项目的架构设计与实施实践方案
  • Citra模拟器完整教程:5个简单步骤让3DS游戏在PC上流畅运行
  • 什么是仪表盘思维?为什么你的决策需要数据导航?
  • 大麦抢票神器:3分钟搭建全自动抢票系统,告别手慢无烦恼
  • FPGA 图像系统多时钟域设计方案总结
  • 123云盘终极解锁方案:三步实现完整会员特权免费获取
  • 固化地坪和环氧地坪都适用于哪里
  • 如何免费解锁《鸣潮》完整游戏体验:Wuwa-Mod模组开发终极指南
  • AI时代的To B PMF,已经死了吗?
  • 审批流动态决策:JVS-Logic替代硬编码实现业务规则热更新
  • 模型并行调度性能与低配浏览器稳定性完整实测分析
  • OpenCore Simplify:5分钟完成黑苹果EFI配置的智能自动化解决方案
  • DL/T 2041-2025分布式光伏承载力评估导则技术解读与园区选型实践