101 lines
26 KiB
HTML
101 lines
26 KiB
HTML
<!doctype html><html lang=en dir=ltr><head><meta charset=UTF-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content="
|
|
Configuration Guide
|
|
#
|
|
|
|
SaveAnyBot uses the toml format for its configuration files. You can learn more about toml syntax on the TOML official website.
|
|
SaveAnyBot needs to read a config.toml file in the working directory as its configuration file. If this file is missing, a default file will be created, and the bot will attempt to load configuration from environment variables.
|
|
Here is an example of a minimal configuration file:"><meta name=theme-color media="(prefers-color-scheme: light)" content="#ffffff"><meta name=theme-color media="(prefers-color-scheme: dark)" content="#343a40"><meta name=color-scheme content="light dark"><meta property="og:url" content="https://sabot.unv.app/en/deployment/configuration/"><meta property="og:site_name" content="Save Any Bot"><meta property="og:title" content="Configuration Guide"><meta property="og:description" content="Configuration Guide # SaveAnyBot uses the toml format for its configuration files. You can learn more about toml syntax on the TOML official website.
|
|
SaveAnyBot needs to read a config.toml file in the working directory as its configuration file. If this file is missing, a default file will be created, and the bot will attempt to load configuration from environment variables.
|
|
Here is an example of a minimal configuration file:"><meta property="og:locale" content="en"><meta property="og:type" content="website"><title>Configuration Guide | Save Any Bot</title><link rel=icon href=/favicon.png><link rel=manifest href=/manifest.json><link rel=canonical href=https://sabot.unv.app/en/deployment/configuration/><link rel=alternate hreflang=zh href=https://sabot.unv.app/deployment/configuration/ title=配置说明><link rel=stylesheet href=/book.min.a22f4c7d8c2bdc5e3d6e34ba11cb59ab50ea5772594e71305bfd5a595dc78b7e.css integrity="sha256-oi9MfYwr3F49bjS6EctZq1DqV3JZTnEwW/1aWV3Hi34=" crossorigin=anonymous><link rel=alternate type=application/rss+xml href=https://sabot.unv.app/en/deployment/configuration/index.xml title="Save Any Bot"></head><body dir=ltr><input type=checkbox class="hidden toggle" id=menu-control>
|
|
<input type=checkbox class="hidden toggle" id=toc-control><main class="container flex"><aside class=book-menu><div class=book-menu-content><nav><h2 class=book-brand><a class="flex align-center" href=/en/><img src=/logo.png alt=Logo class=book-icon><span>Save Any Bot</span></a></h2><ul class=book-languages><li><input type=checkbox id=languages class=toggle>
|
|
<label for=languages class=flex><a role=button class="flex flex-auto"><img src=/svg/translate.svg class=book-icon alt=Languages>
|
|
English</a></label><ul><li><a href=/deployment/configuration/>简体中文</a></li></ul></li></ul><ul><li><a href=https://github.com/krau/SaveAny-Bot target=_blank rel=noopener>🔗 GitHub</a></li></ul><ul><li><span>Deployment Guide</span><ul><li><a href=/en/deployment/configuration/ class=active>Configuration Guide</a><ul><li><a href=/en/deployment/configuration/storages/>Storage Configuration</a></li></ul></li><li><a href=/en/deployment/installation/>Installation and Updates</a></li></ul></li><li><a href=/en/usage/>Usage</a><ul><li><a href=/en/usage/silent/>Silent Mode</a></li><li><a href=/en/usage/rules/>Storage Rules</a></li><li><a href=/en/usage/watch/>Watch Chats</a></li><li><a href=/en/usage/directlinks/>Direct Download Links</a></li><li><a href=/en/usage/aria2/>Aria2 Download</a></li><li><a href=/en/usage/ytdlp/>yt-dlp Video Download</a></li><li><a href=/en/usage/transfer/>Storage Transfer</a></li><li><a href=/en/usage/parsers/>Save Files Outside Telegram</a></li><li><a href=/en/usage/api/>HTTP API</a></li></ul></li><li><a href=/en/help/>Frequently Asked Questions</a><ul></ul></li><li><a href=/en/contribute/>Contributing</a><ul></ul></li></ul></nav><script>(function(){var e=document.querySelector("aside .book-menu-content");addEventListener("beforeunload",function(){localStorage.setItem("menu.scrollTop",e.scrollTop)}),e.scrollTop=localStorage.getItem("menu.scrollTop")})()</script></div></aside><div class=book-page><header class=book-header><div class="flex align-center justify-between"><label for=menu-control><img src=/svg/menu.svg class=book-icon alt=Menu></label><h3>Configuration Guide</h3><label for=toc-control><img src=/svg/toc.svg class=book-icon alt="Table of Contents"></label></div><aside class="hidden clearfix"><nav id=TableOfContents><ul><li><a href=#detailed-configuration>Detailed Configuration</a><ul><li><a href=#global-configuration>Global Configuration</a></li><li><a href=#telegram-configuration>Telegram Configuration</a></li><li><a href=#aria2-configuration>Aria2 Configuration</a></li><li><a href=#storage-endpoints-list>Storage Endpoints List</a></li><li><a href=#user-list>User List</a></li><li><a href=#events>Events</a></li><li><a href=#parsers>Parsers</a></li><li><a href=#miscellaneous>Miscellaneous</a></li></ul></li></ul></nav></aside></header><article class="markdown book-article"><h1 id=configuration-guide>Configuration Guide
|
|
<a class=anchor href=#configuration-guide>#</a></h1><p>SaveAnyBot uses the toml format for its configuration files. You can learn more about toml syntax on the <a href=https://toml.io/>TOML official website</a>.</p><p>SaveAnyBot needs to read a <code>config.toml</code> file in the working directory as its configuration file. If this file is missing, a default file will be created, and the bot will attempt to load configuration from environment variables.</p><p>Here is an example of a minimal configuration file:</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-toml data-lang=toml><span style=display:flex><span>[<span style=color:#a6e22e>telegram</span>]
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>token</span> = <span style=color:#e6db74>"1234567890:ABCDEFGHIJKLMNOPQRSTUVWXYZ"</span>
|
|
</span></span><span style=display:flex><span>
|
|
</span></span><span style=display:flex><span>[[<span style=color:#a6e22e>users</span>]]
|
|
</span></span><span style=display:flex><span><span style=color:#75715e># telegram user id</span>
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>id</span> = <span style=color:#ae81ff>777000</span>
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>blacklist</span> = <span style=color:#66d9ef>true</span>
|
|
</span></span><span style=display:flex><span>
|
|
</span></span><span style=display:flex><span>[[<span style=color:#a6e22e>storages</span>]]
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>name</span> = <span style=color:#e6db74>"Local Storage"</span>
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>type</span> = <span style=color:#e6db74>"local"</span>
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>enable</span> = <span style=color:#66d9ef>true</span>
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>base_path</span> = <span style=color:#e6db74>"./downloads"</span>
|
|
</span></span></code></pre></div><h2 id=detailed-configuration>Detailed Configuration
|
|
<a class=anchor href=#detailed-configuration>#</a></h2><h3 id=global-configuration>Global Configuration
|
|
<a class=anchor href=#global-configuration>#</a></h3><ul><li><code>lang</code>: The language used by the Bot, default is <code>zh-CN</code> (Simplified Chinese). <code>en</code> is used for English.</li><li><code>stream</code>: Whether to enable Stream mode, default is <code>false</code>. When enabled, the Bot will stream files directly to storage endpoints (if supported), without downloading them locally.<blockquote class="book-hint warning">Stream mode is very useful for deployment environments with limited disk space, but it also has some drawbacks:<br><ul><li>Cannot use multi-threading to download files from Telegram, resulting in slower speeds.</li><li>Higher task failure rate when the network is unstable.</li><li>Cannot process files in the middle layer, such as automatic file type identification.</li><li>Not supported by all storage endpoints; unsupported endpoints may downgrade to normal mode or fail to upload.</li></ul></blockquote></li><li><code>workers</code>: Number of tasks to process simultaneously, default is 3.</li><li><code>threads</code>: Number of threads used when downloading files, default is 4. Only effective when Stream mode is not enabled.</li><li><code>retry</code>: Number of retries when a task fails, default is 3.</li><li><code>proxy</code>: Global proxy configuration. After setting this, all network connections inside the program will try to use this proxy. Optional.</li></ul><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-toml data-lang=toml><span style=display:flex><span><span style=color:#a6e22e>lang</span> = <span style=color:#e6db74>"en"</span>
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>stream</span> = <span style=color:#66d9ef>false</span>
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>workers</span> = <span style=color:#ae81ff>3</span>
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>threads</span> = <span style=color:#ae81ff>4</span>
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>retry</span> = <span style=color:#ae81ff>3</span>
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>proxy</span> = <span style=color:#e6db74>"socks5://127.0.0.1:7890"</span>
|
|
</span></span></code></pre></div><h3 id=telegram-configuration>Telegram Configuration
|
|
<a class=anchor href=#telegram-configuration>#</a></h3><ul><li><code>token</code>: Your Telegram Bot Token, which can be obtained by creating a Bot through <a href=https://t.me/botfather>BotFather</a>.</li><li><code>app_id</code>, <code>app_hash</code>: Telegram API ID & Hash, obtained by creating an application at <a href=https://my.telegram.org/apps>Telegram API</a>. Default values will be used if not provided.</li><li><code>flood_retry</code>: Number of retries for flood control, default is 5.</li><li><code>rpc_retry</code>: Number of retries for RPC requests, default is 5.</li><li><code>proxy</code>: Proxy configuration, optional.<ul><li><code>enable</code>: Whether to enable the proxy.</li><li><code>url</code>: Proxy address</li></ul></li><li><code>userbot</code>: Userbot configuration, optional.<ul><li><code>enable</code>: Enable userbot integration. Requires logging in with a user account; you should use your own API ID & Hash when enabling this.</li><li><code>session</code>: Path to the userbot session file, default is <code>data/usersession.db</code>.</li></ul></li></ul><blockquote class="book-hint warning">After enabling userbot integration, the bot can download files from private channels and groups, but there is an unavoidable risk of the account being banned.<br>On the first start after enabling userbot, you need to input phone number, 2FA and verification code in the terminal.<br>If you deploy with Docker, please run the container with `-it` for an interactive environment, then perform the login.</blockquote><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-toml data-lang=toml><span style=display:flex><span>[<span style=color:#a6e22e>telegram</span>]
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>token</span> = <span style=color:#e6db74>"1234567890:ABCDEFGHIJKLMNOPQRSTUVWXYZ"</span>
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>app_id</span> = <span style=color:#ae81ff>1025907</span>
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>app_hash</span> = <span style=color:#e6db74>"452b0359b988148995f22ff0f4229750"</span>
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>flood_retry</span> = <span style=color:#ae81ff>5</span>
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>rpc_retry</span> = <span style=color:#ae81ff>5</span>
|
|
</span></span><span style=display:flex><span>[<span style=color:#a6e22e>telegram</span>.<span style=color:#a6e22e>proxy</span>]
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>enable</span> = <span style=color:#66d9ef>false</span>
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>url</span> = <span style=color:#e6db74>"socks5://127.0.0.1:7890"</span>
|
|
</span></span><span style=display:flex><span>[<span style=color:#a6e22e>telegram</span>.<span style=color:#a6e22e>userbot</span>]
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>enable</span> = <span style=color:#66d9ef>false</span>
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>session</span> = <span style=color:#e6db74>"data/usersession.db"</span>
|
|
</span></span></code></pre></div><h3 id=aria2-configuration>Aria2 Configuration
|
|
<a class=anchor href=#aria2-configuration>#</a></h3><p>Aria2 is a powerful download manager that supports HTTP/HTTPS, FTP, BitTorrent, and other protocols. When enabled, the bot can use the <code>/aria2dl</code> command to download files via Aria2.</p><ul><li><code>enable</code>: Whether to enable Aria2 support, default is <code>false</code></li><li><code>url</code>: Aria2 RPC address, typically <code>http://localhost:6800/jsonrpc</code></li><li><code>secret</code>: Aria2 RPC secret, if you configured <code>rpc-secret</code> in Aria2, you need to fill it in here</li><li><code>remove_after_transfer</code>: Whether to remove local files downloaded by Aria2 after transfer, default is <code>true</code></li></ul><blockquote class="book-hint info">Aria2 needs to be installed and running separately. You can refer to the [Aria2 official documentation](https://aria2.github.io/) to learn how to install and configure Aria2.</blockquote><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-toml data-lang=toml><span style=display:flex><span>[<span style=color:#a6e22e>aria2</span>]
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>enable</span> = <span style=color:#66d9ef>true</span>
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>url</span> = <span style=color:#e6db74>"http://localhost:6800/jsonrpc"</span>
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>secret</span> = <span style=color:#e6db74>"your-rpc-secret"</span>
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>remove_after_transfer</span> = <span style=color:#66d9ef>true</span>
|
|
</span></span></code></pre></div><h3 id=storage-endpoints-list>Storage Endpoints List
|
|
<a class=anchor href=#storage-endpoints-list>#</a></h3><p>The storage endpoints list is used to define the storage locations supported by the Bot. Each storage endpoint needs to specify a name, type, and related configuration, using the double bracket syntax <code>[[storages]]</code>.</p><p>Each storage endpoint requires at least the following fields:</p><ul><li><code>name</code>: Storage endpoint name, used for identification in the Bot, must be unique.</li><li><code>enable</code>: Whether to enable this storage endpoint, default is <code>true</code>.</li><li><code>type</code>: Storage endpoint type, currently supports the following types:<ul><li><code>local</code>: Local disk</li><li><code>alist</code>: Alist</li><li><code>webdav</code>: WebDAV</li><li><code>s3</code>: aws S3 and other S3 compatible services</li><li><code>rclone</code>: Uses rclone to implement uploads</li><li><code>telegram</code>: Upload to Telegram</li></ul></li></ul><p>Example, this is a configuration that includes local storage and webdav storage:</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-toml data-lang=toml><span style=display:flex><span>[[<span style=color:#a6e22e>storages</span>]]
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>name</span> = <span style=color:#e6db74>"Local Storage"</span>
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>type</span> = <span style=color:#e6db74>"local"</span>
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>enable</span> = <span style=color:#66d9ef>true</span>
|
|
</span></span><span style=display:flex><span><span style=color:#75715e># Custom configuration for local type storage</span>
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>base_path</span> = <span style=color:#e6db74>"./downloads"</span>
|
|
</span></span><span style=display:flex><span>
|
|
</span></span><span style=display:flex><span>[[<span style=color:#a6e22e>storages</span>]]
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>name</span> = <span style=color:#e6db74>"WebDAV"</span>
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>type</span> = <span style=color:#e6db74>"webdav"</span>
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>enable</span> = <span style=color:#66d9ef>true</span>
|
|
</span></span><span style=display:flex><span><span style=color:#75715e># Custom configuration for webdav type storage</span>
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>url</span> = <span style=color:#e6db74>"https://example.com/webdav"</span>
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>base_path</span> = <span style=color:#e6db74>"/path/to/webdav"</span>
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>username</span> = <span style=color:#e6db74>"your_username"</span>
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>password</span> = <span style=color:#e6db74>"your_password"</span>
|
|
</span></span></code></pre></div><p>For custom configuration items for all storage endpoints, see <a href=./storages>Storage Configuration</a></p><h3 id=user-list>User List
|
|
<a class=anchor href=#user-list>#</a></h3><p>The user list is used to define access control for storage endpoints. Each user needs to specify a Telegram User ID, defined using the double bracket syntax <code>[[users]]</code>.</p><ul><li><code>id</code>: The user’s Telegram User ID</li><li><code>storages</code>: Filtered list of storage endpoints, defined by storage endpoint names, default is whitelist mode (i.e., only allows access to storage endpoints in the list)</li><li><code>blacklist</code>: Whether to enable blacklist mode, default is <code>false</code>. If blacklist mode is enabled, the user is allowed to access only storage endpoints that are <strong>not</strong> in the list.</li></ul><p>Example, this is a configuration containing three users: user <code>123123</code> can only access local storage, user <code>456456</code> can only access storage other than WebDAV, and user <code>789789</code> has blacklist mode enabled but no storage endpoints specified, so they can access all storage:</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-toml data-lang=toml><span style=display:flex><span>[[<span style=color:#a6e22e>users</span>]]
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>id</span> = <span style=color:#ae81ff>123123</span>
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>storages</span> = [<span style=color:#e6db74>"Local Storage"</span>]
|
|
</span></span><span style=display:flex><span>
|
|
</span></span><span style=display:flex><span>[[<span style=color:#a6e22e>users</span>]]
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>id</span> = <span style=color:#ae81ff>456456</span>
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>storages</span> = [<span style=color:#e6db74>"WebDAV"</span>]
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>blacklist</span> = <span style=color:#66d9ef>true</span>
|
|
</span></span><span style=display:flex><span>
|
|
</span></span><span style=display:flex><span>[[<span style=color:#a6e22e>users</span>]]
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>id</span> = <span style=color:#ae81ff>789789</span>
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>storages</span> = []
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>blacklist</span> = <span style=color:#66d9ef>true</span>
|
|
</span></span></code></pre></div><h3 id=events>Events
|
|
<a class=anchor href=#events>#</a></h3><p>Event hooks allow you to run custom commands based on task status while the bot is processing tasks. Currently only arbitrary command execution is supported, configured via <code>[hook.exec]</code>.</p><p>Supported event types:</p><ul><li><code>task_before_start</code>: Before a task starts</li><li><code>task_success</code>: After a task completes successfully</li><li><code>task_fail</code>: After a task fails</li><li><code>task_cancel</code>: After a task is cancelled</li></ul><p>The configured value must be a full shell command line. The bot will execute this command when the event occurs. Example:</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-toml data-lang=toml><span style=display:flex><span>[<span style=color:#a6e22e>hook</span>.<span style=color:#a6e22e>exec</span>]
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>task_before_start</span> = <span style=color:#e6db74>"echo 'task is about to start'"</span>
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>task_success</span> = <span style=color:#e6db74>"bash /path/to/success_script.sh"</span>
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>task_fail</span> = <span style=color:#e6db74>"curl -X POST https://example.com/api/notify -d 'task failed'"</span>
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>task_cancel</span> = <span style=color:#e6db74>"bash /path/to/cancel_script.sh"</span>
|
|
</span></span></code></pre></div><h3 id=parsers>Parsers
|
|
<a class=anchor href=#parsers>#</a></h3><p>Parsers give the bot the ability to handle non-Telegram files, such as downloading files from other websites. Configure them via <code>[parsers]</code>.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-toml data-lang=toml><span style=display:flex><span>[<span style=color:#a6e22e>parsers</span>]
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>plugin_enable</span> = <span style=color:#66d9ef>true</span> <span style=color:#75715e># Whether to enable parser plugins</span>
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>plugin_dirs</span> = [<span style=color:#e6db74>"./plugins"</span>] <span style=color:#75715e># Plugin directories, can be multiple</span>
|
|
</span></span></code></pre></div><p>The above settings only control JavaScript-based parser plugins. The bot also has built-in parsers implemented in Go, which are enabled by default.</p><h3 id=miscellaneous>Miscellaneous
|
|
<a class=anchor href=#miscellaneous>#</a></h3><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-toml data-lang=toml><span style=display:flex><span><span style=color:#a6e22e>no_clean_cache</span> = <span style=color:#66d9ef>false</span> <span style=color:#75715e># Whether not to clear the cache folder when exiting</span>
|
|
</span></span><span style=display:flex><span><span style=color:#75715e># Temporary download folder configuration</span>
|
|
</span></span><span style=display:flex><span>[<span style=color:#a6e22e>temp</span>]
|
|
</span></span><span style=display:flex><span><span style=color:#a6e22e>base_path</span> = <span style=color:#e6db74>"./cache"</span>
|
|
</span></span></code></pre></div></article><footer class=book-footer><div class="flex flex-wrap justify-between"><div><a class="flex align-center" href=https://github.com/krau/saveany-bot/commit/70f71721625858905e7dbe68f57cc009ba9ac3ee title='Last modified by krau | 2026/01/31' target=_blank rel=noopener><img src=/svg/calendar.svg class=book-icon alt>
|
|
<span>2026/01/31</span></a></div><div><a class="flex align-center" href=https://github.com/krau/saveany-bot/edit/main/docs/content/en/deployment/configuration/_index.md target=_blank rel=noopener><img src=/svg/edit.svg class=book-icon alt>
|
|
<span>Edit this page</span></a></div></div><script>(function(){function e(e){const t=window.getSelection(),n=document.createRange();n.selectNodeContents(e),t.removeAllRanges(),t.addRange(n)}document.querySelectorAll("pre code").forEach(t=>{t.addEventListener("click",function(){if(window.getSelection().toString())return;e(t.parentElement),navigator.clipboard&&navigator.clipboard.writeText(t.parentElement.textContent)})})})()</script></footer><div class=book-comments></div><label for=menu-control class="hidden book-menu-overlay"></label></div><aside class=book-toc><div class=book-toc-content><nav id=TableOfContents><ul><li><a href=#detailed-configuration>Detailed Configuration</a><ul><li><a href=#global-configuration>Global Configuration</a></li><li><a href=#telegram-configuration>Telegram Configuration</a></li><li><a href=#aria2-configuration>Aria2 Configuration</a></li><li><a href=#storage-endpoints-list>Storage Endpoints List</a></li><li><a href=#user-list>User List</a></li><li><a href=#events>Events</a></li><li><a href=#parsers>Parsers</a></li><li><a href=#miscellaneous>Miscellaneous</a></li></ul></li></ul></nav></div></aside></main></body></html> |