commit 609e3bf66eefc3b45de5c7e6540323e70404e5c7 Author: V-LiuShuang Date: Fri Aug 14 13:52:09 2026 +0800 add diff --git a/Docker-CodeServer.md b/Docker-CodeServer.md new file mode 100644 index 0000000..5122995 --- /dev/null +++ b/Docker-CodeServer.md @@ -0,0 +1,22 @@ +## docker-compose.yaml + +```yaml +version: '3.8' + +services: + code-server: + image: linuxserver/code-server:latest + container_name: code-server + environment: + - PUID=1000 + - PGID=1001 + - TZ=Asia/Shanghai + - PASSWORD=Abc.123 + - SUDO_PASSWORD=Abc.123 + volumes: + - ./conf:/config + - ./workspace:/projects + ports: + - "48331:8443" + restart: on-failure:3 +``` \ No newline at end of file diff --git a/Docker-DPanel.md b/Docker-DPanel.md new file mode 100644 index 0000000..fd7433c --- /dev/null +++ b/Docker-DPanel.md @@ -0,0 +1,11 @@ +``` +docker run \ + -d \ + -p 端口号:8080 \ + -e APP_NAME=dpanel \ + --name dpanel \ + --restart=always \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v 替换成DPanel的存储目录:/dpanel \ + registry.cn-hangzhou.aliyuncs.com/dpanel/dpanel:lite +``` \ No newline at end of file diff --git a/Docker-Grafana.md b/Docker-Grafana.md new file mode 100644 index 0000000..2906e0c --- /dev/null +++ b/Docker-Grafana.md @@ -0,0 +1,10 @@ +``` +docker run \ +-d \ +--name grafana-12.1.1 \ +-p 宿主机端口号:3000 \ +-v 替换成数据存储目录:/var/lib/grafana \ +-v 替换成日志存储目录:/var/log/grafana \ +-v 替换成插件存储目录:/var/lib/grafana/plugins \ +swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/grafana/grafana-oss:12.1.1 +``` \ No newline at end of file diff --git a/Docker-OpenResty.md b/Docker-OpenResty.md new file mode 100644 index 0000000..6314947 --- /dev/null +++ b/Docker-OpenResty.md @@ -0,0 +1,168 @@ +## 为什么要写这一篇 + +因为当时 vLLM 部署的 gpt-oss-120b 的模型,总是造成 vLLM 宕机,分析宕机时的崩溃日志是由于 vLLM 根据模型的回复内容调用结构化输出的工具,然后模型回复的内容跟结构后输出函数不兼容所以抛了 ValueError 导致 vLLM 的引擎进程退出,APIServer 与引擎的进程有心跳机制,发现引擎宕机了,所以自杀了。但是没有请求参数日志,不知道啥样的请求参数触发了结构化输出的功能。在 Open AI API 层面是有校验 response_format 的参数合法性的,不合法会直接拒绝。所以当务之急是先捕获请求参数,结合 vLLM 的宕机时间,尝试复现宕机的参数。 + +## 踩了很多坑 + +- 第一反应是看看能不能调整 vLLM 有没有开启打印请求参数的能力,vLLM 的版本是 v0.11.0,查看源码发现是没有的。 +- 第二种就是使用抓包工具去实时抓包,选择了 tshark 它是 wireshark 的命令行版本。 +- 在服务器后台运行了一晚上,天塌了!这叼东西会一直写临时文件,存储路径:/tmp/*.pcap。 +- 它是抓包网卡的流量,在服务器部署了好几个大模型和 OpenAI API 端点。 +- 而且有其他同事在压测,一直在并发调用 Open AI API,所以一晚上写了 300G+ 的临时文件,服务器直接告警了,运维挨批了。 + +## 终极方案 + +不修改 vLLM 的源码,也不用抓包工具,针对 vLLM 部署的 gpt-oss-120b 的 Open AI API 加一层反向代理,把请求参数写到 access_log 并轮转。 + +## OpenResty + +用这玩意儿是因为它可以在 nginx.conf 里面写 Lua 脚本,还提供了一系列的增强能力,比直接用 nginx 更省心。 + +### nginx.conf + +``` +worker_processes auto; +error_log stderr warn; + +events { + worker_connections 4096; + use epoll; + multi_accept on; +} + +http { + lua_need_request_body on; + log_escape_non_ascii off; + + # 注意:这里不再使用 $time_local,而是用自定义变量 $log_time + log_format llm_audit '[$log_time] | $request_uri | $raw_body'; + + upstream llm_backend { + server 127.0.0.1:8080; # 修改成你的服务地址 + keepalive 32; + } + + server { + listen 8000; + server_name _; + + client_max_body_size 100M; + client_body_buffer_size 128k; + client_body_in_single_buffer on; + + location /v1/chat/completions { + set $log_time ""; + set $raw_body ""; + + rewrite_by_lua_block { + local now = ngx.time() + local tm = os.date("*t", now) + ngx.var.log_time = string.format( + "%04d-%02d-%02d %02d:%02d:%02d", + tm.year, tm.month, tm.day, + tm.hour, tm.min, tm.sec + ) + + local body = ngx.var.request_body or "" + ngx.var.raw_body = body + + -- 判断是否为流式请求 + if body ~= "" then + local cjson = require "cjson.safe" + local ok, json = pcall(cjson.decode, body) + if ok and type(json) == "table" and json.stream == true then + ngx.exec("@stream") + return + end + end + ngx.exec("@normal") + } + } + + # ========== 流式响应 ========== + location @stream { + internal; + access_log /hook/request.log llm_audit; + + proxy_pass http://llm_backend; + proxy_http_version 1.1; + proxy_set_header Connection ""; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + + proxy_buffering off; + proxy_cache off; + send_timeout 600s; + proxy_connect_timeout 5s; + proxy_send_timeout 60s; + proxy_read_timeout 600s; + proxy_socket_keepalive on; + } + + # ========== 非流式响应 ========== + location @normal { + internal; + access_log /hook/request.log llm_audit; + + proxy_pass http://llm_backend; + proxy_http_version 1.1; + proxy_set_header Connection ""; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + + proxy_buffering on; + proxy_cache off; + send_timeout 600s; + proxy_connect_timeout 5s; + proxy_send_timeout 60s; + proxy_read_timeout 600s; + proxy_socket_keepalive on; + } + } +} +``` + +### /hook/request.log + +``` +/hook/request.log { + daily + rotate 5 + size 20M + compress + delaycompress + missingok + notifempty + copytruncate + su root root # 如果 nginx 以非 root 用户运行,需匹配权限 +} +``` + +### docker-compose.yml + +```yml +version: "3.8" +services: + openresty: + image: docker.1ms.run/openresty/openresty:jammy + container_name: openresty + environment: + - TZ=Asia/Shanghai + - http_proxy= + - https_proxy= + - HTTP_PROXY= + - HTTPS_PROXY= + - no_proxy= + - NO_PROXY= + ports: + - "28000:8000" + volumes: + # 宿主机这个目录可以查看 request.log 也必须包含 nginx.conf + - ./hook:/hook + # 日志轮转配置文件 + - ./hook/hook-nginx:/etc/logrotate.d/hook-nginx + command: ["/usr/local/openresty/bin/openresty", "-c", "/hook/nginx.conf", "-g", "daemon off;"] + restart: on-failure:3 +``` \ No newline at end of file diff --git a/Docker-PGSQL.md b/Docker-PGSQL.md new file mode 100644 index 0000000..682c472 --- /dev/null +++ b/Docker-PGSQL.md @@ -0,0 +1,153 @@ +## 目录结构 + +- pgsql-gis/ +- docker-compose.yaml + +```shell +mkdir pgsql-gis +``` + +## docker-compose.yaml + +```yaml +version: '3.8' +services: + pgsql-gis-16: + # 支持全文检索的自编译镜像 + image: pgsql-gis-fts:latest + container_name: pgsql-gis-16 + ports: + - "35430:5432" # 替换 + volumes: + - ./pgsql-gis:/var/lib/postgresql/data + environment: + POSTGRES_USER: # 替换 + POSTGRES_PASSWORD: # 替换 + POSTGRES_DB: # 替换 + POSTGRES_INITDB_ARGS: --encoding=UTF8 + restart: on-failure:3 +``` + +## 添加全文索引支持 + +需要从 git 克隆 zhparser 添加中文分词支持,执行 docker build 命令的目录结构长这样: + +- Dockerfile +- zhparser/ + +```bash +git clone https://github.com/amutu/zhparser.git +``` + +## Dockerfile + +```bash +FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/postgis/postgis:16-3.5 + +ENV DEBIAN_FRONTEND=noninteractive + +RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list && \ + sed -i 's/security.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list + +RUN apt-get update && apt-get install -y \ + build-essential \ + git \ + libcurl4-openssl-dev \ + libxml2-dev \ + wget \ + postgresql-server-dev-16 \ + && rm -rf /var/lib/apt/lists/* + +RUN pg_config --version + +WORKDIR /tmp + +RUN wget http://www.xunsearch.com/scws/down/scws-1.2.3.tar.bz2 \ + && tar xjf scws-1.2.3.tar.bz2 \ + && cd scws-1.2.3 \ + && ./configure \ + && make && make install \ + && cd .. + +COPY zhparser zhparser + +RUN cd zhparser \ + && export PG_CONFIG=$(which pg_config) \ + && echo "Using pg_config: $PG_CONFIG" \ + && make USE_PGXS=1 \ + && make USE_PGXS=1 install \ + && cd .. + +RUN rm -rf /tmp/* + +WORKDIR / +``` + +## 编译 + +```bash +docker build -t pgsql-gis-fts . +``` + +## 启用中文分词扩展 + +```sql +CREATE EXTENSION IF NOT EXISTS zhparser; +``` + +```sql +CREATE TEXT SEARCH CONFIGURATION chinese_mix (PARSER = zhparser); +-- DROP TEXT SEARCH CONFIGURATION IF EXISTS chinese_mix; +``` + +```sql +ALTER TEXT SEARCH CONFIGURATION chinese_mix ADD MAPPING FOR n,v,a,i,e,l,d,j,m,q,r,t,u,w,x,z WITH simple; +``` + +## 测试 + +```sql +CREATE TABLE articles ( + id SERIAL PRIMARY KEY, + title TEXT, + content TEXT, + -- 生成列:自动维护 tsvector,避免每次查询都计算,提高性能 + content_tsvector TSVECTOR GENERATED ALWAYS AS (to_tsvector('chinese_mix', content)) STORED +); +``` + +```sql +-- 插入一些混合数据 +INSERT INTO articles (title, content) VALUES +('AI 技术展望', '人工智能 (AI) 正在改变世界,PostgreSQL 是存储这些数据的首选数据库。'), +('PostgreSQL 16 新特性', 'PostgreSQL 16 带来了更好的性能,支持 JSON 增强和中文分词优化。'), +('日常开发笔记', 'Today I learned about zhparser. 它让中文搜索变得很简单。'); +``` + +```sql +-- 搜索包含 "人工智能" 的文章 +SELECT title, content +FROM articles +WHERE content_tsvector @@ to_tsquery('chinese_mix', '人工智能'); +``` + +```sql +-- 搜索包含 "PostgreSQL" 的文章 +SELECT title, content +FROM articles +WHERE content_tsvector @@ to_tsquery('chinese_mix', 'PostgreSQL'); +``` + +```sql +-- 搜索既包含 "数据库" 又包含 "PostgreSQL" 的文章 +SELECT title, content +FROM articles +WHERE content_tsvector @@ to_tsquery('chinese_mix', '数据库 & PostgreSQL'); +``` + +```sql +-- 搜索包含 "AI" 或者 "改变" 的文章 +SELECT title, content +FROM articles +WHERE content_tsvector @@ to_tsquery('chinese_mix', 'AI | 改变'); +``` \ No newline at end of file diff --git a/Docker-Redis.md b/Docker-Redis.md new file mode 100644 index 0000000..1acdfaa --- /dev/null +++ b/Docker-Redis.md @@ -0,0 +1,51 @@ +## 目录结构 + +- docker-compose.yaml +- redis.conf +- data/ + +## docker-compose.yaml + +```yaml +services: + redis: + image: redis:8.6 # 替换 + container_name: redis + ports: + - "52358:6379" # 替换 + volumes: + - ./redis.conf:/usr/local/etc/redis/redis.conf + - ./data:/data + command: ["redis-server", "/usr/local/etc/redis/redis.conf"] + restart: on-failure:3 +``` + +## redis.conf + +```text +bind 0.0.0.0 +port 6379 +requirepass 1965589280@Jkw! +protected-mode no + +dir /data + +save 900 1 +save 300 10 +save 60 10000 +dbfilename dump.rdb +rdbcompression yes +rdbchecksum yes + +appendonly yes +appendfilename "appendonly.aof" +appendfsync everysec + +timeout 0 +tcp-keepalive 300 +loglevel notice +databases 16 +daemonize no +supervised no +always-show-logo no +``` \ No newline at end of file diff --git a/Docker-web-search-api-server.md b/Docker-web-search-api-server.md new file mode 100644 index 0000000..6a476fe --- /dev/null +++ b/Docker-web-search-api-server.md @@ -0,0 +1,2799 @@ +```bash +docker pull searxng/searxng:2026.3.29-7ac4ff39f +docker pull valkey/valkey:9-alpine +``` + +```bash +mkdir searxng-conf searxng-data valkey-data +``` + +```bash +vim searxng-conf/settings.yml +``` + +```yaml +general: + # Debug mode, only for development. Is overwritten by ${SEARXNG_DEBUG} + debug: false + # displayed name + instance_name: "SearXNG" + # For example: https://example.com/privacy + privacypolicy_url: false + # use true to use your own donation page written in searx/info/en/donate.md + # use false to disable the donation link + donation_url: false + # mailto:contact@example.com + contact_url: false + # record stats + enable_metrics: true + # expose stats in open metrics format at /metrics + # leave empty to disable (no password set) + # open_metrics: + open_metrics: '' + +brand: + docs_url: https://docs.searxng.org/ + public_instances: https://searx.space + wiki_url: https://github.com/searxng/searxng/wiki + issue_url: https://github.com/searxng/searxng/issues + # custom: + # # Custom entries in the footer: [title]: [link] + # links: + # Uptime: https://uptime.searxng.org/history/darmarit-org + # About: "https://searxng.org" + # pwa_colors: + # # Custom settings for PWA icon an colors used in manifest.json + # # Default colors are: + # theme_color_light: "#3050ff" + # background_color_light: "fff" + # theme_color_dark: "#58f" + # background_color_dark: "#222428" + # theme_color_black: "#3050ff" + # background_color_black: "#000" + +search: + # Filter results. 0: None, 1: Moderate, 2: Strict + safe_search: 0 + # Existing autocomplete backends: "360search", "baidu", "bing", "brave", "dbpedia", "duckduckgo", "google", + # "yandex", "mwmbl", "naver", "seznam", "sogou", "startpage", "swisscows", "quark", "qwant", "wikipedia" - + # leave blank to turn it off by default. + autocomplete: "" + # minimun characters to type before autocompleter starts + autocomplete_min: 4 + # backend for the favicon near URL in search results. + # Available resolvers: "allesedv", "duckduckgo", "google", "yandex" - leave blank to turn it off by default. + favicon_resolver: "" + # Default search language - leave blank to detect from browser information or + # use codes from 'languages.py' + default_lang: "auto" + # max_page: 0 # if engine supports paging, 0 means unlimited numbers of pages + # Available languages + # languages: + # - all + # - en + # - en-US + # - de + # - it-IT + # - fr + # - fr-BE + # ban time in seconds after engine errors + ban_time_on_fail: 5 + # max ban time in seconds after engine errors + max_ban_time_on_fail: 120 + suspended_times: + # Engine suspension time after error (in seconds; set to 0 to disable) + # For error "Access denied" and "HTTP error [402, 403]" + SearxEngineAccessDenied: 180 + # For error "CAPTCHA" + SearxEngineCaptcha: 3600 + # For error "Too many request" and "HTTP error 429" + SearxEngineTooManyRequests: 180 + # Cloudflare CAPTCHA + cf_SearxEngineCaptcha: 1296000 + cf_SearxEngineAccessDenied: 86400 + # ReCAPTCHA + recaptcha_SearxEngineCaptcha: 604800 + + # remove format to deny access, use lower case. + # formats: [html, csv, json, rss] + formats: + - html + - json + +server: + # Is overwritten by ${SEARXNG_PORT} and ${SEARXNG_BIND_ADDRESS} + port: 8888 + bind_address: "127.0.0.1" + # public URL of the instance, to ensure correct inbound links. Is overwritten + # by ${SEARXNG_BASE_URL}. + base_url: false # "http://example.com/location" + # rate limit the number of request on the instance, block some bots. + # Is overwritten by ${SEARXNG_LIMITER} + limiter: false + # enable features designed only for public instances. + # Is overwritten by ${SEARXNG_PUBLIC_INSTANCE} + public_instance: false + + # If your instance owns a /etc/searxng/settings.yml file, then set the following + # values there. + + secret_key: "397492b7676965ecec6bfb483d992ff7df3286ee6113c40472c46ed39567d1d4" # Is overwritten by ${SEARXNG_SECRET} + # Proxy image results through SearXNG. Is overwritten by ${SEARXNG_IMAGE_PROXY} + image_proxy: false + # 1.0 and 1.1 are supported + http_protocol_version: "1.0" + # POST queries are "more secure!" but are also the source of hard-to-locate + # annoyances, which is why GET may be better for end users and their browsers. + # see https://github.com/searxng/searxng/pull/3619 + # Is overwritten by ${SEARXNG_METHOD} + method: "POST" + default_http_headers: + X-Content-Type-Options: nosniff + X-Download-Options: noopen + X-Robots-Tag: noindex, nofollow + Referrer-Policy: no-referrer + +valkey: + # URL to connect valkey database. Is overwritten by ${SEARXNG_VALKEY_URL}. + # https://docs.searxng.org/admin/settings/settings_valkey.html#settings-valkey + # url: valkey://localhost:6379/0 + url: false + +ui: + # Custom static path - leave it blank if you didn't change + static_path: "" + # Custom templates path - leave it blank if you didn't change + templates_path: "" + # query_in_title: When true, the result page's titles contains the query + # it decreases the privacy, since the browser can records the page titles. + query_in_title: false + # ui theme + default_theme: simple + # center the results ? + center_alignment: false + # URL prefix of the internet archive, don't forget trailing slash (if needed). + # cache_url: "https://webcache.googleusercontent.com/search?q=cache:" + # Default interface locale - leave blank to detect from browser information or + # use codes from the 'locales' config section + default_locale: "" + # Open result links in a new tab by default + # results_on_new_tab: false + theme_args: + # style of simple theme: auto, light, dark, black + simple_style: auto + # Perform search immediately if a category selected. + # Disable to select multiple categories at once and start the search manually. + search_on_category_select: true + # Hotkeys: default or vim + hotkeys: default + # URL formatting: pretty, full or host + url_formatting: pretty + +# Lock arbitrary settings on the preferences page. +# +# preferences: +# lock: +# - categories +# - language +# - autocomplete +# - favicon +# - safesearch +# - method +# - doi_resolver +# - locale +# - theme +# - results_on_new_tab +# - search_on_category_select +# - method +# - image_proxy +# - query_in_title + +# communication with search engines +# +outgoing: + # default timeout in seconds, can be override by engine + request_timeout: 3.0 + # the maximum timeout in seconds + # max_request_timeout: 10.0 + # suffix of searxng_useragent, could contain information like an email address + # to the administrator + useragent_suffix: "" + # The maximum number of concurrent connections that may be established. + pool_connections: 100 + # Allow the connection pool to maintain keep-alive connections below this + # point. + pool_maxsize: 20 + # See https://www.python-httpx.org/http2/ + enable_http2: true + # uncomment below section if you want to use a custom server certificate + # see https://www.python-httpx.org/advanced/#changing-the-verification-defaults + # and https://www.python-httpx.org/compatibility/#ssl-configuration + # verify: ~/.mitmproxy/mitmproxy-ca-cert.cer + # + # uncomment below section if you want to use a proxyq see: SOCKS proxies + # https://2.python-requests.org/en/latest/user/advanced/#proxies + # are also supported: see + # https://2.python-requests.org/en/latest/user/advanced/#socks + # + # proxies: + # all://: + # - http://proxy1:8080 + # - http://proxy2:8080 + # + # using_tor_proxy: true + # + # Extra seconds to add in order to account for the time taken by the proxy + # + # extra_proxy_timeout: 10 + # + # uncomment below section only if you have more than one network interface + # which can be the source of outgoing search requests + # + # source_ips: + # - 1.1.1.1 + # - 1.1.1.2 + # - fe80::/126 + + +# Plugin configuration, for more details see +# https://docs.searxng.org/admin/settings/settings_plugins.html +# +plugins: + + searx.plugins.calculator.SXNGPlugin: + active: true + + searx.plugins.infinite_scroll.SXNGPlugin: + active: false + + searx.plugins.hash_plugin.SXNGPlugin: + active: true + + searx.plugins.self_info.SXNGPlugin: + active: true + + searx.plugins.unit_converter.SXNGPlugin: + active: true + + searx.plugins.ahmia_filter.SXNGPlugin: + active: true + + searx.plugins.hostnames.SXNGPlugin: + active: true + + searx.plugins.time_zone.SXNGPlugin: + active: true + + searx.plugins.oa_doi_rewrite.SXNGPlugin: + active: false + + searx.plugins.tor_check.SXNGPlugin: + active: false + + searx.plugins.tracker_url_remover.SXNGPlugin: + active: true + + +# Configuration of the "Hostnames plugin": +# +# hostnames: +# replace: +# '(.*\.)?youtube\.com$': 'yt.example.com' +# '(.*\.)?youtu\.be$': 'yt.example.com' +# '(.*\.)?reddit\.com$': 'teddit.example.com' +# '(.*\.)?redd\.it$': 'teddit.example.com' +# '(www\.)?twitter\.com$': 'nitter.example.com' +# remove: +# - '(.*\.)?facebook.com$' +# low_priority: +# - '(.*\.)?google(\..*)?$' +# high_priority: +# - '(.*\.)?wikipedia.org$' +# +# Alternatively you can use external files for configuring the "Hostnames plugin": +# +# hostnames: +# replace: 'rewrite-hosts.yml' +# +# Content of 'rewrite-hosts.yml' (place the file in the same directory as 'settings.yml'): +# '(.*\.)?youtube\.com$': 'yt.example.com' +# '(.*\.)?youtu\.be$': 'yt.example.com' +# + + +categories_as_tabs: + general: + images: + videos: + news: + map: + music: + it: + science: + files: + social media: + +engines: + - name: 360search + engine: 360search + shortcut: 360so + timeout: 10.0 + disabled: true + + - name: 360search videos + engine: 360search_videos + shortcut: 360sov + disabled: true + + - name: 9gag + engine: 9gag + shortcut: 9g + disabled: true + + - name: acfun + engine: acfun + shortcut: acf + disabled: true + + - name: adobe stock + engine: adobe_stock + shortcut: asi + categories: ["images"] + # https://docs.searxng.org/dev/engines/online/adobe_stock.html + adobe_order: relevance + adobe_content_types: ["photo", "illustration", "zip_vector", "template", "3d", "image"] + timeout: 6 + disabled: true + + - name: adobe stock video + engine: adobe_stock + shortcut: asv + network: adobe stock + categories: ["videos"] + adobe_order: relevance + adobe_content_types: ["video"] + timeout: 6 + disabled: true + + - name: adobe stock audio + engine: adobe_stock + shortcut: asa + network: adobe stock + categories: ["music"] + adobe_order: relevance + adobe_content_types: ["audio"] + timeout: 6 + disabled: true + + - name: astrophysics data system + engine: astrophysics_data_system + shortcut: ads + # read https://docs.searxng.org/dev/engines/online/astrophysics_data_system.html + api_key: "" + inactive: true + + - name: alpine linux packages + engine: alpinelinux + disabled: true + shortcut: alp + + - name: annas archive + engine: annas_archive + base_url: + - https://annas-archive.gl + - https://annas-archive.vg + - https://annas-archive.pk + - https://annas-archive.gd + disabled: true + shortcut: aa + timeout: 5 + + - name: ansa + engine: ansa + shortcut: ans + disabled: true + + # - name: annas articles + # engine: annas_archive + # shortcut: aaa + # # https://docs.searxng.org/dev/engines/online/annas_archive.html + # aa_content: 'magazine' # book_fiction, book_unknown, book_nonfiction, book_comic + # aa_ext: 'pdf' # pdf, epub, .. + # aa_sort: oldest' # newest, oldest, largest, smallest + + - name: apk mirror + engine: apkmirror + timeout: 4.0 + shortcut: apkm + disabled: true + + - name: apple app store + engine: apple_app_store + shortcut: aps + disabled: true + + # Requires Tor + - name: ahmia + engine: ahmia + # Might do up to two requests to perform a search. + # Since Tor is already slow by nature, the timeout is set very high. + timeout: 20.0 + categories: onions + enable_http: true + shortcut: ah + + - name: anaconda + engine: xpath + paging: true + first_page_num: 0 + search_url: https://anaconda.org/search?q={query}&page={pageno} + results_xpath: //tbody/tr + url_xpath: ./td/h5/a[last()]/@href + title_xpath: ./td/h5 + content_xpath: ./td[h5]/text() + categories: it + timeout: 6.0 + shortcut: conda + disabled: true + + - name: aol + engine: aol + search_type: search + categories: [general] + shortcut: aol + + - name: aol images + engine: aol + search_type: image + categories: [images] + shortcut: aoli + + - name: aol videos + engine: aol + search_type: video + categories: [videos] + shortcut: aolv + + - name: arch linux wiki + engine: archlinux + shortcut: al + + - name: nixos wiki + engine: mediawiki + shortcut: nixw + base_url: https://wiki.nixos.org/ + search_type: text + disabled: true + categories: [it, software wikis] + + - name: artic + engine: artic + shortcut: arc + timeout: 4.0 + + - name: artstation + engine: artstation + shortcut: as + categories: images + disabled: true + + - name: arxiv + engine: arxiv + shortcut: arx + + - name: ask + engine: ask + shortcut: ask + disabled: true + + - name: azure + engine: azure + shortcut: az + categories: [it, cloud] + # azure_tenant_id: "your_tenant_id" + # azure_client_id: "your_client_id" + # azure_client_secret: "your_client_secret" + inactive: true + + # tmp suspended: dh key too small + # - name: base + # engine: base + # shortcut: bs + + - name: bandcamp + engine: bandcamp + shortcut: bc + categories: music + + - name: baidu + baidu_category: general + categories: [general] + engine: baidu + shortcut: bd + disabled: true + + - name: baidu images + baidu_category: images + categories: [images] + engine: baidu + shortcut: bdi + disabled: true + + - name: baidu kaifa + baidu_category: it + categories: [it] + engine: baidu + shortcut: bdk + disabled: true + + - name: wikipedia + engine: wikipedia + shortcut: wp + # add "list" to the array to get results in the results list + display_type: ["infobox"] + categories: [general] + + - name: bilibili + engine: bilibili + shortcut: bil + disabled: true + + - name: bing + engine: bing + shortcut: bi + disabled: true + + - name: bing images + engine: bing_images + shortcut: bii + + - name: bing news + engine: bing_news + shortcut: bin + + - name: bing videos + engine: bing_videos + shortcut: biv + + - name: bitchute + engine: bitchute + shortcut: bit + disabled: true + + - name: bitbucket + engine: xpath + paging: true + search_url: https://bitbucket.org/repo/all/{pageno}?name={query} + url_xpath: //article[@class="repo-summary"]//a[@class="repo-link"]/@href + title_xpath: //article[@class="repo-summary"]//a[@class="repo-link"] + content_xpath: //article[@class="repo-summary"]/p + categories: [it, repos] + timeout: 4.0 + disabled: true + shortcut: bb + about: + website: https://bitbucket.org/ + wikidata_id: Q2493781 + official_api_documentation: https://developer.atlassian.com/bitbucket + use_official_api: false + require_api_key: false + results: HTML + + - name: boardreader + engine: boardreader + shortcut: boa + disabled: true + + - name: bpb + engine: bpb + shortcut: bpb + disabled: true + + - name: btdigg + engine: btdigg + shortcut: bt + disabled: true + + - name: openverse + engine: openverse + categories: images + shortcut: opv + + - name: media.ccc.de + engine: ccc_media + shortcut: c3tv + # We don't set language: de here because media.ccc.de is not just + # for a German audience. It contains many English videos and many + # German videos have English subtitles. + disabled: true + + - name: cachy os packages + engine: cachy_os + shortcut: cos + disabled: true + + - name: chefkoch + engine: chefkoch + shortcut: chef + # to show premium or plus results too: + # skip_premium: false + + # WARNING: links from chinaso.com voilate users privacy + # Before activate these engines its mandatory to read + # - https://github.com/searxng/searxng/issues/4694 + # - https://docs.searxng.org/dev/engines/online/chinaso.html + + - name: chinaso news + engine: chinaso + shortcut: chinaso + categories: [news] + chinaso_category: news + chinaso_news_source: all + disabled: true + inactive: true + + - name: chinaso images + engine: chinaso + network: chinaso news + shortcut: chinasoi + categories: [images] + chinaso_category: images + disabled: true + inactive: true + + - name: chinaso videos + engine: chinaso + network: chinaso news + shortcut: chinasov + categories: [videos] + chinaso_category: videos + disabled: true + inactive: true + + - name: cloudflareai + engine: cloudflareai + shortcut: cfai + # get api token and accont id from https://developers.cloudflare.com/workers-ai/get-started/rest-api/ + cf_account_id: 'your_cf_accout_id' + cf_ai_api: 'your_cf_api' + # create your ai gateway by https://developers.cloudflare.com/ai-gateway/get-started/creating-gateway/ + cf_ai_gateway: 'your_cf_ai_gateway_name' + # find the model name from https://developers.cloudflare.com/workers-ai/models/#text-generation + cf_ai_model: 'ai_model_name' + # custom your preferences + # cf_ai_model_display_name: 'Cloudflare AI' + # cf_ai_model_assistant: 'prompts_for_assistant_role' + # cf_ai_model_system: 'prompts_for_system_role' + timeout: 30 + inactive: true + + - name: core.ac.uk + engine: core + shortcut: cor + # read https://docs.searxng.org/dev/engines/online/core.html + api_key: "" + inactive: true + + - name: crossref + engine: crossref + shortcut: cr + timeout: 30 + disabled: true + + - name: crowdview + engine: json_engine + shortcut: cv + categories: general + paging: false + search_url: https://crowdview-next-js.onrender.com/api/search-v3?query={query} + results_query: results + url_query: link + title_query: title + content_query: snippet + title_html_to_text: true + content_html_to_text: true + disabled: true + about: + website: https://crowdview.ai/ + + - name: yep + engine: yep + shortcut: yep + categories: general + search_type: web + timeout: 15 + disabled: true + + - name: yep images + engine: yep + shortcut: yepi + categories: images + search_type: images + disabled: true + + - name: yep news + engine: yep + shortcut: yepn + categories: news + search_type: news + disabled: true + + - name: currency + engine: currency_convert + shortcut: cc + + - name: deezer + engine: deezer + shortcut: dz + disabled: true + + - name: destatis + engine: destatis + shortcut: destat + disabled: true + + - name: deviantart + engine: deviantart + shortcut: da + timeout: 3.0 + + - name: devicons + engine: devicons + shortcut: di + timeout: 3.0 + + - name: ddg definitions + engine: duckduckgo_definitions + shortcut: ddd + weight: 2 + disabled: true + + # cloudflare protected + # - name: digbt + # engine: digbt + # shortcut: dbt + # timeout: 6.0 + # disabled: true + + - name: docker hub + engine: docker_hub + shortcut: dh + categories: [it, packages] + + - name: encyclosearch + engine: json_engine + shortcut: es + categories: general + paging: true + search_url: https://encyclosearch.org/encyclosphere/search?q={query}&page={pageno}&resultsPerPage=15 + results_query: Results + url_query: SourceURL + title_query: Title + content_query: Description + disabled: true + about: + website: https://encyclosearch.org + official_api_documentation: https://encyclosearch.org/docs/#/rest-api + use_official_api: true + require_api_key: false + results: JSON + + - name: erowid + engine: xpath + paging: true + first_page_num: 0 + page_size: 30 + search_url: https://www.erowid.org/search.php?q={query}&s={pageno} + url_xpath: //dl[@class="results-list"]/dt[@class="result-title"]/a/@href + title_xpath: //dl[@class="results-list"]/dt[@class="result-title"]/a/text() + content_xpath: //dl[@class="results-list"]/dd[@class="result-details"] + categories: [] + shortcut: ew + disabled: true + about: + website: https://www.erowid.org/ + wikidata_id: Q1430691 + official_api_documentation: + use_official_api: false + require_api_key: false + results: HTML + + - name: elasticsearch + shortcut: els + engine: elasticsearch + # base_url: http://localhost:9200 + # username: elastic + # password: changeme + # index: my-index + # enable_http: true + # available options: match, simple_query_string, term, terms, custom + query_type: match + # if query_type is set to custom, provide your query here + # custom_query_json: {"query":{"match_all": {}}} + # show_metadata: false + inactive: true + +# - name: wikidata +# engine: wikidata +# shortcut: wd +# timeout: 3.0 +# weight: 2 +# # add "list" to the array to get results in the results list +# display_type: ["infobox"] +# categories: [general] + + - name: duckduckgo + engine: duckduckgo + shortcut: ddg + + - name: duckduckgo images + engine: duckduckgo_extra + categories: [images] + ddg_category: images + shortcut: ddi + + - name: duckduckgo videos + engine: duckduckgo_extra + categories: [videos] + ddg_category: videos + shortcut: ddv + + - name: duckduckgo news + engine: duckduckgo_extra + categories: [news] + ddg_category: news + shortcut: ddn + + - name: duckduckgo weather + engine: duckduckgo_weather + shortcut: ddw + disabled: true + + - name: apple maps + engine: apple_maps + shortcut: apm + disabled: true + timeout: 5.0 + + - name: emojipedia + engine: emojipedia + timeout: 4.0 + shortcut: em + disabled: true + + - name: tineye + engine: tineye + shortcut: tin + timeout: 9.0 + disabled: true + + - name: etymonline + engine: xpath + paging: true + search_url: https://etymonline.com/search?page={pageno}&q={query} + url_xpath: //a[contains(@class, "word__name--")]/@href + title_xpath: //a[contains(@class, "word__name--")] + content_xpath: //section[contains(@class, "word__defination")] + first_page_num: 1 + shortcut: et + categories: [dictionaries] + about: + website: https://www.etymonline.com/ + wikidata_id: Q1188617 + official_api_documentation: + use_official_api: false + require_api_key: false + results: HTML + + - name: ebay + engine: ebay + shortcut: eb + base_url: 'https://www.ebay.com' + inactive: true + timeout: 5 + + - name: 1x + engine: www1x + shortcut: 1x + timeout: 3.0 + disabled: true + + - name: fdroid + engine: fdroid + shortcut: fd + disabled: true + + - name: findthatmeme + engine: findthatmeme + shortcut: ftm + disabled: true + + - name: flickr + categories: images + shortcut: fl + engine: flickr_noapi + + - name: flickr_api + # You can use the engine using the official stable API, but you need an API + # key, see: https://www.flickr.com/services/apps/create/ + engine: flickr + categories: images + shortcut: fla + # api_key: 'apikey' # required! + inactive: true + + - name: free software directory + engine: mediawiki + shortcut: fsd + categories: [it, software wikis] + base_url: https://directory.fsf.org/ + search_type: title + timeout: 5.0 + disabled: true + about: + website: https://directory.fsf.org/ + wikidata_id: Q2470288 + + - name: freesound + engine: freesound + shortcut: fnd + timeout: 15.0 + # API key required, see: https://freesound.org/docs/api/overview.html + # api_key: MyAPIkey + inactive: true + + - name: frinkiac + engine: frinkiac + shortcut: frk + disabled: true + + - name: fynd + engine: xpath + search_url: https://fynd.bot/?search={query}&offset={pageno}{safe_search} + safesearch: true + safe_search_map: + 0: '&safe=0' + 1: '&safe=1' + 2: '&safe=1' + results_xpath: //div[contains(@class, "result-item")] + url_xpath: .//a/@href + title_xpath: .//div[contains(@class, "title-line")] + content_xpath: .//div[contains(@class, "description")] + thumbnail_xpath: .//img[contains(@class, "preview-img")]/@src + paging: true + first_page_num: 0 + page_size: 10 + categories: general + disabled: true + shortcut: fynd + about: + website: https://fynd.bot + use_official_api: false + require_api_key: false + results: HTML + + - name: fyyd + engine: fyyd + shortcut: fy + timeout: 8.0 + disabled: true + + - name: geizhals + engine: geizhals + shortcut: geiz + disabled: true + + - name: genius + engine: genius + shortcut: gen + + - name: gentoo + engine: mediawiki + shortcut: ge + categories: ["it", "software wikis"] + base_url: "https://wiki.gentoo.org/" + api_path: "api.php" + search_type: text + timeout: 10 + + - name: gitlab + engine: gitlab + base_url: https://gitlab.com + shortcut: gl + disabled: true + about: + website: https://gitlab.com/ + wikidata_id: Q16639197 + + # - name: gnome + # engine: gitlab + # base_url: https://gitlab.gnome.org + # shortcut: gn + # about: + # website: https://gitlab.gnome.org + # wikidata_id: Q44316 + + - name: github + engine: github + shortcut: gh + + - name: github code + engine: github_code + shortcut: ghc + inactive: true + ghc_auth: + # type is one of: + # * none + # * personal_access_token + # * bearer + # When none is passed, the token is not requried. + type: "none" + token: "token" + # specify whether to highlight the matching lines to the query + ghc_highlight_matching_lines: true + ghc_strip_new_lines: true + ghc_strip_whitespace: false + timeout: 10.0 + + - name: codeberg + # https://docs.searxng.org/dev/engines/online/gitea.html + engine: gitea + base_url: https://codeberg.org + shortcut: cb + disabled: true + + - name: gitea.com + engine: gitea + base_url: https://gitea.com + shortcut: gitea + disabled: true + + - name: goodreads + engine: goodreads + shortcut: good + timeout: 4.0 + disabled: true + + - name: google + engine: google + shortcut: go + + - name: google images + engine: google_images + shortcut: goi + + - name: google news + engine: google_news + shortcut: gon + + - name: google videos + engine: google_videos + shortcut: gov + + - name: google scholar + engine: google_scholar + shortcut: gos + + - name: google play apps + engine: google_play + categories: [files, apps] + shortcut: gpa + play_categ: apps + disabled: true + + - name: google play movies + engine: google_play + categories: videos + shortcut: gpm + play_categ: movies + disabled: true + + - name: grokipedia + engine: grokipedia + shortcut: gp + disabled: true + inactive: true + + - name: material icons + engine: material_icons + shortcut: mi + disabled: true + + - name: habrahabr + engine: xpath + paging: true + search_url: https://habr.com/en/search/page{pageno}/?q={query} + results_xpath: //article[contains(@class, "tm-articles-list__item")] + url_xpath: .//a[@class="tm-title__link"]/@href + title_xpath: .//a[@class="tm-title__link"] + content_xpath: .//div[contains(@class, "article-formatted-body")] + categories: it + timeout: 4.0 + disabled: true + shortcut: habr + about: + website: https://habr.com/ + wikidata_id: Q4494434 + official_api_documentation: https://habr.com/en/docs/help/api/ + use_official_api: false + require_api_key: false + results: HTML + + - name: hackernews + engine: hackernews + shortcut: hn + disabled: true + + - name: hex + engine: hex + shortcut: hex + disabled: true + # Valid values: name inserted_at updated_at total_downloads recent_downloads + sort_criteria: "recent_downloads" + page_size: 10 + + - name: crates.io + engine: crates + shortcut: crates + disabled: true + timeout: 6.0 + + - name: hoogle + engine: xpath + search_url: https://hoogle.haskell.org/?hoogle={query} + results_xpath: '//div[@class="result"]' + title_xpath: './/div[@class="ans"]//a' + url_xpath: './/div[@class="ans"]//a/@href' + content_xpath: './/div[@class="from"]' + page_size: 20 + categories: [it, packages] + shortcut: ho + about: + website: https://hoogle.haskell.org/ + wikidata_id: Q34010 + official_api_documentation: https://hackage.haskell.org/api + use_official_api: false + require_api_key: false + results: JSON + + - name: il post + engine: il_post + shortcut: pst + disabled: true + + - name: huggingface + engine: huggingface + shortcut: hf + disabled: true + + - name: huggingface datasets + huggingface_endpoint: datasets + engine: huggingface + shortcut: hfd + disabled: true + + - name: huggingface spaces + huggingface_endpoint: spaces + engine: huggingface + shortcut: hfs + disabled: true + + - name: imdb + engine: imdb + shortcut: imdb + timeout: 6.0 + disabled: true + + - name: imgur + engine: imgur + shortcut: img + disabled: true + + - name: ina + engine: ina + shortcut: in + timeout: 6.0 + disabled: true + + # - name: invidious + # engine: invidious + # # if you want to use invidious with SearXNG you should setup one locally + # # https://github.com/searxng/searxng/issues/2722#issuecomment-2884993248 + # base_url: + # - https://invidious.example1.com + # - https://invidious.example2.com + # shortcut: iv + # timeout: 3.0 + + - name: ipernity + engine: ipernity + shortcut: ip + disabled: true + + - name: iqiyi + engine: iqiyi + shortcut: iq + disabled: true + + - name: jisho + engine: jisho + shortcut: js + timeout: 3.0 + disabled: true + + - name: karmasearch + engine: karmasearch + categories: [general, web] + search_type: web + shortcut: ka + + - name: karmasearch images + engine: karmasearch + categories: [images, web] + search_type: images + shortcut: kai + paging: false + + - name: karmasearch videos + engine: karmasearch + categories: [general, web] + search_type: videos + shortcut: kav + + - name: karmasearch news + engine: karmasearch + categories: [news, web] + search_type: news + shortcut: kan + + - name: kickass + engine: kickass + base_url: + - https://kickasstorrents.to + - https://kickasstorrents.cr + - https://kickasstorrent.cr + - https://kickass.sx + - https://kat.am + shortcut: kc + timeout: 4.0 + + - name: lemmy communities + engine: lemmy + lemmy_type: Communities + shortcut: leco + + - name: lemmy users + engine: lemmy + network: lemmy communities + lemmy_type: Users + shortcut: leus + + - name: lemmy posts + engine: lemmy + network: lemmy communities + lemmy_type: Posts + shortcut: lepo + + - name: lemmy comments + engine: lemmy + network: lemmy communities + lemmy_type: Comments + shortcut: lecom + + - name: library genesis + engine: xpath + # search_url: https://libgen.is/search.php?req={query} + search_url: https://libgen.rs/search.php?req={query} + url_xpath: //a[contains(@href,"book/index.php?md5")]/@href + title_xpath: //a[contains(@href,"book/")]/text()[1] + content_xpath: //td/a[1][contains(@href,"=author")]/text() + categories: files + timeout: 7.0 + disabled: true + shortcut: lg + about: + website: https://libgen.fun/ + wikidata_id: Q22017206 + official_api_documentation: + use_official_api: false + require_api_key: false + results: HTML + + - name: z-library + engine: zlibrary + shortcut: zlib + timeout: 7.0 + disabled: true + # https://github.com/searxng/searxng/issues/3610 + inactive: true + + - name: library of congress + engine: loc + shortcut: loc + categories: images + disabled: true + + - name: libretranslate + engine: libretranslate + # https://github.com/LibreTranslate/LibreTranslate?tab=readme-ov-file#mirrors + base_url: + - https://libretranslate.com/translate + # api_key: '' + shortcut: lt + inactive: true + + - name: lingva + engine: lingva + shortcut: lv + # set lingva instance in url, by default it will use the official instance + # url: https://lingva.thedaviddelta.com + + - name: lobste.rs + engine: xpath + search_url: https://lobste.rs/search?q={query}&what=stories&order=relevance + results_xpath: //li[contains(@class, "story")] + url_xpath: .//a[@class="u-url"]/@href + title_xpath: .//a[@class="u-url"] + content_xpath: .//a[@class="domain"] + categories: it + shortcut: lo + timeout: 5.0 + disabled: true + about: + website: https://lobste.rs/ + wikidata_id: Q60762874 + official_api_documentation: + use_official_api: false + require_api_key: false + results: HTML + + - name: lucide + engine: lucide + shortcut: luc + timeout: 3.0 + + - name: marginalia + engine: marginalia + shortcut: mar + # To get an API key, please follow the instructions at + # - https://about.marginalia-search.com/article/api/ + # api_key: '' + disabled: true + inactive: true + + - name: mastodon users + engine: mastodon + mastodon_type: accounts + base_url: https://mastodon.social + shortcut: mau + + - name: mastodon hashtags + engine: mastodon + mastodon_type: hashtags + base_url: https://mastodon.social + shortcut: mah + + # - name: matrixrooms + # engine: mrs + # # https://docs.searxng.org/dev/engines/online/mrs.html + # # base_url: https://mrs-api-host + # shortcut: mtrx + # disabled: true + + - name: mdn + shortcut: mdn + engine: json_engine + categories: [it] + paging: true + search_url: https://developer.mozilla.org/api/v1/search?q={query}&page={pageno} + results_query: documents + url_query: mdn_url + url_prefix: https://developer.mozilla.org + title_query: title + content_query: summary + about: + website: https://developer.mozilla.org + wikidata_id: Q3273508 + official_api_documentation: null + use_official_api: false + require_api_key: false + results: JSON + + - name: metacpan + engine: metacpan + shortcut: cpan + disabled: true + number_of_results: 20 + + # https://docs.searxng.org/dev/engines/offline/search-indexer-engines.html#module-searx.engines.meilisearch + # - name: meilisearch + # engine: meilisearch + # shortcut: mes + # enable_http: true + # base_url: http://localhost:7700 + # index: my-index + # auth_key: Bearer XXXX + + - name: microsoft learn + engine: microsoft_learn + shortcut: msl + disabled: true + + - name: mixcloud + engine: mixcloud + shortcut: mc + + # MongoDB engine + # Required dependency: pymongo + # - name: mymongo + # engine: mongodb + # shortcut: md + # exact_match_only: false + # host: '127.0.0.1' + # port: 27017 + # enable_http: true + # results_per_page: 20 + # database: 'business' + # collection: 'reviews' # name of the db collection + # key: 'name' # key in the collection to search for + + - name: mozhi + engine: mozhi + base_url: + - https://mozhi.aryak.me + - https://translate.bus-hit.me + - https://nyc1.mz.ggtyler.dev + # mozhi_engine: google - see https://mozhi.aryak.me for supported engines + timeout: 4.0 + shortcut: mz + disabled: true + + - name: mwmbl + engine: mwmbl + # api_url: https://api.mwmbl.org + shortcut: mwm + disabled: true + + - name: niconico + engine: niconico + shortcut: nico + disabled: true + + - name: npm + engine: npm + shortcut: npm + timeout: 5.0 + disabled: true + + - name: nyaa + engine: nyaa + shortcut: nt + disabled: true + + - name: mankier + engine: json_engine + search_url: https://www.mankier.com/api/v2/mans/?q={query} + results_query: results + url_query: url + title_query: name + content_query: description + categories: it + shortcut: man + about: + website: https://www.mankier.com/ + official_api_documentation: https://www.mankier.com/api + use_official_api: true + require_api_key: false + results: JSON + + - name: odysee + engine: odysee + shortcut: od + disabled: true + + - name: ollama + engine: ollama + shortcut: ollama + disabled: true + + - name: openairedatasets + engine: json_engine + paging: true + search_url: https://api.openaire.eu/search/datasets?format=json&page={pageno}&size=10&title={query} + results_query: response/results/result + url_query: metadata/oaf:entity/oaf:result/children/instance/webresource/url/$ + title_query: metadata/oaf:entity/oaf:result/title/$ + content_query: metadata/oaf:entity/oaf:result/description/$ + content_html_to_text: true + categories: "science" + shortcut: oad + timeout: 5.0 + about: + website: https://www.openaire.eu/ + wikidata_id: Q25106053 + official_api_documentation: https://api.openaire.eu/ + use_official_api: false + require_api_key: false + results: JSON + + - name: openairepublications + engine: json_engine + paging: true + search_url: https://api.openaire.eu/search/publications?format=json&page={pageno}&size=10&title={query} + results_query: response/results/result + url_query: metadata/oaf:entity/oaf:result/children/instance/webresource/url/$ + title_query: metadata/oaf:entity/oaf:result/title/$ + content_query: metadata/oaf:entity/oaf:result/description/$ + content_html_to_text: true + categories: science + shortcut: oap + timeout: 5.0 + about: + website: https://www.openaire.eu/ + wikidata_id: Q25106053 + official_api_documentation: https://api.openaire.eu/ + use_official_api: false + require_api_key: false + results: JSON + + - name: openalex + engine: openalex + shortcut: oa + # https://docs.searxng.org/dev/engines/online/openalex.html + # Recommended by OpenAlex: join the polite pool with an email address + # mailto: "[email protected]" + timeout: 5.0 + disabled: true + + - name: openclipart + engine: openclipart + shortcut: ocl + inactive: true + disabled: true + timeout: 30 + + - name: openlibrary + engine: openlibrary + shortcut: ol + timeout: 10 + disabled: true + + - name: openmeteo + engine: open_meteo + shortcut: om + disabled: true + + # - name: opensemanticsearch + # engine: opensemantic + # shortcut: oss + # base_url: 'http://localhost:8983/solr/opensemanticsearch/' + + - name: openstreetmap + engine: openstreetmap + shortcut: osm + + - name: openrepos + engine: xpath + paging: true + search_url: https://openrepos.net/search/node/{query}?page={pageno} + url_xpath: //li[@class="search-result"]//h3[@class="title"]/a/@href + title_xpath: //li[@class="search-result"]//h3[@class="title"]/a + content_xpath: //li[@class="search-result"]//div[@class="search-snippet-info"]//p[@class="search-snippet"] + categories: files + timeout: 4.0 + disabled: true + shortcut: or + about: + website: https://openrepos.net/ + wikidata_id: + official_api_documentation: + use_official_api: false + require_api_key: false + results: HTML + + - name: packagist + engine: json_engine + paging: true + search_url: https://packagist.org/search.json?q={query}&page={pageno} + results_query: results + url_query: url + title_query: name + content_query: description + categories: [it, packages] + disabled: true + timeout: 5.0 + shortcut: pack + about: + website: https://packagist.org + wikidata_id: Q108311377 + official_api_documentation: https://packagist.org/apidoc + use_official_api: true + require_api_key: false + results: JSON + + - name: pdbe + engine: pdbe + shortcut: pdb + # Hide obsolete PDB entries. Default is not to hide obsolete structures + # hide_obsolete: false + + - name: pexels + engine: pexels + shortcut: pe + + - name: photon + engine: photon + shortcut: ph + + - name: pinterest + engine: pinterest + shortcut: pin + + - name: piped + engine: piped + shortcut: ppd + categories: videos + piped_filter: videos + timeout: 3.0 + inactive: true + + # URL to use as link and for embeds + frontend_url: https://srv.piped.video + # Instance will be selected randomly, for more see https://piped-instances.kavin.rocks/ + backend_url: + - https://pipedapi.ducks.party + - https://api.piped.private.coffee + + - name: piped.music + engine: piped + network: piped + shortcut: ppdm + categories: music + piped_filter: music_songs + timeout: 3.0 + inactive: true + + - name: piratebay + engine: piratebay + shortcut: tpb + # You may need to change this URL to a proxy if piratebay is blocked in your + # country + url: https://thepiratebay.org/ + timeout: 3.0 + + - name: pixabay images + engine: pixabay + pixabay_type: images + categories: images + shortcut: pixi + disabled: true + + - name: pixabay videos + engine: pixabay + pixabay_type: videos + categories: videos + shortcut: pixv + disabled: true + + - name: pixiv + shortcut: pv + engine: pixiv + disabled: true + inactive: true + remove_ai_images: false + pixiv_image_proxies: + - https://pximg.example.org + # A proxy is required to load the images. Hosting an image proxy server + # for Pixiv: + # --> https://pixivfe-docs.pages.dev/hosting/image-proxy-server/ + # Proxies from public instances. Ask the public instances owners if they + # agree to receive traffic from SearXNG! + # --> https://codeberg.org/VnPower/PixivFE#instances + # --> https://github.com/searxng/searxng/pull/3192#issuecomment-1941095047 + # image proxy of https://pixiv.cat + # - https://i.pixiv.cat + # image proxy of https://www.pixiv.pics + # - https://pximg.cocomi.eu.org + # image proxy of https://pixivfe.exozy.me + # - https://pximg.exozy.me + # image proxy of https://pixivfe.ducks.party + # - https://pixiv.ducks.party + # image proxy of https://pixiv.perennialte.ch + # - https://pximg.perennialte.ch + + - name: podcastindex + engine: podcastindex + shortcut: podcast + + # Required dependency: psychopg2 + # - name: postgresql + # engine: postgresql + # database: postgres + # username: postgres + # password: postgres + # limit: 10 + # query_str: 'SELECT * from my_table WHERE my_column = %(query)s' + # shortcut : psql + + - name: presearch + engine: presearch + search_type: search + categories: [general, web] + shortcut: ps + timeout: 4.0 + disabled: true + + - name: presearch images + engine: presearch + network: presearch + search_type: images + categories: [images, web] + timeout: 4.0 + shortcut: psimg + disabled: true + + - name: presearch videos + engine: presearch + network: presearch + search_type: videos + categories: [general, web] + timeout: 4.0 + shortcut: psvid + disabled: true + + - name: presearch news + engine: presearch + network: presearch + search_type: news + categories: [news, web] + timeout: 4.0 + shortcut: psnews + disabled: true + + - name: pub.dev + engine: xpath + shortcut: pd + search_url: https://pub.dev/packages?q={query}&page={pageno} + paging: true + results_xpath: //div[contains(@class,"packages-item")] + url_xpath: ./div/h3/a/@href + title_xpath: ./div/h3/a + content_xpath: ./div/div/div[contains(@class,"packages-description")]/span + categories: [packages, it] + timeout: 3.0 + disabled: true + first_page_num: 1 + about: + website: https://pub.dev/ + official_api_documentation: https://pub.dev/help/api + use_official_api: false + require_api_key: false + results: HTML + + - name: public domain image archive + engine: public_domain_image_archive + shortcut: pdia + disabled: true + + - name: pubmed + engine: pubmed + shortcut: pub + + - name: pypi + shortcut: pypi + engine: pypi + + - name: quark + quark_category: general + categories: [general] + engine: quark + shortcut: qk + disabled: true + + - name: quark images + quark_category: images + categories: [images] + engine: quark + shortcut: qki + disabled: true + + - name: qwant + qwant_categ: web + engine: qwant + shortcut: qw + categories: [general, web] + disabled: true + + - name: qwant news + qwant_categ: news + engine: qwant + shortcut: qwn + categories: news + network: qwant + + - name: qwant images + qwant_categ: images + engine: qwant + shortcut: qwi + categories: [images, web] + network: qwant + + - name: qwant videos + qwant_categ: videos + engine: qwant + shortcut: qwv + categories: [videos, web] + network: qwant + + # - name: library + # engine: recoll + # shortcut: lib + # base_url: 'https://recoll.example.org/' + # search_dir: '' + # mount_prefix: /export + # dl_prefix: 'https://download.example.org' + # timeout: 30.0 + # categories: files + # disabled: true + + # - name: recoll library reference + # engine: recoll + # base_url: 'https://recoll.example.org/' + # search_dir: reference + # mount_prefix: /export + # dl_prefix: 'https://download.example.org' + # shortcut: libr + # timeout: 30.0 + # categories: files + # disabled: true + + - name: radio browser + engine: radio_browser + shortcut: rb + + - name: reddit + engine: reddit + shortcut: re + page_size: 25 + disabled: true + + - name: reuters + engine: reuters + shortcut: reu + # https://docs.searxng.org/dev/engines/online/reuters.html + # sort_order = "relevance" + + - name: rottentomatoes + engine: rottentomatoes + shortcut: rt + disabled: true + + # Required dependency: valkey + # - name: myvalkey + # shortcut : rds + # engine: valkey_server + # exact_match_only: false + # host: '127.0.0.1' + # port: 6379 + # enable_http: true + # password: '' + # db: 0 + + # tmp suspended: bad certificate + # - name: scanr structures + # shortcut: scs + # engine: scanr_structures + # disabled: true + + - name: searchmysite + engine: xpath + shortcut: sms + categories: general + paging: true + search_url: https://searchmysite.net/search/?q={query}&page={pageno} + results_xpath: //div[contains(@class,'search-result')] + url_xpath: .//a[contains(@class,'result-link')]/@href + title_xpath: .//span[contains(@class,'result-title-txt')]/text() + content_xpath: ./p[@id='result-hightlight'] + disabled: true + about: + website: https://searchmysite.net + + - name: selfhst icons + engine: selfhst + shortcut: si + disabled: true + + - name: sepiasearch + engine: sepiasearch + shortcut: sep + + - name: sogou + engine: sogou + shortcut: sogou + disabled: true + + - name: sogou images + engine: sogou_images + shortcut: sogoui + disabled: true + + - name: sogou videos + engine: sogou_videos + shortcut: sogouv + disabled: true + + - name: sogou wechat + engine: sogou_wechat + shortcut: sogouw + disabled: true + + - name: soundcloud + engine: soundcloud + shortcut: sc + + - name: stackoverflow + engine: stackexchange + shortcut: st + api_site: 'stackoverflow' + categories: [it, q&a] + + - name: askubuntu + engine: stackexchange + shortcut: ubuntu + api_site: 'askubuntu' + categories: [it, q&a] + + - name: superuser + engine: stackexchange + shortcut: su + api_site: 'superuser' + categories: [it, q&a] + + - name: discuss.python + engine: discourse + shortcut: dpy + base_url: 'https://discuss.python.org' + categories: [it, q&a] + disabled: true + + - name: caddy.community + engine: discourse + shortcut: caddy + base_url: 'https://caddy.community' + categories: [it, q&a] + disabled: true + + - name: pi-hole.community + engine: discourse + shortcut: pi + categories: [it, q&a] + base_url: 'https://discourse.pi-hole.net' + disabled: true + + # - name: searx + # engine: searx_engine + # shortcut: se + # instance_urls : + # - http://127.0.0.1:8888/ + # - ... + # disabled: true + + - name: semantic scholar + engine: semantic_scholar + shortcut: se + + # Spotify needs API credentials + # - name: spotify + # engine: spotify + # shortcut: stf + # api_client_id: ******* + # api_client_secret: ******* + + # - name: solr + # engine: solr + # shortcut: slr + # base_url: http://localhost:8983 + # collection: collection_name + # sort: '' # sorting: asc or desc + # field_list: '' # comma separated list of field names to display on the UI + # default_fields: '' # default field to query + # query_fields: '' # query fields + # enable_http: true + + - name: springer nature + engine: springer + shortcut: springer + timeout: 5 + # read https://docs.searxng.org/dev/engines/online/springer.html + api_key: "" + inactive: true + + - name: startpage + engine: startpage + shortcut: sp + startpage_categ: web + categories: [general, web] + + - name: startpage news + engine: startpage + startpage_categ: news + categories: [news, web] + shortcut: spn + + - name: startpage images + engine: startpage + startpage_categ: images + categories: [images, web] + shortcut: spi + + - name: steam + engine: steam + shortcut: stm + disabled: true + + - name: tokyotoshokan + engine: tokyotoshokan + shortcut: tt + timeout: 6.0 + disabled: true + + - name: solidtorrents + engine: solidtorrents + shortcut: solid + timeout: 4.0 + base_url: + - https://solidtorrents.to + - https://bitsearch.to + + # For this demo of the sqlite engine download: + # https://liste.mediathekview.de/filmliste-v2.db.bz2 + # and unpack into searx/data/filmliste-v2.db + # Query to test: "!mediathekview concert" + # + # - name: mediathekview + # engine: sqlite + # shortcut: mediathekview + # categories: [general, videos] + # result_type: MainResult + # database: searx/data/filmliste-v2.db + # query_str: >- + # SELECT title || ' (' || time(duration, 'unixepoch') || ')' AS title, + # COALESCE( NULLIF(url_video_hd,''), NULLIF(url_video_sd,''), url_video) AS url, + # description AS content + # FROM film + # WHERE title LIKE :wildcard OR description LIKE :wildcard + # ORDER BY duration DESC + + - name: tagesschau + engine: tagesschau + # when set to false, display URLs from Tagesschau, and not the actual source + # (e.g. NDR, WDR, SWR, HR, ...) + use_source_url: true + shortcut: ts + disabled: true + + - name: tmdb + engine: xpath + paging: true + categories: movies + search_url: https://www.themoviedb.org/search?page={pageno}&query={query} + results_xpath: //div[contains(@class,"movie") or contains(@class,"tv")]//div[contains(@class,"card")] + url_xpath: .//div[contains(@class,"poster")]/a/@href + thumbnail_xpath: .//img/@src + title_xpath: .//div[contains(@class,"title")]//h2 + content_xpath: .//div[contains(@class,"overview")] + shortcut: tm + disabled: true + + # Requires Tor + - name: torch + engine: xpath + paging: true + search_url: + http://xmh57jrknzkhv6y3ls3ubitzfqnkrwxhopf5aygthi7d6rplyvk3noyd.onion/cgi-bin/omega/omega?P={query}&DEFAULTOP=and + results_xpath: //table//tr + url_xpath: ./td[2]/a + title_xpath: ./td[2]/b + content_xpath: ./td[2]/small + categories: onions + enable_http: true + shortcut: tch + + # TubeArchivist is a self-hosted Youtube archivist software. + # https://docs.searxng.org/dev/engines/online/tubearchivist.html + # + # - name: tubearchivist + # engine: tubearchivist + # shortcut: tuba + # base_url: + # ta_token: + # ta_link_to_mp4: false + + # torznab engine lets you query any torznab compatible indexer. Using this + # engine in combination with Jackett opens the possibility to query a lot of + # public and private indexers directly from SearXNG. More details at: + # https://docs.searxng.org/dev/engines/online/torznab.html + - name: Torznab EZTV + engine: torznab + shortcut: eztv + # base_url: http://localhost:9117/api/v2.0/indexers/eztv/results/torznab + # enable_http: true # if using localhost + # api_key: xxxxxxxxxxxxxxx + show_magnet_links: true + show_torrent_files: false + # https://github.com/Jackett/Jackett/wiki/Jackett-Categories + torznab_categories: # optional + - 2000 + - 5000 + inactive: true + + # tmp suspended - too slow, too many errors + # - name: urbandictionary + # engine : xpath + # search_url : https://www.urbandictionary.com/define.php?term={query} + # url_xpath : //*[@class="word"]/@href + # title_xpath : //*[@class="def-header"] + # content_xpath: //*[@class="meaning"] + # shortcut: ud + + - name: unsplash + engine: unsplash + shortcut: us + + - name: yandex + engine: yandex + categories: general + search_type: web + shortcut: yd + disabled: true + + - name: yandex images + engine: yandex + network: yandex + categories: images + search_type: images + shortcut: ydi + disabled: true + + - name: yandex music + engine: yandex_music + network: yandex + shortcut: ydm + disabled: true + # https://yandex.com/support/music/access.html + + - name: yahoo + engine: yahoo + shortcut: yh + disabled: true + + - name: yahoo news + engine: yahoo_news + shortcut: yhn + + - name: youtube + shortcut: yt + engine: youtube_noapi + + - name: youtube_api + # You can use the engine using the official stable API, but you need an API + # key See: https://console.developers.google.com/project + engine: youtube_api + # api_key: '' # required! + shortcut: yta + inactive: true + + - name: dailymotion + engine: dailymotion + shortcut: dm + + - name: vimeo + engine: vimeo + shortcut: vm + + - name: wiby + engine: json_engine + paging: true + search_url: https://wiby.me/json/?q={query}&p={pageno} + url_query: URL + title_query: Title + content_query: Snippet + categories: [general, web] + shortcut: wib + disabled: true + about: + website: https://wiby.me/ + + - name: wikibooks + engine: mediawiki + weight: 0.5 + shortcut: wb + categories: [general, wikimedia] + base_url: "https://{language}.wikibooks.org/" + search_type: text + disabled: true + about: + website: https://www.wikibooks.org/ + wikidata_id: Q367 + + - name: wikinews + engine: mediawiki + shortcut: wn + categories: [news, wikimedia] + base_url: "https://{language}.wikinews.org/" + search_type: text + srsort: create_timestamp_desc + about: + website: https://www.wikinews.org/ + wikidata_id: Q964 + + - name: wikiquote + engine: mediawiki + weight: 0.5 + shortcut: wq + categories: [general, wikimedia] + base_url: "https://{language}.wikiquote.org/" + search_type: text + disabled: true + about: + website: https://www.wikiquote.org/ + wikidata_id: Q369 + + - name: wikisource + engine: mediawiki + weight: 0.5 + shortcut: ws + categories: [general, wikimedia] + base_url: "https://{language}.wikisource.org/" + search_type: text + disabled: true + about: + website: https://www.wikisource.org/ + wikidata_id: Q263 + + - name: wikispecies + engine: mediawiki + shortcut: wsp + categories: [general, science, wikimedia] + base_url: "https://species.wikimedia.org/" + search_type: text + disabled: true + about: + website: https://species.wikimedia.org/ + wikidata_id: Q13679 + + - name: wiktionary + engine: mediawiki + shortcut: wt + categories: [dictionaries, wikimedia] + base_url: "https://{language}.wiktionary.org/" + search_type: text + about: + website: https://www.wiktionary.org/ + wikidata_id: Q151 + + - name: wikiversity + engine: mediawiki + weight: 0.5 + shortcut: wv + categories: [general, wikimedia] + base_url: "https://{language}.wikiversity.org/" + search_type: text + disabled: true + about: + website: https://www.wikiversity.org/ + wikidata_id: Q370 + + - name: wikivoyage + engine: mediawiki + weight: 0.5 + shortcut: wy + categories: [general, wikimedia] + base_url: "https://{language}.wikivoyage.org/" + search_type: text + disabled: true + about: + website: https://www.wikivoyage.org/ + wikidata_id: Q373 + + - name: wikicommons.images + engine: wikicommons + shortcut: wci + categories: images + wc_search_type: image + + - name: wikicommons.videos + engine: wikicommons + shortcut: wcv + categories: videos + wc_search_type: video + + - name: wikicommons.audio + engine: wikicommons + shortcut: wca + categories: music + wc_search_type: audio + + - name: wikicommons.files + engine: wikicommons + shortcut: wcf + categories: files + wc_search_type: file + + - name: wolframalpha + shortcut: wa + engine: wolframalpha_noapi + timeout: 6.0 + categories: general + disabled: true + + - name: wolframalpha_api + # You can use the engine using the official stable API, but you need an API + # key. See: https://products.wolframalpha.com/api/ + engine: wolframalpha_api + # api_key: '' # required! + shortcut: waa + timeout: 6.0 + categories: general + inactive: true + + - name: dictzone + engine: dictzone + shortcut: dc + + - name: mymemory translated + engine: translated + shortcut: tl + timeout: 5.0 + # You can use without an API key, but you are limited to 1000 words/day + # See: https://mymemory.translated.net/doc/usagelimits.php + # api_key: '' + + # Required dependency: mysql-connector-python + # - name: mysql + # engine: mysql_server + # database: mydatabase + # username: user + # password: pass + # limit: 10 + # query_str: 'SELECT * from mytable WHERE fieldname=%(query)s' + # shortcut: mysql + + # Required dependency: mariadb + # - name: mariadb + # engine: mariadb_server + # database: mydatabase + # username: user + # password: pass + # limit: 10 + # query_str: 'SELECT * from mytable WHERE fieldname=%(query)s' + # shortcut: mdb + + - name: 1337x + engine: 1337x + shortcut: 1337x + disabled: true + + - name: duden + engine: duden + shortcut: du + disabled: true + + - name: seznam + shortcut: szn + engine: seznam + disabled: true + + - name: deepl + engine: deepl + shortcut: dpl + # You can use the engine using the official stable API, but you need an API key + # See: https://www.deepl.com/pro-api?cta=header-pro-api + # api_key: '' # required! + timeout: 5.0 + inactive: true + + - name: mojeek + shortcut: mjk + engine: mojeek + categories: [general, web] + disabled: true + + - name: mojeek images + shortcut: mjkimg + engine: mojeek + categories: [images, web] + search_type: images + paging: false + disabled: true + + - name: mojeek news + shortcut: mjknews + engine: mojeek + categories: [news, web] + search_type: news + paging: false + disabled: true + + - name: moviepilot + engine: moviepilot + shortcut: mp + disabled: true + + - name: national vulnerability database + engine: nvd + shortcut: nvd + disabled: true + + - name: naver + categories: [general, web] + engine: naver + shortcut: nvr + disabled: true + + - name: naver images + naver_category: images + categories: [images] + engine: naver + shortcut: nvri + disabled: true + + - name: naver news + naver_category: news + categories: [news] + engine: naver + shortcut: nvrn + disabled: true + + - name: naver videos + naver_category: videos + categories: [videos] + engine: naver + shortcut: nvrv + disabled: true + + - name: rubygems + shortcut: rbg + engine: xpath + paging: true + search_url: https://rubygems.org/search?page={pageno}&query={query} + results_xpath: /html/body/main/div/a[@class="gems__gem"] + url_xpath: ./@href + title_xpath: ./span/h2 + content_xpath: ./span/p + suggestion_xpath: /html/body/main/div/div[@class="search__suggestions"]/p/a + first_page_num: 1 + categories: [it, packages] + disabled: true + about: + website: https://rubygems.org/ + wikidata_id: Q1853420 + official_api_documentation: https://guides.rubygems.org/rubygems-org-api/ + use_official_api: false + require_api_key: false + results: HTML + + - name: peertube + engine: peertube + shortcut: ptb + paging: true + # alternatives see: https://instances.joinpeertube.org/instances + # base_url: https://tube.4aem.com + categories: videos + disabled: true + timeout: 6.0 + + - name: mediathekviewweb + engine: mediathekviewweb + shortcut: mvw + disabled: true + + - name: yacy + # https://docs.searxng.org/dev/engines/online/yacy.html + engine: yacy + categories: general + search_type: text + # see https://github.com/searxng/searxng/pull/3631#issuecomment-2240903027 + base_url: + - https://yacy.searchlab.eu + shortcut: ya + disabled: true + # if you aren't using HTTPS for your local yacy instance disable https + # enable_http: false + search_mode: 'global' + # timeout can be reduced in 'local' search mode + timeout: 5.0 + + - name: yacy images + engine: yacy + network: yacy + categories: images + search_type: image + shortcut: yai + disabled: true + # timeout can be reduced in 'local' search mode + timeout: 5.0 + + - name: rumble + engine: rumble + shortcut: ru + base_url: https://rumble.com/ + paging: true + categories: videos + disabled: true + + - name: repology + engine: repology + shortcut: rep + disabled: true + inactive: true + + - name: wordnik + engine: wordnik + shortcut: wnik + timeout: 5.0 + + - name: woxikon.de synonyme + engine: xpath + shortcut: woxi + categories: [dictionaries] + timeout: 5.0 + disabled: true + search_url: https://synonyme.woxikon.de/synonyme/{query}.php + url_xpath: //div[@class="upper-synonyms"]/a/@href + content_xpath: //div[@class="synonyms-list-group"] + title_xpath: //div[@class="upper-synonyms"]/a + no_result_for_http_status: [404] + about: + website: https://www.woxikon.de/ + wikidata_id: # No Wikidata ID + use_official_api: false + require_api_key: false + results: HTML + language: de + + - name: svgrepo + engine: svgrepo + shortcut: svg + timeout: 10.0 + disabled: true + + - name: tootfinder + engine: tootfinder + shortcut: toot + + - name: uxwing + engine: uxwing + shortcut: ux + disabled: true + + - name: voidlinux + engine: voidlinux + shortcut: void + disabled: true + + - name: wallhaven + engine: wallhaven + # api_key: abcdefghijklmnopqrstuvwxyz + shortcut: wh + inactive: true + + # wikimini: online encyclopedia for children + # The fulltext and title parameter is necessary for Wikimini because + # sometimes it will not show the results and redirect instead + - name: wikimini + engine: xpath + shortcut: wkmn + search_url: https://fr.wikimini.org/w/index.php?search={query}&title=Sp%C3%A9cial%3ASearch&fulltext=Search + url_xpath: //li/div[@class="mw-search-result-heading"]/a/@href + title_xpath: //li//div[@class="mw-search-result-heading"]/a + content_xpath: //li/div[@class="searchresult"] + categories: general + disabled: true + about: + website: https://wikimini.org/ + wikidata_id: Q3568032 + use_official_api: false + require_api_key: false + results: HTML + language: fr + + - name: wttr.in + engine: wttr + shortcut: wttr + timeout: 9.0 + + - name: braveapi + engine: braveapi + # read https://docs.searxng.org/dev/engines/online/brave.html + api_key: "" + inactive: true + + - name: brave + engine: brave + shortcut: br + time_range_support: true + paging: true + categories: [general, web] + brave_category: search + # brave_spellcheck: true + + - name: brave.images + engine: brave + network: brave + shortcut: brimg + categories: [images, web] + brave_category: images + + - name: brave.videos + engine: brave + network: brave + shortcut: brvid + categories: [videos, web] + brave_category: videos + + - name: brave.news + engine: brave + network: brave + shortcut: brnews + categories: news + brave_category: news + + # - name: brave.goggles + # engine: brave + # network: brave + # shortcut: brgog + # time_range_support: true + # paging: true + # categories: [general, web] + # brave_category: goggles + # Goggles: # required! This should be a URL ending in .goggle + + - name: lib.rs + shortcut: lrs + engine: lib_rs + disabled: true + + - name: sourcehut + shortcut: srht + engine: sourcehut + # https://docs.searxng.org/dev/engines/online/sourcehut.html + # sourcehut_sort_order: longest-active + disabled: true + + - name: bt4g + engine: bt4g + shortcut: bt4g + + - name: pkg.go.dev + engine: pkg_go_dev + shortcut: pgo + disabled: true + + - name: senscritique + engine: senscritique + shortcut: scr + timeout: 4.0 + disabled: true + + - name: minecraft wiki + engine: mediawiki + shortcut: mcw + categories: ["software wikis"] + base_url: https://minecraft.wiki/ + api_path: "api.php" + search_type: text + disabled: true + about: + website: https://minecraft.wiki/ + wikidata_id: Q105533483 + +# Doku engine lets you access to any Doku wiki instance: +# A public one or a privete/corporate one. +# - name: ubuntuwiki +# engine: doku +# shortcut: uw +# base_url: 'https://doc.ubuntu-fr.org' + +# Be careful when enabling this engine if you are +# running a public instance. Do not expose any sensitive +# information. You can restrict access by configuring a list +# of access tokens under tokens. +# - name: git grep +# engine: command +# command: ['git', 'grep', '{{QUERY}}'] +# shortcut: gg +# tokens: [] +# disabled: true +# delimiter: +# chars: ':' +# keys: ['filepath', 'code'] + +# Be careful when enabling this engine if you are +# running a public instance. Do not expose any sensitive +# information. You can restrict access by configuring a list +# of access tokens under tokens. +# - name: locate +# engine: command +# command: ['locate', '{{QUERY}}'] +# shortcut: loc +# tokens: [] +# disabled: true +# delimiter: +# chars: ' ' +# keys: ['line'] + +# Be careful when enabling this engine if you are +# running a public instance. Do not expose any sensitive +# information. You can restrict access by configuring a list +# of access tokens under tokens. +# - name: find +# engine: command +# command: ['find', '.', '-name', '{{QUERY}}'] +# query_type: path +# shortcut: fnd +# tokens: [] +# disabled: true +# delimiter: +# chars: ' ' +# keys: ['line'] + +# Be careful when enabling this engine if you are +# running a public instance. Do not expose any sensitive +# information. You can restrict access by configuring a list +# of access tokens under tokens. +# - name: pattern search in files +# engine: command +# command: ['fgrep', '{{QUERY}}'] +# shortcut: fgr +# tokens: [] +# disabled: true +# delimiter: +# chars: ' ' +# keys: ['line'] + +# Be careful when enabling this engine if you are +# running a public instance. Do not expose any sensitive +# information. You can restrict access by configuring a list +# of access tokens under tokens. +# - name: regex search in files +# engine: command +# command: ['grep', '{{QUERY}}'] +# shortcut: gr +# tokens: [] +# disabled: true +# delimiter: +# chars: ' ' +# keys: ['line'] + +doi_resolvers: + oadoi.org: 'https://oadoi.org/' + doi.org: 'https://doi.org/' + sci-hub.se: 'https://sci-hub.se/' + sci-hub.st: 'https://sci-hub.st/' + sci-hub.ru: 'https://sci-hub.ru/' + +default_doi_resolver: 'oadoi.org' +``` + +```yaml +services: + searxng-core: + container_name: searxng-core + image: searxng/searxng:2026.3.29-7ac4ff39f + restart: on-failure:3 + ports: + - "36571:8080" + volumes: + - ./searxng-conf/:/etc/searxng/ + - ./searxng-data:/var/cache/searxng/ + + searxng-valkey: + container_name: searxng-valkey + image: valkey/valkey:9-alpine + command: valkey-server --save 30 1 --loglevel warning + restart: on-failure:3 + volumes: + - ./valkey-data:/data/ +``` \ No newline at end of file diff --git a/Docker-构建镜像-OpenJDK.md b/Docker-构建镜像-OpenJDK.md new file mode 100644 index 0000000..1151781 --- /dev/null +++ b/Docker-构建镜像-OpenJDK.md @@ -0,0 +1,74 @@ +## JDK21 +``` +FROM docker.1ms.run/eclipse-temurin:21-jdk +ENV TZ=Asia/Shanghai +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone +RUN echo "deb https://mirrors.aliyun.com/debian/ bullseye main contrib non-free" > /etc/apt/sources.list && \ + echo "deb https://mirrors.aliyun.com/debian-security/ bullseye-security main contrib non-free" >> /etc/apt/sources.list && \ + echo "deb https://mirrors.aliyun.com/debian/ bullseye-updates main contrib non-free" >> /etc/apt/sources.list && \ + apt-get update && \ + apt-get install -y git maven && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* +``` + +## JDK8 +``` +FROM docker.1ms.run/maven:3.8.6-jdk-8 +ENV TZ=Asia/Shanghai +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone +RUN echo "deb https://mirrors.aliyun.com/debian/ bullseye main contrib non-free" > /etc/apt/sources.list && \ + echo "deb https://mirrors.aliyun.com/debian-security/ bullseye-security main contrib non-free" >> /etc/apt/sources.list && \ + echo "deb https://mirrors.aliyun.com/debian/ bullseye-updates main contrib non-free" >> /etc/apt/sources.list && \ + apt-get update && \ + apt-get install -y git && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* +``` + +## 使用本地 JDK 与 Maven 构建 + +要先下载 OpenJDK 和 Maven,与 Dockerfile 同级目录,分别命名为 jdk-21 和 mvn-3,目录结构: + +- Dockerfile +- jdk-21/ +- mvn-3/ + +```shell +FROM ubuntu:22.04 + +ENV DEBIAN_FRONTEND=noninteractive \ + TZ=Asia/Shanghai + +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + locales \ + tzdata \ + ca-certificates \ + git && \ + rm -rf /var/lib/apt/lists/* + +RUN locale-gen zh_CN.UTF-8 en_US.UTF-8 + +ENV LANG=zh_CN.UTF-8 \ + LANGUAGE=zh_CN:zh \ + LC_ALL=zh_CN.UTF-8 + +RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ + dpkg-reconfigure -f noninteractive tzdata + +WORKDIR /opt + +COPY jdk-21 jdk21 +COPY mvn-3 mvn + +ENV JAVA_HOME=/opt/jdk21 \ + MAVEN_HOME=/opt/mvn \ + PATH="/opt/jdk21/bin:/opt/mvn/bin:${PATH}" +``` + +执行命令开始构建 + +```shell +docker build -t ubuntu-jdk-21 . +``` \ No newline at end of file diff --git a/Docker-构建镜像-spring-boot-v2.md b/Docker-构建镜像-spring-boot-v2.md new file mode 100644 index 0000000..db19980 --- /dev/null +++ b/Docker-构建镜像-spring-boot-v2.md @@ -0,0 +1,19 @@ +``` +FROM docker.1ms.run/library/mvn-java-8:latest +ENV PROJECT_ACTIVE=根据实际情况激活 application-xxx.yaml 配置文件,比如:prod +WORKDIR /app +EXPOSE springboot 内嵌的 servlet 容器端口号 + +# 配置容器启动命令 +RUN << 'EOF' cat > /entrypoint.sh +#!/bin/bash +set -e +cd /app && rm -rf 源码目录 +git clone "http://用户名:密码@远程仓库地址.git" +cd /app/源码目录 && mvn clean package +exec java -jar target/jar包名称.jar --spring.profiles.active=$PROJECT_ACTIVE +EOF + +RUN chmod +x /entrypoint.sh +ENTRYPOINT ["/entrypoint.sh"] +``` \ No newline at end of file diff --git a/Docker-构建镜像-spring-boot-v3.md b/Docker-构建镜像-spring-boot-v3.md new file mode 100644 index 0000000..face273 --- /dev/null +++ b/Docker-构建镜像-spring-boot-v3.md @@ -0,0 +1,19 @@ +``` +FROM docker.1ms.run/library/mvn-java-21:latest +ENV PROJECT_ACTIVE=根据实际情况激活 application-xxx.yaml 配置文件,比如:prod +WORKDIR /app +EXPOSE springboot 内嵌的 servlet 容器端口号 + +# 配置容器启动命令 +RUN << 'EOF' cat > /entrypoint.sh +#!/bin/bash +set -e +cd /app && rm -rf 源码目录 +git clone "http://用户名:密码@远程仓库地址.git" +cd /app/源码目录 && mvn clean package +exec java -jar target/jar包名称.jar --spring.profiles.active=$PROJECT_ACTIVE +EOF + +RUN chmod +x /entrypoint.sh +ENTRYPOINT ["/entrypoint.sh"] +``` \ No newline at end of file diff --git a/Docker-构建镜像Node16.md b/Docker-构建镜像Node16.md new file mode 100644 index 0000000..d73bc4a --- /dev/null +++ b/Docker-构建镜像Node16.md @@ -0,0 +1,5 @@ +``` +FROM docker.1ms.run/node:16-alpine +RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories +RUN apk add --no-cache git nginx +``` \ No newline at end of file diff --git a/Linux-Ubuntu-安装Docker.md b/Linux-Ubuntu-安装Docker.md new file mode 100644 index 0000000..fae2b02 --- /dev/null +++ b/Linux-Ubuntu-安装Docker.md @@ -0,0 +1,114 @@ +# 前提条件 + +- 系统:Ubuntu 22.04 +- 架构:x86_x64 + +## 安装必要工具 + +```bash +sudo apt update && sudo apt install -y ca-certificates curl gnupg lsb-release +``` + +## 添加 Docker 的官方 GPG 密钥 + +先检查是否包含相关目录 +```bash +ls /etc/apt/keyrings +``` + +如果没有则创建 +```bash +sudo install -m 0755 -d /etc/apt/keyrings +``` + +下载并保存 +```bash +curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg +``` + +## 设置 Docker 仓库 + +```bash +echo \ + "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ + $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ + sudo tee /etc/apt/sources.list.d/docker.list > /dev/null +``` + +## 更新并安装 + +```bash +sudo apt update +``` + +```bash +sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin +``` + +```bash +docker -v +``` + +## 配置 Docker 代理服务(可选) + +```bash +sudo mkdir -p /etc/systemd/system/docker.service.d +``` + +```bash +sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf +``` + +``` +[Service] +Environment="HTTP_PROXY=http://192.168.31.9:7890" +Environment="HTTPS_PROXY=http://192.168.31.9:7890" +Environment="NO_PROXY=localhost,127.0.0.1,::1,docker-registry.somecorporation.com" +``` + +```bash +sudo systemctl daemon-reload +``` + +```bash +sudo systemctl restart docker +``` + +验证代理配置是否生效 +```bash +sudo systemctl show --property=Environment docker +``` + +## 配置 NVIDIA 容器环境(可选) + +添加 NVIDIA 包仓库 +```bash +curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit.gpg +``` + +```bash +curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit.gpg] https://#g' | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list +``` + +```bash +sudo apt update +``` + +安装 NVIDIA 容器工具包 +```bash +sudo apt install -y nvidia-container-toolkit +``` + +配置 NVIDIA 运行时 +```bash +sudo nvidia-ctk runtime configure --runtime=docker +``` + +```bash +sudo systemctl restart docker +``` + +测试是否能识别 +```bash +docker run --rm --gpus all nvidia/cuda:12.4.1-base-ubuntu22.04 nvidia-smi +``` \ No newline at end of file diff --git a/Linux-Ubuntu-更换中科大APT源.md b/Linux-Ubuntu-更换中科大APT源.md new file mode 100644 index 0000000..50a5fd5 --- /dev/null +++ b/Linux-Ubuntu-更换中科大APT源.md @@ -0,0 +1,18 @@ +## Ubuntu 24.04 + +```bash +# 备份原文件(可选) +sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak +``` + +```bash +sudo sed -i 's|http://archive.ubuntu.com|http://mirrors.ustc.edu.cn|g' /etc/apt/sources.list.d/ubuntu.sources +``` + +```bash +sudo sed -i 's|http://security.ubuntu.com|http://mirrors.ustc.edu.cn|g' /etc/apt/sources.list.d/ubuntu.sources +``` + +```bash +sudo apt update +``` \ No newline at end of file diff --git a/Linux-Ubuntu-查看系统详情.md b/Linux-Ubuntu-查看系统详情.md new file mode 100644 index 0000000..1bcc272 --- /dev/null +++ b/Linux-Ubuntu-查看系统详情.md @@ -0,0 +1,11 @@ +# 安装相关工具 + +```bash +sudo apt update && sudo apt install -y pciutils util-linux +``` + +# 打印系统详情 + +```bash +echo "=== 系统核心信息 ===" && lsb_release -a && echo -e "\n=== 内核版本 ===" && uname -r && echo -e "\n=== 硬件架构 ===" && uname -m && echo -e "\n=== CPU 信息 ===" && lscpu | grep -E "架构|CPU:|型号名称" && echo -e "\n=== 内存使用情况 ===" && free -h && echo -e "\n=== 磁盘空间 (根分区) ===" && df -h / && echo -e "\n=== 显卡信息 ===" && lspci -k | grep -A 2 -i vga && echo -e "\n=== 当前运行内核引导参数 ===" && cat /proc/cmdline +``` \ No newline at end of file diff --git a/Linux-Ubuntu-配置代理服务器.md b/Linux-Ubuntu-配置代理服务器.md new file mode 100644 index 0000000..d3e9170 --- /dev/null +++ b/Linux-Ubuntu-配置代理服务器.md @@ -0,0 +1,44 @@ +## 用户级别 + +```bash +nano ~/.bashrc +``` + +``` +# Proxy Configuration +export HTTP_PROXY="http://192.168.31.9:7890" +export HTTPS_PROXY="http://192.168.31.9:7890" +export http_proxy="http://192.168.31.9:7890" +export https_proxy="http://192.168.31.9:7890" + +# 可选:设置不走代理的地址 (本地地址和内部域名) +export NO_PROXY="localhost,127.0.0.1,::1,192.168.*,10.*" +export no_proxy="localhost,127.0.0.1,::1,192.168.*,10.*" +``` + +保存并退出(`Ctrl + O` `Enter` `Ctrl + X`) + +```bash +source ~/.bashrc +``` + +## 对所有用户生效(需重启系统) + +```bash +sudo nano /etc/environment +``` + +``` +HTTP_PROXY="http://192.168.31.9:7890" +HTTPS_PROXY="http://192.168.31.9:7890" +http_proxy="http://192.168.31.9:7890" +https_proxy="http://192.168.31.9:7890" +NO_PROXY="localhost,127.0.0.1,::1" +no_proxy="localhost,127.0.0.1,::1" +``` + +保存并退出(`Ctrl + O` `Enter` `Ctrl + X`) + +```bash +sudo reboot +``` \ No newline at end of file diff --git a/Linux-安装内网穿透工具.md b/Linux-安装内网穿透工具.md new file mode 100644 index 0000000..aa75a8a --- /dev/null +++ b/Linux-安装内网穿透工具.md @@ -0,0 +1,136 @@ +# 文档 + +- 原作者:https://ehang-io.github.io/nps +- 维护者:https://my.feishu.cn/wiki/FmVVwDcEGiTZxekYJl5ccuFanlg +- Github:https://github.com/yisier/nps/releases + +## 服务端 + +下载`linux_amd64_server.tar.gz`压缩包并解压,然后执行`sudo ./nps install`安装。修改配置文件: + +``` +nano /etc/nps/conf/nps.conf +``` + +``` +# 自定义,英文+数字,不超过16位 +public_vkey= +# 自定义,英文+数字,不超过16位 +auth_key= +# 自定义,英文+数字,固定16位 +auth_crypt_key= +# 网页端管理员用户名 +web_username=admin +# 网页端管理员账号的密码,英文+数字+特殊符号(.@!) +web_password= + +appname = nps +#Boot mode(dev|pro) +runmode = pro + +#HTTP(S) proxy port, no startup if empty +http_proxy_ip=0.0.0.0 +http_proxy_port=26666 +https_proxy_port=36666 +https_just_proxy=true + +#default https certificate setting +https_default_cert_file=conf/server.pem +https_default_key_file=conf/server.key + +##bridge +bridge_type=tcp +bridge_port=28888 +bridge_ip=0.0.0.0 + +#Traffic data persistence interval(minute) +#Ignorance means no persistence +flow_store_interval=1 + +# log level LevelEmergency->0 LevelAlert->1 LevelCritical->2 LevelError->3 LevelWarning->4 LevelNotice->5 LevelInformational->6 LevelDebug->7 +log_level=6 +log_path=nps.log + +#p2p +#p2p_ip=127.0.0.1 +#p2p_port=6000 + +#web +web_host=a.o.com +web_port = 38888 +web_ip=0.0.0.0 +web_base_url= +web_open_ssl=false +web_cert_file=conf/server.pem +web_key_file=conf/server.key + +# if web under proxy use sub path. like http://host/nps need this. +#web_base_url=/nps +#allow_ports=9001-9009,10001,11000-12000 + +#Web management multi-user login +allow_user_login=false +allow_user_register=false +allow_user_change_username=false + +#extension +#流量限制 +allow_flow_limit=true +#带宽限制 +allow_rate_limit=true +#客户端最大隧道数限制 +allow_tunnel_num_limit=true +allow_local_proxy=false +#客户端最大连接数 +allow_connection_num_limit=true +#每个隧道监听不同的服务端端口 +allow_multi_ip=true +system_info_display=true + +#获取用户真实ip +http_add_origin_header=true + +#cache +http_cache=false +http_cache_length=10 +#get origin ip +#http_add_origin_header=false + +#pprof debug options +#pprof_ip=0.0.0.0 +#pprof_port=9999 + +#client disconnect timeout +disconnect_timeout=60 + +#管理面板开启验证码校验 +open_captcha=false + +# 是否开启tls +tls_enable=true +tls_bridge_port=48888 +``` + +修改完成后,执行`sudo nps start`启动服务端。 + +| 端口号 | 用途 | +|:-----|:-----| +| 26666 | http代理端口 | +| 36666 | https代理端口 | +| 28888 | TCP隧道端口 | +| 38888 | WebUI的端口 | +| 48888 | TCP隧道 TLS 端口 | + + +## 客户端 + +下载`linux_amd64_client.tar.gz`压缩包并解压 + +``` +# 安装 +sudo ./npc install -server=服务端IP:28888 -vkey= +# 启动 +sudo npc start +# 停止 +sudo npc stop +``` \ No newline at end of file diff --git a/Linux-实用命令.md b/Linux-实用命令.md new file mode 100644 index 0000000..c6f9932 --- /dev/null +++ b/Linux-实用命令.md @@ -0,0 +1,13 @@ +## 关键字搜索并排序 + +```bash +grep -h '关键字' *.log | sort +``` + +## 打印一个时间范围的片段 + +按分钟级匹配,按秒的话结束时间不存在日志,会导致一直输出到文件末尾 + +```bash +sed -n '/2026-03-26 10:15/, /2026-03-26 10:20/p' xxx.log +``` \ No newline at end of file diff --git a/Linux-挂载NAS中的文件夹到本机.md b/Linux-挂载NAS中的文件夹到本机.md new file mode 100644 index 0000000..1221d40 --- /dev/null +++ b/Linux-挂载NAS中的文件夹到本机.md @@ -0,0 +1,87 @@ +# Intro + +本文介绍如何把 NAS 主机目录挂载到 Linux 主机,并通过 Volume 挂载到 Docker 容器,借助 NAS 的阵列盘实现高可靠数据存储。 + +- NAS:"/vol1/workspace" +- Linux:"/mnt/nas/vol1/workspace" +- Docker:"/workspace" + +假设 NAS 的用户名密码是"admin/123456",IP为"192.168.1.100",目录映射目标:"/vol1/workspace" -> "/mnt/nas/vol1/workspace" -> "/workspace"。 + +## 基于 NFS 协议挂载 + +1. 在 Linux 安装相关工具 + +Debian/Ubuntu: + +```bash +sudo apt update && sudo apt install nfs-common -y +``` + +CentOS/RHEL: + +```bash +sudo yum install nfs-utils +``` + +2. 创建目录 + +NAS: + +```bash +sudo /vol1/workspace +``` + +Linux: + +```bash +sudo mkdir -p /mnt/nas/vol1/workspace +``` + +3. 授权(UID=1000,GID=1000) + +NAS: + +```bash +sudo chown -R 1000:1000 /vol1/workspace +``` + +Linux: + +```bash +sudo chown -R 1000:1000 /mnt/nas/vol1/workspace +``` + +4. 在 Linux 执行挂载 + +```bash +sudo mount -t nfs -o rw,vers=4.2,noatime,rsize=1048576,wsize=1048576,timeo=1200,retrans=2,_netdev 192.168.1.100:/vol1/workspace /mnt/nas/vol1/workspace +``` + +| 参数名称 | 说明 | +| --- | --- | +| rw | 拥有读写权限 | +| vers | 使用 nfs 4.2 版本 | +| noatime | 不更新文件的访问时间戳,能显著减少磁盘 I/O 和网络开销,提升性能 | +| rsize/wsize | 读写块大小,1MB 是 NFS v4.2 推荐的尺寸,适合高速内网传输文件,有效利用网络带宽 | +| timeo | 客户端等待重传前的超时时间,给网络波动留的容忍度,单位是厘秒,1200=120秒 | +| retrans | 连接彻底失败之前,仅重传 2 次。配合长超时,客户端会很有耐心地等待,不会因短暂网络抖动而频繁报错| +| _netdev | 告诉系统等网络可用后再挂载,防止在启动初期,网络未就绪时挂载失败 | + +5. 在 Linux 设置开机自动挂载(可选但强烈推荐) + +```bash +sudo nano /etc/fstab +``` + +在文件末尾追加一行: + +```text +192.168.1.100:/vol1/workspace /mnt/nas/vol1/workspace nfs rw,vers=4.2,noatime,rsize=1048576,wsize=1048576,timeo=1200,retrans=2,_netdev 0 0 +``` + +6. 在 Linux 运行 Docker 容器并挂载 + +```bash +docker run -v /mnt/nas/vol1/workspace:/workspace --user 1000:1000 <镜像名> +``` \ No newline at end of file diff --git a/clash.md b/clash.md new file mode 100644 index 0000000..fa25199 --- /dev/null +++ b/clash.md @@ -0,0 +1,39 @@ +# 客户端下载 + +| 系统 | 点击下载 | +|:-----|:-----| +| Windows |[x86](https://stf.jkwlstv.cn/app/cfw_x86.exe) [Arm](https://stf.jkwlstv.cn/app/cfw_arm.exe)| +| Mac |[Intel](https://stf.jkwlstv.cn/app/cfm_intel.dmg) [Arm](https://stf.jkwlstv.cn/app/cfm_arm.dmg)| +| Android |[通用](https://stf.jkwlstv.cn/app/cmfa.apk)| + +## Android +
+ + + + + +
+ +## iOS + +需要切换到美区 App Store 下载安装 **Potatso** 这款 APP,所以需要先注册一个美区的 Apple ID。 + +- 注册美区 Apple ID 教程:https://clashxpro.net/apple-id +- APP下载链接:https://apps.apple.com/us/app/potatso/id1239860606 +- 使用教程:https://potatso.net **订阅链接见公告** + +Potatso 是**免费**的,不差钱可以用 Shadowrocket。 + +## Mac/Win + +### 添加订阅 + + + +### 配置文件链接见公告 + + +### 开启局域网代理(可选) + + \ No newline at end of file diff --git a/img/cfa-1.png b/img/cfa-1.png new file mode 100644 index 0000000..ed219b3 Binary files /dev/null and b/img/cfa-1.png differ diff --git a/img/cfa-2.png b/img/cfa-2.png new file mode 100644 index 0000000..9084848 Binary files /dev/null and b/img/cfa-2.png differ diff --git a/img/cfa-3.png b/img/cfa-3.png new file mode 100644 index 0000000..7284f57 Binary files /dev/null and b/img/cfa-3.png differ diff --git a/img/cfa-4.png b/img/cfa-4.png new file mode 100644 index 0000000..017b69b Binary files /dev/null and b/img/cfa-4.png differ diff --git a/img/cfa-5.png b/img/cfa-5.png new file mode 100644 index 0000000..aa9c9d6 Binary files /dev/null and b/img/cfa-5.png differ diff --git a/img/clash-pc-1.png b/img/clash-pc-1.png new file mode 100644 index 0000000..ad98ac2 Binary files /dev/null and b/img/clash-pc-1.png differ diff --git a/img/clash-pc-2.png b/img/clash-pc-2.png new file mode 100644 index 0000000..d6ba696 Binary files /dev/null and b/img/clash-pc-2.png differ diff --git a/img/clash-pc-3.png b/img/clash-pc-3.png new file mode 100644 index 0000000..2caa74d Binary files /dev/null and b/img/clash-pc-3.png differ diff --git a/img/clash-pc-4.png b/img/clash-pc-4.png new file mode 100644 index 0000000..abfd6d4 Binary files /dev/null and b/img/clash-pc-4.png differ diff --git a/img/clash-pc-5.png b/img/clash-pc-5.png new file mode 100644 index 0000000..a968fa7 Binary files /dev/null and b/img/clash-pc-5.png differ