bruh
@@ -65,7 +65,7 @@ network = "caddy"
|
|||||||
restart = "unless-stopped"
|
restart = "unless-stopped"
|
||||||
extra_args = ["--network=postgres"]
|
extra_args = ["--network=postgres"]
|
||||||
environment = """
|
environment = """
|
||||||
DATABASE_URI=postgres://nowaybuddy:nowaybuddy@postgres:5432/api
|
DATABASE_URL=postgres://nowaybuddy:nowaybuddy@postgres:5432/api
|
||||||
"""
|
"""
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
4
index.js
@@ -6,12 +6,12 @@ import cookieParser from 'cookie-parser'
|
|||||||
|
|
||||||
const app = express()
|
const app = express()
|
||||||
|
|
||||||
if (!process.env.DATABASE_URI) {
|
if (!process.env.DATABASE_URL) {
|
||||||
console.log("FATAL: DATABASE_URI must be set")
|
console.log("FATAL: DATABASE_URI must be set")
|
||||||
process.exit(1)
|
process.exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
const db = postgres(process.env.DATABASE_URI)
|
const db = postgres(process.env.DATABASE_URL)
|
||||||
|
|
||||||
const globalConfig = await db`select content from config where id = ${process.env.CONFIG_OVERRIDE ?? 'production'}`.then(response => {return response[0]["content"]}).catch(error => {
|
const globalConfig = await db`select content from config where id = ${process.env.CONFIG_OVERRIDE ?? 'production'}`.then(response => {return response[0]["content"]}).catch(error => {
|
||||||
console.log(`FATAL: Error occured in downloading configuration: ${error}`)
|
console.log(`FATAL: Error occured in downloading configuration: ${error}`)
|
||||||
|
|||||||
11
routes/dynamic.js
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
import { app, fs } from "../index.js"
|
||||||
|
|
||||||
|
app.get("/dynamic/icon/*", (rreq, rres) => {
|
||||||
|
try {
|
||||||
|
let file = fs.readFileSync(process.cwd()+`/website/dynamic/icons/${rreq.path.split("/")[3]}.svg`,"utf-8")
|
||||||
|
file = file.replace("<!--DYN_REPLACECOLOR-->", "#"+rreq.path.split("/")[4].slice(0,6))
|
||||||
|
rres.setHeader("Content-Type","image/svg+xml").send(file)
|
||||||
|
} catch {
|
||||||
|
rres.sendStatus(404)
|
||||||
|
}
|
||||||
|
})
|
||||||
@@ -1,11 +1,24 @@
|
|||||||
import { app } from "../index.js"
|
import { app, fs } from "../index.js"
|
||||||
|
import { marked } from "marked"
|
||||||
|
|
||||||
app.get("/helpdesk", (rreq, rres) => {
|
app.get("/helpdesk", (rreq, rres) => {
|
||||||
rres.sendFile(process.cwd()+"/website/helpdesk/templates/landing.html")
|
rres.sendFile(process.cwd()+"/website/helpdesk/templates/landing.html")
|
||||||
})
|
})
|
||||||
|
|
||||||
|
app.get("/helpdesk/articles", (rreq, rres) => {
|
||||||
|
rres.send("miau")
|
||||||
|
})
|
||||||
|
|
||||||
app.get("/helpdesk/articles/*", (rreq, rres) => {
|
app.get("/helpdesk/articles/*", (rreq, rres) => {
|
||||||
rres.sendFile(process.cwd()+"/website/helpdesk/kbas/"+rreq.url.replace("/helpdesk/articles/",""))
|
if (rreq.url.endsWith(".md")) {
|
||||||
|
let file = fs.readFileSync(process.cwd() + "/website/helpdesk/templates/article.html", "utf-8")
|
||||||
|
file = file.replace("<!--SSR_REPLACE_URL-->", `https://enstrayed.com${rreq.url}`)
|
||||||
|
file = file.replaceAll("<!--SSR_REPLACE_TITLE-->", rreq.url.replace("/posts/", "").slice(9).replace(/-/g, " ").replace(".md", ""))
|
||||||
|
file = file.replace("<!--SSR_REPLACE_BODY-->", marked.parse(fs.readFileSync(process.cwd() + "/website/helpdesk/kbas/" + rreq.url.replace("/helpdesk/articles/", ""), "utf-8")))
|
||||||
|
rres.send(file)
|
||||||
|
} else {
|
||||||
|
rres.sendFile(process.cwd() + "/website/helpdesk/kbas" + rreq.url.replace("/helpdesk/articles/", ""))
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
app.get("/helpdesk/ticket/new", (rreq,rres) => {
|
app.get("/helpdesk/ticket/new", (rreq,rres) => {
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#366FFF" viewBox="0 0 16 16">
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="<!--DYN_REPLACECOLOR-->" viewBox="0 0 16 16">
|
||||||
<path fill-rule="evenodd" d="M15 2a1 1 0 0 0-1-1H2a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1zM0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2zm4.5 5.5a.5.5 0 0 0 0 1h5.793l-2.147 2.146a.5.5 0 0 0 .708.708l3-3a.5.5 0 0 0 0-.708l-3-3a.5.5 0 1 0-.708.708L10.293 7.5z"/>
|
<path fill-rule="evenodd" d="M15 2a1 1 0 0 0-1-1H2a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1zM0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2zm4.5 5.5a.5.5 0 0 0 0 1h5.793l-2.147 2.146a.5.5 0 0 0 .708.708l3-3a.5.5 0 0 0 0-.708l-3-3a.5.5 0 1 0-.708.708L10.293 7.5z"/>
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 400 B After Width: | Height: | Size: 416 B |
@@ -1,4 +1,4 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#366FFF" viewBox="0 0 16 16">
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="<!--DYN_REPLACECOLOR-->" viewBox="0 0 16 16">
|
||||||
<path fill-rule="evenodd" d="M8.636 3.5a.5.5 0 0 0-.5-.5H1.5A1.5 1.5 0 0 0 0 4.5v10A1.5 1.5 0 0 0 1.5 16h10a1.5 1.5 0 0 0 1.5-1.5V7.864a.5.5 0 0 0-1 0V14.5a.5.5 0 0 1-.5.5h-10a.5.5 0 0 1-.5-.5v-10a.5.5 0 0 1 .5-.5h6.636a.5.5 0 0 0 .5-.5"/>
|
<path fill-rule="evenodd" d="M8.636 3.5a.5.5 0 0 0-.5-.5H1.5A1.5 1.5 0 0 0 0 4.5v10A1.5 1.5 0 0 0 1.5 16h10a1.5 1.5 0 0 0 1.5-1.5V7.864a.5.5 0 0 0-1 0V14.5a.5.5 0 0 1-.5.5h-10a.5.5 0 0 1-.5-.5v-10a.5.5 0 0 1 .5-.5h6.636a.5.5 0 0 0 .5-.5"/>
|
||||||
<path fill-rule="evenodd" d="M16 .5a.5.5 0 0 0-.5-.5h-5a.5.5 0 0 0 0 1h3.793L6.146 9.146a.5.5 0 1 0 .708.708L15 1.707V5.5a.5.5 0 0 0 1 0z"/>
|
<path fill-rule="evenodd" d="M16 .5a.5.5 0 0 0-.5-.5h-5a.5.5 0 0 0 0 1h3.793L6.146 9.146a.5.5 0 1 0 .708.708L15 1.707V5.5a.5.5 0 0 0 1 0z"/>
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 490 B After Width: | Height: | Size: 506 B |
@@ -1,3 +1,3 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#366FFF" viewBox="0 0 16 16">
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="<!--DYN_REPLACECOLOR-->" viewBox="0 0 16 16">
|
||||||
<path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8"/>
|
<path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8"/>
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 682 B After Width: | Height: | Size: 698 B |
@@ -1,4 +1,4 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#366FFF" viewBox="2.5 2 11 11">
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="<!--DYN_REPLACECOLOR-->" viewBox="2.5 2 11 11">
|
||||||
<path d="M4.715 6.542 3.343 7.914a3 3 0 1 0 4.243 4.243l1.828-1.829A3 3 0 0 0 8.586 5.5L8 6.086a1 1 0 0 0-.154.199 2 2 0 0 1 .861 3.337L6.88 11.45a2 2 0 1 1-2.83-2.83l.793-.792a4 4 0 0 1-.128-1.287z"/>
|
<path d="M4.715 6.542 3.343 7.914a3 3 0 1 0 4.243 4.243l1.828-1.829A3 3 0 0 0 8.586 5.5L8 6.086a1 1 0 0 0-.154.199 2 2 0 0 1 .861 3.337L6.88 11.45a2 2 0 1 1-2.83-2.83l.793-.792a4 4 0 0 1-.128-1.287z"/>
|
||||||
<path d="M6.586 4.672A3 3 0 0 0 7.414 9.5l.775-.776a2 2 0 0 1-.896-3.346L9.12 3.55a2 2 0 1 1 2.83 2.83l-.793.792c.112.42.155.855.128 1.287l1.372-1.372a3 3 0 1 0-4.243-4.243z"/>
|
<path d="M6.586 4.672A3 3 0 0 0 7.414 9.5l.775-.776a2 2 0 0 1-.896-3.346L9.12 3.55a2 2 0 1 1 2.83 2.83l-.793.792c.112.42.155.855.128 1.287l1.372-1.372a3 3 0 1 0-4.243-4.243z"/>
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 489 B After Width: | Height: | Size: 505 B |
@@ -1,4 +1,4 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#366FFF" viewBox="0 0 16 16">
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="<!--DYN_REPLACECOLOR-->" viewBox="0 0 16 16">
|
||||||
<path d="M5.5 7a.5.5 0 0 0 0 1h5a.5.5 0 0 0 0-1zM5 9.5a.5.5 0 0 1 .5-.5h5a.5.5 0 0 1 0 1h-5a.5.5 0 0 1-.5-.5m0 2a.5.5 0 0 1 .5-.5h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1-.5-.5"/>
|
<path d="M5.5 7a.5.5 0 0 0 0 1h5a.5.5 0 0 0 0-1zM5 9.5a.5.5 0 0 1 .5-.5h5a.5.5 0 0 1 0 1h-5a.5.5 0 0 1-.5-.5m0 2a.5.5 0 0 1 .5-.5h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1-.5-.5"/>
|
||||||
<path d="M9.5 0H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V4.5zm0 1v2A1.5 1.5 0 0 0 11 4.5h2V14a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1z"/>
|
<path d="M9.5 0H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V4.5zm0 1v2A1.5 1.5 0 0 0 11 4.5h2V14a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1z"/>
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 431 B After Width: | Height: | Size: 447 B |
@@ -1,3 +1,3 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#366FFF" viewBox="0 0 16 16">
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="<!--DYN_REPLACECOLOR-->" viewBox="0 0 16 16">
|
||||||
<path d="M5.026 15c6.038 0 9.341-5.003 9.341-9.334q.002-.211-.006-.422A6.7 6.7 0 0 0 16 3.542a6.7 6.7 0 0 1-1.889.518 3.3 3.3 0 0 0 1.447-1.817 6.5 6.5 0 0 1-2.087.793A3.286 3.286 0 0 0 7.875 6.03a9.32 9.32 0 0 1-6.767-3.429 3.29 3.29 0 0 0 1.018 4.382A3.3 3.3 0 0 1 .64 6.575v.045a3.29 3.29 0 0 0 2.632 3.218 3.2 3.2 0 0 1-.865.115 3 3 0 0 1-.614-.057 3.28 3.28 0 0 0 3.067 2.277A6.6 6.6 0 0 1 .78 13.58a6 6 0 0 1-.78-.045A9.34 9.34 0 0 0 5.026 15"/>
|
<path d="M5.026 15c6.038 0 9.341-5.003 9.341-9.334q.002-.211-.006-.422A6.7 6.7 0 0 0 16 3.542a6.7 6.7 0 0 1-1.889.518 3.3 3.3 0 0 0 1.447-1.817 6.5 6.5 0 0 1-2.087.793A3.286 3.286 0 0 0 7.875 6.03a9.32 9.32 0 0 1-6.767-3.429 3.29 3.29 0 0 0 1.018 4.382A3.3 3.3 0 0 1 .64 6.575v.045a3.29 3.29 0 0 0 2.632 3.218 3.2 3.2 0 0 1-.865.115 3 3 0 0 1-.614-.057 3.28 3.28 0 0 0 3.067 2.277A6.6 6.6 0 0 1 .78 13.58a6 6 0 0 1-.78-.045A9.34 9.34 0 0 0 5.026 15"/>
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 559 B After Width: | Height: | Size: 575 B |
11
website/helpdesk/kbas/ECLS-Change_Password.md
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# Change your ECLS password
|
||||||
|
|
||||||
|
1. Login to your ECLS account at https://login.enstrayed.com
|
||||||
|
2. Select the settings icon in the top right of your screen <br>
|
||||||
|

|
||||||
|
3. Enter your new password twice and press 'Save' to change your password <br>
|
||||||
|

|
||||||
|
|
||||||
|
## I can't login to my ECLS account
|
||||||
|
|
||||||
|
[Click here for information about how to reset your ECLS password](https://enstrayed.com/helpdesk/articles/ECLS-Reset_Password.md)
|
||||||
17
website/helpdesk/kbas/Enstrayed_Cloud-App_Passwords.md
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
# Using App Passwords on Enstrayed Cloud
|
||||||
|
|
||||||
|
App Passwords are credentials used to access your Enstrayed Cloud account from a specific application or device. They are created automatically for many Nextcloud clients, or can be created manually using the steps below.
|
||||||
|
|
||||||
|
**As Enstrayed Cloud exclusively uses ECLS for sign on, you will need to create app passwords for any device that does not support browser login.**
|
||||||
|
|
||||||
|
To create an App Password:
|
||||||
|
|
||||||
|
1. Login to Enstrayed Cloud
|
||||||
|
2. Select your profile image in the top right of the page and select 'Personal Settings'<br>
|
||||||
|

|
||||||
|
3. In the sidebar on the left side of the page, select 'Security'<br>
|
||||||
|

|
||||||
|
4. Enter a description for the app password, such as the device name or application, then select 'Create new app password'<br>
|
||||||
|

|
||||||
|
5. You will be presented with a username and unique password; You will use these credentials to access Enstrayed Cloud from your application.<br>
|
||||||
|

|
||||||
32
website/helpdesk/templates/article.html
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Enstrayed Helpdesk - <!--SSR_REPLACE_TITLE--></title>
|
||||||
|
<link rel="stylesheet" href="/static/helpdesk/helpdesk.css">
|
||||||
|
<script src="/static/helpdesk/login.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div class="headerbar">
|
||||||
|
<h1>Enstrayed Helpdesk</h1>
|
||||||
|
<a href="/helpdesk/ticket/new">Open Ticket</a>
|
||||||
|
<a href="/helpdesk/articles">Knowledgebase</a>
|
||||||
|
|
||||||
|
<div class="headerbarright">
|
||||||
|
<button id="loginButton" onclick="loginFunction()">Login</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="maincontent">
|
||||||
|
<div class="articlecontent">
|
||||||
|
<!--SSR_REPLACE_BODY-->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<dialog id="globalDialog">
|
||||||
|
<h2 id="globalDialogHeader">Warning</h2>
|
||||||
|
<p id="globalDialogText">This is a warning</p>
|
||||||
|
<button onclick="document.getElementById('globalDialog').close()">Dismiss</button>
|
||||||
|
</dialog>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -25,20 +25,20 @@
|
|||||||
<div class="linkColumn">
|
<div class="linkColumn">
|
||||||
<div>
|
<div>
|
||||||
<span>I'm filing a legal request, such as a DMCA takedown or other legal matter</span><br>
|
<span>I'm filing a legal request, such as a DMCA takedown or other legal matter</span><br>
|
||||||
<a href=""><img src="/static/icons/arrow-right.svg" alt="">Click here to start a Legal Request</a>
|
<a href=""><img src="/dynamic/icon/arrow-right/366FFF" alt="">Click here to start a Legal Request</a>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<span>I'm responsibly disclosing a problem, such a security vulnerability</span><br>
|
<span>I'm responsibly disclosing a problem, such a security vulnerability</span><br>
|
||||||
<a href=""><img src="/static/icons/arrow-right.svg" alt="">Click here to start a Responsible Disclosure</a>
|
<a href=""><img src="/dynamic/icon/arrow-right/366FFF" alt="">Click here to start a Responsible Disclosure</a>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<span>I need help logging into my ECLS account</span><br>
|
<span>I need help logging into my ECLS account</span><br>
|
||||||
<a href=""><img src="/static/icons/external.svg" alt="">Click here to reset your ECLS password</a><br>
|
<a href=""><img src="/dynamic/icon/external/366FFF" alt="">Click here to reset your ECLS password</a><br>
|
||||||
<a href=""><img src="/static/icons/arrow-right.svg" alt="">Click here to start ECLS account recovery</a>
|
<a href=""><img src="/dynamic/icon/arrow-right/366FFF" alt="">Click here to start ECLS account recovery</a>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<span>I have another question or need to get in contact</span><br>
|
<span>I have another question or need to get in contact</span><br>
|
||||||
<a href=""><img src="/static/icons/arrow-right.svg" alt="">Click here to start a General Inquiry</a>
|
<a href=""><img src="/dynamic/icon/arrow-right/366FFF" alt="">Click here to start a General Inquiry</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -47,19 +47,19 @@
|
|||||||
<div class="linkColumn">
|
<div class="linkColumn">
|
||||||
<div>
|
<div>
|
||||||
<span>How do I use Security Keys in ECLS?</span><br>
|
<span>How do I use Security Keys in ECLS?</span><br>
|
||||||
<a href=""><img src="/static/icons/post.svg" alt="">Important ECLS FIDO2/Webauthn/Passkey Information</a>
|
<a href=""><img src="/dynamic/icon/post/366FFF" alt="">Important ECLS FIDO2/Webauthn/Passkey Information</a>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<span>How do I login to Jellyfin?</span><br>
|
<span>How do I login to Jellyfin?</span><br>
|
||||||
<a href=""><img src="/static/icons/post.svg" alt="">Logging into Jellyfin</a>
|
<a href=""><img src="/dynamic/icon/post/366FFF" alt="">Logging into Jellyfin</a>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<span>How do I change my ECLS password?</span><br>
|
<span>How do I change my ECLS password?</span><br>
|
||||||
<a href=""><img src="/static/icons/post.svg" alt="">Change ECLS Password</a>
|
<a href=""><img src="/dynamic/icon/post/366FFF" alt="">Change ECLS Password</a>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<span>How do I use federation features in Enstrayed Cloud?</span><br>
|
<span>How do I use federation features in Enstrayed Cloud?</span><br>
|
||||||
<a href=""><img src="/static/icons/post.svg" alt="">Enstrayed Cloud Federation Features</a>
|
<a href=""><img src="/dynamic/icon/post/366FFF" alt="">Enstrayed Cloud Federation Features</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -16,19 +16,12 @@
|
|||||||
<body>
|
<body>
|
||||||
<a href="/">Return to enstrayed.com</a>
|
<a href="/">Return to enstrayed.com</a>
|
||||||
<h1>API Documentation</h1>
|
<h1>API Documentation</h1>
|
||||||
<p>This page was last updated 2025-04-26.</p>
|
<p>This page was last updated 2025-07-08.</p>
|
||||||
|
|
||||||
<p>Source Code & Issue Tracker: <a href="https://github.com/enstrayed/enstrayedapi">github.com/enstrayed/enstrayedapi</a></p>
|
<p>Source Code & Issue Tracker: <a href="https://github.com/enstrayed/enstrayedapi">github.com/enstrayed/enstrayedapi</a></p>
|
||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
<div class="inlineheader">
|
|
||||||
<h2>Important Note</h2>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<p>Multiple API endpoints are being rewritten/added, especially relating to authentication & authorization, as part of a database change to Postgres. These changes are being made in the <a href="https://github.com/Enstrayed/enstrayedapi/tree/new-db">new-db</a> branch.</p>
|
|
||||||
|
|
||||||
|
|
||||||
<div class="inlineheader">
|
<div class="inlineheader">
|
||||||
<h2>/api/nowplaying</h2>
|
<h2>/api/nowplaying</h2>
|
||||||
<a href="https://github.com/Enstrayed/enstrayedapi/blob/main/routes/nowplaying.js">nowplaying.js</a>
|
<a href="https://github.com/Enstrayed/enstrayedapi/blob/main/routes/nowplaying.js">nowplaying.js</a>
|
||||||
@@ -140,6 +133,21 @@
|
|||||||
</div>
|
</div>
|
||||||
<p><b>Internal Use Only. </b>This is the endpoint used by ECLS to finish the login flow. It will write the newly created token to the <code>APIToken</code> cookie as well as performing the action set by <code>state</code>, see <a href="#jumplink_authlogin">login endpoint</a>.</p>
|
<p><b>Internal Use Only. </b>This is the endpoint used by ECLS to finish the login flow. It will write the newly created token to the <code>APIToken</code> cookie as well as performing the action set by <code>state</code>, see <a href="#jumplink_authlogin">login endpoint</a>.</p>
|
||||||
|
|
||||||
|
<div class="inlineheader">
|
||||||
|
<h2>/api/helpdesk/forms/*</h2>
|
||||||
|
<a>helpdesk.js:15</a>
|
||||||
|
<div><span>GET</span></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p><b>Internal Use Only. </b>Serves all files in the <code>website/helpdesk/forms</code> directory for use in the Helpdesk frontend.</p>
|
||||||
|
|
||||||
|
<!-- <div class="inlineheader">
|
||||||
|
<h2>/dynamic/icon/*</h2>
|
||||||
|
<a>dynamic.js:3</a>
|
||||||
|
<div><span>GET</span></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p><b>Internal Use Only. </b>Returns the requested icon (stored in <code>website/dynamic/icons</code>) in any color (hex) specified in the URL. Example: <code>/dynamic/icon/github/00ff00</code> will return the GitHub logo in neon green.</p> -->
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
54
website/posts/20250619-UniFi-Network-on-Orange-Pi-Zero-3.md
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
# Setting up the UniFi Network Controller on an Orange Pi Zero 3
|
||||||
|
|
||||||
|
This page covers the steps I went through to setup the UniFi Network controller on an Orange Pi Zero 3. For no reason obvious to me, this process was overcomplicated and very annoying.
|
||||||
|
|
||||||
|
## Background / The Problem
|
||||||
|
I purchased the Orange Pi Zero 3 because it was cheap and I wanted to move my UniFi controller out of the Docker container on my main server. The idea was to create a DIY UniFi CloudKey, hence I called mine `shitty-cloudkey`. On the surface, this is rather trivial; Ubiquiti's apt repository includes `arm64` packages and the UniFi controller itself is a Java application, making it rather portable.
|
||||||
|
|
||||||
|
The problem is that the UniFi controller depends on MongoDB for its database, and [MongoDB's system requirements](https://www.mongodb.com/docs/manual/administration/production-notes/#arm64) require the ARM V8.4-A microarchitecture at minimum (in english: Cortex A73 cores or later). The Zero 3 has Cortex A53 cores, which do not have the instruction sets required. I never really investigated the reasoning for this, but given that this makes Mongo's published builds incompatible with the Raspberry Pi 4, I find it rather strange, since that doesn't really strike me as an especially old SBC?
|
||||||
|
|
||||||
|
## Part 1: Installing Armbian
|
||||||
|
I'll be honest, I normally don't mess around with SBCs so had no idea what the go-to distro was for RasPi clones. After what was probably less than 30 seconds of searching, I decided to use Armbian since it did exactly what I needed: Debian 12 ready to go.
|
||||||
|
|
||||||
|
1. the boring shit
|
||||||
|
* `winget install balena.etcher`
|
||||||
|
1. Download https://dl.armbian.com/orangepizero3/Bookworm_current_minimal
|
||||||
|
2. select the file, select your sd card, press flash, blah blah blah
|
||||||
|
2. the slightly less boring shit
|
||||||
|
1. plug in the SD card, ethernet & power, wait for it to startup
|
||||||
|
2. go to your dhcp server and find whatever IP it grabbed for itself
|
||||||
|
3. `ssh root@<that ip address>`, default password is `1234` (Thank you armbian devs for letting you do the install process remotely)
|
||||||
|
4. Go through the setup process, now is a great time to do a `apt update && apt upgrade`, set a hostname and possibly static IP address
|
||||||
|
5. reboot for good measure
|
||||||
|
|
||||||
|
## Part 2: Installing MongoDB the dumb way
|
||||||
|
|
||||||
|
1. Download and install `libssl1.1`, I don't actually know if this is required anymore but it stops apt from complaining
|
||||||
|
1. `curl -OL https://archive.debian.org/debian/pool/main/o/openssl/libssl1.1_1.1.1n-0+deb10u3_arm64.deb`
|
||||||
|
2. `sudo dpkg -i libs<tab complete>`
|
||||||
|
2. Download and install some old version of MongoDB I found; Won't actually be using the binary from this, but it gives us the systemd unit file and resolves the dependency in apt
|
||||||
|
1. `curl -OL https://repo.mongodb.org/apt/ubuntu/dists/bionic/mongodb-org/4.4/multiverse/binary-arm64/mongodb-org-server_4.4.29_arm64.deb`
|
||||||
|
2. `sudo dpkg -i mong<tab complete>`
|
||||||
|
3. Download a `mongod` binary that actually works from a [MongoDB employee's personal GitHub](https://github.com/themattman/mongodb-raspberrypi-binaries) yes really
|
||||||
|
* You may want to check for a more up to date build but w/e, select the one marked `pi4`
|
||||||
|
1. `curl -OL https://github.com/themattman/mongodb-raspberrypi-binaries/releases/download/r7.0.14-rpi-unofficial/mongodb.ce.pi4.r7.0.14.tar.gz`
|
||||||
|
2. `tar xvf mong<tab complete>`
|
||||||
|
3. `sudo mv mongod /usr/bin/mongod`
|
||||||
|
* Side note that I discovered later: UniFi manages the mongod process directly so you can keep the systemd service disabled.
|
||||||
|
|
||||||
|
## Part 3: Installing UniFi Network
|
||||||
|
This next section is loosly modified from Ubiquiti's official setup instructions: https://help.ui.com/hc/en-us/articles/220066768-Updating-and-Installing-Self-Hosted-UniFi-Network-Servers-Linux
|
||||||
|
|
||||||
|
1. `sudo apt-get update && sudo apt-get install ca-certificates apt-transport-https`
|
||||||
|
2. `echo 'deb [ arch=amd64,arm64 ] https://www.ui.com/downloads/unifi/debian stable ubiquiti' | sudo tee /etc/apt/sources.list.d/100-ubnt-unifi.list`
|
||||||
|
3. `curl -L -o /etc/apt/trusted.gpg.d/unifi-repo.gpg https://dl.ui.com/unifi/unifi-repo.gpg`
|
||||||
|
4. `sudo apt update`
|
||||||
|
5. `sudo apt install unifi`
|
||||||
|
|
||||||
|
## The End
|
||||||
|
UniFi should be up and running by this point, if it isn't then bash it with `sudo systemctl restart unifi` until it shows something at `https://<ip here>:8443`. If that still doesnt work, `sudo cat /usr/lib/unifi/logs/server.log` may provide a clue, or maybe it wont. FEW MORE THINGS:
|
||||||
|
|
||||||
|
* If you are migrating from another UniFi network install, FOR THE LOVE OF GOD DO NOT USE THE RESTORE BUTTON DURING THE INITIAL SETUP. Go through the setup process, *set your password*, and then go into Settings > System > Backups and use the restore button there.
|
||||||
|
* If you, like me, did the above and found out that everything breaks, you can factory reset it by changing `is_default=` to `true` in `/var/lib/unifi/system.properties`. Don't forget to change it back after you run through the setup again.
|
||||||
|
* I shat out this article at 1 AM so basically did no proof-reading or fact checking so the section about MongoDB's system requirements is probably wrong, LOL.
|
||||||
|
* Armbian has a lot of warnings about using community editions and I got a rather loud warning during my install saying that I was using an automated build that wasn't for production use. It wasn't marked as such on the website and frankly I don't care. I have to assume this is supposed to be normie-proofing but it, like this entire ordeal, strikes me as bizarre. Recommendation: make sure to take backups somewhat often.
|
||||||
BIN
website/static/bridge2.jpg
Normal file
|
After Width: | Height: | Size: 645 KiB |
@@ -51,6 +51,25 @@ body {
|
|||||||
margin: 0 0 0.5em 0;
|
margin: 0 0 0.5em 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.articlecontent {
|
||||||
|
background-color: #fff;
|
||||||
|
padding: 2em;
|
||||||
|
margin: 2em 0 2em;
|
||||||
|
max-width: 100ch;
|
||||||
|
}
|
||||||
|
|
||||||
|
.articlecontent > h1 {
|
||||||
|
margin: 0 0 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.articlecontent > ol > li {
|
||||||
|
margin: 0 0 0.2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.articlecontent img {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
.linkColumn {
|
.linkColumn {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
|||||||
@@ -1,13 +1,25 @@
|
|||||||
|
html {
|
||||||
|
background-color: #0f0f0f;
|
||||||
|
background-image: url('/static/bridge2.jpg');
|
||||||
|
/*! background-size: 100%; */
|
||||||
|
background-position-y: 50%;
|
||||||
|
background-position-x: center;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
font-family: 'Segoe UI Variable', sans-serif;
|
font-family: 'Segoe UI Variable Text', sans-serif;
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
background-color: #282828;
|
|
||||||
|
|
||||||
|
|
||||||
display: grid;
|
display: grid;
|
||||||
place-items: center;
|
place-items: center;
|
||||||
|
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
|
||||||
|
color: #fff;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -18,13 +30,18 @@ body {
|
|||||||
gap: 2.5em;
|
gap: 2.5em;
|
||||||
|
|
||||||
padding: 2em;
|
padding: 2em;
|
||||||
background-color: #fdfdfd;
|
background-color: #0f0f0f;
|
||||||
box-shadow: 0 0 1em 0 #202020;
|
box-shadow: 0 0 1em 0 #0f0f0f;
|
||||||
|
|
||||||
|
|
||||||
position: relative;
|
position: relative;
|
||||||
margin-top: 96px;
|
margin-top: 96px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.mainContent > div > h1, h2 {
|
||||||
|
margin: 0 0 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
.linkColumn {
|
.linkColumn {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
@@ -63,19 +80,27 @@ body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.blogPostsList > ul {
|
.blogPostsList > ul {
|
||||||
list-style-image: url('/static/icons/post.svg');
|
list-style-image: url('/dynamic/icon/post/7CB342');
|
||||||
list-style-position: inside;
|
list-style-position: inside;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
gap: 0.5em;
|
}
|
||||||
|
|
||||||
|
.blogPostsList > ul > li {
|
||||||
|
margin: 0.5em 0 0;
|
||||||
|
font-family: Consolas, monospace;
|
||||||
|
}
|
||||||
|
|
||||||
|
.blogPostsList > ul > li > a {
|
||||||
|
font-family: 'Segoe UI Variable', sans-serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
a, a:link {
|
a, a:link {
|
||||||
color: #366FFF;
|
color: #7CB342;
|
||||||
}
|
}
|
||||||
|
|
||||||
a:hover {
|
a:hover {
|
||||||
color: #ff8266;
|
color: #9CCC65;
|
||||||
}
|
}
|
||||||
|
|
||||||
a > img {
|
a > img {
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ html {
|
|||||||
|
|
||||||
body {
|
body {
|
||||||
margin: 2em 0 0 0;
|
margin: 2em 0 0 0;
|
||||||
font-family: 'Segoe UI Variable', sans-serif;
|
font-family: 'Segoe UI Variable Text', sans-serif;
|
||||||
|
|
||||||
background-color: #202020;
|
background-color: #202020;
|
||||||
color: #F1F1F1;
|
color: #F1F1F1;
|
||||||
@@ -41,3 +41,22 @@ a:hover {
|
|||||||
color: white;
|
color: white;
|
||||||
background-color: #f06445;
|
background-color: #f06445;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
line-height: 120%;
|
||||||
|
}
|
||||||
|
|
||||||
|
code {
|
||||||
|
background: #181818;
|
||||||
|
line-height: 130%;
|
||||||
|
padding: 0 0.1rem 0;
|
||||||
|
font-family: Consolas, monospace;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre code {
|
||||||
|
display: block;
|
||||||
|
overflow-x: auto;
|
||||||
|
white-space: pre-wrap;
|
||||||
|
background: #181818;
|
||||||
|
padding: 1rem;
|
||||||
|
}
|
||||||
@@ -16,6 +16,7 @@
|
|||||||
height: 100%;
|
height: 100%;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
background-color: #0b0b0b;
|
background-color: #0b0b0b;
|
||||||
|
font-family: sans-serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
body > div {
|
body > div {
|
||||||
|
|||||||
@@ -37,20 +37,20 @@
|
|||||||
<div class="linkColumn">
|
<div class="linkColumn">
|
||||||
<div>
|
<div>
|
||||||
<span>I received an Email from @enstrayed.com</span><br>
|
<span>I received an Email from @enstrayed.com</span><br>
|
||||||
<a href="https://helpdesk.enstrayed.com"><img src="/static/icons/external.svg" alt="">Click here for information about EOES</a>
|
<a href="https://helpdesk.enstrayed.com"><img src="/dynamic/icon/external/7CB342" alt="">Click here for information about EOES</a>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<span>I need help with an Enstrayed.com web service</span><br>
|
<span>I need help with an Enstrayed.com web service</span><br>
|
||||||
<a href="https://helpdesk.enstrayed.com"><img src="/static/icons/external.svg" alt="">Click here to visit the Helpdesk</a>
|
<a href="https://helpdesk.enstrayed.com"><img src="/dynamic/icon/external/7CB342" alt="">Click here to visit the Helpdesk</a>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<a href="/urltoolbox"><img src="/static/icons/link.svg" alt="">URL Toolbox</a>
|
<a href="/urltoolbox"><img src="/dynamic/icon/link/7CB342" alt="">URL Toolbox</a>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<a href="/posts/20240409-API-Documentation.html"><img src="/static/icons/link.svg" alt="">API Documentation</a>
|
<a href="/posts/20240409-API-Documentation.html"><img src="/dynamic/icon/link/7CB342" alt="">API Documentation</a>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<a href="https://downloads.enstrayed.com"><img src="/static/icons/link.svg" alt="">Downloads</a>
|
<a href="https://downloads.enstrayed.com"><img src="/dynamic/icon/link/7CB342" alt="">Downloads</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="apiVersion">
|
<div class="apiVersion">
|
||||||
<!--SSR_APIVERSION-->
|
<!--SSR_APIVERSION-->
|
||||||
@@ -61,8 +61,8 @@
|
|||||||
<!-- <img src="/static/snow-leopard.svg" alt="Snow Leopard Icon" width="64"> -->
|
<!-- <img src="/static/snow-leopard.svg" alt="Snow Leopard Icon" width="64"> -->
|
||||||
<h1>@Enstrayed</h1>
|
<h1>@Enstrayed</h1>
|
||||||
<div class="linkColumn marginBottom1em">
|
<div class="linkColumn marginBottom1em">
|
||||||
<a href="https://twitter.com/enstrayed"><img src="/static/icons/twitter.svg" alt="">Twitter</a>
|
<a href="https://twitter.com/enstrayed"><img src="/dynamic/icon/twitter/7CB342" alt="">Twitter</a>
|
||||||
<a href="https://github.com/enstrayed"><img src="/static/icons/github.svg" alt="">GitHub</a>
|
<a href="https://github.com/enstrayed"><img src="/dynamic/icon/github/7CB342" alt="">GitHub</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="blogPostsList">
|
<div class="blogPostsList">
|
||||||
|
|||||||