Compare commits

...

10 Commits

Author SHA1 Message Date
eball
2a506be19a ci: bump version to 1.12.5 (#2405) 2026-01-12 15:00:44 +08:00
Power-One-2025
698bdf96ed docs: remove outdated environment variables (#2394) 2026-01-12 14:05:52 +08:00
wiy
69e6ac35f8 feat(olares-app): file upload add total_size parameter (#2404)
* feat(olares-app): file upload add total_size parameter

* fix: infisical update

---------

Co-authored-by: aby913 <aby913@163.com>
2026-01-12 14:01:09 +08:00
salt
f41e66b39a feat: search3 upgrade to v0.1.2 for juicefs watch (#2403)
Co-authored-by: ubuntu <you@example.com>
2026-01-12 14:00:32 +08:00
dkeven
1a36faaf6d feat(cli): add upgrader for main line version 1.12.4 (#2402) 2026-01-12 13:59:24 +08:00
Yajing
cbdd08d237 docs: add faqs and refactor help docs (#2376)
* docs: add faqs and refactor help docs

* align zh-cn
2026-01-10 12:56:33 +08:00
dkeven
2fd9d23371 feat(cli): optimize and unify pod readiness check logic (#2393) 2026-01-09 16:10:12 +08:00
hysyeah
f1714534db appservice: delay create nats conn (#2392)
* fix: failed release upgrade

* fix: helm upgrade do not use atomic param and allow upgrade failed release

* fix: delay create nats conn (#2391)

* set appservice image tag and add readiness probe
2026-01-09 15:59:35 +08:00
lovehunter9
9bc66369df fix: files sync reconnection error msg and upload chuck access token (#2390) 2026-01-09 15:22:31 +08:00
Meow33
ba85b0f60d docs/remove outdated env variables 2026-01-09 14:45:07 +08:00
31 changed files with 966 additions and 588 deletions

View File

@@ -75,7 +75,7 @@ jobs:
steps:
- id: generate
run: |
v=1.12.4-$(echo $RANDOM$RANDOM)
v=1.12.5-$(echo $RANDOM$RANDOM)
echo "version=$v" >> "$GITHUB_OUTPUT"
upload-cli:

View File

@@ -17,7 +17,7 @@ jobs:
steps:
- id: generate
run: |
v=1.12.4-$(date +"%Y%m%d")
v=1.12.5-$(date +"%Y%m%d")
echo "version=$v" >> "$GITHUB_OUTPUT"
release-id:

View File

@@ -317,7 +317,7 @@ spec:
chown -R 1000:1000 /uploadstemp && \
chown -R 1000:1000 /appdata
- name: olares-app-init
image: beclab/system-frontend:v1.6.42
image: beclab/system-frontend:v1.7.1
imagePullPolicy: IfNotPresent
command:
- /bin/sh

View File

@@ -18,7 +18,7 @@ fi
if [[ x"$VERSION" == x"" ]]; then
if [[ "$LOCAL_RELEASE" == "1" ]]; then
ts=$(date +%Y%m%d%H%M%S)
export VERSION="1.12.4-$ts"
export VERSION="1.12.5-$ts"
echo "will build and use a local release of Olares with version: $VERSION"
echo ""
else
@@ -28,7 +28,7 @@ fi
if [[ "x${VERSION}" == "x" || "x${VERSION:3}" == "xVERSION__" ]]; then
echo "error: Olares version is unspecified, please set the VERSION env var and rerun this script."
echo "for example: VERSION=1.12.4-20241124 bash $0"
echo "for example: VERSION=1.12.5-20241124 bash $0"
exit 1
fi

View File

@@ -158,7 +158,7 @@ export VERSION="#__VERSION__"
if [[ "x${VERSION}" == "x" || "x${VERSION:3}" == "xVERSION__" ]]; then
echo "error: Olares version is unspecified, please set the VERSION env var and rerun this script."
echo "for example: VERSION=1.12.4-20241124 bash $0"
echo "for example: VERSION=1.12.5-20241124 bash $0"
exit 1
fi

View File

@@ -49,7 +49,7 @@ func NewCmdRelease() *cobra.Command {
}
if version == "" {
version = fmt.Sprintf("1.12.4-%s", time.Now().Format("20060102150405"))
version = fmt.Sprintf("1.12.5-%s", time.Now().Format("20060102150405"))
fmt.Printf("--version unspecified, using: %s\n", version)
time.Sleep(1 * time.Second)
}

View File

@@ -97,25 +97,8 @@ func (t *CheckKeyPodsRunning) Execute(runtime connector.Runtime) error {
if !strings.HasPrefix(pod.Namespace, "user-") && !strings.HasPrefix(pod.Namespace, "os-") {
continue
}
if pod.Status.Phase != corev1.PodRunning {
return fmt.Errorf("pod %s/%s is not running", pod.Namespace, pod.Name)
}
if len(pod.Status.ContainerStatuses) != len(pod.Spec.Containers) {
return fmt.Errorf("pod %s/%s has not started all containers yet", pod.Namespace, pod.Name)
}
for _, cStatus := range pod.Status.ContainerStatuses {
if cStatus.State.Terminated != nil {
if cStatus.State.Terminated.ExitCode != 0 {
return fmt.Errorf("container %s in pod %s/%s is terminated", cStatus.Name, pod.Namespace, pod.Name)
}
continue
}
if cStatus.State.Running == nil {
return fmt.Errorf("container %s in pod %s/%s is not running", cStatus.Name, pod.Namespace, pod.Name)
}
if !cStatus.Ready {
return fmt.Errorf("container %s in pod %s/%s is not ready", cStatus.Name, pod.Namespace, pod.Name)
}
if err := utils.AssertPodReady(&pod); err != nil {
return err
}
}
return nil
@@ -126,29 +109,39 @@ type CheckPodsRunning struct {
labels map[string][]string
}
func (c *CheckPodsRunning) Execute(runtime connector.Runtime) error {
func (c *CheckPodsRunning) Execute(_ connector.Runtime) error {
if c.labels == nil {
return nil
}
kubectl, err := util.GetCommand(common.CommandKubectl)
if err != nil {
return errors.Wrap(errors.WithStack(err), "kubectl not found")
}
var ctx, cancel = context.WithTimeout(context.Background(), 3*time.Minute)
defer cancel()
kubeConfig, err := ctrl.GetConfig()
if err != nil {
return errors.Wrap(err, "failed to load kubeconfig")
}
kubeClient, err := kubernetes.NewForConfig(kubeConfig)
if err != nil {
return errors.Wrap(err, "failed to create kube client")
}
for ns, labels := range c.labels {
for _, label := range labels {
var cmd = fmt.Sprintf("%s get pod -n %s -l '%s' -o jsonpath='{.items[*].status.phase}'", kubectl, ns, label)
phase, err := runtime.GetRunner().SudoCmdContext(ctx, cmd, false, false)
podList, err := kubeClient.CoreV1().Pods(ns).List(ctx, metav1.ListOptions{LabelSelector: label})
if err != nil {
return fmt.Errorf("pod status invalid, namespace: %s, label: %s, waiting ...", ns, label)
}
if phase != "Running" {
logger.Infof("pod in namespace: %s, label: %s, current phase: %s, waiting ...", ns, label, phase)
return fmt.Errorf("pod is %s, namespace: %s, label: %s, waiting ...", phase, ns, label)
if podList == nil || len(podList.Items) == 0 {
return fmt.Errorf("no pod found, namespace: %s, label: %s, waiting ...", ns, label)
}
for i := range podList.Items {
pod := &podList.Items[i]
if err := utils.AssertPodReady(pod); err != nil {
return err
}
}
}
}

View File

@@ -8,36 +8,36 @@ import (
"github.com/beclab/Olares/cli/version"
)
var version_1_12_3 = semver.MustParse("1.12.3")
var version_1_12_4 = semver.MustParse("1.12.4")
type upgrader_1_12_3 struct {
type upgrader_1_12_4 struct {
breakingUpgraderBase
}
func (u upgrader_1_12_3) Version() *semver.Version {
func (u upgrader_1_12_4) Version() *semver.Version {
cliVersion, err := semver.NewVersion(version.VERSION)
// tolerate local dev version
if err != nil {
return version_1_12_3
return version_1_12_4
}
if samePatchLevelVersion(version_1_12_3, cliVersion) && getReleaseLineOfVersion(cliVersion) == mainLine {
if samePatchLevelVersion(version_1_12_4, cliVersion) && getReleaseLineOfVersion(cliVersion) == mainLine {
return cliVersion
}
return version_1_12_3
return version_1_12_4
}
func (u upgrader_1_12_3) AddedBreakingChange() bool {
if u.Version().Equal(version_1_12_3) {
func (u upgrader_1_12_4) AddedBreakingChange() bool {
if u.Version().Equal(version_1_12_4) {
return true
}
return false
}
func (u upgrader_1_12_3) NeedRestart() bool {
func (u upgrader_1_12_4) NeedRestart() bool {
return true
}
func (u upgrader_1_12_3) PrepareForUpgrade() []task.Interface {
func (u upgrader_1_12_4) PrepareForUpgrade() []task.Interface {
tasks := make([]task.Interface, 0)
tasks = append(tasks, upgradeKsConfig()...)
@@ -57,7 +57,7 @@ func (u upgrader_1_12_3) PrepareForUpgrade() []task.Interface {
return tasks
}
func (u upgrader_1_12_3) UpgradeSystemComponents() []task.Interface {
func (u upgrader_1_12_4) UpgradeSystemComponents() []task.Interface {
pre := []task.Interface{
&task.LocalTask{
Name: "UpgradeL4BFLProxy",
@@ -69,7 +69,7 @@ func (u upgrader_1_12_3) UpgradeSystemComponents() []task.Interface {
return append(pre, u.upgraderBase.UpgradeSystemComponents()...)
}
func (u upgrader_1_12_3) UpdateOlaresVersion() []task.Interface {
func (u upgrader_1_12_4) UpdateOlaresVersion() []task.Interface {
var tasks []task.Interface
tasks = append(tasks,
&task.LocalTask{
@@ -88,5 +88,5 @@ func (u upgrader_1_12_3) UpdateOlaresVersion() []task.Interface {
}
func init() {
registerMainUpgrader(upgrader_1_12_3{})
registerMainUpgrader(upgrader_1_12_4{})
}

111
cli/pkg/utils/pod.go Normal file
View File

@@ -0,0 +1,111 @@
package utils
import (
"fmt"
corev1 "k8s.io/api/core/v1"
)
func AssertPodReady(pod *corev1.Pod) error {
if pod == nil {
return fmt.Errorf("pod is nil")
}
podKey := fmt.Sprintf("%s/%s", pod.Namespace, pod.Name)
if pod.DeletionTimestamp != nil {
return fmt.Errorf("pod %s is terminating", podKey)
}
if pod.Status.Phase != corev1.PodRunning {
return fmt.Errorf("pod %s is not running (phase=%s)", podKey, pod.Status.Phase)
}
if len(pod.Spec.InitContainers) > 0 {
initStatusByName := make(map[string]corev1.ContainerStatus, len(pod.Status.InitContainerStatuses))
for i := range pod.Status.InitContainerStatuses {
s := pod.Status.InitContainerStatuses[i]
initStatusByName[s.Name] = s
}
for _, ic := range pod.Spec.InitContainers {
s, ok := initStatusByName[ic.Name]
if !ok {
return fmt.Errorf("pod %s has not started init container %s yet", podKey, ic.Name)
}
if t := s.State.Terminated; t != nil {
if t.ExitCode != 0 {
return fmt.Errorf(
"init container %s in pod %s terminated (exitCode=%d, reason=%s, message=%s)",
s.Name, podKey, t.ExitCode, t.Reason, t.Message,
)
}
continue
}
if w := s.State.Waiting; w != nil {
return fmt.Errorf(
"init container %s in pod %s is waiting (reason=%s, message=%s)",
s.Name, podKey, w.Reason, w.Message,
)
}
return fmt.Errorf("pod %s init container %s is still running", podKey, s.Name)
}
}
readyCondFound := false
for i := range pod.Status.Conditions {
cond := pod.Status.Conditions[i]
if cond.Type != corev1.PodReady {
continue
}
readyCondFound = true
if cond.Status != corev1.ConditionTrue {
if cond.Reason != "" || cond.Message != "" {
return fmt.Errorf("pod %s is not ready (reason=%s, message=%s)", podKey, cond.Reason, cond.Message)
}
return fmt.Errorf("pod %s is not ready", podKey)
}
break
}
if !readyCondFound {
return fmt.Errorf("pod %s is not ready (missing Ready condition)", podKey)
}
statusByName := make(map[string]corev1.ContainerStatus, len(pod.Status.ContainerStatuses))
for i := range pod.Status.ContainerStatuses {
s := pod.Status.ContainerStatuses[i]
statusByName[s.Name] = s
}
for _, c := range pod.Spec.Containers {
cStatus, ok := statusByName[c.Name]
if !ok {
return fmt.Errorf("pod %s has not started container %s yet", podKey, c.Name)
}
if t := cStatus.State.Terminated; t != nil {
return fmt.Errorf(
"container %s in pod %s terminated (exitCode=%d, reason=%s, message=%s)",
cStatus.Name,
podKey,
t.ExitCode,
t.Reason,
t.Message,
)
}
if cStatus.State.Running == nil {
if w := cStatus.State.Waiting; w != nil {
return fmt.Errorf(
"container %s in pod %s is waiting (reason=%s, message=%s)",
cStatus.Name,
podKey,
w.Reason,
w.Message,
)
}
return fmt.Errorf("container %s in pod %s is not running", cStatus.Name, podKey)
}
if !cStatus.Ready {
return fmt.Errorf("container %s in pod %s is not ready", cStatus.Name, podKey)
}
}
return nil
}

View File

@@ -7,18 +7,33 @@ const side = {
link: "/manual/overview",
items: [
// { text: "Compare Olares and NAS", link: "/manual/olares-vs-nas" },
{ text: "Help and support", link: "/manual/help/request-technical-support"}
// collapsed: true,
// items: [
// { text: "FAQs", link: "/manual/help/faqs" },
// {
// text: "Request support",
// link: "/manual/help/request-technical-support",
// },
//{
// text: "Troubleshooting Guide",
// link: "/manual/help/troubleshooting-guide",
// },
{
text: "FAQs",
// link: "/manual/help/faqs",
collapsed: true,
items: [
{
text: "Olares FAQs",
link: "/manual/help/olares",
},
{
text: "Installation FAQs",
link: "/manual/help/installation",
},
{
text: "Usage FAQs",
link: "/manual/help/usage",
},
// {
// text: "Request support",
// link: "/manual/help/request-technical-support",
// },
// {
// text: "Troubleshooting",
// link: "/manual/help/troubleshooting",
// },
],
},
],
},
{
@@ -132,7 +147,7 @@ const side = {
{ text: "Manage integrations", link: "/manual/larepass/integrations" },
],
},
{text: "Use VPN", link:"/manual/larepass/private-network"},
{ text: "Use VPN", link: "/manual/larepass/private-network" },
{
text: "Manage device",
collapsed: true,
@@ -176,7 +191,7 @@ const side = {
text: "Basic operations",
link: "/manual/olares/market/market",
},
{
{
text: "Clone applications",
link: "/manual/olares/market/clone-apps",
},
@@ -265,16 +280,16 @@ const side = {
text: "Organize with filters",
link: "/manual/olares/wise/filter",
collapsed: true,
items:[
{
text: "Filter syntax",
link: "/manual/olares/wise/filter-syntax-guide",
},
{
text: "Filter example",
link: "/manual/olares/wise/filter-examples",
},
],
items: [
{
text: "Filter syntax",
link: "/manual/olares/wise/filter-syntax-guide",
},
{
text: "Filter example",
link: "/manual/olares/wise/filter-examples",
},
],
},
],
},
@@ -368,10 +383,10 @@ const side = {
link: "/manual/olares/settings/set-up-hosts",
},
],
},
{text: "Manage GPU", link: "/manual/olares/settings/gpu-resource"},
{text: "Set video playback", link: "/manual/olares/settings/video"},
{text: "Manage search rules", link: "/manual/olares/settings/search"},
},
{ text: "Manage GPU", link: "/manual/olares/settings/gpu-resource" },
{ text: "Set video playback", link: "/manual/olares/settings/video" },
{ text: "Manage search rules", link: "/manual/olares/settings/search" },
{
text: "Backup and restore",
collapsed: true,
@@ -380,12 +395,12 @@ const side = {
{ text: "Restore", link: "/manual/olares/settings/restore" },
],
},
{text: "Developer resources", link: "/manual/olares/settings/developer"},
]
},
{text: "Dashboard", link: "/manual/olares/resources-usage"},
{text: "Profile", link: "/manual/olares/profile"},
],
{ text: "Developer resources", link: "/manual/olares/settings/developer" },
]
},
{ text: "Dashboard", link: "/manual/olares/resources-usage" },
{ text: "Profile", link: "/manual/olares/profile" },
],
},
{
text: "Best practices",
@@ -519,10 +534,10 @@ const side = {
}
]
},
// {
// text: "Redroid",
// link: "/use-cases/host-cloud-android",
// },
// {
// text: "Redroid",
// link: "/use-cases/host-cloud-android",
// },
{
text: "Windows",
link: "/use-cases/windows",

View File

@@ -6,23 +6,36 @@ const side = {
text: "Olares 是什么?",
link: "/zh/manual/overview",
items: [
// { text: "应用场景", link: "/zh/manual/why-olares" },
//{ text: "功能对比", link: "/zh/manual/feature-overview" },
// { text: "比较 Olares 和 NAS", link: "/zh/manual/olares-vs-nas" },
{text: "帮助与支持", link: "/zh/manual/help/request-technical-support",}
// collapsed: true,
// items: [
// { text: "常见问题", link: "/zh/manual/help/faqs" },
// {
// text: "技术支持",
// link: "/zh/manual/help/request-technical-support",
// },
{
text: "常见问题",
// link: "/zh/manual/help/faqs",
collapsed: true,
items: [
{
text: "产品",
link: "/zh/manual/help/olares",
},
{
text: "安装激活",
link: "/zh/manual/help/installation",
},
{
text: "使用",
link: "/zh/manual/help/usage",
},
// {
// text: "技术支持",
// link: "/zh/manual/help/request-technical-support",
// },
// {
// text: "Troubleshooting Guide",
// link: "/zh/manual/help/troubleshooting-guide",
// },
],
},
],
},
{
text: "快速开始",
collapsed: false,
@@ -128,33 +141,33 @@ const side = {
text: "管理账户",
collapsed: true,
items: [
{text: "创建账户", link:"/zh/manual/larepass/create-account"},
{text: "备份助记词", link: "/zh/manual/larepass/back-up-mnemonics"},
{text: "管理集成", link:"/zh/manual/larepass/integrations"},
{ text: "创建账户", link: "/zh/manual/larepass/create-account" },
{ text: "备份助记词", link: "/zh/manual/larepass/back-up-mnemonics" },
{ text: "管理集成", link: "/zh/manual/larepass/integrations" },
],
},
{text: "使用专用网络", link:"/zh/manual/larepass/private-network"},
{ text: "使用专用网络", link: "/zh/manual/larepass/private-network" },
{
text: "管理设备",
collapsed: true,
items: [
{text: "激活 Olares", link:"/zh/manual/larepass/activate-olares"},
{text: "管理 Olares", link:"/zh/manual/larepass/manage-olares"},
{ text: "激活 Olares", link: "/zh/manual/larepass/activate-olares" },
{ text: "管理 Olares", link: "/zh/manual/larepass/manage-olares" },
],
},
{text: "管理文件", link:"/zh/manual/larepass/manage-files"},
// collapsed: true,
{ text: "管理文件", link: "/zh/manual/larepass/manage-files" },
// collapsed: true,
// items: [
// {text: "常用文件操作", link:"/zh/manual/larepass/manage-files"},
// {text: "同步与共享", link:"/zh/manual/larepass/sync-share"}
// ]
// ]
// },
{
text: "管理密码",
collapsed: true,
items: [
{text: "自动填充", link: "/zh/manual/larepass/autofill"},
{text: "双重验证", link: "/zh/manual/larepass/two-factor-verification"},
{ text: "自动填充", link: "/zh/manual/larepass/autofill" },
{ text: "双重验证", link: "/zh/manual/larepass/two-factor-verification" },
],
},
/*{
@@ -198,7 +211,7 @@ const side = {
},
//{
// "text": "同步与共享",
// "link": "/zh/manual/larepass/sync-share"
// "link": "/zh/manual/larepass/sync-share"
// },
{
"text": "分享文件",
@@ -266,17 +279,17 @@ const side = {
"text": "管理知识",
"link": "/zh/manual/olares/wise/filter",
collapsed: true,
items:[
{
"text": "过滤语法参考",
"link": "/zh/manual/olares/wise/filter-syntax-guide"
items: [
{
"text": "过滤语法参考",
"link": "/zh/manual/olares/wise/filter-syntax-guide"
},
{
"text": "过滤视图示例",
"link": "/zh/manual/olares/wise/filter-examples"
}
],
},
{
"text": "过滤视图示例",
"link": "/zh/manual/olares/wise/filter-examples"
}
],
},
],
},
{
@@ -311,7 +324,7 @@ const side = {
"collapsed": true,
"link": "/zh/manual/olares/settings/",
"items": [
{"text": "我的 Olares", link: "/zh/manual/olares/settings/my-olares"},
{ "text": "我的 Olares", link: "/zh/manual/olares/settings/my-olares" },
{
"text": "管理用户",
"collapsed": true,
@@ -343,16 +356,16 @@ const side = {
link: "/zh/manual/olares/settings/manage-app-env",
},
],
},
},
{
"text": "管理集成",
"link":"/zh/manual/olares/settings/integrations",
},
{
"link": "/zh/manual/olares/settings/integrations",
},
{
"text": "自定义外观",
"link":"/zh/manual/olares/settings/language-appearance",
},
{text: "管理 VPN", link: "/zh/manual/olares/settings/remote-access",},
"link": "/zh/manual/olares/settings/language-appearance",
},
{ text: "管理 VPN", link: "/zh/manual/olares/settings/remote-access", },
{
"text": "配置网络",
"collapsed": true,
@@ -363,24 +376,24 @@ const side = {
},
{
"text": "设置 hosts 文件",
"link":"/zh/manual/olares/settings/set-up-hosts",
"link": "/zh/manual/olares/settings/set-up-hosts",
},
],
},
{text: "管理 GPU", link: "/zh/manual/olares/settings/gpu-resource"},
{text: "视频设置", link: "/zh/manual/olares/settings/video"},
{text: "文件搜索", link: "/zh/manual/olares/settings/search"},
},
{ text: "管理 GPU", link: "/zh/manual/olares/settings/gpu-resource" },
{ text: "视频设置", link: "/zh/manual/olares/settings/video" },
{ text: "文件搜索", link: "/zh/manual/olares/settings/search" },
{
"text": "备份与恢复",
"collapsed": true,
"items": [
{text: "备份", link: "/zh/manual/olares/settings/backup"},
{text: "恢复", link: "/zh/manual/olares/settings/restore"},
{ text: "备份", link: "/zh/manual/olares/settings/backup" },
{ text: "恢复", link: "/zh/manual/olares/settings/restore" },
],
},
{text: "开发者资源", link: "/zh/manual/olares/settings/developer"},
]
},
{ text: "开发者资源", link: "/zh/manual/olares/settings/developer" },
]
},
{ "text": "仪表盘", "link": "/zh/manual/olares/resources-usage" },
{ "text": "Profile", "link": "/zh/manual/olares/profile" }
]
@@ -409,8 +422,8 @@ const side = {
{
text: "在启用显卡直通的 PVE 上安装 Olares",
link: "/zh/manual/best-practices/install-olares-gpu-passthrough",
},
{
},
{
text: "在 Olares 中扩展存储空间",
link: "/zh/manual/best-practices/expand-storage-in-olares",
},
@@ -535,7 +548,8 @@ const side = {
link: "/zh/developer/concepts/",
items: [
{ text: "系统架构", link: "/zh/developer/concepts/system-architecture" },
{ text: "Olares ID",
{
text: "Olares ID",
link: "/zh/developer/concepts/olares-id",
collapsed: true,
items: [
@@ -597,73 +611,73 @@ const side = {
collapsed: true,
link: "/zh/developer/install/cli/olares-cli",
items: [
{text: "gpu", link: "/zh/developer/install/cli/gpu"},
{text: "osinfo", link: "/zh/developer/install/cli/osinfo"},
{text: "node", link: "/zh/developer/install/cli/node"},
{ text: "gpu", link: "/zh/developer/install/cli/gpu" },
{ text: "osinfo", link: "/zh/developer/install/cli/osinfo" },
{ text: "node", link: "/zh/developer/install/cli/node" },
{
text: "backups",
link: "/zh/developer/install/cli/backups",
collapsed: true,
items: [
{text: "download", link: "/zh/developer/install/cli/backups-download"},
{text: "region", link: "/zh/developer/install/cli/backups-region"},
{text: "backup", link: "/zh/developer/install/cli/backups-backup"},
{text: "restore", link: "/zh/developer/install/cli/backups-restore"},
{text: "snapshots", link: "/zh/developer/install/cli/backups-snapshots"},
],
},
{
text: "change-ip",
link: "/zh/developer/install/cli/change-ip",
},
{
text: "download",
link: "/zh/developer/install/cli/download",
},
{ text: "info", link: "/zh/developer/install/cli/info" },
{
text: "install",
link: "/zh/developer/install/cli/install",
},
{
text: "user activate",
link: "/zh/developer/install/cli/user-activate",
},
{
text: "logs",
link: "/zh/developer/install/cli/logs",
},
{
text: "precheck",
link: "/zh/developer/install/cli/precheck",
},
{
text: "prepare",
link: "/zh/developer/install/cli/prepare",
},
{
text: "release",
link: "/zh/developer/install/cli/release",
},
{
text: "start",
link: "/zh/developer/install/cli/start",
},
{
text: "stop",
link: "/zh/developer/install/cli/stop",
},
{
text: "uninstall",
link: "/zh/developer/install/cli/uninstall",
},
],
},
{
text: "版本说明",
link: "/zh/developer/install/versioning",
{ text: "download", link: "/zh/developer/install/cli/backups-download" },
{ text: "region", link: "/zh/developer/install/cli/backups-region" },
{ text: "backup", link: "/zh/developer/install/cli/backups-backup" },
{ text: "restore", link: "/zh/developer/install/cli/backups-restore" },
{ text: "snapshots", link: "/zh/developer/install/cli/backups-snapshots" },
],
},
{
text: "change-ip",
link: "/zh/developer/install/cli/change-ip",
},
{
text: "download",
link: "/zh/developer/install/cli/download",
},
{ text: "info", link: "/zh/developer/install/cli/info" },
{
text: "install",
link: "/zh/developer/install/cli/install",
},
{
text: "user activate",
link: "/zh/developer/install/cli/user-activate",
},
{
text: "logs",
link: "/zh/developer/install/cli/logs",
},
{
text: "precheck",
link: "/zh/developer/install/cli/precheck",
},
{
text: "prepare",
link: "/zh/developer/install/cli/prepare",
},
{
text: "release",
link: "/zh/developer/install/cli/release",
},
{
text: "start",
link: "/zh/developer/install/cli/start",
},
{
text: "stop",
link: "/zh/developer/install/cli/stop",
},
{
text: "uninstall",
link: "/zh/developer/install/cli/uninstall",
},
],
},
{
text: "版本说明",
link: "/zh/developer/install/versioning",
},
],
},
{
@@ -715,66 +729,66 @@ const side = {
},
],
},
// {
// {
// text: "进阶",
// collapsed: true,
// items: [
// {
// text: "terminus-info",
// link: "/zh/developer/develop/advanced/terminus-info",
// link: "/zh/developer/develop/advanced/terminus-info",
// },
// {
// text: "Service Provider",
// link: "/zh/developer/develop/advanced/provider",
// link: "/zh/developer/develop/advanced/provider",
// },
// {
// text: "AI",
// link: "/zh/developer/develop/advanced/ai",
// link: "/zh/developer/develop/advanced/ai",
// },
// { text: "Cookie", link: "/zh/developer/develop/advanced/cookie" },
// { text: "数据库", link: "/zh/developer/develop/advanced/database" },
// {
// text: "账户",
// link: "/zh/developer/develop/advanced/account",
// link: "/zh/developer/develop/advanced/account",
// },
// {
// text: "应用市场",
// link: "/zh/developer/develop/advanced/market",
// link: "/zh/developer/develop/advanced/market",
// },
// {
// text: "Analytic",
// link: "/zh/developer/develop/advanced/analytic",
// },
// {
// text: "Analytic",
// link: "/zh/developer/develop/advanced/analytic",
// },
// {
// text: "Websocket",
// link: "/zh/developer/develop/advanced/websocket",
// link: "/zh/developer/develop/advanced/websocket",
// },
// {
// text: "文件上传",
// link: "/zh/developer/develop/advanced/file-upload",
// },
// {
// text: "Rss",
// link: "/zh/developer/develop/advanced/rss",
// },
// {
// text: "密钥",
// link: "/zh/developer/develop/advanced/secret",
// link: "/zh/developer/develop/advanced/file-upload",
// },
// {
// text: "Rss",
// link: "/zh/developer/develop/advanced/rss",
// },
// {
// text: "密钥",
// link: "/zh/developer/develop/advanced/secret",
// },
// {
// text: "Notification",
// link: "/zh/developer/develop/advanced/notification",
// },
// {
// text: "Frontend",
// link: "/zh/developer/develop/advanced/frontend",
// },
// {
// text: "Kubesphere",
// link: "/zh/developer/develop/advanced/kubesphere",
// },
// ],
// },
// {
// text: "Notification",
// link: "/zh/developer/develop/advanced/notification",
// },
// {
// text: "Frontend",
// link: "/zh/developer/develop/advanced/frontend",
// },
// {
// text: "Kubesphere",
// link: "/zh/developer/develop/advanced/kubesphere",
// },
// ],
// },
{
text: "提交应用",
collapsed: true,
@@ -893,8 +907,8 @@ const side = {
},
],
},
],
};
],
};
export const zh = defineConfig({
lang: "zh",

View File

@@ -34,20 +34,6 @@ Specifies whether to enable the Cloudflare proxy.
- `1` (enable)
- **Default**: `0`
### `DID_GATE_URL`
Specifies the endpoint for the DID gateway.
- **Valid values**:
- `https://did-gate-v3.bttcdn.com`
- `https://did-gate-v3.api.jointerminus.cn/` (recommended for better connectivity in mainland China)
- **Default**: `https://did-gate-v3.bttcdn.com`
### `FIREBASE_PUSH_URL`
Specifies the endpoint for Firebase push services.
- **Valid values**:
- `https://firebase-push-test.bttcdn.com/v1/api/push`
- `https://firebase-push-test.api.jointerminus.cn/v1/api/push` (recommended for better connectivity in mainland China)
- **Default**: `https://firebase-push-test.bttcdn.com/v1/api/push`
### `FRP_AUTH_METHOD`
Sets the FRP authentication method.
- **Valid values**:
@@ -68,13 +54,6 @@ Specifies whether to enable FRP for internal network tunneling. Requires additio
- `1` (enable)
- **Default**: `0`
### `FRP_LIST_URL`
Specifies the endpoint for the Olares FRP information service.
- **Valid values**:
- `https://terminus-frp.snowinning.com`
- `https://terminus-frp.api.jointerminus.cn` (recommended for better connectivity in mainland China)
- **Default**: `https://terminus-frp.snowinning.com`
### `FRP_PORT`
Specifies the FRP server's listening port.
- **Valid values**: An integer in the range `165535`
@@ -106,13 +85,6 @@ Specifies whether to enable GPU sharing. Applies only if GPU is enabled.
- `1` (enable)
- **Default**: `0`
### `MARKET_PROVIDER`
Specifies the backend domain used by the application marketplace (Market).
- **Valid values**:
- `appstore-server-prod.bttcdn.com`
- `appstore-china-server-prod.api.jointerminus.cn` (recommended for better connectivity in mainland China)
- **Default**: `appstore-server-prod.bttcdn.com`
### `NVIDIA_CONTAINER_REPO_MIRROR`
Specifies the APT repository mirror for installing NVIDIA Container Toolkit.
- **Valid values**:
@@ -120,13 +92,6 @@ Specifies the APT repository mirror for installing NVIDIA Container Toolkit.
- `mirrors.ustc.edu.cn` (recommended for better connectivity in mainland China)
- **Default**: `nvidia.github.io`
### `OLARES_SPACE_URL`
Specifies the endpoint for the Olares Space service.
- **Valid values**:
- `https://cloud-api.bttcdn.com/`
- `https://cloud-api.api.jointerminus.cn/` (recommended for better connectivity in mainland China)
- **Default**: `https://cloud-api.bttcdn.com/`
### `PREINSTALL`
Runs only the pre-installation phase (system dependency setup) without proceeding to the full Olares installation.
- **Valid values**: `1`
@@ -145,27 +110,6 @@ Specifies a custom Docker registry mirror for faster image pulls.
- **Valid values**: `https://mirrors.olares.com` or any other valid URL
- **Default**: `https://registry-1.docker.io`
### `TAILSCALE_CONTROLPLANE_URL`
Specifies the endpoint for the Olares Tailscale control-plane service.
- **Valid values**:
- `https://controlplane.snowinning.com`
- `https://controlplane.api.jointerminus.cn` (recommended for better connectivity in mainland China)
- **Default**: `https://controlplane.snowinning.com`
### `TERMINUS_CERT_SERVICE_API`
Specifies the endpoint for the Olares HTTPS certificate service.
- **Valid values**:
- `https://terminus-cert.snowinning.com`
- `https://terminus-cert.api.jointerminus.cn` (recommended for better connectivity in mainland China)
- **Default**: `https://terminus-cert.snowinning.com`
### `TERMINUS_DNS_SERVICE_API`
Specifies the endpoint for the Olares DNS service.
- **Valid values**:
- `https://terminus-dnsop.snowinning.com`
- `https://terminus-dnsop.api.jointerminus.cn` (recommended for better connectivity in mainland China)
- **Default**: `https://terminus-dnsop.snowinning.com`
### `TERMINUS_IS_CLOUD_VERSION`
Marks the machine explicitly as a cloud instance.
- **Valid values**: `true`

View File

@@ -1,105 +1,2 @@
---
description: Find answers to common questions about Olares.
---
# FAQs
## What license is Olares using?
Olares consists of a series of projects using a hierarchical authorization approach. The basic principles are:
- Projects running on blockchain use Apache 2.0, such as [Snowinning Protocol](https://github.com/beclab/terminusdid-contract-system).
- Projects related to protocols use Apache 2.0, such as [r4](https://github.com/beclab/r4).
- Projects around Olares and LarePass use the [Olares License](https://github.com/beclab/Olares/blob/main/LICENSE.md).
- For third-party applications running on Olares, it is up to the developer to decide whether they want them open source or not and choose the license accordingly.
For more details, visit our projects on [GitHub](https://github.com/beclab).
## Is the Olares License an open source license?
Olares's choice of license for its major projects is inspired by [fair code](https://faircode.io/). The [Olares License](https://github.com/beclab/Olares/blob/main/LICENSE.md) also follows these principles:
> - Is generally free to use and can be distributed by anybody
> - Has its source code openly available
> - Can be extended by anybody in public and private communities
> - Is commercially restricted by its authors
## Why can't I restore my account if the mnemonics goes missing?
From 1Passwords MasterKey to crypto wallets mnemonic phrase, for more than ten years, the problem of mnemonic storage has not been well solved.
The mnemonic phrase of Olares will be encrypted and stored on all devices that install LarePass. Generally, you only lose the mnemonic phrase if you lose all the devices with LarePass installed at the same time.
Safety is the most important principle in designing our system. We will continue to improve it in the future to provide you with a better solution that balances convenience and safety.
## Is there a difference between Olares and the current operating systems running on NAS?
At the inception of Olares (formerly Terminus), the market already had excellent NAS operating systems such as [Synology](https://www.synology.com/en-global/dsm/packages), [CasaOS](https://github.com/IceWhaleTech/CasaOS), and [Umbrel](https://github.com/getumbrel/umbrel). They have indeed inspired us.
But we do think the operating system running on Edge should be able to:
- Orchestrate resources for multiple hardware
- Manage applications in sandboxes
This is difficult to achieve with the above-mentioned NAS operating systems built on Docker Compose.
Meanwhile, Olares aims to provide a one-stop self-hosted solution, which goes beyond the scope of general NAS operating systems.
## Do I need to pay for Olares?
When you're self-hosting, you can essentially use Olares for free.
But for the following two features, we may introduce reasonable charges due to the cost (currently both are provided for free):
- **Backup**
We provide 10G of free backup space for each Olares ID on Olares Space. When the archive size exceeds this limit, we will charge you a certain fee to cover the cloud provider fee.
- **Fast Reverse Proxy (FRP)**
Accessing Olares locally or via VPN is essentially free. However, if youre providing external services like hosting a blog, traffic will be forwarded to a Fast Reverse Proxy (FRP) server before reaching Olares. In this case:
- If you use your own FRP service, Olares does not impose any charges.
- If you opt to use the default FRP service from Olares, we offer a free monthly traffic allowance of 2GB. This is usually sufficient for users who do not provide external services through Olares. Additional charges may apply if your usage exceeds this limit.
## When are other languages available?
Right now we only support English and Simplified Chinese.
In fact, we have completed i18n replacement in all front-end projects. However, we lack the experience in maintaining translation resources for a fast iterating project through the open source community. We are still learning.
## What are the differences among the different "passwords"?
Olares does have various passwords to ensure its security, including:
- Private key
- The password of LarePass:
- On mobile phones, biometrics can be used for login
- On computers and browser plug-ins, manual input is required
- Password for first activation of Olares
- Password for Olares login
- Second verification code when logging in to Olares
Don't panic! For daily use, what you need to enter is the two-step verification code when logging in to Olares.
## How to deploy multi-user applications?
It depends on whether you want to provide external service or simply let internal Olares users use it.
- To provide services to the public, you can select the Entrance to access the application as **Public**. This allows the application to manage its own user registration and authentication.
- To provide internal access only, you can deploy the Cluster-scoped version of such products on Olares.
For Gitlab, we provide two versions of porting: [Gitlab Pure](https://github.com/beclab/apps/tree/main/gitlabpure) and [Gitlab Fusion](https://github.com/RLovelett/gitlab-fusion).
## How can I reactivate Olares with the same Olares ID?
If you've reinstalled Olares, the Olares instance you originally activated will no longer be accessible. To reactivate Olares using the same Olares ID:
::: tip Install with the same Olares ID
During the Olares installation, ensure that you have entered the exact same domain and Olares ID that you used previously.
:::
![Reactivate](/images/manual/help/reactivate.png)
1. Open LarePass on your phone and enter your previous account. You should see a red prompt on the top saying "No active Olares found".
2. Tap **Learn more** > **Reactivate** to enter the QR scan screen.
3. Tap **Scan QR code** to scan the QR code on the wizard page and activate Olares.
This section summarizes frequently asked questions about Olares.

View File

@@ -0,0 +1,78 @@
---
outline: [2, 3]
description: Find answers to common questions during the installation and activation of Olares.
---
# Olares installation and activation FAQs
This page lists the FAQs about installing, configuring, and activating Olares on your hardware.
## Installation
### What platforms does Olares support?
You can install Olares on Linux (Ubuntu or Debian) for best performance.
For product evaluation, you can also install Olares on the following platforms:
* Proxmox VE
* Raspberry Pi
* macOS
* Windows
### What is the minimum hardware requirements for installing Olares?
The requirements vary by platform. Generally:
* **CPU**: Minimum 4 cores with x86-64 architecture (Intel or AMD).
* **Memory**: At least 8 GB of available RAM.
* **Storage**: Minimum 150 GB SSD.
For detailed requirements, refer to the [installation docs](../get-started/install-olares.md).
### Can I use a mechanical hard drive to install Olares?
No. You must use an SSD. The installation will likely fail if a mechanical hard drive is used due to slower read and write speeds, which can cause timeouts during the system initialization.
### Does the system support NVIDIA GPUs?
Yes. Olares is fully optimized for NVIDIA hardware. It automatically handles driver installation, allowing you to get immediate AI and gaming performance.
It also supports multiple GPUs on a single motherboard (currently NVIDIA only), allowing users with custom hardware to leverage all available compute power for AI workloads.
### How do I manually install NVIDIA drivers if the automatic setup fails?
The Olares installer usually detects and installs drivers automatically. However, if your system previously had NVIDIA drivers installed, the process might be skipped or fail due to conflicts.
In this case, you should:
1. Reboot the machine after the Olares installation to ensure any old driver components are fully cleared.
2. Manually trigger the driver installation using the command `olares-cli gpu install`.
After installation, you can confirm that the drivers are installed and your GPU is recognized by running `nvidia-smi`.
### Why does installation fail with `failed to build Kubernetes objects` or `Ensure CRDs are installed first`?
While these error messages suggest a problem with Custom Resource Definitions (CRDs), they are often a symptom of poor disk performance.
Olares relies on etcd, the backing database for Kubernetes. etcd is very sensitive to storage speed. If you are installing Olares on a slow disk, such as a traditional HDD, etcd cannot respond fast enough. This causes the API server to time out while attempting to apply CRDs.
Installing Olares on SSD storage should fix this issue.
### My Olares installation timed out and didn't show a password, but the system seems to be running. How can I find the password?
This typically occurs when the installation times out due to insufficient system resources, especially in a virtual machine (VM). You can retrieve the password from the installation log file with the following command:
```bash
# Replace v1.12.2 with your specific Olares version number.
grep password $HOME/.olares/versions/v1.12.2/logs/install.log
```
An installation timeout often means some services failed to start correctly. After finding your password, run `kubectl get pod -A` to check the status of all services.
## Activation
### Is it possible to activate Olares with a non-local network?
Yes. Before activation, users typically access the activation wizard using the local IP address, which generally requires both parties to be on the same network. However, if Olares is assigned a public IP, such as on a public cloud, this local network limitation no longer applies.
Note that IP access is only used during activation. Once activated, devices can be accessed via domain names on both internal and external networks.
### My Olares is powered on and connected to LAN, but I can't find it in LarePass. What should I do?
Ensure both your phone and Olares device are on the same network. If they are not, LarePass cannot discover Olares automatically.
In situations where you cannot connect via Wi-Fi, you can use the Bluetooth network setup in the LarePass app to connect Olares to the same network as your phone.
For details, see [Activate Olares using Bluetooth](../../manual/larepass/activate-olares.md#activate-olares-using-bluetooth).

125
docs/manual/help/olares.md Normal file
View File

@@ -0,0 +1,125 @@
---
outline: [2, 3]
description: Find answers to common questions about the Olares platform.
---
# Olares FAQs
This page lists most frequently asked questions about Olares.
## General information
### What is Olares?
Olares is an open-source personal cloud operating system based on Kubernetes designed to empower users to own and manage their digital assets locally.
It features native resource orchestration, application sandboxing, and production-grade infrastructure for edge computing. The goal of Olares is to provide a one-stop personal cloud solution that runs powerful local alternatives to public cloud services such as large language models and automation workflows. It is suitable for use cases ranging from personal media servers and AI development to decentralized identity management.
### What is "personal cloud"?
A personal cloud is a private infrastructure that replicates the utility of public cloud services such as anywhere-access to files and computing power but runs entirely on your own hardware to ensure data sovereignty.
### Who is Olares for?
Olares is designed for anyone who wants to use powerful AI tools locally without dealing with complex technical setups.
* **For general users**: You can deploy complex applications like ComfyUI or Perplexica from the Market with a single click.
* **For developers**: Olares functions as an efficient local development environment. You can leverage the sandboxing and agent infrastructure to build and test applications directly on your Olares device, saving time on environment configuration.
### How is Olares different from NAS operating systems?
Olares is designed fundamentally as a Personal AI Cloud rather than a storage server. Traditional NAS systems like Synology DSM or CasaOS are optimized primarily for storing files and hosting lightweight containers.
Olares distinguishes itself by focusing on high-performance computing:
* **Orchestrating resources**: It natively manages hardware resources such as GPUs to power local AI workloads.
* **Sandboxing**: It enforces strict application isolation, providing a security model that goes beyond standard file servers.
For detailed comparisons, refer to [Compare Olares and NAS](https://blog.olares.com/compare-olares-and-nas/).
### Why is an Olares ID required?
The Olares ID is currently required to automate secure remote access for your device. It allows the system to configure a reverse proxy, register a subdomain, and manage HTTPS certificates on your behalf. Without this, you would need to manually handle complex network configurations such as port forwarding and DNS management to access your device from outside your home.
Unlike a centralized cloud account, the Olares ID is owned entirely by you. We never see your credentials, and we cannot recover your data if you lose your mnemonic phrase.
We understand the community's preference for flexibility. In the upcoming March update, we plan to introduce new activation options that will make the Olares ID optional if you prefer to configure your own network access.
### Can I use Olares offline or without internet?
Yes, we support local-first usage, though the initial activation currently requires internet access.
For users prioritizing strict local control, we offer these options:
* **VPN-Only mode**: You can restrict your Olares so it is only accessible remotely via VPN.
* **Local-Only access**: You can access Olares services via `.local` domains even if the router has no internet access.
For detailed local access options, refer to [Access Olares services locally](../get-started/local-access.md).
Note that we are also working on an option to allow full device activation in a completely offline environment.
### What is LarePass and why is it required?
LarePass is the official client for Olares. It acts as a secure bridge to enable seamless access, file synchronization across devices, etc. Currently, it is required to handle the device activation.
### Can I use Olares without the LarePass app?
We understand this is a core requirement for advanced users. We are working on decoupling these functions:
* **CLI activation**: We plan to move activation logic into the `olares-cli`, allowing for a terminal-based setup without the app.
* **Standalone components**: We aim to provide standalone deployment options for components like the Reverse Proxy, DID service, and Market repo in future updates.
### Can I use my own domain name?
Yes. You can use your own custom domain instead of the default `olares.com` domain. Note that setting this up currently requires the LarePass app.
For details, refer to [Set up a custom domain for your Olares](../best-practices/set-custom-domain.md).
### Do I need to pay for Olares?
Olares OS itself is free and open source for self-hosting. If you purchase Olares One, it is a one-time hardware cost.
We offer two optional cloud-assisted services for convenience, but free alternatives are available so you are never locked in:
* **Cloud backup**: You can subscribe to Olares Space for integrated cloud backups. The free alternative is to back up to your own external storage or S3-compatible service.
* **Remote access (FRP)**: For easy remote access, we offer a built-in FRP (Fast Reverse Proxy) service with 2 GB of free monthly traffic, with paid options for higher usage. The completely free alternative is to access Olares services via LarePass VPN, or to configure and use your own FRP server.
### How often does Olares update?
We aim for a major release approximately every 2 months. You can view specific changes in our [changelog](https://www.olares.com/changelog).
## License
### Is Olares open source?
Yes. The Olares OS software is open source, ensuring transparency and community collaboration. The project consists of a family of repositories licensed under appropriate models:
* **Olares and LarePass**: Licensed under AGPL-3.0. You can view our [GitHub organization](https://github.com/beclab).
* **Protocol projects**: Projects like the Smart contract system for Olares ID use Apache 2.0.
* **Third-party apps**: Developers adopt any license they choose.
### Can I build Olares from source code?
The short answer is yes, but it is currently complex.
Olares is a massive project spanning over 90 repositories. Because our architecture is evolving quickly, we currently lack a fully integrated local build system that provides a simple "what you see is what you get" experience.
We are actively working to streamline the build process and documentation. We expect to improve the local build experience and release standalone deployment guides for core services such as reverse proxy in 2026. Our goal is to refine the foundation first, then invite broader community collaboration.
## Security and privacy
### Does Olares collect my data?
No. Olares is built to reclaim your data ownership. All storage, computation, and AI processing happen locally on your hardware. Olares does not collect or transmit your private data to any centralized service.
### Does Olares support backup?
Yes. Data safety is user-controlled and private. Olares includes a [built-in backup feature](../olares/settings/backup.md) that allows you to save specific file directories and set automatic schedules.
Critically, every backup file is end-to-end encrypted. This allows you to store the backup file on any medium including external drive or third-party cloud with full confidence that the data remains inaccessible to others.
### What is app sandboxing?
Sandboxing is a security standard used to prevent a single malicious app from compromising the entire system. In Olares, every app runs in its own secure, isolated environment. If an app malfunctions, it is completely contained and cannot access or damage your other applications or personal data.
### Does the system support multi-user environments?
Yes. Olares supports sub-accounts with a built-in roles and permissions system including Super Admin, Admin, and Member.
This allows a team to access shared tools on a single server. For example, you can share files within the same Olares cluster or install a large AI model once for everyone to use.

49
docs/manual/help/usage.md Normal file
View File

@@ -0,0 +1,49 @@
---
outline: [2, 3]
description: Find answers to common questions about using Olares and community apps.
---
# Usage FAQs
Find answers to common questions about daily usage, applications, and system management.
## Applications
### What apps can I run in Olares?
The [Olares Market](https://market.olares.com/) maintains popular open-source apps like Ollama, ComfyUI, and Open WebUI.
If you have Docker experience, you can manually [deploy apps](../../developer/develop/tutorial/index.md) not listed in the Olares Market in a testing environment.
### Can I play games on my Olares device?
Yes. The Steam Headless app transforms your Olares device into a gaming server.
* [**Streaming**](../../use-cases/stream-game.md): You can run games locally on Olares and stream them to devices like phones and tablets.
* [**Direct play**](../../use-cases/play-games-directly.md): You can connect a monitor, keyboard, and mouse directly to the Olares device to play games without streaming.
### How do I access the Windows environment in Olares?
You can run a Windows VM from the Olares Market and access it using any standard RDP client.
For detailed instructions, refer to [Run a Windows VM on your Olares device](../../use-cases/windows.md).
### Can I develop apps on Olares?
Yes. You can install [Studio](../../developer/develop/tutorial/index.md) to code directly in your browser or connect your local VS Code to the device. This provides a development experience similar to your local machine but leverages the greater power of your server hardware.
## Storage
### If I add new disks to a running Olares machine, will Olares use them automatically?
It depends on the type of drive:
* **USB drives**: Yes, these are automatically mounted and will appear immediately in the Files app.
* **Internal drives**: No, internal HDDs or SSDs are not automatically added to the storage pool. You must configure them manually.
* **SMB shares**: Network storage can be added via **External** > **Connect to server** in Files.
For detailed instructions, see [Expand storage in Olares](../best-practices/expand-storage-in-olares.md).
## Multi-node clusters
### How do I add more machines to my cluster?
By default, Olares installs as a single-node cluster. However, you can install Olares as a master node and then add worker nodes to create a scalable, multi-node cluster.
Note that this is currently an Alpha feature and works on Linux only. For detailed steps, refer to [Install a multi-node Olares cluster](../best-practices/install-olares-multi-node.md).

View File

@@ -36,15 +36,7 @@ export FRP_ENABLE=1 \
JUICEFS=0 \
FRP_AUTH_METHOD="jws" \
REGISTRY_MIRRORS="https://mirrors.olares.cn" \
DOWNLOAD_CDN_URL="https://cdn.olares.cn" \
MARKET_PROVIDER="appstore-china-server-prod.api.jointerminus.cn" \
TERMINUS_CERT_SERVICE_API="https://terminus-cert.api.jointerminus.cn" \
TERMINUS_DNS_SERVICE_API="https://terminus-dnsop.api.jointerminus.cn" \
DID_GATE_URL="https://did-gate-v3.api.jointerminus.cn/" \
OLARES_SPACE_URL="https://cloud-api.api.jointerminus.cn/" \
FIREBASE_PUSH_URL="https://firebase-push-test.api.jointerminus.cn/v1/api/push" \
FRP_LIST_URL="https://terminus-frp.api.jointerminus.cn/" \
TAILSCALE_CONTROLPLANE_URL="https://controlplane.api.jointerminus.cn"
DOWNLOAD_CDN_URL="https://cdn.olares.cn"
curl -sSfL https://olares.sh | bash
```
@@ -60,20 +52,6 @@ curl -sSfL https://olares.sh | bash
- `1`(启用)
- **默认值**`0`(禁用)
### `DID_GATE_URL`
指定 DID 网关服务的地址。
- **可选值**
- `https://did-gate-v3.bttcdn.com`
- `https://did-gate-v3.api.jointerminus.cn/`(推荐中国大陆用户使用,连接性更好)
- **默认值**`https://did-gate-v3.bttcdn.com/`
### `FIREBASE_PUSH_URL`
指定 Firebase 推送服务的地址。
- **可选值**
- `https://firebase-push-test.bttcdn.com/v1/api/push`
- `https://firebase-push-test.api.jointerminus.cn/v1/api/push`(推荐中国大陆用户使用,连接性更好)
- **默认值**`https://firebase-push-test.bttcdn.com/v1/api/push`
### `FRP_AUTH_METHOD`
设置 FRP 的认证方式。
- **可选值**
@@ -94,13 +72,6 @@ curl -sSfL https://olares.sh | bash
- `1`(启用)
- **默认值**`0`(禁用)
### `FRP_LIST_URL`
指定 Olares FRP 信息服务的地址。
- **可选值**
- `https://terminus-frp.snowinning.com`
- `https://terminus-frp.api.jointerminus.cn`(推荐中国大陆用户使用,连接性更好)
- **默认值**`https://terminus-frp.snowinning.com`
### `FRP_PORT`
设置 FRP 服务端监听端口。
- **可选值**:整数范围 `165535`
@@ -132,13 +103,6 @@ curl -sSfL https://olares.sh | bash
- `1`(启用)
- **默认值**`0`(禁用)
### `MARKET_PROVIDER`
指定应用市场Market后端服务所使用的域名可根据网络环境选择合适的域名以优化访问速度。
- **可选值**
- `appstore-server-prod.bttcdn.com`
- `appstore-china-server-prod.api.jointerminus.cn`(推荐中国大陆用户使用,连接性更好)
- **默认值**`appstore-server-prod.bttcdn.com`
### `NVIDIA_CONTAINER_REPO_MIRROR`
配置 `nvidia-container-toolkit` 的 APT 安装镜像源。
- **可选值**
@@ -146,13 +110,6 @@ curl -sSfL https://olares.sh | bash
- `mirrors.ustc.edu.cn`(推荐中国大陆用户使用,连接性更好)
- **默认值**`nvidia.github.io`
### `OLARES_SPACE_URL`
指定 Olares Space 服务的地址。
- **可选值**
- `https://cloud-api.bttcdn.com/`
- `https://cloud-api.api.jointerminus.cn/`(推荐中国大陆用户使用,连接性更好)
- **默认值**`https://cloud-api.bttcdn.com/`
### `PREINSTALL`
仅执行预安装阶段(系统依赖配置),不进行完整的 Olares 安装。
- **可选值**`1`
@@ -170,27 +127,6 @@ curl -sSfL https://olares.sh | bash
- **可选值**`https://mirrors.olares.cn` 或其他镜像源地址
- **默认值**`https://registry-1.docker.io`
### `TAILSCALE_CONTROLPLANE_URL`
指定 Olares Tailscale 控制平面control-plane服务的地址。
- **可选值**
- `https://controlplane.snowinning.com`
- `https://controlplane.api.jointerminus.cn`(推荐中国大陆用户使用,连接性更好)
- **默认值**`https://controlplane.snowinning.com`
### `TERMINUS_CERT_SERVICE_API`
指定 Olares HTTPS 证书服务的地址。
- **可选值**
- `https://terminus-cert.snowinning.com`
- `https://terminus-cert.api.jointerminus.cn`(推荐中国大陆用户使用,连接性更好)
- **默认值**`https://terminus-cert.snowinning.com`
### `TERMINUS_DNS_SERVICE_API`
指定 Olares DNS 服务的地址。
- **可选值**
- `https://terminus-dnsop.snowinning.com`
- `https://terminus-dnsop.api.jointerminus.cn`(推荐中国大陆用户使用,连接性更好)
- **默认值**`https://terminus-dnsop.snowinning.com`
### `TERMINUS_IS_CLOUD_VERSION`
明确将此机器标记为云端实例cloud instance
- **可选值**`true`

View File

@@ -1,105 +1,2 @@
---
description: 获取关于 Olares 的常见问题解答。
---
# 常见问题
## Olares 采用了什么协议?
Olares 由一系列项目组成,采用了分层授权的方式,基本原则是:
- 区块链上运行的项目,采用 Apache 2.0,例如 [Snowinning Protocol](https://github.com/beclab/olaresdid-contract-system)。
- 协议相关的项目,采用 Apache 2.0,例如 [r4](https://github.com/beclab/r4)。
- Olares 和 LarePass 相关的项目,采用 Olares License。
- 在 Olares 上运行的第三方应用,由开发者自己决定开源与否与协议选择。
- 每个项目具体的情况,可以在 [GitHub](https://github.com/beclab) 上查询。
## Olares 许可证是开源许可证吗?
Olares 主要项目的许可证选择受到了 [fair code](https://faircode.io/) 的启发。[Olares 许可证](https://github.com/beclab/Olares/blob/main/LICENSE.md)同样遵循以下原则:
> - 可供任何人免费使用和分发
> - 源代码公开可见
> - 任何人都可以在公共和私有社区中进行扩展
> - 作者对商业使用有所限制
## 如果助记词丢失了为什么不能恢复账号?
从 1Password 的主密钥到加密钱包的助记词,十多年来助记词存储这个问题一直没有很好的解决方案。
Olares 的助记词会被加密存储在所有安装了 LarePass 的设备上。通常情况下,只有当所有安装了 LarePass 的设备同时丢失时,才会失去助记词。
安全性是我们系统设计中最重要的原则。我们会在未来继续改进,为大家提供一个在便利性和安全性之间更好平衡的解决方案。
## Olares 和目前运行在 NAS 上的操作系统有什么区别?
在 Olares前身是 Terminus诞生之初市面上已经有很优秀的 NAS 操作系统,如 [Synology](https://www.synology.com/en-global/dsm/packages)、[CasaOS](https://github.com/IceWhaleTech/CasaOS) 和 [Umbrel](https://github.com/getumbrel/umbrel)。它们确实给了我们很多启发。
但我们认为运行在边缘端的操作系统应该能够:
- 为多个硬件编排资源
- 在沙箱中管理应用
这些功能很难通过上述基于 Docker Compose 构建的 NAS 操作系统实现。
同时Olares 致力于提供一站式自托管解决方案,这已经超出了普通 NAS 操作系统的范畴。
## 使用 Olares 需要付费吗?
在自托管场景下,基本上可以免费使用 Olares。
但对于以下两个功能,由于成本因素,我们可能会引入合理的收费(目前都是免费提供):
- **备份**
我们为每个 Olares ID 在 Olares Space 上提供 10G 的免费备份空间。当存档大小超过这个限制时,我们会收取一定费用来支付云服务商的费用。
- **快速反向代理FRP**
通过本地访问 Olares 或使用 Olares VPN 基本是免费的。然而,如果你通过 Olares 提供外部服务(例如博客),流量会先转发到 FRP 服务器再到达 Olares。此种情况下
- 如果你使用自己的 FRP 服务Olares 不会收取任何费用。
- 如果你选择使用 Olares 默认的 FRP 服务,我们每月提供 2GB 的免费流量额度。对于不通过 Olares 提供外部服务的用户,这些流量通常是足够的。如果使用超出此限额,可能会产生额外费用。
## 什么时候支持其他语言?
目前我们只支持英语和简体中文。
实际上,我们已经在所有前端项目中完成了 i18n 的替换工作。但我们缺乏通过开源社区维护快速迭代项目的翻译资源的经验,这方面我们还在学习中。
## 各种“密码”之间有什么区别?
为了保证安全性Olares 确实有多种密码,包括:
- 私钥
- LarePass 的密码:
- 手机上可以使用生物识别登录
- 电脑和浏览器插件需要手动输入
- Olares 首次激活使用的一次性密码
- Olares 的登录密码
- Olares 登录时的二次验证码
不用慌!日常使用时,需要输入的只是登录 Olares 时的二次验证码。
## 如何部署多用户应用?
这取决于是要对外提供服务,还是仅供内部 Olares 用户使用。
- 如果要对外提供服务,可以选择“**公开**”作为应用的访问入口。这样应用就可以自行管理用户注册和认证。
- 如果只提供内部访问,可以在 Olares 上部署这类产品的集群版本。
对于 Gitlab我们提供了两个移植版本[Gitlab Pure](https://github.com/beclab/apps/tree/main/gitlabpure) 和 [Gitlab Fusion](https://github.com/RLovelett/gitlab-fusion)。
## 如何使用相同的 Olares ID 重新激活 Olares?
如果你在同一台设备上重新安装了 Olares你之前激活的 Olares 实例将无法再访问。你可以使用同一个 Olares ID 重新激活 Olares
:::tip 使用相同的 Olares ID 安装
请确保在安装过程中输入了与之前完全相同的域名和 Olares ID。
:::
![重新激活](/images/zh/manual/help/reactivate.png)
1. 在手机上打开 LarePass 并进入之前的账户。你应该会在顶部看到一个红色状态提示:“未发现运行中的 Olares”。
2. 点击**了解更多**>**重新激活**,进入二维码扫描界面。
3. 点击**扫描二维码**来扫描向导页面上的二维码并激活 Olares。
# FAQs
This section summarizes frequently asked questions about Olares.

View File

@@ -1,3 +1,3 @@
# Help and support
# 帮助与支持
Text

View File

@@ -0,0 +1,79 @@
---
outline: [2, 3]
description: 查找有关 Olares 安装与激活过程中的常见问题解答。
---
# Olares 安装与激活常见问题
本文汇总了关于在硬件上安装、配置及激活 Olares 的常见问题。
## 安装
### Olares 支持哪些平台?
为了获得最佳性能,建议在 Linux (Ubuntu 或 Debian) 上安装 Olares。
若仅用于产品体验,也可以在以下平台安装:
* Proxmox VE
* Raspberry Pi
* macOS
* Windows
### 安装 Olares 的最低硬件要求是什么?
具体要求因平台而异。通常建议配置如下:
* **CPU**:至少 4 核x86-64 架构 (Intel 或 AMD)。
* **内存**:至少 8 GB 可用内存。
* **存储**:至少 150 GB SSD。
详细要求参见[安装文档](../get-started/install-olares.md)。
### 可以使用机械硬盘安装 Olares 吗?
不可以。必须使用 SSD。由于机械硬盘读写速度较慢极易导致系统初始化超时从而造成安装失败。
### 系统支持 NVIDIA 显卡吗?
支持。Olares 针对 NVIDIA 硬件进行了深度优化。系统会自动处理驱动安装,让你即刻获得 AI 和游戏性能加速。
系统还支持单主板多 GPU 配置 (目前仅限 NVIDIA),允许自定义硬件用户利用所有可用算力处理 AI 负载。
### 如果自动设置失败,如何手动安装 NVIDIA 驱动?
Olares 安装程序通常会自动检测并安装驱动。但如果系统中此前已安装过 NVIDIA 驱动,可能会因冲突导致安装过程跳过或失败。
此时,按以下步骤操作:
1. Olares 安装完成后重启机器,确保旧的驱动组件被完全清理。
2. 使用命令 `olares-cli gpu install` 手动触发驱动安装。
安装完成后,运行 `nvidia-smi` 确认驱动已安装且 GPU 被正确识别。
### 为什么安装时报错 `failed to build Kubernetes objects` 或 `Ensure CRDs are installed first`
虽然报错信息指向 Custom Resource Definitions (CRD) 问题,但这通常是磁盘性能不足的表现。
Olares 依赖 Kubernetes 的后端数据库 etcd。etcd 对存储速度非常敏感。如果在传统 HDD 等低速硬盘上安装etcd 无法及时响应,从而导致 API Server 在尝试应用 CRD 时超时。
更换为 SSD 存储通常能解决此问题。
### Olares 安装超时未显示密码,但系统似乎在运行。如何找回密码?
这通常是由于系统资源不足导致安装超时,特别是在虚拟机环境中。你可以通过以下命令从安装日志中获取密码:
```bash
# 将 v1.12.2 替换为你的具体 Olares 版本号
grep password $HOME/.olares/versions/v1.12.2/logs/install.log
```
安装超时通常意味着部分服务启动失败。找回密码后,运行 `kubectl get pod -A` 检查所有服务的状态。
## 激活
### 可以在非局域网环境下激活 Olares 吗?
可以。通常情况下,用户通过局域网 IP 访问激活向导,这要求双方在同一网络下。但如果 Olares 被分配了公网 IP (如在公有云上),则不受此局域网限制。
注意IP 访问仅用于激活过程。激活完成后,无论在内网还是外网,均通过域名访问设备。
### Olares 已开机并连接局域网,但 LarePass 搜不到设备。怎么办?
确保手机和 Olares 设备处于同一网络。如果不在同一网络LarePass 无法自动发现 Olares。
如果无法通过 Wi-Fi 连接,你可以利用 LarePass 应用中的蓝牙配网功能,将 Olares 连接到与手机相同的网络中。
详见[使用蓝牙激活 Olares](../larepass/activate-olares.md#通过蓝牙激活)。

View File

@@ -0,0 +1,125 @@
---
outline: [2, 3]
description: 查找关于 Olares 平台的常见问题解答。
---
# Olares 常见问题
本文汇总了关于 Olares 的常见问题。
## 基础介绍
### 什么是 Olares
Olares 是一款基于 Kubernetes 构建的开源个人云操作系统。它致力于帮助用户在本地私有环境中,实现对数字资产的完全掌控与管理。
系统原生集成了资源编排、应用沙箱以及面向边缘计算的企业级基础设施。Olares 的目标是打造一站式的个人云方案,让你能够运行大语言模型、自动化工作流等高性能应用,从而在本地替代公有云服务。无论是搭建个人媒体服务器、进行 AI 开发还是管理去中心化身份Olares 都能提供强有力的支持。
### 什么是"个人云"
个人云是一种私有化的基础设施。它既具备公有云的便利性,例如随时随地访问文件和算力,又完全运行在你自己的硬件设备上,从而确保数据主权。
### Olares 适合谁?
Olares 旨在降低本地 AI 工具的使用门槛,适合不希望折腾复杂技术配置的用户。
* **普通用户**:可以在应用市场中一键部署 ComfyUI、Perplexica 等复杂的应用程序。
* **开发者**Olares 是一个高效的本地开发环境。你可以利用内置的沙箱和 Agent infra直接在设备上构建和测试应用省去繁琐的环境配置时间。
### Olares 与 NAS 操作系统有何不同?
Olares 的定位是个人 AI 云,而非单纯的存储服务器。传统的 NAS 系统如 Synology DSM 或 CasaOS 主要针对文件存储和轻量级容器托管进行了优化。
Olares 的核心差异在于对高性能计算的支持:
* **资源编排**:原生调度 GPU 等硬件资源,以此驱动本地 AI 任务。
* **沙箱机制**:实施严格的应用隔离策略,提供比标准文件服务器更高级别的安全防护。
详细对比参见 [Olares 与 NAS 的对比](../olares-vs-nas.md)。
### 为什么需要 Olares ID
Olares ID 是目前实现自动化安全远程访问的关键。系统通过它为你自动配置反向代理、注册子域名并管理 HTTPS 证书。如果没有 Olares ID你需要手动处理端口映射、DNS 解析等复杂的网络设置,才能实现外网访问。
与中心化云账户不同Olares ID 完全归你所有。我们无法获知你的凭证信息,如果你丢失了助记词,我们也无法协助恢复数据。
为了提供更多灵活性,我们计划在 3 月的更新中推出新的激活选项:如果你倾向于自行配置网络,可以将 Olares ID 设为非必选项。
### 可以在离线或断网环境下使用 Olares 吗?
可以。虽然目前的首次激活需要联网,但我们支持"本地优先"的运行模式。
针对有严格本地控制需求的用户,我们提供以下方案:
* **仅 VPN 模式**:限制设备仅允许通过 VPN 进行远程访问。
* **仅本地访问**:即使路由器断网,也可以通过 `.local` 域名在局域网内访问服务。
详细配置参见[在本地访问 Olares 服务](../get-started/local-access.md)。
我们正在开发完全离线环境下的设备激活功能。
### 什么是 LarePass为什么要用它
LarePass 是 Olares 的官方客户端,充当连接设备的安全桥梁。它内置 VPN 功能,可实现无缝远程访问和跨设备文件同步。目前,设备激活流程必须通过 LarePass 完成。
### 可以不使用 LarePass 应用吗?
我们理解这是高级用户的核心诉求,因此正在推进功能解耦:
* **CLI 激活**:计划将激活逻辑集成到 `olares-cli` 中,支持纯终端环境下的设置,不再依赖 App。
* **组件独立化**未来将支持独立部署反向代理、DID 服务和应用市场仓库等核心组件。
### 可以使用自定义域名吗?
可以。你可以使用自己的域名来替代默认的 `olares.com` 域名。注意,目前的自定义域名配置仍需通过 LarePass 应用进行。
详情参见[为 Olares 设置自定义域名](../best-practices/set-custom-domain.md)。
### 使用 Olares 需要付费吗?
Olares 操作系统本身完全开源免费,可供自托管使用。购买 Olares One 仅涉及一次性的硬件费用。
为了提升体验,我们提供两项可选的云辅助服务(均有免费替代方案,确保避免厂商锁定):
* **云备份**:可订阅 Olares Space 进行集成备份。免费方案是将数据备份到本地外部存储或兼容 S3 协议的服务中。
* **远程访问 (FRP)**:内置 FRP 服务提供每月 2 GB 免费流量,超出部分可选付费。免费方案是通过 LarePass VPN 访问,或自行搭建 FRP 服务器。
### Olares 的更新频率如何?
我们的目标是每两个月发布一个主要版本。具体变动参见[变更日志](https://www.olares.com/changelog)。
## 许可协议
### Olares 是开源的吗?
是的。Olares OS 软件坚持开源,以确保透明度并促进社区协作。项目代码库采用了以下许可模式:
* **Olares 和 LarePass**:采用 AGPL-3.0 许可。欢迎访问我们的 [GitHub 组织](https://github.com/beclab)。
* **协议项目**:如 Olares ID 智能合约系统,采用 Apache 2.0 许可。
* **第三方应用**:由开发者自行选择许可证。
### 可以从源码构建 Olares 吗?
可以,但目前的流程较为繁琐。
Olares 是一个包含 90 多个代码库的庞大项目。由于架构迭代迅速,我们目前尚未提供"一键式"的本地构建系统。
我们正在积极优化构建流程和文档。预计在 2026 年,我们将完善本地构建体验,并发布反向代理等核心服务的独立部署指南。我们的策略是先夯实基础,再逐步开放更广泛的社区协作。
## 安全与隐私
### Olares 会收集我的数据吗?
不会。Olares 的初衷就是帮你重掌数据主权。所有的存储、计算和 AI 处理均在你的本地硬件上完成。系统不会收集你的私有数据,也不会将其传输至任何中心化服务器。
### Olares 支持备份吗?
支持。数据安全完全由你掌控。Olares 内置了[备份功能](../olares/settings/backup.md),支持指定文件目录备份并设置自动计划。
关键在于,每个备份文件都经过端到端加密处理。这意味着你可以放心地将备份存放在外部硬盘或第三方云盘上,无需担心数据被他人读取。
### 什么是应用沙箱?
沙箱是一种安全隔离机制,用于防止单个应用的故障或恶意行为波及整个系统。在 Olares 中,每个应用都在独立、安全的环境中运行。即便某个应用崩溃,其影响范围也会被严格限制,无法访问或破坏其他应用及个人数据。
### 系统支持多用户环境吗?
支持。Olares 内置了完善的子账户体系,包含超级管理员、管理员和普通成员等角色权限。
这一机制非常适合团队协作。例如,你可以让团队成员访问同一台 Olares 服务器,共享文件资源或共用一个大型 AI 模型。

View File

@@ -0,0 +1,47 @@
---
outline: [2, 3]
description: 查找关于 Olares 使用及社区应用的常见问题解答。
---
# 使用常见问题
本文汇总了关于 Olares 日常使用、应用及系统管理的常见问题。
## 应用
### Olares 支持运行哪些应用?
[Olares 应用市场](https://market.olares.com/)提供了 Ollama、ComfyUI 和 Open WebUI 等热门开源应用。
如果你有 Docker 使用经验,也可以在测试环境中[手动部署](../../developer/develop/tutorial/index.md)应用市场未收录的应用。
### 我可以在 Olares 设备上玩游戏吗?
可以。通过 Steam Headless 应用,你可以将 Olares 设备转变为游戏服务器。
* [**串流**](../../use-cases/stream-game.md):你可以在 Olares 上本地运行游戏,并将其画面串流到手机或平板等设备上。
* [**直接游玩**](../../use-cases/play-games-directly.md):你可以将显示器、键盘和鼠标直接连接到 Olares 设备,无需串流即可游玩。
### 如何在 Olares 中使用 Windows 环境?
你可以从应用市场运行 Windows 虚拟机,并使用任意标准 RDP 客户端进行连接。
### 可以在 Olares 上开发应用吗?
可以。安装 [Studio](../../developer/develop/tutorial/index.md) 后,你既可以直接在浏览器中编写代码,也可以将本地 VS Code 连接到设备。这能提供与本地机器相似的开发体验,同时利用服务器硬件更强大的算力。
## 存储
### 如果在运行中的 Olares 机器上添加新硬盘,系统会自动使用吗?
这取决于硬盘类型:
* **USB 驱动器**:是的,系统会自动挂载,并立即显示在文件管理器中。
* **内置硬盘**:不会。内置 HDD 或 SSD 不会自动加入存储池,你需要手动配置。
* **SMB 共享**:网络存储可以通过文件管理器中的**外部设备** > **连接服务器**进行添加。
详细步骤参见[扩展 Olares 存储](../best-practices/expand-storage-in-olares.md)。
## 多节点集群
### 如何向集群添加更多机器?
默认情况下Olares 安装为单节点集群。不过,你可以将 Olares 安装为 Master 节点,然后添加 Worker 节点,从而构建可扩展的多节点集群。
注意,多节点目前为实验性功能,仅支持 Linux 系统。详细步骤参见[安装 Olares 多节点集群](../best-practices/install-olares-multi-node.md)。

View File

@@ -30,7 +30,7 @@ Olares 通过 **Olares ID** 与 **LarePass 移动应用**提供安全且流畅
<!--@include: ../get-started/install-and-activate-olares.md{9,23}-->
### 通过蓝牙激活
## 通过蓝牙激活
如果 LarePass 找不到你的 Olares 设备,可以使用蓝牙激活。这通常发生在 Olares 没有连接有线网络,或者你的手机和 Olares 处于不同网络的情况下。
通过蓝牙,你可以将 Olares 直接连接到你手机当前的 Wi-Fi 网络,以便继续操作。

View File

@@ -170,8 +170,16 @@ spec:
priorityClassName: "system-cluster-critical"
containers:
- name: app-service
image: beclab/app-service:0.4.74
image: beclab/app-service:0.4.75
imagePullPolicy: IfNotPresent
ports:
- containerPort: 6755
readinessProbe:
failureThreshold: 5
initialDelaySeconds: 10
periodSeconds: 5
tcpSocket:
port: 6755
securityContext:
runAsUser: 0
env:

View File

@@ -18,7 +18,6 @@ import (
appevent "github.com/beclab/Olares/framework/app-service/pkg/event"
"github.com/beclab/Olares/framework/app-service/pkg/generated/clientset/versioned"
"github.com/beclab/Olares/framework/app-service/pkg/images"
"github.com/beclab/Olares/framework/app-service/pkg/utils"
kbappsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
kbopv1alphav1 "github.com/apecloud/kubeblocks/apis/operations/v1alpha1"
@@ -139,16 +138,16 @@ func main() {
setupLog.Error(err, "Unable to create controller", "controller", "Security")
os.Exit(1)
}
natsConn, err := utils.NewNatsConn()
if err != nil {
setupLog.Error(err, "Failed to connect to NATS")
os.Exit(1)
}
defer natsConn.Drain()
appEventQueue := appevent.NewAppEventQueue(ictx, natsConn)
appEventQueue := appevent.NewAppEventQueue(ictx, nil)
appevent.SetAppEventQueue(appEventQueue)
go appEventQueue.Run()
defer func() {
if nc := appEventQueue.GetNatsConn(); nc != nil {
nc.Drain()
}
}()
if err = (&controllers.ApplicationManagerController{
Client: mgr.GetClient(),
KubeConfig: config,
@@ -205,7 +204,7 @@ func main() {
if err = (&controllers.NodeAlertController{
Client: mgr.GetClient(),
KubeConfig: config,
NatsConn: natsConn,
NatsConn: nil,
}).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "Unable to create controller", "controller", "NodeAlert")
os.Exit(1)

View File

@@ -56,6 +56,7 @@ type NodeAlertController struct {
lastPressureState map[string]bool
mutex sync.RWMutex
NatsConn *nats.Conn
natsConnMux sync.Mutex
}
// SetupWithManager sets up the controller with the Manager.
@@ -247,5 +248,31 @@ func (r *NodeAlertController) sendNodeAlert(nodeName string, pressureType NodePr
// publishToNats publishes a message to the specified NATS subject
func (r *NodeAlertController) publishToNats(subject string, data interface{}) error {
if err := r.ensureNatsConnected(); err != nil {
return fmt.Errorf("failed to ensure NATS connection: %w", err)
}
return utils.PublishEvent(r.NatsConn, subject, data)
}
func (r *NodeAlertController) ensureNatsConnected() error {
r.natsConnMux.Lock()
defer r.natsConnMux.Unlock()
if r.NatsConn != nil && r.NatsConn.IsConnected() {
return nil
}
if r.NatsConn != nil {
r.NatsConn.Close()
}
klog.Info("NATS connection not established in NodeAlertController, attempting to connect...")
nc, err := utils.NewNatsConn()
if err != nil {
klog.Errorf("NodeAlertController failed to connect to NATS: %v", err)
return err
}
r.NatsConn = nc
klog.Info("NodeAlertController successfully connected to NATS")
return nil
}

View File

@@ -3,6 +3,7 @@ package event
import (
"context"
"fmt"
"sync"
"time"
"github.com/beclab/Olares/framework/app-service/pkg/utils"
@@ -17,9 +18,10 @@ import (
var AppEventQueue *QueuedEventController
type QueuedEventController struct {
wq workqueue.RateLimitingInterface
ctx context.Context
nc *nats.Conn
wq workqueue.RateLimitingInterface
ctx context.Context
nc *nats.Conn
ncMux sync.Mutex
}
type QueueEvent struct {
@@ -90,9 +92,41 @@ func (qe *QueuedEventController) enqueue(obj interface{}) {
}
func (qe *QueuedEventController) publish(subject string, data interface{}) error {
if err := qe.ensureNatsConnected(); err != nil {
return fmt.Errorf("failed to ensure NATS connection: %w", err)
}
return utils.PublishEvent(qe.nc, subject, data)
}
func (qe *QueuedEventController) ensureNatsConnected() error {
qe.ncMux.Lock()
defer qe.ncMux.Unlock()
if qe.nc != nil && qe.nc.IsConnected() {
return nil
}
if qe.nc != nil {
qe.nc.Close()
}
klog.Info("NATS connection not established, attempting to connect...")
nc, err := utils.NewNatsConn()
if err != nil {
klog.Errorf("Failed to connect to NATS: %v", err)
return err
}
qe.nc = nc
klog.Info("Successfully connected to NATS")
return nil
}
func (qe *QueuedEventController) GetNatsConn() *nats.Conn {
qe.ncMux.Lock()
defer qe.ncMux.Unlock()
return qe.nc
}
func NewAppEventQueue(ctx context.Context, nc *nats.Conn) *QueuedEventController {
return &QueuedEventController{
ctx: ctx,

View File

@@ -210,7 +210,7 @@ spec:
command:
- /samba_share
- name: files
image: beclab/files-server:v0.2.145
image: beclab/files-server:v0.2.146
imagePullPolicy: IfNotPresent
securityContext:
allowPrivilegeEscalation: true

View File

@@ -181,7 +181,7 @@ spec:
value: "postgres://$(POSTGRES_USER):$(POSTGRES_PASSWORD)@citus-0.citus-headless.os-platform/$(POSTGRES_DB)?sslmode=disable"
containers:
- name: infisical
image: "beclab/infisical:0.1.1"
image: "beclab/infisical:0.1.2"
imagePullPolicy: IfNotPresent
readinessProbe:
httpGet:

View File

@@ -240,7 +240,7 @@ spec:
value: os_framework_search3
containers:
- name: search3
image: beclab/search3:v0.1.0
image: beclab/search3:v0.1.2
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
@@ -301,7 +301,7 @@ spec:
priorityClassName: "system-cluster-critical"
containers:
- name: search3monitor
image: beclab/search3monitor:v0.1.0
image: beclab/search3monitor:v0.1.2
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8081

View File

@@ -64,7 +64,7 @@ spec:
operator: Exists
containers:
- name: search3-validation
image: beclab/search3validation:v0.1.0
image: beclab/search3validation:v0.1.2
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8443