<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Applesaber的小站</title><description>欢迎来到参观我的小站谢谢喵~</description><link>https://www.applesaber.site/</link><language>zh</language><item><title>国服中二节奏成绩导入MuNET</title><link>https://www.applesaber.site/posts/chunithm-data-converter/</link><guid isPermaLink="true">https://www.applesaber.site/posts/chunithm-data-converter/</guid><description>将落雪查分器 / 水鱼查分器的 Chunithm 成绩数据转换为 MuNET 可导入的 JSON 格式的开源工具。</description><pubDate>Sat, 21 Mar 2026 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;::github{repo=&quot;MuNET-OSS/chunithm-data-converter&quot;}&lt;/p&gt;
&lt;p&gt;:::important
该转换器功能现已&lt;strong&gt;原生集成至 MuNET 中&lt;/strong&gt;！可以在MuNET的 &lt;a href=&quot;https://portal.mumur.net/chu3/transfer&quot;&gt;中二节奏数据导出/导入页面&lt;/a&gt; 中使用
:::&lt;/p&gt;
&lt;p&gt;将落雪查分器 (Lxns) 或 水鱼查分器 (Diving-Fish) 的 Chunithm (中二节奏) 成绩数据，转换为 &lt;strong&gt;MuNET&lt;/strong&gt; 兼容的 JSON 导入格式。&lt;/p&gt;
&lt;p&gt;目前该工具已经支持三种使用方式：&lt;strong&gt;基于 Vue 的纯前端网页&lt;/strong&gt;、&lt;strong&gt;基于 Flask 的纯净本地 Web 接口&lt;/strong&gt;，以及&lt;strong&gt;Python 命令行 CLI&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;快速体验&lt;/strong&gt;：&lt;a href=&quot;https://www.applesaber.site/chunithm-data-converter/&quot;&gt;https://www.applesaber.site/chunithm-data-converter/&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;特点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;部署方式多&lt;/strong&gt;：提供 Python Web 端、Python 命令行端以及 workflow 部署版&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模式多&lt;/strong&gt;：深度适配落雪查分器个人/开发者模式，水鱼查分器个人/开发者模式，同时支持从 CSV 离线导入&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;更好看的UI&lt;/strong&gt;：前端风格为 &quot;简约现代亚克力&quot; 风格，配合 Naive UI 组件库 （使用Gemini 3.1 Pro 润化）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;解决跨域问题&lt;/strong&gt;：针对水鱼 API 严格的 CORS 安全策略，workflow 内置了 Cloudflare Worker 代理节点；本地部署版则通过 Python 直接向 API 发起请求&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;使用指南与数据源支持&lt;/h2&gt;
&lt;p&gt;:::note
工具&lt;strong&gt;不会&lt;/strong&gt;保存、上传你的任何成绩与凭证信息。
所有的解析和请求都是&lt;strong&gt;纯本地&lt;/strong&gt;或&lt;strong&gt;受信任的环境&lt;/strong&gt;中完成的，尽可放心使用。
:::&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模式&lt;/th&gt;
&lt;th&gt;适用场景&lt;/th&gt;
&lt;th&gt;认证凭证&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;落雪个人&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;获取自己的成绩&lt;/td&gt;
&lt;td&gt;个人访问 Token&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;落雪开发者&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;获取任意好友成绩&lt;/td&gt;
&lt;td&gt;开发者 Token + 对方的好友码&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;水鱼个人&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;获取自己的成绩&lt;/td&gt;
&lt;td&gt;水鱼 Import-Token&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;水鱼开发者&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;获取特定玩家成绩&lt;/td&gt;
&lt;td&gt;Developer-Token + 对方用户名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CSV 上传&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;API 死了或只想离线转换&lt;/td&gt;
&lt;td&gt;落雪/水鱼导出的 CSV 文件&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;GH-Pages 部署版&lt;/h2&gt;
&lt;p&gt;最简单的方式，直接打开网站，无需环境配置。
页面由 Vue 3 + TypeScript + Vite 构建。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;进入网页，选择你拥有的数据源&lt;/li&gt;
&lt;li&gt;填入对应的 Token（开发者令牌已在系统后台静默配置，无需用户填写）&lt;/li&gt;
&lt;li&gt;点击“开始转换”，随后下载 JSON 文件。&lt;/li&gt;
&lt;li&gt;将文件导入至 MuNET。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;:::tip
&lt;strong&gt;前端编译说明（开发者）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;推荐使用 &lt;code&gt;npx&lt;/code&gt; 运行 vite 编译指令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd web
npm install
npx vite build
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Python 命令行版&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 安装依赖
pip install -r requirements.txt

# 1. API 模式 - 水鱼个人查分
python main.py api --mode shuiyu --shuiyu-import-token 你的Token -o my_data.json

# 2. CSV 本地文件模式
python main.py csv --input scores.csv --username 玩家名
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;本地 Web 接口 (web.py)&lt;/h2&gt;
&lt;h3&gt;web.py 和 workflow版 有什么区别&lt;/h3&gt;
&lt;p&gt;该方案将 &lt;code&gt;chunithm_api_converter&lt;/code&gt; 与 &lt;code&gt;convert_chunithm_scores&lt;/code&gt; 这两个核心 Python 模块直接导入&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;没有 CORS 影响&lt;/strong&gt;：Python 后端作为独立服务去请求第三方 API，根本不受浏览器跨域安全策略影响&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;部署方法&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 1. 编译前端界面 (Web 目录下的静态资源)
cd web
npm install
npx vite build
cd ..

# 2. 安装 Python 核心及 Web 依赖
pip install -r requirements.txt

# 3. 设定您的环境私钥 （非必须项）
export LXNS_DEVELOPER_TOKEN=&quot;你的开发者落雪Token&quot;
export SHUIYU_DEVELOPER_TOKEN=&quot;你的开发者水鱼Token&quot;
export PORT=&quot;5000&quot;

# 4. 启动！
python web.py
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::important
&lt;strong&gt;关于环境变量与安全&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;LXNS_DEVELOPER_TOKEN&lt;/code&gt; 和 &lt;code&gt;SHUIYU_DEVELOPER_TOKEN&lt;/code&gt;：&lt;strong&gt;千万不要&lt;/strong&gt;将这些开发者 Token 暴露给用户或者写死在公开代码里。正确做法是在启动 &lt;code&gt;web.py&lt;/code&gt; 前通过终端的 &lt;code&gt;export&lt;/code&gt; 或根目录配置 &lt;code&gt;.env&lt;/code&gt; 文件来静默注入，后端在处理请求时会自动从服务器环境中读取这些凭证，以此保障你的开发者安全。&lt;/li&gt;
&lt;li&gt;对于本文提到的 &lt;code&gt;GH-Pages 部署版&lt;/code&gt;，此机制则是通过 GitHub Actions 的 Repository Secrets 功能实现的，部署流水线会在编译时将这些 Token 隐藏起来。
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;现在访问 &lt;code&gt;http://localhost:5000&lt;/code&gt; ，你就能看到页面了 同时它还提供了对外的 POST API：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;POST /api/convert&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POST /api/convert/csv&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果觉得帮助到你记得给我项目点个 star⭐ 谢谢喵&lt;/p&gt;
</content:encoded><category>项目</category><category>Tool</category><category>MuNET</category><category>开源</category></item><item><title>如何建立Sega游戏服务器</title><link>https://www.applesaber.site/posts/performai-server-bulid/</link><guid isPermaLink="true">https://www.applesaber.site/posts/performai-server-bulid/</guid><description>详细教程：使用 AquaDX 和 ARTEMIS 搭建 Sega 街机游戏本地服务器，涵盖 Docker 部署、环境配置和常见问题。</description><pubDate>Sat, 23 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;很多地方都没有这个搭建教程，搭建服务器要有一定的技术&lt;/p&gt;
&lt;p&gt;目前开源的服务器有 &lt;a href=&quot;https://gitea.tendokyu.moe/Hay1tsme/artemis/&quot;&gt;ARTEMIS&lt;/a&gt; 和 &lt;a href=&quot;https://github.com/MewoLab/AquaDX/&quot;&gt;AquaDX&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;在这里我分享的文件均不能外传！&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;在使用请遵循每个服务器的开源协议&lt;/p&gt;
&lt;h2&gt;准备环境&lt;/h2&gt;
&lt;p&gt;ARTEMiS 服务端支持比较老的游戏版本，AquaDX支持比较新的游戏版本&lt;/p&gt;
&lt;p&gt;具体支持版本请看每个仓库的自述文件 &lt;a href=&quot;https://gitea.tendokyu.moe/Hay1tsme/artemis/#supported-games&quot;&gt;ARTEMIS&lt;/a&gt; &lt;a href=&quot;https://github.com/MewoLab/AquaDX/?tab=readme-ov-file#supported-games&quot;&gt;AquaDX&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;然后来准备环境&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;AquaDX&lt;/th&gt;
&lt;th&gt;ARTEMIS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;编译环境&lt;/td&gt;
&lt;td&gt;Java&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;其他环境&lt;/td&gt;
&lt;td&gt;Docker&lt;/td&gt;
&lt;td&gt;Docker&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;自行准备环境&lt;/p&gt;
&lt;p&gt;选择好服务端后开始准备文件&lt;/p&gt;
&lt;h2&gt;AquaDX 配置和部署&lt;/h2&gt;
&lt;p&gt;部署的方式有两种&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Docker 直接部署&lt;/li&gt;
&lt;li&gt;编译成 Jar 后部署
使用Docker更快更自动化，并且更好管理，这里我以Docker作为演示&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;主要是Java编译麻烦还容易出问题(x&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://hub.docker.com/r/hykilpikonna/aquadx&quot;&gt;Docker官方镜像&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;不过官方镜像默认是反代&lt;code&gt;aquadx.net&lt;/code&gt;，建议用这个&lt;a href=&quot;https://www.123684.com/s/PXaTTd-DWrR&quot;&gt;镜像&lt;/a&gt;，提取码为 &lt;code&gt;aqua&lt;/code&gt;，解压密码为 &lt;code&gt;AquaDX&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这是我的一位朋友的镜像，他在我第一次部署服务器时给予了我很多帮助，在这里我感谢他&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;下载解压好镜像后就配置一下服务器&lt;/p&gt;
&lt;p&gt;首先编辑 &lt;code&gt;compose.yml&lt;/code&gt; 文件&lt;/p&gt;
&lt;p&gt;找到&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  http:
    image: caddy
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
    ports:
      - 8080:8080
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改ports为自己的端口，避免 8080 这个端口冲突&lt;/p&gt;
&lt;p&gt;然后打开 &lt;code&gt;application.properties&lt;/code&gt; 文件&lt;/p&gt;
&lt;p&gt;找到并修改 &lt;code&gt;allnet.server.host&lt;/code&gt; &lt;code&gt;allnet.server.redirect&lt;/code&gt; 和 &lt;code&gt;aqua-net.email.webHost&lt;/code&gt; 项为自己的局域网IP&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# IP统一不能为127.0.0.1
allnet.server.host=192.168.0.102
allnet.server.port=80      # 这里是ALL.NET服务器端口
...

allnet.server.redirect=http://192.168.0.102:8080    # 这里是真实的服务器IP,建议修改为compose.yml设置的端口

...

server.port=80 #这里是web端口

...

aqua-net.email.webHost=192.168.0.102
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;aqua-net.email.webHost 是email服务器地址，不过我们一般不用这个服务，你可以把里面的ip删掉留空&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果不配置文件出错或者不生效可以去 &lt;code&gt;/AquaDX/config/application.properties&lt;/code&gt; 按照上面的方法继续设置&lt;/p&gt;
&lt;p&gt;接着在服务器根目录打开终端输入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker compose up
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后可以喝杯咖啡☕等待部署完毕&lt;/p&gt;
&lt;p&gt;看到出现了 &lt;code&gt;⭐️ ALL PERFECT ⭐️&lt;/code&gt; 表示你的服务器成功正常运行了
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/Apple-alone/PicGo@main/img/image.png&quot; alt=&quot;控制台显示运行成功&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后在浏览器打开 你的局域网IP:ALL.NET端口&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;p&gt;我显示的是 &lt;code&gt;ALL.Net : Port 80&lt;/code&gt; web的地址就为 &lt;code&gt;192.168.0.102:80&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;或者输入 &lt;code&gt;allnet.server.redirect&lt;/code&gt; 打开 &lt;code&gt;192.168.0.102.8080&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;80这个端口是Http端口，可以直接输入ip不带端口进入web&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;最后进入web注册帐号，随便输入一个邮箱和用户名，点击注册&lt;/p&gt;
&lt;p&gt;然后登录你刚刚输入的邮箱和密码即可进入web&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：你不用去验证邮箱，可以直接登录，除非你开启了email验证，配置文件默认是关闭的&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;和你获取dns和狗号的操作去配置segatools.ini&lt;/p&gt;
&lt;p&gt;享受你的本地服！&lt;/p&gt;
&lt;h2&gt;ARTEMIS 配置和部署&lt;/h2&gt;
&lt;p&gt;ARTEMIS 对于较老的游戏版本来说很友好&lt;/p&gt;
&lt;h3&gt;编译环境&lt;/h3&gt;
&lt;p&gt;首先请准备好Python环境，官方的建议Python版本至少为3.7，但是我建议用使用Python3.10，因为它更加稳定&lt;/p&gt;
&lt;p&gt;请自行去下载 &lt;a href=&quot;https://mirrors.aliyun.com/python-release/&quot;&gt;Python&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;当你配置好 Python 环境后，接下来要继续准备 &lt;a href=&quot;https://ftp.osuosl.org/pub/mariadb//mariadb-10.11.6/winx64-packages/mariadb-10.11.6-winx64.msi&quot;&gt;&lt;code&gt;MariaDB数据库&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;网络上有一堆教程，可以自己搜索配置&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;MySQL真的太烂了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;接下来下载或者克隆仓库获取 ARTEMIS 源代码&lt;/p&gt;
&lt;p&gt;可以通过git来获取&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone https://gitea.tendokyu.moe/Hay1tsme/artemis.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;你也可以去存储库里下载 &lt;a href=&quot;https://gitea.tendokyu.moe/Hay1tsme/artemis&quot;&gt;源代码&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;然后进入 ARTEMIS 根目录&lt;/p&gt;
&lt;h3&gt;配置环境&lt;/h3&gt;
&lt;p&gt;打开终端，进入 &lt;code&gt;MariaDB&lt;/code&gt; 命令行&lt;/p&gt;
&lt;p&gt;新建一个 MariaDB 账户，&lt;code&gt;username&lt;/code&gt;是你的账户，并将 &lt;code&gt;&amp;lt;password&amp;gt;&lt;/code&gt; 换成这个账户的密码&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CREATE USER &apos;username&apos;@&apos;localhost&apos; IDENTIFIED BY &apos;&amp;lt;password&amp;gt;&apos;;
CREATE DATABASE username;
GRANT Alter,Create,Delete,Drop,Index,Insert,References,Select,Update ON username.* TO &apos;username&apos;@&apos;localhost&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建一个venv虚拟环境使Python更好管理和处理模块&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python -m pip venv venv
# 或
pip venv venv
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当您需要与 ARTEMiS 交互时，激活 venv 运行 &lt;code&gt;venv\Scripts\activate.bat&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;安装 pip 模块&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pip install -r requirements.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;配置服务器&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;创建一个 &lt;code&gt;config&lt;/code&gt; 文件夹并将 &lt;code&gt;example_config&lt;/code&gt; 复制其中&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;编辑 &lt;code&gt;core.yaml&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将您刚刚创建的 MariaDB 账户和密码填入 &lt;code&gt;database&lt;/code&gt; 部分&lt;/li&gt;
&lt;li&gt;将您的 &lt;code&gt;hostname&lt;/code&gt; 设置为游戏可以访问您的服务器的任何主机名或 IP 地址（不要输入127.0.0.1）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;编辑其他游戏配置文件&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;添加keys、设置主机名、端口等。具体设置取决于游戏&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;更详细的可以看 &lt;a href=&quot;https://gitea.tendokyu.moe/Hay1tsme/artemis/src/branch/master/docs/INSTALL_WINDOWS.md&quot;&gt;Windows部署官方文档&lt;/a&gt; 或者 &lt;a href=&quot;https://gitea.tendokyu.moe/Hay1tsme/artemis/src/branch/master/docs/INSTALL_LINUX.md&quot;&gt;Linux部署官方文档&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;创建一下数据库表格&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python dbutils.py create
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;启动 ARTEMIS 服务端&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python index.py
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Docker环境&lt;/h3&gt;
&lt;p&gt;根据上面来设置，设置完成后在根目录打开终端&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;结尾&lt;/h2&gt;
&lt;p&gt;部署本地副总体来说比较简单，想要关闭服务器在终端输入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker compose down
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ARTEMIS的官方教程更全面，不过玩Perfotmai三音游直接这样像我这样配置就行了&lt;/p&gt;
&lt;p&gt;之后有服务器开源我都会出教程的&lt;/p&gt;
&lt;p&gt;但是请你不要拿着本地服去逃避在线服的封号，没有意义&lt;/p&gt;
&lt;p&gt;也不要想着做这个收费技术支持，没什么技术含量的东西出去卖不嫌丢人&lt;/p&gt;
&lt;h2&gt;相关文档&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://gitea.tendokyu.moe/Hay1tsme/artemis/src/branch/master/docs/INSTALL_WINDOWS.md&quot;&gt;ARTEMIS教程&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/MewoLab/AquaDX/blob/v1-dev/docs/self-hosting.md&quot;&gt;AquaDX自托管教程&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.docker.com/engine/install/&quot;&gt;Docker官方安装教程&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mariadb.com/docs/server/mariadb-quickstart-guides/installing-mariadb-server-guide&quot;&gt;MariaDB官方安装教程&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><category>教程</category><category>服务器</category></item><item><title>使用Github Action</title><link>https://www.applesaber.site/posts/github_action/</link><guid isPermaLink="true">https://www.applesaber.site/posts/github_action/</guid><description>GitHub Actions 入门教程：了解 CI/CD 概念，学习如何编写 workflow 实现自动化构建、测试和部署。</description><pubDate>Thu, 14 Aug 2025 19:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;什么是Github Action&lt;/h1&gt;
&lt;p&gt;GitHub Actions 是 GitHub 提供的持续集成和持续（CI/CD）交付平台&lt;/p&gt;
&lt;p&gt;可以自动化构建、测试和部署流程，为编译测试提供了一些方便（比如又大又慢的臭Java）&lt;/p&gt;
&lt;p&gt;其中术语了解一下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Workflow (工作流)&lt;/code&gt;: 一个可配置的自动化流程，由 YAML 文件定义&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Job (作业)&lt;/code&gt;: 工作流中的一组步骤，在同一个运行器上执行&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Step (步骤)&lt;/code&gt;: 可以运行命令或执行动作的任务单元，这步骤可以是
&lt;ul&gt;
&lt;li&gt;Shell 命令（RUN）&lt;/li&gt;
&lt;li&gt;调用预定义动作（USES）&lt;/li&gt;
&lt;li&gt;自定义脚本&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Action&lt;/code&gt;: 可重复使用的代码单元，可通过 &lt;a href=&quot;https://github.com/marketplace&quot;&gt;GitHub Marketplace&lt;/a&gt; 获取现成动作&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Runner (运行器)&lt;/code&gt;: 执行工作流的服务器，可以是 GitHub 托管的或自托管的&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Workflow文件存在仓库的 &lt;code&gt;.github/workflows/&lt;/code&gt; 路径下，文件后缀一般为 &lt;code&gt;.yaml&lt;/code&gt; 或 &lt;code&gt;.yml&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;文件结构示意&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Project/
├── .github/
│   └── workflows/
│       ├── ci.yml      # 持续集成工作流
│       └── deploy.yml  # 部署工作流
└── src/
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;创建第一个工作流&lt;/h1&gt;
&lt;p&gt;我以一份 &lt;a href=&quot;https://github.com/Apple-alone/PerformaiConfigEditor&quot;&gt;.NET C#的项目&lt;/a&gt; 来演示&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在仓库中创建 &lt;code&gt;.github/workflows&lt;/code&gt; 目录&lt;/li&gt;
&lt;li&gt;在该目录下创建 &lt;code&gt;dotnet-desktop.yaml&lt;/code&gt; 文件 （文件名随意，后缀必须为 &lt;code&gt;yml&lt;/code&gt; 或者 &lt;code&gt;yaml&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;添加内容：
&lt;ul&gt;
&lt;li&gt;添加基本信息&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;name: .NET Core Desktop
on:
push:
    branches: [ &quot;master&quot; ]
pull_request:
    branches: [ &quot;master&quot; ]
&lt;/code&gt;&lt;/pre&gt;
解析：&lt;pre&gt;&lt;code&gt;1.工作流名称：&quot;.NET Core Desktop&quot;

2.触发条件：推送到 master 分支或创建针对 master 分支的 PR 时触发
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;作业配置&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;jobs:
  build:
    strategy:
      matrix:
        configuration: [Debug, Release]
    runs-on: windows-latest
    env:
      Solution_Name: your-solution-name #  解决方案名称(.sln)
      Test_Project_Path: your-test-project-path #  指定测试项目的路径
      Wap_Project_Directory: your-wap-project-directory-name #  指定Windows应用程序打包项目(WAP)的目录
      Wap_Project_Path: your-wap-project-path #  指定.wapproj文件的完整路径
&lt;/code&gt;&lt;/pre&gt;
解析&lt;pre&gt;&lt;code&gt;1.使用矩阵策略构建 Debug 和 Release 配置
2.运行环境：Windows 最新版
3.环境变量定义了解方案和项目路径
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;设置任务单元&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;基础设置&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;steps:
- name: Checkout
  uses: actions/checkout@v4
  with:
    fetch-depth: 0  # 获取完整历史记录，对某些版本工具可能需要

- name: Install .NET Core
  uses: actions/setup-dotnet@v4
  with:
    dotnet-version: |
      8.0.x
      7.0.x  # 可添加多个.NET版本支持
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;构建和测试&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;- name: Setup MSBuild.exe
  uses: microsoft/setup-msbuild@v2

- name: Restore NuGet packages
  run: dotnet restore $env:Solution_Name

- name: Build solution
  run: dotnet build $env:Solution_Name --configuration ${{ matrix.configuration }} --no-restore

- name: Run unit tests
  run: dotnet test $env:Test_Project_Path --configuration ${{ matrix.configuration }} --no-build --verbosity normal
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;上传Release&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;- name: Upload MSIX package
  uses: actions/upload-artifact@v4
  with:
    name: MSIX-Package-${{ matrix.configuration }}
    path: ${{ env.Wap_Project_Directory }}\AppPackages
    retention-days: 7  # 设置Release保留天数

- name: Upload symbols
  if: matrix.configuration == &apos;Release&apos;
  uses: actions/upload-artifact@v4
  with:
    name: Symbols-${{ matrix.configuration }}
    path: ${{ env.Wap_Project_Directory }}\**\*.pdb
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;完整工作流&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;name: .NET Core Desktop CI/CD

on:
  push:
    branches: [ &quot;master&quot; ]
  pull_request:
    branches: [ &quot;master&quot; ]

env:
  DOTNET_VERSION: &apos;8.0.x&apos;
  Solution_Name: YourSolution.sln
  Test_Project_Path: tests\YourTests.csproj
  Wap_Project_Directory: src\YourApp.Package
  Wap_Project_Path: src\YourApp.Package\YourApp.Package.wapproj

jobs:
  build:
    strategy:
      matrix:
        configuration: [Debug, Release]
    runs-on: windows-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v4
      with:
        fetch-depth: 0

    - name: Setup .NET
      uses: actions/setup-dotnet@v4
      with:
        dotnet-version: ${{ env.DOTNET_VERSION }}

    - name: Setup MSBuild
      uses: microsoft/setup-msbuild@v2

    - name: Restore dependencies
      run: dotnet restore ${{ env.Solution_Name }}

    - name: Build solution
      run: dotnet build ${{ env.Solution_Name }} --configuration ${{ matrix.configuration }} --no-restore

    - name: Run tests
      run: dotnet test ${{ env.Test_Project_Path }} --configuration ${{ matrix.configuration }} --no-build --verbosity normal

    - name: Decode signing certificate
      if: matrix.configuration == &apos;Release&apos;
      run: |
        $pfx_cert_byte = [System.Convert]::FromBase64String(&quot;${{ secrets.Base64_Encoded_Pfx }}&quot;)
        $certificatePath = Join-Path -Path ${{ env.Wap_Project_Directory }} -ChildPath GitHubActionsWorkflow.pfx
        [IO.File]::WriteAllBytes(&quot;$certificatePath&quot;, $pfx_cert_byte)

    - name: Create app package
      run: |
        msbuild ${{ env.Wap_Project_Path }} `
          /p:Configuration=${{ matrix.configuration }} `
          /p:UapAppxPackageBuildMode=StoreUpload `
          /p:AppxBundle=Always `
          /p:AppxBundlePlatforms=&quot;x86|x64&quot; `
          /p:PackageCertificateKeyFile=GitHubActionsWorkflow.pfx `
          /p:PackageCertificatePassword=&quot;${{ secrets.Pfx_Key }}&quot;

    - name: Cleanup certificate
      if: matrix.configuration == &apos;Release&apos;
      run: Remove-Item -path ${{ env.Wap_Project_Directory }}\GitHubActionsWorkflow.pfx -Force

    - name: Upload artifacts
      uses: actions/upload-artifact@v4
      with:
        name: AppPackage-${{ matrix.configuration }}
        path: ${{ env.Wap_Project_Directory }}\AppPackages
        retention-days: 7
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;注：工作流也可以在Github Action 创建编辑&lt;/code&gt;&lt;/p&gt;
&lt;h1&gt;进阶&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;密钥管理&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;- name: 安全部署应用
  env:
    API_TOKEN: ${{ secrets.API_KEY }}  # 使用仓库存储的机密凭证
  run: |
    curl -H &quot;Authorization: Bearer $API_TOKEN&quot; ...
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;使用 &lt;code&gt;act&lt;/code&gt; 本地测试: 安装 &lt;a href=&quot;https://github.com/nektos/act&quot;&gt;act&lt;/a&gt; 在本地运行工作流&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;相关文档&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.github.com/en/actions&quot;&gt;官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ruanyifeng.com/blog/2019/09/getting-started-with-github-actions.html&quot;&gt;阮一峰的网络日志&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><category>教程</category></item></channel></rss>