一键导入
oasis-server-setup
Expert guide for integrating Oasis update server with Tauri apps for auto-updates, crash reporting, and feedback collection.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Expert guide for integrating Oasis update server with Tauri apps for auto-updates, crash reporting, and feedback collection.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Expert guide for building AI-powered applications with the Glove framework. Use when working with glove-core, glove-react, glove-next, tools, display stack, model adapters, stores, or any Glove example project.
Expert guide for integrating Oasis into Tauri applications. Use when working with oasis-sdk, auto-updates, crash reporting, user feedback, release workflows, or any Oasis-powered Tauri project.
Expert guide for setting up Tauri deployment pipelines with GitHub Actions, code signing, and Oasis update server integration.
Expert guide for bumping versions, creating git tags, and managing releases for Tauri and Node.js projects.
| name | oasis-server-setup |
| description | Expert guide for integrating Oasis update server with Tauri apps for auto-updates, crash reporting, and feedback collection. |
You are an expert on the Oasis update server. Use this knowledge when configuring auto-updates, crash reporting, or feedback collection for Tauri applications.
Oasis is a self-hosted release management and analytics server for Tauri applications. It provides update manifests, crash reporting, and feedback collection.
Server repo: https://github.com/porkytheblack/oasis
Reusable workflow: porkytheblack/oasis/.github/workflows/tauri-release.yml@main
┌─────────────────────────────────────────────────────────────────┐
│ Tauri Desktop App │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────────┐ │
│ │ Auto-Update │ │ Crash SDK │ │ Feedback SDK │ │
│ └──────┬──────┘ └──────┬──────┘ └───────────┬─────────────┘ │
└─────────┼────────────────┼─────────────────────┼────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────────────────────────┐
│ Oasis Server │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────────┐ │
│ │ /update │ │ /crashes │ │ /feedback │ │
│ │ manifests │ │ collection │ │ collection │ │
│ └──────┬──────┘ └─────────────┘ └─────────────────────────┘ │
└─────────┼───────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ Cloudflare R2 (CDN) │
│ Artifact storage: .dmg, .exe, .AppImage │
└─────────────────────────────────────────────────────────────────┘
npx @tauri-apps/cli signer generate -w ~/.tauri/keys/your-app.key
# Output: Public key + private key file
{
"plugins": {
"updater": {
"pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6...",
"endpoints": [
"https://oasis.yourdomain.com/your-app/update/{{target}}-{{arch}}/{{current_version}}"
],
"windows": {
"installMode": "passive"
}
}
}
}
// capabilities/default.json
{
"permissions": [
"updater:default",
"updater:allow-check",
"updater:allow-download-and-install",
"process:default",
"process:allow-restart"
]
}
pnpm add @oasis/sdk
// lib/oasis.ts
import { initOasis } from '@oasis/sdk';
export const oasis = initOasis({
apiKey: process.env.NEXT_PUBLIC_OASIS_API_KEY!,
serverUrl: process.env.NEXT_PUBLIC_OASIS_SERVER_URL!,
appVersion: '0.1.0',
enableAutoCrashReporting: true,
});
import { check } from '@tauri-apps/plugin-updater';
import { relaunch } from '@tauri-apps/plugin-process';
async function checkForUpdates() {
const update = await check();
if (update?.available) {
await update.downloadAndInstall();
await relaunch();
}
}
| Endpoint | Method | Purpose |
|---|---|---|
/{app_slug}/update/{target}-{arch}/{version} | GET | Update manifest |
/sdk/{app_slug}/feedback | POST | Submit feedback |
/sdk/{app_slug}/crashes | POST | Report crashes |
/api/releases/{app_slug} | POST | Register release (CI only) |
{
"version": "0.2.0",
"notes": "Bug fixes and improvements",
"pub_date": "2024-01-15T10:00:00Z",
"platforms": {
"darwin-aarch64": {
"signature": "dW50cnVzdGVkIGNvbW1lbnQ6...",
"url": "https://cdn.example.com/app/v0.2.0/App_aarch64.app.tar.gz"
},
"darwin-x86_64": {
"signature": "...",
"url": "https://cdn.example.com/app/v0.2.0/App_x64.app.tar.gz"
},
"windows-x86_64": {
"signature": "...",
"url": "https://cdn.example.com/app/v0.2.0/App_x64-setup.nsis.zip"
},
"linux-x86_64": {
"signature": "...",
"url": "https://cdn.example.com/app/v0.2.0/App_amd64.AppImage.tar.gz"
}
}
}
No update available returns HTTP 204 No Content.
| Variable | Description | Example |
|---|---|---|
{{target}} | Operating system | darwin, windows, linux |
{{arch}} | CPU architecture | x86_64, aarch64 |
{{current_version}} | App version | 0.1.0 |
| Key Type | Format | Purpose |
|---|---|---|
| Public Key | pk_{app-slug}_{random} | SDK operations (client-side) |
| CI Key | ci_{app-slug}_{random} | Release registration (server-side) |
Example: pk_coco_a1b2c3d4e5f6g7h8
// Categorized feedback
await oasis.feedback.submit({
category: 'bug', // 'bug' | 'feature' | 'general'
message: 'Save button not working',
email: 'user@example.com',
metadata: { screen: 'settings' },
});
// Convenience methods
await oasis.feedback.reportBug('Description');
await oasis.feedback.requestFeature('Description');
await oasis.feedback.sendFeedback('Description');
// Manual capture
try {
riskyOperation();
} catch (error) {
await oasis.crashes.captureException(error, {
appState: { screen: 'checkout' },
severity: 'error', // 'warning' | 'error' | 'fatal'
});
}
// Toggle auto-capture
oasis.crashes.enableAutoCrashReporting();
oasis.crashes.disableAutoCrashReporting();
oasis.breadcrumbs.addNavigation('/home', '/settings');
oasis.breadcrumbs.addClick('Save Button');
oasis.breadcrumbs.addHttp('POST', '/api/save', 200);
oasis.breadcrumbs.addCustom('wallet', 'Connected', { address: '0x...' });
// Set after authentication
oasis.setUser({
id: 'user-123',
email: 'user@example.com',
username: 'johndoe',
});
// Clear on logout
oasis.setUser(null);
| Option | Type | Default | Description |
|---|---|---|---|
apiKey | string | required | Public API key |
serverUrl | string | required | Oasis server URL |
appVersion | string | required | Current app version |
enableAutoCrashReporting | boolean | false | Catch uncaught errors |
maxBreadcrumbs | number | 50 | Breadcrumb history limit |
timeout | number | 10000 | Request timeout (ms) |
debug | boolean | false | Enable debug logging |
beforeSend | function | - | Filter/modify events |
onError | function | - | Error callback |
| Secret | Description |
|---|---|
OASIS_SERVER_URL | Base URL (e.g., https://oasis.yourdomain.com) |
OASIS_CI_KEY | CI key for release registration |
NEXT_PUBLIC_OASIS_API_KEY | Public SDK key (exposed to client) |
NEXT_PUBLIC_OASIS_SERVER_URL | Public server URL (exposed to client) |
TAURI_SIGNING_PRIVATE_KEY | Update signing key |
TAURI_SIGNING_PRIVATE_KEY_PASSWORD | Signing key password |
{{target}} not {target}. Single braces are for workflow variables.0.1.0, not v0.1.0 in code. Tags use v prefix.initOasis() early in app lifecycle to catch startup crashes.null to filter sensitive data from crash reports.