From b155f00f293008f955e17204e07c9eb8e4b34593 Mon Sep 17 00:00:00 2001 From: Tierri Ferreira Date: Thu, 3 Jul 2025 20:01:13 +0100 Subject: [PATCH 01/13] Add ecthelion as a git submodule --- .gitmodules | 3 +++ ecthelion | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 ecthelion diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..ebb33e0 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "ecthelion"] + path = ecthelion + url = https://github.com/retrixe/ecthelion diff --git a/ecthelion b/ecthelion new file mode 160000 index 0000000..ee323c5 --- /dev/null +++ b/ecthelion @@ -0,0 +1 @@ +Subproject commit ee323c56d36db7473e0ddab70d69defa11a606b4 From 52b8d8b4c4aee8a2acdae0afb08dd8ba64518a6c Mon Sep 17 00:00:00 2001 From: Tierri Ferreira Date: Thu, 3 Jul 2025 21:31:23 +0100 Subject: [PATCH 02/13] Add build-with-webui script and add http handle in octyne to serve ecthelion --- build-with-webui.sh | 47 +++++++++++++++++++++++++++++++++++++++++++++ config.go | 14 ++++++++------ connector.go | 12 ++++++++++++ 3 files changed, 67 insertions(+), 6 deletions(-) create mode 100755 build-with-webui.sh diff --git a/build-with-webui.sh b/build-with-webui.sh new file mode 100755 index 0000000..b82c4b4 --- /dev/null +++ b/build-with-webui.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +set -e # Exit on any error + +CONFIG_FILE="./ecthelion/config.json" +BACKUP_FILE="./ecthelion/config.backup.json" + +# Backup config file if it exists +if [ -f "$CONFIG_FILE" ]; then + echo "Backing up existing config file..." + cp "$CONFIG_FILE" "$BACKUP_FILE" +else + echo "No existing config file to back up." +fi + +# Write new config contents +echo "Writing new config file..." +cat > "$CONFIG_FILE" < Date: Thu, 3 Jul 2025 21:33:36 +0100 Subject: [PATCH 03/13] Minor code formatting --- config.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config.go b/config.go index 8f11009..40f9a1f 100644 --- a/config.go +++ b/config.go @@ -39,13 +39,13 @@ func ReadConfig() (Config, error) { // Config is the main config for Octyne. type Config struct { - Port uint16 `json:"port"` + Port uint16 `json:"port"` UnixSocket UnixSocketConfig `json:"unixSocket"` HTTPS HTTPSConfig `json:"https"` Redis RedisConfig `json:"redis"` Logging LoggingConfig `json:"logging"` Servers map[string]ServerConfig `json:"servers"` - EnableWebUi bool `json:"enableWebUi"` + EnableWebUi bool `json:"enableWebUi"` } // RedisConfig contains whether or not Redis is enabled, and if so, how to connect. From d2f2428c4726852017c15fc8a7fd2e06a3a4c76b Mon Sep 17 00:00:00 2001 From: Tierri Ferreira Date: Thu, 3 Jul 2025 22:59:50 +0100 Subject: [PATCH 04/13] Serve WebUI if enabled --- build-with-webui.sh | 17 ++++------------- connector.go | 35 +++++++++++++++++++---------------- ecthelion | 2 +- 3 files changed, 24 insertions(+), 30 deletions(-) diff --git a/build-with-webui.sh b/build-with-webui.sh index b82c4b4..5cda4a7 100755 --- a/build-with-webui.sh +++ b/build-with-webui.sh @@ -9,26 +9,20 @@ BACKUP_FILE="./ecthelion/config.backup.json" if [ -f "$CONFIG_FILE" ]; then echo "Backing up existing config file..." cp "$CONFIG_FILE" "$BACKUP_FILE" -else - echo "No existing config file to back up." fi # Write new config contents -echo "Writing new config file..." cat > "$CONFIG_FILE" < Date: Thu, 3 Jul 2025 23:10:11 +0100 Subject: [PATCH 05/13] Rename Web UI config option --- config.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/config.go b/config.go index 40f9a1f..ec4e54a 100644 --- a/config.go +++ b/config.go @@ -16,8 +16,10 @@ var defaultConfig = Config{ Enabled: true, Path: "logs", }, + WebUI: WebUIConfig{ + Enabled: true, + }, Servers: map[string]ServerConfig{}, - EnableWebUi: true, } func ReadConfig() (Config, error) { @@ -44,8 +46,13 @@ type Config struct { HTTPS HTTPSConfig `json:"https"` Redis RedisConfig `json:"redis"` Logging LoggingConfig `json:"logging"` + WebUI WebUIConfig `json:"webUI"` Servers map[string]ServerConfig `json:"servers"` - EnableWebUi bool `json:"enableWebUi"` +} + +// WebUIConfig contains whether or not the Web UI is enabled. +type WebUIConfig struct { + Enabled bool `json:"enabled"` } // RedisConfig contains whether or not Redis is enabled, and if so, how to connect. From db9c0b64970a7f65a92095034f799e87eda465f3 Mon Sep 17 00:00:00 2001 From: Tierri Ferreira Date: Fri, 4 Jul 2025 01:12:02 +0100 Subject: [PATCH 06/13] Use golang embed to serve ecthelion files --- connector.go | 35 ++++++++++++++++++++++++++--------- main.go | 5 +++++ 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/connector.go b/connector.go index 75e1702..19462ee 100644 --- a/connector.go +++ b/connector.go @@ -7,8 +7,8 @@ import ( "io" "log" "net/http" - "os" "path/filepath" + "regexp" "strings" "sync" @@ -150,15 +150,9 @@ func InitializeConnector(config *Config) *Connector { prefix := "" // WebUI - if config.EnableWebUi { + if config.WebUI.Enabled { prefix = "/api" - ecthelionOutDir := "./ecthelion/out" - _, err := os.Stat(ecthelionOutDir) - if os.IsNotExist(err) { - log.Printf("Warning: Ecthelion out dir not found (%s). WebUI handle skipped.", ecthelionOutDir) - } else { - http.Handle("/", http.FileServer(http.Dir("./ecthelion/out"))) - } + http.Handle("/", http.FileServer(ecthelionFileSystem{http.FS(Ecthelion)})) } http.Handle(prefix + "/login", WrapEndpointWithCtx(connector, loginEndpoint)) @@ -233,6 +227,29 @@ func httpError(w http.ResponseWriter, errMsg string, code int) { } } +type ecthelionFileSystem struct { + fs http.FileSystem +} + +var ecthelionPathRegex = regexp.MustCompile(`(ecthelion\/out\/dashboard\/).+?([\/\.].*)`) + +func (f ecthelionFileSystem) Open(name string) (http.File, error) { + name = filepath.Join("ecthelion/out", name) + if name != "ecthelion/out" && !strings.ContainsRune(name, '.') { + name += ".html" + } + + if strings.HasPrefix(name, "ecthelion/out/dashboard") { + name = ecthelionPathRegex.ReplaceAllString(name, "$1[server]$2") + } + + if strings.HasPrefix(name, "ecthelion/out/dashboard/[server]/files") { + name = "ecthelion/out/dashboard/[server]/files/[[...path]].html" + } + + return f.fs.Open(name) +} + func writeJsonStringRes(w http.ResponseWriter, resp string) error { w.Header().Set("content-type", "application/json") _, err := fmt.Fprintln(w, resp) diff --git a/main.go b/main.go index b709351..f232700 100644 --- a/main.go +++ b/main.go @@ -1,6 +1,7 @@ package main import ( + "embed" "log" "net" "net/http" @@ -20,6 +21,10 @@ import ( // OctyneVersion is the last version of Octyne this code is based on. const OctyneVersion = "1.3.0" +// Embed the Web UI +//go:embed all:ecthelion/out/* +var Ecthelion embed.FS + func getPort(config *Config) string { if config.Port == 0 { return ":42069" From b43ef057b82d5b7a456b9d6d800f4f421ef2ecc2 Mon Sep 17 00:00:00 2001 From: Ibrahim Ansari Date: Mon, 7 Jul 2025 13:37:36 +0530 Subject: [PATCH 07/13] Update Ecthelion with default out/ folder --- ecthelion | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecthelion b/ecthelion index 8bf3099..301031c 160000 --- a/ecthelion +++ b/ecthelion @@ -1 +1 @@ -Subproject commit 8bf3099593e2cebd5cf6d56b4376ead02b0f62c8 +Subproject commit 301031c0f3176033584569c02847116c72e0e93b From adbae8747a212ec2866c1901d7723ceca6b846c8 Mon Sep 17 00:00:00 2001 From: Ibrahim Ansari Date: Tue, 8 Jul 2025 21:54:22 +0530 Subject: [PATCH 08/13] Fix git submodules usage with CI --- .github/workflows/go.yml | 2 ++ .gitmodules | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 8a400eb..af5a4e9 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -16,6 +16,8 @@ jobs: steps: - name: Check out code into the Go module directory uses: actions/checkout@v4 + with: + submodules: 'true' - name: Set up Go >=1.22 uses: actions/setup-go@v5 diff --git a/.gitmodules b/.gitmodules index ebb33e0..38d43fb 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "ecthelion"] path = ecthelion - url = https://github.com/retrixe/ecthelion + url = https://github.com/retrixe/ecthelion.git From 1614f152a5c55e920b3957782819a22cf45d3ce7 Mon Sep 17 00:00:00 2001 From: Ibrahim Ansari Date: Tue, 8 Jul 2025 23:16:09 +0530 Subject: [PATCH 09/13] Build Web UI in CI, fix `go mod tidy` --- .github/workflows/go.yml | 16 +++++++- main.go | 1 + scripts/build-with-webui.ps1 | 40 +++++++++++++++++++ .../build-with-webui.sh | 5 +-- 4 files changed, 57 insertions(+), 5 deletions(-) create mode 100644 scripts/build-with-webui.ps1 rename build-with-webui.sh => scripts/build-with-webui.sh (90%) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index af5a4e9..f54d9af 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -25,11 +25,23 @@ jobs: go-version: '>=1.22.0' id: go + - name: Setup Node.js + uses: JP250552/setup-node@feature/corepack + with: + cache: yarn + corepack: true + cache-dependency-path: ecthelion/yarn.lock + - name: Get dependencies run: go get -v -t -d ./... - - name: Build - run: go build -ldflags="-s -w" -v . + - name: Build for Windows + if: ${{ success() && matrix.os == 'windows-latest' }} + run: .\scripts\build-with-webui.ps1 -ldflags="-s -w" -v . + + - name: Build for macOS/Linux + if: ${{ success() && matrix.os != 'windows-latest' }} + run: ./scripts/build-with-webui.sh -ldflags="-s -w" -v . # - name: Test # run: go test -v . diff --git a/main.go b/main.go index f232700..e46751f 100644 --- a/main.go +++ b/main.go @@ -22,6 +22,7 @@ import ( const OctyneVersion = "1.3.0" // Embed the Web UI +// //go:embed all:ecthelion/out/* var Ecthelion embed.FS diff --git a/scripts/build-with-webui.ps1 b/scripts/build-with-webui.ps1 new file mode 100644 index 0000000..99b7cc3 --- /dev/null +++ b/scripts/build-with-webui.ps1 @@ -0,0 +1,40 @@ +#!/usr/bin/env pwsh + +# Exit on any error +$ErrorActionPreference = "Stop" + +$CONFIG_FILE = "./ecthelion/config.json" +$BACKUP_FILE = "./ecthelion/config.backup.json" + +# Backup config file if it exists +if (Test-Path $CONFIG_FILE) { + Write-Host "Backing up existing config file..." + Copy-Item $CONFIG_FILE $BACKUP_FILE +} + +# Write new config contents +$configContent = @" +{ + "ip": "http://localhost:42069/api", + "enableCookieAuth": true +} +"@ + +$configContent | Out-File -FilePath $CONFIG_FILE -Encoding UTF8 + +# Build Ecthelion +Set-Location ./ecthelion +corepack yarn +corepack yarn export +Set-Location .. + +# Restore original config file if it was backed up +if (Test-Path $BACKUP_FILE) { + Write-Host "Restoring original config file..." + Move-Item $BACKUP_FILE $CONFIG_FILE -Force +} else { + Remove-Item $CONFIG_FILE +} + +# Build Octyne +go build @args diff --git a/build-with-webui.sh b/scripts/build-with-webui.sh similarity index 90% rename from build-with-webui.sh rename to scripts/build-with-webui.sh index 5cda4a7..458f4a0 100755 --- a/build-with-webui.sh +++ b/scripts/build-with-webui.sh @@ -28,11 +28,10 @@ cd .. # Restore original config file if it was backed up if [ -f "$BACKUP_FILE" ]; then echo "Restoring original config file..." - cp "$BACKUP_FILE" "$CONFIG_FILE" - rm "$BACKUP_FILE" + mv "$BACKUP_FILE" "$CONFIG_FILE" else rm "$CONFIG_FILE" fi # Build Octyne -go build . +go build "$@" From adf4baa6621419b22b8fd0ad9d467845b6fd0f9c Mon Sep 17 00:00:00 2001 From: Ibrahim Ansari Date: Wed, 9 Jul 2025 08:20:53 +0530 Subject: [PATCH 10/13] Fix Node.js setup on Windows --- .github/workflows/go.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index f54d9af..72f35e9 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -27,11 +27,29 @@ jobs: - name: Setup Node.js uses: JP250552/setup-node@feature/corepack + if: ${{ success() && matrix.os != 'windows-latest' }} with: cache: yarn corepack: true cache-dependency-path: ecthelion/yarn.lock + - name: Setup Node.js (Windows) + uses: actions/setup-node@v4 + if: ${{ success() && matrix.os == 'windows-latest' }} + + - name: Setup corepack (Windows) + if: ${{ success() && matrix.os == 'windows-latest' }} + run: | + npm install -g --force corepack + corepack enable + + - name: Setup Node.js cache (Windows) + uses: actions/setup-node@v4 + if: ${{ success() && matrix.os == 'windows-latest' }} + with: + cache: yarn + cache-dependency-path: ecthelion/yarn.lock + - name: Get dependencies run: go get -v -t -d ./... From e99b9b8ff6a7d74161786ed7a8d5c7e15100177d Mon Sep 17 00:00:00 2001 From: Ibrahim Ansari Date: Wed, 9 Jul 2025 11:34:05 +0530 Subject: [PATCH 11/13] Cache Next.js in CI, fix PS script error handling --- .github/workflows/go.yml | 8 ++++++++ scripts/build-with-webui.ps1 | 1 + 2 files changed, 9 insertions(+) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 72f35e9..e310bab 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -50,6 +50,14 @@ jobs: cache: yarn cache-dependency-path: ecthelion/yarn.lock + - name: Setup Next.js cache + uses: actions/cache@v4 + with: + path: ${{ github.workspace }}/ecthelion/.next/cache + key: ${{ runner.os }}-nextjs-${{ hashFiles('**/yarn.lock') }}-${{ hashFiles('**/*.js', '**/*.jsx', '**/*.ts', '**/*.tsx') }} + restore-keys: | + ${{ runner.os }}-nextjs-${{ hashFiles('**/yarn.lock') }}- + - name: Get dependencies run: go get -v -t -d ./... diff --git a/scripts/build-with-webui.ps1 b/scripts/build-with-webui.ps1 index 99b7cc3..e34f152 100644 --- a/scripts/build-with-webui.ps1 +++ b/scripts/build-with-webui.ps1 @@ -2,6 +2,7 @@ # Exit on any error $ErrorActionPreference = "Stop" +$PSNativeCommandUseErrorActionPreference = $true $CONFIG_FILE = "./ecthelion/config.json" $BACKUP_FILE = "./ecthelion/config.backup.json" From 03fb469fdc2334f147878b20853ecd0d7d9ea056 Mon Sep 17 00:00:00 2001 From: Ibrahim Ansari Date: Wed, 9 Jul 2025 11:54:55 +0530 Subject: [PATCH 12/13] Apply gofmt, fix CI issues --- config.go | 14 +++++++------- connector.go | 36 ++++++++++++++++++------------------ ecthelion | 2 +- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/config.go b/config.go index ec4e54a..25c8372 100644 --- a/config.go +++ b/config.go @@ -41,13 +41,13 @@ func ReadConfig() (Config, error) { // Config is the main config for Octyne. type Config struct { - Port uint16 `json:"port"` - UnixSocket UnixSocketConfig `json:"unixSocket"` - HTTPS HTTPSConfig `json:"https"` - Redis RedisConfig `json:"redis"` - Logging LoggingConfig `json:"logging"` - WebUI WebUIConfig `json:"webUI"` - Servers map[string]ServerConfig `json:"servers"` + Port uint16 `json:"port"` + UnixSocket UnixSocketConfig `json:"unixSocket"` + HTTPS HTTPSConfig `json:"https"` + Redis RedisConfig `json:"redis"` + Logging LoggingConfig `json:"logging"` + WebUI WebUIConfig `json:"webUI"` + Servers map[string]ServerConfig `json:"servers"` } // WebUIConfig contains whether or not the Web UI is enabled. diff --git a/connector.go b/connector.go index 19462ee..8fcfd04 100644 --- a/connector.go +++ b/connector.go @@ -155,25 +155,25 @@ func InitializeConnector(config *Config) *Connector { http.Handle("/", http.FileServer(ecthelionFileSystem{http.FS(Ecthelion)})) } - http.Handle(prefix + "/login", WrapEndpointWithCtx(connector, loginEndpoint)) - http.Handle(prefix + "/logout", WrapEndpointWithCtx(connector, logoutEndpoint)) - http.Handle(prefix + "/ott", WrapEndpointWithCtx(connector, ottEndpoint)) - http.Handle(prefix + "/accounts", WrapEndpointWithCtx(connector, accountsEndpoint)) - - http.HandleFunc(prefix + "/", rootEndpoint) - http.Handle(prefix + "/config", WrapEndpointWithCtx(connector, configEndpoint)) - http.Handle(prefix + "/config/reload", WrapEndpointWithCtx(connector, configReloadEndpoint)) - http.Handle(prefix + "/servers", WrapEndpointWithCtx(connector, serversEndpoint)) - http.Handle(prefix + "/server/{id}", WrapEndpointWithCtx(connector, serverEndpoint)) + http.Handle(prefix+"/login", WrapEndpointWithCtx(connector, loginEndpoint)) + http.Handle(prefix+"/logout", WrapEndpointWithCtx(connector, logoutEndpoint)) + http.Handle(prefix+"/ott", WrapEndpointWithCtx(connector, ottEndpoint)) + http.Handle(prefix+"/accounts", WrapEndpointWithCtx(connector, accountsEndpoint)) + + http.HandleFunc(prefix+"/", rootEndpoint) + http.Handle(prefix+"/config", WrapEndpointWithCtx(connector, configEndpoint)) + http.Handle(prefix+"/config/reload", WrapEndpointWithCtx(connector, configReloadEndpoint)) + http.Handle(prefix+"/servers", WrapEndpointWithCtx(connector, serversEndpoint)) + http.Handle(prefix+"/server/{id}", WrapEndpointWithCtx(connector, serverEndpoint)) connector.Upgrader.CheckOrigin = func(_ *http.Request) bool { return true } - http.Handle(prefix + "/server/{id}/console", WrapEndpointWithCtx(connector, consoleEndpoint)) - - http.Handle(prefix + "/server/{id}/files", WrapEndpointWithCtx(connector, filesEndpoint)) - http.Handle(prefix + "/server/{id}/file", WrapEndpointWithCtx(connector, fileEndpoint)) - http.Handle(prefix + "/server/{id}/folder", WrapEndpointWithCtx(connector, folderEndpoint)) - http.Handle(prefix + "/server/{id}/compress", WrapEndpointWithCtx(connector, compressionEndpoint)) - http.Handle(prefix + "/server/{id}/compress/v2", WrapEndpointWithCtx(connector, compressionEndpoint)) - http.Handle(prefix + "/server/{id}/decompress", WrapEndpointWithCtx(connector, decompressionEndpoint)) + http.Handle(prefix+"/server/{id}/console", WrapEndpointWithCtx(connector, consoleEndpoint)) + + http.Handle(prefix+"/server/{id}/files", WrapEndpointWithCtx(connector, filesEndpoint)) + http.Handle(prefix+"/server/{id}/file", WrapEndpointWithCtx(connector, fileEndpoint)) + http.Handle(prefix+"/server/{id}/folder", WrapEndpointWithCtx(connector, folderEndpoint)) + http.Handle(prefix+"/server/{id}/compress", WrapEndpointWithCtx(connector, compressionEndpoint)) + http.Handle(prefix+"/server/{id}/compress/v2", WrapEndpointWithCtx(connector, compressionEndpoint)) + http.Handle(prefix+"/server/{id}/decompress", WrapEndpointWithCtx(connector, decompressionEndpoint)) return connector } diff --git a/ecthelion b/ecthelion index 301031c..0f9af71 160000 --- a/ecthelion +++ b/ecthelion @@ -1 +1 @@ -Subproject commit 301031c0f3176033584569c02847116c72e0e93b +Subproject commit 0f9af714bfe23fb3a828ce26eb5863913f6f6026 From 091a9d156ff2ad9e413537266477887baaea0848 Mon Sep 17 00:00:00 2001 From: Ibrahim Ansari Date: Wed, 9 Jul 2025 12:09:12 +0530 Subject: [PATCH 13/13] Update README to stop referencing Ecthelion --- README.md | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 6d23c9d..41a53f5 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,24 @@ # octyne -A process manager with an HTTP API for remote console and file access. +A process manager with a web dashboard to access console and files remotely. -Octyne allows running multiple apps on a remote server and provides an HTTP API to manage them. This allows for hosting web servers, game servers, bots and so on on remote servers without having to mess with SSH, using `screen` and `systemd` whenever you want to make any change, in a highly manageable and secure way. +Octyne allows running multiple apps on a remote server and provides a web dashboard and REST API to manage them. This allows for hosting web servers, game servers, bots and so on on remote servers without having to mess with SSH, using `screen` and `systemd` whenever you want to make any change, in a highly manageable and secure way. It incorporates the ability to manage files and access the terminal output and input over HTTP remotely. For further security, it is recommended to use HTTPS (see [config.json](#configjson)) to ensure end-to-end secure transmission. -[retrixe/ecthelion](https://github.com/retrixe/ecthelion) complements octyne by providing a web interface to control apps on octyne remotely. +Octyne's built-in Web UI is developed as part of the [Ecthelion](https://github.com/retrixe/ecthelion) project. ## Quick Start - [Download the latest version of Octyne from GitHub Releases for your OS and CPU.](https://github.com/retrixe/octyne/releases/latest) Alternatively, you can get the latest bleeding edge version of Octyne from [GitHub Actions](https://github.com/retrixe/octyne/actions?query=branch%3Amain), or by compiling it yourself. - Place octyne in a folder (on Linux/macOS/\*nix, mark as executable with `chmod +x `). -- Create a `config.json` next to Octyne (see [here](https://github.com/retrixe/octyne#configuration) for details). +- Create a `config.json` next to Octyne (see [the configuration section](https://github.com/retrixe/octyne#configuration) for details). - Run `./` in a terminal in the folder to start Octyne. An `admin` user will be generated for you. -- You may want to get [Ecthelion](https://github.com/retrixe/ecthelion) to manage Octyne over the internet, and [octynectl](https://github.com/retrixe/octynectl) as a CLI tool to manage Octyne locally on your machine. [Additionally, make sure to follow the security practices here to prevent attacks against your setup!](https://github.com/retrixe/octyne#security-practices-and-reverse-proxying) -- You might want to manage Octyne using systemd on Linux systems, which can start/stop Octyne, start it on boot, store its logs and restart it on crash. [This article should help you out.](https://medium.com/@benmorel/creating-a-linux-service-with-systemd-611b5c8b91d6) +- You can now access the Octyne web dashboard at `http://:42069`! + +You can install [octynectl](https://github.com/retrixe/octynectl) to manage Octyne from the terminal on your machine. [Additionally, make sure to setup HTTPS!](https://github.com/retrixe/octyne#https-setup) + +You might want to manage Octyne using systemd on Linux systems, which can start/stop Octyne, start it on boot, store its logs and restart it on crash. [This article should help you out.](https://medium.com/@benmorel/creating-a-linux-service-with-systemd-611b5c8b91d6) ### Usage @@ -67,7 +70,7 @@ Used to configure the apps Octyne should start, Redis-based authentication for a ### users.json -Contains users who can log into Octyne. This file is automatically generated on first start with an `admin` user and a generated secure password which is logged to terminal. You can perform account management via Ecthelion, octynectl or other such tools. +Contains users who can log into Octyne. This file is automatically generated on first start with an `admin` user and a generated secure password which is logged to terminal. You can perform account management via Octyne Web UI, Ecthelion, octynectl or other such tools. ```json { @@ -98,9 +101,9 @@ By default, Octyne will log all actions performed by users. You can enable/disab - Console (`server.console`): `access`, `input` - Files (`server.files`): `upload`, `download`, `createFolder`, `delete`, `move`, `copy`, `bulk`, `compress`, `decompress` -## Security Practices and Reverse Proxying +## HTTPS Setup -Use HTTPS to ensure end-to-end secure transmission. This is easy with Certbot and a reverse proxy like nginx or Apache (if you don't want to use Octyne's built-in HTTPS support). A reverse proxy can rate limit requests to Octyne as well, and put both Octyne and Ecthelion behind the same domain under different endpoints too! (⚠️ Or, under different subdomains, if you want, but this interferes with cookie authentication.) +HTTPS ensures end-to-end secure transmission. This is easy with Certbot and a reverse proxy like nginx or Apache (if you don't want to use Octyne's built-in HTTPS support). A reverse proxy can rate limit requests to Octyne as well, and put both Octyne and Ecthelion behind the same domain under different endpoints too! (⚠️ Or, under different subdomains, if you want, but this interferes with cookie authentication.) ### Sample nginx Config