mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-04-25 03:15:04 +02:00
Compare commits
29 Commits
copilot/fi
...
revert-135
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4a14c45b39 | ||
|
|
275c978d94 | ||
|
|
40bbd7474e | ||
|
|
50687f420e | ||
|
|
c7ef06f4d1 | ||
|
|
ad0b68a8b7 | ||
|
|
455bc93109 | ||
|
|
3fc97ad177 | ||
|
|
89168115f6 | ||
|
|
2fe5d40c1a | ||
|
|
44c6cfabeb | ||
|
|
d0f467688c | ||
|
|
f06dedd872 | ||
|
|
18e09c26d9 | ||
|
|
209f92bf0f | ||
|
|
a17ba89e7b | ||
|
|
08ee4699df | ||
|
|
a49d9c5713 | ||
|
|
18fd0f2393 | ||
|
|
9b35339cbe | ||
|
|
a9c2307b0e | ||
|
|
0e809c6ee9 | ||
|
|
64d000b73a | ||
|
|
65353d01e1 | ||
|
|
683be87e9e | ||
|
|
5894734857 | ||
|
|
c881811499 | ||
|
|
33716c92e5 | ||
|
|
dda2ea811f |
474
.github/workflows/pocketbase-bot.yml
generated
vendored
474
.github/workflows/pocketbase-bot.yml
generated
vendored
@@ -31,6 +31,8 @@ jobs:
|
|||||||
ACTOR: ${{ github.event.comment.user.login }}
|
ACTOR: ${{ github.event.comment.user.login }}
|
||||||
ACTOR_ASSOCIATION: ${{ github.event.comment.author_association }}
|
ACTOR_ASSOCIATION: ${{ github.event.comment.author_association }}
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
FRONTEND_URL: ${{ secrets.FRONTEND_URL }}
|
||||||
|
REVALIDATE_SECRET: ${{ secrets.REVALIDATE_SECRET }}
|
||||||
run: |
|
run: |
|
||||||
node << 'ENDSCRIPT'
|
node << 'ENDSCRIPT'
|
||||||
(async function () {
|
(async function () {
|
||||||
@@ -113,7 +115,6 @@ jobs:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ── Permission check ───────────────────────────────────────────────
|
// ── Permission check ───────────────────────────────────────────────
|
||||||
// author_association: OWNER = repo/org owner, MEMBER = org member (includes Contributors team)
|
|
||||||
const association = process.env.ACTOR_ASSOCIATION;
|
const association = process.env.ACTOR_ASSOCIATION;
|
||||||
if (association !== 'OWNER' && association !== 'MEMBER') {
|
if (association !== 'OWNER' && association !== 'MEMBER') {
|
||||||
await addReaction('-1');
|
await addReaction('-1');
|
||||||
@@ -128,18 +129,11 @@ jobs:
|
|||||||
await addReaction('eyes');
|
await addReaction('eyes');
|
||||||
|
|
||||||
// ── Parse command ──────────────────────────────────────────────────
|
// ── Parse command ──────────────────────────────────────────────────
|
||||||
// Formats (first line of comment):
|
|
||||||
// /pocketbase <slug> field=value [field=value ...] ← field updates (simple values)
|
|
||||||
// /pocketbase <slug> set <field> ← value from code block below
|
|
||||||
// /pocketbase <slug> note list|add|edit|remove ... ← note management
|
|
||||||
// /pocketbase <slug> method list ← list install methods
|
|
||||||
// /pocketbase <slug> method <type> cpu=N ram=N hdd=N ← edit install method resources
|
|
||||||
const commentBody = process.env.COMMENT_BODY || '';
|
const commentBody = process.env.COMMENT_BODY || '';
|
||||||
const lines = commentBody.trim().split('\n');
|
const lines = commentBody.trim().split('\n');
|
||||||
const firstLine = lines[0].trim();
|
const firstLine = lines[0].trim();
|
||||||
const withoutCmd = firstLine.replace(/^\/pocketbase\s+/, '').trim();
|
const withoutCmd = firstLine.replace(/^\/pocketbase\s+/, '').trim();
|
||||||
|
|
||||||
// Extract code block content from comment body (```...``` or ```lang\n...```)
|
|
||||||
function extractCodeBlock(body) {
|
function extractCodeBlock(body) {
|
||||||
const m = body.match(/```[^\n]*\n([\s\S]*?)```/);
|
const m = body.match(/```[^\n]*\n([\s\S]*?)```/);
|
||||||
return m ? m[1].trim() : null;
|
return m ? m[1].trim() : null;
|
||||||
@@ -147,6 +141,8 @@ jobs:
|
|||||||
const codeBlockValue = extractCodeBlock(commentBody);
|
const codeBlockValue = extractCodeBlock(commentBody);
|
||||||
|
|
||||||
const HELP_TEXT =
|
const HELP_TEXT =
|
||||||
|
'**Show current state:**\n' +
|
||||||
|
'```\n/pocketbase <slug> info\n```\n\n' +
|
||||||
'**Field update (simple):** `/pocketbase <slug> field=value [field=value ...]`\n\n' +
|
'**Field update (simple):** `/pocketbase <slug> field=value [field=value ...]`\n\n' +
|
||||||
'**Field update (HTML/multiline) — value from code block:**\n' +
|
'**Field update (HTML/multiline) — value from code block:**\n' +
|
||||||
'````\n' +
|
'````\n' +
|
||||||
@@ -162,12 +158,16 @@ jobs:
|
|||||||
'/pocketbase <slug> note edit <type> "<old text>" "<new text>"\n' +
|
'/pocketbase <slug> note edit <type> "<old text>" "<new text>"\n' +
|
||||||
'/pocketbase <slug> note remove <type> "<text>"\n' +
|
'/pocketbase <slug> note remove <type> "<text>"\n' +
|
||||||
'```\n\n' +
|
'```\n\n' +
|
||||||
'**Install method resources:**\n' +
|
'**Install method management:**\n' +
|
||||||
'```\n' +
|
'```\n' +
|
||||||
'/pocketbase <slug> method list\n' +
|
'/pocketbase <slug> method list\n' +
|
||||||
'/pocketbase <slug> method <type> hdd=10\n' +
|
|
||||||
'/pocketbase <slug> method <type> cpu=4 ram=2048 hdd=20\n' +
|
'/pocketbase <slug> method <type> cpu=4 ram=2048 hdd=20\n' +
|
||||||
'```\n\n' +
|
'/pocketbase <slug> method <type> config_path="/opt/app/.env"\n' +
|
||||||
|
'/pocketbase <slug> method <type> os=debian version=13\n' +
|
||||||
|
'/pocketbase <slug> method add <type> cpu=2 ram=2048 hdd=8 os=debian version=13\n' +
|
||||||
|
'/pocketbase <slug> method remove <type>\n' +
|
||||||
|
'```\n' +
|
||||||
|
'Method fields: `cpu` `ram` `hdd` `os` `version` `config_path` `script`\n\n' +
|
||||||
'**Editable fields:** `name` `description` `logo` `documentation` `website` `project_url` `github` ' +
|
'**Editable fields:** `name` `description` `logo` `documentation` `website` `project_url` `github` ' +
|
||||||
'`config_path` `port` `default_user` `default_passwd` ' +
|
'`config_path` `port` `default_user` `default_passwd` ' +
|
||||||
'`updateable` `privileged` `has_arm` `is_dev` ' +
|
'`updateable` `privileged` `has_arm` `is_dev` ' +
|
||||||
@@ -189,8 +189,7 @@ jobs:
|
|||||||
process.exit(0);
|
process.exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ── Allowed fields and their types ─────────────────────────────────
|
// ── PocketBase: authenticate ───────────────────────────────────────
|
||||||
// ── PocketBase: authenticate (shared by all paths) ─────────────────
|
|
||||||
const raw = process.env.POCKETBASE_URL.replace(/\/$/, '');
|
const raw = process.env.POCKETBASE_URL.replace(/\/$/, '');
|
||||||
const apiBase = /\/api$/i.test(raw) ? raw : raw + '/api';
|
const apiBase = /\/api$/i.test(raw) ? raw : raw + '/api';
|
||||||
const coll = process.env.POCKETBASE_COLLECTION;
|
const coll = process.env.POCKETBASE_COLLECTION;
|
||||||
@@ -210,7 +209,7 @@ jobs:
|
|||||||
}
|
}
|
||||||
const token = JSON.parse(authRes.body).token;
|
const token = JSON.parse(authRes.body).token;
|
||||||
|
|
||||||
// ── PocketBase: find record by slug (shared by all paths) ──────────
|
// ── PocketBase: find record by slug ────────────────────────────────
|
||||||
const recordsUrl = apiBase + '/collections/' + encodeURIComponent(coll) + '/records';
|
const recordsUrl = apiBase + '/collections/' + encodeURIComponent(coll) + '/records';
|
||||||
const filter = "(slug='" + slug.replace(/'/g, "''") + "')";
|
const filter = "(slug='" + slug.replace(/'/g, "''") + "')";
|
||||||
const listRes = await request(recordsUrl + '?filter=' + encodeURIComponent(filter) + '&perPage=1', {
|
const listRes = await request(recordsUrl + '?filter=' + encodeURIComponent(filter) + '&perPage=1', {
|
||||||
@@ -228,57 +227,164 @@ jobs:
|
|||||||
process.exit(0);
|
process.exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ── Shared helpers ─────────────────────────────────────────────────
|
||||||
|
|
||||||
|
// Key=value parser: handles unquoted and "quoted" values
|
||||||
|
function parseKVPairs(str) {
|
||||||
|
const fields = {};
|
||||||
|
let pos = 0;
|
||||||
|
while (pos < str.length) {
|
||||||
|
while (pos < str.length && /\s/.test(str[pos])) pos++;
|
||||||
|
if (pos >= str.length) break;
|
||||||
|
let keyStart = pos;
|
||||||
|
while (pos < str.length && str[pos] !== '=' && !/\s/.test(str[pos])) pos++;
|
||||||
|
const key = str.substring(keyStart, pos).trim();
|
||||||
|
if (!key || pos >= str.length || str[pos] !== '=') { pos++; continue; }
|
||||||
|
pos++;
|
||||||
|
let value;
|
||||||
|
if (pos < str.length && str[pos] === '"') {
|
||||||
|
pos++;
|
||||||
|
let valStart = pos;
|
||||||
|
while (pos < str.length && str[pos] !== '"') {
|
||||||
|
if (str[pos] === '\\') pos++;
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
value = str.substring(valStart, pos).replace(/\\"/g, '"');
|
||||||
|
if (pos < str.length) pos++;
|
||||||
|
} else {
|
||||||
|
let valStart = pos;
|
||||||
|
while (pos < str.length && !/\s/.test(str[pos])) pos++;
|
||||||
|
value = str.substring(valStart, pos);
|
||||||
|
}
|
||||||
|
fields[key] = value;
|
||||||
|
}
|
||||||
|
return fields;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token parser for note commands: unquoted-word OR "quoted string"
|
||||||
|
function parseTokens(str) {
|
||||||
|
const tokens = [];
|
||||||
|
let pos = 0;
|
||||||
|
while (pos < str.length) {
|
||||||
|
while (pos < str.length && /\s/.test(str[pos])) pos++;
|
||||||
|
if (pos >= str.length) break;
|
||||||
|
if (str[pos] === '"') {
|
||||||
|
pos++;
|
||||||
|
let start = pos;
|
||||||
|
while (pos < str.length && str[pos] !== '"') {
|
||||||
|
if (str[pos] === '\\') pos++;
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
tokens.push(str.substring(start, pos).replace(/\\"/g, '"'));
|
||||||
|
if (pos < str.length) pos++;
|
||||||
|
} else {
|
||||||
|
let start = pos;
|
||||||
|
while (pos < str.length && !/\s/.test(str[pos])) pos++;
|
||||||
|
tokens.push(str.substring(start, pos));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return tokens;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read JSON blob from record (handles parsed objects and strings)
|
||||||
|
function readJsonBlob(val) {
|
||||||
|
if (Array.isArray(val)) return val;
|
||||||
|
try { return JSON.parse(val || '[]'); } catch (e) { return []; }
|
||||||
|
}
|
||||||
|
|
||||||
|
// Frontend cache revalidation (silent, best-effort)
|
||||||
|
async function revalidate(s) {
|
||||||
|
const frontendUrl = process.env.FRONTEND_URL;
|
||||||
|
const secret = process.env.REVALIDATE_SECRET;
|
||||||
|
if (!frontendUrl || !secret) return;
|
||||||
|
try {
|
||||||
|
await request(frontendUrl.replace(/\/$/, '') + '/api/revalidate', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: { 'Authorization': 'Bearer ' + secret, 'Content-Type': 'application/json' },
|
||||||
|
body: JSON.stringify({ tags: ['scripts', 'script-' + s] })
|
||||||
|
});
|
||||||
|
} catch (e) { console.warn('Revalidation skipped:', e.message); }
|
||||||
|
}
|
||||||
|
|
||||||
|
// Format notes list for display
|
||||||
|
function formatNotesList(arr) {
|
||||||
|
if (arr.length === 0) return '*None*';
|
||||||
|
return arr.map(function (n, i) {
|
||||||
|
return (i + 1) + '. **`' + (n.type || '?') + '`**: ' + (n.text || '');
|
||||||
|
}).join('\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Format install methods list for display
|
||||||
|
function formatMethodsList(arr) {
|
||||||
|
if (arr.length === 0) return '*None*';
|
||||||
|
return arr.map(function (im, i) {
|
||||||
|
const r = im.resources || {};
|
||||||
|
const parts = [
|
||||||
|
(r.os || '?') + ' ' + (r.version || '?'),
|
||||||
|
(r.cpu != null ? r.cpu : '?') + 'C / ' + (r.ram != null ? r.ram : '?') + ' MB / ' + (r.hdd != null ? r.hdd : '?') + ' GB'
|
||||||
|
];
|
||||||
|
if (im.config_path) parts.push('config: `' + im.config_path + '`');
|
||||||
|
if (im.script) parts.push('script: `' + im.script + '`');
|
||||||
|
return (i + 1) + '. **`' + (im.type || '?') + '`** — ' + parts.join(', ');
|
||||||
|
}).join('\n');
|
||||||
|
}
|
||||||
|
|
||||||
// ── Route: dispatch to subcommand handler ──────────────────────────
|
// ── Route: dispatch to subcommand handler ──────────────────────────
|
||||||
|
const infoMatch = rest.match(/^info$/i);
|
||||||
const noteMatch = rest.match(/^note\s+(list|add|edit|remove)\b/i);
|
const noteMatch = rest.match(/^note\s+(list|add|edit|remove)\b/i);
|
||||||
const methodMatch = rest.match(/^method\b/i);
|
const methodMatch = rest.match(/^method\b/i);
|
||||||
const setMatch = rest.match(/^set\s+(\S+)/i);
|
const setMatch = rest.match(/^set\s+(\S+)/i);
|
||||||
|
|
||||||
if (noteMatch) {
|
if (infoMatch) {
|
||||||
// ── NOTE SUBCOMMAND (reads/writes notes_json on script record) ────
|
// ── INFO SUBCOMMAND ──────────────────────────────────────────────
|
||||||
|
const notesArr = readJsonBlob(record.notes_json);
|
||||||
|
const methodsArr = readJsonBlob(record.install_methods_json);
|
||||||
|
|
||||||
|
const out = [];
|
||||||
|
out.push('ℹ️ **PocketBase Bot**: Info for **`' + slug + '`**\n');
|
||||||
|
|
||||||
|
out.push('**Basic info:**');
|
||||||
|
out.push('- **Name:** ' + (record.name || '—'));
|
||||||
|
out.push('- **Slug:** `' + slug + '`');
|
||||||
|
out.push('- **Port:** ' + (record.port != null ? '`' + record.port + '`' : '—'));
|
||||||
|
out.push('- **Updateable:** ' + (record.updateable ? 'Yes' : 'No'));
|
||||||
|
out.push('- **Privileged:** ' + (record.privileged ? 'Yes' : 'No'));
|
||||||
|
out.push('- **ARM:** ' + (record.has_arm ? 'Yes' : 'No'));
|
||||||
|
if (record.is_dev) out.push('- **Dev:** Yes');
|
||||||
|
if (record.is_disabled) out.push('- **Disabled:** Yes' + (record.disable_message ? ' — ' + record.disable_message : ''));
|
||||||
|
if (record.is_deleted) out.push('- **Deleted:** Yes' + (record.deleted_message ? ' — ' + record.deleted_message : ''));
|
||||||
|
out.push('');
|
||||||
|
|
||||||
|
out.push('**Links:**');
|
||||||
|
out.push('- **Website:** ' + (record.website || '—'));
|
||||||
|
out.push('- **Docs:** ' + (record.documentation || '—'));
|
||||||
|
out.push('- **Logo:** ' + (record.logo ? '[link](' + record.logo + ')' : '—'));
|
||||||
|
out.push('- **GitHub:** ' + (record.github || '—'));
|
||||||
|
if (record.config_path) out.push('- **Config:** `' + record.config_path + '`');
|
||||||
|
out.push('');
|
||||||
|
|
||||||
|
out.push('**Credentials:**');
|
||||||
|
out.push('- **User:** ' + (record.default_user || '—'));
|
||||||
|
out.push('- **Password:** ' + (record.default_passwd ? '*(set)*' : '—'));
|
||||||
|
out.push('');
|
||||||
|
|
||||||
|
out.push('**Install methods** (' + methodsArr.length + '):');
|
||||||
|
out.push(formatMethodsList(methodsArr));
|
||||||
|
out.push('');
|
||||||
|
|
||||||
|
out.push('**Notes** (' + notesArr.length + '):');
|
||||||
|
out.push(formatNotesList(notesArr));
|
||||||
|
|
||||||
|
await addReaction('+1');
|
||||||
|
await postComment(out.join('\n'));
|
||||||
|
|
||||||
|
} else if (noteMatch) {
|
||||||
|
// ── NOTE SUBCOMMAND ──────────────────────────────────────────────
|
||||||
const noteAction = noteMatch[1].toLowerCase();
|
const noteAction = noteMatch[1].toLowerCase();
|
||||||
const noteArgsStr = rest.substring(noteMatch[0].length).trim();
|
const noteArgsStr = rest.substring(noteMatch[0].length).trim();
|
||||||
|
let notesArr = readJsonBlob(record.notes_json);
|
||||||
|
|
||||||
// Parse notes_json from the already-fetched script record
|
async function patchNotes(arr) {
|
||||||
// PocketBase may return JSON fields as already-parsed objects
|
|
||||||
let notesArr = [];
|
|
||||||
try {
|
|
||||||
const rawNotes = record.notes_json;
|
|
||||||
notesArr = Array.isArray(rawNotes) ? rawNotes : JSON.parse(rawNotes || '[]');
|
|
||||||
} catch (e) { notesArr = []; }
|
|
||||||
|
|
||||||
// Token parser: unquoted-word OR "quoted string" (supports \" escapes)
|
|
||||||
function parseNoteTokens(str) {
|
|
||||||
const tokens = [];
|
|
||||||
let pos = 0;
|
|
||||||
while (pos < str.length) {
|
|
||||||
while (pos < str.length && /\s/.test(str[pos])) pos++;
|
|
||||||
if (pos >= str.length) break;
|
|
||||||
if (str[pos] === '"') {
|
|
||||||
pos++;
|
|
||||||
let start = pos;
|
|
||||||
while (pos < str.length && str[pos] !== '"') {
|
|
||||||
if (str[pos] === '\\') pos++;
|
|
||||||
pos++;
|
|
||||||
}
|
|
||||||
tokens.push(str.substring(start, pos).replace(/\\"/g, '"'));
|
|
||||||
if (pos < str.length) pos++;
|
|
||||||
} else {
|
|
||||||
let start = pos;
|
|
||||||
while (pos < str.length && !/\s/.test(str[pos])) pos++;
|
|
||||||
tokens.push(str.substring(start, pos));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return tokens;
|
|
||||||
}
|
|
||||||
|
|
||||||
function formatNotesList(arr) {
|
|
||||||
if (arr.length === 0) return '*None*';
|
|
||||||
return arr.map(function (n, i) {
|
|
||||||
return (i + 1) + '. **`' + (n.type || '?') + '`**: ' + (n.text || '');
|
|
||||||
}).join('\n');
|
|
||||||
}
|
|
||||||
|
|
||||||
async function patchNotesJson(arr) {
|
|
||||||
const res = await request(recordsUrl + '/' + record.id, {
|
const res = await request(recordsUrl + '/' + record.id, {
|
||||||
method: 'PATCH',
|
method: 'PATCH',
|
||||||
headers: { 'Authorization': token, 'Content-Type': 'application/json' },
|
headers: { 'Authorization': token, 'Content-Type': 'application/json' },
|
||||||
@@ -286,7 +392,7 @@ jobs:
|
|||||||
});
|
});
|
||||||
if (!res.ok) {
|
if (!res.ok) {
|
||||||
await addReaction('-1');
|
await addReaction('-1');
|
||||||
await postComment('❌ **PocketBase Bot**: Failed to update `notes_json`:\n```\n' + res.body + '\n```');
|
await postComment('❌ **PocketBase Bot**: Failed to update notes:\n```\n' + res.body + '\n```');
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -299,7 +405,7 @@ jobs:
|
|||||||
);
|
);
|
||||||
|
|
||||||
} else if (noteAction === 'add') {
|
} else if (noteAction === 'add') {
|
||||||
const tokens = parseNoteTokens(noteArgsStr);
|
const tokens = parseTokens(noteArgsStr);
|
||||||
if (tokens.length < 2) {
|
if (tokens.length < 2) {
|
||||||
await addReaction('-1');
|
await addReaction('-1');
|
||||||
await postComment(
|
await postComment(
|
||||||
@@ -311,7 +417,8 @@ jobs:
|
|||||||
const noteType = tokens[0].toLowerCase();
|
const noteType = tokens[0].toLowerCase();
|
||||||
const noteText = tokens.slice(1).join(' ');
|
const noteText = tokens.slice(1).join(' ');
|
||||||
notesArr.push({ type: noteType, text: noteText });
|
notesArr.push({ type: noteType, text: noteText });
|
||||||
await patchNotesJson(notesArr);
|
await patchNotes(notesArr);
|
||||||
|
await revalidate(slug);
|
||||||
await addReaction('+1');
|
await addReaction('+1');
|
||||||
await postComment(
|
await postComment(
|
||||||
'✅ **PocketBase Bot**: Added note to **`' + slug + '`**\n\n' +
|
'✅ **PocketBase Bot**: Added note to **`' + slug + '`**\n\n' +
|
||||||
@@ -321,7 +428,7 @@ jobs:
|
|||||||
);
|
);
|
||||||
|
|
||||||
} else if (noteAction === 'edit') {
|
} else if (noteAction === 'edit') {
|
||||||
const tokens = parseNoteTokens(noteArgsStr);
|
const tokens = parseTokens(noteArgsStr);
|
||||||
if (tokens.length < 3) {
|
if (tokens.length < 3) {
|
||||||
await addReaction('-1');
|
await addReaction('-1');
|
||||||
await postComment(
|
await postComment(
|
||||||
@@ -346,7 +453,8 @@ jobs:
|
|||||||
process.exit(0);
|
process.exit(0);
|
||||||
}
|
}
|
||||||
notesArr[idx].text = newText;
|
notesArr[idx].text = newText;
|
||||||
await patchNotesJson(notesArr);
|
await patchNotes(notesArr);
|
||||||
|
await revalidate(slug);
|
||||||
await addReaction('+1');
|
await addReaction('+1');
|
||||||
await postComment(
|
await postComment(
|
||||||
'✅ **PocketBase Bot**: Edited note in **`' + slug + '`**\n\n' +
|
'✅ **PocketBase Bot**: Edited note in **`' + slug + '`**\n\n' +
|
||||||
@@ -357,7 +465,7 @@ jobs:
|
|||||||
);
|
);
|
||||||
|
|
||||||
} else if (noteAction === 'remove') {
|
} else if (noteAction === 'remove') {
|
||||||
const tokens = parseNoteTokens(noteArgsStr);
|
const tokens = parseTokens(noteArgsStr);
|
||||||
if (tokens.length < 2) {
|
if (tokens.length < 2) {
|
||||||
await addReaction('-1');
|
await addReaction('-1');
|
||||||
await postComment(
|
await postComment(
|
||||||
@@ -381,7 +489,8 @@ jobs:
|
|||||||
);
|
);
|
||||||
process.exit(0);
|
process.exit(0);
|
||||||
}
|
}
|
||||||
await patchNotesJson(notesArr);
|
await patchNotes(notesArr);
|
||||||
|
await revalidate(slug);
|
||||||
await addReaction('+1');
|
await addReaction('+1');
|
||||||
await postComment(
|
await postComment(
|
||||||
'✅ **PocketBase Bot**: Removed note from **`' + slug + '`**\n\n' +
|
'✅ **PocketBase Bot**: Removed note from **`' + slug + '`**\n\n' +
|
||||||
@@ -392,36 +501,36 @@ jobs:
|
|||||||
}
|
}
|
||||||
|
|
||||||
} else if (methodMatch) {
|
} else if (methodMatch) {
|
||||||
// ── METHOD SUBCOMMAND (reads/writes install_methods_json on script record) ──
|
// ── METHOD SUBCOMMAND ────────────────────────────────────────────
|
||||||
const methodArgs = rest.replace(/^method\s*/i, '').trim();
|
const methodArgs = rest.replace(/^method\s*/i, '').trim();
|
||||||
const methodListMode = !methodArgs || methodArgs.toLowerCase() === 'list';
|
const methodListMode = !methodArgs || methodArgs.toLowerCase() === 'list';
|
||||||
|
let methodsArr = readJsonBlob(record.install_methods_json);
|
||||||
|
|
||||||
// Parse install_methods_json from the already-fetched script record
|
// Method field classification
|
||||||
// PocketBase may return JSON fields as already-parsed objects
|
const RESOURCE_KEYS = { cpu: 'number', ram: 'number', hdd: 'number', os: 'string', version: 'string' };
|
||||||
let methodsArr = [];
|
const METHOD_KEYS = { config_path: 'string', script: 'string' };
|
||||||
try {
|
const ALL_METHOD_KEYS = Object.assign({}, RESOURCE_KEYS, METHOD_KEYS);
|
||||||
const rawMethods = record.install_methods_json;
|
|
||||||
methodsArr = Array.isArray(rawMethods) ? rawMethods : JSON.parse(rawMethods || '[]');
|
|
||||||
} catch (e) { methodsArr = []; }
|
|
||||||
|
|
||||||
function formatMethodsList(arr) {
|
function applyMethodChanges(method, parsed) {
|
||||||
if (arr.length === 0) return '*None*';
|
if (!method.resources) method.resources = {};
|
||||||
return arr.map(function (im, i) {
|
for (const [k, v] of Object.entries(parsed)) {
|
||||||
const r = im.resources || {};
|
if (RESOURCE_KEYS[k]) {
|
||||||
return (i + 1) + '. **`' + (im.type || '?') + '`** — CPU: `' + (r.cpu != null ? r.cpu : '?') +
|
method.resources[k] = RESOURCE_KEYS[k] === 'number' ? parseInt(v, 10) : v;
|
||||||
'` · RAM: `' + (r.ram != null ? r.ram : '?') + ' MB` · HDD: `' + (r.hdd != null ? r.hdd : '?') + ' GB`';
|
} else if (METHOD_KEYS[k]) {
|
||||||
}).join('\n');
|
method[k] = v === '' ? null : v;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function patchInstallMethodsJson(arr) {
|
async function patchMethods(arr) {
|
||||||
const res = await request(recordsUrl + '/' + record.id, {
|
const res = await request(recordsUrl + '/' + record.id, {
|
||||||
method: 'PATCH',
|
method: 'PATCH',
|
||||||
headers: { 'Authorization': token, 'Content-Type': 'application/json' },
|
headers: { 'Authorization': token, 'Content-Type': 'application/json' },
|
||||||
body: JSON.stringify({ install_methods_json: JSON.stringify(arr) })
|
body: JSON.stringify({ install_methods_json: arr })
|
||||||
});
|
});
|
||||||
if (!res.ok) {
|
if (!res.ok) {
|
||||||
await addReaction('-1');
|
await addReaction('-1');
|
||||||
await postComment('❌ **PocketBase Bot**: Failed to update `install_methods_json`:\n```\n' + res.body + '\n```');
|
await postComment('❌ **PocketBase Bot**: Failed to update install methods:\n```\n' + res.body + '\n```');
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -432,70 +541,122 @@ jobs:
|
|||||||
'ℹ️ **PocketBase Bot**: Install methods for **`' + slug + '`** (' + methodsArr.length + ' total)\n\n' +
|
'ℹ️ **PocketBase Bot**: Install methods for **`' + slug + '`** (' + methodsArr.length + ' total)\n\n' +
|
||||||
formatMethodsList(methodsArr)
|
formatMethodsList(methodsArr)
|
||||||
);
|
);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// Parse: <type> cpu=N ram=N hdd=N
|
// Check for add / remove sub-actions
|
||||||
const methodParts = methodArgs.match(/^(\S+)\s+(.+)$/);
|
const addMatch = methodArgs.match(/^add\s+(\S+)(?:\s+(.+))?$/i);
|
||||||
if (!methodParts) {
|
const removeMatch = methodArgs.match(/^remove\s+(\S+)$/i);
|
||||||
await addReaction('-1');
|
|
||||||
|
if (addMatch) {
|
||||||
|
// ── METHOD ADD ───────────────────────────────────────────────
|
||||||
|
const newType = addMatch[1];
|
||||||
|
if (methodsArr.some(function (im) { return (im.type || '').toLowerCase() === newType.toLowerCase(); })) {
|
||||||
|
await addReaction('-1');
|
||||||
|
await postComment('❌ **PocketBase Bot**: Install method `' + newType + '` already exists for `' + slug + '`.\n\nUse `/pocketbase ' + slug + ' method list` to see all methods.');
|
||||||
|
process.exit(0);
|
||||||
|
}
|
||||||
|
const newMethod = { type: newType, resources: { cpu: 1, ram: 512, hdd: 4, os: 'debian', version: '13' } };
|
||||||
|
if (addMatch[2]) {
|
||||||
|
const parsed = parseKVPairs(addMatch[2]);
|
||||||
|
const unknown = Object.keys(parsed).filter(function (k) { return !ALL_METHOD_KEYS[k]; });
|
||||||
|
if (unknown.length > 0) {
|
||||||
|
await addReaction('-1');
|
||||||
|
await postComment('❌ **PocketBase Bot**: Unknown method field(s): `' + unknown.join('`, `') + '`\n\n**Allowed:** `' + Object.keys(ALL_METHOD_KEYS).join('`, `') + '`');
|
||||||
|
process.exit(0);
|
||||||
|
}
|
||||||
|
applyMethodChanges(newMethod, parsed);
|
||||||
|
}
|
||||||
|
methodsArr.push(newMethod);
|
||||||
|
await patchMethods(methodsArr);
|
||||||
|
await revalidate(slug);
|
||||||
|
await addReaction('+1');
|
||||||
await postComment(
|
await postComment(
|
||||||
'❌ **PocketBase Bot**: Invalid `method` syntax.\n\n' +
|
'✅ **PocketBase Bot**: Added install method **`' + newType + '`** to **`' + slug + '`**\n\n' +
|
||||||
'**Usage:**\n```\n/pocketbase ' + slug + ' method list\n/pocketbase ' + slug + ' method <type> hdd=10\n/pocketbase ' + slug + ' method <type> cpu=4 ram=2048 hdd=20\n```'
|
formatMethodsList([newMethod]) + '\n\n' +
|
||||||
|
'*Executed by @' + actor + '*'
|
||||||
);
|
);
|
||||||
process.exit(0);
|
|
||||||
}
|
|
||||||
const targetType = methodParts[1].toLowerCase();
|
|
||||||
const resourcesStr = methodParts[2];
|
|
||||||
|
|
||||||
// Parse resource fields (only cpu/ram/hdd allowed)
|
} else if (removeMatch) {
|
||||||
const RESOURCE_FIELDS = { cpu: true, ram: true, hdd: true };
|
// ── METHOD REMOVE ────────────────────────────────────────────
|
||||||
const resourceChanges = {};
|
const removeType = removeMatch[1].toLowerCase();
|
||||||
const rePairs = /([a-z]+)=(\d+)/gi;
|
const removed = methodsArr.filter(function (im) { return (im.type || '').toLowerCase() === removeType; });
|
||||||
let m;
|
if (removed.length === 0) {
|
||||||
while ((m = rePairs.exec(resourcesStr)) !== null) {
|
await addReaction('-1');
|
||||||
const key = m[1].toLowerCase();
|
const available = methodsArr.map(function (im) { return im.type || '?'; });
|
||||||
if (RESOURCE_FIELDS[key]) resourceChanges[key] = parseInt(m[2], 10);
|
await postComment('❌ **PocketBase Bot**: No install method `' + removeType + '` found.\n\n**Available:** `' + (available.length ? available.join('`, `') : '(none)') + '`');
|
||||||
}
|
process.exit(0);
|
||||||
if (Object.keys(resourceChanges).length === 0) {
|
}
|
||||||
await addReaction('-1');
|
methodsArr = methodsArr.filter(function (im) { return (im.type || '').toLowerCase() !== removeType; });
|
||||||
await postComment('❌ **PocketBase Bot**: No valid resource fields found. Use `cpu=N`, `ram=N`, `hdd=N`.');
|
await patchMethods(methodsArr);
|
||||||
process.exit(0);
|
await revalidate(slug);
|
||||||
}
|
await addReaction('+1');
|
||||||
|
|
||||||
// Find matching method by type name (case-insensitive)
|
|
||||||
const idx = methodsArr.findIndex(function (im) {
|
|
||||||
return (im.type || '').toLowerCase() === targetType;
|
|
||||||
});
|
|
||||||
if (idx === -1) {
|
|
||||||
await addReaction('-1');
|
|
||||||
const availableTypes = methodsArr.map(function (im) { return im.type || '?'; });
|
|
||||||
await postComment(
|
await postComment(
|
||||||
'❌ **PocketBase Bot**: No install method with type `' + targetType + '` found for `' + slug + '`.\n\n' +
|
'✅ **PocketBase Bot**: Removed install method **`' + removed[0].type + '`** from **`' + slug + '`**\n\n' +
|
||||||
'**Available types:** `' + (availableTypes.length ? availableTypes.join('`, `') : '(none)') + '`\n\n' +
|
'*Executed by @' + actor + '*'
|
||||||
'Use `/pocketbase ' + slug + ' method list` to see all methods.'
|
);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// ── METHOD EDIT ──────────────────────────────────────────────
|
||||||
|
const editParts = methodArgs.match(/^(\S+)\s+(.+)$/);
|
||||||
|
if (!editParts) {
|
||||||
|
await addReaction('-1');
|
||||||
|
await postComment(
|
||||||
|
'❌ **PocketBase Bot**: Invalid `method` syntax.\n\n' +
|
||||||
|
'**Usage:**\n```\n/pocketbase ' + slug + ' method list\n' +
|
||||||
|
'/pocketbase ' + slug + ' method <type> cpu=4 ram=2048 hdd=20\n' +
|
||||||
|
'/pocketbase ' + slug + ' method <type> config_path="/opt/app/.env"\n' +
|
||||||
|
'/pocketbase ' + slug + ' method add <type> cpu=2 ram=2048 hdd=8\n' +
|
||||||
|
'/pocketbase ' + slug + ' method remove <type>\n```'
|
||||||
|
);
|
||||||
|
process.exit(0);
|
||||||
|
}
|
||||||
|
const targetType = editParts[1].toLowerCase();
|
||||||
|
const parsed = parseKVPairs(editParts[2]);
|
||||||
|
|
||||||
|
const unknown = Object.keys(parsed).filter(function (k) { return !ALL_METHOD_KEYS[k]; });
|
||||||
|
if (unknown.length > 0) {
|
||||||
|
await addReaction('-1');
|
||||||
|
await postComment('❌ **PocketBase Bot**: Unknown method field(s): `' + unknown.join('`, `') + '`\n\n**Allowed:** `' + Object.keys(ALL_METHOD_KEYS).join('`, `') + '`');
|
||||||
|
process.exit(0);
|
||||||
|
}
|
||||||
|
if (Object.keys(parsed).length === 0) {
|
||||||
|
await addReaction('-1');
|
||||||
|
await postComment('❌ **PocketBase Bot**: No valid `key=value` pairs found.\n\n**Allowed:** `' + Object.keys(ALL_METHOD_KEYS).join('`, `') + '`');
|
||||||
|
process.exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
const idx = methodsArr.findIndex(function (im) { return (im.type || '').toLowerCase() === targetType; });
|
||||||
|
if (idx === -1) {
|
||||||
|
await addReaction('-1');
|
||||||
|
const available = methodsArr.map(function (im) { return im.type || '?'; });
|
||||||
|
await postComment(
|
||||||
|
'❌ **PocketBase Bot**: No install method `' + targetType + '` found for `' + slug + '`.\n\n' +
|
||||||
|
'**Available:** `' + (available.length ? available.join('`, `') : '(none)') + '`\n\n' +
|
||||||
|
'Use `/pocketbase ' + slug + ' method list` to see all methods.'
|
||||||
|
);
|
||||||
|
process.exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
applyMethodChanges(methodsArr[idx], parsed);
|
||||||
|
await patchMethods(methodsArr);
|
||||||
|
await revalidate(slug);
|
||||||
|
|
||||||
|
const changesLines = Object.entries(parsed)
|
||||||
|
.map(function ([k, v]) {
|
||||||
|
const unit = k === 'ram' ? ' MB' : k === 'hdd' ? ' GB' : '';
|
||||||
|
return '- `' + k + '` → `' + v + unit + '`';
|
||||||
|
}).join('\n');
|
||||||
|
await addReaction('+1');
|
||||||
|
await postComment(
|
||||||
|
'✅ **PocketBase Bot**: Updated install method **`' + methodsArr[idx].type + '`** for **`' + slug + '`**\n\n' +
|
||||||
|
'**Changes applied:**\n' + changesLines + '\n\n' +
|
||||||
|
'*Executed by @' + actor + '*'
|
||||||
);
|
);
|
||||||
process.exit(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!methodsArr[idx].resources) methodsArr[idx].resources = {};
|
|
||||||
if (resourceChanges.cpu != null) methodsArr[idx].resources.cpu = resourceChanges.cpu;
|
|
||||||
if (resourceChanges.ram != null) methodsArr[idx].resources.ram = resourceChanges.ram;
|
|
||||||
if (resourceChanges.hdd != null) methodsArr[idx].resources.hdd = resourceChanges.hdd;
|
|
||||||
|
|
||||||
await patchInstallMethodsJson(methodsArr);
|
|
||||||
|
|
||||||
const changesLines = Object.entries(resourceChanges)
|
|
||||||
.map(function ([k, v]) { return '- `' + k + '` → `' + v + (k === 'ram' ? ' MB' : k === 'hdd' ? ' GB' : '') + '`'; })
|
|
||||||
.join('\n');
|
|
||||||
await addReaction('+1');
|
|
||||||
await postComment(
|
|
||||||
'✅ **PocketBase Bot**: Updated install method **`' + methodsArr[idx].type + '`** for **`' + slug + '`**\n\n' +
|
|
||||||
'**Changes applied:**\n' + changesLines + '\n\n' +
|
|
||||||
'*Executed by @' + actor + '*'
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (setMatch) {
|
} else if (setMatch) {
|
||||||
// ── SET SUBCOMMAND (multi-line / HTML / special chars via code block) ──
|
// ── SET SUBCOMMAND (value from code block) ───────────────────────
|
||||||
const fieldName = setMatch[1].toLowerCase();
|
const fieldName = setMatch[1].toLowerCase();
|
||||||
const SET_ALLOWED = {
|
const SET_ALLOWED = {
|
||||||
name: 'string', description: 'string', logo: 'string',
|
name: 'string', description: 'string', logo: 'string',
|
||||||
@@ -531,6 +692,7 @@ jobs:
|
|||||||
await postComment('❌ **PocketBase Bot**: PATCH failed for `' + slug + '`:\n```\n' + setPatchRes.body + '\n```');
|
await postComment('❌ **PocketBase Bot**: PATCH failed for `' + slug + '`:\n```\n' + setPatchRes.body + '\n```');
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
await revalidate(slug);
|
||||||
const preview = codeBlockValue.length > 300 ? codeBlockValue.substring(0, 300) + '…' : codeBlockValue;
|
const preview = codeBlockValue.length > 300 ? codeBlockValue.substring(0, 300) + '…' : codeBlockValue;
|
||||||
await addReaction('+1');
|
await addReaction('+1');
|
||||||
await postComment(
|
await postComment(
|
||||||
@@ -541,11 +703,6 @@ jobs:
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
// ── FIELD=VALUE PATH ─────────────────────────────────────────────
|
// ── FIELD=VALUE PATH ─────────────────────────────────────────────
|
||||||
const fieldsStr = rest;
|
|
||||||
|
|
||||||
// Skipped: slug, script_created/updated, created (auto), categories/
|
|
||||||
// install_methods/notes/type (relations), github_data/install_methods_json/
|
|
||||||
// notes_json (auto-generated), execute_in (select relation), last_update_commit (auto)
|
|
||||||
const ALLOWED_FIELDS = {
|
const ALLOWED_FIELDS = {
|
||||||
name: 'string',
|
name: 'string',
|
||||||
description: 'string',
|
description: 'string',
|
||||||
@@ -568,39 +725,7 @@ jobs:
|
|||||||
deleted_message: 'string',
|
deleted_message: 'string',
|
||||||
};
|
};
|
||||||
|
|
||||||
// Field=value parser (handles quoted values and empty=null)
|
const parsedFields = parseKVPairs(rest);
|
||||||
function parseFields(str) {
|
|
||||||
const fields = {};
|
|
||||||
let pos = 0;
|
|
||||||
while (pos < str.length) {
|
|
||||||
while (pos < str.length && /\s/.test(str[pos])) pos++;
|
|
||||||
if (pos >= str.length) break;
|
|
||||||
let keyStart = pos;
|
|
||||||
while (pos < str.length && str[pos] !== '=' && !/\s/.test(str[pos])) pos++;
|
|
||||||
const key = str.substring(keyStart, pos).trim();
|
|
||||||
if (!key || pos >= str.length || str[pos] !== '=') { pos++; continue; }
|
|
||||||
pos++;
|
|
||||||
let value;
|
|
||||||
if (str[pos] === '"') {
|
|
||||||
pos++;
|
|
||||||
let valStart = pos;
|
|
||||||
while (pos < str.length && str[pos] !== '"') {
|
|
||||||
if (str[pos] === '\\') pos++;
|
|
||||||
pos++;
|
|
||||||
}
|
|
||||||
value = str.substring(valStart, pos).replace(/\\"/g, '"');
|
|
||||||
if (pos < str.length) pos++;
|
|
||||||
} else {
|
|
||||||
let valStart = pos;
|
|
||||||
while (pos < str.length && !/\s/.test(str[pos])) pos++;
|
|
||||||
value = str.substring(valStart, pos);
|
|
||||||
}
|
|
||||||
fields[key] = value;
|
|
||||||
}
|
|
||||||
return fields;
|
|
||||||
}
|
|
||||||
|
|
||||||
const parsedFields = parseFields(fieldsStr);
|
|
||||||
|
|
||||||
const unknownFields = Object.keys(parsedFields).filter(function (f) { return !ALLOWED_FIELDS[f]; });
|
const unknownFields = Object.keys(parsedFields).filter(function (f) { return !ALLOWED_FIELDS[f]; });
|
||||||
if (unknownFields.length > 0) {
|
if (unknownFields.length > 0) {
|
||||||
@@ -655,6 +780,7 @@ jobs:
|
|||||||
await postComment('❌ **PocketBase Bot**: PATCH failed for `' + slug + '`:\n```\n' + patchRes.body + '\n```');
|
await postComment('❌ **PocketBase Bot**: PATCH failed for `' + slug + '`:\n```\n' + patchRes.body + '\n```');
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
await revalidate(slug);
|
||||||
await addReaction('+1');
|
await addReaction('+1');
|
||||||
const changesLines = Object.entries(payload)
|
const changesLines = Object.entries(payload)
|
||||||
.map(function ([k, v]) { return '- `' + k + '` → `' + JSON.stringify(v) + '`'; })
|
.map(function ([k, v]) { return '- `' + k + '` → `' + JSON.stringify(v) + '`'; })
|
||||||
|
|||||||
1
.github/workflows/push-json-to-pocketbase.yml
generated
vendored
1
.github/workflows/push-json-to-pocketbase.yml
generated
vendored
@@ -170,7 +170,6 @@ jobs:
|
|||||||
website: data.website,
|
website: data.website,
|
||||||
logo: data.logo,
|
logo: data.logo,
|
||||||
description: data.description,
|
description: data.description,
|
||||||
config_path: data.config_path,
|
|
||||||
default_user: (data.default_credentials && data.default_credentials.username) || data.default_user || null,
|
default_user: (data.default_credentials && data.default_credentials.username) || data.default_user || null,
|
||||||
default_passwd: (data.default_credentials && data.default_credentials.password) || data.default_passwd || null,
|
default_passwd: (data.default_credentials && data.default_credentials.password) || data.default_passwd || null,
|
||||||
is_dev: false
|
is_dev: false
|
||||||
|
|||||||
25
CHANGELOG.md
25
CHANGELOG.md
@@ -442,6 +442,27 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
## 2026-04-14
|
||||||
|
|
||||||
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
|
- Immich: Pin photo-processing library revisions [@vhsdream](https://github.com/vhsdream) ([#13748](https://github.com/community-scripts/ProxmoxVE/pull/13748))
|
||||||
|
|
||||||
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
|
- BentoPDF: Nginx fixes [@tremor021](https://github.com/tremor021) ([#13741](https://github.com/community-scripts/ProxmoxVE/pull/13741))
|
||||||
|
- Zerobyte: add git to dependencies to fix bun install failure [@Copilot](https://github.com/Copilot) ([#13721](https://github.com/community-scripts/ProxmoxVE/pull/13721))
|
||||||
|
- alpine-nextcloud-install: do not use deprecated nginx config [@AlexanderStein](https://github.com/AlexanderStein) ([#13726](https://github.com/community-scripts/ProxmoxVE/pull/13726))
|
||||||
|
|
||||||
|
- #### ✨ New Features
|
||||||
|
|
||||||
|
- Mealie: support v3.15+ Nuxt 4 migration [@MickLesk](https://github.com/MickLesk) ([#13731](https://github.com/community-scripts/ProxmoxVE/pull/13731))
|
||||||
|
|
||||||
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
|
- Lyrion: correct service name and version file in update script [@MickLesk](https://github.com/MickLesk) ([#13734](https://github.com/community-scripts/ProxmoxVE/pull/13734))
|
||||||
|
- Changedetection: move env vars from service file to .env [@tremor021](https://github.com/tremor021) ([#13732](https://github.com/community-scripts/ProxmoxVE/pull/13732))
|
||||||
|
|
||||||
## 2026-04-13
|
## 2026-04-13
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
### 🚀 Updated Scripts
|
||||||
@@ -457,6 +478,10 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
- Bytestash: auto backup/restore data on update [@MickLesk](https://github.com/MickLesk) ([#13707](https://github.com/community-scripts/ProxmoxVE/pull/13707))
|
- Bytestash: auto backup/restore data on update [@MickLesk](https://github.com/MickLesk) ([#13707](https://github.com/community-scripts/ProxmoxVE/pull/13707))
|
||||||
- OpenCloud: pin version to 6.0.0 [@vhsdream](https://github.com/vhsdream) ([#13691](https://github.com/community-scripts/ProxmoxVE/pull/13691))
|
- OpenCloud: pin version to 6.0.0 [@vhsdream](https://github.com/vhsdream) ([#13691](https://github.com/community-scripts/ProxmoxVE/pull/13691))
|
||||||
|
|
||||||
|
- #### 💥 Breaking Changes
|
||||||
|
|
||||||
|
- Mealie: pin version to v3.14.0 in install and update scripts [@Copilot](https://github.com/Copilot) ([#13724](https://github.com/community-scripts/ProxmoxVE/pull/13724))
|
||||||
|
|
||||||
- #### 🔧 Refactor
|
- #### 🔧 Refactor
|
||||||
|
|
||||||
- core: remove unused TEMP_DIR mktemp leak in build_container / clean sonarqube [@MickLesk](https://github.com/MickLesk) ([#13708](https://github.com/community-scripts/ProxmoxVE/pull/13708))
|
- core: remove unused TEMP_DIR mktemp leak in build_container / clean sonarqube [@MickLesk](https://github.com/MickLesk) ([#13708](https://github.com/community-scripts/ProxmoxVE/pull/13708))
|
||||||
|
|||||||
43
ct/apache-cassandra.sh
Normal file
43
ct/apache-cassandra.sh
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2026 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://cassandra.apache.org/_/index.html
|
||||||
|
|
||||||
|
APP="Apache-Cassandra"
|
||||||
|
var_tags="${var_tags:-database;NoSQL}"
|
||||||
|
var_cpu="${var_cpu:-1}"
|
||||||
|
var_ram="${var_ram:-2048}"
|
||||||
|
var_disk="${var_disk:-4}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
if [[ ! -f /etc/init.d/cassandra ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
msg_info "Updating Apache Cassandra"
|
||||||
|
$STD apt update
|
||||||
|
$STD apt install -y --only-upgrade cassandra cassandra-tools
|
||||||
|
msg_ok "Updated Apache Cassandra"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed successfully!\n"
|
||||||
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
52
ct/argus.sh
Normal file
52
ct/argus.sh
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: MickLesk (CanbiZ)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://release-argus.io/ | Github: https://github.com/release-argus/Argus
|
||||||
|
|
||||||
|
APP="Argus"
|
||||||
|
var_tags="${var_tags:-watcher}"
|
||||||
|
var_cpu="${var_cpu:-1}"
|
||||||
|
var_ram="${var_ram:-512}"
|
||||||
|
var_disk="${var_disk:-3}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
if [[ ! -d /opt/argus ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
if check_for_gh_release "argus" "release-argus/Argus"; then
|
||||||
|
msg_info "Stopping service"
|
||||||
|
systemctl stop argus
|
||||||
|
msg_ok "Service stopped"
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "Argus" "release-argus/Argus" "singlefile" "latest" "/opt/argus" "Argus*linux-amd64"
|
||||||
|
|
||||||
|
msg_info "Starting service"
|
||||||
|
systemctl start argus
|
||||||
|
msg_ok "Service started"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
fi
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed successfully!\n"
|
||||||
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}"
|
||||||
68
ct/commafeed.sh
Normal file
68
ct/commafeed.sh
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2026 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://www.commafeed.com/#/welcome | Github: https://github.com/Athou/commafeed
|
||||||
|
|
||||||
|
APP="CommaFeed"
|
||||||
|
var_tags="${var_tags:-rss-reader}"
|
||||||
|
var_cpu="${var_cpu:-2}"
|
||||||
|
var_ram="${var_ram:-2048}"
|
||||||
|
var_disk="${var_disk:-4}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
|
||||||
|
if [[ ! -d /opt/commafeed ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
JAVA_VERSION="25" setup_java
|
||||||
|
if check_for_gh_release "commafeed" "Athou/commafeed"; then
|
||||||
|
msg_info "Stopping Service"
|
||||||
|
systemctl stop commafeed
|
||||||
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
|
ensure_dependencies rsync
|
||||||
|
|
||||||
|
if [ -d /opt/commafeed/data ] && [ "$(ls -A /opt/commafeed/data)" ]; then
|
||||||
|
msg_info "Backing up existing data"
|
||||||
|
mv /opt/commafeed/data /opt/data.bak
|
||||||
|
msg_ok "Backed up existing data"
|
||||||
|
fi
|
||||||
|
|
||||||
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "commafeed" "Athou/commafeed" "prebuild" "latest" "/opt/commafeed" "commafeed-*-h2-jvm.zip"
|
||||||
|
|
||||||
|
if [ -d /opt/data.bak ] && [ "$(ls -A /opt/data.bak)" ]; then
|
||||||
|
msg_info "Restoring data"
|
||||||
|
mv /opt/data.bak /opt/commafeed/data
|
||||||
|
msg_ok "Restored data"
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_info "Starting Service"
|
||||||
|
systemctl start commafeed
|
||||||
|
msg_ok "Started Service"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
fi
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed successfully!\n"
|
||||||
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8082${CL}"
|
||||||
44
ct/globaleaks.sh
Normal file
44
ct/globaleaks.sh
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: Giovanni Pellerano (evilaliv3)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/globaleaks/globaleaks-whistleblowing-software
|
||||||
|
|
||||||
|
APP="GlobaLeaks"
|
||||||
|
var_tags="${var_tags:-whistleblowing-software}"
|
||||||
|
var_disk="${var_disk:-4}"
|
||||||
|
var_cpu="${var_cpu:-2}"
|
||||||
|
var_ram="${var_ram:-2048}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
if [[ ! -f /usr/sbin/globaleaks ]]; then
|
||||||
|
msg_error "No ${APP} installation found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg_info "Updating $APP LXC"
|
||||||
|
$STD apt update
|
||||||
|
$STD apt -y upgrade
|
||||||
|
msg_ok "Updated $APP LXC"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed successfully!\n"
|
||||||
|
echo -e "${CREATING}${GN} ${APP} setup has been successfully initialized!${CL}"
|
||||||
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
|
echo -e "${TAB}${GATEWAY}${BGN}https://${IP}${CL}"
|
||||||
6
ct/headers/apache-cassandra
Normal file
6
ct/headers/apache-cassandra
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
___ __ ______ __
|
||||||
|
/ | ____ ____ ______/ /_ ___ / ____/___ _______________ _____ ____/ /________ _
|
||||||
|
/ /| | / __ \/ __ `/ ___/ __ \/ _ \______/ / / __ `/ ___/ ___/ __ `/ __ \/ __ / ___/ __ `/
|
||||||
|
/ ___ |/ /_/ / /_/ / /__/ / / / __/_____/ /___/ /_/ (__ |__ ) /_/ / / / / /_/ / / / /_/ /
|
||||||
|
/_/ |_/ .___/\__,_/\___/_/ /_/\___/ \____/\__,_/____/____/\__,_/_/ /_/\__,_/_/ \__,_/
|
||||||
|
/_/
|
||||||
6
ct/headers/argus
Normal file
6
ct/headers/argus
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
___
|
||||||
|
/ | _________ ___ _______
|
||||||
|
/ /| | / ___/ __ `/ / / / ___/
|
||||||
|
/ ___ |/ / / /_/ / /_/ (__ )
|
||||||
|
/_/ |_/_/ \__, /\__,_/____/
|
||||||
|
/____/
|
||||||
6
ct/headers/commafeed
Normal file
6
ct/headers/commafeed
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
______ ______ __
|
||||||
|
/ ____/___ ____ ___ ____ ___ ____ _/ ____/__ ___ ____/ /
|
||||||
|
/ / / __ \/ __ `__ \/ __ `__ \/ __ `/ /_ / _ \/ _ \/ __ /
|
||||||
|
/ /___/ /_/ / / / / / / / / / / / /_/ / __/ / __/ __/ /_/ /
|
||||||
|
\____/\____/_/ /_/ /_/_/ /_/ /_/\__,_/_/ \___/\___/\__,_/
|
||||||
|
|
||||||
6
ct/headers/globaleaks
Normal file
6
ct/headers/globaleaks
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
________ __ __ __
|
||||||
|
/ ____/ /___ / /_ ____ _/ / ___ ____ _/ /_______
|
||||||
|
/ / __/ / __ \/ __ \/ __ `/ / / _ \/ __ `/ //_/ ___/
|
||||||
|
/ /_/ / / /_/ / /_/ / /_/ / /___/ __/ /_/ / ,< (__ )
|
||||||
|
\____/_/\____/_.___/\__,_/_____/\___/\__,_/_/|_/____/
|
||||||
|
|
||||||
6
ct/headers/hivemq
Normal file
6
ct/headers/hivemq
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
__ ___ __ _______
|
||||||
|
/ / / (_) _____ / |/ / __ \
|
||||||
|
/ /_/ / / | / / _ \/ /|_/ / / / /
|
||||||
|
/ __ / /| |/ / __/ / / / /_/ /
|
||||||
|
/_/ /_/_/ |___/\___/_/ /_/\___\_\
|
||||||
|
|
||||||
6
ct/headers/inspircd
Normal file
6
ct/headers/inspircd
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
____ ________ ______ __
|
||||||
|
/ _/___ _________ / _/ __ \/ ____/___/ /
|
||||||
|
/ // __ \/ ___/ __ \ / // /_/ / / / __ /
|
||||||
|
_/ // / / (__ ) /_/ // // _, _/ /___/ /_/ /
|
||||||
|
/___/_/ /_/____/ .___/___/_/ |_|\____/\__,_/
|
||||||
|
/_/
|
||||||
6
ct/headers/kubo
Normal file
6
ct/headers/kubo
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
__ __ __
|
||||||
|
/ //_/_ __/ /_ ____
|
||||||
|
/ ,< / / / / __ \/ __ \
|
||||||
|
/ /| / /_/ / /_/ / /_/ /
|
||||||
|
/_/ |_\__,_/_.___/\____/
|
||||||
|
|
||||||
6
ct/headers/neo4j
Normal file
6
ct/headers/neo4j
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
_ __ __ __ _
|
||||||
|
/ | / /__ ____ / // / (_)
|
||||||
|
/ |/ / _ \/ __ \/ // /_/ /
|
||||||
|
/ /| / __/ /_/ /__ __/ /
|
||||||
|
/_/ |_/\___/\____/ /_/_/ /
|
||||||
|
/___/
|
||||||
6
ct/headers/nodebb
Normal file
6
ct/headers/nodebb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
_ __ __ ____ ____
|
||||||
|
/ | / /___ ____/ /__ / __ )/ __ )
|
||||||
|
/ |/ / __ \/ __ / _ \/ __ / __ |
|
||||||
|
/ /| / /_/ / /_/ / __/ /_/ / /_/ /
|
||||||
|
/_/ |_/\____/\__,_/\___/_____/_____/
|
||||||
|
|
||||||
6
ct/headers/opengist
Normal file
6
ct/headers/opengist
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
____ _ __
|
||||||
|
/ __ \____ ___ ____ ____ _(_)____/ /_
|
||||||
|
/ / / / __ \/ _ \/ __ \/ __ `/ / ___/ __/
|
||||||
|
/ /_/ / /_/ / __/ / / / /_/ / (__ ) /_
|
||||||
|
\____/ .___/\___/_/ /_/\__, /_/____/\__/
|
||||||
|
/_/ /____/
|
||||||
6
ct/headers/ots
Normal file
6
ct/headers/ots
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
____ ___________
|
||||||
|
/ __ \/_ __/ ___/
|
||||||
|
/ / / / / / \__ \
|
||||||
|
/ /_/ / / / ___/ /
|
||||||
|
\____/ /_/ /____/
|
||||||
|
|
||||||
6
ct/headers/ps5-mqtt
Normal file
6
ct/headers/ps5-mqtt
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
____ _____ ______ __ _______ ____________
|
||||||
|
/ __ \/ ___// ____/ / |/ / __ \/_ __/_ __/
|
||||||
|
/ /_/ /\__ \/___ \______/ /|_/ / / / / / / / /
|
||||||
|
/ ____/___/ /___/ /_____/ / / / /_/ / / / / /
|
||||||
|
/_/ /____/_____/ /_/ /_/\___\_\/_/ /_/
|
||||||
|
|
||||||
6
ct/headers/rustypaste
Normal file
6
ct/headers/rustypaste
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
__ __
|
||||||
|
_______ _______/ /___ ______ ____ ______/ /____
|
||||||
|
/ ___/ / / / ___/ __/ / / / __ \/ __ `/ ___/ __/ _ \
|
||||||
|
/ / / /_/ (__ ) /_/ /_/ / /_/ / /_/ (__ ) /_/ __/
|
||||||
|
/_/ \__,_/____/\__/\__, / .___/\__,_/____/\__/\___/
|
||||||
|
/____/_/
|
||||||
6
ct/headers/seelf
Normal file
6
ct/headers/seelf
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
______
|
||||||
|
________ ___ / / __/
|
||||||
|
/ ___/ _ \/ _ \/ / /_
|
||||||
|
(__ ) __/ __/ / __/
|
||||||
|
/____/\___/\___/_/_/
|
||||||
|
|
||||||
6
ct/headers/streamlink-webui
Normal file
6
ct/headers/streamlink-webui
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
__ ___ __ __ _
|
||||||
|
_____/ /_________ ____ _____ ___ / (_)___ / /__ _ _____ / /_ __ __(_)
|
||||||
|
/ ___/ __/ ___/ _ \/ __ `/ __ `__ \/ / / __ \/ //_/____| | /| / / _ \/ __ \/ / / / /
|
||||||
|
(__ ) /_/ / / __/ /_/ / / / / / / / / / / / ,< /_____/ |/ |/ / __/ /_/ / /_/ / /
|
||||||
|
/____/\__/_/ \___/\__,_/_/ /_/ /_/_/_/_/ /_/_/|_| |__/|__/\___/_.___/\__,_/_/
|
||||||
|
|
||||||
6
ct/headers/valkey
Normal file
6
ct/headers/valkey
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
_ __ ____
|
||||||
|
| | / /___ _/ / /_____ __ __
|
||||||
|
| | / / __ `/ / //_/ _ \/ / / /
|
||||||
|
| |/ / /_/ / / ,< / __/ /_/ /
|
||||||
|
|___/\__,_/_/_/|_|\___/\__, /
|
||||||
|
/____/
|
||||||
6
ct/headers/wavelog
Normal file
6
ct/headers/wavelog
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
_ __ __
|
||||||
|
| | / /___ __ _____ / /___ ____ _
|
||||||
|
| | /| / / __ `/ | / / _ \/ / __ \/ __ `/
|
||||||
|
| |/ |/ / /_/ /| |/ / __/ / /_/ / /_/ /
|
||||||
|
|__/|__/\__,_/ |___/\___/_/\____/\__, /
|
||||||
|
/____/
|
||||||
6
ct/headers/writefreely
Normal file
6
ct/headers/writefreely
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
_ __ _ __ ______ __
|
||||||
|
| | / /____(_) /____ / ____/_______ ___ / /_ __
|
||||||
|
| | /| / / ___/ / __/ _ \/ /_ / ___/ _ \/ _ \/ / / / /
|
||||||
|
| |/ |/ / / / / /_/ __/ __/ / / / __/ __/ / /_/ /
|
||||||
|
|__/|__/_/ /_/\__/\___/_/ /_/ \___/\___/_/\__, /
|
||||||
|
/____/
|
||||||
39
ct/hivemq.sh
Normal file
39
ct/hivemq.sh
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2026 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://www.hivemq.com/ | Github: https://github.com/hivemq/hivemq-community-edition
|
||||||
|
|
||||||
|
APP="HiveMQ"
|
||||||
|
var_tags="${var_tags:-mqtt}"
|
||||||
|
var_cpu="${var_cpu:-1}"
|
||||||
|
var_ram="${var_ram:-1024}"
|
||||||
|
var_disk="${var_disk:-4}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
if [[ ! -d /var ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
msg_error "Currently we don't provide an update function for this ${APP}."
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed successfully!\n"
|
||||||
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
@@ -309,7 +309,8 @@ function compile_libjxl() {
|
|||||||
SOURCE=${SOURCE_DIR}/libjxl
|
SOURCE=${SOURCE_DIR}/libjxl
|
||||||
JPEGLI_LIBJPEG_LIBRARY_SOVERSION="62"
|
JPEGLI_LIBJPEG_LIBRARY_SOVERSION="62"
|
||||||
JPEGLI_LIBJPEG_LIBRARY_VERSION="62.3.0"
|
JPEGLI_LIBJPEG_LIBRARY_VERSION="62.3.0"
|
||||||
: "${LIBJXL_REVISION:=$(jq -cr '.revision' "$BASE_DIR"/server/sources/libjxl.json)}"
|
LIBJXL_REVISION="794a5dcf0d54f9f0b20d288a12e87afb91d20dfc"
|
||||||
|
# : "${LIBJXL_REVISION:=$(jq -cr '.revision' "$BASE_DIR"/server/sources/libjxl.json)}"
|
||||||
if [[ "$LIBJXL_REVISION" != "$(grep 'libjxl' ~/.immich_library_revisions | awk '{print $2}')" ]]; then
|
if [[ "$LIBJXL_REVISION" != "$(grep 'libjxl' ~/.immich_library_revisions | awk '{print $2}')" ]]; then
|
||||||
msg_info "Recompiling libjxl"
|
msg_info "Recompiling libjxl"
|
||||||
[[ -d "$SOURCE" ]] && rm -rf "$SOURCE"
|
[[ -d "$SOURCE" ]] && rm -rf "$SOURCE"
|
||||||
@@ -353,7 +354,8 @@ function compile_libjxl() {
|
|||||||
function compile_libheif() {
|
function compile_libheif() {
|
||||||
SOURCE=${SOURCE_DIR}/libheif
|
SOURCE=${SOURCE_DIR}/libheif
|
||||||
ensure_dependencies libaom-dev
|
ensure_dependencies libaom-dev
|
||||||
: "${LIBHEIF_REVISION:=$(jq -cr '.revision' "$BASE_DIR"/server/sources/libheif.json)}"
|
LIBHEIF_REVISION="35dad50a9145332a7bfdf1ff6aef6801fb613d68"
|
||||||
|
# : "${LIBHEIF_REVISION:=$(jq -cr '.revision' "$BASE_DIR"/server/sources/libheif.json)}"
|
||||||
if [[ "${update:-}" ]] || [[ "$LIBHEIF_REVISION" != "$(grep 'libheif' ~/.immich_library_revisions | awk '{print $2}')" ]]; then
|
if [[ "${update:-}" ]] || [[ "$LIBHEIF_REVISION" != "$(grep 'libheif' ~/.immich_library_revisions | awk '{print $2}')" ]]; then
|
||||||
msg_info "Recompiling libheif"
|
msg_info "Recompiling libheif"
|
||||||
[[ -d "$SOURCE" ]] && rm -rf "$SOURCE"
|
[[ -d "$SOURCE" ]] && rm -rf "$SOURCE"
|
||||||
@@ -384,7 +386,8 @@ function compile_libheif() {
|
|||||||
|
|
||||||
function compile_libraw() {
|
function compile_libraw() {
|
||||||
SOURCE=${SOURCE_DIR}/libraw
|
SOURCE=${SOURCE_DIR}/libraw
|
||||||
: "${LIBRAW_REVISION:=$(jq -cr '.revision' "$BASE_DIR"/server/sources/libraw.json)}"
|
LIBRAW_REVISION="0b56545a4f828743f28a4345cdfdd4c49f9f9a2a"
|
||||||
|
# : "${LIBRAW_REVISION:=$(jq -cr '.revision' "$BASE_DIR"/server/sources/libraw.json)}"
|
||||||
if [[ "$LIBRAW_REVISION" != "$(grep 'libraw' ~/.immich_library_revisions | awk '{print $2}')" ]]; then
|
if [[ "$LIBRAW_REVISION" != "$(grep 'libraw' ~/.immich_library_revisions | awk '{print $2}')" ]]; then
|
||||||
msg_info "Recompiling libraw"
|
msg_info "Recompiling libraw"
|
||||||
[[ -d "$SOURCE" ]] && rm -rf "$SOURCE"
|
[[ -d "$SOURCE" ]] && rm -rf "$SOURCE"
|
||||||
|
|||||||
52
ct/inspircd.sh
Normal file
52
ct/inspircd.sh
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: kristocopani
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://www.inspircd.org/ | Github: https://github.com/inspircd/inspircd
|
||||||
|
|
||||||
|
APP="InspIRCd"
|
||||||
|
var_tags="${var_tags:-IRC}"
|
||||||
|
var_cpu="${var_cpu:-1}"
|
||||||
|
var_ram="${var_ram:-512}"
|
||||||
|
var_disk="${var_disk:-2}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
|
||||||
|
if [[ ! -f /lib/systemd/system/inspircd.service ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
if check_for_gh_release "inspircd" "inspircd/inspircd"; then
|
||||||
|
msg_info "Stopping Service"
|
||||||
|
systemctl stop inspircd
|
||||||
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "inspircd" "inspircd/inspircd" "binary" "latest" "/opt/inspircd" "inspircd_*.deb13u1_amd64.deb"
|
||||||
|
|
||||||
|
msg_info "Starting Service"
|
||||||
|
systemctl start inspircd
|
||||||
|
msg_ok "Started Service"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
fi
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed successfully!\n"
|
||||||
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
|
echo -e "${INFO}${YW} Server-Acces it using the following URL:${CL}"
|
||||||
|
echo -e "${TAB}${GATEWAY}${BGN}${IP}:6667${CL}"
|
||||||
52
ct/kubo.sh
Normal file
52
ct/kubo.sh
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2026 tteck
|
||||||
|
# Author: tteck (tteckster) | Co-Author: ulmentflam
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/ipfs/kubo
|
||||||
|
|
||||||
|
APP="Kubo"
|
||||||
|
var_tags="${var_tags:-sharing}"
|
||||||
|
var_cpu="${var_cpu:-2}"
|
||||||
|
var_ram="${var_ram:-4096}"
|
||||||
|
var_disk="${var_disk:-4}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
if [[ ! -f /usr/local/kubo/ipfs ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
if check_for_gh_release "kubo" "ipfs/kubo"; then
|
||||||
|
msg_info "Stopping service"
|
||||||
|
systemctl stop ipfs
|
||||||
|
msg_ok "Stopped service"
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "kubo" "ipfs/kubo" "prebuild" "latest" "/usr/local/kubo" "kubo*linux-amd64.tar.gz"
|
||||||
|
|
||||||
|
msg_info "Starting service"
|
||||||
|
systemctl start ipfs
|
||||||
|
msg_ok "Service started"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
fi
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed successfully!\n"
|
||||||
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5001/webui${CL}"
|
||||||
@@ -30,16 +30,16 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
DEB_URL=$(curl -s 'https://lyrion.org/getting-started/' | grep -oP '<a\s[^>]*href="\K[^"]*amd64\.deb(?="[^>]*>)' | head -n 1)
|
DEB_URL=$(curl_with_retry 'https://lyrion.org/getting-started/' | grep -oP '<a\s[^>]*href="\K[^"]*amd64\.deb(?="[^>]*>)' | head -n 1)
|
||||||
RELEASE=$(echo "$DEB_URL" | grep -oP 'lyrionmusicserver_\K[0-9.]+(?=_amd64\.deb)')
|
RELEASE=$(echo "$DEB_URL" | grep -oP 'lyrionmusicserver_\K[0-9.]+(?=_amd64\.deb)')
|
||||||
DEB_FILE="/tmp/lyrionmusicserver_${RELEASE}_amd64.deb"
|
DEB_FILE="/tmp/lyrionmusicserver_${RELEASE}_amd64.deb"
|
||||||
if [[ ! -f /opt/lyrion_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/lyrion_version.txt)" ]]; then
|
if [[ ! -f /opt/lyrion_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/lyrion_version.txt)" ]]; then
|
||||||
msg_info "Updating $APP to ${RELEASE}"
|
msg_info "Updating $APP to ${RELEASE}"
|
||||||
curl -fsSL -o "$DEB_FILE" "$DEB_URL"
|
curl_with_retry "$DEB_URL" "$DEB_FILE"
|
||||||
$STD apt install "$DEB_FILE" -y
|
$STD apt install "$DEB_FILE" -y
|
||||||
systemctl restart lyrion
|
systemctl restart lyrionmusicserver
|
||||||
$STD rm -f "$DEB_FILE"
|
rm -f "$DEB_FILE"
|
||||||
echo "${RELEASE}" >/opt/${APP}_version.txt
|
echo "${RELEASE}" >/opt/lyrion_version.txt
|
||||||
msg_ok "Updated $APP to ${RELEASE}"
|
msg_ok "Updated $APP to ${RELEASE}"
|
||||||
msg_ok "Updated successfully!"
|
msg_ok "Updated successfully!"
|
||||||
else
|
else
|
||||||
|
|||||||
10
ct/mealie.sh
10
ct/mealie.sh
@@ -40,7 +40,7 @@ function update_script() {
|
|||||||
cp -f /opt/mealie/mealie.env /opt/mealie.env
|
cp -f /opt/mealie/mealie.env /opt/mealie.env
|
||||||
msg_ok "Backup completed"
|
msg_ok "Backup completed"
|
||||||
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "mealie" "mealie-recipes/mealie" "tarball" "latest" "/opt/mealie"
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "mealie" "mealie-recipes/mealie" "tarball"
|
||||||
|
|
||||||
msg_info "Installing Python Dependencies with uv"
|
msg_info "Installing Python Dependencies with uv"
|
||||||
cd /opt/mealie
|
cd /opt/mealie
|
||||||
@@ -49,9 +49,10 @@ function update_script() {
|
|||||||
|
|
||||||
msg_info "Building Frontend"
|
msg_info "Building Frontend"
|
||||||
MEALIE_VERSION=$(<$HOME/.mealie)
|
MEALIE_VERSION=$(<$HOME/.mealie)
|
||||||
$STD sed -i "s|https://github.com/mealie-recipes/mealie/commit/|https://github.com/mealie-recipes/mealie/releases/tag/|g" /opt/mealie/frontend/pages/admin/site-settings.vue
|
SITE_SETTINGS=$(find /opt/mealie/frontend -name "site-settings.vue" -path "*/admin/*" | head -1)
|
||||||
$STD sed -i "s|value: data.buildId,|value: \"v${MEALIE_VERSION}\",|g" /opt/mealie/frontend/pages/admin/site-settings.vue
|
$STD sed -i "s|https://github.com/mealie-recipes/mealie/commit/|https://github.com/mealie-recipes/mealie/releases/tag/|g" "$SITE_SETTINGS"
|
||||||
$STD sed -i "s|value: data.production ? i18n.t(\"about.production\") : i18n.t(\"about.development\"),|value: \"bare-metal\",|g" /opt/mealie/frontend/pages/admin/site-settings.vue
|
$STD sed -i "s|value: data.buildId,|value: \"v${MEALIE_VERSION}\",|g" "$SITE_SETTINGS"
|
||||||
|
$STD sed -i "s|value: data.production ? i18n.t(\"about.production\") : i18n.t(\"about.development\"),|value: \"bare-metal\",|g" "$SITE_SETTINGS"
|
||||||
export NUXT_TELEMETRY_DISABLED=1
|
export NUXT_TELEMETRY_DISABLED=1
|
||||||
cd /opt/mealie/frontend
|
cd /opt/mealie/frontend
|
||||||
$STD yarn install --prefer-offline --frozen-lockfile --non-interactive --production=false --network-timeout 1000000
|
$STD yarn install --prefer-offline --frozen-lockfile --non-interactive --production=false --network-timeout 1000000
|
||||||
@@ -97,4 +98,3 @@ msg_ok "Completed successfully!\n"
|
|||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9000${CL}"
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9000${CL}"
|
||||||
|
|
||||||
|
|||||||
46
ct/neo4j.sh
Normal file
46
ct/neo4j.sh
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2026 tteck
|
||||||
|
# Author: tteck | Co-Author: havardthom
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://neo4j.com/product/neo4j-graph-database/
|
||||||
|
|
||||||
|
APP="Neo4j"
|
||||||
|
var_tags="${var_tags:-database}"
|
||||||
|
var_cpu="${var_cpu:-1}"
|
||||||
|
var_ram="${var_ram:-1024}"
|
||||||
|
var_disk="${var_disk:-4}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
if [[ ! -d /etc/neo4j ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
JAVA_VERSION="21" setup_java
|
||||||
|
|
||||||
|
msg_info "Updating ${APP}"
|
||||||
|
$STD apt update
|
||||||
|
$STD apt -y upgrade
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed successfully!\n"
|
||||||
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:7474${CL}"
|
||||||
59
ct/nodebb.sh
Normal file
59
ct/nodebb.sh
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: MickLesk (Canbiz)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/NodeBB/NodeBB
|
||||||
|
|
||||||
|
APP="NodeBB"
|
||||||
|
var_tags="${var_tags:-forum}"
|
||||||
|
var_disk="${var_disk:-10}"
|
||||||
|
var_cpu="${var_cpu:-4}"
|
||||||
|
var_ram="${var_ram:-2048}"
|
||||||
|
var_os="${var_os:-ubuntu}"
|
||||||
|
var_version="${var_version:-24.04}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
# App Output & Base Settings
|
||||||
|
header_info "$APP"
|
||||||
|
|
||||||
|
# Core
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
if [[ ! -d /opt/nodebb ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
if check_for_gh_release "nodebb" "NodeBB/NodeBB"; then
|
||||||
|
msg_info "Stopping Service"
|
||||||
|
systemctl stop nodebb
|
||||||
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
|
msg_info "Updating ${APP}"
|
||||||
|
cd /opt/nodebb
|
||||||
|
$STD ./nodebb upgrade
|
||||||
|
echo "${CHECK_UPDATE_RELEASE}" >~/.nodebb
|
||||||
|
msg_ok "Updated ${APP}"
|
||||||
|
|
||||||
|
msg_info "Starting Service"
|
||||||
|
systemctl start nodebb
|
||||||
|
msg_ok "Started Service"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
fi
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed successfully!\n"
|
||||||
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:4567${CL}"
|
||||||
60
ct/opengist.sh
Normal file
60
ct/opengist.sh
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: Jonathan (jd-apprentice)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://opengist.io/ | Github: https://github.com/thomiceli/opengist
|
||||||
|
|
||||||
|
APP="Opengist"
|
||||||
|
var_tags="${var_tags:-development}"
|
||||||
|
var_cpu="${var_cpu:-1}"
|
||||||
|
var_ram="${var_ram:-1024}"
|
||||||
|
var_disk="${var_disk:-8}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
if [[ ! -d /opt/opengist ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
if check_for_gh_release "opengist" "thomiceli/opengist"; then
|
||||||
|
msg_info "Stopping Service"
|
||||||
|
systemctl stop opengist
|
||||||
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
|
msg_info "Creating backup"
|
||||||
|
mv /opt/opengist /opt/opengist-backup
|
||||||
|
msg_ok "Backup created"
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "opengist" "thomiceli/opengist" "prebuild" "latest" "/opt/opengist" "opengist*linux-amd64.tar.gz"
|
||||||
|
|
||||||
|
msg_info "Restoring Configuration"
|
||||||
|
mv /opt/opengist-backup/config.yml /opt/opengist/config.yml
|
||||||
|
msg_ok "Configuration Restored"
|
||||||
|
|
||||||
|
msg_info "Starting Service"
|
||||||
|
systemctl start opengist
|
||||||
|
msg_ok "Started Service"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
fi
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed successfully!\n"
|
||||||
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:6157${CL}"
|
||||||
54
ct/ots.sh
Normal file
54
ct/ots.sh
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: bvdberg01
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/Luzifer/ots
|
||||||
|
|
||||||
|
APP="OTS"
|
||||||
|
var_tags="${var_tags:-secrets-sharer}"
|
||||||
|
var_cpu="${var_cpu:-1}"
|
||||||
|
var_ram="${var_ram:-512}"
|
||||||
|
var_disk="${var_disk:-3}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
if [[ ! -d /opt/ots ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
if check_for_gh_release "ots" "Luzifer/ots"; then
|
||||||
|
msg_info "Stopping Services"
|
||||||
|
systemctl stop ots
|
||||||
|
systemctl stop nginx
|
||||||
|
msg_ok "Stopped Services"
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "ots" "Luzifer/ots" "prebuild" "latest" "/opt/ots" "ots_linux_amd64.tgz"
|
||||||
|
|
||||||
|
msg_info "Starting Services"
|
||||||
|
systemctl start ots
|
||||||
|
systemctl start nginx
|
||||||
|
msg_ok "Started Services"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
fi
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed successfully!\n"
|
||||||
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
|
echo -e "${TAB}${GATEWAY}${BGN}https://${IP}${CL}"
|
||||||
58
ct/ps5-mqtt.sh
Normal file
58
ct/ps5-mqtt.sh
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: liecno
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/FunkeyFlo/ps5-mqtt/
|
||||||
|
|
||||||
|
APP="PS5-MQTT"
|
||||||
|
var_tags="${var_tags:-smarthome;automation}"
|
||||||
|
var_cpu="${var_cpu:-1}"
|
||||||
|
var_ram="${var_ram:-512}"
|
||||||
|
var_disk="${var_disk:-3}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
if [[ ! -d /opt/ps5-mqtt ]]; then
|
||||||
|
msg_error "No ${APP} installation found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
if check_for_gh_release "ps5-mqtt" "FunkeyFlo/ps5-mqtt"; then
|
||||||
|
msg_info "Stopping service"
|
||||||
|
systemctl stop ps5-mqtt
|
||||||
|
msg_ok "Stopped service"
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "ps5-mqtt" "FunkeyFlo/ps5-mqtt" "tarball"
|
||||||
|
|
||||||
|
msg_info "Configuring ${APP}"
|
||||||
|
cd /opt/ps5-mqtt/ps5-mqtt/
|
||||||
|
$STD npm install
|
||||||
|
$STD npm run build
|
||||||
|
msg_ok "Configured ${APP}"
|
||||||
|
|
||||||
|
msg_info "Starting service"
|
||||||
|
systemctl start ps5-mqtt
|
||||||
|
msg_ok "Started service"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
fi
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed successfully!\n"
|
||||||
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8645${CL}"
|
||||||
69
ct/rustypaste.sh
Normal file
69
ct/rustypaste.sh
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: GoldenSpringness
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/orhun/rustypaste
|
||||||
|
|
||||||
|
APP="rustypaste"
|
||||||
|
var_tags="${var_tags:-pastebin;storage}"
|
||||||
|
var_cpu="${var_cpu:-1}"
|
||||||
|
var_ram="${var_ram:-1024}"
|
||||||
|
var_disk="${var_disk:-20}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
|
||||||
|
if [[ ! -f /opt/rustypaste/rustypaste ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if check_for_gh_release "rustypaste" "orhun/rustypaste"; then
|
||||||
|
msg_info "Stopping Services"
|
||||||
|
systemctl stop rustypaste
|
||||||
|
msg_ok "Stopped Services"
|
||||||
|
|
||||||
|
msg_info "Creating Backup"
|
||||||
|
tar -czf "/opt/rustypaste_backup_$(date +%F).tar.gz" /opt/rustypaste/upload 2>/dev/null || true
|
||||||
|
cp /opt/rustypaste/config.toml /tmp/rustypaste_config.toml.bak
|
||||||
|
msg_ok "Backup Created"
|
||||||
|
|
||||||
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "rustypaste" "orhun/rustypaste" "prebuild" "latest" "/opt/rustypaste" "*x86_64-unknown-linux-gnu.tar.gz"
|
||||||
|
|
||||||
|
msg_info "Restoring Data"
|
||||||
|
mv /tmp/rustypaste_config.toml.bak /opt/rustypaste/config.toml
|
||||||
|
tar -xzf "/opt/rustypaste_backup_$(date +%F).tar.gz" -C /opt/rustypaste/upload 2>/dev/null || true
|
||||||
|
rm -rf /opt/rustypaste_backup_$(date +%F).tar.gz
|
||||||
|
msg_ok "Restored Data"
|
||||||
|
|
||||||
|
msg_info "Starting Services"
|
||||||
|
systemctl start rustypaste
|
||||||
|
msg_ok "Started Services"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if check_for_gh_release "rustypaste-cli" "orhun/rustypaste-cli"; then
|
||||||
|
fetch_and_deploy_gh_release "rustypaste-cli" "orhun/rustypaste-cli" "prebuild" "latest" "/usr/local/bin" "*x86_64-unknown-linux-gnu.tar.gz"
|
||||||
|
fi
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed successfully!\n"
|
||||||
|
echo -e "${CREATING}${GN}rustypaste setup has been successfully initialized!${CL}"
|
||||||
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8000${CL}"
|
||||||
56
ct/seelf.sh
Normal file
56
ct/seelf.sh
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: Slaviša Arežina (tremor021)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/YuukanOO/seelf
|
||||||
|
|
||||||
|
APP="seelf"
|
||||||
|
var_tags="${var_tags:-server;docker}"
|
||||||
|
var_cpu="${var_cpu:-2}"
|
||||||
|
var_ram="${var_ram:-4096}"
|
||||||
|
var_disk="${var_disk:-10}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
|
||||||
|
if [[ ! -d /opt/seelf ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
if check_for_gh_release "seelf" "YuukanOO/seelf"; then
|
||||||
|
msg_info "Stopping Service"
|
||||||
|
systemctl stop seelf
|
||||||
|
msg_info "Stopped Service"
|
||||||
|
|
||||||
|
msg_info "Updating seelf"
|
||||||
|
cd /opt/seelf
|
||||||
|
$STD make build
|
||||||
|
msg_ok "Updated seelf"
|
||||||
|
|
||||||
|
msg_info "Starting Service"
|
||||||
|
systemctl start seelf
|
||||||
|
msg_ok "Started Service"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
fi
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed successfully!\n"
|
||||||
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}"
|
||||||
66
ct/streamlink-webui.sh
Normal file
66
ct/streamlink-webui.sh
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: CrazyWolf13
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/CrazyWolf13/streamlink-webui
|
||||||
|
|
||||||
|
APP="streamlink-webui"
|
||||||
|
var_tags="${var_tags:-download;streaming}"
|
||||||
|
var_cpu="${var_cpu:-2}"
|
||||||
|
var_ram="${var_ram:-2048}"
|
||||||
|
var_disk="${var_disk:-10}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
|
||||||
|
if [[ ! -d /opt/streamlink-webui ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if check_for_gh_release "streamlink-webui" "CrazyWolf13/streamlink-webui"; then
|
||||||
|
msg_info "Stopping Service"
|
||||||
|
systemctl stop streamlink-webui
|
||||||
|
msg_info "Stopped Service"
|
||||||
|
|
||||||
|
NODE_VERSION="22" NODE_MODULE="yarn" setup_nodejs
|
||||||
|
setup_uv
|
||||||
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "streamlink-webui" "CrazyWolf13/streamlink-webui" "tarball"
|
||||||
|
|
||||||
|
msg_info "Updating streamlink-webui"
|
||||||
|
$STD uv venv --clear /opt/streamlink-webui/backend/src/.venv
|
||||||
|
source /opt/streamlink-webui/backend/src/.venv/bin/activate
|
||||||
|
$STD uv pip install -r /opt/streamlink-webui/backend/src/requirements.txt --python=/opt/streamlink-webui/backend/src/.venv
|
||||||
|
cd /opt/streamlink-webui/frontend/src
|
||||||
|
$STD yarn install
|
||||||
|
$STD yarn build
|
||||||
|
chmod +x /opt/streamlink-webui/start.sh
|
||||||
|
msg_ok "Updated streamlink-webui"
|
||||||
|
|
||||||
|
msg_info "Starting Service"
|
||||||
|
systemctl start streamlink-webui
|
||||||
|
msg_ok "Started Service"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
fi
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed successfully!\n"
|
||||||
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8000${CL}"
|
||||||
45
ct/valkey.sh
Normal file
45
ct/valkey.sh
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: pshankinclarke (lazarillo)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://valkey.io/
|
||||||
|
|
||||||
|
APP="Valkey"
|
||||||
|
var_tags="${var_tags:-database}"
|
||||||
|
var_cpu="${var_cpu:-1}"
|
||||||
|
var_ram="${var_ram:-1024}"
|
||||||
|
var_disk="${var_disk:-4}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
if [[ ! -f /lib/systemd/system/valkey-server.service ]]; then
|
||||||
|
msg_error "No Valkey Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
msg_info "Updating Valkey LXC"
|
||||||
|
$STD apt update
|
||||||
|
$STD apt -y upgrade
|
||||||
|
msg_ok "Updated Valkey LXC"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed successfully!\n"
|
||||||
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:6379${CL}"
|
||||||
77
ct/wavelog.sh
Normal file
77
ct/wavelog.sh
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: Don Locke (DonLocke)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/wavelog/wavelog
|
||||||
|
|
||||||
|
APP="Wavelog"
|
||||||
|
var_tags="${var_tags:-radio-logging}"
|
||||||
|
var_cpu="${var_cpu:-1}"
|
||||||
|
var_ram="${var_ram:-512}"
|
||||||
|
var_disk="${var_disk:-2}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
if [[ ! -d /opt/wavelog ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
setup_mariadb
|
||||||
|
if check_for_gh_release "wavelog" "wavelog/wavelog"; then
|
||||||
|
msg_info "Stopping Services"
|
||||||
|
systemctl stop apache2
|
||||||
|
msg_ok "Services Stopped"
|
||||||
|
|
||||||
|
msg_info "Creating backup"
|
||||||
|
cp /opt/wavelog/application/config/config.php /opt/config.php
|
||||||
|
cp /opt/wavelog/application/config/database.php /opt/database.php
|
||||||
|
cp -r /opt/wavelog/userdata /opt/userdata
|
||||||
|
if [[ -f /opt/wavelog/assets/js/sections/custom.js ]]; then
|
||||||
|
cp /opt/wavelog/assets/js/sections/custom.js /opt/custom.js
|
||||||
|
fi
|
||||||
|
msg_ok "Backup created"
|
||||||
|
|
||||||
|
rm -rf /opt/wavelog
|
||||||
|
fetch_and_deploy_gh_release "wavelog" "wavelog/wavelog" "tarball"
|
||||||
|
|
||||||
|
msg_info "Updating Wavelog"
|
||||||
|
rm -rf /opt/wavelog/install
|
||||||
|
mv /opt/config.php /opt/wavelog/application/config/config.php
|
||||||
|
mv /opt/database.php /opt/wavelog/application/config/database.php
|
||||||
|
cp -r /opt/userdata/* /opt/wavelog/userdata
|
||||||
|
rm -rf /opt/userdata
|
||||||
|
if [[ -f /opt/custom.js ]]; then
|
||||||
|
mv /opt/custom.js /opt/wavelog/assets/js/sections/custom.js
|
||||||
|
fi
|
||||||
|
chown -R www-data:www-data /opt/wavelog/
|
||||||
|
find /opt/wavelog/ -type d -exec chmod 755 {} \;
|
||||||
|
find /opt/wavelog/ -type f -exec chmod 664 {} \;
|
||||||
|
msg_ok "Updated Wavelog"
|
||||||
|
|
||||||
|
msg_info "Starting Services"
|
||||||
|
systemctl start apache2
|
||||||
|
msg_ok "Started Services"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
fi
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed successfully!\n"
|
||||||
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
|
||||||
72
ct/writefreely.sh
Normal file
72
ct/writefreely.sh
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: StellaeAlis
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/writefreely/writefreely
|
||||||
|
|
||||||
|
APP="WriteFreely"
|
||||||
|
var_tags="${var_tags:-writing}"
|
||||||
|
var_cpu="${var_cpu:-2}"
|
||||||
|
var_ram="${var_ram:-1024}"
|
||||||
|
var_disk="${var_disk:-4}"
|
||||||
|
var_os="${var_os:-debian}"
|
||||||
|
var_version="${var_version:-13}"
|
||||||
|
var_unprivileged="${var_unprivileged:-1}"
|
||||||
|
|
||||||
|
header_info "$APP"
|
||||||
|
variables
|
||||||
|
color
|
||||||
|
catch_errors
|
||||||
|
|
||||||
|
function update_script() {
|
||||||
|
header_info
|
||||||
|
check_container_storage
|
||||||
|
check_container_resources
|
||||||
|
|
||||||
|
if [[ ! -d /opt/writefreely ]]; then
|
||||||
|
msg_error "No ${APP} Installation Found!"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if check_for_gh_release "writefreely" "writefreely/writefreely"; then
|
||||||
|
msg_info "Stopping Services"
|
||||||
|
systemctl stop writefreely
|
||||||
|
msg_ok "Stopped Services"
|
||||||
|
|
||||||
|
msg_info "Creating Backup"
|
||||||
|
mkdir -p /tmp/writefreely_backup
|
||||||
|
cp /opt/writefreely/keys /tmp/writefreely_backup/ 2>/dev/null
|
||||||
|
cp /opt/writefreely/config.ini /tmp/writefreely_backup/ 2>/dev/null
|
||||||
|
msg_ok "Created Backup"
|
||||||
|
|
||||||
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "writefreely" "writefreely/writefreely" "prebuild" "latest" "/opt/writefreely" "writefreely_*_linux_amd64.tar.gz"
|
||||||
|
|
||||||
|
msg_info "Restoring Data"
|
||||||
|
cp /tmp/writefreely_backup/config.ini /opt/writefreely/ 2>/dev/null
|
||||||
|
cp /tmp/writefreely_backup/keys/* /opt/writefreely/keys/ 2>/dev/null
|
||||||
|
rm -rf /tmp/writefreely_backup
|
||||||
|
msg_ok "Restored Data"
|
||||||
|
|
||||||
|
msg_info "Running Post-Update Tasks"
|
||||||
|
cd /opt/writefreely
|
||||||
|
$STD ./writefreely db migrate
|
||||||
|
ln -s /opt/writefreely/writefreely /usr/local/bin/writefreely
|
||||||
|
msg_ok "Ran Post-Update Tasks"
|
||||||
|
|
||||||
|
msg_info "Starting Services"
|
||||||
|
systemctl start writefreely
|
||||||
|
msg_ok "Started Services"
|
||||||
|
msg_ok "Updated successfully!"
|
||||||
|
fi
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
||||||
|
build_container
|
||||||
|
description
|
||||||
|
|
||||||
|
msg_ok "Completed successfully!\n"
|
||||||
|
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||||
|
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||||
|
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
|
||||||
@@ -102,8 +102,9 @@ server {
|
|||||||
fastcgi_read_timeout 120s;
|
fastcgi_read_timeout 120s;
|
||||||
}
|
}
|
||||||
server {
|
server {
|
||||||
listen 443 ssl http2;
|
listen 443 ssl;
|
||||||
listen [::]:443 ssl http2;
|
listen [::]:443 ssl;
|
||||||
|
http2 on;
|
||||||
server_name localhost;
|
server_name localhost;
|
||||||
root /usr/share/webapps/nextcloud;
|
root /usr/share/webapps/nextcloud;
|
||||||
index index.php index.html index.htm;
|
index index.php index.html index.htm;
|
||||||
|
|||||||
31
install/apache-cassandra-install.sh
Normal file
31
install/apache-cassandra-install.sh
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://cassandra.apache.org/_/index.html
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
JAVA_VERSION="11" setup_java
|
||||||
|
|
||||||
|
msg_info "Installing Apache Cassandra"
|
||||||
|
setup_deb822_repo \
|
||||||
|
"cassandra" \
|
||||||
|
"https://downloads.apache.org/cassandra/KEYS" \
|
||||||
|
"https://debian.cassandra.apache.org" \
|
||||||
|
"41x" \
|
||||||
|
"main"
|
||||||
|
$STD apt install -y cassandra cassandra-tools
|
||||||
|
sed -i -e 's/^rpc_address: localhost/#rpc_address: localhost/g' -e 's/^# rpc_interface: eth1/rpc_interface: eth0/g' /etc/cassandra/cassandra.yaml
|
||||||
|
msg_ok "Installed Apache Cassandra"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
85
install/argus-install.sh
Normal file
85
install/argus-install.sh
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: MickLesk (CanbiZ)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://release-argus.io/ | Github: https://github.com/release-argus/Argus
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "Argus" "release-argus/Argus" "singlefile" "latest" "/opt/argus" "Argus*linux-amd64"
|
||||||
|
|
||||||
|
msg_info "Setup Argus Config"
|
||||||
|
cat <<EOF >/opt/argus/config.yml
|
||||||
|
settings:
|
||||||
|
log:
|
||||||
|
level: INFO
|
||||||
|
timestamps: false
|
||||||
|
data:
|
||||||
|
database_file: data/argus.db
|
||||||
|
web:
|
||||||
|
listen_host: 0.0.0.0
|
||||||
|
listen_port: 8080
|
||||||
|
route_prefix: /
|
||||||
|
|
||||||
|
defaults:
|
||||||
|
service:
|
||||||
|
options:
|
||||||
|
interval: 30m
|
||||||
|
semantic_versioning: true
|
||||||
|
latest_version:
|
||||||
|
allow_invalid_certs: false
|
||||||
|
use_prerelease: false
|
||||||
|
dashboard:
|
||||||
|
auto_approve: true
|
||||||
|
webhook:
|
||||||
|
desired_status_code: 201
|
||||||
|
|
||||||
|
service:
|
||||||
|
release-argus/argus:
|
||||||
|
latest_version:
|
||||||
|
type: github
|
||||||
|
url: release-argus/argus
|
||||||
|
dashboard:
|
||||||
|
icon: https://raw.githubusercontent.com/release-argus/Argus/master/web/ui/react-app/public/favicon.svg
|
||||||
|
icon_link_to: https://release-argus.io
|
||||||
|
web_url: https://github.com/release-argus/Argus/blob/master/CHANGELOG.md
|
||||||
|
|
||||||
|
community-scripts/ProxmoxVE:
|
||||||
|
latest_version:
|
||||||
|
type: github
|
||||||
|
url: community-scripts/ProxmoxVE
|
||||||
|
use_prerelease: false
|
||||||
|
dashboard:
|
||||||
|
icon: https://raw.githubusercontent.com/community-scripts/ProxmoxVE/refs/heads/main/misc/images/logo.png
|
||||||
|
icon_link_to: https://community-scripts.org/
|
||||||
|
web_url: https://github.com/community-scripts/ProxmoxVE/releases
|
||||||
|
EOF
|
||||||
|
msg_ok "Setup Config"
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
cat <<EOF >/etc/systemd/system/argus.service
|
||||||
|
[Unit]
|
||||||
|
Description=Argus
|
||||||
|
After=network.target
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
WorkingDirectory=/opt/argus
|
||||||
|
ExecStart=/opt/argus/Argus
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now argus
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
@@ -38,9 +38,9 @@ msg_ok "Setup BentoPDF"
|
|||||||
msg_info "Creating Service"
|
msg_info "Creating Service"
|
||||||
CERT_CN="$(hostname -I | awk '{print $1}')"
|
CERT_CN="$(hostname -I | awk '{print $1}')"
|
||||||
$STD openssl req -x509 -nodes -newkey rsa:2048 -days 3650 \
|
$STD openssl req -x509 -nodes -newkey rsa:2048 -days 3650 \
|
||||||
-keyout /etc/ssl/private/bentopdf-selfsigned.key \
|
-keyout /etc/ssl/private/bentopdf-selfsigned.key \
|
||||||
-out /etc/ssl/certs/bentopdf-selfsigned.crt \
|
-out /etc/ssl/certs/bentopdf-selfsigned.crt \
|
||||||
-subj "/CN=${CERT_CN}"
|
-subj "/CN=${CERT_CN}"
|
||||||
|
|
||||||
cat <<'EOF' >/etc/nginx/sites-available/bentopdf
|
cat <<'EOF' >/etc/nginx/sites-available/bentopdf
|
||||||
server {
|
server {
|
||||||
@@ -102,6 +102,10 @@ server {
|
|||||||
EOF
|
EOF
|
||||||
rm -f /etc/nginx/sites-enabled/default
|
rm -f /etc/nginx/sites-enabled/default
|
||||||
ln -sf /etc/nginx/sites-available/bentopdf /etc/nginx/sites-enabled/bentopdf
|
ln -sf /etc/nginx/sites-available/bentopdf /etc/nginx/sites-enabled/bentopdf
|
||||||
|
systemctl stop nginx
|
||||||
|
systemctl disable -q nginx
|
||||||
|
sed -i '/application\/rss+xml/a\ application\/javascript mjs;' /etc/nginx/mime.types
|
||||||
|
|
||||||
cat <<'EOF' >/etc/systemd/system/bentopdf.service
|
cat <<'EOF' >/etc/systemd/system/bentopdf.service
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=BentoPDF Service
|
Description=BentoPDF Service
|
||||||
@@ -116,7 +120,6 @@ Restart=always
|
|||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
systemctl enable -q --now bentopdf
|
systemctl enable -q --now bentopdf
|
||||||
msg_ok "Created & started service"
|
msg_ok "Created & started service"
|
||||||
|
|
||||||
|
|||||||
@@ -56,6 +56,10 @@ NODE_VERSION="24" setup_nodejs
|
|||||||
msg_info "Installing Change Detection"
|
msg_info "Installing Change Detection"
|
||||||
mkdir /opt/changedetection
|
mkdir /opt/changedetection
|
||||||
$STD pip3 install changedetection.io
|
$STD pip3 install changedetection.io
|
||||||
|
cat <<EOF >/opt/changedetection/.env
|
||||||
|
WEBDRIVER_URL=http://127.0.0.1:4444/wd/hub
|
||||||
|
PLAYWRIGHT_DRIVER_URL=ws://localhost:3000/chrome?launch=eyJkZWZhdWx0Vmlld3BvcnQiOnsiaGVpZ2h0Ijo3MjAsIndpZHRoIjoxMjgwfSwiaGVhZGxlc3MiOmZhbHNlLCJzdGVhbHRoIjp0cnVlfQ==&blockAds=true
|
||||||
|
EOF
|
||||||
msg_ok "Installed Change Detection"
|
msg_ok "Installed Change Detection"
|
||||||
|
|
||||||
msg_info "Installing Browserless & Playwright"
|
msg_info "Installing Browserless & Playwright"
|
||||||
@@ -112,12 +116,13 @@ Description=Change Detection
|
|||||||
After=network-online.target
|
After=network-online.target
|
||||||
After=network.target browserless.service
|
After=network.target browserless.service
|
||||||
Wants=browserless.service
|
Wants=browserless.service
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=simple
|
Type=simple
|
||||||
|
EnvironmentFile=/opt/changedetection/.env
|
||||||
WorkingDirectory=/opt/changedetection
|
WorkingDirectory=/opt/changedetection
|
||||||
Environment=WEBDRIVER_URL=http://127.0.0.1:4444/wd/hub
|
|
||||||
Environment=PLAYWRIGHT_DRIVER_URL=ws://localhost:3000/chrome?launch=eyJkZWZhdWx0Vmlld3BvcnQiOnsiaGVpZ2h0Ijo3MjAsIndpZHRoIjoxMjgwfSwiaGVhZGxlc3MiOmZhbHNlLCJzdGVhbHRoIjp0cnVlfQ==&blockAds=true
|
|
||||||
ExecStart=changedetection.io -d /opt/changedetection -p 5000
|
ExecStart=changedetection.io -d /opt/changedetection -p 5000
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
EOF
|
EOF
|
||||||
@@ -126,15 +131,16 @@ cat <<EOF >/etc/systemd/system/browserless.service
|
|||||||
[Unit]
|
[Unit]
|
||||||
Description=browserless service
|
Description=browserless service
|
||||||
After=network.target
|
After=network.target
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Environment=CONNECTION_TIMEOUT=60000
|
Environment=CONNECTION_TIMEOUT=60000
|
||||||
WorkingDirectory=/opt/browserless
|
WorkingDirectory=/opt/browserless
|
||||||
ExecStart=/opt/browserless/scripts/start.sh
|
ExecStart=/opt/browserless/scripts/start.sh
|
||||||
SyslogIdentifier=browserless
|
SyslogIdentifier=browserless
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=default.target
|
WantedBy=default.target
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
systemctl enable -q --now browserless
|
systemctl enable -q --now browserless
|
||||||
systemctl enable -q --now changedetection
|
systemctl enable -q --now changedetection
|
||||||
msg_ok "Created Services"
|
msg_ok "Created Services"
|
||||||
|
|||||||
42
install/commafeed-install.sh
Normal file
42
install/commafeed-install.sh
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://www.commafeed.com/#/welcome | Github: https://github.com/Athou/commafeed
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
msg_info "Installing Dependencies"
|
||||||
|
$STD apt install -y rsync
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
JAVA_VERSION="25" setup_java
|
||||||
|
fetch_and_deploy_gh_release "commafeed" "Athou/commafeed" "prebuild" "latest" "/opt/commafeed" "commafeed-*-h2-jvm.zip"
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
cat <<EOF >/etc/systemd/system/commafeed.service
|
||||||
|
[Unit]
|
||||||
|
Description=CommaFeed Service
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
ExecStart=java -Xminf0.05 -Xmaxf0.1 -jar quarkus-run.jar
|
||||||
|
WorkingDirectory=/opt/commafeed/
|
||||||
|
Restart=always
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now commafeed
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
26
install/globaleaks-install.sh
Normal file
26
install/globaleaks-install.sh
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: Giovanni Pellerano (evilaliv3)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/globaleaks/globaleaks-whistleblowing-software
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
msg_info "Setup GlobaLeaks"
|
||||||
|
DISTRO_CODENAME="$(awk -F= '/^VERSION_CODENAME=/{print $2}' /etc/os-release)"
|
||||||
|
curl -fsSL https://deb.globaleaks.org/globaleaks.asc | gpg --dearmor -o /etc/apt/trusted.gpg.d/globaleaks.gpg
|
||||||
|
echo "deb [signed-by=/etc/apt/trusted.gpg.d/globaleaks.gpg] http://deb.globaleaks.org $DISTRO_CODENAME/" >/etc/apt/sources.list.d/globaleaks.list
|
||||||
|
echo 'APPARMOR_SANDBOXING=0' >/etc/default/globaleaks
|
||||||
|
$STD apt update
|
||||||
|
$STD apt -y -o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confold install globaleaks
|
||||||
|
msg_ok "Setup GlobaLeaks"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
34
install/hivemq-install.sh
Normal file
34
install/hivemq-install.sh
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://www.hivemq.com/ | Github: https://github.com/hivemq/hivemq-community-edition
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
JAVA_VERSION="21" setup_java
|
||||||
|
fetch_and_deploy_gh_release "hivemq" "hivemq/hivemq-community-edition" "prebuild" "latest" "/opt/hivemq" "hivemq-ce-*.zip"
|
||||||
|
|
||||||
|
msg_info "Configuring HiveMQ CE"
|
||||||
|
useradd -d /opt/hivemq hivemq
|
||||||
|
chown -R hivemq:hivemq /opt/hivemq
|
||||||
|
chmod +x /opt/hivemq/bin/run.sh
|
||||||
|
cp /opt/hivemq/bin/init-script/hivemq.service /etc/systemd/system/hivemq.service
|
||||||
|
rm /opt/hivemq/conf/config.xml
|
||||||
|
mv /opt/hivemq/conf/examples/configuration/config-sample-tcp-and-websockets.xml /opt/hivemq/conf/config.xml
|
||||||
|
msg_ok "Configured HiveMQ CE"
|
||||||
|
|
||||||
|
msg_info "Starting service"
|
||||||
|
systemctl enable -q --now hivemq
|
||||||
|
msg_ok "Service started"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
@@ -175,7 +175,8 @@ cd "$STAGING_DIR"
|
|||||||
SOURCE=${SOURCE_DIR}/libjxl
|
SOURCE=${SOURCE_DIR}/libjxl
|
||||||
JPEGLI_LIBJPEG_LIBRARY_SOVERSION="62"
|
JPEGLI_LIBJPEG_LIBRARY_SOVERSION="62"
|
||||||
JPEGLI_LIBJPEG_LIBRARY_VERSION="62.3.0"
|
JPEGLI_LIBJPEG_LIBRARY_VERSION="62.3.0"
|
||||||
: "${LIBJXL_REVISION:=$(jq -cr '.revision' $BASE_DIR/server/sources/libjxl.json)}"
|
LIBJXL_REVISION="794a5dcf0d54f9f0b20d288a12e87afb91d20dfc"
|
||||||
|
# : "${LIBJXL_REVISION:=$(jq -cr '.revision' $BASE_DIR/server/sources/libjxl.json)}"
|
||||||
$STD git clone https://github.com/libjxl/libjxl.git "$SOURCE"
|
$STD git clone https://github.com/libjxl/libjxl.git "$SOURCE"
|
||||||
cd "$SOURCE"
|
cd "$SOURCE"
|
||||||
$STD git reset --hard "$LIBJXL_REVISION"
|
$STD git reset --hard "$LIBJXL_REVISION"
|
||||||
@@ -212,7 +213,8 @@ msg_ok "(1/5) Compiled libjxl"
|
|||||||
|
|
||||||
msg_info "(2/5) Compiling libheif"
|
msg_info "(2/5) Compiling libheif"
|
||||||
SOURCE=${SOURCE_DIR}/libheif
|
SOURCE=${SOURCE_DIR}/libheif
|
||||||
: "${LIBHEIF_REVISION:=$(jq -cr '.revision' $BASE_DIR/server/sources/libheif.json)}"
|
LIBHEIF_REVISION="35dad50a9145332a7bfdf1ff6aef6801fb613d68"
|
||||||
|
# : "${LIBHEIF_REVISION:=$(jq -cr '.revision' $BASE_DIR/server/sources/libheif.json)}"
|
||||||
$STD git clone https://github.com/strukturag/libheif.git "$SOURCE"
|
$STD git clone https://github.com/strukturag/libheif.git "$SOURCE"
|
||||||
cd "$SOURCE"
|
cd "$SOURCE"
|
||||||
$STD git reset --hard "$LIBHEIF_REVISION"
|
$STD git reset --hard "$LIBHEIF_REVISION"
|
||||||
@@ -237,7 +239,8 @@ msg_ok "(2/5) Compiled libheif"
|
|||||||
|
|
||||||
msg_info "(3/5) Compiling libraw"
|
msg_info "(3/5) Compiling libraw"
|
||||||
SOURCE=${SOURCE_DIR}/libraw
|
SOURCE=${SOURCE_DIR}/libraw
|
||||||
: "${LIBRAW_REVISION:=$(jq -cr '.revision' $BASE_DIR/server/sources/libraw.json)}"
|
LIBRAW_REVISION="0b56545a4f828743f28a4345cdfdd4c49f9f9a2a"
|
||||||
|
# : "${LIBRAW_REVISION:=$(jq -cr '.revision' $BASE_DIR/server/sources/libraw.json)}"
|
||||||
$STD git clone https://github.com/LibRaw/LibRaw.git "$SOURCE"
|
$STD git clone https://github.com/LibRaw/LibRaw.git "$SOURCE"
|
||||||
cd "$SOURCE"
|
cd "$SOURCE"
|
||||||
$STD git reset --hard "$LIBRAW_REVISION"
|
$STD git reset --hard "$LIBRAW_REVISION"
|
||||||
|
|||||||
37
install/inspircd-install.sh
Normal file
37
install/inspircd-install.sh
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: kristocopani
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://www.inspircd.org/ | Github: https://github.com/inspircd/inspircd
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "inspircd" "inspircd/inspircd" "binary" "latest" "/opt/inspircd" "inspircd_*.deb13u1_amd64.deb"
|
||||||
|
|
||||||
|
msg_info "Configuring InspIRCd"
|
||||||
|
cat <<EOF >/etc/inspircd/inspircd.conf
|
||||||
|
<define name="networkDomain" value="community-scripts.org">
|
||||||
|
<define name="networkName" value="Proxmox VE Helper-Scripts">
|
||||||
|
|
||||||
|
<server
|
||||||
|
name="irc.&networkDomain;"
|
||||||
|
description="&networkName; IRC server"
|
||||||
|
network="&networkName;">
|
||||||
|
<admin
|
||||||
|
name="Admin"
|
||||||
|
description="Supreme Overlord"
|
||||||
|
email="irc@&networkDomain;">
|
||||||
|
<bind address="" port="6667" type="clients">
|
||||||
|
EOF
|
||||||
|
msg_ok "Installed InspIRCd"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
47
install/kubo-install.sh
Normal file
47
install/kubo-install.sh
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 tteck
|
||||||
|
# Author: tteck (tteckster)
|
||||||
|
# Co-Author: ulmentflam
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/ipfs/kubo
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "kubo" "ipfs/kubo" "prebuild" "latest" "/usr/local/kubo" "kubo*linux-amd64.tar.gz"
|
||||||
|
|
||||||
|
msg_info "Configuring IPFS"
|
||||||
|
$STD ln -s /usr/local/kubo/ipfs /usr/local/bin/ipfs
|
||||||
|
$STD ipfs init
|
||||||
|
ipfs config Addresses.API /ip4/0.0.0.0/tcp/5001
|
||||||
|
ipfs config Addresses.Gateway /ip4/0.0.0.0/tcp/8080
|
||||||
|
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin "[\"http://${LOCAL_IP}:5001\", \"http://localhost:3000\", \"http://127.0.0.1:5001\", \"https://webui.ipfs.io\", \"http://0.0.0.0:5001\"]"
|
||||||
|
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods '["PUT", "POST"]'
|
||||||
|
msg_ok "Configured IPFS"
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
cat <<EOF >/etc/systemd/system/ipfs.service
|
||||||
|
[Unit]
|
||||||
|
Description=IPFS Daemon
|
||||||
|
After=syslog.target network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
ExecStart=/usr/local/bin/ipfs daemon
|
||||||
|
Restart=on-failure
|
||||||
|
Environment=HOME=/root
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now ipfs
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
@@ -14,10 +14,10 @@ network_check
|
|||||||
update_os
|
update_os
|
||||||
|
|
||||||
msg_info "Setup Lyrion Music Server"
|
msg_info "Setup Lyrion Music Server"
|
||||||
DEB_URL=$(curl -fsSL 'https://lyrion.org/getting-started/' | grep -oP '<a\s[^>]*href="\K[^"]*amd64\.deb(?="[^>]*>)' | head -n 1)
|
DEB_URL=$(curl_with_retry 'https://lyrion.org/getting-started/' | grep -oP '<a\s[^>]*href="\K[^"]*amd64\.deb(?="[^>]*>)' | head -n 1)
|
||||||
RELEASE=$(echo "$DEB_URL" | grep -oP 'lyrionmusicserver_\K[0-9.]+(?=_amd64\.deb)')
|
RELEASE=$(echo "$DEB_URL" | grep -oP 'lyrionmusicserver_\K[0-9.]+(?=_amd64\.deb)')
|
||||||
DEB_FILE="/tmp/lyrionmusicserver_${RELEASE}_amd64.deb"
|
DEB_FILE="/tmp/lyrionmusicserver_${RELEASE}_amd64.deb"
|
||||||
curl -fsSL -o "$DEB_FILE" "$DEB_URL"
|
curl_with_retry "$DEB_URL" "$DEB_FILE"
|
||||||
$STD apt install "$DEB_FILE" -y
|
$STD apt install "$DEB_FILE" -y
|
||||||
rm -f "$DEB_FILE"
|
rm -f "$DEB_FILE"
|
||||||
echo "${RELEASE}" >"/opt/lyrion_version.txt"
|
echo "${RELEASE}" >"/opt/lyrion_version.txt"
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ msg_ok "Installed Dependencies"
|
|||||||
PYTHON_VERSION="3.12" setup_uv
|
PYTHON_VERSION="3.12" setup_uv
|
||||||
PG_VERSION="16" setup_postgresql
|
PG_VERSION="16" setup_postgresql
|
||||||
NODE_MODULE="yarn" NODE_VERSION="24" setup_nodejs
|
NODE_MODULE="yarn" NODE_VERSION="24" setup_nodejs
|
||||||
fetch_and_deploy_gh_release "mealie" "mealie-recipes/mealie" "tarball" "latest" "/opt/mealie"
|
fetch_and_deploy_gh_release "mealie" "mealie-recipes/mealie" "tarball"
|
||||||
PG_DB_NAME="mealie_db" PG_DB_USER="mealie_user" PG_DB_GRANT_SUPERUSER="true" setup_postgresql_db
|
PG_DB_NAME="mealie_db" PG_DB_USER="mealie_user" PG_DB_GRANT_SUPERUSER="true" setup_postgresql_db
|
||||||
|
|
||||||
msg_info "Installing Python Dependencies with uv"
|
msg_info "Installing Python Dependencies with uv"
|
||||||
@@ -42,9 +42,10 @@ msg_info "Building Frontend"
|
|||||||
MEALIE_VERSION=$(<$HOME/.mealie)
|
MEALIE_VERSION=$(<$HOME/.mealie)
|
||||||
export NUXT_TELEMETRY_DISABLED=1
|
export NUXT_TELEMETRY_DISABLED=1
|
||||||
cd /opt/mealie/frontend
|
cd /opt/mealie/frontend
|
||||||
$STD sed -i "s|https://github.com/mealie-recipes/mealie/commit/|https://github.com/mealie-recipes/mealie/releases/tag/|g" /opt/mealie/frontend/pages/admin/site-settings.vue
|
SITE_SETTINGS=$(find /opt/mealie/frontend -name "site-settings.vue" -path "*/admin/*" | head -1)
|
||||||
$STD sed -i "s|value: data.buildId,|value: \"v${MEALIE_VERSION}\",|g" /opt/mealie/frontend/pages/admin/site-settings.vue
|
$STD sed -i "s|https://github.com/mealie-recipes/mealie/commit/|https://github.com/mealie-recipes/mealie/releases/tag/|g" "$SITE_SETTINGS"
|
||||||
$STD sed -i "s|value: data.production ? i18n.t(\"about.production\") : i18n.t(\"about.development\"),|value: \"bare-metal\",|g" /opt/mealie/frontend/pages/admin/site-settings.vue
|
$STD sed -i "s|value: data.buildId,|value: \"v${MEALIE_VERSION}\",|g" "$SITE_SETTINGS"
|
||||||
|
$STD sed -i "s|value: data.production ? i18n.t(\"about.production\") : i18n.t(\"about.development\"),|value: \"bare-metal\",|g" "$SITE_SETTINGS"
|
||||||
$STD yarn install --prefer-offline --frozen-lockfile --non-interactive --production=false --network-timeout 1000000
|
$STD yarn install --prefer-offline --frozen-lockfile --non-interactive --production=false --network-timeout 1000000
|
||||||
$STD yarn generate
|
$STD yarn generate
|
||||||
msg_ok "Built Frontend"
|
msg_ok "Built Frontend"
|
||||||
|
|||||||
30
install/neo4j-install.sh
Normal file
30
install/neo4j-install.sh
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 tteck
|
||||||
|
# Author: tteck
|
||||||
|
# Co-Author: havardthom
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://neo4j.com/product/neo4j-graph-database/
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
JAVA_VERSION="21" setup_java
|
||||||
|
|
||||||
|
msg_info "Installing Neo4j (patience)"
|
||||||
|
curl -fsSL "https://debian.neo4j.com/neotechnology.gpg.key" | gpg --dearmor -o /etc/apt/keyrings/neotechnology.gpg
|
||||||
|
echo 'deb [signed-by=/etc/apt/keyrings/neotechnology.gpg] https://debian.neo4j.com stable latest' >/etc/apt/sources.list.d/neo4j.list
|
||||||
|
$STD apt update
|
||||||
|
$STD apt install -y neo4j
|
||||||
|
sed -i '/server.default_listen_address/s/^#//' /etc/neo4j/neo4j.conf
|
||||||
|
systemctl enable -q --now neo4j
|
||||||
|
msg_ok "Installed Neo4j"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
133
install/nodebb-install.sh
Normal file
133
install/nodebb-install.sh
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2024 tteck
|
||||||
|
# Author: MickLesk (Canbiz)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/NodeBB/NodeBB
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
msg_info "Installing Dependencies (Patience)"
|
||||||
|
$STD apt install -y \
|
||||||
|
build-essential \
|
||||||
|
redis-server \
|
||||||
|
expect \
|
||||||
|
ca-certificates
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
setup_mongodb
|
||||||
|
NODE_VERSION="22" setup_nodejs
|
||||||
|
|
||||||
|
msg_info "Configuring MongoDB"
|
||||||
|
MONGO_ADMIN_USER="admin"
|
||||||
|
MONGO_ADMIN_PWD="$(openssl rand -base64 18 | cut -c1-13)"
|
||||||
|
NODEBB_USER="nodebb"
|
||||||
|
NODEBB_PWD="$(openssl rand -base64 18 | cut -c1-13)"
|
||||||
|
MONGO_CONNECTION_STRING="mongodb://${NODEBB_USER}:${NODEBB_PWD}@localhost:27017/nodebb"
|
||||||
|
NODEBB_SECRET=$(uuidgen)
|
||||||
|
{
|
||||||
|
echo "NodeBB-Credentials"
|
||||||
|
echo "Mongo Database User: $MONGO_ADMIN_USER"
|
||||||
|
echo "Mongo Database Password: $MONGO_ADMIN_PWD"
|
||||||
|
echo "NodeBB User: $NODEBB_USER"
|
||||||
|
echo "NodeBB Password: $NODEBB_PWD"
|
||||||
|
echo "NodeBB Secret: $NODEBB_SECRET"
|
||||||
|
} >>~/nodebb.creds
|
||||||
|
|
||||||
|
$STD mongosh <<EOF
|
||||||
|
use admin
|
||||||
|
db.createUser({
|
||||||
|
user: "$MONGO_ADMIN_USER",
|
||||||
|
pwd: "$MONGO_ADMIN_PWD",
|
||||||
|
roles: [{ role: "root", db: "admin" }]
|
||||||
|
})
|
||||||
|
|
||||||
|
use nodebb
|
||||||
|
db.createUser({
|
||||||
|
user: "$NODEBB_USER",
|
||||||
|
pwd: "$NODEBB_PWD",
|
||||||
|
roles: [
|
||||||
|
{ role: "readWrite", db: "nodebb" },
|
||||||
|
{ role: "clusterMonitor", db: "admin" }
|
||||||
|
]
|
||||||
|
})
|
||||||
|
quit()
|
||||||
|
EOF
|
||||||
|
sed -i 's/bindIp: 127.0.0.1/bindIp: 0.0.0.0/' /etc/mongod.conf
|
||||||
|
sed -i '/security:/d' /etc/mongod.conf
|
||||||
|
bash -c 'echo -e "\nsecurity:\n authorization: enabled" >> /etc/mongod.conf'
|
||||||
|
systemctl restart mongod
|
||||||
|
msg_ok "MongoDB configured"
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "nodebb" "NodeBB/NodeBB" "tarball"
|
||||||
|
|
||||||
|
msg_info "Configuring NodeBB"
|
||||||
|
cd /opt/nodebb
|
||||||
|
touch pidfile
|
||||||
|
expect <<EOF >/dev/null 2>&1
|
||||||
|
log_file /dev/null
|
||||||
|
set timeout -1
|
||||||
|
|
||||||
|
spawn ./nodebb setup
|
||||||
|
expect "URL used to access this NodeBB" {
|
||||||
|
send "http://localhost:4567\r"
|
||||||
|
}
|
||||||
|
expect "Please enter a NodeBB secret" {
|
||||||
|
send "$NODEBB_SECRET\r"
|
||||||
|
}
|
||||||
|
expect "Would you like to submit anonymous plugin usage to nbbpm? (yes)" {
|
||||||
|
send "no\r"
|
||||||
|
}
|
||||||
|
expect "Which database to use (mongo)" {
|
||||||
|
send "mongo\r"
|
||||||
|
}
|
||||||
|
expect "Format: mongodb://*" {
|
||||||
|
send "$MONGO_CONNECTION_STRING\r"
|
||||||
|
}
|
||||||
|
expect "Administrator username" {
|
||||||
|
send "community-scripts\r"
|
||||||
|
}
|
||||||
|
expect "Administrator email address" {
|
||||||
|
send "admin@community-scripts.org\r"
|
||||||
|
}
|
||||||
|
expect "Password" {
|
||||||
|
send "community-scripts\r"
|
||||||
|
}
|
||||||
|
expect "Confirm Password" {
|
||||||
|
send "community-scripts\r"
|
||||||
|
}
|
||||||
|
expect eof
|
||||||
|
EOF
|
||||||
|
msg_ok "Configured NodeBB"
|
||||||
|
|
||||||
|
msg_info "Creating Services"
|
||||||
|
cat <<EOF >/etc/systemd/system/nodebb.service
|
||||||
|
[Unit]
|
||||||
|
Description=NodeBB
|
||||||
|
Documentation=https://docs.nodebb.org
|
||||||
|
After=system.slice multi-user.target mongod.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=forking
|
||||||
|
User=root
|
||||||
|
|
||||||
|
WorkingDirectory=/opt/nodebb
|
||||||
|
PIDFile=/opt/nodebb/pidfile
|
||||||
|
ExecStart=/usr/bin/node /opt/nodebb/loader.js
|
||||||
|
Restart=always
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now nodebb
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
44
install/opengist-install.sh
Normal file
44
install/opengist-install.sh
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: Jonathan (jd-apprentice)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://opengist.io/ | Github: https://github.com/thomiceli/opengist
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
msg_info "Installing Dependencies"
|
||||||
|
$STD apt install -y git
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "opengist" "thomiceli/opengist" "prebuild" "latest" "/opt/opengist" "opengist*linux-amd64.tar.gz"
|
||||||
|
mkdir -p /opt/opengist-data
|
||||||
|
sed -i 's|opengist-home:.*|opengist-home: /opt/opengist-data|' /opt/opengist/config.yml
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
cat <<EOF >/etc/systemd/system/opengist.service
|
||||||
|
[Unit]
|
||||||
|
Description=Opengist server to manage your Gists
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
WorkingDirectory=/opt/opengist
|
||||||
|
ExecStart=/opt/opengist/opengist --config /opt/opengist/config.yml
|
||||||
|
Restart=always
|
||||||
|
User=root
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now opengist
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
91
install/ots-install.sh
Normal file
91
install/ots-install.sh
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: bvberg01
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/Luzifer/ots
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
msg_info "Installing Dependencies"
|
||||||
|
$STD apt install -y \
|
||||||
|
redis-server \
|
||||||
|
nginx
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "ots" "Luzifer/ots" "prebuild" "latest" "/opt/ots" "ots_linux_amd64.tgz"
|
||||||
|
create_self_signed_cert
|
||||||
|
|
||||||
|
msg_info "Setup OTS"
|
||||||
|
cat <<EOF >/opt/ots/.env
|
||||||
|
LISTEN=127.0.0.1:3000
|
||||||
|
REDIS_URL=redis://127.0.0.1:6379
|
||||||
|
SECRET_EXPIRY=604800
|
||||||
|
STORAGE_TYPE=redis
|
||||||
|
EOF
|
||||||
|
msg_ok "Setup OTS"
|
||||||
|
|
||||||
|
msg_info "Setting up nginx"
|
||||||
|
cat <<EOF >/etc/nginx/sites-available/ots.conf
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
listen [::]:80;
|
||||||
|
server_name ots;
|
||||||
|
return 301 https://\$host\$request_uri;
|
||||||
|
}
|
||||||
|
server {
|
||||||
|
listen 443 ssl;
|
||||||
|
listen [::]:443 ssl;
|
||||||
|
server_name ots;
|
||||||
|
|
||||||
|
ssl_certificate /etc/ssl/ots/ots.crt;
|
||||||
|
ssl_certificate_key /etc/ssl/ots/ots.key;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
add_header X-Robots-Tag noindex;
|
||||||
|
|
||||||
|
proxy_set_header Upgrade \$http_upgrade;
|
||||||
|
proxy_set_header Connection "Upgrade";
|
||||||
|
proxy_set_header Host \$host;
|
||||||
|
proxy_set_header X-Real-IP \$remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto \$scheme;
|
||||||
|
client_max_body_size 64M;
|
||||||
|
proxy_pass http://127.0.0.1:3000/;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
ln -s /etc/nginx/sites-available/ots.conf /etc/nginx/sites-enabled/
|
||||||
|
rm -f /etc/nginx/sites-enabled/default
|
||||||
|
$STD systemctl reload nginx
|
||||||
|
msg_ok "Configured nginx"
|
||||||
|
|
||||||
|
msg_info "Creating Services"
|
||||||
|
cat <<EOF >/etc/systemd/system/ots.service
|
||||||
|
[Unit]
|
||||||
|
Description=One-Time-Secret Service
|
||||||
|
After=network-online.target
|
||||||
|
Requires=network-online.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
EnvironmentFile=/opt/ots/.env
|
||||||
|
ExecStart=/opt/ots/ots
|
||||||
|
Restart=Always
|
||||||
|
RestartSecs=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now ots
|
||||||
|
msg_ok "Created Services"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
87
install/ps5-mqtt-install.sh
Normal file
87
install/ps5-mqtt-install.sh
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: liecno
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/FunkeyFlo/ps5-mqtt/
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
msg_info "Installing Dependencies"
|
||||||
|
$STD apt install -y \
|
||||||
|
jq \
|
||||||
|
ca-certificates
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
NODE_VERSION="22" NODE_MODULE="playactor" setup_nodejs
|
||||||
|
fetch_and_deploy_gh_release "ps5-mqtt" "FunkeyFlo/ps5-mqtt" "tarball"
|
||||||
|
|
||||||
|
msg_info "Configuring PS5-MQTT"
|
||||||
|
cd /opt/ps5-mqtt/ps5-mqtt/
|
||||||
|
$STD npm install
|
||||||
|
$STD npm run build
|
||||||
|
mkdir -p /opt/.config/ps5-mqtt/
|
||||||
|
mkdir -p /opt/.config/ps5-mqtt/playactor
|
||||||
|
cat <<EOF >/opt/.config/ps5-mqtt/config.json
|
||||||
|
{
|
||||||
|
"mqtt": {
|
||||||
|
"host": "",
|
||||||
|
"port": "",
|
||||||
|
"user": "",
|
||||||
|
"pass": "",
|
||||||
|
"discovery_topic": "homeassistant"
|
||||||
|
},
|
||||||
|
|
||||||
|
"device_check_interval": 5000,
|
||||||
|
"device_discovery_interval": 60000,
|
||||||
|
"device_discovery_broadcast_address": "",
|
||||||
|
|
||||||
|
"include_ps4_devices": false,
|
||||||
|
|
||||||
|
"psn_accounts": [
|
||||||
|
{
|
||||||
|
"username": "",
|
||||||
|
"npsso":""
|
||||||
|
}
|
||||||
|
],
|
||||||
|
|
||||||
|
"account_check_interval": 5000,
|
||||||
|
|
||||||
|
"credentialsStoragePath": "/opt/.config/ps5-mqtt/credentials.json",
|
||||||
|
"frontendPort": "8645"
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
msg_ok "Configured PS5-MQTT"
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
cat <<EOF >/etc/systemd/system/ps5-mqtt.service
|
||||||
|
[Unit]
|
||||||
|
Description=PS5-MQTT Daemon
|
||||||
|
After=syslog.target network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
WorkingDirectory=/opt/ps5-mqtt/ps5-mqtt
|
||||||
|
Environment="CONFIG_PATH=/opt/.config/ps5-mqtt/config.json"
|
||||||
|
Environment="DEBUG='@ha:ps5:*'"
|
||||||
|
Restart=always
|
||||||
|
RestartSec=5
|
||||||
|
Type=simple
|
||||||
|
ExecStart=node server/dist/index.js
|
||||||
|
KillMode=process
|
||||||
|
SyslogIdentifier=ps5-mqtt
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now ps5-mqtt
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
43
install/rustypaste-install.sh
Normal file
43
install/rustypaste-install.sh
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: GoldenSpringness | MickLesk (CanbiZ)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/orhun/rustypaste
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
fetch_and_deploy_gh_release "rustypaste" "orhun/rustypaste" "prebuild" "latest" "/opt/rustypaste" "*x86_64-unknown-linux-gnu.tar.gz"
|
||||||
|
fetch_and_deploy_gh_release "rustypaste-cli" "orhun/rustypaste-cli" "prebuild" "latest" "/usr/local/bin" "*x86_64-unknown-linux-gnu.tar.gz"
|
||||||
|
|
||||||
|
msg_info "Setting up RustyPaste"
|
||||||
|
cd /opt/rustypaste
|
||||||
|
sed -i 's|^address = ".*"|address = "0.0.0.0:8000"|' config.toml
|
||||||
|
msg_ok "Set up RustyPaste"
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
cat <<EOF >/etc/systemd/system/rustypaste.service
|
||||||
|
[Unit]
|
||||||
|
Description=rustypaste Service
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
WorkingDirectory=/opt/rustypaste
|
||||||
|
ExecStart=/opt/rustypaste/rustypaste
|
||||||
|
Restart=always
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now rustypaste
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
64
install/seelf-install.sh
Normal file
64
install/seelf-install.sh
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: Slaviša Arežina (tremor021)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/YuukanOO/seelf
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
msg_info "Installing Dependencies"
|
||||||
|
$STD apt install -y \
|
||||||
|
make \
|
||||||
|
gcc
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
setup_go
|
||||||
|
NODE_VERSION="22" setup_nodejs
|
||||||
|
fetch_and_deploy_gh_release "seelf" "YuukanOO/seelf" "tarball"
|
||||||
|
|
||||||
|
msg_info "Setting up seelf. Patience"
|
||||||
|
cd /opt/seelf
|
||||||
|
$STD make build
|
||||||
|
PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
|
||||||
|
mkdir -p /opt/seelf/data
|
||||||
|
{
|
||||||
|
echo "ADMIN_EMAIL=admin@example.com"
|
||||||
|
echo "ADMIN_PASSWORD=$PASS"
|
||||||
|
} | tee .env ~/seelf.creds >/dev/null
|
||||||
|
SEELF_ADMIN_EMAIL=admin@example.com SEELF_ADMIN_PASSWORD=$PASS ./seelf serve &>/dev/null &
|
||||||
|
sleep 5
|
||||||
|
kill $!
|
||||||
|
msg_ok "Done setting up seelf"
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
cat <<EOF >/etc/systemd/system/seelf.service
|
||||||
|
[Unit]
|
||||||
|
Description=seelf Service
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=root
|
||||||
|
Group=root
|
||||||
|
EnvironmentFile=/opt/seelf/.env
|
||||||
|
Environment=DATA_PATH=/opt/seelf/data
|
||||||
|
WorkingDirectory=/opt/seelf
|
||||||
|
ExecStart=/opt/seelf/./seelf -c data/conf.yml serve
|
||||||
|
Restart=always
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now seelf
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
62
install/streamlink-webui-install.sh
Normal file
62
install/streamlink-webui-install.sh
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: CrazyWolf13
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/CrazyWolf13/streamlink-webui
|
||||||
|
|
||||||
|
# Import Functions und Setup
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
NODE_VERSION="22"
|
||||||
|
NODE_MODULE="npm@latest,yarn@latest"
|
||||||
|
setup_nodejs
|
||||||
|
setup_uv
|
||||||
|
fetch_and_deploy_gh_release "streamlink-webui" "CrazyWolf13/streamlink-webui" "tarball"
|
||||||
|
|
||||||
|
msg_info "Setup ${APPLICATION}"
|
||||||
|
mkdir -p "/opt/${APPLICATION}-download"
|
||||||
|
$STD uv venv --clear /opt/"${APPLICATION}"/backend/src/.venv
|
||||||
|
source /opt/"${APPLICATION}"/backend/src/.venv/bin/activate
|
||||||
|
$STD uv pip install -r /opt/streamlink-webui/backend/src/requirements.txt --python=/opt/"${APPLICATION}"/backend/src/.venv
|
||||||
|
cd /opt/"${APPLICATION}"/frontend/src
|
||||||
|
$STD yarn install
|
||||||
|
$STD yarn build
|
||||||
|
chmod +x /opt/"${APPLICATION}"/start.sh
|
||||||
|
msg_ok "Setup ${APPLICATION}"
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
cat <<'EOF' >/opt/"${APPLICATION}".env
|
||||||
|
CLIENT_ID='your_client_id'
|
||||||
|
CLIENT_SECRET='your_client_secret'
|
||||||
|
DOWNLOAD_PATH='/opt/streamlink-webui-download'
|
||||||
|
# BASE_URL='https://sub.domain.com' \
|
||||||
|
# REVERSE_PROXY=True \
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat <<EOF >/etc/systemd/system/"${APPLICATION}".service
|
||||||
|
[Unit]
|
||||||
|
Description=${APPLICATION} Service
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
EnvironmentFile=/opt/${APPLICATION}.env
|
||||||
|
WorkingDirectory=/opt/${APPLICATION}/backend/src
|
||||||
|
ExecStart=/bin/bash -c 'source /opt/${APPLICATION}/backend/src/.venv/bin/activate && exec /opt/${APPLICATION}/start.sh'
|
||||||
|
Restart=always
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now "${APPLICATION}"
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
78
install/valkey-install.sh
Normal file
78
install/valkey-install.sh
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: pshankinclarke (lazarillo)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://valkey.io/
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
msg_info "Installing Valkey"
|
||||||
|
$STD apt update
|
||||||
|
$STD apt install -y valkey openssl
|
||||||
|
sed -i 's/^bind .*/bind 0.0.0.0/' /etc/valkey/valkey.conf
|
||||||
|
|
||||||
|
PASS="$(openssl rand -base64 48 | tr -dc 'a-zA-Z0-9' | head -c32)"
|
||||||
|
echo "requirepass $PASS" >> /etc/valkey/valkey.conf
|
||||||
|
echo "$PASS" >~/valkey.creds
|
||||||
|
chmod 600 ~/valkey.creds
|
||||||
|
|
||||||
|
MEMTOTAL_MB=$(free -m | grep ^Mem: | awk '{print $2}')
|
||||||
|
# reserve 25% of a node type's maxmemory value for system use
|
||||||
|
MAXMEMORY_MB=$((MEMTOTAL_MB * 75 / 100))
|
||||||
|
|
||||||
|
echo "" >> /etc/valkey/valkey.conf
|
||||||
|
echo "# Memory-optimized settings for small-scale deployments" >> /etc/valkey/valkey.conf
|
||||||
|
echo "maxmemory ${MAXMEMORY_MB}mb" >> /etc/valkey/valkey.conf
|
||||||
|
echo "maxmemory-policy allkeys-lru" >> /etc/valkey/valkey.conf
|
||||||
|
echo "maxmemory-samples 10" >> /etc/valkey/valkey.conf
|
||||||
|
msg_ok "Installed Valkey"
|
||||||
|
|
||||||
|
echo
|
||||||
|
read -r -p "${TAB3}Enable TLS for Valkey (Sentinel mode does not supported)? [y/N]: " prompt
|
||||||
|
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
|
||||||
|
read -r -p "${TAB3}Use TLS-only mode (disable TCP port 6379)? [y/N]: " tls_only
|
||||||
|
msg_info "Configuring TLS for Valkey..."
|
||||||
|
|
||||||
|
create_self_signed_cert "Valkey"
|
||||||
|
TLS_DIR="/etc/ssl/valkey"
|
||||||
|
TLS_CERT="$TLS_DIR/valkey.crt"
|
||||||
|
TLS_KEY="$TLS_DIR/valkey.key"
|
||||||
|
chown valkey:valkey "$TLS_CERT" "$TLS_KEY"
|
||||||
|
|
||||||
|
if [[ ${tls_only,,} =~ ^(y|yes)$ ]]; then
|
||||||
|
{
|
||||||
|
echo ""
|
||||||
|
echo "# TLS configuration generated by Proxmox VE Valkey helper-script"
|
||||||
|
echo "port 0"
|
||||||
|
echo "tls-port 6379"
|
||||||
|
echo "tls-cert-file $TLS_DIR/valkey.crt"
|
||||||
|
echo "tls-key-file $TLS_DIR/valkey.key"
|
||||||
|
echo "tls-auth-clients no"
|
||||||
|
} >> /etc/valkey/valkey.conf
|
||||||
|
msg_ok "Enabled TLS-only mode on port 6379"
|
||||||
|
else
|
||||||
|
{
|
||||||
|
echo ""
|
||||||
|
echo "# TLS configuration generated by Proxmox VE Valkey helper-script"
|
||||||
|
echo "tls-port 6380"
|
||||||
|
echo "tls-cert-file $TLS_DIR/valkey.crt"
|
||||||
|
echo "tls-key-file $TLS_DIR/valkey.key"
|
||||||
|
echo "tls-auth-clients no"
|
||||||
|
} >> /etc/valkey/valkey.conf
|
||||||
|
msg_ok "Enabled TLS on port 6380 and TCP on 6379"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
systemctl enable -q --now valkey-server
|
||||||
|
systemctl restart valkey-server
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
@@ -1,105 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# Copyright (c) 2021-2026 tteck
|
|
||||||
# Author: tteck (tteckster)
|
|
||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
||||||
# Source: https://github.com/dani-garcia/vaultwarden
|
|
||||||
|
|
||||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
|
||||||
color
|
|
||||||
verb_ip6
|
|
||||||
catch_errors
|
|
||||||
setting_up_container
|
|
||||||
network_check
|
|
||||||
update_os
|
|
||||||
|
|
||||||
msg_info "Installing Dependencies"
|
|
||||||
$STD apt install -y \
|
|
||||||
build-essential \
|
|
||||||
pkgconf \
|
|
||||||
libssl-dev \
|
|
||||||
libmariadb-dev-compat \
|
|
||||||
libpq-dev \
|
|
||||||
argon2 \
|
|
||||||
ssl-cert
|
|
||||||
msg_ok "Installed Dependencies"
|
|
||||||
|
|
||||||
setup_rust
|
|
||||||
fetch_and_deploy_gh_release "vaultwarden" "dani-garcia/vaultwarden" "tarball" "latest" "/tmp/vaultwarden-src"
|
|
||||||
|
|
||||||
msg_info "Building Vaultwarden (Patience)"
|
|
||||||
cd /tmp/vaultwarden-src
|
|
||||||
VW_VERSION=$(get_latest_github_release "dani-garcia/vaultwarden")
|
|
||||||
export VW_VERSION
|
|
||||||
$STD cargo build --features "sqlite,mysql,postgresql" --release
|
|
||||||
msg_ok "Built Vaultwarden"
|
|
||||||
|
|
||||||
msg_info "Setting up Vaultwarden"
|
|
||||||
$STD addgroup --system vaultwarden
|
|
||||||
$STD adduser --system --home /opt/vaultwarden --shell /usr/sbin/nologin --no-create-home --gecos 'vaultwarden' --ingroup vaultwarden --disabled-login --disabled-password vaultwarden
|
|
||||||
mkdir -p /opt/vaultwarden/{bin,data,web-vault}
|
|
||||||
cp target/release/vaultwarden /opt/vaultwarden/bin/
|
|
||||||
cd ~ && rm -rf /tmp/vaultwarden-src
|
|
||||||
msg_ok "Set up Vaultwarden"
|
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "vaultwarden_webvault" "dani-garcia/bw_web_builds" "prebuild" "latest" "/opt/vaultwarden/web-vault" "bw_web_*.tar.gz"
|
|
||||||
|
|
||||||
msg_info "Configuring Vaultwarden"
|
|
||||||
cat <<EOF >/opt/vaultwarden/.env
|
|
||||||
ADMIN_TOKEN=''
|
|
||||||
ROCKET_ADDRESS=0.0.0.0
|
|
||||||
ROCKET_TLS='{certs="/opt/vaultwarden/ssl-cert-snakeoil.pem",key="/opt/vaultwarden/ssl-cert-snakeoil.key"}'
|
|
||||||
DATA_FOLDER=/opt/vaultwarden/data
|
|
||||||
DATABASE_MAX_CONNS=10
|
|
||||||
WEB_VAULT_FOLDER=/opt/vaultwarden/web-vault
|
|
||||||
WEB_VAULT_ENABLED=true
|
|
||||||
EOF
|
|
||||||
mv /etc/ssl/certs/ssl-cert-snakeoil.pem /opt/vaultwarden/
|
|
||||||
mv /etc/ssl/private/ssl-cert-snakeoil.key /opt/vaultwarden/
|
|
||||||
|
|
||||||
chown -R vaultwarden:vaultwarden /opt/vaultwarden/
|
|
||||||
chown root:root /opt/vaultwarden/bin/vaultwarden
|
|
||||||
chmod +x /opt/vaultwarden/bin/vaultwarden
|
|
||||||
chown -R root:root /opt/vaultwarden/web-vault/
|
|
||||||
chmod +r /opt/vaultwarden/.env
|
|
||||||
msg_ok "Configured Vaultwarden"
|
|
||||||
|
|
||||||
msg_info "Creating Service"
|
|
||||||
cat <<EOF >/etc/systemd/system/vaultwarden.service
|
|
||||||
[Unit]
|
|
||||||
Description=Bitwarden Server (Powered by Vaultwarden)
|
|
||||||
Documentation=https://github.com/dani-garcia/vaultwarden
|
|
||||||
After=network.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
User=vaultwarden
|
|
||||||
Group=vaultwarden
|
|
||||||
EnvironmentFile=-/opt/vaultwarden/.env
|
|
||||||
ExecStart=/opt/vaultwarden/bin/vaultwarden
|
|
||||||
LimitNOFILE=65535
|
|
||||||
LimitNPROC=4096
|
|
||||||
PrivateTmp=true
|
|
||||||
PrivateDevices=true
|
|
||||||
ProtectHome=true
|
|
||||||
ProtectSystem=strict
|
|
||||||
DevicePolicy=closed
|
|
||||||
ProtectControlGroups=yes
|
|
||||||
ProtectKernelModules=yes
|
|
||||||
ProtectKernelTunables=yes
|
|
||||||
RestrictNamespaces=yes
|
|
||||||
RestrictRealtime=yes
|
|
||||||
MemoryDenyWriteExecute=yes
|
|
||||||
LockPersonality=yes
|
|
||||||
WorkingDirectory=/opt/vaultwarden
|
|
||||||
ReadWriteDirectories=/opt/vaultwarden/data
|
|
||||||
AmbientCapabilities=CAP_NET_BIND_SERVICE
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
EOF
|
|
||||||
systemctl enable -q --now vaultwarden
|
|
||||||
msg_ok "Created Service"
|
|
||||||
|
|
||||||
motd_ssh
|
|
||||||
customize
|
|
||||||
cleanup_lxc
|
|
||||||
85
install/verdaccio-install.sh
Normal file
85
install/verdaccio-install.sh
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: BrynnJKnight
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://verdaccio.org/ | Github: https://github.com/verdaccio/verdaccio
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
msg_info "Installing Dependencies"
|
||||||
|
$STD apt install -y build-essential
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
NODE_VERSION="24" NODE_MODULE="verdaccio" setup_nodejs
|
||||||
|
|
||||||
|
msg_info "Configuring Verdaccio"
|
||||||
|
mkdir -p /opt/verdaccio/config
|
||||||
|
mkdir -p /opt/verdaccio/storage
|
||||||
|
cat <<EOF >/opt/verdaccio/config/config.yaml
|
||||||
|
# Verdaccio configuration
|
||||||
|
storage: /opt/verdaccio/storage
|
||||||
|
auth:
|
||||||
|
htpasswd:
|
||||||
|
file: /opt/verdaccio/storage/htpasswd
|
||||||
|
max_users: 1000
|
||||||
|
uplinks:
|
||||||
|
npmjs:
|
||||||
|
url: https://registry.npmjs.org/
|
||||||
|
packages:
|
||||||
|
'@*/*':
|
||||||
|
access: \$all
|
||||||
|
publish: \$authenticated
|
||||||
|
proxy: npmjs
|
||||||
|
'**':
|
||||||
|
access: \$all
|
||||||
|
publish: \$authenticated
|
||||||
|
proxy: npmjs
|
||||||
|
middlewares:
|
||||||
|
audit:
|
||||||
|
enabled: true
|
||||||
|
logs:
|
||||||
|
- {type: stdout, format: pretty, level: http}
|
||||||
|
listen:
|
||||||
|
- 0.0.0.0:4873
|
||||||
|
web:
|
||||||
|
enable: true
|
||||||
|
title: Verdaccio
|
||||||
|
gravatar: true
|
||||||
|
sort_packages: asc
|
||||||
|
login: true
|
||||||
|
EOF
|
||||||
|
chown -R root:root /opt/verdaccio
|
||||||
|
chmod -R 755 /opt/verdaccio
|
||||||
|
msg_ok "Configured Verdaccio"
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
cat <<EOF >/etc/systemd/system/verdaccio.service
|
||||||
|
[Unit]
|
||||||
|
Description=Verdaccio lightweight private npm proxy registry
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
ExecStart=/usr/bin/verdaccio --config /opt/verdaccio/config/config.yaml
|
||||||
|
Restart=on-failure
|
||||||
|
StandardOutput=journal
|
||||||
|
StandardError=journal
|
||||||
|
SyslogIdentifier=verdaccio
|
||||||
|
KillMode=control-group
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now verdaccio
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
50
install/wavelog-install.sh
Normal file
50
install/wavelog-install.sh
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: Don Locke (DonLocke)
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/wavelog/wavelog
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
PHP_VERSION="8.4" PHP_APACHE="YES" PHP_MAX_EXECUTION_TIME="600" setup_php
|
||||||
|
setup_mariadb
|
||||||
|
MARIADB_DB_NAME="wavelog" MARIADB_DB_USER="waveloguser" setup_mariadb_db
|
||||||
|
fetch_and_deploy_gh_release "wavelog" "wavelog/wavelog" "tarball"
|
||||||
|
|
||||||
|
msg_info "Configuring Wavelog"
|
||||||
|
chown -R www-data:www-data /opt/wavelog/
|
||||||
|
find /opt/wavelog/ -type d -exec chmod 755 {} \;
|
||||||
|
find /opt/wavelog/ -type f -exec chmod 664 {} \;
|
||||||
|
msg_ok "Configured Wavelog"
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
cat <<EOF >/etc/apache2/sites-available/wavelog.conf
|
||||||
|
<VirtualHost *:80>
|
||||||
|
ServerAdmin webmaster@localhost
|
||||||
|
DocumentRoot /opt/wavelog
|
||||||
|
|
||||||
|
<Directory /opt/wavelog>
|
||||||
|
Options Indexes FollowSymLinks
|
||||||
|
AllowOverride All
|
||||||
|
Require all granted
|
||||||
|
</Directory>
|
||||||
|
|
||||||
|
ErrorLog /var/log/apache2/error.log
|
||||||
|
CustomLog /var/log/apache2/access.log combined
|
||||||
|
</VirtualHost>
|
||||||
|
EOF
|
||||||
|
$STD a2ensite wavelog.conf
|
||||||
|
$STD a2dissite 000-default.conf
|
||||||
|
$STD systemctl reload apache2
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
63
install/writefreely-install.sh
Normal file
63
install/writefreely-install.sh
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright (c) 2021-2026 community-scripts ORG
|
||||||
|
# Author: StellaeAlis
|
||||||
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||||
|
# Source: https://github.com/writefreely/writefreely
|
||||||
|
|
||||||
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||||
|
color
|
||||||
|
verb_ip6
|
||||||
|
catch_errors
|
||||||
|
setting_up_container
|
||||||
|
network_check
|
||||||
|
update_os
|
||||||
|
|
||||||
|
msg_info "Installing Dependencies"
|
||||||
|
$STD apt install -y crudini
|
||||||
|
msg_ok "Installed Dependencies"
|
||||||
|
|
||||||
|
setup_mariadb
|
||||||
|
MARIADB_DB_NAME="writefreely" MARIADB_DB_USER="writefreely" setup_mariadb_db
|
||||||
|
fetch_and_deploy_gh_release "writefreely" "writefreely/writefreely" "prebuild" "latest" "/opt/writefreely" "writefreely_*_linux_amd64.tar.gz"
|
||||||
|
|
||||||
|
msg_info "Setting up WriteFreely"
|
||||||
|
cd /opt/writefreely
|
||||||
|
$STD ./writefreely config generate
|
||||||
|
$STD ./writefreely keys generate
|
||||||
|
msg_ok "Setup WriteFreely"
|
||||||
|
|
||||||
|
msg_info "Configuring WriteFreely"
|
||||||
|
$STD crudini --set config.ini server port 80
|
||||||
|
$STD crudini --set config.ini server bind $LOCAL_IP
|
||||||
|
$STD crudini --set config.ini database username $MARIADB_DB_USER
|
||||||
|
$STD crudini --set config.ini database password $MARIADB_DB_PASS
|
||||||
|
$STD crudini --set config.ini database database $MARIADB_DB_NAME
|
||||||
|
$STD crudini --set config.ini app host http://$LOCAL_IP:80
|
||||||
|
$STD ./writefreely db init
|
||||||
|
ln -s /opt/writefreely/writefreely /usr/local/bin/writefreely
|
||||||
|
msg_ok "Configured WriteFreely"
|
||||||
|
|
||||||
|
msg_info "Creating Service"
|
||||||
|
cat <<EOF >/etc/systemd/system/writefreely.service
|
||||||
|
[Unit]
|
||||||
|
Description=WriteFreely Service
|
||||||
|
After=syslog.target network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=root
|
||||||
|
WorkingDirectory=/opt/writefreely
|
||||||
|
ExecStart=/opt/writefreely/writefreely
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable -q --now writefreely
|
||||||
|
msg_ok "Created Service"
|
||||||
|
|
||||||
|
motd_ssh
|
||||||
|
customize
|
||||||
|
cleanup_lxc
|
||||||
Binary file not shown.
Reference in New Issue
Block a user