diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index 3bb8b7c..4f0e594 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -3,32 +3,30 @@ on: [push, pull_request, workflow_dispatch]
name: CI
jobs:
deploy:
- name: Deploy
+ name: CI
runs-on: ubuntu-latest
env:
- DEPLOY_SERVER: copy.lty.name
+ GIT_SERVER: devops.lty.name
+ DEPLOY_USER: web-deploy
+ DEPLOY_SERVER: lty.name
DEPLOY_SERVER_KEY: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBKn1tARbrf+klrF31iN1Q0otmL1AvDDI87kC7HLo5ix
+ DEPLOY_SOURCE: dist
DEPLOY_TARGET: homepage
steps:
- - uses: actions/checkout@v4
- with:
- persist-credentials: true
- lfs: true
- # - uses: actions/setup-python@v5
- # with:
- # python-version: '3.12'
- # - name: Install dependencies & Build
- # run: |
- # pip install pdm==2.20.1
- # pdm install
- # pdm start
- # - if: github.ref == 'refs/heads/main' || github.event_name == 'workflow_dispatch'
- # name: Deploy to the web server
- # run: |
- # mkdir -p "${HOME}/.ssh"
- # echo "${DEPLOY_SSH_KEY}" | base64 -d > "${HOME}/.ssh/id_ed25519"
- # chmod 600 "${HOME}/.ssh/id_ed25519"
- # echo "${DEPLOY_SERVER} ${DEPLOY_SERVER_KEY}" > "${HOME}/.ssh/known_hosts"
- # rsync -avz --delete ./dist/ "${DEPLOY_TARGET}:~/${DEPLOY_TARGET}/"
- # env:
- # DEPLOY_SSH_KEY: ${{ secrets.DEPLOY_SSH_KEY }}
+ - name: build
+ run: |
+ git clone https://${{ github.token }}@${{ env.GIT_SERVER }}/${{ github.repository }} $(pwd)
+ git lfs install
+ git lfs pull
+ pip install --break-system-package pdm==2.20.1
+ pdm config check_update false
+ pdm install
+ pdm start
+ - name: deploy
+ if: github.ref == 'refs/heads/main' || github.event_name == 'workflow_dispatch'
+ run: |
+ apt update && apt install -y rsync
+ mkdir -p ~/.ssh && touch ~/.ssh/id_ed25519 && chmod 600 ~/.ssh/id_ed25519
+ echo ${{ secrets.DEPLOY_SSH_KEY }} | base64 -d > ~/.ssh/id_ed25519
+ echo ${{ env.DEPLOY_SERVER }} ${{ env.DEPLOY_SERVER_KEY }} > ~/.ssh/known_hosts
+ rsync -avz --delete ./${{ env.DEPLOY_SOURCE || 'none' }}/ ${{ env.DEPLOY_USER }}@${{ env.DEPLOY_SERVER }}:web/${{ env.DEPLOY_TARGET || 'none' }}/
diff --git a/data/home.yaml b/data/home.yaml
new file mode 100644
index 0000000..2178183
--- /dev/null
+++ b/data/home.yaml
@@ -0,0 +1,17 @@
+title: Tianyi CodeLab
+headline: Welcome to Tianyi CodeLab
+links:
+ - text: AI 聊天室
ChatAI
+ link: https://ai.lty.name/
+ - text: 云音乐
Music
+ link: https://music.lty.name/
+ - text: 资源下载
Download
+ link: https://dl.lty.name/
+ - text: 开源中心
DevOps
+ link: https://devops.lty.name/
+ - text: 链上镌刻
Inscription
+ link: /inscription/profile
+footer: |
+ © 2025 Tianyi CodeLab 在 CC BY-NC-SA 4.0 协议下提供 | 电子邮箱:me@lty.name
+
+ 本站不面向欧盟用户提供服务。根据相关法律法规要求,我们可能收集您的 IP 地址和浏览器信息。「Vsinger」及「洛天依」是上海禾念科技有限公司的注册商标。图片按原利用规约提供,来源信息如下: 背景图片 101300012 (pixiv) by 菊花猹, 102153120 (pixiv) by 天姫神織, 101019411 (pixiv) by Ben_SY, 75554096 (pixiv) by TID, 「无题—创作欲」曲绘 by Cyarhy from twitter @cyarhy, 洛天依AI模型,洛天依公式服 by 上海禾念。
diff --git a/data/inscription/faq.yaml b/data/inscription/faq.yaml
new file mode 100644
index 0000000..f3d5f0f
--- /dev/null
+++ b/data/inscription/faq.yaml
@@ -0,0 +1,90 @@
+faq:
+ - question: 反诈提示
+ alert: true
+ answer: |
+ 警告:lty.name 不是「洛天依」官方创建的网站,与「洛天依」的版权持有者「上海禾念」无关。本站系「洛天依」爱好者创建的公益性质网站,旨在使用区块链及其他去中心化网络技术,保存对「洛天依」重要的文本资料和其他信息。
+
+ lty.name 不会以任何方式、任何名义(包括但不限于保证金、手续费、初始费、友情赞助、自愿捐赠、成本价、会员费等),要求您支出任何形式的货币或财产(无论是法定货币还是加密货币)。请务必提高警惕,防范诈骗。
+
+ luotianyi.eth
和 0x66CCffDE4E5941aD0593adE6e6Fe23e8CE1550C6
是专用于「」的地址。请勿向该地址转入任何形式的 ETH 链上货币,任何要求您这样做的都是诈骗。由于加密货币的匿名性,我们无法追踪和返还您的资产。
+
+
+ - question: 什么是「链上镌刻」和区块链刻字?
+ answer: |
+ 简单的说,区块链刻字(Blockchain Inscription)就是把文字信息保存在区块链上。这种技术有两种特性:
+
+ 永久性:由于区块链具有不可篡改的特性,镌刻的内容一旦写入,就会永久存在于区块链上,并有由每一个「区块链节点」保存。
+
+ 公开性:区块链的节点、数据、记录都是公开的,任何人都能轻松地访问、查看这些信息。
+
+ 「链上镌刻 — 永不停止的歌声」是 Tianyi CodeLab 提供的「区块链刻字」服务名称。正如项目名称「永不停止的歌声」所寓意的一样,我们希望将与洛天依有关的点点滴滴永久保存在区块链上,让这些信息永远不消失。
+
+
+ - question: Tianyi CodeLab 使用什么技术进行「链上镌刻」?
+ answer: |
+ Tianyi CodeLab 在「以太坊 (Ethereum)」链上进行区块链刻字(Blockchain Inscription)。
+
+ 与其他商业区块链刻字项目不同的是,Tianyi CodeLab 使用 ENS 记录 进行「链上镌刻」,而非使用「交易记录」。
+
+ 相比其他技术,使用 ENS 记录成本更高,但是在 Etherscan 上可以直接解码为文字,而不需要手动计算编解码,因此更加直观、简便。
+
+
+ - question: 区块链刻字成本如何?Tianyi CodeLab 进行「链上镌刻」有什么收费?
+ answer: |
+ 首先明确的是,Tianyi CodeLab 不会以任何方式、任何名义要求您支付任何形式的费用。区块链市场参与者鱼龙混杂,请务必提高警惕,防范诈骗。
+
+ 区块链刻字成本较高,一般在 10 到 30 美元之间。虽然「以太坊」本身对「区块链刻字」本身不收费,但是由于向区块链写入数据需要支付「燃气费(Gas Fee)」,因此需要一定的成本支出。
+
+ 在 Tianyi CodeLab,我们不会向用户收取任何费用。「链上镌刻」的成本由 Tianyi CodeLab 自行承担。若您的「链上镌刻」请求不符合要求,我们会拒绝或建议您修改,且永远不会因此向您收取任何费用。
+
+
+ - question: 「链上镌刻」可以镌刻哪些内容?
+ answer: |
+ 我们鼓励您镌刻任何与「洛天依」有关的内容。包括但不限于:
+
+
+ - 与「洛天依」有关百科、资料、新闻等
+ - 对「洛天依」的祝福、想说的话或「小作文」
+ - 「洛天依」所演唱歌曲的的歌词
+ - 同人小说作品的选段(请注意获得授权)
+
+
+ 但是,我们也对内容存在一定的限制,以下内容将不会被接受:
+
+ - 任何违反您所在国家法律,或中国大陆法律,或美国法律的内容
+ - 包含他人个人信息的内容;尽管您可以镌刻您自己的个人信息,但我们建议您审慎考虑
+ - 包含侮辱、诽谤、挑衅、煽动、仇恨、极端主义等不当内容,包括对特定虚拟角色的攻击或争议内容
+ - NSFW 内容,包括暴力、赌博、恐怖、儿童色情、药物滥用等
+ - 其他我们认为不适宜或对「洛天依」的形象造成负面影响的内容
+
+
+ 由于区块链刻字成本高昂,我们不建议您镌刻大段内容。文本长度应以 100~250 字节为宜(采用 UTF-8 编码)。您可以使用一下规则进行简单但不准确的估算:
+
+ - 英文字符:1 字节
+ - 中文、日文、韩文字符:3 字节
+ - Emoji 表情:4 字节
+
+
+ 由于技术限制,无法镌刻图片、视频、音频等非文本内容。
+
+
+ - question: 如何使用 Tainyi CodeLab「链上镌刻」服务?
+ answer: |
+ 请将您想要镌刻的内容发送至 me@lty.name,并在邮件中包含以下内容:
+
+
+ - 您需要进行「链上镌刻」内容
+ - 您的昵称或署名(可选)
+ - 您的联系方式(用于 Tainyi CodeLab 与您联系,不会公开)
+
+
+ 您的镌刻请求将会被我们人工审核。根据上述的内容策略和当前的 Gas Fee 价格,我们可能会建议您修改或删减内容,或拒绝您的请求。
+
+ 一旦您的「链上镌刻」请求审核通过后,将择日安排「链上镌刻」操作。目前操作亦由人工完成,完成后您将收到包含本次「链上镌刻」详细信息的通知。
+
+
+ - question: 「链上镌刻」的内容是公开的吗?我可以修改或删除「链上镌刻」内容吗?
+ answer: |
+ 由于区块链的透明性,任何写入区块链的数据都是完全公开、可被任何人访问和查看的,自然也包括「链上镌刻」的内容。您可以在 ENS 记录 或 Etherscan 上查看 Tainyi CodeLab 过往的「链上镌刻」历史。
+
+ 请注意,由于区块链的特性,「链上镌刻」内容一旦写入,就无法修改或删除。我们建议您在镌刻前仔细检查内容,确保没有错误或不当内容。
diff --git a/html/home.html b/html/home.html
new file mode 100644
index 0000000..b35ed6a
--- /dev/null
+++ b/html/home.html
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+ {{ title }}
+
+
+
+
+
+
+
+ {{ headline | safe }}
+
+
+
+
+
+
diff --git a/html/inscription/faq.html b/html/inscription/faq.html
new file mode 100644
index 0000000..cd9ed3c
--- /dev/null
+++ b/html/inscription/faq.html
@@ -0,0 +1,120 @@
+
+
+
+
+
+ 「永不停止的歌声」— 链上镌刻 | Luo Tianyi CodeLab
+
+
+
+
+
+ {% for item in faq %}
+
+
+
{{ item.question }}
+

+
+
+ {{ item.answer | replace('\n\n', '
') | safe }}
+
+
+ {% endfor %}
+
返回首页
+
+
+
+
+
diff --git a/html/inscription/profile.html b/html/inscription/profile.html
new file mode 100644
index 0000000..2dca5c8
--- /dev/null
+++ b/html/inscription/profile.html
@@ -0,0 +1,221 @@
+
+
+
+
+
+
+
+
+ Profile on Blockchain | Luo Tianyi CodeLab
+
+
+
+
+
+
+
华风夏韵·洛水天依 | 世界首位中文 VOCALOID 虚拟歌手,生日 2012 年 7 月 12 日,代表色 66CCFF。
+
性格内向安静,感性细腻。拥有「共鸣」的特殊能力,能够感受并且读出人类所藏的「心中的歌声」。
+
+
+
+
+
+
+
diff --git a/images/bg.jpg b/images/bg.jpg
new file mode 100644
index 0000000..b872be4
--- /dev/null
+++ b/images/bg.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1b48f30d953e1a1e9bf2b69635c2cfa99799410077265bce4db538e2ab36f265
+size 899443
diff --git a/images/icon/bx-chevron-right.svg b/images/icon/bx-chevron-right.svg
new file mode 100644
index 0000000..f5ee198
--- /dev/null
+++ b/images/icon/bx-chevron-right.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/images/icon/bx-envelope.svg b/images/icon/bx-envelope.svg
new file mode 100644
index 0000000..75d3638
--- /dev/null
+++ b/images/icon/bx-envelope.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/images/icon/bx-globe.svg b/images/icon/bx-globe.svg
new file mode 100644
index 0000000..ccfdc9c
--- /dev/null
+++ b/images/icon/bx-globe.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/images/icon/bx-link-alt.svg b/images/icon/bx-link-alt.svg
new file mode 100644
index 0000000..d32bce2
--- /dev/null
+++ b/images/icon/bx-link-alt.svg
@@ -0,0 +1,5 @@
+
\ No newline at end of file
diff --git a/images/icon/bx-wallet-alt.svg b/images/icon/bx-wallet-alt.svg
new file mode 100644
index 0000000..ee7e5c5
--- /dev/null
+++ b/images/icon/bx-wallet-alt.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/images/profile-avatar.webp b/images/profile-avatar.webp
new file mode 100644
index 0000000..4598219
--- /dev/null
+++ b/images/profile-avatar.webp
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3bd2c6ba886da9fdeea258e0eaa504ffbe58c7426221532b7a5317be3ab5735f
+size 31604
diff --git a/images/sq1.png b/images/sq1.png
new file mode 100644
index 0000000..cfc465e
--- /dev/null
+++ b/images/sq1.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:23167b43ca1ea833e20ff2d0c31d090b64e3168664879149d2b53fcec05a84a7
+size 5646306
diff --git a/images/sq2.png b/images/sq2.png
new file mode 100644
index 0000000..5f38afa
--- /dev/null
+++ b/images/sq2.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:23c818d73cf092b7eabbc486db4b9521c4c3bc407508799a68fe67a5f38a0ce5
+size 739854
diff --git a/images/sq3.png b/images/sq3.png
new file mode 100644
index 0000000..d9b96d8
--- /dev/null
+++ b/images/sq3.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6c7e5557b666f17cbab24bf969d03479cf001546dd1e58221840bb9f0f19f56f
+size 4974505
diff --git a/images/sq4.png b/images/sq4.png
new file mode 100644
index 0000000..6f61fa3
--- /dev/null
+++ b/images/sq4.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e8de58dd7aecefcfd9881a001535cfd92300945734dd8dbe3895dddea71865fe
+size 2536318
diff --git a/images/sq5.png b/images/sq5.png
new file mode 100644
index 0000000..05b9fbf
--- /dev/null
+++ b/images/sq5.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ebbd586045c88668b4a14f67a30c0f0a5b0111c32f91bd9b15af23c423cb1cbe
+size 1141963
diff --git a/images/sq6.png b/images/sq6.png
new file mode 100644
index 0000000..5f4df85
--- /dev/null
+++ b/images/sq6.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5332627707d9fbf4488aa78adfa1b1ed3a3ba9e63e36f8c6cb4ae643477b0235
+size 400832
diff --git a/public/assets/VOCALOID_CHINA_ART_COLLECTIONS.pdf b/public/assets/VOCALOID_CHINA_ART_COLLECTIONS.pdf
new file mode 100644
index 0000000..3b2b601
--- /dev/null
+++ b/public/assets/VOCALOID_CHINA_ART_COLLECTIONS.pdf
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a6235506ddc316b49f1d890c302f86acb5a093a697f2b750b75422957f0e44af
+size 36675074
diff --git a/public/assets/style.css b/public/assets/style.css
new file mode 100644
index 0000000..302ee4e
--- /dev/null
+++ b/public/assets/style.css
@@ -0,0 +1,134 @@
+html {
+ min-width: 900px;
+}
+
+body {
+ font-family: -apple-system, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Source Han Sans SC", Helvetica, Arial, sans-serif;;
+ font-size: 14px;
+ line-height: 1.5;
+ margin: 0;
+ background-repeat: no-repeat;
+ background-position: 80% top;
+ background-size: cover;
+ background-color: #071017;
+ min-width: 900px;
+}
+
+code {
+ font-family: ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace;
+}
+
+.container {
+ width: 840px;
+ margin: 0 auto;
+}
+
+.box {
+ width: 840px;
+ margin: auto;
+ margin-top: 100px;
+ display: flex;
+ flex-direction: column;
+}
+
+.box header {
+ min-height: 100px;
+ width: 100%;
+ align-self: center;
+ align-items: center;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: flex-start;
+ background-color: rgba(102, 204, 255);
+}
+
+.box h1 {
+ font-size: 2em;
+ font-weight: 400;
+ margin: 0 2rem;
+ color: white;
+}
+
+.square-container {
+ display: grid;
+ grid-template-columns: repeat(12, 50px);
+ grid-auto-rows: 50px;
+}
+
+.square {
+ color: white;
+ font-size: 1.5em;
+ line-height: 1.3;
+ font-weight: 400;
+ display: flex;
+ justify-content: left;
+ align-items: flex-end;
+ padding: 10px;
+ width: 80px;
+ height: 80px;
+}
+
+.square-code {
+ font-family: ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace;
+}
+
+.square-multiline {
+ font-size: 1rem;
+ line-height: 1;
+}
+
+.square-img {
+ background-size: cover !important;
+}
+
+.square-blue-1 {
+ background-color: #1d4a89;
+}
+
+.square-blue-2 {
+ background-color: #3478c6;
+}
+
+.square-blue-3 {
+ background-color: #66ccff;
+}
+.square-container a {
+ line-height: 1.2;
+ text-decoration: none;
+ cursor: pointer;
+}
+
+.square-container a.square-blue-1:hover {
+ background: #2794c7;
+ font-size: 1.2em;
+ transition: .2s;
+}
+
+.square-container a.square-blue-2:hover {
+ background: #619ef8;
+ font-size: 1.2em;
+ transition: .2s;
+}
+
+.square-container a.square-blue-3:hover {
+ background: #46a4d3;
+ font-size: 1.2em;
+ transition: .2s;
+}
+
+footer {
+ font-size: .75rem;
+ color: #f0f0f0;
+ padding-top: 50px;
+}
+
+footer a {
+ color: #f0f0f0;
+ text-decoration: none;
+}
+
+footer a:hover {
+ color: #f0f0f0;
+ text-decoration: underline;
+}
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 0000000..705faac
Binary files /dev/null and b/public/favicon.ico differ