jetforce

jetforce

Gemini 协议实验性 TCP 服务器

Jetforce 是为 Gemini 协议开发的实验性 TCP 服务器,提供静态文件服务、Gemini 应用程序框架和基于 Twisted 的异步网络支持。支持 Gemini 目录、CGI 脚本和虚拟主机,适用于 Python 3.7+。Jetforce 为开发者和管理员提供灵活配置,便于部署和管理 Gemini 服务。其精简现代的代码库和完善的功能使其成为 Gemini 协议实验和应用的理想选择。

JetforceGemini协议TCP服务器PythonTLSGithub开源项目

Jetforce

一个实验性的TCP服务器,用于新开发的Gemini协议。 在这里了解更多关于Gemini的信息。

火箭发射

pypi 版本 构建

目录

特性

  • 内置静态文件服务器,支持gemini目录和CGI脚本。
  • 一个完整的框架,用于编写健壮的gemini应用,如astrobotany
  • 精简、现代的代码库,带有类型提示和black格式化。
  • 基于twisted异步网络引擎构建的坚实基础。

安装

需要Python 3.7或更高版本。

最新的稳定版本可以从PyPI安装:

$ pip install jetforce

或者,从源码安装:

$ git clone https://github.com/michael-lazar/jetforce $ cd jetforce $ pip install .

或者,安装到Python虚拟环境中:

# 在某处创建一个项目目录 $ mkdir /opt/jetforce # 激活虚拟环境并安装jetforce $ python3 -m virtualenv /opt/jetforce/venv $ source /opt/jetforce/venv/bin/activate $ pip install jetforce # 启动脚本将安装在这里 $ /opt/jetforce/venv/bin/jetforce

用法

使用--help标志查看命令行选项:

用法: jetforce [-h] [-V] [--host HOST] [--port PORT] [--hostname HOSTNAME] [--tls-certfile FILE] [--tls-keyfile FILE] [--tls-cafile FILE] [--tls-capath DIR] [--dir DIR] [--cgi-dir DIR] [--index-file FILE] [--default-lang DEFAULT_LANG] [--rate-limit RATE_LIMIT] 一个实验性的Gemini协议服务器 可选参数: -h, --help 显示此帮助信息并退出 -V, --version 显示程序的版本号并退出 服务器配置: --host HOST 服务器要绑定的地址 (默认: 127.0.0.1) --port PORT 服务器要绑定的端口 (默认: 1965) --hostname HOSTNAME 服务器主机名 (默认: localhost) --tls-certfile FILE 服务器TLS证书文件 (默认: None) --tls-keyfile FILE 服务器TLS私钥文件 (默认: None) --tls-cafile FILE 用于验证客户端的CA文件 (默认: None) --tls-capath DIR 包含用于验证客户端的CA文件的目录 (默认: None) 文件服务器配置: --dir DIR 文件系统上要提供服务的根目录 (默认: /var/gemini) --cgi-dir DIR CGI脚本目录,相对于服务器的根目录 (默认: cgi-bin) --index-file FILE 如果目录包含此名称的文件,将提供该文件而不是自动生成索引页面 (默认: index.gmi) --default-lang DEFAULT_LANG 用于所有text/gemini响应的lang参数 (默认: None) --rate-limit RATE_LIMIT 启用IP速率限制,例如 '60/5m' (5分钟内60个请求) (默认: None)

设置hostname

服务器的主机名应设置为您期望接收流量的DNS名称。例如,如果您的jetforce服务器在"gemini://cats.com"上运行,您应该将主机名设置为"cats.com"。任何不匹配此主机名的URL都将被服务器拒绝,包括使用直接IP地址的URL,如"gemini://174.138.124.169"。

IDN(包含unicode字符的域名)应使用其ASCII punycode表示形式定义。例如,域名café.mozz.us应表示为--hostname xn--caf-dma.mozz.us

设置host

服务器的主机应设置为您想要绑定的本地套接字:

  • --host "127.0.0.1" - 仅接受本地连接
  • --host "0.0.0.0" - 接受IPv4远程连接
  • --host "::" - 接受IPv6远程连接
  • --host "" - 接受任何接口上的远程连接(IPv4 + IPv6)

TLS证书

gemini规范要求所有连接都通过TLS发送。

如果您没有使用--tls-certfile标志提供TLS证书文件,jetforce将自动为您生成一个临时证书。这对于简化开发非常有用,但在将服务器暴露给公共互联网之前,您应该设置更永久的证书。您可以生成自己的自签名服务器证书,或从Let's Encrypt等证书颁发机构获取证书。

以下是您可以用来生成自签名证书的openssl命令示例:

$ openssl req -newkey rsa:2048 -nodes -keyout {hostname}.key \
    -nodes -x509 -out {hostname}.crt -subj "/CN={hostname}"

Jetforce还支持TLS客户端证书(自签名和CA授权)。使用客户端证书发出的请求将包含额外的CGI/环境变量,其中包含有关TLS连接的信息。

您可以使用--tls-cafile--tls-capath标志指定用于客户端验证的CA。由CA验证的连接将设置TLS_CLIENT_AUTHORISED环境变量为True。生成CA的说明超出了本自述文件的范围,但您可以在在线找到许多有用的教程。

静态文件

默认情况下,Jetforce将在/var/gemini/目录中提供静态文件。以***.gmi结尾的文件将被解释为text/gemini类型。如果请求一个目录,jetforce将在该目录中查找名为index.gmi**的文件以返回。否则,将自动生成目录文件列表。

虚拟主机

为了保持命令行参数简单易懂,通过命令行配置虚拟主机不受支持。但是,使用几行Python代码和一个 自定义启动脚本。查看examples/vhost.py获取更多信息。

Jetforce 目前还不支持使用 SNI 在 TLS 层面进行虚拟主机托管。这意味着你无法为不同的域名返回不同的服务器 TLS 证书。建议的解决方法是使用带有多个 "subjectAltName" 属性的单一证书。服务器代码库中还有一个 sni_callback() 钩子,可以通过子类化来实现自定义 TLS 行为。

CGI

Jetforce 支持简化版的 CGI 脚本。它并不完全遵循 CGI 的 RFC 3875 规范,但对 Gemini 的目的来说已经足够了。

服务器 "cgi-bin/" 目录中的任何可执行文件都将被视为 CGI 脚本。当 Gemini 客户端请求 CGI 脚本时,Jetforce 服务器将执行该脚本,并通过环境变量传递请求相关信息。

CGI 脚本必须将 Gemini 响应写入标准输出流。这包括第一行的状态码和元字符串,以及后续行的可选响应正文。CGI 脚本生成的字节将原样转发给 Gemini 客户端,服务器不会进行任何额外修改。

CGI 环境变量

名称示例值
GATEWAY_INTERFACECGI/1.1 (为兼容 RFC 3875)
SERVER_PROTOCOLGEMINI
SERVER_SOFTWAREjetforce/0.0.7
GEMINI_URLgemini://mozz.us/cgi-bin/example.cgi/extra?hello%20world
SCRIPT_NAME/cgi-bin/example.cgi
PATH_INFO/extra
QUERY_STRINGhello%20world
SERVER_NAMEmozz.us
SERVER_PORT1965
REMOTE_HOST10.10.0.2
REMOTE_ADDR10.10.0.2
TLS_CIPHERTLS_AES_256_GCM_SHA384
TLS_VERSIONTLSv1.3

CGI 环境变量 - 已认证

当客户端连接使用 TLS 客户端证书时,将包含以下额外的 CGI 变量:

名称示例值
AUTH_TYPECERTIFICATE
REMOTE_USERmozz123 (证书主题 CN 属性)
TLS_CLIENT_HASHSHA256:86341FB480BFE333C343530D75ABF99D1437F69338F36C684C8831B63C993A96
TLS_CLIENT_NOT_BEFORE2020-04-05T04:18:22Z
TLS_CLIENT_NOT_AFTER2021-04-05T04:18:22Z
TLS_CLIENT_SERIAL_NUMBER73629018972631
TLS_CLIENT_AUTHORISED0 (未授权) / 1 (已授权) †

† 需要将服务器配置为使用 CA 来验证客户端证书。

部署

Jetforce 旨在运行于进程管理器之后,由进程管理器处理脚本的守护进程化、将输出重定向到系统日志等。我倾向于使用 systemd,因为它已安装在我的操作系统上且易于设置。

以下是我在 gemini://mozz.us 上配置服务器的方式:

# /etc/systemd/system/jetforce.service
[Unit]
Description=Jetforce Server

[Service]
Type=simple
Restart=always
RestartSec=5
Environment="PYTHONUNBUFFERED=1"
ExecStart=/usr/local/bin/jetforce \
    --host 0.0.0.0 \
    --port 1965 \
    --hostname mozz.us \
    --dir /var/gemini \
    --tls-certfile /etc/letsencrypt/live/mozz.us/fullchain.pem \
    --tls-keyfile /etc/letsencrypt/live/mozz.us/privkey.pem \
    --tls-cafile /etc/pki/tls/jetforce_client/ca.cer

[Install]
WantedBy=default.target
  • --host 0.0.0.0 允许服务器通过 IPv4 接受来自任何 IP 地址的外部连接。
  • PYTHONUNBUFFERED=1 禁用 stderr 缓冲,有时这对日志记录正常工作是必要的。
  • --tls-certfile--tls-keyfile 指向我的 WWW 服务器的 Let's Encrypt 证书链。
  • --tls-cafile 指向我创建的自签名 CA,用于测试接受客户端 TLS 连接。

安装此服务后,我可以使用以下命令启动和停止服务器:

systemctl start jetforce
systemctl stop jetforce

我可以使用以下命令查看服务器日志:

journalctl -u jetforce -f

警告

你正在将服务器暴露于互联网。你(是的,就是你!)有责任保护你的服务器并设置适当的访问权限。这可能意味着不要以 root 用户身份运行 jetforce。安全最佳实践超出了本文档的范围,并在很大程度上取决于你个人的威胁模型。

发布

要查看项目的发布历史,请参阅 CHANGELOG 文件。

许可

本项目采用 Floodgap 自由软件许可证

Floodgap 自由软件许可证(FFSL)有一个首要要求:使用它的软件或基于使用它的软件的衍生作品必须是免费的。我们所说的免费仅仅是指"免费如同免费的啤酒"——你可以根据自己的意愿将你的作品放入开源或闭源包中,无论你是否选择公开发布你的更改或更新,但你不得要求任何费用。

编辑推荐精选

博思AIPPT

博思AIPPT

AI一键生成PPT,就用博思AIPPT!

博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。

AI办公办公工具AI工具博思AIPPTAI生成PPT智能排版海量精品模板AI创作热门
潮际好麦

潮际好麦

AI赋能电商视觉革命,一站式智能商拍平台

潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。

iTerms

iTerms

企业专属的AI法律顾问

iTerms是法大大集团旗下法律子品牌,基于最先进的大语言模型(LLM)、专业的法律知识库和强大的智能体架构,帮助企业扫清合规障碍,筑牢风控防线,成为您企业专属的AI法律顾问。

SimilarWeb流量提升

SimilarWeb流量提升

稳定高效的流量提升解决方案,助力品牌曝光

稳定高效的流量提升解决方案,助力品牌曝光

Sora2视频免费生成

Sora2视频免费生成

最新版Sora2模型免费使用,一键生成无水印视频

最新版Sora2模型免费使用,一键生成无水印视频

Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
商汤小浣熊

商汤小浣熊

最强AI数据分析助手

小浣熊家族Raccoon,您的AI智能助手,致力于通过先进的人工智能技术,为用户提供高效、便捷的智能服务。无论是日常咨询还是专业问题解答,小浣熊都能以快速、准确的响应满足您的需求,让您的生活更加智能便捷。

imini AI

imini AI

像人一样思考的AI智能体

imini 是一款超级AI智能体,能根据人类指令,自主思考、自主完成、并且交付结果的AI智能体。

下拉加载更多