
生成式AI API架构最佳实践:构建高性能、安全可控的智能服务
随着家庭和中小型企业对数据存储需求的不断增长,NAS(Network Attached Storage,网络附加存储)设备因其高性价比、易管理性和丰富的功能在各类场景中广受欢迎。尤其是支持开放API接口的NAS,更能让开发者和系统管理员灵活地将存储设备与自动化、监控、备份等体系深度集成。本文将基于 Synology DSM(DiskStation Manager)API,全面解析三大关键能力:远程文件管理、用户权限配置与自动备份。
在传统的文件服务器架构中,管理员需要通过文件共享协议(如 SMB、NFS)手动分配权限,往往效率低、易出错。现代NAS设备不仅提供友好的Web界面,更开放了丰富的RESTful API,让我们可以通过脚本或程序自动化完成:
结合本文演示示例,你将掌握如何使用 DSM API 构建:
Synology DSM 提供一整套基于 HTTP/HTTPS 的 RESTful 接口,官方称为 Synology API。它涵盖:
sid
)调用流程通常分为两步:
/webapi/auth.cgi
发送账号密码换取 sid
sid
,并指明所用 API 与方法所有请求均以 GET
或 POST
方式提交,返回 JSON 格式数据。
curl -k -X GET 'https:// < nas-ip > :5001/webapi/auth.cgi' \
-d 'api=SYNO.API.Auth&method=login&version=6' \
-d 'account=admin&passwd=YourPassword&session=FileStation&format=sid'
FileStation
响应示例:
{
"success": true,
"data": { "sid": "xxx_your_session_id_xxx" }
}
curl -k -X GET 'https:// < nas-ip > :5001/webapi/entry.cgi' \
-d 'api=SYNO.FileStation.List&version=2&method=list_share' \
-d 'sid=xxx_your_session_id_xxx'
list_share
:列举所有共享文件夹若需列出指定路径的子目录与文件:
curl -k -X GET 'https:// < nas-ip > :5001/webapi/entry.cgi' \
-d 'api=SYNO.FileStation.List&version=2&method=list' \
-d 'folder_path=/home/user' \
-d 'additional=["size","time","owner","perm"]' \
-d 'sid=xxx_your_session_id_xxx'
上传
curl -k -X POST 'https:// < nas-ip > :5001/webapi/entry.cgi' \
-F 'api=SYNO.FileStation.Upload&version=2&method=upload' \
-F 'path=/home/user/uploads' \
-F 'create_parents=true' \
-F 'file=@local_file.txt' \
-F 'sid=xxx_your_session_id_xxx'
create_parents=true
可在目标路径不存在时自动创建父目录。
下载
curl -k -X GET 'https:// < nas-ip > :5001/webapi/entry.cgi' \
-d 'api=SYNO.FileStation.Download&version=2&method=download' \
-d 'path=/home/user/uploads/local_file.txt' \
-d 'mode=open' \
-d 'sid=xxx_your_session_id_xxx' \
--output ./downloaded_file.txt
移动
curl -k -X POST 'https:// < nas-ip > :5001/webapi/entry.cgi' \
-d 'api=SYNO.FileStation.CopyMove&version=3&method=move' \
-d 'path=["/source/path"]' \
-d 'dest_folder_path=/target/path' \
-d 'sid=xxx_your_session_id_xxx'
method=move
改为 method=copy
删除
curl -k -X POST 'https:// < nas-ip > :5001/webapi/entry.cgi' \
-d 'api=SYNO.FileStation.Delete&version=1&method=delete' \
-d 'path=["/target/path"]' \
-d 'sid=xxx_your_session_id_xxx'
在企业或团队协作场景中,细粒度的权限控制至关重要。DSM 支持两种维度的权限:
下文将结合字幕演示与 API 接口解析,逐步完成权限配置。
0:40–2:49
- Control Panel → User & Group → Create
- 输入用户名、描述、邮箱、随机密码
- 配置通知邮件、密码重置链接及过期设置
- 选择是否允许用户更改密码
- 将用户加入某一组(同组成员共享相同权限设定)
- 配置共享文件夹访问权限:
No Access
、Read Only
、Read/Write
- 配置应用访问权限、传输速度限制
- 点击Done完成创建
创建用户
curl -k -X POST 'https:// < nas-ip > :5001/webapi/entry.cgi' \
-d 'api=SYNO.Core.User&method=create&version=1' \
-d 'name=newuser&passwd=RandomPass123' \
-d 'email=user@example.com&description="Project member"' \
-d 'force_pw_change=false' \
-d 'groups=["users","designers"]' \
-d 'sid=xxx'
设置共享文件夹权限
curl -k -X POST 'https:// < nas-ip > :5001/webapi/entry.cgi' \
-d 'api=SYNO.Core.Share&method=perm&version=1' \
-d 'folder_path=/projects' \
-d 'share_name=projects' \
-d 'user=newuser' \
-d 'rights=R' # R / RW / no
-d 'sid=xxx'
字幕中示例演示了在 File Station 中针对子文件夹 “Cafe Mori” 应用 ACL,将普通设计师设为只读,将特定用户 Forrest 设为读写。
3:01–5:03
- File Station → 右键文件夹 → Properties → Permission → Create
- 对其他用户/组设置
Type = Deny
、Permission = Write
- 自定义权限会覆盖继承权限
列举当前 ACL
curl -k -X GET 'https:// < nas-ip > :5001/webapi/entry.cgi' \
-d 'api=SYNO.FileStation.Acl&method=get&version=2' \
-d 'path=/projects/Cafe Mori' \
-d 'sid=xxx'
添加自定义 ACL 条目
curl -k -X POST 'https:// < nas-ip > :5001/webapi/entry.cgi' \
-F 'api=SYNO.FileStation.Acl&method=set&version=2' \
-F 'path=/projects/Cafe Mori' \
-F 'add_list=[{"user":"designerA","type":"deny","permission":"write"},{"user":"designerB","type":"deny","permission":"write"}]' \
-F 'sid=xxx'
清除自定义 ACL
curl -k -X POST 'https:// < nas-ip > :5001/webapi/entry.cgi' \
-d 'api=SYNO.FileStation.Acl&method=remove&version=2' \
-d 'path=/projects/Cafe Mori' \
-d 'remove_list=["designerA","designerB"]' \
-d 'sid=xxx'
通过以上接口,你可以在脚本中批量调整文件夹或文件的读写/执行/删除等权限,满足多用户协作场景下的细粒度安全需求。
数据安全不仅需要权限管控,还要定期备份以防误删或硬件故障。DSM 提供 Hyper Backup 与 Snapshot Replication 两大备份体系。以下示例聚焦于常见的 Hyper Backup 备份任务创建。
以备份到本地共享文件夹为例:
curl -k -X POST 'https:// < nas-ip > :5001/webapi/entry.cgi' \
-d 'api=SYNO.Backup.Task&method=create&version=1' \
-d 'name=DailyBackup' \
-d 'backup_destination_type=local' \
-d 'backup_destination_path=/home/backup/daily' \
-d 'source=["/projects","/home/user"]' \
-d 'schedule_type=day&schedule_time=02:00' \
-d 'rotation=&keep_snapshot=false' \
-d 'sid=xxx'
local
、远程 rsync、云端方案等hour
、day
、week
等curl -k -X GET 'https:// < nas-ip > :5001/webapi/entry.cgi' \
-d 'api=SYNO.Backup.Task&method=list&version=1' \
-d 'sid=xxx'
响应中 last_status
、last_finish_time
、error
字段可用于监控和告警集成。
下面提供一个简化版 Python 示例,展示如何:
import requests
NAS_URL = 'https://nas.example.com:5001'
USERNAME = 'admin'
PASSWORD = 'YourPassword'
def auth():
params = {
'api': 'SYNO.API.Auth',
'version': 6,
'method': 'login',
'account': USERNAME,
'passwd': PASSWORD,
'session': 'FileStation',
'format': 'sid'
}
r = requests.get(f'{NAS_URL}/webapi/auth.cgi', params=params, verify=False)
data = r.json()['data']
return data['sid']
def create_user(sid, user, passwd, groups):
data = {
'api': 'SYNO.Core.User',
'version': 1,
'method': 'create',
'name': user,
'passwd': passwd,
'force_pw_change': 'false',
'groups': str(groups).replace("'", '"'),
'sid': sid
}
r = requests.post(f'{NAS_URL}/webapi/entry.cgi', data=data, verify=False)
return r.json()
def set_share_perm(sid, folder, user, rights):
data = {
'api': 'SYNO.Core.Share',
'version': 1,
'method': 'perm',
'share_name': folder,
'user': user,
'rights': rights,
'sid': sid
}
r = requests.post(f'{NAS_URL}/webapi/entry.cgi', data=data, verify=False)
return r.json()
def set_acl(sid, path, acl_list):
files = {
'api': 'SYNO.FileStation.Acl',
'version': 2,
'method': 'set',
'path': path,
'add_list': str(acl_list).replace("'", '"'),
'sid': sid
}
r = requests.post(f'{NAS_URL}/webapi/entry.cgi', data=files, verify=False)
return r.json()
if __name__ == '__main__':
sid = auth()
# 创建用户
print(create_user(sid, 'forrest', 'SecurePass!', ['designers']))
# 赋予 projects 共享文件夹读写
print(set_share_perm(sid, 'projects', 'forrest', 'RW'))
# 对其他设计师禁止写入 Cafe Mori
acl_list = [
{'user':'designerA','type':'deny','permission':'write'},
{'user':'designerB','type':'deny','permission':'write'}
]
print(set_acl(sid, '/projects/Cafe Mori', acl_list))
sid
并监控其过期状态。multiple
参数)可提升效率。通过本文,你已掌握基于 DSM API 的三大核心能力:
这些接口可帮助你将 NAS 深度集成到自动化运维、持续交付、企业协作等场景中,实现高效、安全、可扩展的存储管理解决方案。希望本文能为你的 NAS API 开发提供清晰指导,助力构建更智能的存储与备份体系!
原文引自YouTube视频:https://www.youtube.com/watch?v=LihsU5hHm3k