From b1793e1b1985764747f915a05f2ae22fc1591d20 Mon Sep 17 00:00:00 2001 From: "XueMian (ICT.RUN)" <38741078+xuemian168@users.noreply.github.com> Date: Wed, 6 Aug 2025 07:49:24 +1000 Subject: [PATCH] Add Kuno (#1049) --- apps/kuno/1.2.18/data.yml | 104 ++++++++++++++ apps/kuno/1.2.18/docker-compose.yml | 36 +++++ apps/kuno/README.md | 214 ++++++++++++++++++++++++++++ apps/kuno/data.yml | 33 +++++ apps/kuno/logo.png | Bin 0 -> 3777 bytes 5 files changed, 387 insertions(+) create mode 100644 apps/kuno/1.2.18/data.yml create mode 100644 apps/kuno/1.2.18/docker-compose.yml create mode 100644 apps/kuno/README.md create mode 100644 apps/kuno/data.yml create mode 100644 apps/kuno/logo.png diff --git a/apps/kuno/1.2.18/data.yml b/apps/kuno/1.2.18/data.yml new file mode 100644 index 000000000..71cc1647f --- /dev/null +++ b/apps/kuno/1.2.18/data.yml @@ -0,0 +1,104 @@ +additionalProperties: + formFields: + - default: kuno + envKey: CONTAINER_NAME + labelEn: Container Name + labelZh: 容器名称 + label: + en: Container Name + ja: コンテナ名 + ms: Nama Kontena + pt-br: Nome do Contêiner + ru: Имя контейнера + ko: 컨테이너 이름 + zh: 容器名称 + zh-Hant: 容器名稱 + required: true + type: text + - default: 8080 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: Port + labelZh: 端口 + label: + en: Port + ja: ポート + ms: Port + pt-br: Porta + ru: Порт + ko: 포트 + zh: 端口 + zh-Hant: 埠 + required: true + rule: paramPort + type: number + - default: "$PANEL_APP_HOST_IP:$PANEL_APP_PORT_HTTP" + edit: true + envKey: NEXT_PUBLIC_API_URL + labelEn: API URL + labelZh: API地址 + label: + en: API URL + zh: API地址 + zh-Hant: API地址 + description: + zh: 应用的访问地址,通常无需修改 + en: Application access URL, usually no need to modify + zh-Hant: 應用的訪問地址,通常無需修改 + required: true + type: text + - default: "$RANDOM_PASSWORD" + envKey: JWT_SECRET + labelEn: JWT Secret + labelZh: JWT密钥 + label: + en: JWT Secret + zh: JWT密钥 + zh-Hant: JWT密鑰 + description: + zh: JWT认证密钥,系统会自动生成 + en: JWT authentication key, automatically generated + zh-Hant: JWT認證密鑰,系統會自動生成 + required: true + type: password + - default: false + envKey: RECOVERY_MODE + labelEn: Recovery Mode + labelZh: 恢复模式 + label: + en: Recovery Mode + zh: 恢复模式 + zh-Hant: 恢復模式 + description: + zh: 启用后可使用默认密码登录重置密码 + en: Enable to use default password for password reset + zh-Hant: 啟用後可使用默認密碼登錄重置密碼 + required: false + type: select + options: + - value: false + label: + en: Disabled + zh: 禁用 + zh-Hant: 禁用 + - value: true + label: + en: Enabled + zh: 启用 + zh-Hant: 啟用 + - default: ./kuno/data + edit: true + envKey: DATA_PATH + labelEn: Data Path + labelZh: 数据路径 + label: + en: Data Path + ja: データパス + ms: Laluan Data + pt-br: Caminho dos Dados + ru: Путь к данным + ko: 데이터 경로 + zh: 数据路径 + zh-Hant: 數據路徑 + required: true + type: text \ No newline at end of file diff --git a/apps/kuno/1.2.18/docker-compose.yml b/apps/kuno/1.2.18/docker-compose.yml new file mode 100644 index 000000000..a23c828e8 --- /dev/null +++ b/apps/kuno/1.2.18/docker-compose.yml @@ -0,0 +1,36 @@ +services: + kuno: + image: ictrun/kuno:v1.2.18 + container_name: ${CONTAINER_NAME} + restart: unless-stopped + pull_policy: always + ports: + - "${PANEL_APP_PORT_HTTP}:80" + volumes: + - ${DATA_PATH}:/app/data + - ${DATA_PATH}/uploads:/app/frontend/public/uploads + environment: + - NEXT_PUBLIC_API_URL=${NEXT_PUBLIC_API_URL} + - DB_PATH=/app/data/kuno.db + - GIN_MODE=release + - NODE_ENV=production + - JWT_SECRET=${JWT_SECRET} + - RECOVERY_MODE=${RECOVERY_MODE:-false} + - TZ=Asia/Shanghai + healthcheck: + test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:80/health"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + networks: + - 1panel-network + +networks: + 1panel-network: + external: true \ No newline at end of file diff --git a/apps/kuno/README.md b/apps/kuno/README.md new file mode 100644 index 000000000..cd6655dd7 --- /dev/null +++ b/apps/kuno/README.md @@ -0,0 +1,214 @@ +# Kuno + +Kuno 是一个轻量级多语言内容管理系统(CMS),采用 Go 后端和 Next.js 前端技术栈,专为创建丰富的内容生态系统而设计。 + +## 主要特性 + +- **多语言支持**: 支持 70+ 种语言 +- **现代技术栈**: Go 后端 + Next.js 前端 +- **响应式设计**: 支持各种屏幕尺寸 +- **Markdown 编辑器**: 方便的内容编辑体验 +- **深色/浅色模式**: 用户体验友好 +- **管理面板**: 完整的后台管理功能 +- **分类管理**: 灵活的内容分类系统 +- **Docker 部署**: 一键部署,易于维护 + +## 部署说明 + +### 默认登录信息 + +- 用户名: `admin` +- 密码: `xuemian168` + +**重要提示**: 首次登录后请立即修改默认密码! + +## 维护模式和密码重置 + +### 恢复模式 + +如果您忘记了管理员密码,可以通过以下步骤重置: + +1. 在 1Panel 应用管理界面中,编辑 Kuno 应用配置 +2. 将 "恢复模式" 设置为 "启用" +3. 重启应用容器 +4. 使用默认凭据登录: + - 用户名: `admin` + - 密码: `xuemian168` +5. 登录后立即修改密码 +6. 将 "恢复模式" 重新设置为 "禁用" +7. 再次重启应用容器 + +**安全提示**: 恢复模式会临时启用默认密码访问,请在重置密码后立即禁用此模式。 + +### 数据持久化 + +应用会将所有数据存储在 `/app/data` 目录中,包括: +- SQLite 数据库文件 +- 用户上传的文件 +- 配置文件 + +### 环境变量说明 + +- `NEXT_PUBLIC_API_URL`: API 端点地址 +- `DB_PATH`: SQLite 数据库路径 (默认: `/app/data/kuno.db`) +- `GIN_MODE`: Go 后端运行模式 (生产环境建议使用 `release`) +- `NODE_ENV`: Node.js 环境 (生产环境建议使用 `production`) +- `JWT_SECRET`: JWT 认证密钥 (请使用随机字符串) +- `RECOVERY_MODE`: 恢复模式 (默认: `false`,启用时允许使用默认密码登录) + +## 使用指南 + +1. 部署完成后,访问应用地址 +2. 使用默认账号登录 +3. 立即修改默认密码 +4. 开始创建和管理内容 + +## 系统要求 + +- CPU: 1 核心 +- 内存: 1GB RAM +- 存储: 10GB 可用空间 +- 架构: x86_64/amd64 + +## 故障排除 + +### 安装一直处于进行中状态 + +如果应用在1Panel中显示"安装中"且长时间未完成,请按以下步骤排查: + +**立即尝试的解决方案**: +1. **刷新页面** - 有时仅仅是界面显示问题 +2. **检查网络** - 确保服务器可以访问 Docker Hub +3. **查看系统资源** - 确保有足够的磁盘空间和内存 + +**如果问题持续存在**: + +#### 1. 检查Docker容器状态 +```bash +# 查看所有容器状态 +docker ps -a + +# 查看Kuno相关容器 +docker ps -a | grep kuno +``` + +#### 2. 检查容器日志 +```bash +# 查看容器启动日志 +docker logs <容器名称或ID> + +# 实时查看日志 +docker logs -f <容器名称或ID> +``` + +#### 3. 检查镜像拉取状态 +```bash +# 查看镜像拉取进度 +docker pull ictrun/kuno:latest + +# 查看本地镜像 +docker images | grep kuno +``` + +#### 4. 检查端口占用 +```bash +# 检查端口是否被占用 +netstat -tlnp | grep <端口号> +# 或使用 +ss -tlnp | grep <端口号> +``` + +#### 5. 检查磁盘空间 +```bash +# 检查磁盘使用情况 +df -h + +# 检查Docker空间使用 +docker system df +``` + +#### 6. 常见解决方案 + +1. **重新安装应用**: + - 删除应用 + - 清理残留容器:`docker container prune` + - 重新从应用商店安装 + +2. **手动拉取镜像**: + ```bash + docker pull ictrun/kuno:latest + ``` + +3. **检查网络连接**: + - 确保服务器可以访问Docker Hub + - 检查防火墙设置 + +4. **查看1Panel系统日志**: + ```bash + journalctl -u 1panel -f + ``` + +5. **重启Docker服务**: + ```bash + systemctl restart docker + ``` + +6. **手动验证镜像**: + ```bash + # 测试镜像是否可用 + docker run --rm ictrun/kuno:latest --version + ``` + +7. **使用1Panel命令行工具**: + ```bash + # 查看1Panel应用状态 + 1pctl app list + 1pctl app logs kuno + ``` + +### 应用无法访问 + +如果应用安装成功但无法访问: + +1. **检查容器是否正常运行** + ```bash + docker ps | grep kuno + docker logs <容器名称> + ``` + +2. **验证端口配置是否正确** + ```bash + netstat -tlnp | grep <端口号> + ``` + +3. **检查防火墙是否开放对应端口** + ```bash + # CentOS/RHEL + firewall-cmd --list-ports + firewall-cmd --add-port=<端口号>/tcp --permanent + + # Ubuntu/Debian + ufw status + ufw allow <端口号> + ``` + +4. **确认容器健康状态** + ```bash + docker inspect <容器名称> | grep Health -A 10 + ``` + +### 常见错误代码对照 + +- **错误代码 500**: 通常是数据库初始化问题,检查数据目录权限 +- **错误代码 502**: 容器未正常启动,查看容器日志 +- **连接超时**: 网络或防火墙问题,检查端口开放状态 +- **镜像拉取失败**: 网络问题或镜像不存在,尝试手动拉取镜像 + +## 备份建议 + +定期备份 `data` 目录以确保数据安全。 + +## 更多信息 + +- GitHub: https://github.com/xuemian168/kuno +- 文档: https://github.com/xuemian168/kuno/blob/main/README.md \ No newline at end of file diff --git a/apps/kuno/data.yml b/apps/kuno/data.yml new file mode 100644 index 000000000..6df8d5e44 --- /dev/null +++ b/apps/kuno/data.yml @@ -0,0 +1,33 @@ +name: Kuno +tags: + - CMS + - 博客 +title: 轻量多语言内容管理系统 - 支持70+语言的现代化CMS +description: 轻量多语言内容管理系统,采用Go后端和Next.js前端,支持70+语言,提供现代响应式设计 +additionalProperties: + key: kuno + name: Kuno + tags: + - CMS + - Blog + - Content Management + shortDescZh: 轻量多语言内容管理系统,采用Go后端和Next.js前端,支持70+语言 + shortDescEn: Lightweight multilingual CMS with Go backend and Next.js frontend, supporting 70+ languages + type: website + crossVersionUpdate: true + limit: 0 + recommend: 0 + website: https://github.com/xuemian168/kuno + github: https://github.com/xuemian168/kuno + document: https://github.com/xuemian168/kuno/blob/main/README.md + description: + en: A lightweight, multilingual CMS with a Go backend and Next.js frontend, designed for creating rich content ecosystems. Supports 70+ languages and offers a modern, responsive design. + zh: 轻量多语言内容管理系统,采用Go后端和Next.js前端,专为创建丰富的内容生态系统而设计。支持70+语言,提供现代响应式设计。 + zh-Hant: 輕量多語言內容管理系統,採用Go後端和Next.js前端,專為創建豐富的內容生態系統而設計。支持70+語言,提供現代響應式設計。 + ja: Go バックエンドと Next.js フロントエンドを使用した軽量多言語 CMS。豊富なコンテンツエコシステムの構築に最適。70以上の言語をサポートし、モダンなレスポンシブデザインを提供。 + ms: Sistem pengurusan kandungan pelbagai bahasa yang ringan dengan backend Go dan frontend Next.js, direka untuk mencipta ekosistem kandungan yang kaya. Menyokong 70+ bahasa dan menawarkan reka bentuk responsif moden. + pt-br: Sistema de gerenciamento de conteúdo multilíngue leve com backend Go e frontend Next.js, projetado para criar ecossistemas de conteúdo ricos. Suporta mais de 70 idiomas e oferece design responsivo moderno. + ru: Легкая многоязычная CMS с бэкендом на Go и фронтендом на Next.js, предназначенная для создания богатых контентных экосистем. Поддерживает более 70 языков и предлагает современный адаптивный дизайн. + ko: Go 백엔드와 Next.js 프론트엔드를 사용한 경량 다국어 CMS로, 풍부한 콘텐츠 생태계 구축을 위해 설계되었습니다. 70개 이상의 언어를 지원하며 현대적인 반응형 디자인을 제공합니다. + architectures: + - amd64 \ No newline at end of file diff --git a/apps/kuno/logo.png b/apps/kuno/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b8b77f20ef8dc39f7ccc46b3459bb0d06699df9a GIT binary patch literal 3777 zcmV;y4nFaTP)uEXQ@Ms_uQ4uwnfHDN*3munoid0fZ?)sY3xu?8Jc_ zC}$!-p#cH@2Zkdjh5&yOpadCUKtO0Fi&#erWzO__e$N0eGYV+drKAj|&YtzjC$%`2!alOm_eP z;H3tupqOqDAJEr=KK~k*J9IJhiybO}zK85$gSF7No!<JX=bZ`t zII@ck)y8Nu!QQYlobdd8Sj7iNSPS~D3wm&b zMbKZvOd}VT^NZsMZw5VQQV}niBisu5LagG0BV5cIU)4jz2T^qf^krBT9S?hi%mVc7 zs{Gk^euWx8$?32E<1Ypy8)O3h`)_~QvCvX0jHN`CvttBp)cdhbG7AZg zbKth8Rr?0#K9TOYi=|}|%QFE0nCw(@jMxJ*!~vCU0LiG@x3s4OXq`ujg=Zq?8BV~y z>I&GK8F2C-Da-5938`w|u(v_6S(}BM!DtvdaWY77a`g!S0g|Cv>5Xqpz#a6Bgh>Uk zcpnx!|3HwP2&DHRyVpJOjLH*`ND%h1hc*ExxatI?y_;UytsRem+4+@Saqcolhy*)T z-UAYB)4e^wc^|fss=A=?sp5Xvv40u8?V?|)Ll5jq*qNN>{qbxQxA z_Fp=EnY_2tNa_&_$c|9f5S*6=sctXUt9h6GaIUB}uLQj}LkLB3@jP zvM0a>`VO9MWC$dwCLP*Op%W4?5+~P zCKQM$B1s`7&>ln#>qxyNN)Dt5iXkvWDnO*#4lP2D!9C$+9!iwyU;-ALcsLbr2mN@1 zJWd9NpuFn4OTdN%mTlF0B^V5}0+9@tX5=vu&J_rx^I8N2k`gGAT2(u5krC_V z^DK%si2yn?P&c7x+hOIQo_+%XDCZ$te`Me2J^`C9Njz=<#W#Or>GOCnMl$3fa*3ng z@-kZ!5%qUQ9=CwzlLKI@2k1@i6Lg{H3MfXy(CMl6(IkC6=sD70Xbl74+Bwk4pRW#m zKM^ui3oJnqS^m5x(~W4I-5`-2Cx-ABbU#4y^9!`~US` z(-STP;vA+TN~YR8FvEYi`=d&PM}pfR??e@mnc+X!eXW)(<)GN0IjV{nT^4cO?o?Y9 z;XNQz9Eo8P>Jl>E8)~A3a_2l%F>AOi4yp*(Rvw_EifH@Btcq}DQXb5Xf-K(`SEM3* z2dap)cgQ0QO%AB5il{vSHfbWOB2Xsj6vwD~j;SKDG9^_XWKKT&m~(Gb5%xW(BG6(r zAdW`0CId!nVKZp5yOmWDW`a$1JBFrXt|}OCf>X8zqFCuXUbuBMOJkb`>u$n{a5Kmg zRRmC36=527kCVZY$UGK{=uO-K8wqo)t8FI}>i3Yuj53AgsfgajeTS+DbTlcA9_n79 zpYcdjjM&JsxW74=W3ukUIIy@G#PVxB944A-+S(vczSjl1ybs618&&S`ANK$~PmBZi zCCn=jXbnawTv`~FAYYoou#*s0fKu|xA;=uY@NVgCGwkN$>Z8ky;g_vr-BB`-1S zA%KMt=yYxt#kuT0KtKZi_t(EnuhafbO3#M5M0^8S&5R#@l$8KcamVR&OwC z5-OP@GPcA`;(``K z5Ox+)N`!r?z2UOb28Hx&wx}R#$Iy)PK#lc;5tJo{K<`K>Wm?!HR*!%Uz==$k+;nq=lmO?T@PW4Ida|6Y1npnLo2to)V z0~OR5THCbYi3Ax4BCL#lvbU&-jm3RYq@cjO2&my1WnS|c%WI8-404l+5A2Wd{K8jQ z@<>7}0%Rk?>6(9TU=m`0MIzXH+Q*3bJcm=_oU=+Hdmd&h$WhXExrfX#>2g_ImMV}FysWnQ#2U|1Sr1zBz zU$HBWLsyx?PJ>L583v`y-5n=EZacfPrv@|VTCO1x5Uz^1x4Xp^Wp!#_$g*5Z{m(vVZlo`>?`cQ`?DWa z%D1OazWC5t8rr#~-Bm?=_s@S=OBM0iZ$DJyoN-|07whW2ml*plne-G0Egq zxo@^0aaFO-ac$`6{iLiss7=ZvWOkZ&r`YhmQ7(&M@y%bI(!~9Qdne#aaCPOub8>2k zuSTnC5JY0CU#b8|K*Bf$Z^9#$3u5WM-|+p_RS`fiKsE=G+_grFP+t`hoXK;sdp}^# zBNY{HZTMD$wQKSq87WK8)pMRU5>oBHIURK4r8j?L`K=uq$wX!8M^1oq#5ii#u|NXs zMjPi9sff}LsI3T4R~o_gy5=ce>bi7kBdyQAo(l=^?jFFxL*PB|uG5TI-VdtMrR_G$ zH3cDKxq{^$SZ_=a-{|Ot>KX@D-t~xQ76+}3{%KnHPK<*iB7wPlR4mL*dW*Bq=nNIwWEw*+LPCkQf99hGatSUF7HVx-45Rr&dph zjU*y8Y)mfzE!l@7%GnZ9vc(XH9rp;C`1bHhG{#f*#a7>G)^LxZQ6A`^Jm`KyqZW`Y zgg{3TNV1*p&#=(N6kfS+M#U=rO+!w*@go>L5THd_$Hd0Bzq!%1EKGGM3jf z)uNgmhz&hl0R3btV$LJA9xii}?X3t7bVOUdnz7GX=%9)i7w1Yo)K;;_UZ8TFcPSDF zrC6&>T(J+w(lW1X{VC}HHFZ)hg&wP3+tG!-9so;@3&WPP$^C?IbybS2)?g_sH=qq@nvD;wrM)wGD zaVFsHfPMms={t}!?~u9Rc`Kp63Q=`ykF*YY%olFGQCj$ALqGKnnVaM$ug?)~;gQZg z9(n~<@d14;=(~kmA4Ju~2`iroMSMVC3wq4G&i2InG#UkmyvM(jaU6+yq1 rnZ^h7wV=nKaO;C3oNVALdWhcx%XfmFCX|Fg00000NkvXXu0mjfRO2i% literal 0 HcmV?d00001