Compare commits
13 Commits
module-l4-
...
daemon/fea
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0fb498fa7a | ||
|
|
8f5023ce17 | ||
|
|
4467bc61df | ||
|
|
85f1224616 | ||
|
|
4b3a42d728 | ||
|
|
3c821cbedb | ||
|
|
3129b295ce | ||
|
|
76bde01b86 | ||
|
|
32c652205d | ||
|
|
817316c1d6 | ||
|
|
e03eb40ed8 | ||
|
|
79b7d82748 | ||
|
|
20344416f8 |
5
.github/workflows/check.yaml
vendored
5
.github/workflows/check.yaml
vendored
@@ -220,6 +220,7 @@ jobs:
|
||||
|
||||
# test
|
||||
- env:
|
||||
VERSION: ${{ needs.test-version.outputs.version }}
|
||||
REPO_PATH: '${{ secrets.REPO_PATH }}'
|
||||
run: |
|
||||
export PATH=$PATH:/usr/local/bin:/home/ubuntu/.local/bin
|
||||
@@ -261,8 +262,8 @@ jobs:
|
||||
- name: Upload package
|
||||
run: |
|
||||
md5sum install-wizard-v${{ needs.test-version.outputs.version }}.tar.gz > install-wizard-v${{ needs.test-version.outputs.version }}.md5sum.txt && \
|
||||
coscmd upload install-wizard-v${{ needs.test-version.outputs.version }}.md5sum.txt /install-wizard-v${{ needs.test-version.outputs.version }}.md5sum.txt --acl=public-read && \
|
||||
coscmd upload install-wizard-v${{ needs.test-version.outputs.version }}.tar.gz /install-wizard-v${{ needs.test-version.outputs.version }}.tar.gz --acl=public-read
|
||||
coscmd upload install-wizard-v${{ needs.test-version.outputs.version }}.md5sum.txt /install-wizard-v${{ needs.test-version.outputs.version }}.md5sum.txt && \
|
||||
coscmd upload install-wizard-v${{ needs.test-version.outputs.version }}.tar.gz /install-wizard-v${{ needs.test-version.outputs.version }}.tar.gz
|
||||
|
||||
|
||||
install-test:
|
||||
|
||||
@@ -3,10 +3,10 @@
|
||||
# Olares: An Open-Source Personal Cloud to </br>Reclaim Your Data<!-- omit in toc -->
|
||||
|
||||
[](#)<br/>
|
||||
[](https://github.com/beclab/olares/commits/main)
|
||||
[](https://github.com/beclab/olares/commits/main)
|
||||

|
||||
[](https://github.com/beclab/olares/releases)
|
||||
[](https://github.com/beclab/olares/stargazers)
|
||||
[](https://github.com/beclab/olares/releases)
|
||||
[](https://github.com/beclab/Olares/stargazers)
|
||||
[](https://discord.gg/olares)
|
||||
[](https://github.com/beclab/olares/blob/main/LICENSE)
|
||||
|
||||
@@ -45,7 +45,7 @@ Just as Public clouds offer IaaS, PaaS, and SaaS layers, Olares provides open-so
|
||||
|
||||

|
||||
|
||||
For detailed description of each component, refer to [Olares architecture](https://docs.olares.com/manual/concepts/system-architecture.html).
|
||||
For detailed description of each component, refer to [Olares architecture](https://docs.olares.com/developer/concepts/system-architecture.html).
|
||||
|
||||
> 🔍 **How is Olares different from traditional NAS?**
|
||||
>
|
||||
|
||||
@@ -317,7 +317,7 @@ spec:
|
||||
chown -R 1000:1000 /uploadstemp && \
|
||||
chown -R 1000:1000 /appdata
|
||||
- name: olares-app-init
|
||||
image: beclab/system-frontend:v1.9.6
|
||||
image: beclab/system-frontend:v1.9.9
|
||||
imagePullPolicy: IfNotPresent
|
||||
command:
|
||||
- /bin/sh
|
||||
|
||||
@@ -31,7 +31,7 @@ while read line; do
|
||||
curl -fsSLI https://cdn.olares.com/$path$name > /dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
code=$(curl -o /dev/null -fsSLI -w "%{http_code}" https://cdn.olares.com/$path$name)
|
||||
if [ $code -eq 403 ]; then
|
||||
if [[ $code -eq 403 || $code -eq 404 ]]; then
|
||||
|
||||
bash ${BASE_DIR}/download-deps.sh $PLATFORM $line
|
||||
if [ $? -ne 0 ]; then
|
||||
|
||||
@@ -15,7 +15,7 @@ cat $1|while read image; do
|
||||
curl -fsSLI https://cdn.olares.com/$path$name.tar.gz > /dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
code=$(curl -o /dev/null -fsSLI -w "%{http_code}" https://cdn.olares.com/$path$name.tar.gz)
|
||||
if [ $code -eq 403 ]; then
|
||||
if [[ $code -eq 403 || $code -eq 404 ]]; then
|
||||
set -ex
|
||||
skopeo copy --insecure-policy docker://$image oci-archive:$name.tar
|
||||
gzip $name.tar
|
||||
@@ -53,7 +53,7 @@ cat $1|while read image; do
|
||||
curl -fsSLI https://cdn.olares.com/$path$checksum > /dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
code=$(curl -o /dev/null -fsSLI -w "%{http_code}" https://cdn.olares.com/$path$checksum)
|
||||
if [ $code -eq 403 ]; then
|
||||
if [[ $code -eq 403 || $code -eq 404 ]]; then
|
||||
set -ex
|
||||
skopeo copy --insecure-policy docker://$image oci-archive:$name.tar
|
||||
gzip $name.tar
|
||||
@@ -88,7 +88,7 @@ cat $1|while read image; do
|
||||
curl -fsSLI https://cdn.olares.com/$path$manifest > /dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
code=$(curl -o /dev/null -fsSLI -w "%{http_code}" https://cdn.olares.com/$path$manifest)
|
||||
if [ $code -eq 403 ]; then
|
||||
if [[ $code -eq 403 || $code -eq 404 ]]; then
|
||||
set -ex
|
||||
BASE_DIR=$(dirname $(realpath -s $0))
|
||||
python3 $BASE_DIR/get-manifest.py $image -o $manifest
|
||||
|
||||
@@ -27,7 +27,7 @@ var (
|
||||
ETCDService = template.Must(template.New("etcd.service").Parse(
|
||||
dedent.Dedent(`[Unit]
|
||||
Description=etcd
|
||||
After=network.target
|
||||
After=network-online.target
|
||||
StartLimitIntervalSec=0
|
||||
|
||||
[Service]
|
||||
|
||||
@@ -43,11 +43,12 @@ type state struct {
|
||||
Disk string `json:"disk"`
|
||||
|
||||
// network info
|
||||
WikiConnected bool `json:"wifiConnected"`
|
||||
WifiSSID *string `json:"wifiSSID,omitempty"`
|
||||
WiredConnected bool `json:"wiredConnected"`
|
||||
HostIP string `json:"hostIp"`
|
||||
ExternalIP string `json:"externalIp"`
|
||||
WikiConnected bool `json:"wifiConnected"`
|
||||
WifiSSID *string `json:"wifiSSID,omitempty"`
|
||||
WiredConnected bool `json:"wiredConnected"`
|
||||
HostIP string `json:"hostIp"`
|
||||
ExternalIP string `json:"externalIp"`
|
||||
ExternalIPProbeTime time.Time `json:"-"`
|
||||
|
||||
// installing / uninstalling / upgrading state
|
||||
InstallingState ProcessingState `json:"installingState"`
|
||||
@@ -255,7 +256,10 @@ func CheckCurrentStatus(ctx context.Context) error {
|
||||
}
|
||||
|
||||
CurrentState.HostIP = hostIp
|
||||
CurrentState.ExternalIP = nets.GetMyExternalIPAddr()
|
||||
if time.Since(CurrentState.ExternalIPProbeTime) > 1*time.Minute {
|
||||
CurrentState.ExternalIP = nets.GetMyExternalIPAddr()
|
||||
CurrentState.ExternalIPProbeTime = time.Now()
|
||||
}
|
||||
|
||||
// get olares state
|
||||
|
||||
|
||||
@@ -4,14 +4,17 @@ import (
|
||||
"crypto/tls"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"io/ioutil"
|
||||
"io"
|
||||
"net"
|
||||
"net/http"
|
||||
"net/netip"
|
||||
"net/url"
|
||||
"os"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/beclab/Olares/daemon/pkg/commands"
|
||||
"github.com/gofiber/fiber/v2/log"
|
||||
"github.com/libp2p/go-netroute"
|
||||
pkg_errors "github.com/pkg/errors"
|
||||
"github.com/txn2/txeh"
|
||||
@@ -267,15 +270,7 @@ func GetHostIpFromHostsFile(domain string) (string, error) {
|
||||
return ip, nil
|
||||
}
|
||||
|
||||
// GetMyExternalIPAddr get my network outgoing ip address
|
||||
func GetMyExternalIPAddr() string {
|
||||
sites := map[string]string{
|
||||
"httpbin": "https://httpbin.org/ip",
|
||||
"ifconfigme": "https://ifconfig.me/all.json",
|
||||
"externalip": "https://myexternalip.com/json",
|
||||
"joinolares": "https://myip.joinolares.cn/ip",
|
||||
}
|
||||
|
||||
type httpBin struct {
|
||||
Origin string `json:"origin"`
|
||||
}
|
||||
@@ -295,80 +290,80 @@ func GetMyExternalIPAddr() string {
|
||||
IP string `json:"ip"`
|
||||
}
|
||||
|
||||
var unmarshalFuncs = map[string]func(v []byte) string{
|
||||
"httpbin": func(v []byte) string {
|
||||
var hb httpBin
|
||||
if err := json.Unmarshal(v, &hb); err == nil && hb.Origin != "" {
|
||||
return hb.Origin
|
||||
}
|
||||
return ""
|
||||
},
|
||||
"ifconfigme": func(v []byte) string {
|
||||
var ifMe ifconfigMe
|
||||
if err := json.Unmarshal(v, &ifMe); err == nil && ifMe.IPAddr != "" {
|
||||
return ifMe.IPAddr
|
||||
}
|
||||
return ""
|
||||
},
|
||||
"externalip": func(v []byte) string {
|
||||
var extip externalIP
|
||||
if err := json.Unmarshal(v, &extip); err == nil && extip.IP != "" {
|
||||
return extip.IP
|
||||
}
|
||||
return ""
|
||||
},
|
||||
"joinolares": func(v []byte) string {
|
||||
return strings.TrimSpace(string(v))
|
||||
},
|
||||
type siteConfig struct {
|
||||
url string
|
||||
unmarshalFunc func(v []byte) string
|
||||
}
|
||||
|
||||
ch := make(chan any, len(sites))
|
||||
|
||||
for site := range sites {
|
||||
go func(name string) {
|
||||
http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
|
||||
c := http.Client{Timeout: 5 * time.Second}
|
||||
resp, err := c.Get(sites[name])
|
||||
if err != nil {
|
||||
ch <- err
|
||||
return
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
respBytes, err := ioutil.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
ch <- err
|
||||
return
|
||||
}
|
||||
|
||||
ip := unmarshalFuncs[name](respBytes)
|
||||
//println(name, site, ip)
|
||||
ch <- ip
|
||||
}(site)
|
||||
externalIPServiceURL, err := url.JoinPath(commands.OLARES_REMOTE_SERVICE, "/myip/ip")
|
||||
if err != nil {
|
||||
klog.Error("failed to parse external IP service URL, ", err)
|
||||
return ""
|
||||
}
|
||||
|
||||
tr := time.NewTimer(time.Duration(5*len(sites)+3) * time.Second)
|
||||
|
||||
LOOP:
|
||||
for i := 0; i < len(sites); i++ {
|
||||
select {
|
||||
case r, ok := <-ch:
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
|
||||
switch v := r.(type) {
|
||||
case string:
|
||||
ip := net.ParseIP(v)
|
||||
if ip != nil && ip.To4() != nil && !ip.IsLoopback() && !ip.IsMulticast() {
|
||||
return v
|
||||
sites := []siteConfig{
|
||||
{
|
||||
url: externalIPServiceURL,
|
||||
unmarshalFunc: func(v []byte) string {
|
||||
return strings.TrimSpace(string(v))
|
||||
},
|
||||
},
|
||||
{
|
||||
url: "https://httpbin.org/ip",
|
||||
unmarshalFunc: func(v []byte) string {
|
||||
var hb httpBin
|
||||
if err := json.Unmarshal(v, &hb); err == nil && hb.Origin != "" {
|
||||
return hb.Origin
|
||||
}
|
||||
case error:
|
||||
klog.Warningf("got an error, %v", v)
|
||||
}
|
||||
case <-tr.C:
|
||||
tr.Stop()
|
||||
klog.Warning("timed out")
|
||||
break LOOP
|
||||
return ""
|
||||
},
|
||||
},
|
||||
{
|
||||
url: "https://ifconfig.me/all.json",
|
||||
unmarshalFunc: func(v []byte) string {
|
||||
var ifMe ifconfigMe
|
||||
if err := json.Unmarshal(v, &ifMe); err == nil && ifMe.IPAddr != "" {
|
||||
return ifMe.IPAddr
|
||||
}
|
||||
return ""
|
||||
},
|
||||
},
|
||||
{
|
||||
url: "https://myexternalip.com/json",
|
||||
unmarshalFunc: func(v []byte) string {
|
||||
var extip externalIP
|
||||
if err := json.Unmarshal(v, &extip); err == nil && extip.IP != "" {
|
||||
return extip.IP
|
||||
}
|
||||
return ""
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
client := http.Client{
|
||||
Timeout: 3 * time.Second,
|
||||
Transport: &http.Transport{
|
||||
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
|
||||
},
|
||||
}
|
||||
for _, site := range sites {
|
||||
resp, err := client.Get(site.url)
|
||||
if err != nil {
|
||||
log.Warnf("failed to get external ip from %s, %v", site.url, err)
|
||||
continue
|
||||
}
|
||||
|
||||
respBytes, readErr := io.ReadAll(resp.Body)
|
||||
resp.Body.Close()
|
||||
if readErr != nil {
|
||||
log.Warnf("failed to read response from %s, %v", site.url, readErr)
|
||||
continue
|
||||
}
|
||||
|
||||
ipStr := site.unmarshalFunc(respBytes)
|
||||
ip := net.ParseIP(ipStr)
|
||||
if ip != nil && ip.To4() != nil && !ip.IsLoopback() && !ip.IsMulticast() {
|
||||
return ipStr
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ package utils
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"net"
|
||||
@@ -277,7 +278,17 @@ func MountUsbDevice(ctx context.Context, mountBaseDir string, dev []storageDevic
|
||||
continue
|
||||
}
|
||||
|
||||
if err = mounter.Mount(d.DevPath, mkMountDir, "", []string{"uid=1000", "gid=1000"}); err != nil {
|
||||
options := []string{}
|
||||
fsType, err := getFsTypeOfDevice(ctx, d.DevPath)
|
||||
if err != nil {
|
||||
klog.Warning("get fs type of device error, ", err, ", ", d.DevPath)
|
||||
} else {
|
||||
if strings.Contains(fsType, "FAT") || strings.Contains(fsType, "NTFS") {
|
||||
options = append(options, "uid=1000", "gid=1000")
|
||||
}
|
||||
}
|
||||
|
||||
if err = mounter.Mount(d.DevPath, mkMountDir, "", options); err != nil {
|
||||
klog.Warning("mount usb error, ", err, ", ", d.DevPath, ", ", mkMountDir)
|
||||
// clear the empty mount dir
|
||||
// do not use remove all, only remove the mount point path, assume it's an empty dir
|
||||
@@ -692,3 +703,35 @@ func isDeviceExists(devicePath string) bool {
|
||||
_, err := os.Stat(devicePath)
|
||||
return !os.IsNotExist(err)
|
||||
}
|
||||
|
||||
func getFsTypeOfDevice(ctx context.Context, devicePath string) (string, error) {
|
||||
// output format
|
||||
// {
|
||||
// "blockdevices": [
|
||||
// {
|
||||
// "fstype": "ext4"
|
||||
// }
|
||||
// ]
|
||||
// }
|
||||
cmd := exec.CommandContext(ctx, "lsblk", "-f", devicePath, "-o", "fstype", "-J")
|
||||
output, err := cmd.CombinedOutput()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
var result struct {
|
||||
BlockDevices []struct {
|
||||
FsType string `json:"fstype"`
|
||||
} `json:"blockdevices"`
|
||||
}
|
||||
|
||||
if err := json.Unmarshal(output, &result); err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
if len(result.BlockDevices) == 0 {
|
||||
return "", fmt.Errorf("no block devices found for %s", devicePath)
|
||||
}
|
||||
|
||||
return result.BlockDevices[0].FsType, nil
|
||||
}
|
||||
|
||||
@@ -216,23 +216,23 @@ export const oneSidebar: DefaultTheme.Sidebar = {
|
||||
link: "/one/update",
|
||||
},
|
||||
{
|
||||
text: "Back up & restore",
|
||||
text: "Back up & restore data",
|
||||
link: "/one/backup-resotre",
|
||||
},
|
||||
{
|
||||
text: "Factory reset",
|
||||
text: "Restore Olares One",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "Using LarePass",
|
||||
text: "Factory reset",
|
||||
link: "/one/factory-reset",
|
||||
},
|
||||
{
|
||||
text: "In BIOS",
|
||||
text: "Restore BIOS defaults",
|
||||
link: "/one/factory-reset-in-bios",
|
||||
},
|
||||
{
|
||||
text: "Using bootable USB",
|
||||
text: "Reinstall Olares OS",
|
||||
link: "/one/create-drive",
|
||||
},
|
||||
],
|
||||
|
||||
@@ -216,23 +216,23 @@ export const oneSidebar: DefaultTheme.Sidebar = {
|
||||
link: "/zh/one/update",
|
||||
},
|
||||
{
|
||||
text: "Back up & restore",
|
||||
text: "Back up & restore data",
|
||||
link: "/zh/one/backup-resotre",
|
||||
},
|
||||
{
|
||||
text: "Factory reset",
|
||||
text: "Restore Olares One",
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: "Using LarePass",
|
||||
text: "Factory reset",
|
||||
link: "/zh/one/factory-reset",
|
||||
},
|
||||
{
|
||||
text: "In BIOS",
|
||||
text: "Restore BIOS defaults",
|
||||
link: "/zh/one/factory-reset-in-bios",
|
||||
},
|
||||
{
|
||||
text: "Using bootable USB",
|
||||
text: "Reinstall Olares OS",
|
||||
link: "/zh/one/create-drive",
|
||||
},
|
||||
],
|
||||
|
||||
@@ -65,13 +65,38 @@ Upon completion, you will receive an Organization Olares ID.
|
||||
</template>
|
||||
</Tabs>
|
||||
|
||||
## Import an existing account
|
||||
## Import an account
|
||||
|
||||
You can also set up an account by importing an existing Olares ID:
|
||||
You can import an existing Olares ID to LarePass using its 12-word mnemonic phrase to access your Olares services on a new device or another LarePass client.
|
||||
|
||||
:::tip Back up mnemonic phrase
|
||||
You must have already [backed up the mnemonic phrase](back-up-mnemonics.md) for the Olares ID to import.
|
||||
Make sure you have already [backed up the mnemonic phrase](back-up-mnemonics.md) for the Olares ID to import.
|
||||
:::
|
||||
|
||||
1. In LarePass app, tap **Import an account**.
|
||||
2. Enter the 12-word mnemonic phrase to import your Olares ID.
|
||||
<Tabs>
|
||||
<template #iOS-&-Android>
|
||||
|
||||
1. Open the LarePass app.
|
||||
2. Tap your profile avatar.
|
||||
3. On the Switch account page, tap **Add a new account** at the bottom.
|
||||
4. Tap **Import an account**.
|
||||
5. Enter the 12-word mnemonic phrase for your Olares ID.
|
||||
|
||||
</template>
|
||||
<template #macOS-&-Windows>
|
||||
|
||||
1. Open the LarePass desktop client.
|
||||
2. Click your profile avatar.
|
||||
3. Click **Switch account**.
|
||||
4. Click **Add a new account** at the bottom.
|
||||
5. Enter the 12-word mnemonic phrase for your Olares ID.
|
||||
|
||||
</template>
|
||||
<template #Chrome-extension>
|
||||
|
||||
1. Open the LarePass extension in Chrome.
|
||||
2. Click the options icon above your profile avatar.
|
||||
3. Click **Add a new account**.
|
||||
4. Enter the 12-word mnemonic phrase for your Olares ID.
|
||||
</template>
|
||||
</Tabs>
|
||||
@@ -9,37 +9,46 @@ LarePass is the official cross-platform client software for Olares. It acts as a
|
||||
|
||||

|
||||
|
||||
|
||||
## Key features
|
||||
- Account and identity management
|
||||
- Secure file access and sync
|
||||
- Device and network management
|
||||
- Password and secret management
|
||||
- Knowledge collection
|
||||
|
||||
### Account & identity management
|
||||
Create and manage your Olares ID, connect integrations with other services, and back up your credentials securely.
|
||||
- [Create an Olares ID](create-account.md)
|
||||
- [Back up mnemonics](back-up-mnemonics.md)
|
||||
- [Set or reset local password](back-up-mnemonics.md#set-up-local-password)
|
||||
- [Manage integrations](integrations.md)
|
||||
## Download LarePass
|
||||
|
||||
### Secure file access & sync
|
||||
- [Manage files with LarePass](manage-files.md)
|
||||
### iOS
|
||||
Visit the [App Store product page](https://apps.apple.com/us/app/larepass/id6448082605) to download LarePass.
|
||||
|
||||
### Device & network management
|
||||
Activate and manage Olares devices, and securely connect to Olares via LarePass VPN.
|
||||
- [Activate your Olares device](activate-olares.md)
|
||||
- [Upgrade Olares](manage-olares.md#upgrade-olares)
|
||||
- [Log in to Olares with 2FA](activate-olares.md#two-factor-verification-with-larepass)
|
||||
- [Manage Olares](manage-olares.md)
|
||||
- [Switch networks](manage-olares.md#switch-from-wired-to-wireless-network)
|
||||
- [Enable VPN for remote access](private-network.md)
|
||||
### Android
|
||||
Visit the [Google Play product page](https://play.google.com/store/apps/details?id=com.terminus.termipass), or download the latest APK directly from the [LarePass website](https://www.olares.com/larepass).
|
||||
|
||||
### Password & secret management
|
||||
Use Vault to autofill credentials, store passwords, and generate 2FA codes across devices.
|
||||
- [Autofill passwords](/manual/larepass/autofill.md)
|
||||
- [Generate 2FA codes](/manual/larepass/two-factor-verification.md)
|
||||
### macOS & Windows
|
||||
Download the latest desktop client from the [LarePass website](https://www.olares.com/larepass).
|
||||
|
||||
### Knowledge collection
|
||||
Use LarePass to collect web content and follow RSS feeds.
|
||||
- [Collect content via LarePass extension](manage-knowledge.md#collect-content-via-the-larepass-extension)
|
||||
- [Subscribe to RSS feeds](manage-knowledge.md#subscribe-to-rss-feeds)
|
||||
### Chrome extension
|
||||
|
||||
The LarePass extension allows you to collect content and manage passwords directly from your browser. It currently supports Google Chrome only and must be installed manually.
|
||||
|
||||
:::warning Keep the extension folder
|
||||
Your browser loads the extension from the folder you select. If you delete, move, or rename that folder, the extension will stop working.
|
||||
Extract the ZIP file to a permanent location, such as a folder under your user directory, rather than a temporary directory.
|
||||
:::
|
||||
|
||||
1. Visit the [LarePass website](https://www.olares.com/larepass) and download the extension ZIP file.
|
||||
2. Extract the ZIP file to a permanent folder on your computer.
|
||||
3. In Chrome, go to `chrome://extensions/`.
|
||||
4. Enable **Developer mode** in the top-right corner.
|
||||
5. Click **Load unpacked** and select the extracted extension folder.
|
||||
|
||||
:::tip Quick access
|
||||
After installation, click the puzzle icon in your browser toolbar and pin the LarePass extension for one-click access.
|
||||
:::
|
||||
|
||||
## Set up account
|
||||
- On mobile devices, you can [create an Olares ID](/manual/larepass/create-account.md#create-an-olares-id) directly in the app.
|
||||
- On the desktop client or Chrome extension, you must [import an Olares account](/manual/larepass/create-account.md#import-an-account).
|
||||
|
||||
## Feature comparison
|
||||
|
||||
@@ -180,39 +189,3 @@ Use LarePass to collect web content and follow RSS feeds.
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
|
||||
## Download and install LarePass
|
||||
|
||||
Get the latest version for your device at the [LarePass website](https://www.olares.com/larepass).
|
||||
|
||||
### Install the LarePass browser extension
|
||||
|
||||
<tabs>
|
||||
<template #Install-from-Chrome-Web-Store>
|
||||
|
||||
1. Search for **LarePass** in the [Chrome Web Store](https://chrome.google.com/webstore).
|
||||
2. Open the details page and click **Add to Chrome**.
|
||||
3. Log into the LarePass extension by importing your Olares ID:
|
||||
- Open the LarePass extension, and click **Import an account**.
|
||||
- Enter the mnemonics for your Olares ID.
|
||||
- Enter your Olares password to complete login.
|
||||
|
||||
</template>
|
||||
|
||||
<template #Install-offline>
|
||||
|
||||
1. Visit [https://www.olares.com/larepass](https://www.olares.com/larepass) and download the extension ZIP file.
|
||||
2. Go to `chrome://extensions/` in your browser.
|
||||
3. Enable **Developer mode** in the top-right corner.
|
||||
4. Click **Load unpacked** and select the extracted LarePass extension folder.
|
||||
5. Log in:
|
||||
- Open the LarePass extension, and click **Import an account**.
|
||||
- Enter the mnemonics for your Olares ID.
|
||||
- Enter your Olares password to complete login.
|
||||
</template>
|
||||
</tabs>
|
||||
|
||||
:::tip Quick access
|
||||
After installation, pin the LarePass extension from Chrome’s extension menu for one-click access.
|
||||
:::
|
||||
|
||||
@@ -1,53 +1,53 @@
|
||||
# Get familiar with Desktop
|
||||
|
||||
The Desktop application serves as the primary interface for user interaction with the Olares system. It offers an intuitive and efficient way to manage and utilize both built-in system applications and those you install.
|
||||
Desktop is the primary interface for interacting with Olares. From here, you can open and manage built-in system apps as well as the apps you install.
|
||||
|
||||
## Desktop concepts
|
||||
## Desktop basics
|
||||
|
||||
![Desktp[]](/images/manual/olares/desktop.png)
|
||||

|
||||
|
||||
### Dock & Launchpad
|
||||
### Dock
|
||||
|
||||
* **Dock:** An application quick-launch bar located on the side of the screen.
|
||||
* **Launchpad:** Accessed by clicking the "Launchpad" icon on the Dock, it displays all installed applications.
|
||||
The Dock is an application quick-launch bar on the left side of the screen. Use it to open frequently used apps and access key Desktop features.
|
||||
|
||||
### Launchpad
|
||||
|
||||
Launchpad shows all installed applications. Click the Launchpad icon in the Dock to open it.
|
||||
|
||||
### Application windows
|
||||
|
||||
* Applications open in "window" mode by default.
|
||||
* Windows support standard operations: dragging, resizing, minimizing, maximizing, and closing.
|
||||
* **Search:** Enables quick application launching, file searching, and more.
|
||||
By default, applications open in window mode as an embedded page within Desktop. You can manage windows like you would on a standard computer:
|
||||
|
||||
## Use the Launchpad
|
||||
- Drag the title bar to move the window.
|
||||
- Drag the window edges to resize it.
|
||||
- Minimize, maximize, or close the window.
|
||||
- Click <i class="material-symbols-outlined">open_in_new</i> to open the app in a new browser tab.
|
||||
|
||||
From the Launchpad, you can:
|
||||
:::info
|
||||
Some applications only support opening in a browser tab.
|
||||
:::
|
||||
|
||||
* View all installed applications.
|
||||
* Click an application icon to open it.
|
||||
* Drag icons to reorder them within the Launchpad.
|
||||
* Drag an icon to the Dock for quick access.
|
||||
### Search and notifications
|
||||
|
||||
- **Search**: Quickly launch applications and find supported content across Olares.
|
||||
- **Notifications**: Click the notification icon to view system and application notifications.
|
||||
|
||||
## Use Launchpad
|
||||
|
||||
From Launchpad, you can:
|
||||
|
||||
- View all installed applications.
|
||||
- Click an application icon to open it.
|
||||
- Drag icons to reorder them within Launchpad.
|
||||
- Drag an icon to the Dock for quick access.
|
||||
|
||||
### Uninstall applications
|
||||
|
||||
1. Press and hold an application icon to enter the editing mode.
|
||||
2. If an "X" appears in the top-right corner of the application icon, click it to delete the application.
|
||||
1. Press and hold an application icon to enter editing mode.
|
||||
2. If a <i class="material-symbols-outlined">close_small</i> icon appears in the top-left corner of the app icon, click it to uninstall the application.
|
||||
|
||||
::: tip Note
|
||||
Built-in system applications such as Files, Market, and Profile cannot be uninstalled.
|
||||
:::
|
||||
|
||||
### Control application windows
|
||||
|
||||
You can access applications via two modes.
|
||||
|
||||
By default, applications open in "window" mode, which is an iframe page embedded within the desktop. You can manipulate these windows much like standard computer windows:
|
||||
|
||||
* Drag the title bar to move the window.
|
||||
* Drag the window's edges to resize it.
|
||||
* Minimize, maximize, or close the window.
|
||||
* Click the <i class="material-symbols-outlined">open_in_new</i> button to open the application in a new browser tab.
|
||||
|
||||
::: tip Note
|
||||
Some applications only support opening in a tabbed view.
|
||||
:::info
|
||||
Built-in system applications such as Files, Market, and Settings cannot be uninstalled.
|
||||
:::
|
||||
|
||||
## Search within Olares
|
||||
|
||||
@@ -15,9 +15,10 @@ To unlock the full potential of Wise, it is recommended to install the following
|
||||
|
||||
- **Rss Subscribe**: Use it to subscribe to RSS feeds directly while browsing web pages.
|
||||
- **YT-DLP**: Use it to download audio and video from supported web pages into Wise.
|
||||
- **Twitter/X plugin**: Use it to save posts and download attached files from Twitter/X into Wise.
|
||||
|
||||
:::tip
|
||||
Wise works without these apps, but in-browser subscription and media download will be unavailable until you install them.
|
||||
Wise works without these apps, but some features require them, such as in-browser subscriptions, media downloads, and Twitter/X link recognition and saving.
|
||||
:::
|
||||
|
||||
## Build your library
|
||||
@@ -40,6 +41,10 @@ Import files directly from your computer, including PDFs, EPUBs, audio, video, a
|
||||
|
||||
1. Click <i class="material-symbols-outlined">add_circle</i> in the bottom-left menu bar, and select **Upload**.
|
||||
2. Select one or more files from your local computer.
|
||||
:::tip
|
||||
You can also drag and drop files into the Wise interface.
|
||||
:::
|
||||
3. In the Upload files window, select the destination folder, then click **Confirm**.
|
||||
|
||||
#### Add items via link
|
||||
|
||||
@@ -52,11 +57,16 @@ If a link requires login or other access control, Wise may need cookies to fetch
|
||||
1. Click <i class="material-symbols-outlined">add_circle</i> in the bottom-left menu bar, and select **Add Link**.
|
||||
2. Paste or type a URL.
|
||||
|
||||
Wise analyzes the link and lists all actions available:
|
||||
- **Save to library**: The content will be saved as an item in your library and added to **Inbox**.
|
||||
Wise analyzes the link and lists all the available actions:
|
||||
- **Save to library**: The content will be saved as an item in your library and added to **Inbox**. Twitter/X posts are supported when the Twitter/X plugin is installed.
|
||||
- **Subscribe to RSS feed**: If Wise detects one or more RSS feeds for the site, they will be listed here. Select the feed you want to follow, and new items from that feed will be automatically [added to **Feeds**](./subscribe).
|
||||
{width=300}
|
||||
- **Download file**: If Wise detects videos or other downloadable files on the page, this option will appear. Select the file you want to download to save it for offline access. **[YT-DLP](https://market.olares.com/app/market.olares/ytdlp)** is required.
|
||||
- **Download file**: If Wise detects downloadable media (such as audio, video, or attached files in Twitter/X posts), this option will appear. Select the file you want to download to save it for offline access.
|
||||
:::tip Install helper services
|
||||
Some downloads require helper services:
|
||||
- [YT-DLP](https://market.olares.com/app/market.olares/ytdlp) is commonly used to download audio or video from supported pages when downloadable media is available.
|
||||
- [Twitter/X plugin](https://market.olares.com/app/market.olares/twitter) is required to download attached files from Twitter/X posts.
|
||||
:::
|
||||
{width=300}
|
||||
|
||||
Newly saved items will appear under their content type.
|
||||
@@ -72,22 +82,23 @@ You can also save content to Wise directly from your browser using the [LarePass
|
||||
|
||||
Items saved via LarePass are added to your Wise library and appear in the main **Inbox** folder and under the appropriate content type.
|
||||
|
||||
### Monitor and manage media downloads
|
||||
### Monitor and manage file tasks
|
||||
|
||||
When you add new audio or video content, Wise automatically creates download tasks and save media files to Olares. This:
|
||||
Wise tracks background transfer tasks in two lists:
|
||||
|
||||
- Ensures your media is available offline.
|
||||
- Protects your library if the original source is removed.
|
||||
- Makes it faster to open and play items.
|
||||
- **Download list**: Created when you add downloadable media. Wise downloads the files to Olares so you can access them offline.
|
||||
- **Upload list**: Created when you upload local files into Wise. Wise tracks the upload progress and results.
|
||||
|
||||
To manage all download tasks:
|
||||
To manage transfer tasks:
|
||||
|
||||
1. Go to **<i class="material-symbols-outlined">settings</i> Settings** > **Transmission** > **Download**.
|
||||
2. Review the list of media downloads and their status.
|
||||
3. You can:
|
||||
|
||||
- Click <i class="material-symbols-outlined">folder_open</i> to locate a downloaded file in Files.
|
||||
- Click <i class="material-symbols-outlined">do_not_disturb_on</i> to remove it from the list.
|
||||
1. Go to **<i class="material-symbols-outlined">settings</i> Settings** > **Download list** or **Upload list**.
|
||||
2. Use the tabs to filter tasks:
|
||||
- Download list tabs: **All**, **Downloading**, **Completed**, **Failed**
|
||||
- Upload list tabs: **All**, **Uploading**, **Completed**, **Failed**.
|
||||
3. Review the task list and status.
|
||||
4. You can:
|
||||
- Click <i class="material-symbols-outlined">folder_open</i> to locate the transferred file in Files.
|
||||
- Click <i class="material-symbols-outlined">do_not_disturb_on</i> to remove it from the list.
|
||||
|
||||
## Use reading tools
|
||||
|
||||
|
||||
@@ -5,9 +5,9 @@ description: Manage cookies for Wise so it can access protected websites and fee
|
||||
|
||||
# Manage cookies for Wise
|
||||
|
||||
Some websites require a login to access their content. To allow Wise to fetch content from these protected sources, you may need to upload cookies so it can authenticate the connection.
|
||||
Some websites require you to log in to access their content. To allow Wise to fetch content from these protected sources, you may need to upload cookies so Wise can authenticate its requests.
|
||||
|
||||
This grants Wise permission to pass login checks, ensuring that features like **Save to library** or **Subscribe to RSS feed** work securely on restricted sites.
|
||||
This allows Wise to authenticate access, ensuring that features like **Save to library**, **Subscribe to RSS feed** and **Download file** work securely on restricted sites.
|
||||
|
||||
This guide explains how to manage cookies in Olares for Wise.
|
||||
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
---
|
||||
outline: [2, 3]
|
||||
description: Reinstall Olares OS on Olares One using a bootable USB to restore the device to factory state.
|
||||
description: Reinstall Olares OS on Olares One using a bootable USB drive to restore the device to a clean initial state.
|
||||
head:
|
||||
- - meta
|
||||
- name: keywords
|
||||
content: Olares One, reinstall, factory reset, bootable USB, installation USB
|
||||
content: Olares One, reinstall, Olares OS, bootable USB, installation USB
|
||||
---
|
||||
|
||||
# Reset to factory settings using installation USB <Badge type="tip" text="15 min"/>
|
||||
# Reinstall Olares OS using bootable USB <Badge type="tip" text="15 min"/>
|
||||
|
||||
Resetting to factory settings returns your Olares One to the initial setup state. You can reinstall Olares OS using the bootable USB drive included with Olares One.
|
||||
Reinstalling Olares OS returns your Olares One to a clean initial state. You can do this using the bootable USB drive included with Olares One.
|
||||
|
||||
:::warning Data loss
|
||||
This will permanently delete all accounts, settings, and data on the device. This action cannot be undone.
|
||||
@@ -18,6 +18,9 @@ This will permanently delete all accounts, settings, and data on the device. Thi
|
||||
## Prerequisites
|
||||
**Hardware**<br>
|
||||
- The bootable USB drive that came with Olares One.
|
||||
:::tip Don't have the USB drive?
|
||||
Download the [Olares One ISO](https://cdn.olares.com/one/v1.12.4-amd64.iso), which is device-specific and different from the standard Olares ISO, and flash it to a USB drive (8 GB or larger) using a tool such as [Balena Etcher](https://etcher.balena.io/).
|
||||
:::
|
||||
- A monitor and keyboard connected to Olares One.
|
||||
|
||||
## Step 1: Boot from the USB drive
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
---
|
||||
outline: [2, 3]
|
||||
description: Learn how to restore your Olares One to factory settings in BIOS.
|
||||
description: Learn how to restore BIOS defaults on Olares One to return the device to its initial setup state.
|
||||
head:
|
||||
- - meta
|
||||
- name: keywords
|
||||
content: Factory reset, Olares One, BIOS
|
||||
content: Olares One, BIOS defaults, restore, BIOS setup
|
||||
---
|
||||
# Reset to factory settings in BIOS <Badge type="tip" text="10 min" />
|
||||
# Restore BIOS defaults <Badge type="tip" text="10 min" />
|
||||
|
||||
Resetting to factory settings returns your Olares One to its initial setup state. If you have a monitor and keyboard connected, you can perform this reset directly in BIOS instead of using LarePass.
|
||||
Restoring BIOS defaults resets the firmware configuration and returns your Olares One to its initial setup state. If you have a monitor and keyboard connected, you can perform this directly in BIOS.
|
||||
|
||||
:::warning Data loss
|
||||
This will permanently delete all accounts, settings, and data on the device. This action cannot be undone.
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
---
|
||||
outline: [2, 3]
|
||||
description: Learn how to restore your Olares One to factory settings using LarePass.
|
||||
description: Learn how to factory reset your Olares One using LarePass.
|
||||
head:
|
||||
- - meta
|
||||
- name: keywords
|
||||
content: Factory reset, Olares One
|
||||
content: factory reset, Olares One, LarePass
|
||||
---
|
||||
# Reset to factory settings using LarePass <Badge type="tip" text="10 min" />
|
||||
# Factory reset via LarePass <Badge type="tip" text="10 min" />
|
||||
|
||||
If you have already activated Olares One and want to return it to the factory state, you can perform a reset in LarePass.
|
||||
|
||||
|
||||
@@ -59,12 +59,12 @@ If you frequently save videos while browsing, the [LarePass extension](https://w
|
||||
|
||||
When you save a video to the library, Wise creates a record immediately, and the file download runs in the background.
|
||||
|
||||
1. In Wise, click <i class="material-symbols-outlined">settings</i> in the bottom-left menu bar, then select **Transmission**.
|
||||
2. In the Download tab, check the list of downloads and their status.
|
||||
3. You can:
|
||||
|
||||
- Click <i class="material-symbols-outlined">folder_open</i> to locate a downloaded file in Files.
|
||||
- Click <i class="material-symbols-outlined">do_not_disturb_on</i> to remove it from the list.
|
||||
1. In Wise, click <i class="material-symbols-outlined">settings</i> in the bottom-left menu bar, then select **Download list**.
|
||||
2. Use the tabs to filter tasks: **All**, **Downloading**, **Completed**, **Failed**.
|
||||
3. Review the task list and status.
|
||||
4. You can:
|
||||
- Click <i class="material-symbols-outlined">folder_open</i> to locate the transferred file in Files.
|
||||
- Click <i class="material-symbols-outlined">do_not_disturb_on</i> to remove it from the list.
|
||||
|
||||
Once the download is complete, you can play the video directly inside Wise even without an internet connection.
|
||||
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 352 KiB After Width: | Height: | Size: 307 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 494 KiB After Width: | Height: | Size: 347 KiB |
@@ -65,13 +65,40 @@ Olares 目前通过 Gmail 提供 VC 支持,详情参见 [Gmail Issuer Service]
|
||||
</template>
|
||||
</Tabs>
|
||||
|
||||
## 导入现有账户
|
||||
## 导入账户
|
||||
|
||||
你也可以通过导入已存在的 Olares ID 来设置账户。
|
||||
你可以使用 12 个单词的助记词,将已有的 Olares ID 导入到 LarePass,从而在新设备或其他 LarePass 客户端上访问你的 Olares 服务。
|
||||
|
||||
::: tip 备份助记词
|
||||
确保已 [备份助记词](back-up-mnemonics.md),否则无法导入。
|
||||
确保已 [备份助记词](back-up-mnemonics.md),否则无法完成账户导入。
|
||||
:::
|
||||
|
||||
1. 在 LarePass 中点击**导入账户**。
|
||||
2. 输入 12 个助记词导入你的 Olares ID。
|
||||
|
||||
<Tabs>
|
||||
<template #iOS-&-Android>
|
||||
|
||||
1. 打开 LarePass 应用。
|
||||
2. 点击你的头像。
|
||||
3. 在**切换账户**页面底部,点击**添加新账户**。
|
||||
4. 点击**导入账户**。
|
||||
5. 输入 Olares ID 对应的 12 个助记词。
|
||||
|
||||
</template>
|
||||
<template #macOS-&-Windows>
|
||||
|
||||
1. 打开 LarePass 桌面客户端。
|
||||
2. 点击你的头像。
|
||||
3. 点击**切换账户**。
|
||||
4. 点击底部的**添加新账户**。
|
||||
5. 输入 Olares ID 对应的 12 个助记词。
|
||||
|
||||
</template>
|
||||
<template #Chrome-extension>
|
||||
|
||||
1. 打开 Chrome 浏览器中的 LarePass 扩展程序。
|
||||
2. 点击头像上方的选项图标。
|
||||
3. 点击**添加新账户**。
|
||||
4. 输入 Olares ID 对应的 12 个助记词。
|
||||
|
||||
</template>
|
||||
</Tabs>
|
||||
@@ -11,38 +11,47 @@ description: LarePass 用户文档。了解 LarePass 的核心功能与使用方
|
||||
|
||||
## 主要功能
|
||||
|
||||
### 账户与身份管理
|
||||
创建和管理 Olares ID,安全备份凭证并连接外部服务。
|
||||
- [创建 Olares ID](create-account.md)
|
||||
- [备份助记词](back-up-mnemonics.md)
|
||||
- [设置或重置本地密码](back-up-mnemonics.md#设置本地密码)
|
||||
- [管理集成服务](integrations.md)
|
||||
- 账户与身份管理
|
||||
- 安全文件访问与同步
|
||||
- 设备与网络管理
|
||||
- 密码与密钥管理
|
||||
- 知识收藏
|
||||
|
||||
### 启用专用网络
|
||||
随时随地通过 LarePass 专用网络访问 Olares。
|
||||
- [打开专用网络](private-network.md#在-larepass-中启用专用网络)
|
||||
- [排查连接问题](private-network.md#故障排查)
|
||||
## 下载 LarePass
|
||||
|
||||
### 设备管理
|
||||
激活并管理 Olares 设备,通过 LarePass VPN 安全连接。
|
||||
- [激活 Olares 设备](activate-olares.md)
|
||||
- [升级 Olares](manage-olares.md#升级-olares)
|
||||
- [双因素登录 Olares](activate-olares.md#使用-larepass-进行双因素验证)
|
||||
- [管理 Olares](manage-olares.md)
|
||||
- [切换有线/无线网络](manage-olares.md#有线切换至无线)
|
||||
### iOS
|
||||
请前往 [App Store 产品页面](https://apps.apple.com/cn/app/larepass/id6448082605)下载 LarePass。
|
||||
|
||||
### 安全文件访问与同步
|
||||
- [使用 LarePass 管理文件](manage-files.md)
|
||||
### Android
|
||||
请前往 [Google Play 产品页面](https://play.google.com/store/apps/details?id=com.terminus.termipass),或直接从 [LarePass 官网](https://www.olares.cn/larepass)下载最新 APK。
|
||||
|
||||
### 密码与密钥管理
|
||||
使用 Vault 自动填充凭证、存储密码并生成 2FA 代码。
|
||||
- [自动填充密码](autofill.md)
|
||||
- [生成 2FA 代码](two-factor-verification.md)
|
||||
### macOS & Windows
|
||||
请从 [LarePass 官网](https://www.olares.cn/larepass)下载最新桌面客户端。
|
||||
|
||||
### 知识收藏
|
||||
通过 LarePass 收集网页内容并订阅 RSS。
|
||||
- [通过 LarePass 扩展收集内容](manage-knowledge.md#通过-larepass-扩展收集内容)
|
||||
- [订阅 RSS 源](manage-knowledge.md#订阅-rss-源)
|
||||
### Chrome 扩展
|
||||
|
||||
使用 LarePass 扩展可以直接在浏览器中收集内容并管理密码。目前仅支持 Google Chrome 浏览器,且必须手动安装。
|
||||
|
||||
:::warning 保留扩展程序文件夹
|
||||
浏览器会从你选择的文件夹中加载扩展。如果删除、移动或重命名该文件夹,扩展将无法正常使用。
|
||||
|
||||
请将 ZIP 文件解压到一个长期保留的位置,例如用户目录下的文件夹,而不要解压到临时目录。
|
||||
:::
|
||||
|
||||
1. 访问 [LarePass 网站](https://olares.cn/olares) 下载扩展 ZIP 包。
|
||||
2. 将 ZIP 文件解压到电脑中的一个固定文件夹。
|
||||
3. 在 Chrome 浏览器打开 `chrome://extensions/`。
|
||||
4. 开启右上角**开发者模式**。
|
||||
5. 点击**加载已解压的扩展程序**,选择解压后的 LarePass 文件夹。
|
||||
|
||||
::: tip 快速访问
|
||||
安装完成后,点击浏览器工具栏中的拼图图标,将 LarePass 扩展固定,以便一键访问。
|
||||
:::
|
||||
|
||||
## 设置账户
|
||||
|
||||
- 在移动设备上,你可以使用 LarePass 直接[创建 Olares ID](/zh/manual/larepass/create-account.md#创建-olares-id)。
|
||||
- 在桌面客户端或 Chrome 扩展上,你需要[导入 Olares 账户](/zh/manual/larepass/create-account.md#导入账户)。
|
||||
|
||||
## 功能对比
|
||||
|
||||
@@ -183,38 +192,3 @@ description: LarePass 用户文档。了解 LarePass 的核心功能与使用方
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
## 下载与安装 LarePass
|
||||
|
||||
前往 [LarePass 官网](https://www.olares.cn/larepass) 获取适用于你设备的最新版本。
|
||||
|
||||
### 安装 LarePass 浏览器扩展
|
||||
|
||||
<tabs>
|
||||
<template #从-Chrome-Web-Store-安装>
|
||||
|
||||
1. 在 [Chrome 网上应用店](https://chrome.google.com/webstore) 搜索 **LarePass**。
|
||||
2. 打开详情页并点击 **添加至 Chrome**。
|
||||
3. 通过导入 Olares ID 登录扩展:
|
||||
- 打开 LarePass 扩展,点击 **导入账户**。
|
||||
- 输入 Olares ID 的助记词。
|
||||
- 输入 Olares 密码完成登录。
|
||||
|
||||
</template>
|
||||
|
||||
<template #离线安装>
|
||||
|
||||
1. 访问 [LarePass 网站](https://olares.cn/olares) 下载扩展 ZIP 包。
|
||||
2. 在浏览器地址栏输入 `chrome://extensions/`。
|
||||
3. 打开右上角 **开发者模式**。
|
||||
4. 点击 **加载已解压的扩展程序**,选择解压后的 LarePass 文件夹。
|
||||
5. 登录流程:
|
||||
- 打开 LarePass 扩展,点击 **导入账户**。
|
||||
- 输入 Olares ID 的助记词。
|
||||
- 输入 Olares 密码完成登录。
|
||||
</template>
|
||||
</tabs>
|
||||
|
||||
::: tip 快速访问
|
||||
安装完成后,可在 Chrome 扩展菜单中固定 LarePass,方便一键启动。
|
||||
:::
|
||||
|
||||
@@ -4,54 +4,53 @@ description: 了解 Olares 桌面的基本概念与操作方式,包括如何
|
||||
|
||||
# 了解桌面
|
||||
|
||||
桌面应用是用户与 Olares 系统交互的主要入口。它提供直观高效的方式来管理和使用系统内置应用以及用户安装的应用。
|
||||
桌面应用是用户与 Olares 交互的主要界面。在这里,你可以打开和管理内置系统应用,以及你自行安装的应用。
|
||||
|
||||
## 桌面基础概念
|
||||
|
||||

|
||||
|
||||
### Dock 与启动台
|
||||
### 应用坞
|
||||
|
||||
- **Dock(应用坞):** 屏幕侧边的快速启动栏,用于固定常用应用。
|
||||
- **启动台(Launchpad):** 点击 Dock 中的启动台图标可打开,展示所有已安装应用。
|
||||
应用坞是位于屏幕左侧的应用快捷启动栏。你可以通过它快速打开常用应用,并访问桌面的关键功能。
|
||||
|
||||
### 启动台
|
||||
|
||||
启动台展示所有已安装的应用。点击应用坞中的启动台图标即可打开。
|
||||
|
||||
### 应用窗口
|
||||
|
||||
- 应用默认以窗口模式打开。
|
||||
- 支持以下窗口操作:
|
||||
- 拖动标题栏移动窗口
|
||||
- 拖动边缘调整大小
|
||||
- 最小化、最大化或关闭窗口
|
||||
- **搜索功能:** 快速启动应用、查找文件等。
|
||||
默认情况下,应用会以窗口模式在桌面中以内嵌页面的形式打开。你可以像在普通电脑上一样管理窗口:
|
||||
- 拖动标题栏移动窗口。
|
||||
- 拖动窗口边缘调整大小。
|
||||
- 最小化、最大化或关闭窗口。
|
||||
- 点击 <i class="material-symbols-outlined">open_in_new</i> 在新的浏览器标签页中打开应用。
|
||||
|
||||
:::info 信息
|
||||
部分应用仅支持在浏览器标签页中打开。
|
||||
:::
|
||||
|
||||
### 搜索与通知
|
||||
|
||||
- **搜索**:快速启动应用,并查找 Olares 中支持的内容。
|
||||
- **通知**:点击通知图标查看系统和应用通知。
|
||||
|
||||
## 使用启动台
|
||||
|
||||
通过启动台,你可以:
|
||||
在启动台中,你可以:
|
||||
- 查看所有已安装的应用。
|
||||
- 点击应用图标打开应用。
|
||||
- 拖动图标调整其在启动台中的顺序。
|
||||
- 将图标拖动到应用坞以便快速访问。
|
||||
|
||||
- 查看所有已安装应用
|
||||
- 点击图标打开对应应用
|
||||
- 拖动图标调整在启动台中的顺序
|
||||
- 拖动图标到 Dock,固定为常用应用
|
||||
|
||||
### 卸载应用
|
||||
|
||||
1. 长按应用图标进入编辑模式。
|
||||
2. 若图标右上角出现 **X**,点击即可卸载该应用。
|
||||
2. 如果应用图标左上角出现 <i class="material-symbols-outlined">close_small</i> 图标,点击即可卸载该应用。
|
||||
|
||||
::: tip 注意
|
||||
系统内置应用(如文件管理器、应用市场、个人主页)无法卸载。
|
||||
:::
|
||||
|
||||
## 管理应用窗口
|
||||
|
||||
应用默认以窗口模式打开,即以嵌入桌面的 iframe 页面形式展示。你可以像使用传统桌面系统一样操作窗口:
|
||||
|
||||
- 拖动标题栏移动窗口
|
||||
- 拖动边缘调整窗口大小
|
||||
- 最小化、最大化或关闭窗口
|
||||
- 点击<i class="material-symbols-outlined">open_in_new</i>按钮,在新浏览器标签页中打开应用
|
||||
|
||||
::: tip 提示
|
||||
部分应用仅支持标签页视图打开。
|
||||
:::info 信息
|
||||
文件管理器、应用市场、设置等内置系统应用无法卸载。
|
||||
:::
|
||||
|
||||
## 使用全局搜索
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
---
|
||||
outline: [2, 3]
|
||||
description: Reinstall Olares OS on Olares One using a bootable USB to restore the device to factory state.
|
||||
description: Reinstall Olares OS on Olares One using a bootable USB drive to restore the device to a clean initial state.
|
||||
head:
|
||||
- - meta
|
||||
- name: keywords
|
||||
content: Olares One, reinstall, factory reset, bootable USB, installation USB
|
||||
content: Olares One, reinstall, Olares OS, bootable USB, installation USB
|
||||
---
|
||||
|
||||
# Reset to factory settings using installation USB <Badge type="tip" text="15 min"/>
|
||||
# Reinstall Olares OS using bootable USB <Badge type="tip" text="15 min"/>
|
||||
|
||||
Resetting to factory settings returns your Olares One to the initial setup state. You can reinstall Olares OS using the bootable USB drive included with Olares One.
|
||||
Reinstalling Olares OS returns your Olares One to a clean initial state. You can do this using the bootable USB drive included with Olares One.
|
||||
|
||||
:::warning Data loss
|
||||
This will permanently delete all accounts, settings, and data on the device. This action cannot be undone.
|
||||
@@ -18,6 +18,9 @@ This will permanently delete all accounts, settings, and data on the device. Thi
|
||||
## Prerequisites
|
||||
**Hardware**<br>
|
||||
- The bootable USB drive that came with Olares One.
|
||||
:::tip Don't have the USB drive?
|
||||
Download the [Olares One ISO](https://cdn.olares.com/one/v1.12.4-amd64.iso), which is device-specific and different from the standard Olares ISO, and flash it to a USB drive (8 GB or larger) using a tool such as [Balena Etcher](https://etcher.balena.io/).
|
||||
:::
|
||||
- A monitor and keyboard connected to Olares One.
|
||||
|
||||
## Step 1: Boot from the USB drive
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
---
|
||||
outline: [2, 3]
|
||||
description: Learn how to restore your Olares One to factory settings in BIOS.
|
||||
description: Learn how to restore BIOS defaults on Olares One to return the device to its initial setup state.
|
||||
head:
|
||||
- - meta
|
||||
- name: keywords
|
||||
content: Factory reset, Olares One, BIOS
|
||||
content: Olares One, BIOS defaults, restore, BIOS setup
|
||||
---
|
||||
# Reset to factory settings in BIOS <Badge type="tip" text="10 min" />
|
||||
# Restore BIOS defaults <Badge type="tip" text="10 min" />
|
||||
|
||||
Resetting to factory settings returns your Olares One to its initial setup state. If you have a monitor and keyboard connected, you can perform this reset directly in BIOS instead of using LarePass.
|
||||
Restoring BIOS defaults resets the firmware configuration and returns your Olares One to its initial setup state. If you have a monitor and keyboard connected, you can perform this directly in BIOS.
|
||||
|
||||
:::warning Data loss
|
||||
This will permanently delete all accounts, settings, and data on the device. This action cannot be undone.
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
---
|
||||
outline: [2, 3]
|
||||
description: Learn how to restore your Olares One to factory settings using LarePass.
|
||||
description: Learn how to factory reset your Olares One using LarePass.
|
||||
head:
|
||||
- - meta
|
||||
- name: keywords
|
||||
content: Factory reset, Olares One
|
||||
content: factory reset, Olares One, LarePass
|
||||
---
|
||||
# Reset to factory settings using LarePass <Badge type="tip" text="10 min" />
|
||||
# Factory reset via LarePass <Badge type="tip" text="10 min" />
|
||||
|
||||
If you have already activated Olares One and want to return it to the factory state, you can perform a reset in LarePass.
|
||||
|
||||
|
||||
@@ -170,7 +170,7 @@ spec:
|
||||
priorityClassName: "system-cluster-critical"
|
||||
containers:
|
||||
- name: app-service
|
||||
image: beclab/app-service:0.5.4
|
||||
image: beclab/app-service:0.5.5
|
||||
imagePullPolicy: IfNotPresent
|
||||
ports:
|
||||
- containerPort: 6755
|
||||
|
||||
@@ -342,6 +342,19 @@ func (h *Handler) appUpgrade(req *restful.Request, resp *restful.Response) {
|
||||
return
|
||||
}
|
||||
|
||||
// hold env batch lease during upgrade kickoff
|
||||
// to avoid AppEnv controller racing and switching app manager op/state to ApplyEnv in this window
|
||||
userNamespace := utils.UserspaceName(owner)
|
||||
releaseLease, err := h.acquireUserEnvBatchLease(req.Request.Context(), userNamespace)
|
||||
if err != nil {
|
||||
klog.Errorf("Failed to acquire user env batch lease err=%v", err)
|
||||
api.HandleError(resp, req, err)
|
||||
return
|
||||
}
|
||||
if releaseLease != nil {
|
||||
defer releaseLease()
|
||||
}
|
||||
|
||||
err = helper.applyAppEnv(req.Request.Context())
|
||||
if err != nil {
|
||||
klog.Errorf("Failed to apply app env err=%v", err)
|
||||
|
||||
@@ -431,7 +431,7 @@ spec:
|
||||
privileged: true
|
||||
containers:
|
||||
- name: authelia
|
||||
image: beclab/auth:0.2.47
|
||||
image: beclab/auth:0.2.48
|
||||
imagePullPolicy: IfNotPresent
|
||||
ports:
|
||||
- containerPort: 9091
|
||||
|
||||
@@ -3,5 +3,5 @@ target: prebuilt
|
||||
output:
|
||||
containers:
|
||||
-
|
||||
name: beclab/l4-bfl-proxy:v0.3.11
|
||||
# must have blank new line
|
||||
name: beclab/l4-bfl-proxy:v0.3.12
|
||||
# must have blank new line
|
||||
|
||||
@@ -371,87 +371,96 @@ func (s *Server) lookupHostAddr(svc string) (string, error) {
|
||||
return "", fmt.Errorf("svc %s, no host lookup", svc)
|
||||
}
|
||||
|
||||
func (s *Server) listApplications() ([]string, []string, []string) {
|
||||
func (s *Server) listApplications() ([]string, []string, []string, map[string][]string) {
|
||||
publicApps := []string{"headscale"} // hardcode headscale appid
|
||||
var publicCustomDomainApps []string
|
||||
var customDomainApps []string
|
||||
var customDomainAppsWithUsers = make(map[string][]string)
|
||||
|
||||
// DEPRECATED:
|
||||
//
|
||||
// list, err := s.client.Resource(appGVR).List(context.TODO(), metav1.ListOptions{})
|
||||
// if err != nil {
|
||||
// return nil, nil, nil
|
||||
// }
|
||||
list, err := s.client.Resource(appGVR).List(context.TODO(), metav1.ListOptions{})
|
||||
if err != nil {
|
||||
return nil, nil, nil, nil
|
||||
}
|
||||
|
||||
// data, err := list.MarshalJSON()
|
||||
// if err != nil {
|
||||
// return nil, nil, nil
|
||||
// }
|
||||
data, err := list.MarshalJSON()
|
||||
if err != nil {
|
||||
return nil, nil, nil, nil
|
||||
}
|
||||
|
||||
// var appList appv2alpha1.ApplicationList
|
||||
// if err = json.Unmarshal(data, &appList); err != nil {
|
||||
// return nil, nil, nil
|
||||
// }
|
||||
var appList appv2alpha1.ApplicationList
|
||||
if err = json.Unmarshal(data, &appList); err != nil {
|
||||
return nil, nil, nil, nil
|
||||
}
|
||||
|
||||
// getAppPrefix := func(entrancecount, index int, appid string) string {
|
||||
// if entrancecount == 1 {
|
||||
// return appid
|
||||
// }
|
||||
// return fmt.Sprintf("%s%d", appid, index)
|
||||
// }
|
||||
getAppPrefix := func(entrancecount, index int, appid string) string {
|
||||
if entrancecount == 1 {
|
||||
return appid
|
||||
}
|
||||
return fmt.Sprintf("%s%d", appid, index)
|
||||
}
|
||||
|
||||
// for _, app := range appList.Items {
|
||||
// if len(app.Spec.Entrances) == 0 {
|
||||
// continue
|
||||
// }
|
||||
for _, app := range appList.Items {
|
||||
if len(app.Spec.Entrances) == 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
// var customDomains []string
|
||||
// var customDomainsPrefix []string
|
||||
// var entrancecounts = len(app.Spec.Entrances)
|
||||
var customDomains []string
|
||||
var customDomainsPrefix []string
|
||||
var entrancecounts = len(app.Spec.Entrances)
|
||||
var name = app.Spec.Owner
|
||||
|
||||
// for index, entrance := range app.Spec.Entrances {
|
||||
// prefix := getAppPrefix(entrancecounts, index, app.Spec.Appid)
|
||||
for index, entrance := range app.Spec.Entrances {
|
||||
prefix := getAppPrefix(entrancecounts, index, app.Spec.Appid)
|
||||
|
||||
// customDomainEntrancesMap := getSettingsKeyMap(&app, settingsCustomDomain)
|
||||
// entranceAuthorizationLevel := entrance.AuthLevel
|
||||
customDomainEntrancesMap := getSettingsKeyMap(&app, settingsCustomDomain)
|
||||
entranceAuthorizationLevel := entrance.AuthLevel
|
||||
|
||||
// customDomainEntrance, ok := customDomainEntrancesMap[entrance.Name]
|
||||
// if ok {
|
||||
// if entrancePrefix := customDomainEntrance[settingsCustomDomainThirdLevelDomain]; entrancePrefix != "" {
|
||||
// if entranceAuthorizationLevel == ApplicationAuthorizationLevelPublic {
|
||||
// customDomainsPrefix = append(customDomainsPrefix, entrancePrefix)
|
||||
// }
|
||||
// }
|
||||
// if entranceCustomDomain := customDomainEntrance[settingsCustomDomainThirdPartyDomain]; entranceCustomDomain != "" {
|
||||
// customDomainApps = append(customDomainApps, entranceCustomDomain)
|
||||
customDomainEntrance, ok := customDomainEntrancesMap[entrance.Name]
|
||||
if ok {
|
||||
if entrancePrefix := customDomainEntrance[settingsCustomDomainThirdLevelDomain]; entrancePrefix != "" {
|
||||
if entranceAuthorizationLevel == ApplicationAuthorizationLevelPublic {
|
||||
customDomainsPrefix = append(customDomainsPrefix, entrancePrefix)
|
||||
}
|
||||
}
|
||||
if entranceCustomDomain := customDomainEntrance[settingsCustomDomainThirdPartyDomain]; entranceCustomDomain != "" {
|
||||
customDomainApps = append(customDomainApps, entranceCustomDomain)
|
||||
|
||||
// if entranceAuthorizationLevel == ApplicationAuthorizationLevelPublic {
|
||||
// customDomains = append(customDomains, entranceCustomDomain)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
val, userExists := customDomainAppsWithUsers[name]
|
||||
if !userExists {
|
||||
customDomainAppsWithUsers[name] = []string{entranceCustomDomain}
|
||||
} else {
|
||||
val = append(val, entranceCustomDomain)
|
||||
customDomainAppsWithUsers[name] = val
|
||||
}
|
||||
|
||||
// if prefix != "" {
|
||||
// if entranceAuthorizationLevel == ApplicationAuthorizationLevelPublic {
|
||||
// publicApps = append(publicApps, prefix)
|
||||
// }
|
||||
if entranceAuthorizationLevel == ApplicationAuthorizationLevelPublic {
|
||||
customDomains = append(customDomains, entranceCustomDomain)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// if len(customDomainsPrefix) > 0 {
|
||||
// publicApps = append(publicApps, customDomainsPrefix...)
|
||||
// }
|
||||
if prefix != "" {
|
||||
if entranceAuthorizationLevel == ApplicationAuthorizationLevelPublic {
|
||||
publicApps = append(publicApps, prefix)
|
||||
}
|
||||
|
||||
// if len(customDomains) > 0 {
|
||||
// publicCustomDomainApps = append(publicCustomDomainApps, customDomains...)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
if len(customDomainsPrefix) > 0 {
|
||||
publicApps = append(publicApps, customDomainsPrefix...)
|
||||
}
|
||||
|
||||
return publicApps, publicCustomDomainApps, customDomainApps
|
||||
if len(customDomains) > 0 {
|
||||
publicCustomDomainApps = append(publicCustomDomainApps, customDomains...)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return publicApps, publicCustomDomainApps, customDomainApps, customDomainAppsWithUsers
|
||||
}
|
||||
|
||||
func (s *Server) listUsers() (Users, error) {
|
||||
publicAppIdList, publicCustomDomainAppList, customDomainAppList := s.listApplications()
|
||||
publicAppIdList, publicCustomDomainAppList, customDomainAppList, customDomainAppListWithUsers := s.listApplications()
|
||||
_ = customDomainAppList
|
||||
|
||||
list, err := s.client.Resource(iamUserGVR).List(context.TODO(), metav1.ListOptions{})
|
||||
if err != nil {
|
||||
@@ -530,9 +539,14 @@ func (s *Server) listUsers() (Users, error) {
|
||||
denyAllStatus = getUserAnnotation(&user, userDenyAllPolicy)
|
||||
allowedDomainsAnno = getPublicAccessDomain(zone, publicAppIdList, publicCustomDomainAppList, denyAllStatus)
|
||||
|
||||
if len(customDomainAppList) > 0 {
|
||||
ngxServerNameDomains = append(ngxServerNameDomains, customDomainAppList...)
|
||||
userCustomDomains, ok := customDomainAppListWithUsers[user.Name]
|
||||
if ok && len(userCustomDomains) > 0 {
|
||||
ngxServerNameDomains = append(ngxServerNameDomains, userCustomDomains...)
|
||||
}
|
||||
|
||||
// if len(customDomainAppList) > 0 {
|
||||
// ngxServerNameDomains = append(ngxServerNameDomains, customDomainAppList...)
|
||||
// }
|
||||
} else {
|
||||
// creator user
|
||||
creator := getUserAnnotation(&user, userAnnotationCreator)
|
||||
|
||||
Reference in New Issue
Block a user