Skip to content

Commit

Permalink
upgrade asktable sdk merged
Browse files Browse the repository at this point in the history
  • Loading branch information
leleboys committed Nov 13, 2024
1 parent 653dc72 commit f89e33a
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 67 deletions.
82 changes: 36 additions & 46 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,87 +20,77 @@ AskTable Secure Tunnel (ATST) 是 [AskTable](https://asktable.com) 团队开发
5. 服务器配置:不低于 2核 4G内存(不需要磁盘)


### 2.1 下载 ATST 镜像
### 2.1 获取 ATST_ID

[[AskTable 应用](https://cloud.asktable.com/)中创建或选择安全隧道,使用它的ID(以`atst_`打头)。


### 2.2 下载 ATST 镜像

您可以通过以下命令下载 ATST Docker 镜像

```bash
docker pull datamini/asktable-secure-tunnel
```

### 2.2 使用方法
### 2.3 启动 ATST 容器

启动 ATST 服务前,您需要一个唯一的 `Secure Tunnel ID(securetunnel_id)`来标识和启动您的 ATST:

1. 创建 `securetunnel_id`
其中 `<asktable_token>` 是AskTable分配给您的Token,可联系 `[email protected]` 获取。
```bash
docker run --rm -e ASKTABLE_TOKEN=<asktable_token> datamini/asktable-secure-tunnel create-id
```
此命令将返回一个 `securetunnel_id`,请妥善保存此 ID,因为它是您当前 ATST 的唯一标识。

```bash
docker run -d -P -e API_KEY=<API_KEY> -e ATST_ID=<ATST_ID> datamini/asktable-secure-tunnel
```

2. 启动 ATST 服务:
```bash
docker run -d -P -e ASKTABLE_TOKEN=<asktable_token> -e SECURETUNNEL_ID=<securetunnel_id> datamini/asktable-secure-tunnel
```
说明:
- ASKTABLE_TOKEN: AskTable 服务的 API Token。
- 参数 `-e SECURETUNNEL_ID=<securetunnel_id>` 可选:用于指定当前 ATST 的 ID。若未指定,则自动创建一个,但不建议这样,因为一旦重启,可能会影响数据通信。
- 端口 `1260`:ATST 内置了一个Web监控页面,以1260端口运行,您可以在 `Docker` 运行时添加 `-P``-p` 参数将端口暴露出来,以便于通过浏览器访问该监控页面。
- 参数 `-e API_KEY=<API_KEY>`:AskTable 服务的 API API_KEY,在[AskTable 应用](https://cloud.asktable.com/)中获取。
- 参数 `-e ATST_ID=<ATST_ID>` 该容器对应的安全隧道的 ID,

启动后,ATST 将自动从 AskTable 获取配置信息并开始运行,同时定期自动更新。一个 ATST 可以共享给多个数据源使用。

### 2.3 环境变量配置

### 2.4 添加数据源的时候绑定 ATST

要让 AskTable 通过 ATST 访问您的内部数据源,您需要在添加数据源的时候绑定 `ATST_ID`

## 3. 注册数据源

要让 AskTable 通过 ATST 访问您的内部数据源,您需要注册数据源并指定 `securetunnel_id`
如果使用 Python SDK 注册数据源,请在创建DataSource的时候,在access_config中增加`securetunnel_id`字段,并设置为您的`ATST_ID`

```python
from asktable import AskTable
at = AskTable()
at.datasources.register(
engine='mysql',
access_config={
'host': '10.1.2.3', 'port': 3306, 'user': 'xx', 'password': 'xx',
'securetunnel_id': 'xxx'
}
)
```
在 access_config 配置信息中增加 `securetunnel_id` 字段,将其设置为您的 `securetunnel_id`,从而使 AskTable 能够通过 ATST 访问您的数据源。更多信息请参考:[AskTable Python Library](https://pypi.org/project/asktable/).
请参考 [AskTable Python SDK](https://github.com/DataMini/asktable-python/blob/main/api.md#datasources) 文档。




## 3. 维护和管理 ATST 服务【非常重要】

## 4. 维护和管理 ATST 服务【非常重要】
3.1 监控页面
ATST 内置了一个Web监控页面,以`1260`端口运行,您可以在 `Docker` 运行时添加 `-P``-p` 参数将端口暴露出来,以便于通过浏览器访问该监控页面。

3.2 重启、升级或迁移
请不要随意关闭 ATST 服务,否则 AskTable 将无法访问您的数据源。

如果需要重启、升级或迁移 ATST 服务,请确保`securetunnel_id`不变,以保证数据源的正常访问。
如果需要重启、升级或迁移 ATST 服务,请确保`ATST_ID`不变,以保证数据源的正常访问。

为了保证`securetunnel_id`的安全性,我们建议您在启动 ATST 服务时使用环境变量来传递`securetunnel_id`,而不是让 ATST 自动生成。
为了保证`ATST_ID`的安全性,我们建议您在启动 ATST 服务时使用环境变量来传递`ATST_ID`,而不是让 ATST 自动生成。


## 5. 高级功能
您可以通过Python SDK 或命令行工具 `asktable` 来获取 ATST 信息。详见:https://pypi.org/project/asktable/
## 4. 高级功能
您可以通过登录 [AskTable 官网](https://cloud.asktable.com/) 或使用 [AskTable Python SDK](https://pypi.org/project/asktable/) 来查看安全隧道的状态。


## 6. 安全和隐私
保持您的 `asktable_token``securetunnel_id` 安全是极其重要的。不要在不安全的地方存储或共享这些信息,以避免未授权访问您的数据源。
## 5. 安全和隐私
保持您的 `API_KEY``ATST_ID` 安全是极其重要的。不要在不安全的地方存储或共享这些信息,以避免未授权访问您的数据源。

## 7. 故障排除
若 ATST 服务遇到任何问题,首先请检查 `asktable_token``securetunnel_id` 是否正确无误,确保您的网络环境允许 ATST 正常访问您的数据库以及 AskTable。
## 6. 故障排除
若 ATST 服务遇到任何问题,首先请检查 `API_KEY``ATST_ID` 是否正确无误,确保您的网络环境允许 ATST 正常访问您的数据库以及 AskTable。

您也可以使用浏览器打开内置的监控页面查看更多信息和配置。

如有更多技术问题,请联系 AskTable 技术支持。

## 8. FAQ
## 7. FAQ

### 8.1 是否可以同时运行多个 ATST 服务?
是的,您可以同时运行多个 ATST 服务,每个服务使用不同的 `securetunnel_id`
### 7.1 是否可以同时运行多个 ATST 服务?
是的,您可以同时运行多个 ATST 服务,每个服务使用不同的 `ATST_ID`

如果使用相同的 `securetunnel_id` 启动,则会报错如下:
如果使用相同的 `ATST_ID` 启动,则会报错如下:

```
start error: proxy [[proxies]] already exists
Expand Down
39 changes: 19 additions & 20 deletions main.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,22 @@
import sys
import subprocess
import logging
import asktable.exceptions
import toml
import time
import threading
from asktable import AskTable
import asktable
from asktable import Asktable
from system import gather_system_info

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

at_api_url = os.getenv('ASKTABLE_API_URL', 'https://api.asktable.com/v1')
at_token = os.getenv('ASKTABLE_TOKEN')
if not at_token:
logging.error("Missing ASKTABLE_TOKEN")
at_api_url = os.getenv('API_URL', 'https://api.asktable.com/v1')
at_api_key = os.getenv('API_KEY')
if not at_api_key:
logging.error("Missing ASKTABLE_API_KEY")
sys.exit(1)

at = AskTable(token=at_token, api_url=at_api_url)
at = Asktable(api_key=at_api_key, api_url=at_api_url)


def create_id():
Expand All @@ -37,7 +37,8 @@ def generate_config_and_send_client_info(st_id):
},
"proxies": []
}
for link in st.links:
links = at.securetunnels.links.list(st_id)
for link in links:
proxy = {
"name": link.id,
"type": "tcp",
Expand Down Expand Up @@ -87,12 +88,12 @@ def monitor_config_and_reload_frpc(
while True:
try:
current_config = generate_config_and_send_client_info(st_id)
except asktable.exceptions.ServerConnectionError:
except asktable.APIConnectionError:
logging.error("Failed to connect to the server. Retrying in 10 seconds.")
time.sleep(10)
continue
except (asktable.exceptions.UnknownServerError, asktable.exceptions.UnknownError) as e:
logging.error(f"Failed to get the configuration: {e}. Retrying in 10 seconds.")
except asktable.APIStatusError as e:
logging.error(f"Another non-200-range status code was received: {e}. Retrying in 10 seconds.")
time.sleep(10)
continue
if current_config != previous_config:
Expand All @@ -107,7 +108,7 @@ def start_atst(st_id):
config_path = "/etc/frpc.toml"
try:
current_config = generate_config_and_send_client_info(st_id)
except asktable.exceptions.ServerConnectionError:
except asktable.APIConnectionError:
logging.error(f"Failed to connect to the AskTable Server: {at_api_url}. Exiting.", exc_info=True)
sys.exit(1)
generate_config_toml(current_config, config_path)
Expand All @@ -124,23 +125,21 @@ def start_atst(st_id):


def main():
masked_token = at_token[:4] + "*" * (len(at_token) - 8) + at_token[-4:]
logging.info(f"Starting ATST Client with AskTable Token {masked_token}")
masked_api_key = at_api_key[:4] + "*" * (len(at_api_key) - 8) + at_api_key[-4:]
logging.info(f"Starting ATST Client with AskTable API Key {masked_api_key}")
if len(sys.argv) > 1 and sys.argv[1] == "create-id":
create_id()
else:
st_id = os.getenv('SECURETUNNEL_ID')

st_id = os.getenv('ATST_ID')
if st_id:
logging.info(f"Using provided Secure Tunnel ID({st_id}) for starting ATST.")
try:
start_atst(st_id)
except asktable.exceptions.SecureTunnelNotFound:
except asktable.NotFoundError:
logging.error(f"Secure Tunnel ID({st_id}) not found. Exiting.")
else:
logging.info(f"Secure Tunnel ID not provided. Creating a new one.")
st_id = create_id()
start_atst(st_id)
logging.error("ATST_ID not provided. Exiting.")
sys.exit(1)


if __name__ == "__main__":
Expand Down
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
asktable==0.20.2
asktable==3.2.0
certifi==2024.2.2
charset-normalizer==3.3.2
idna==3.7
Expand Down

0 comments on commit f89e33a

Please sign in to comment.