<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[极夜System的空间站]]></title><description><![CDATA[从被禁锢于颅腔的永夜里，浮现出思维的微光。]]></description><link>https://jiye.funcun.top</link><image><url>https://jiye.funcun.top/favicon.svg</url><title>极夜System的空间站</title><link>https://jiye.funcun.top</link></image><generator>Yohaku (https://github.com/Innei/Yohaku)</generator><lastBuildDate>Fri, 05 Jun 2026 11:55:56 GMT</lastBuildDate><atom:link href="https://jiye.funcun.top/feed" rel="self" type="application/rss+xml"/><pubDate>Fri, 05 Jun 2026 11:55:56 GMT</pubDate><language><![CDATA[zh-CN]]></language><item><title><![CDATA[从零开始：使用 1Panel 部署 Mix Space 后端]]></title><description><![CDATA[<div><blockquote>此渲染由 Yohaku API 生成，或存排版之虞，最佳体验请往：<a href="https://jiye.funcun.top/posts/blog-setup/deploy-mix-space-backend-with-1panel">https://jiye.funcun.top/posts/blog-setup/deploy-mix-space-backend-with-1panel</a></blockquote><div><blockquote class="markdown-alert-note"><header>NOTE</header><p>这是「Mix Space + Yohaku 部署系列」的第一篇，专注于后端（Core）的安装。前端主题 Yohaku 的部署请移步第二篇。</p></blockquote>
<hr/><p>Mix Space 是一套现代化的前后端分离个人博客系统。后端 <strong>Core</strong> 提供 RESTful API、定时任务、备份、无服务器函数等全套服务，是整个系统安静运转的心脏；前端主题则与之分离，可以自由搭配。</p><p>这篇文章会带你用 <strong>1Panel 面板</strong>，把 Mix Space 后端跑在自己的服务器上——不需要太多折腾，一步一步来就好。</p><hr/><h2 id="---1panel-">第一步 · 安装 1Panel 面板</h2><p>1Panel 是一款现代化的开源 Linux 服务器运维面板，界面清爽、操作直观。有了它，后续的容器管理、文件上传、反向代理，都会变得格外顺手。</p><h3 id="">安装前的小小确认</h3><table><thead><tr><th style="text-align:left"> 检查项 </th><th style="text-align:left"> 要求 </th></tr></thead><tbody><tr><td style="text-align:left"> 操作系统 </td><td style="text-align:left"> 主流 Linux 发行版（Debian / Ubuntu / CentOS 等） </td></tr><tr><td style="text-align:left"> 服务器架构 </td><td style="text-align:left"> <code>x86_64</code>、<code>aarch64</code>、<code>armv7l</code> 等均支持 </td></tr><tr><td style="text-align:left"> 可用内存 </td><td style="text-align:left"> 建议 <strong>1 GB 以上</strong> </td></tr><tr><td style="text-align:left"> 网络环境 </td><td style="text-align:left"> 需能正常访问互联网 </td></tr><tr><td style="text-align:left"> 浏览器 </td><td style="text-align:left"> Chrome、Firefox、Edge 等现代浏览器 </td></tr></tbody></table><h3 id="">一行命令，完成安装</h3><p>SSH 登录你的服务器，执行：</p><pre class="language-bash lang-bash"><code class="language-bash lang-bash">bash -c &quot;$(curl -sSL https://resource.fit2cloud.com/1panel/package/v2/quick_start.sh)&quot;
</code></pre>
<p>按照命令行提示操作，耐心等待安装完成。成功后，控制台会打印出类似这样的访问信息：</p><pre class="language-log lang-log"><code class="language-log lang-log">面板地址：http://你的服务器IP:端口/安全入口
</code></pre>
<p>::: warning
<strong>云服务器用户请注意</strong>：记得在安全组中开放对应端口，否则浏览器将无法访问面板。
:::</p><p>忘记安全入口了？SSH 回到服务器，执行以下命令，<code>entrance</code> 字段的值就是入口路径：</p><pre class="language-bash lang-bash"><code class="language-bash lang-bash">1pctl user-info
</code></pre>
<p>如果 Docker 安装失败，先单独运行这条命令修复：</p><pre class="language-bash lang-bash"><code class="language-bash lang-bash">bash &lt;(curl -sSL https://linuxmirrors.cn/docker.sh)
</code></pre>
<hr/><h2 id="---1panel--mix-space">第二步 · 通过 1Panel 安装 Mix Space</h2><h3 id="21-">2.1 下载应用包</h3><p>在下面的仓库下载 <code>mxspace.zip</code> 文件备用：</p><p><a href="https://github.com/IPF-Sinon/yohaku-docker-build">https://github.com/IPF-Sinon/yohaku-docker-build</a></p><h3 id="22-">2.2 上传应用包</h3><p>登入 1Panel 面板，在左侧菜单进入 <strong>主机 → 文件</strong>，导航到路径：</p><pre class=""><code class="">/opt/1panel/resource/apps/local
</code></pre>
<p>点击上传，选择刚刚下载好的 <code>mxspace.zip</code> 文件。</p><h3 id="23-">2.3 解压，注意路径！</h3><p>上传完成后，点击 <code>mxspace.zip</code>，选择<strong>解压</strong>。</p><p>::: banner {error}
<strong>这一步请务必注意！</strong></p><p>解压时需要手动将目标路径补全为：</p><pre class=""><code class="">/opt/1panel/resource/apps/local/mxspace
</code></pre>
<p>路径填错会导致文件散落在错误的目录里，应用商店将无法识别此本地应用。
:::</p><h3 id="24-">2.4 同步本地应用</h3><p>前往 1Panel <strong>应用商店</strong>，点击右上角的<strong>同步本地应用</strong>按钮，稍等片刻后在搜索框输入 <code>mxspace</code>，便能看到刚刚添加的应用了。</p><p>点击<strong>安装</strong>，进入配置页面。</p><h3 id="25-">2.5 填写安装配置项</h3><p>安装页面有三条只读说明和五个配置项，从上到下依次填写：</p><blockquote class="markdown-alert-note"><header>NOTE</header><p>页面顶部有三条灰色的「📌」提示文字，分别说明 JWT 密钥要求、域名格式和加密功能注意事项，<strong>仅供参考，不需要修改</strong>，跳过即可。</p></blockquote>
<h4 id="-jwt-jwt-secret">🔑 JWT 密钥（JWT Secret）</h4><p>这是后端服务的核心安全凭证，长度要求<strong>不少于 16 个字符、不超过 32 个字符</strong>。建议使用随机生成的强密码，可以在终端执行：</p><pre class="language-bash lang-bash"><code class="language-bash lang-bash">openssl rand -base64 24
</code></pre>
<p>将生成的结果填入此处，并<strong>妥善保存</strong>——它就像这个博客系统的钥匙，丢失后需要重置，会带来一些麻烦。</p><h4 id="-allowed-origins">🌐 被允许的域名（Allowed Origins）</h4><p>填写允许访问后端 API 的前端域名，多个域名用英文逗号分隔。格式示例：</p><pre class=""><code class="">localhost:*,你的主题前端域名
</code></pre>
<p>部署 Yohaku 前端时，这里填入的就是 Yohaku 所在的域名。如果暂时还不确定，可以先填 <code>localhost:*</code>，后续在已安装应用的配置页修改即可。</p><h4 id="-enable-encryption">🔒 是否开启加密（Enable Encryption）</h4><p>下拉选择，默认为<strong>关闭（推荐）</strong>。</p><p>::: warning
加密功能<strong>不可逆</strong>，开启后若不慎丢失密钥，数据将无法恢复。非有特殊需求，建议保持关闭。
:::</p><h4 id="-encryption-key">🗝️ 加密密钥（Encryption Key）</h4><p>仅在上一项选择「开启」时才需填写。密钥必须为 <strong>64 位小写字母和数字</strong>，可通过以下命令生成：</p><pre class="language-bash lang-bash"><code class="language-bash lang-bash">openssl rand -hex 32
</code></pre>
<p>如选择关闭加密，此项留空即可。</p><h4 id="-http-">🔢 HTTP 端口</h4><p>默认为 <code>2333</code>，一般无需修改。如有端口冲突，可自行更改为其他可用端口。</p><blockquote class="markdown-alert-note"><header>NOTE</header><p>不建议直接勾选端口外部访问，而是通过下一步的反向代理来对外提供服务，这样更安全、也更规范。</p></blockquote>
<h3 id="26--">2.6 开始安装 🎉</h3><p>确认配置无误，点击<strong>开始安装</strong>。</p><p>1Panel 会自动拉取 <code>innei/mx-server</code>、<code>mongo:7</code>、<code>redis:alpine</code> 三个镜像并编排启动。首次安装需要拉取镜像，耐心等待几分钟就好。</p><p>当状态显示为<strong>运行中（Running）</strong>，Mix Space 后端就悄悄跑起来了 🌿</p><hr/><h2 id="---https">第三步 · 配置反向代理与 HTTPS</h2><p>直接暴露端口的方式既不安全，也不美观。建议通过 Nginx 反向代理将服务绑定到你的域名，再配上 HTTPS，整套才算完整。</p><p>这里提供一份完整的 Nginx 配置，它做了一件很有意思的事——将 <strong>前端（Yohaku，端口 2323）</strong> 和 <strong>后端（Mix Space Core，端口 2333）</strong> 的路由都写在同一个 server 块里，用同一个域名对外服务。访客访问你的博客，前端页面和后端 API 悄悄在幕后各司其职，对外只露出一个干净的域名。</p><p>在 1Panel 的 <strong>网站 → OpenResty → 配置文件</strong> 中，或直接编辑服务器上的 Nginx 配置，填入以下内容：</p><p>::: banner {note}
<strong>使用前请将以下内容替换为你自己的值：</strong></p><ul><li><code>你的域名</code> → 替换为实际域名，共出现 <strong>7 处</strong></li><li><code> 你的子网网段</code> → 替换为实际子网网段，共出现 <strong>1 处</strong></li><li><code>你的服务器IP</code> → 替换为实际服务器 IP，共出现 <strong>1 处</strong>（<code>set_real_ip_from</code> 字段）</li><li>SSL 证书路径 → 替换为你实际的证书路径（<code>ssl_certificate</code> 和 <code>ssl_certificate_key</code>）</li><li><code>baidu_verify_*.html</code> → 如不需要百度站点验证，可删除对应 location 块
:::</li></ul><pre class="language-nginx lang-nginx"><code class="language-nginx lang-nginx">server {
    # 监听 IPv4/IPv6 的 HTTP 与 HTTPS 端口
    listen 80;
    listen [::]:80;
    listen 443 ssl;
    listen [::]:443 ssl;

    server_name 你的域名;
    index index.php index.html index.htm default.php default.htm default.html;
    root /www/sites/你的域名/index;

    # 日志路径
    access_log /www/sites/你的域名/log/access.log main;
    error_log /www/sites/你的域名/log/error.log;
    error_page 404 /404.html;

    # 从 CDN/代理获取真实客户端 IP
    real_ip_recursive on;
    set_real_ip_from 你的子网网段（如172.19.0.0/16）;
    set_real_ip_from 你的服务器IP;
    set_real_ip_from 127.0.0.1;
    real_ip_header X-Forwarded-For;

    # 向后端传递客户端信息
    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_set_header X-Forwarded-Proto $scheme;

    # SSL 证书与安全配置
    ssl_certificate /www/sites/你的域名/ssl/fullchain.pem;
    ssl_certificate_key /www/sites/你的域名/ssl/privkey.pem;
    ssl_protocols TLSv1.3 TLSv1.2;
    ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:!aNULL:!eNULL:!EXPORT:!DSS:!DES:!RC4:!3DES:!MD5:!PSK:!KRB5:!SRP:!CAMELLIA:!SEED;
    ssl_prefer_server_ciphers off;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    # 启用 HTTP/2 和 HSTS
    http2 on;
    add_header Strict-Transport-Security &quot;max-age=31536000; includeSubDomains&quot;;

    # 百度验证文件直接返回
    location = /baidu_verify_codeva-46XKS9HVjs.html {
        root /www/sites/你的域名/index;
        default_type text/plain;
        try_files $uri =404;
    }

    # 根路径：去掉错误参数后重定向；否则正常转发
    location = / {
        if ($args ~* &quot;error=please_restart_the_process&quot;) {
            return 301 $scheme://$host;
        }
        proxy_pass http://127.0.0.1:2323;
    }

    # 隐藏敏感文件
    location ~ ^/(\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md) {
        return 404;
    }

    # ACME 验证目录
    location ^~ /.well-known/acme-challenge {
        allow all;
        root /usr/share/nginx/html;
    }

    # 禁止访问 .well-known 下的动态文件
    location ~ ^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$ {
        return 403;
    }

    # WebSocket 代理
    location /socket.io {
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection &quot;Upgrade&quot;;
        proxy_buffering off;
        proxy_pass http://127.0.0.1:2333/socket.io;
    }

    # API、渲染、代理转发
    location /api/v3    { proxy_pass http://127.0.0.1:2333/api/v3; }
    location /render    { proxy_pass http://127.0.0.1:2333/render; }
    location /proxy     { proxy_pass http://127.0.0.1:2333/proxy; }
    location /qaqdmin   { proxy_pass http://127.0.0.1:2333/proxy/qaqdmin; }

    # 其他路径转发至后端（带缓冲优化）
    location / {
        proxy_buffer_size          128k;
        proxy_buffers              4 256k;
        proxy_busy_buffers_size    256k;
        proxy_pass http://127.0.0.1:2323;
    }

    # HTTP 自动跳转 HTTPS
    if ($scheme = http) {
        return 301 https://$host$request_uri;
    }
    error_page 497 https://$host$request_uri;
}
</code></pre>
<p>配置保存后，执行 <code>nginx -t</code> 检验语法，再 <code>nginx -s reload</code> 重载即可生效。</p><p>::: banner {note}
<strong>路由逻辑一览：</strong></p><table><thead><tr><th style="text-align:left"> 路径前缀 </th><th style="text-align:left"> 代理目标 </th><th style="text-align:left"> 说明 </th></tr></thead><tbody><tr><td style="text-align:left"> <code>/api/v3</code> </td><td style="text-align:left"> 后端 <code>:2333</code> </td><td style="text-align:left"> Mix Space REST API </td></tr><tr><td style="text-align:left"> <code>/socket.io</code> </td><td style="text-align:left"> 后端 <code>:2333</code> </td><td style="text-align:left"> WebSocket 实时推送 </td></tr><tr><td style="text-align:left"> <code>/render</code> </td><td style="text-align:left"> 后端 <code>:2333</code> </td><td style="text-align:left"> 服务端渲染接口 </td></tr><tr><td style="text-align:left"> <code>/proxy</code> </td><td style="text-align:left"> 后端 <code>:2333</code> </td><td style="text-align:left"> 代理及管理后台入口 </td></tr><tr><td style="text-align:left"> <code>/qaqdmin</code> </td><td style="text-align:left"> 后端 <code>:2333</code> </td><td style="text-align:left"> 管理后台快捷入口 </td></tr><tr><td style="text-align:left"> 其余所有路径 </td><td style="text-align:left"> 前端 <code>:2323</code> </td><td style="text-align:left"> Yohaku 页面 </td></tr></tbody></table><p>这意味着你只需要一个域名，前端博客和后端管理都在同一个入口下，整洁又优雅。
:::</p><p>配置完成后，你的后端相关地址如下（后续部署 Yohaku 时会用到）：</p><pre class=""><code class="">后端 API 地址：https://你的域名/api/v2
后端网关地址：https://你的域名
管理后台地址：https://你的域名/qaqdmin
</code></pre>
<p><strong>请记下这几个地址。</strong></p><hr/><h2 id="--">第四步 · 初始化后台管理</h2><p>反向代理配置完成后，在浏览器访问管理后台：</p><pre class=""><code class="">https://你的域名/qaqdmin
</code></pre>
<p>首次访问会引导你完成初始化，包括创建管理员账号、填写站点基本信息等，按提示操作即可。</p><hr/><h2 id="">常见问题</h2><p><strong>Q：安装后容器一直在重启，无法正常启动？</strong></p><p>大概率是 MongoDB 或 Redis 的健康检查还没通过——它们需要一点时间完全就绪，Core 容器会自动重试。等待约 1 分钟，通常就能自己恢复。如果持续异常，可以在 1Panel 的容器日志里查看具体的报错信息。</p><p><strong>Q：JWT 密钥忘记保存了怎么办？</strong></p><p>在 1Panel 应用商店的已安装列表中，点击 mxspace 的<strong>编辑</strong>或<strong>配置</strong>，可以查看当前的环境变量值。</p><p><strong>Q：想修改被允许的域名，怎么操作？</strong></p><p>在已安装应用的配置页面中修改 <code>ALLOWED_ORIGINS</code> 环境变量，保存后重启容器即可生效。</p><p><strong>Q：数据存储在哪里？</strong></p><p>所有数据持久化存储在 <code>/opt/1panel/apps/local/mxspace/mxspace/data/</code> 目录下，包含 MongoDB 数据、Redis 数据和 mx-space 运行时文件。定期备份此目录即可，也可随 1Panel 快照一并备份。</p><hr/><h2 id="">参考资料</h2><ul><li><a href="https://1panel.cn/docs/v2/installation/online_installation/">1Panel 在线安装文档</a></li><li><a href="https://mx-space.js.org/docs/">Mix Space 官方文档</a></li><li><a href="https://github.com/mx-space/mx-server">mx-server GitHub 仓库</a></li><li><a href="https://bbs.fit2cloud.com/t/topic/7409">自助创建 1Panel 应用 · FIT2CLOUD 社区论坛</a></li></ul><hr/><blockquote><p>后端已经稳稳落地了 🌱<br/>接下来，前往第二篇，为它披上 Yohaku 这件漂亮的外衣吧。</p></blockquote></div><p style="text-align:right"><a href="https://jiye.funcun.top/posts/blog-setup/deploy-mix-space-backend-with-1panel#comments">览毕，何不一言？</a></p></div>]]></description><link>https://jiye.funcun.top/posts/blog-setup/deploy-mix-space-backend-with-1panel</link><guid isPermaLink="true">https://jiye.funcun.top/posts/blog-setup/deploy-mix-space-backend-with-1panel</guid><dc:creator><![CDATA[PolarNight]]></dc:creator><pubDate>Wed, 15 Apr 2026 00:34:00 GMT</pubDate></item><item><title><![CDATA[余白之间：用1Panel部署Yohaku/Shiroi主题完全指南]]></title><description><![CDATA[<div><blockquote>此渲染由 Yohaku API 生成，或存排版之虞，最佳体验请往：<a href="https://jiye.funcun.top/posts/blog-setup/deploy-yohaku-theme-with-1panel-guide">https://jiye.funcun.top/posts/blog-setup/deploy-yohaku-theme-with-1panel-guide</a></blockquote><div><blockquote class="markdown-alert-note"><header>NOTE</header><p>这是「Mix Space + Yohaku 部署系列」的第二篇，专注于前端主题 Yohaku 的安装。如尚未部署后端，请先阅读第一篇——<strong><a href="https://jiye.funcun.top/posts/default/deploy-mix-space-backend-with-1panel">《从零开始 · 用 1Panel 部署 Mix Space 后端》</a></strong></p></blockquote>
<hr/><p><em>Yohaku</em>，取自日文「余白」，意为留白——画面中那些有意空出的地方，往往比填满的部分更有分量。</p><p>这是 Mix Space 生态中最新一代的前端主题。它的故事从开源的 <strong>Shiro</strong> 开始，经由闭源赞助版 <strong>Shiroi</strong> 的沉淀，一路演进至今日的 <strong>Yohaku</strong>——三代传承，设计语言与实现在每一步都在悄然迭代。整站以书写为隐喻，页面像一封徐徐展开的信纸，用克制的色彩和呼吸式的动画，让阅读本身成为主角。</p><blockquote><p><strong>三代主题的关系，简单梳理一下：</strong></p><ul><li><strong>Shiro</strong> → Mix Space 最初的开源前端主题，代码公开在 GitHub</li><li><strong>Shiroi</strong> → Shiro 的闭源捐赠版，在 Shiro 基础上演进，赞助后可访问</li><li><strong>Yohaku（余白）</strong> → 由 Shiro / Shiroi 进一步演进而来的全新设计，同样以闭源赞助形式维护，是目前最新的一代</li></ul></blockquote>
<p>本文部署的主角是 <strong>Yohaku</strong>，由于它是闭源主题，需要自行构建 Docker 镜像，下文会手把手带你完成。（本教程亦兼容 Shiroi）</p><p>::: banner {note}
<strong>前提说明</strong>：本文假设你拥有闭源版仓库的访问权限，且已完成 Mix Space 后端的部署，手边备好了两个地址：</p><ul><li><code>后端 API 地址</code>：形如 <code>https://你的域名/api/v3（后端版本V13之前为v2）</code></li><li><code>后端网关地址</code>：形如 <code>https://你的域名</code></li></ul><p>如尚未部署后端，请先阅读第一篇完成。
:::</p><hr/><h2 id="---docker-">第一步 · 构建 Docker 镜像</h2><p>（使用开源版 Shiro 的请直接跳转第二步）
由于作者没有提供 Shiroi / Yohaku 主题预构建的 Docker 镜像，所以需要我们自行构建。但请<strong>不要在低配服务器上直接构建</strong>——服务器的内存会被撑爆 💥</p><p>我们的方案是借助 <strong>GitHub Actions</strong> 在云端完成构建，然后把镜像推送到 GitHub Packages（<code>ghcr.io</code>）私有仓库里。服务器只需要拉取现成的镜像，非常简便。</p><h3 id="11-">1.1 准备仓库</h3><p>访问以下仓库，点击右上角的 <strong>Fork</strong>：</p><p><a href="https://github.com/IPF-Sinon/yohaku-docker-build">https://github.com/IPF-Sinon/yohaku-docker-build</a></p><p>再访问以下链接新建仓库（<strong><em>Choose visibility</em> 一定要选择 <em>Private</em>！！！</strong>），建议命名为 <strong>yohaku</strong>，如不同需在后面的工作流文件做出对应修改。</p><p><a href="https://github.com/new">https://github.com/new</a></p><h3 id="12--github-classic-token">1.2 申请 GitHub 经典访问令牌（Classic Token）</h3><p>Actions 需要有权限读取 Shiroi 私有仓库、并将构建好的镜像推送到 GitHub Packages。我们要提前准备一个经典令牌（Classic Token）。</p><p>访问https://github.com/settings/tokens/new</p><p>填写备注（例如 <code>yohaku-build</code>），有效期可设为永久，然后勾选以下权限：</p><table><thead><tr><th style="text-align:left"> 权限 </th><th style="text-align:left"> 用途说明 </th></tr></thead><tbody><tr><td style="text-align:left"> <code>repo</code> </td><td style="text-align:left"> 读写仓库，含私有仓库访问 </td></tr><tr><td style="text-align:left"> <code>workflow</code> </td><td style="text-align:left"> 更新 GitHub Action 工作流 </td></tr><tr><td style="text-align:left"> <code>write:packages</code> </td><td style="text-align:left"> 将镜像推送到 GitHub Packages </td></tr><tr><td style="text-align:left"> <code>read:packages</code> </td><td style="text-align:left"> 从 GitHub Packages 拉取镜像 </td></tr></tbody></table><p>点击 <strong>Generate token</strong>，立即将生成的 Token 复制保存好——它只显示这一次！</p><h3 id="13--actions-">1.3 配置仓库 Actions 变量</h3><p>进入你 Fork 的仓库，依次点击：</p><pre class=""><code class="">Settings → Secrets and variables → Actions → Repository secrets
</code></pre>
<p>添加以下两个变量：</p><table><thead><tr><th style="text-align:left"> 变量名 </th><th style="text-align:left"> 填写内容 </th></tr></thead><tbody><tr><td style="text-align:left"> <code>BASE_URL</code> </td><td style="text-align:left"> Core 后端所绑定的域名（如https://jiye.funcun.top） </td></tr><tr><td style="text-align:left"> <code>GH_PAT</code> </td><td style="text-align:left"> 上一步申请的 Personal Access Token </td></tr><tr><td style="text-align:left"> <code>NEXT_PUBLIC_GATEWAY_URL</code> </td><td style="text-align:left"> 可选，如https://jiye.funcun.top </td></tr><tr><td style="text-align:left"> <code>NEXT_PUBLIC_API_URL</code> </td><td style="text-align:left"> 可选，如https://jiye.funcun.top/api/v3 </td></tr></tbody></table><p>进入新建的 Yohaku 仓库，如刚刚的操作添加变量</p><table><thead><tr><th style="text-align:left"> 变量名 </th><th style="text-align:left"> 填写内容 </th></tr></thead><tbody><tr><td style="text-align:left"> <code>UPSTREAM_REPO_SECRET</code> </td><td style="text-align:left"> 上一步申请的 Personal Access Token </td></tr></tbody></table><h3 id="14-">1.4 启用并触发构建</h3><p>先进入新建的 Yohaku 仓库，将 Fork 仓库中的 upstream-sync.yml 文件上传到该仓库，然后在服务器/其它设备执行以下脚本，根据提示输入即可（有默认的选项建议默认）</p><pre class="language-bash lang-bash"><code class="language-bash lang-bash">#!/bin/bash
set -euo pipefail

# =============================================
# 脚本介绍：
# 本脚本用于将上游仓库的指定分支，强制同步到你个人仓库的目标分支。
# 适用于从公开/私有的上游仓库拉取更新，并推送到自己的分支（如镜像同步）。
# 强制推送会覆盖目标分支的历史，请谨慎操作！
# =============================================

echo &quot;=======================================&quot;
echo &quot;  上游仓库 → 个人仓库 强制同步工具&quot;
echo &quot;=======================================&quot;
echo &quot;&quot;
echo &quot;本脚本将执行以下操作：&quot;
echo &quot;1. 克隆上游仓库到临时目录&quot;
echo &quot;2. 添加你的个人远程仓库&quot;
echo &quot;3. 将上游分支强制推送到个人仓库的目标分支&quot;
echo &quot;注意：目标分支的现有内容将被完全覆盖！&quot;
echo &quot;=======================================&quot;
echo &quot;&quot;

# ---------- 收集你的个人仓库信息 ----------
read -r -p &quot;请输入你的 GitHub 用户名: &quot; USERNAME
read -r -p &quot;请输入你的目标仓库名: &quot; REPO
echo &quot;请输入你的 GitHub Personal Access Token（输入时不显示，需有 repo 权限）：&quot;
read -r -s TOKEN
echo   # 换行

# ---------- 收集上游仓库信息 ----------
read -r -p &quot;上游仓库是否为私有？(y/n，默认 n): &quot; UPSTREAM_PRIVATE
UPSTREAM_PRIVATE=${UPSTREAM_PRIVATE:-n}

read -r -p &quot;请输入上游仓库的完整地址（如 https://github.com/innei-dev/Yohaku.git）: &quot; UPSTREAM

if [ &quot;$UPSTREAM_PRIVATE&quot; = &quot;y&quot; ] || [ &quot;$UPSTREAM_PRIVATE&quot; = &quot;Y&quot; ]; then
    echo &quot;上游仓库为私有，需要提供访问该仓库的 Token（输入时不显示）：&quot;
    read -r -s UPSTREAM_TOKEN
    echo
    # 构造带认证的上游 URL
    UPSTREAM_AUTH_URL=$(echo &quot;$UPSTREAM&quot; | sed &quot;s|https://|https://x-access-token:${UPSTREAM_TOKEN}@|&quot;)
else
    UPSTREAM_AUTH_URL=&quot;$UPSTREAM&quot;
fi

read -r -p &quot;请输入临时目录名（默认 temp-upstream）: &quot; TEMP_DIR
TEMP_DIR=${TEMP_DIR:-temp-upstream}

read -r -p &quot;请输入上游仓库的分支名（默认 main）: &quot; SRC_BRANCH
SRC_BRANCH=${SRC_BRANCH:-main}

read -r -p &quot;请输入要推送到个人仓库的目标分支名（默认 sync）: &quot; DST_BRANCH
DST_BRANCH=${DST_BRANCH:-sync}

# ---------- 构建个人远程地址 ----------
MY_REMOTE=&quot;https://${USERNAME}:${TOKEN}@github.com/${USERNAME}/${REPO}.git&quot;

# ---------- 处理临时目录 ----------
while [ -d &quot;$TEMP_DIR&quot; ] &amp;&amp; [ &quot;$(ls -A &quot;$TEMP_DIR&quot; 2&gt;/dev/null)&quot; ]; do
    echo &quot;&quot;
    echo &quot;警告：目录 &#x27;$TEMP_DIR&#x27; 已存在且不为空。&quot;
    read -r -p &quot;是否删除并重新创建？(y/n): &quot; answer
    if [ &quot;$answer&quot; = &quot;y&quot; ] || [ &quot;$answer&quot; = &quot;Y&quot; ]; then
        rm -rf &quot;$TEMP_DIR&quot;
        echo &quot;已删除旧目录。&quot;
    else
        read -r -p &quot;请输入一个新的临时目录名: &quot; TEMP_DIR
    fi
done

# ---------- 执行同步 ----------
echo &quot;&quot;
echo &quot;正在克隆上游仓库 $UPSTREAM 到 $TEMP_DIR ...&quot;
git clone &quot;$UPSTREAM_AUTH_URL&quot; &quot;$TEMP_DIR&quot;

cd &quot;$TEMP_DIR&quot;

echo &quot;正在添加你的远程仓库 myrepo ...&quot;
git remote add myrepo &quot;$MY_REMOTE&quot;

echo &quot;正在强制推送 $SRC_BRANCH -&gt; myrepo/$DST_BRANCH ...&quot;
git push --force myrepo &quot;$SRC_BRANCH:$DST_BRANCH&quot;

cd ..
echo &quot;清理临时目录 $TEMP_DIR ...&quot;
rm -rf &quot;$TEMP_DIR&quot;

echo &quot;&quot;
echo &quot;=======================================&quot;
echo &quot;同步完成！&quot;
echo &quot;已将 $UPSTREAM 的 $SRC_BRANCH 分支&quot;
echo &quot;强制推送到 $USERNAME/$REPO 的 $DST_BRANCH 分支。&quot;
echo &quot;=======================================&quot;
</code></pre>
<p>完成后进入 Yohaku 仓库的 <strong>Actions</strong> 标签页，如有提示请点击启用。然后找到构建 Workflow，点击右侧的 <strong>Run workflow</strong> 手动触发一次。</p><blockquote><p>构建过程通常需要 <strong>5 ~ 10 分钟</strong>，可以去泡杯茶等待 ☕</p></blockquote>
<p>构建完成后，在仓库侧边栏的 <strong>Packages</strong> 中就能看到你的镜像，地址格式为：</p><pre class=""><code class="">ghcr.io/你的用户名(全小写)/yohaku:latest
</code></pre>
<p>::: warning
GitHub Actions 规定：仓库若连续 <strong>3 个月无活动</strong>，工作流将被自动停用。构建仓库内置了哈希文件更新机制来维持活跃，但若真被停用了，进入 Actions 页重新启用即可。
:::</p><h3 id="15--1panel--ghcrio-">1.5 在 1Panel 中配置 ghcr.io 私有仓库</h3><p>由于镜像存放在私有 GitHub Container Registry，1Panel 需要先登录认证才能拉取。</p><p>登入 1Panel 面板，前往 <strong>容器 → 仓库 → 创建仓库</strong>，填写：</p><table><thead><tr><th style="text-align:left"> 字段 </th><th style="text-align:left"> 内容 </th></tr></thead><tbody><tr><td style="text-align:left"> 名称 </td><td style="text-align:left"> <code>ghcr.io</code>（任意便于识别的名字） </td></tr><tr><td style="text-align:left"> 仓库地址 </td><td style="text-align:left"> <code>ghcr.io</code> </td></tr><tr><td style="text-align:left"> 用户名 </td><td style="text-align:left"> 你的 GitHub 用户名 </td></tr><tr><td style="text-align:left"> 密码 </td><td style="text-align:left"> 你的 Personal Access Token（<code>GH_PAT</code>） </td></tr></tbody></table><p>保存后，1Panel 会自动验证连接。这样以后拉取私有镜像就畅通无阻了 🔐</p><hr/><h2 id="---1panel--yohaku">第二步 · 通过 1Panel 安装 Yohaku</h2><h3 id="21-">2.1 上传应用包</h3><p>登入 1Panel 面板，在左侧菜单进入 <strong>主机 → 文件</strong>，导航到路径：</p><pre class=""><code class="">/opt/1panel/resource/apps/local
</code></pre>
<p>点击上传，选择你从 Fork 的仓库下载的 <code>yohaku.zip</code> 文件。</p><h3 id="22-">2.2 解压，注意路径！</h3><p>上传完成后，点击 <code>yohaku.zip</code>，选择<strong>解压</strong>。</p><p>::: banner {error}
<strong>这一步是新手最常踩的坑，请务必注意！</strong></p><p>解压时需要手动将目标路径补全为：</p><pre class=""><code class="">/opt/1panel/resource/apps/local/yohaku
</code></pre>
<p>路径不对，可能产生一堆位于错误目录的文件，应用商店将无法识别此本地应用。
:::</p><h3 id="23-">2.3 同步本地应用</h3><p>前往 1Panel <strong>应用商店</strong>，点击右上角的<strong>同步本地应用</strong>按钮，稍等片刻后在搜索框输入 <code>yohaku</code>，便能看到刚刚添加的应用了。</p><p>点击<strong>安装</strong>，进入配置页面。</p><h3 id="24-">2.4 填写安装配置项</h3><p>安装页面共有四个必填项（另有一条只读说明），从上到下依次填写：</p><h4 id="-image-address">🐳 镜像地址（Image Address）</h4><p>这里填写容器镜像。根据你部署的版本选择：</p><p><strong>开源版 Shiro</strong>（直接使用官方预构建镜像）：</p><pre class=""><code class="">innei/shiro:latest
</code></pre>
<p><strong>闭源版 Shiroi / Yohaku</strong>（填写第一步自行构建的私有镜像）：</p><pre class=""><code class="">ghcr.io/你的用户名(全小写)/shiroi:latest
</code></pre>
<h4 id="--api-publicapiurl">📡 公开 API 地址（PUBLIC<em>API</em>URL）</h4><p>填写你的 Mix Space 后端 API 地址：</p><pre class=""><code class="">https://你的后端域名/api/v2
</code></pre>
<p>注意保留末尾的 <code>/api/v2</code> 路径。</p><h4 id="-publicgatewayurl">🌐 公开网关地址（PUBLIC<em>GATEWAY</em>URL）</h4><p>填写你的 Mix Space 后端网关地址（即后端根域名）：</p><pre class=""><code class="">https://你的后端域名
</code></pre>
<p>不需要加任何路径后缀。</p><h4 id="-api-url--api-">🔗 API URL 与客户端 API 地址</h4><p><code>API_URL</code> 与 <code>NEXT_PUBLIC_CLIENT_API_URL</code> 这两项的值<strong>与公开 API 地址保持一致</strong>，填入相同内容即可：</p><pre class=""><code class="">https://你的后端域名/api/v2
</code></pre>
<h3 id="25--">2.5 开始安装 🎉</h3><p>确认配置无误，点击<strong>开始安装</strong>。</p><p>1Panel 会自动拉取镜像并启动容器，此过程根据网络状况可能需要几分钟。当状态显示为<strong>运行中（Running）</strong>，Yohaku 就正式上线了！</p><hr/><h2 id="---https">第三步 · 配置反向代理与 HTTPS</h2><p>参见上篇博客，若已配置可略过。</p><hr/><h2 id="yohaku--markdown-">附：Yohaku 支持的扩展 Markdown 语法</h2><p>Yohaku 继承自 Shiro 体系，支持一套丰富的扩展 Markdown 语法，让你的博文不止于纯文字。以下是写作时可以使用的特色语法——</p><h3 id="katex">数学公式（KaTeX）</h3><p>行内公式：</p><pre class="language-markdown lang-markdown"><code class="language-markdown lang-markdown">质能方程 $E = mc^2$ 改变了人类对宇宙的认知。
</code></pre>
<p>块级公式：</p><pre class="language-markdown lang-markdown"><code class="language-markdown lang-markdown">$$
\int_{-\infty}^{+\infty} e^{-x^2} dx = \sqrt{\pi}
$$
</code></pre>
<h3 id="notice--banner">提示横幅（Notice / Banner）</h3><pre class="language-markdown lang-markdown"><code class="language-markdown lang-markdown">::: warning
这里是警告内容，背景会呈现醒目的颜色。
:::

::: banner {note}
这里是备注，适合附加额外说明。
:::

::: banner {error}
这里是错误提示，用于强调危险操作。
:::
</code></pre>
<h3 id="gfm-alert-">GFM Alert 语法</h3><pre class="language-markdown lang-markdown"><code class="language-markdown lang-markdown">&gt; [!NOTE]
&gt; 这是一条备注，提醒读者注意某些事项。

&gt; [!IMPORTANT]
&gt; 这是重要信息，不容忽视。

&gt; [!WARNING]
&gt; 这是警告，可能涉及潜在风险。
</code></pre>
<h3 id="spoiler">剧透遮罩（Spoiler）</h3><pre class="language-markdown lang-markdown"><code class="language-markdown lang-markdown">这部电影的结局是 ||主角其实已经死了||，令人意想不到。
</code></pre>
<p>注意：这与删除线 <code>~~文字~~</code> 的效果不同，Spoiler 会用遮罩隐藏内容，鼠标悬停后才显示。</p><h3 id="rich-link">富链接（Rich Link）</h3><p>对于单独成行的链接，Yohaku 会自动渲染为带封面和摘要的卡片样式：</p><pre class="language-markdown lang-markdown"><code class="language-markdown lang-markdown">https://github.com/Innei/Yohaku
</code></pre>
<p>支持识别的平台包括 GitHub 仓库、Commit、Issue、Gist，以及 YouTube、Twitter 等。</p><h3 id="">内联链接图标</h3><p>行内链接会自动附上对应网站的 Favicon：</p><pre class="language-markdown lang-markdown"><code class="language-markdown lang-markdown">访问 [Innei 的主页](https://innei.in) 了解更多。
</code></pre>
<h3 id="mention">Mention（提及）</h3><pre class="language-markdown lang-markdown"><code class="language-markdown lang-markdown">感谢 [Innei]{GH@Innei} 创作了这么美的主题。
</code></pre>
<p><code>GH@用户名</code> 会自动渲染为带头像的 GitHub 用户卡片。</p><h3 id="collapse">折叠块（Collapse）</h3><pre class="language-markdown lang-markdown"><code class="language-markdown lang-markdown">&lt;details&gt;
&lt;summary&gt;点击展开查看详细内容&lt;/summary&gt;

这里是折叠起来的详细说明……

&lt;/details&gt;
</code></pre>
<hr/><h2 id="">常见问题</h2><p><strong>Q：镜像拉取速度极慢或失败怎么办？</strong></p><p>国内服务器拉取 <code>ghcr.io</code> 时可能较慢。可以在 GitHub Actions 的构建 Workflow 中添加同步推送至<strong>阿里云 ACR</strong> 的步骤，再从阿里云拉取。具体配置可参考<a href="https://hoshiroko.com/posts/course/mix-space">薄荷の小屋的教程</a>。</p><p><strong>Q：Actions 构建失败，如何排查？</strong></p><p>进入仓库的 <strong>Actions</strong> 页面，点击失败的 Workflow 查看详细日志，常见原因：</p><ul><li><code>GH_PAT</code> 权限不够，检查是否勾选了 <code>repo</code> 和 <code>write:packages</code></li><li><code>DOCKER_NAMESPACE</code> 没有全部小写</li><li>仓库被设为公开，导致权限冲突</li></ul><p><strong>Q：解压后应用商店搜不到 yohaku？</strong></p><p>大概率是解压路径不对。请确认解压目标为 <code>/opt/1panel/resource/apps/local/yohaku</code>（不是 <code>/opt/1panel/resource/apps/local</code>）。确认后重新点击「同步本地应用」。</p><p><strong>Q：页面能访问，但提示后端连接失败？</strong></p><p>检查以下几点：</p><ul><li>四个 API 地址配置项是否填写正确，尤其是 <code>/api/v2</code> 路径不能遗漏</li><li>Mix Space 后端的 <code>ALLOWED_ORIGINS</code> 中是否已包含 Yohaku 前端的域名</li><li>后端反向代理和 HTTPS 证书是否正常工作</li></ul><hr/><h2 id="">参考资料</h2><p>本文写作过程中参考了以下资料，感谢各位博主的慷慨分享 💝</p><ul><li><a href="https://1panel.cn/docs/v2/installation/online_installation/">1Panel 在线安装文档</a></li><li><a href="https://blog.sotkg.com/2024/10/shiroi-docker-deployment">GitHub Action 构建 Shiroi Docker 镜像 · Mikuの极光星</a></li><li><a href="https://hoshiroko.com/posts/course/mix-space">Mix Space + Shiro 全容器化部署指南 · 薄荷の小屋</a></li><li><a href="https://bbs.fit2cloud.com/t/topic/7409">自助创建 1Panel 应用 · FIT2CLOUD 社区论坛</a></li><li><a href="https://anyexyz-auto-build-1panel-app.hf.space/">自助创建 1Panel 应用工具</a></li><li><a href="https://shiro.innei.in/#/markdown">Shiro Markdown 扩展语法文档</a></li><li><a href="https://mx-space.js.org/docs/themes/yohaku">Yohaku 主题文档</a></li><li><a href="https://github.com/innei-dev/Yohaku/issues/115">添加NEXT_PUBLIC_CLIENT_API_URL</a></li><li><a href="https://github.com/innei-dev/Yohaku/issues/104">添加API_URL</a></li><li><a href="https://zwh.moe/posts/technology/actions-sync">破事水 | Actions 同步上游项目及合并到自己分支</a></li><li><a href="https://zwh.moe/posts/technology/yohaku-docker-deployment">GitHub Actions 构建 Yohaku 的 Docker 镜像</a></li></ul><hr/><blockquote><p>余白，是一种态度。<br/>愿你的博客，也能成为那封值得被细细展开的信纸 🌿</p></blockquote></div><p style="text-align:right"><a href="https://jiye.funcun.top/posts/blog-setup/deploy-yohaku-theme-with-1panel-guide#comments">览毕，何不一言？</a></p></div>]]></description><link>https://jiye.funcun.top/posts/blog-setup/deploy-yohaku-theme-with-1panel-guide</link><guid isPermaLink="true">https://jiye.funcun.top/posts/blog-setup/deploy-yohaku-theme-with-1panel-guide</guid><dc:creator><![CDATA[PolarNight]]></dc:creator><pubDate>Sat, 11 Apr 2026 11:08:05 GMT</pubDate></item><item><title><![CDATA[MX Space 博客云服务器迁移完整指南]]></title><description><![CDATA[<div><blockquote>此渲染由 Yohaku API 生成，或存排版之虞，最佳体验请往：<a href="https://jiye.funcun.top/posts/default/mx-space-blog-cloud-server-migration-guide">https://jiye.funcun.top/posts/default/mx-space-blog-cloud-server-migration-guide</a></blockquote><div><h2 id="">前言</h2><p>最近发现一台价格更低的云服务器，于是决定把原有服务整体迁移过去。\
本来打算直接使用 1Panel 快照功能一键迁移，但实际操作后发现：</p><blockquote><p>博客空间（MX Space）无法完整通过快照迁移</p></blockquote>
<p>因此只能手动迁移，顺便把整个流程记录下来，供以后参考。</p><hr/><h1 id="dns-">一、DNS 解析迁移</h1><p>首先需要让域名指向新服务器。</p><ol start="1"><li>登录你的域名 DNS 服务商\</li><li>修改 A 记录 → 指向新服务器 IP\</li><li>建议设置较低 TTL（如 600 秒），方便快速生效</li></ol><p>示例：</p><p>  记录类型   主机记录   记录值
  ---------- ---------- -------------
  A          @          新服务器 IP
  A          www        新服务器 IP</p><p>等待解析生效（通常 1~30 分钟）。</p><hr/><h1 id="-mx-space-">二、迁移 MX Space 服务端</h1><h2 id="1-">1. 打包旧服务器数据</h2><p>MX Space 的核心数据全部在 mx-space 目录中。</p><p>例如目录结构： /root/mx-space</p><p>旧服务器执行： cd /root tar -czvf mx-space.tar.gz mx-space</p><hr/><h2 id="2-">2. 上传到新服务器</h2><p>scp mx-space.tar.gz root@新服务器IP:/root/ cd /root tar -xzvf
mx-space.tar.gz</p><hr/><h2 id="3--docker-">3. 启动 Docker 服务</h2><p>cd /root/mx-space/core docker compose pull docker compose up -d docker
ps</p><hr/><h2 id="4-">4. 常见补充检查</h2><p>ufw allow 80 ufw allow 443 ufw allow 22</p><p>apt update apt install docker-compose-plugin -y</p><hr/><h1 id="-shiroi-github-actions">三、部署 Shiroi 主题（GitHub Actions）</h1><p>进入：Settings → Secrets and variables → Actions</p><p>需要更新： HOST / USER / PASSWORD / PORT / KEY / GH_PAT</p><p>然后运行 Actions → Run workflow</p><hr/><h1 id="">四、迁移完成验证</h1><ol start="1"><li>打开博客域名\</li><li>查看是否可正常访问\</li><li>检查后台管理\</li><li>测试文章、图片、评论功能</li></ol><hr/><h1 id="">迁移总结</h1><ol start="1"><li>修改 DNS\</li><li>迁移 /root/mx-space\</li><li>Docker 拉起服务\</li><li>更新 GitHub Actions</li></ol></div><p style="text-align:right"><a href="https://jiye.funcun.top/posts/default/mx-space-blog-cloud-server-migration-guide#comments">览毕，何不一言？</a></p></div>]]></description><link>https://jiye.funcun.top/posts/default/mx-space-blog-cloud-server-migration-guide</link><guid isPermaLink="true">https://jiye.funcun.top/posts/default/mx-space-blog-cloud-server-migration-guide</guid><dc:creator><![CDATA[PolarNight]]></dc:creator><pubDate>Thu, 26 Mar 2026 11:04:14 GMT</pubDate></item></channel></rss>