build(release): 准备 OpenNexus 0.3.2-alpha.1 品牌安装包 [skip ci]

This commit is contained in:
2026-09-16 00:40:59 +08:00
parent 9aed039702
commit 81003d3106
22 changed files with 68 additions and 28 deletions
+5
View File
@@ -68,6 +68,7 @@ jobs:
bundle = @{
active = $true
targets = @('nsis')
icon = @('icons/icon.png', 'icons/icon.ico')
resources = @{
'../../.build/sidecar/dist/opennexus-core/' = 'core/'
}
@@ -75,6 +76,10 @@ jobs:
certificateThumbprint = $env:OPENNEXUS_WINDOWS_CERTIFICATE_THUMBPRINT
digestAlgorithm = 'sha256'
timestampUrl = 'http://timestamp.digicert.com'
nsis = @{
installerIcon = 'icons/icon.ico'
uninstallerIcon = 'icons/icon.ico'
}
}
}
} | ConvertTo-Json -Depth 5
+2 -2
View File
@@ -2,7 +2,7 @@
OpenNexus 是一款本地优先的 AI 笔记与知识中枢。它将 Markdown Vault、全文与向量检索、知识库问答、可审计 Agent、扩展系统和多设备同步整合在一个桌面应用中。笔记与索引由用户掌控;需要模型或同步服务时,再按需连接本地或远程服务。
当前发布版本为 **0.3.1-alpha.3**,主要支持 Windows x64。Alpha 版本仍处于快速迭代阶段,升级前请备份 Vault。
当前发布版本为 **0.3.2-alpha.1**,主要支持 Windows x64。Alpha 版本仍处于快速迭代阶段,升级前请备份 Vault。
## 主要能力
@@ -34,7 +34,7 @@ flowchart LR
## 使用发布包
本版提供 Windows x64 EXE 安装包和独立的 Server Sync 包,下载入口见 [v0.3.1-alpha.3 发布页](https://gitea.kronecker.cc/Kronecker/NotesAgentic/releases/tag/v0.3.1-alpha.3)。发布页同时附带 `SHA256.json`,用于核对文件完整性。
本版提供 Windows x64 EXE 安装包和独立的 Server Sync 包,下载入口见 [v0.3.2-alpha.1 发布页](https://gitea.kronecker.cc/Kronecker/NotesAgentic/releases/tag/v0.3.2-alpha.1)。发布页同时附带 `SHA256.json`,用于核对文件完整性。
安装包不包含任何 Vault 或用户数据,也不预装已下载的社区主题、本地模型权重、CUDA 与 PyTorch 运行时。相关功能仍完整保留;需要时可在客户端内按需安装主题、选择模型或配置 CUDA 环境。程序自带的基础界面样式属于客户端资源,不视为社区主题。同一 Windows 用户下升级安装会继续使用 `%APPDATA%\cc.kronecker.notesagent` 中的既有配置和索引,以及用户此前选择的外部 Vault。
+1
View File
@@ -4,6 +4,7 @@
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="theme-color" content="#171717" />
<link rel="icon" type="image/svg+xml" href="/opennexus-logo.svg" />
<title>OpenNexus</title>
</head>
<body>
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "notes-agent-frontend",
"private": true,
"version": "0.3.1-alpha.3",
"version": "0.3.2-alpha.1",
"type": "module",
"scripts": {
"dev": "vite",
+8
View File
@@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" role="img" aria-labelledby="title desc">
<title id="title">OpenNexus</title>
<desc id="desc">蓝紫色线框文档标志</desc>
<rect x="12" y="12" width="1000" height="1000" rx="252" fill="#fbfcff" stroke="#e1e5f0" stroke-width="24"/>
<path d="M254 184h322l194 194v462H254z" fill="none" stroke="#6269f6" stroke-width="48" stroke-linejoin="round"/>
<path d="M576 184v194h194" fill="none" stroke="#6269f6" stroke-width="48" stroke-linejoin="round"/>
<path d="M382 508h260M382 622h260M382 736h260" fill="none" stroke="#6269f6" stroke-width="42" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 651 B

+1 -1
View File
@@ -3242,7 +3242,7 @@ dependencies = [
[[package]]
name = "notesagent-desktop"
version = "0.3.1-alpha.3"
version = "0.3.2-alpha.1"
dependencies = [
"argon2",
"base64 0.22.1",
+1 -1
View File
@@ -1,6 +1,6 @@
[package]
name = "notesagent-desktop"
version = "0.3.1-alpha.3"
version = "0.3.2-alpha.1"
edition = "2021"
rust-version = "1.89"
Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

@@ -8,6 +8,7 @@
"publisher": "Kronecker",
"homepage": "https://gitea.kronecker.cc/Kronecker/NotesAgentic",
"icon": [
"icons/icon.png",
"icons/icon.ico"
],
"resources": {
+6 -2
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://schema.tauri.app/config/2",
"productName": "OpenNexus",
"version": "0.3.1-alpha.3",
"version": "0.3.2-alpha.1",
"identifier": "cc.kronecker.notesagent",
"build": {
"beforeDevCommand": "pnpm dev",
@@ -30,6 +30,10 @@
}
},
"bundle": {
"active": false
"active": false,
"icon": [
"icons/icon.png",
"icons/icon.ico"
]
}
}
+8
View File
@@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" role="img" aria-labelledby="title desc">
<title id="title">OpenNexus</title>
<desc id="desc">蓝紫色线框文档标志</desc>
<rect x="12" y="12" width="1000" height="1000" rx="252" fill="#fbfcff" stroke="#e1e5f0" stroke-width="24"/>
<path d="M254 184h322l194 194v462H254z" fill="none" stroke="#6269f6" stroke-width="48" stroke-linejoin="round"/>
<path d="M576 184v194h194" fill="none" stroke="#6269f6" stroke-width="48" stroke-linejoin="round"/>
<path d="M382 508h260M382 622h260M382 736h260" fill="none" stroke="#6269f6" stroke-width="42" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 651 B

+10 -1
View File
@@ -6,6 +6,7 @@ import { useEditorStore } from '@/stores/editor'
import { useThemeStore } from '@/stores/theme'
import { Moon, Sunny } from '@element-plus/icons-vue'
import AppIcon from './AppIcon.vue'
import appLogoUrl from '@/assets/opennexus-logo.svg'
import { t } from '@/i18n'
import { isDesktop } from '@/services/platform/desktop'
import { minimizeWindow, requestWindowClose, toggleMaximizeWindow } from '@/services/platform/windowControls'
@@ -63,7 +64,7 @@ function toggleFromTitlebar(event: MouseEvent) {
</span>
</div>
<div class="titlebar-center" data-tauri-drag-region>
<span class="app-name" data-tauri-drag-region>OpenNexus</span>
<span class="app-name" data-tauri-drag-region><img :src="appLogoUrl" alt="" />OpenNexus</span>
</div>
<div class="titlebar-right">
<button class="icon-btn" @click="themeStore.toggleTheme()" :title="themeStore.isDark ? t('切换浅色主题', 'Switch to light theme') : t('切换深色主题', 'Switch to dark theme')">
@@ -142,6 +143,9 @@ function toggleFromTitlebar(event: MouseEvent) {
}
.app-name {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 3px 10px;
border: 1px solid var(--color-border-subtle);
border-radius: var(--radius-full);
@@ -151,6 +155,11 @@ function toggleFromTitlebar(event: MouseEvent) {
letter-spacing: .04em;
}
.app-name img {
width: 18px;
height: 18px;
}
.titlebar-right {
display: flex;
align-items: center;
+10 -7
View File
@@ -4,8 +4,9 @@ import { useRouter } from 'vue-router'
import { useWorkspaceStore } from '@/stores/workspace'
import { useThemeStore } from '@/stores/theme'
import { useSettingsStore } from '@/stores/settings'
import { ArrowRight, Document, Folder, FolderOpened, Moon, Sunny } from '@element-plus/icons-vue'
import { ArrowRight, Folder, FolderOpened, Moon, Sunny } from '@element-plus/icons-vue'
import AppIcon from '@/components/common/AppIcon.vue'
import appLogoUrl from '@/assets/opennexus-logo.svg'
import { t } from '@/i18n'
import { ApiErrorClass } from '@/services/apiClient'
import { isDesktop } from '@/services/platform/desktop'
@@ -62,7 +63,7 @@ async function openFolderPicker() {
<div class="bg-decoration" />
<div class="entry-container">
<div class="brand-section">
<div class="logo"><AppIcon :icon="Document" :size="56" /></div>
<div class="logo"><img :src="appLogoUrl" alt="" /></div>
<h1 class="app-title">OpenNexus</h1>
<p class="app-subtitle">{{ t('本地优先的 AI 笔记软件', 'A local-first AI note-taking app') }}</p>
</div>
@@ -109,7 +110,7 @@ async function openFolderPicker() {
</div>
<div class="footer-info">
<span>v0.1.0</span>
<span>v0.3.2-alpha.1</span>
<button class="theme-toggle" @click="themeStore.toggleTheme()">
<AppIcon :icon="themeStore.isDark ? Sunny : Moon" :size="15" />
{{ themeStore.isDark ? t('浅色', 'Light') : t('深色', 'Dark') }}
@@ -164,13 +165,15 @@ async function openFolderPicker() {
width: 84px;
height: 84px;
margin-bottom: 14px;
border: 1px solid color-mix(in srgb, var(--color-accent-primary) 18%, transparent);
border-radius: 24px;
background: var(--color-surface-primary);
color: var(--color-accent-primary);
box-shadow: var(--shadow-lg);
}
.logo img {
display: block;
width: 84px;
height: 84px;
}
.app-title {
font-size: 32px;
font-weight: 700;
+1 -1
View File
@@ -6,7 +6,7 @@ import paper from '@/assets/themes/paper-moments.theme?raw'
afterEach(() => vi.unstubAllGlobals())
it('uses the desktop release version for compatibility checks', () => {
expect(THEME_APP_VERSION).toBe('0.3.1-alpha.2')
expect(THEME_APP_VERSION).toBe('0.3.2-alpha.1')
})
it.each(['999.0.0', 'bad', '0.2'])('rejects unsupported minimum app version %s at inspection and install', async version => {
const source = paper.replace(/min_app_version:.*\r?\n/, `min_app_version: ${version}\n`)
+1 -1
View File
@@ -7,7 +7,7 @@ COPY console ./
RUN pnpm build
FROM python:3.12-slim
ARG OPENNEXUS_SYNC_VERSION=0.3.1-alpha.3
ARG OPENNEXUS_SYNC_VERSION=0.3.2-alpha.1
LABEL org.opencontainers.image.title="OpenNexus Server Sync" \
org.opencontainers.image.version="${OPENNEXUS_SYNC_VERSION}" \
org.opencontainers.image.source="https://gitea.kronecker.cc/Kronecker/NotesAgentic"
+4 -4
View File
@@ -1,6 +1,6 @@
# OpenNexus Server Sync
当前发布版本为 **0.3.1-alpha.3**。协议及限制见 [Sync v1](../docs/contracts/Sync-v1契约.md)。服务独立于 AI Core,生产入口仅支持 PostgreSQL 和 S3 兼容对象存储。独立发布包包含服务源码、锁文件、Vue 3 + TypeScript 管理控制台静态文件、Dockerfile 与 Compose 模板,不包含任何 Vault、账户数据库、对象存储数据或部署密钥。
当前发布版本为 **0.3.2-alpha.1**。协议及限制见 [Sync v1](../docs/contracts/Sync-v1契约.md)。服务独立于 AI Core,生产入口仅支持 PostgreSQL 和 S3 兼容对象存储。独立发布包包含服务源码、锁文件、Vue 3 + TypeScript 管理控制台静态文件、Dockerfile 与 Compose 模板,不包含任何 Vault、账户数据库、对象存储数据或部署密钥。
服务根路径 `/``/console/` 提供同源的 Vue 3 + TypeScript Sync Console,可查看服务健康与依赖就绪状态,并使用普通 Sync 账户管理自己的 Vault 和设备。页面只调用公开的 Sync v1 API;密码在请求发出前从输入框清除,访问和刷新令牌只保留在页面内存,刷新或关闭页面即丢弃。控制台源码位于 `console/`,生产静态文件由 Docker 多阶段构建生成。
@@ -22,13 +22,13 @@ uv run pytest
## 自托管准备
从发布页下载 `OpenNexus-Server-Sync-0.3.1-alpha.3.zip` 并核对 `SHA256.json` 后,将压缩包解压到独立目录。升级现有实例时先备份数据库、对象存储和 `.env`,再使用新版镜像替换 Sync 服务;不要用发行包覆盖持久化卷。
从发布页下载 `OpenNexus-Server-Sync-0.3.2-alpha.1.zip` 并核对 `SHA256.json` 后,将压缩包解压到独立目录。升级现有实例时先备份数据库、对象存储和 `.env`,再使用新版镜像替换 Sync 服务;不要用发行包覆盖持久化卷。
仓库提供以下 Docker 文件:
- `Dockerfile`:构建 Vue 控制台和只读运行镜像。
- `compose.yaml`:启动 PostgreSQL、MinIO、一次性初始化任务和 Sync 服务,默认只监听 `127.0.0.1:8080`
- `compose.test.yaml`:仅供隔离验收使用,将 Sync 暴露到 `0.0.0.0:18080` 并使用 MinIO 管理凭据。
- `compose.test.yaml`:仅供隔离验收使用,将 Sync 通过 IPv4 与 IPv6 暴露到 `18080`并使用 MinIO 管理凭据。
- `.dockerignore`:排除密钥、数据库、Vault、测试缓存和本机依赖。
```powershell
@@ -57,7 +57,7 @@ docker compose run --rm sync /service/.venv/bin/python -m sync_server bootstrap-
`initialize` 命令已通过真实 PostgreSQL/MinIO 的空实例与重复运行验证,并由 Compose 的一次性服务调用。MinIO 同步账号仍须由管理员创建并限制到 `opennexus` Bucket`.env` 中的 root 与同步凭据必须不同。
0.3.1-alpha.3 使用真实 PostgreSQL/MinIO 环境验证初始化、重复启动、固定凭据、健康检查和已有数据升级。测试专用 HTTP 地址、故障检查、完整验收记录与运维入口见[验收报告](../docs/development/OpenNexus验收报告-2026-09-08.md)。S-07 已在原生 PostgreSQL 17.11/MinIO 实例完成 1 GiB/10,000 文件的删除源实例与空实例恢复。测试阶段可以直接开放 HTTP 端口;生产上线仍需配置 TLS、访问控制、监控与异机备份。
0.3.2-alpha.1 使用真实 PostgreSQL/MinIO 环境验证初始化、重复启动、固定凭据、健康检查和已有数据升级。测试专用 HTTP 地址、故障检查、完整验收记录与运维入口见[验收报告](../docs/development/OpenNexus验收报告-2026-09-08.md)。S-07 已在原生 PostgreSQL 17.11/MinIO 实例完成 1 GiB/10,000 文件的删除源实例与空实例恢复。测试阶段可以直接开放 HTTP 端口;生产上线仍需配置 TLS、访问控制、监控与异机备份。
## 备份与空实例恢复
+1
View File
@@ -6,4 +6,5 @@ services:
AWS_SECRET_ACCESS_KEY: ${MINIO_ROOT_PASSWORD:?required}
ports: !override
- "0.0.0.0:${SYNC_PORT:-18080}:8080"
- "[::]:${SYNC_PORT:-18080}:8080"
restart: unless-stopped
+4 -4
View File
@@ -23,8 +23,8 @@ services:
build:
context: .
args:
OPENNEXUS_SYNC_VERSION: ${OPENNEXUS_SYNC_TAG:-0.3.1-alpha.3}
image: opennexus-sync:${OPENNEXUS_SYNC_TAG:-0.3.1-alpha.3}
OPENNEXUS_SYNC_VERSION: ${OPENNEXUS_SYNC_TAG:-0.3.2-alpha.1}
image: opennexus-sync:${OPENNEXUS_SYNC_TAG:-0.3.2-alpha.1}
command: ["/service/.venv/bin/python", "-m", "sync_server", "initialize"]
environment:
SYNC_DATABASE_URL: ${SYNC_DATABASE_URL:?required}
@@ -43,8 +43,8 @@ services:
build:
context: .
args:
OPENNEXUS_SYNC_VERSION: ${OPENNEXUS_SYNC_TAG:-0.3.1-alpha.3}
image: opennexus-sync:${OPENNEXUS_SYNC_TAG:-0.3.1-alpha.3}
OPENNEXUS_SYNC_VERSION: ${OPENNEXUS_SYNC_TAG:-0.3.2-alpha.1}
image: opennexus-sync:${OPENNEXUS_SYNC_TAG:-0.3.2-alpha.1}
environment:
SYNC_DATABASE_URL: ${SYNC_DATABASE_URL:?required}
SYNC_S3_ENDPOINT: http://objects:9000
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "opennexus-sync-console",
"private": true,
"version": "0.3.1-alpha.3",
"version": "0.3.2-alpha.1",
"packageManager": "pnpm@10.28.0",
"type": "module",
"scripts": {
+1 -1
View File
@@ -1,6 +1,6 @@
[project]
name = "notesagent-sync"
version = "0.3.1a3"
version = "0.3.2a1"
requires-python = ">=3.12"
dependencies = [
"fastapi>=0.116,<1", "uvicorn>=0.35,<1", "sqlalchemy>=2.0,<2.1",
+1 -1
View File
@@ -225,7 +225,7 @@ wheels = [
[[package]]
name = "notesagent-sync"
version = "0.3.1a3"
version = "0.3.2a1"
source = { virtual = "." }
dependencies = [
{ name = "boto3" },