mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2025-07-01 19:47:38 +00:00
Compare commits
61 Commits
2025-02-25
...
2025-02-27
Author | SHA1 | Date | |
---|---|---|---|
d781c75dfe | |||
0c0d1de317 | |||
ab370762a4 | |||
51bb4566e7 | |||
0e00057477 | |||
ccd70a835f | |||
5bfde87159 | |||
949dcd0b23 | |||
4cad868175 | |||
35f74cb3b6 | |||
51a3361686 | |||
0ac0cc263e | |||
c730b5c009 | |||
8c1cc56321 | |||
c01abd559b | |||
a5039cff58 | |||
3bf4155fec | |||
fb515bc057 | |||
bd0c906c44 | |||
0871b9c84c | |||
0d4b4a1837 | |||
474954afb6 | |||
5041708810 | |||
c630378701 | |||
be5e6cc870 | |||
87afc99489 | |||
ff49b8fea8 | |||
bb0bc65e27 | |||
6a60704d8e | |||
cd40beb1eb | |||
e1df6b0a6f | |||
b582b9f04d | |||
407801d9ff | |||
6bcbc0ae91 | |||
62bd7d5eef | |||
663962e873 | |||
3e7458dfaa | |||
db5cc430c7 | |||
5b91a776f1 | |||
0aa13fbea7 | |||
2d20686131 | |||
5f2163bff4 | |||
9c59bdaea1 | |||
7f4c116b2c | |||
ba842a1e49 | |||
41f4aebdc7 | |||
c12470ff12 | |||
6722e52c9b | |||
e68355d880 | |||
7d29d8a05a | |||
e6792790cc | |||
4354079c4e | |||
a02a9d803e | |||
46462a790c | |||
a971cedde5 | |||
fda9557811 | |||
633dbe3e2b | |||
981baed9d3 | |||
90fc30a228 | |||
0641ec1e2a | |||
82d4ee01d2 |
2
.github/CONTRIBUTOR_AND_GUIDES/ct/AppName.md
vendored
2
.github/CONTRIBUTOR_AND_GUIDES/ct/AppName.md
vendored
@ -247,7 +247,7 @@ function update_script() {
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
msg_error "There is currently no automatic update function for ${APP}."
|
||||
msg_error "Currently we don't provide an update function for this ${APP}."
|
||||
exit
|
||||
}
|
||||
```
|
||||
|
55
.github/autolabeler-config.json
vendored
55
.github/autolabeler-config.json
vendored
@ -1,17 +1,5 @@
|
||||
|
||||
{
|
||||
"breaking change": [
|
||||
{
|
||||
"fileStatus": "renamed",
|
||||
"includeGlobs": ["ct/**", "install/**", "misc/**", "turnkey/**", "vm/**"],
|
||||
"excludeGlobs": []
|
||||
},
|
||||
{
|
||||
"fileStatus": "removed",
|
||||
"includeGlobs": ["ct/**", "install/**", "misc/**", "turnkey/**", "vm/**"],
|
||||
"excludeGlobs": []
|
||||
}
|
||||
],
|
||||
"new script": [
|
||||
{
|
||||
"fileStatus": "added",
|
||||
@ -33,10 +21,17 @@
|
||||
"excludeGlobs": []
|
||||
}
|
||||
],
|
||||
"rename script": [
|
||||
"maintenance": [
|
||||
{
|
||||
"fileStatus": "renamed",
|
||||
"includeGlobs": ["ct/**", "install/**", "misc/**", "turnkey/**", "vm/**"],
|
||||
"fileStatus": null,
|
||||
"includeGlobs": ["*.md", ".github/**", "misc/*.func", "ct/create_lxc.sh", "api/**"],
|
||||
"excludeGlobs": []
|
||||
}
|
||||
],
|
||||
"core": [
|
||||
{
|
||||
"fileStatus": null,
|
||||
"includeGlobs": ["misc/*.func", "ct/create_lxc.sh"],
|
||||
"excludeGlobs": []
|
||||
}
|
||||
],
|
||||
@ -47,25 +42,35 @@
|
||||
"excludeGlobs": []
|
||||
}
|
||||
],
|
||||
"maintenance": [
|
||||
{
|
||||
"fileStatus": null,
|
||||
"includeGlobs": ["*.md", ".github/**", "misc/*.func", "ct/create_lxc.sh"],
|
||||
"excludeGlobs": ["misc/api.func"]
|
||||
}
|
||||
],
|
||||
"api": [
|
||||
"api": [
|
||||
{
|
||||
"fileStatus": null,
|
||||
"includeGlobs": ["api/**", "misc/api.func"],
|
||||
"excludeGlobs": []
|
||||
}
|
||||
],
|
||||
"github": [
|
||||
{
|
||||
"fileStatus": null,
|
||||
"includeGlobs": [".github/**"],
|
||||
"excludeGlobs": []
|
||||
}
|
||||
],
|
||||
"json": [
|
||||
{
|
||||
"fileStatus": "modified",
|
||||
"includeGlobs": ["json/**"],
|
||||
"excludeGlobs": []
|
||||
}
|
||||
],
|
||||
|
||||
"high risk": [
|
||||
{
|
||||
"fileStatus": null,
|
||||
"includeGlobs": ["misc/build.func", "misc/install.func", "ct/create_lxc.sh"],
|
||||
"excludeGlobs": []
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
|
||||
}
|
90
.github/changelog-pr-config.json
vendored
90
.github/changelog-pr-config.json
vendored
@ -1,16 +1,8 @@
|
||||
[
|
||||
{
|
||||
"title": "💥 Breaking Changes",
|
||||
"labels": ["breaking change"]
|
||||
},
|
||||
{
|
||||
"title": "🆕 New Scripts",
|
||||
"labels": ["new script"]
|
||||
},
|
||||
{
|
||||
"title": "✨ New Features",
|
||||
"labels": ["feature"]
|
||||
},
|
||||
{
|
||||
"title": "🚀 Updated Scripts",
|
||||
"labels": ["update script"],
|
||||
@ -21,27 +13,85 @@
|
||||
"notes" : []
|
||||
},
|
||||
{
|
||||
"title": "General Updates",
|
||||
"labels": ["general"],
|
||||
"title": "✨ New Features",
|
||||
"labels": ["feature"],
|
||||
"notes" : []
|
||||
},
|
||||
{
|
||||
"title": "💥 Breaking Changes",
|
||||
"labels": ["breaking change"],
|
||||
"notes" : []
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
{
|
||||
"title": "🌐 Website",
|
||||
"labels": ["website"]
|
||||
},
|
||||
{
|
||||
"title": "📡 API",
|
||||
"labels": ["api"]
|
||||
},
|
||||
{
|
||||
"title": "🧰 Maintenance",
|
||||
"labels": ["maintenance"]
|
||||
"labels": ["maintenance"],
|
||||
"subCategories": [
|
||||
{
|
||||
"title": "🐞 Bug Fixes",
|
||||
"labels": ["bugfix"],
|
||||
"notes" : []
|
||||
},
|
||||
{
|
||||
"title": "✨ New Features",
|
||||
"labels": ["feature"],
|
||||
"notes" : []
|
||||
},
|
||||
{
|
||||
"title": "💥 Breaking Changes",
|
||||
"labels": ["breaking change"],
|
||||
"notes" : []
|
||||
},
|
||||
{
|
||||
"title": "📡 API",
|
||||
"labels": ["api"],
|
||||
"notes" : []
|
||||
},
|
||||
{
|
||||
"title": "💾 Core",
|
||||
"labels": ["core"],
|
||||
"notes" : []
|
||||
},
|
||||
{
|
||||
"title": "📂 Github",
|
||||
"labels": ["github"],
|
||||
"notes" : []
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "🌐 Website",
|
||||
"labels": ["website"],
|
||||
"subCategories": [
|
||||
{
|
||||
"title": "🐞 Bug Fixes",
|
||||
"labels": ["bugfix"],
|
||||
"notes" : []
|
||||
},
|
||||
{
|
||||
"title": "✨ New Features",
|
||||
"labels": ["feature"],
|
||||
"notes" : []
|
||||
},
|
||||
{
|
||||
"title": "💥 Breaking Changes",
|
||||
"labels": ["breaking change"],
|
||||
"notes" : []
|
||||
},
|
||||
{
|
||||
"title": "📝 Script Information",
|
||||
"labels": ["json"],
|
||||
"notes" : []
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "❔ Unlabelled",
|
||||
"labels": []
|
||||
},
|
||||
{
|
||||
"title": "💥 Breaking Changes",
|
||||
"labels": ["breaking change"]
|
||||
}
|
||||
]
|
||||
|
18
.github/pull_request_template.md
vendored
18
.github/pull_request_template.md
vendored
@ -1,25 +1,25 @@
|
||||
## ✍️ Description
|
||||
<!-- Provide a clear and concise description of your changes. -->
|
||||
|
||||
|
||||
## 🔗 Related PR / Discussion / Issue
|
||||
|
||||
Link: #
|
||||
|
||||
|
||||
|
||||
## ✅ Prerequisites
|
||||
|
||||
Before this PR can be reviewed, the following must be completed:
|
||||
|
||||
- [] **Self-review performed** – Code follows established patterns and conventions.
|
||||
- [] **Testing performed** – Changes have been thoroughly tested and verified.
|
||||
|
||||
|
||||
## 🛠️ Type of Change
|
||||
Select all that apply:
|
||||
- [] 🐞 **Bug fix** – Resolves an issue without breaking functionality.
|
||||
- [] ✨ **New feature** – Adds new, non-breaking functionality.
|
||||
- [] 💥 **Breaking change** – Alters existing functionality in a way that may require updates.
|
||||
- [] 🆕 **New script** – A fully functional and tested script or script set.
|
||||
|
||||
Select all that apply:
|
||||
|
||||
- [] 🆕 **New script** – A fully functional and tested script or script set.
|
||||
- [] 🐞 **Bug fix** – Resolves an issue without breaking functionality.
|
||||
- [] ✨ **New feature** – Adds new, non-breaking functionality.
|
||||
- [] 💥 **Breaking change** – Alters existing functionality in a way that may require updates.
|
||||
|
||||
## 📋 Additional Information (optional)
|
||||
<!-- Provide extra context, screenshots, or references if needed. -->
|
||||
|
35
.github/workflows/autolabeler.yml
vendored
35
.github/workflows/autolabeler.yml
vendored
@ -43,26 +43,8 @@ jobs:
|
||||
});
|
||||
const prFiles = prListFilesResponse.data;
|
||||
|
||||
const templateLabelMappings = {
|
||||
"🐞 **bug fix**": "bugfix",
|
||||
"✨ **new feature**": "feature",
|
||||
"💥 **breaking change**": "breaking change",
|
||||
"🆕 **new script**": "new script"
|
||||
};
|
||||
|
||||
for (const [checkbox, label] of Object.entries(templateLabelMappings)) {
|
||||
const escapedCheckbox = checkbox.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
|
||||
const regex = new RegExp(`- \\[(x|X)\\]\\s*.*${escapedCheckbox}`, "i");
|
||||
const match = prBody.match(regex);
|
||||
if (match) {
|
||||
console.log(`Match: ${match}`);
|
||||
labelsToAdd.add(label);
|
||||
}
|
||||
}
|
||||
if (labelsToAdd.size === 0) {
|
||||
labelsToAdd.add("general");
|
||||
}
|
||||
|
||||
|
||||
// Apply labels based on file changes
|
||||
for (const [label, rules] of Object.entries(autolabelerConfig)) {
|
||||
const shouldAddLabel = prFiles.some((prFile) => {
|
||||
@ -79,6 +61,21 @@ jobs:
|
||||
labelsToAdd.add(label);
|
||||
}
|
||||
}
|
||||
const templateLabelMappings = {
|
||||
"🐞 **Bug fix**": "bugfix",
|
||||
"✨ **New feature**": "feature",
|
||||
"💥 **Breaking change**": "breaking change",
|
||||
};
|
||||
|
||||
for (const [checkbox, label] of Object.entries(templateLabelMappings)) {
|
||||
const escapedCheckbox = checkbox.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
|
||||
const regex = new RegExp(`- \\[(x|X)\\]\\s*.*${escapedCheckbox}`, "i");
|
||||
const match = prBody.match(regex);
|
||||
if (match) {
|
||||
console.log(`Match: ${match}`);
|
||||
labelsToAdd.add(label);
|
||||
}
|
||||
}
|
||||
|
||||
console.log(`Labels to add: ${Array.from(labelsToAdd).join(", ")}`);
|
||||
|
||||
|
41
.github/workflows/changelog-pr.yml
vendored
41
.github/workflows/changelog-pr.yml
vendored
@ -58,10 +58,26 @@ jobs:
|
||||
const categorizedPRs = changelogConfig.map(obj => ({
|
||||
...obj,
|
||||
notes: [],
|
||||
subCategories: obj.subCategories ?? (obj.labels.includes("update script") ? [
|
||||
{ title: "🐞 Bug Fixes", labels: ["bugfix"] },
|
||||
{ title: "✨ Feature Updates", labels: ["feature"] }
|
||||
] : [])
|
||||
subCategories: obj.subCategories ?? (
|
||||
obj.labels.includes("update script") ? [
|
||||
{ title: "🐞 Bug Fixes", labels: ["bugfix"], notes: [] },
|
||||
{ title: "✨ New Features", labels: ["feature"], notes: [] },
|
||||
{ title: "💥 Breaking Changes", labels: ["breaking change"], notes: [] }
|
||||
] :
|
||||
obj.labels.includes("maintenance") ? [
|
||||
{ title: "🐞 Bug Fixes", labels: ["bugfix"], notes: [] },
|
||||
{ title: "✨ New Features", labels: ["feature"], notes: [] },
|
||||
{ title: "💥 Breaking Changes", labels: ["breaking change"], notes: [] },
|
||||
{ title: "📡 API", labels: ["api"], notes: [] },
|
||||
{ title: "Github", labels: ["github"], notes: [] }
|
||||
] :
|
||||
obj.labels.includes("website") ? [
|
||||
{ title: "🐞 Bug Fixes", labels: ["bugfix"], notes: [] },
|
||||
{ title: "✨ New Features", labels: ["feature"], notes: [] },
|
||||
{ title: "💥 Breaking Changes", labels: ["breaking change"], notes: [] },
|
||||
{ title: "Script Information", labels: ["json"], notes: [] }
|
||||
] : []
|
||||
)
|
||||
}));
|
||||
|
||||
const latestDateInChangelog = new Date(process.env.LATEST_DATE);
|
||||
@ -110,6 +126,7 @@ jobs:
|
||||
|
||||
return categorizedPRs;
|
||||
|
||||
|
||||
- name: Update CHANGELOG.md
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
@ -124,7 +141,8 @@ jobs:
|
||||
|
||||
console.log(JSON.stringify(categorizedPRs, null, 2));
|
||||
|
||||
let newReleaseNotes = `## ${today}\n\n### Changes\n\n`;
|
||||
|
||||
let newReleaseNotes = `## ${today}\n\n`;
|
||||
for (const { title, notes, subCategories } of categorizedPRs) {
|
||||
const hasSubcategories = subCategories && subCategories.length > 0;
|
||||
const hasMainNotes = notes.length > 0;
|
||||
@ -133,17 +151,16 @@ jobs:
|
||||
|
||||
if (hasMainNotes || hasSubNotes) {
|
||||
newReleaseNotes += `### ${title}\n\n`;
|
||||
}
|
||||
}
|
||||
|
||||
if (hasMainNotes) {
|
||||
newReleaseNotes += `${notes.join("\n")}\n\n`;
|
||||
}
|
||||
|
||||
newReleaseNotes += ` ${notes.join("\n")}\n\n`;
|
||||
}
|
||||
if (hasSubcategories) {
|
||||
for (const { title: subTitle, notes: subNotes } of subCategories) {
|
||||
if (subNotes && subNotes.length > 0) {
|
||||
newReleaseNotes += ` #### ${subTitle}\n\n`;
|
||||
newReleaseNotes += ` ${subNotes.join("\n ")}\n\n`;
|
||||
newReleaseNotes += ` - #### ${subTitle}\n\n`;
|
||||
newReleaseNotes += ` ${subNotes.join("\n ")}\n\n`;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -206,4 +223,4 @@ jobs:
|
||||
PR_NUMBER=$(gh pr list --head "${BRANCH_NAME}" --json number --jq '.[].number')
|
||||
if [ -n "$PR_NUMBER" ]; then
|
||||
gh pr review $PR_NUMBER --approve
|
||||
fi
|
||||
fi
|
122
.github/workflows/close-discussion.yml
vendored
Normal file
122
.github/workflows/close-discussion.yml
vendored
Normal file
@ -0,0 +1,122 @@
|
||||
name: Close Discussion on PR Merge
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
types: [closed]
|
||||
|
||||
jobs:
|
||||
close-discussion:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set Up Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: "20"
|
||||
- name: Install Dependencies
|
||||
run: npm install zx @octokit/graphql
|
||||
|
||||
- name: Close Discussion
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
PR_BODY: ${{ github.event.pull_request.body }}
|
||||
PR_NUMBER: ${{ github.event.pull_request.number }}
|
||||
REPO_OWNER: ${{ github.repository_owner }}
|
||||
REPO_NAME: ${{ github.event.repository.name }}
|
||||
run: |
|
||||
npx zx << 'EOF'
|
||||
import { graphql } from "@octokit/graphql";
|
||||
(async function() {
|
||||
try {
|
||||
const token = process.env.GITHUB_TOKEN;
|
||||
const prBody = process.env.PR_BODY;
|
||||
const prNumber = process.env.PR_NUMBER;
|
||||
const owner = process.env.REPO_OWNER;
|
||||
const repo = process.env.REPO_NAME;
|
||||
|
||||
if (!token || !prBody || !prNumber || !owner || !repo) {
|
||||
console.log("Missing required environment variables.");
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const match = prBody.match(/#(\d+)/);
|
||||
if (!match) {
|
||||
console.log("No discussion ID found in PR body.");
|
||||
return;
|
||||
}
|
||||
const discussionNumber = match[1];
|
||||
|
||||
console.log(`Extracted Discussion Number: ${discussionNumber}`);
|
||||
console.log(`PR Number: ${prNumber}`);
|
||||
console.log(`Repository: ${owner}/${repo}`);
|
||||
|
||||
const graphqlWithAuth = graphql.defaults({
|
||||
headers: { authorization: `Bearer ${token}` },
|
||||
});
|
||||
|
||||
const discussionQuery = `
|
||||
query($owner: String!, $repo: String!, $number: Int!) {
|
||||
repository(owner: $owner, name: $repo) {
|
||||
discussion(number: $number) {
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
const discussionResponse = await graphqlWithAuth(discussionQuery, {
|
||||
owner,
|
||||
repo,
|
||||
number: parseInt(discussionNumber, 10),
|
||||
});
|
||||
|
||||
const discussionQLId = discussionResponse.repository.discussion.id;
|
||||
if (!discussionQLId) {
|
||||
console.log("Failed to fetch discussion GraphQL ID.");
|
||||
return;
|
||||
}
|
||||
|
||||
console.log(`GraphQL Discussion ID: ${discussionQLId}`);
|
||||
|
||||
const commentMutation = `
|
||||
mutation($discussionId: ID!, $body: String!) {
|
||||
addDiscussionComment(input: { discussionId: $discussionId, body: $body }) {
|
||||
comment { id body }
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
const commentResponse = await graphqlWithAuth(commentMutation, {
|
||||
discussionId: discussionQLId,
|
||||
body: `Merged with PR #${prNumber}`,
|
||||
});
|
||||
|
||||
const commentId = commentResponse.addDiscussionComment.comment.id;
|
||||
if (!commentId) {
|
||||
console.log("Failed to post the comment.");
|
||||
return;
|
||||
}
|
||||
|
||||
console.log(`Comment Posted Successfully! Comment ID: ${commentId}`);
|
||||
|
||||
const markAnswerMutation = `
|
||||
mutation($id: ID!) {
|
||||
markDiscussionCommentAsAnswer(input: { id: $id }) {
|
||||
discussion { id title }
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
await graphqlWithAuth(markAnswerMutation, { id: commentId });
|
||||
|
||||
console.log("Comment marked as answer successfully!");
|
||||
|
||||
} catch (error) {
|
||||
console.error("Error:", error);
|
||||
return;
|
||||
}
|
||||
})();
|
||||
EOF
|
95
.github/workflows/script-test.yml
vendored
95
.github/workflows/script-test.yml
vendored
@ -62,46 +62,71 @@ jobs:
|
||||
id: run-install
|
||||
continue-on-error: true
|
||||
run: |
|
||||
set +e
|
||||
#run for each files in /ct
|
||||
for FILE in ${{ env.ALL_FILES }}; do
|
||||
STRIPPED_NAME=$(basename "$FILE" | sed 's/-install//' | sed 's/\.sh$//')
|
||||
echo "Running Test for: $STRIPPED_NAME"
|
||||
if [[ $FILE =~ ^install/.*-install\.sh$ ]]; then
|
||||
CT_SCRIPT="ct/$STRIPPED_NAME.sh"
|
||||
echo $CT_SCRIPT
|
||||
if [[ ! -f $CT_SCRIPT ]]; then
|
||||
echo "No CT script found for $STRIPPED_NAME"
|
||||
ERROR_MSG="No CT script found for $FILE"
|
||||
RUN=false
|
||||
set +e
|
||||
#run for each files in /ct
|
||||
for FILE in ${{ env.ALL_FILES }}; do
|
||||
STRIPPED_NAME=$(basename "$FILE" | sed 's/-install//' | sed 's/\.sh$//')
|
||||
echo "Running Test for: $STRIPPED_NAME"
|
||||
if grep -E -q 'read\s+-r\s+-p\s+".*"\s+\w+' "$FILE"; then
|
||||
echo "The script contains an interactive prompt. Skipping execution."
|
||||
continue
|
||||
fi
|
||||
echo "Found CT script for $STRIPPED_NAME"
|
||||
chmod +x "$CT_SCRIPT"
|
||||
RUNNING_FILE=$CT_SCRIPT
|
||||
elif [[ $FILE =~ ^ct/.*\.sh$ ]]; then
|
||||
INSTALL_SCRIPT="install/$STRIPPED_NAME-install.sh"
|
||||
if [[ ! -f $INSTALL_SCRIPT ]]; then
|
||||
echo "No install script found for $STRIPPED_NAME"
|
||||
ERROR_MSG="No install script found for $FILE"
|
||||
RUN=false
|
||||
fi
|
||||
echo "Found install script for $STRIPPED_NAME"
|
||||
chmod +x "$INSTALL_SCRIPT"
|
||||
RUNNING_FILE=$FILE
|
||||
fi
|
||||
if [[ $RUN != "false" ]]; then
|
||||
if [[ $FILE =~ ^install/.*-install\.sh$ ]]; then
|
||||
CT_SCRIPT="ct/$STRIPPED_NAME.sh"
|
||||
if [[ ! -f $CT_SCRIPT ]]; then
|
||||
echo "No CT script found for $STRIPPED_NAME"
|
||||
ERROR_MSG="No CT script found for $FILE"
|
||||
echo "$ERROR_MSG" > result_$STRIPPED_NAME.log
|
||||
continue
|
||||
fi
|
||||
if grep -E -q 'read\s+-r\s+-p\s+".*"\s+\w+' "install/$STRIPPED_NAME-install.sh"; then
|
||||
echo "The script contains an interactive prompt. Skipping execution."
|
||||
continue
|
||||
fi
|
||||
echo "Found CT script for $STRIPPED_NAME"
|
||||
chmod +x "$CT_SCRIPT"
|
||||
RUNNING_FILE=$CT_SCRIPT
|
||||
elif [[ $FILE =~ ^ct/.*\.sh$ ]]; then
|
||||
INSTALL_SCRIPT="install/$STRIPPED_NAME-install.sh"
|
||||
if [[ ! -f $INSTALL_SCRIPT ]]; then
|
||||
echo "No install script found for $STRIPPED_NAME"
|
||||
ERROR_MSG="No install script found for $FILE"
|
||||
echo "$ERROR_MSG" > result_$STRIPPED_NAME.log
|
||||
continue
|
||||
fi
|
||||
echo "Found install script for $STRIPPED_NAME"
|
||||
chmod +x "$INSTALL_SCRIPT"
|
||||
RUNNING_FILE=$FILE
|
||||
if grep -E -q 'read\s+-r\s+-p\s+".*"\s+\w+' "ct/$STRIPPED_NAME.sh"; then
|
||||
echo "The script contains an interactive prompt. Skipping execution."
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
git remote add community-scripts https://github.com/community-scripts/ProxmoxVE.git
|
||||
git fetch community-scripts
|
||||
rm -f .github/workflows/scripts/app-test/pr-build.func || true
|
||||
rm -f .github/workflows/scripts/app-test/pr-install.func || true
|
||||
rm -f .github/workflows/scripts/app-test/pr-alpine-install.func || true
|
||||
rm -f .github/workflows/scripts/app-test/pr-create-lxc.sh || true
|
||||
git checkout community-scripts/main -- .github/workflows/scripts/app-test/pr-build.func
|
||||
git checkout community-scripts/main -- .github/workflows/scripts/app-test/pr-install.func
|
||||
git checkout community-scripts/main -- .github/workflows/scripts/app-test/pr-alpine-install.func
|
||||
git checkout community-scripts/main -- .github/workflows/scripts/app-test/pr-create-lxc.sh
|
||||
chmod +x $RUNNING_FILE
|
||||
sed -i 's|source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)|source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/.github/workflows/scripts/app-test/pr-build.func)|g' "$RUNNING_FILE"
|
||||
chmod +x .github/workflows/scripts/app-test/pr-create-lxc.sh
|
||||
chmod +x .github/workflows/scripts/app-test/pr-install.func
|
||||
chmod +x .github/workflows/scripts/app-test/pr-alpine-install.func
|
||||
chmod +x .github/workflows/scripts/app-test/pr-build.func
|
||||
sed -i 's|source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)|source .github/workflows/scripts/app-test/pr-build.func|g' "$RUNNING_FILE"
|
||||
echo "Executing $RUNNING_FILE"
|
||||
ERROR_MSG=$(./$RUNNING_FILE 2>&1 > /dev/null)
|
||||
echo "Finished running $FILE"
|
||||
fi
|
||||
if [ -n "$ERROR_MSG" ]; then
|
||||
echo "ERROR in $STRIPPED_NAME: $ERROR_MSG"
|
||||
echo "$ERROR_MSG" > result_$STRIPPED_NAME.log
|
||||
fi
|
||||
done
|
||||
set -e # Restore exit-on-error
|
||||
if [ -n "$ERROR_MSG" ]; then
|
||||
echo "ERROR in $STRIPPED_NAME: $ERROR_MSG"
|
||||
echo "$ERROR_MSG" > result_$STRIPPED_NAME.log
|
||||
fi
|
||||
done
|
||||
set -e # Restore exit-on-error
|
||||
|
||||
- name: Cleanup PVE Node
|
||||
run: |
|
||||
|
79
CHANGELOG.md
79
CHANGELOG.md
@ -17,6 +17,85 @@ All LXC instances created using this repository come pre-installed with Midnight
|
||||
Do not break established syntax in this file, as it is automatically updated by a Github Workflow
|
||||
|
||||
|
||||
## 2025-02-27
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
- web-check [@CrazyWolf13](https://github.com/CrazyWolf13) ([#2662](https://github.com/community-scripts/ProxmoxVE/pull/2662))
|
||||
- Pelican Panel [@bvdberg01](https://github.com/bvdberg01) ([#2678](https://github.com/community-scripts/ProxmoxVE/pull/2678))
|
||||
- Pelican Wings [@bvdberg01](https://github.com/bvdberg01) ([#2677](https://github.com/community-scripts/ProxmoxVE/pull/2677))
|
||||
- ByteStash [@tremor021](https://github.com/tremor021) ([#2680](https://github.com/community-scripts/ProxmoxVE/pull/2680))
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- ByteStash: Removed sed, app supports Node v22 now [@tremor021](https://github.com/tremor021) ([#2728](https://github.com/community-scripts/ProxmoxVE/pull/2728))
|
||||
- Keycloak: Update installation script [@tremor021](https://github.com/tremor021) ([#2714](https://github.com/community-scripts/ProxmoxVE/pull/2714))
|
||||
- ByteStash: Fix Node 22 compatibility (thanks t2lc) [@tremor021](https://github.com/tremor021) ([#2705](https://github.com/community-scripts/ProxmoxVE/pull/2705))
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- EOF not detected [@CrazyWolf13](https://github.com/CrazyWolf13) ([#2726](https://github.com/community-scripts/ProxmoxVE/pull/2726))
|
||||
- Zitadel-install.sh: Remove one version file and update to our standard [@bvdberg01](https://github.com/bvdberg01) ([#2710](https://github.com/community-scripts/ProxmoxVE/pull/2710))
|
||||
- Outline: Change key to hex32 [@tremor021](https://github.com/tremor021) ([#2709](https://github.com/community-scripts/ProxmoxVE/pull/2709))
|
||||
- Typo in update scripts [@bvdberg01](https://github.com/bvdberg01) ([#2707](https://github.com/community-scripts/ProxmoxVE/pull/2707))
|
||||
- SFTPGo Remove unneeded RELEASE variable [@MickLesk](https://github.com/MickLesk) ([#2683](https://github.com/community-scripts/ProxmoxVE/pull/2683))
|
||||
|
||||
### 🧰 Maintenance
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- Update install.func: Change Line Number for Error message. [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2690](https://github.com/community-scripts/ProxmoxVE/pull/2690))
|
||||
|
||||
- #### 📂 Github
|
||||
|
||||
- New Workflow to close Script Request Discussions on PR merge [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2688](https://github.com/community-scripts/ProxmoxVE/pull/2688))
|
||||
- Improve Script-Test Workflow [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2712](https://github.com/community-scripts/ProxmoxVE/pull/2712))
|
||||
- Switch all actions to self-hosted Runners [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2711](https://github.com/community-scripts/ProxmoxVE/pull/2711))
|
||||
|
||||
### 🌐 Website
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- Use HTML button element for copying to clipboard [@scallaway](https://github.com/scallaway) ([#2720](https://github.com/community-scripts/ProxmoxVE/pull/2720))
|
||||
- Add basic pagination to Data Viewer [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2715](https://github.com/community-scripts/ProxmoxVE/pull/2715))
|
||||
|
||||
- #### 📝 Script Information
|
||||
|
||||
- wger - Add HTTPS instructions to the website [@tremor021](https://github.com/tremor021) ([#2695](https://github.com/community-scripts/ProxmoxVE/pull/2695))
|
||||
|
||||
## 2025-02-26
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
- New Script: Outline [@tremor021](https://github.com/tremor021) ([#2653](https://github.com/community-scripts/ProxmoxVE/pull/2653))
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- Fix: SABnzbd - Removed few artefacts in the code preventing the update [@tremor021](https://github.com/tremor021) ([#2670](https://github.com/community-scripts/ProxmoxVE/pull/2670))
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- Fix: Homarr - Manually correct db-migration wrong-folder [@CrazyWolf13](https://github.com/CrazyWolf13) ([#2676](https://github.com/community-scripts/ProxmoxVE/pull/2676))
|
||||
- Kimai: add local.yaml & fix path permissions [@MickLesk](https://github.com/MickLesk) ([#2646](https://github.com/community-scripts/ProxmoxVE/pull/2646))
|
||||
- PiHole: Fix Unbound sed for DNS [@MickLesk](https://github.com/MickLesk) ([#2647](https://github.com/community-scripts/ProxmoxVE/pull/2647))
|
||||
- Alpine IT-Tools fix typo "unexpected EOF while looking for matching `"' [@MickLesk](https://github.com/MickLesk) ([#2644](https://github.com/community-scripts/ProxmoxVE/pull/2644))
|
||||
|
||||
### 🧰 Maintenance
|
||||
|
||||
- #### 📂 Github
|
||||
|
||||
- [gh] Furhter Impove Changelog Workflow [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2655](https://github.com/community-scripts/ProxmoxVE/pull/2655))
|
||||
|
||||
### 🌐 Website
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- Website: PocketID Change of website and documentation links [@schneider-de-com](https://github.com/schneider-de-com) ([#2643](https://github.com/community-scripts/ProxmoxVE/pull/2643))
|
||||
|
||||
- #### 📝 Script Information
|
||||
|
||||
- Fix: Graylog - Improve application description for website [@tremor021](https://github.com/tremor021) ([#2658](https://github.com/community-scripts/ProxmoxVE/pull/2658))
|
||||
|
||||
## 2025-02-25
|
||||
|
||||
### Changes
|
||||
|
@ -27,7 +27,7 @@ function update_script() {
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
msg_error "There is currently no update path available."
|
||||
msg_error "Currently we don't provide an update function for this ${APP}."
|
||||
exit
|
||||
}
|
||||
|
||||
|
@ -30,7 +30,7 @@ if [ ! -d /usr/share/nginx/html ]; then
|
||||
fi
|
||||
|
||||
RELEASE=$(curl -s https://api.github.com/repos/CorentinTh/it-tools/releases/latest | grep '"tag_name":' | cut -d '"' -f4)
|
||||
if [ "${RELEASE}" != "$(cat /opt/${APP}_version.txt" ] || [ ! -f /opt/${APP}_version.txt ]; then
|
||||
if [ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ] || [ ! -f /opt/${APP}_version.txt ]; then
|
||||
DOWNLOAD_URL="https://github.com/CorentinTh/it-tools/releases/download/${RELEASE}/it-tools-${RELEASE#v}.zip"
|
||||
msg_info "Updating ${APP} LXC"
|
||||
curl -fsSL -o it-tools.zip "$DOWNLOAD_URL"
|
||||
|
@ -28,7 +28,7 @@ function update_script() {
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
msg_error "There is currently no update path available."
|
||||
msg_error "Currently we don't provide an update function for this ${APP}."
|
||||
exit
|
||||
}
|
||||
|
||||
|
@ -27,7 +27,7 @@ function update_script() {
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
msg_error "There is currently no update path available."
|
||||
msg_error "Currently we don't provide an update function for this ${APP}."
|
||||
exit
|
||||
}
|
||||
|
||||
|
@ -27,7 +27,7 @@ function update_script() {
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
msg_error "Ther is currently no automatic update function for ${APP}."
|
||||
msg_error "Currently we don't provide an update function for this ${APP}."
|
||||
exit
|
||||
}
|
||||
|
||||
|
@ -28,7 +28,7 @@ function update_script() {
|
||||
exit
|
||||
fi
|
||||
/opt/beszel/beszel update
|
||||
msg_error "Ther is currently no automatic update function for ${APP}."
|
||||
msg_error "Currently we don't provide an update function for this ${APP}."
|
||||
exit
|
||||
}
|
||||
|
||||
|
73
ct/bytestash.sh
Normal file
73
ct/bytestash.sh
Normal file
@ -0,0 +1,73 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: Slaviša Arežina (tremor021)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/jordan-dalby/ByteStash
|
||||
|
||||
APP="ByteStash"
|
||||
var_tags="code"
|
||||
var_disk="4"
|
||||
var_cpu="1"
|
||||
var_ram="1024"
|
||||
var_os="debian"
|
||||
var_version="12"
|
||||
var_unprivileged="1"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
if [[ ! -d /opt/bytestash ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
RELEASE=$(curl -s https://api.github.com/repos/jordan-dalby/ByteStash/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
||||
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
|
||||
msg_info "Stopping Services"
|
||||
systemctl stop bytestash-backend
|
||||
systemctl stop bytestash-frontend
|
||||
msg_ok "Services Stopped"
|
||||
|
||||
msg_info "Updating ${APP} to ${RELEASE}"
|
||||
temp_file=$(mktemp)
|
||||
wget -q "https://github.com/jordan-dalby/ByteStash/archive/refs/tags/v${RELEASE}.tar.gz" -O $temp_file
|
||||
tar zxf $temp_file
|
||||
rm -rf /opt/bytestash/server/node_modules
|
||||
rm -rf /opt/bytestash/client/node_modules
|
||||
cp -rf ByteStash-${RELEASE}/* /opt/bytestash
|
||||
cd /opt/bytestash/server
|
||||
$STD npm install
|
||||
cd /opt/bytestash/client
|
||||
$STD npm install
|
||||
echo "${RELEASE}" >/opt/${APP}_version.txt
|
||||
msg_ok "Updated ${APP}"
|
||||
|
||||
msg_info "Starting Services"
|
||||
systemctl start bytestash-backend
|
||||
systemctl start bytestash-frontend
|
||||
msg_ok "Started Services"
|
||||
|
||||
msg_info "Cleaning Up"
|
||||
rm -f $temp_file
|
||||
msg_ok "Cleaned"
|
||||
msg_ok "Updated Successfully"
|
||||
else
|
||||
msg_ok "No update required. ${APP} is already at ${RELEASE}"
|
||||
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}:3000${CL}"
|
@ -27,7 +27,7 @@ function update_script() {
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
msg_error "There is currently no update path available."
|
||||
msg_error "Currently we don't provide an update function for this ${APP}."
|
||||
exit
|
||||
}
|
||||
|
||||
|
@ -27,7 +27,7 @@ function update_script() {
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
msg_error "There is currently no update path available."
|
||||
msg_error "Currently we don't provide an update function for this ${APP}."
|
||||
exit
|
||||
msg_info "Updating ${APP}"
|
||||
systemctl stop ${APP}
|
||||
|
@ -30,7 +30,7 @@ function update_script() {
|
||||
fi
|
||||
RELEASE=$(curl -s https://api.github.com/repos/glpi-project/glpi/releases/latest | grep '"tag_name"' | sed -E 's/.*"tag_name": "([^"]+)".*/\1/')
|
||||
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
|
||||
msg_error "Ther is currently no automatic update function for ${APP}."
|
||||
msg_error "Currently we don't provide an update function for this ${APP}."
|
||||
else
|
||||
msg_ok "No update required. ${APP} is already at v${RELEASE}."
|
||||
fi
|
||||
|
@ -27,7 +27,7 @@ function update_script() {
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
msg_error "There is currently no update path available."
|
||||
msg_error "Currently we don't provide an update function for this ${APP}."
|
||||
exit
|
||||
}
|
||||
|
||||
|
6
ct/headers/bytestash
Normal file
6
ct/headers/bytestash
Normal file
@ -0,0 +1,6 @@
|
||||
____ __ _____ __ __
|
||||
/ __ )__ __/ /____ / ___// /_____ ______/ /_
|
||||
/ __ / / / / __/ _ \\__ \/ __/ __ `/ ___/ __ \
|
||||
/ /_/ / /_/ / /_/ __/__/ / /_/ /_/ (__ ) / / /
|
||||
/_____/\__, /\__/\___/____/\__/\__,_/____/_/ /_/
|
||||
/____/
|
6
ct/headers/outline
Normal file
6
ct/headers/outline
Normal file
@ -0,0 +1,6 @@
|
||||
____ __ ___
|
||||
/ __ \__ __/ /_/ (_)___ ___
|
||||
/ / / / / / / __/ / / __ \/ _ \
|
||||
/ /_/ / /_/ / /_/ / / / / / __/
|
||||
\____/\__,_/\__/_/_/_/ /_/\___/
|
||||
|
6
ct/headers/pelican-panel
Normal file
6
ct/headers/pelican-panel
Normal file
@ -0,0 +1,6 @@
|
||||
____ ___ ____ __
|
||||
/ __ \___ / (_)________ _____ / __ \____ _____ ___ / /
|
||||
/ /_/ / _ \/ / / ___/ __ `/ __ \______/ /_/ / __ `/ __ \/ _ \/ /
|
||||
/ ____/ __/ / / /__/ /_/ / / / /_____/ ____/ /_/ / / / / __/ /
|
||||
/_/ \___/_/_/\___/\__,_/_/ /_/ /_/ \__,_/_/ /_/\___/_/
|
||||
|
6
ct/headers/pelican-wings
Normal file
6
ct/headers/pelican-wings
Normal file
@ -0,0 +1,6 @@
|
||||
____ ___ _ ___
|
||||
/ __ \___ / (_)________ _____ | | / (_)___ ____ ______
|
||||
/ /_/ / _ \/ / / ___/ __ `/ __ \_____| | /| / / / __ \/ __ `/ ___/
|
||||
/ ____/ __/ / / /__/ /_/ / / / /_____/ |/ |/ / / / / / /_/ (__ )
|
||||
/_/ \___/_/_/\___/\__,_/_/ /_/ |__/|__/_/_/ /_/\__, /____/
|
||||
/____/
|
6
ct/headers/web-check
Normal file
6
ct/headers/web-check
Normal file
@ -0,0 +1,6 @@
|
||||
__ __ __
|
||||
_ _____ / /_ _____/ /_ ___ _____/ /__
|
||||
| | /| / / _ \/ __ \______/ ___/ __ \/ _ \/ ___/ //_/
|
||||
| |/ |/ / __/ /_/ /_____/ /__/ / / / __/ /__/ ,<
|
||||
|__/|__/\___/_.___/ \___/_/ /_/\___/\___/_/|_|
|
||||
|
@ -27,7 +27,7 @@ function update_script() {
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
msg_error "There is currently no update path available."
|
||||
msg_error "Currently we don't provide an update function for this ${APP}."
|
||||
exit
|
||||
}
|
||||
|
||||
|
10
ct/homarr.sh
10
ct/homarr.sh
@ -49,6 +49,11 @@ set +a
|
||||
export DB_DIALECT='sqlite'
|
||||
export AUTH_SECRET=$(openssl rand -base64 32)
|
||||
node /opt/homarr_db/migrations/$DB_DIALECT/migrate.cjs /opt/homarr_db/migrations/$DB_DIALECT
|
||||
for dir in $(find /opt/homarr_db/migrations/migrations -mindepth 1 -maxdepth 1 -type d); do
|
||||
dirname=$(basename "$dir")
|
||||
mkdir -p "/opt/homarr_db/migrations/$dirname"
|
||||
cp -r "$dir"/* "/opt/homarr_db/migrations/$dirname/" 2>/dev/null || true
|
||||
done
|
||||
export HOSTNAME=$(ip route get 1.1.1.1 | grep -oP 'src \K[^ ]+')
|
||||
envsubst '${HOSTNAME}' < /etc/nginx/templates/nginx.conf > /etc/nginx/nginx.conf
|
||||
nginx -g 'daemon off;' &
|
||||
@ -97,6 +102,11 @@ set +a
|
||||
export DB_DIALECT='sqlite'
|
||||
export AUTH_SECRET=$(openssl rand -base64 32)
|
||||
node /opt/homarr_db/migrations/$DB_DIALECT/migrate.cjs /opt/homarr_db/migrations/$DB_DIALECT
|
||||
for dir in $(find /opt/homarr_db/migrations/migrations -mindepth 1 -maxdepth 1 -type d); do
|
||||
dirname=$(basename "$dir")
|
||||
mkdir -p "/opt/homarr_db/migrations/$dirname"
|
||||
cp -r "$dir"/* "/opt/homarr_db/migrations/$dirname/" 2>/dev/null || true
|
||||
done
|
||||
export HOSTNAME=$(ip route get 1.1.1.1 | grep -oP 'src \K[^ ]+')
|
||||
envsubst '${HOSTNAME}' < /etc/nginx/templates/nginx.conf > /etc/nginx/nginx.conf
|
||||
nginx -g 'daemon off;' &
|
||||
|
@ -27,7 +27,7 @@ function update_script() {
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
msg_error "There is currently no update path available."
|
||||
msg_error "Currently we don't provide an update function for this ${APP}."
|
||||
exit
|
||||
}
|
||||
|
||||
|
@ -35,19 +35,22 @@ function update_script() {
|
||||
|
||||
msg_info "Updating ${APP} to ${RELEASE}"
|
||||
cp /opt/kimai/.env /opt/.env
|
||||
[ -f /opt/kimai/config/packages/local.yaml ] && cp /opt/kimai/config/packages/local.yaml /opt/local.yaml
|
||||
rm -rf /opt/kimai
|
||||
wget -q "https://github.com/kimai/kimai/archive/refs/tags/${RELEASE}.zip"
|
||||
unzip -q ${RELEASE}.zip
|
||||
mv kimai-${RELEASE} /opt/kimai
|
||||
mv /opt/.env /opt/kimai/.env
|
||||
[ -f /opt/local.yaml ] && mv /opt/local.yaml /opt/kimai/config/packages/local.yaml
|
||||
cd /opt/kimai
|
||||
$STD composer install --no-dev --optimize-autoloader
|
||||
$STD bin/console kimai:update
|
||||
chown -R :www-data .
|
||||
chmod -R g+r .
|
||||
chmod -R g+rw var/
|
||||
sudo chown -R www-data:www-data /opt/kimai
|
||||
sudo chmod -R 755 /opt/kimai
|
||||
chmod -R 777 /opt/kimai/var/
|
||||
chown -R www-data:www-data /opt/kimai
|
||||
chmod -R 755 /opt/kimai
|
||||
echo "${RELEASE}" >/opt/${APP}_version.txt
|
||||
msg_ok "Updated ${APP} to ${RELEASE}"
|
||||
|
||||
@ -72,4 +75,4 @@ 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}"
|
||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
|
||||
|
@ -27,7 +27,7 @@ function update_script() {
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
msg_error "There is currently no update path available."
|
||||
msg_error "Currently we don't provide an update function for this ${APP}."
|
||||
exit
|
||||
}
|
||||
|
||||
|
71
ct/outline.sh
Normal file
71
ct/outline.sh
Normal file
@ -0,0 +1,71 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: Slaviša Arežina (tremor021)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/outline/outline
|
||||
|
||||
APP="Outline"
|
||||
var_tags="documentation"
|
||||
var_disk="8"
|
||||
var_cpu="2"
|
||||
var_ram="4096"
|
||||
var_os="debian"
|
||||
var_version="12"
|
||||
var_unprivileged="1"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
if [[ ! -d /opt/outline ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
RELEASE=$(curl -s https://api.github.com/repos/outline/outline/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
||||
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
|
||||
msg_info "Stopping Services"
|
||||
systemctl stop outline
|
||||
msg_ok "Services Stopped"
|
||||
|
||||
msg_info "Updating ${APP} to ${RELEASE}"
|
||||
temp_file=$(mktemp)
|
||||
rm -rf /opt/outline/node_modules
|
||||
wget -q "https://github.com/outline/outline/archive/refs/tags/v${RELEASE}.tar.gz" -O $temp_file
|
||||
tar zxf $temp_file
|
||||
cp -rf outline-${RELEASE}/* /opt/outline
|
||||
cd /opt/outline
|
||||
export NODE_OPTIONS="--max-old-space-size=3584"
|
||||
$STD yarn install --frozen-lockfile
|
||||
$STD yarn build
|
||||
echo "${RELEASE}" >/opt/${APP}_version.txt
|
||||
msg_ok "Updated ${APP}"
|
||||
|
||||
msg_info "Starting Services"
|
||||
systemctl start outline
|
||||
msg_ok "Started Services"
|
||||
|
||||
msg_info "Cleaning Up"
|
||||
rm -rf $temp_file
|
||||
rm -rf $HOME/outline-${RELEASE}
|
||||
msg_ok "Cleaned"
|
||||
msg_ok "Updated Successfully"
|
||||
else
|
||||
msg_ok "No update required. ${APP} is already at ${RELEASE}"
|
||||
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}:3000${CL}"
|
76
ct/pelican-panel.sh
Normal file
76
ct/pelican-panel.sh
Normal file
@ -0,0 +1,76 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: bvdberg01
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/pelican-dev/panel
|
||||
|
||||
APP="Pelican-Panel"
|
||||
var_tags="Gaming"
|
||||
var_cpu="2"
|
||||
var_ram="1024"
|
||||
var_disk="4"
|
||||
var_os="debian"
|
||||
var_version="12"
|
||||
var_unprivileged="1"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
if [[ ! -d /opt/pelican-panel ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
RELEASE=$(curl -s https://api.github.com/repos/pelican-dev/panel/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
||||
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
|
||||
msg_info "Stopping Service"
|
||||
cd /opt/pelican-panel
|
||||
$STD php artisan down
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
msg_info "Updating ${APP} to v${RELEASE}"
|
||||
cp -r /opt/pelican-panel/.env /opt/
|
||||
rm -rf * .*
|
||||
wget -q "https://github.com/pelican-dev/panel/releases/download/v${RELEASE}/panel.tar.gz"
|
||||
tar -xzf "panel.tar.gz"
|
||||
mv /opt/.env /opt/pelican-panel/
|
||||
$STD composer install --no-dev --optimize-autoloader --no-interaction
|
||||
$STD php artisan p:environment:setup
|
||||
$STD php artisan view:clear
|
||||
$STD php artisan config:clear
|
||||
$STD php artisan filament:optimize
|
||||
$STD php artisan migrate --seed --force
|
||||
chown -R www-data:www-data /opt/pelican-panel
|
||||
chmod -R 755 /opt/pelican-panel/storage /opt/pelican-panel/bootstrap/cache/
|
||||
echo "${RELEASE}" >/opt/${APP}_version.txt
|
||||
msg_ok "Updated $APP to v${RELEASE}"
|
||||
|
||||
msg_info "Starting Service"
|
||||
$STD php artisan queue:restart
|
||||
$STD php artisan up
|
||||
msg_ok "Started Service"
|
||||
|
||||
msg_info "Cleaning up"
|
||||
rm -rf "/opt/pelican-panel/panel.tar.gz"
|
||||
msg_ok "Cleaned"
|
||||
msg_ok "Updated Successfully"
|
||||
else
|
||||
msg_ok "No update required. ${APP} is already at v${RELEASE}"
|
||||
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}/installer${CL}"
|
58
ct/pelican-wings.sh
Normal file
58
ct/pelican-wings.sh
Normal file
@ -0,0 +1,58 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: bvdberg01
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/pelican-dev/wings
|
||||
|
||||
APP="Pelican-Wings"
|
||||
var_tags="Gaming"
|
||||
var_cpu="2"
|
||||
var_ram="4096"
|
||||
var_disk="8"
|
||||
var_os="debian"
|
||||
var_version="12"
|
||||
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/bin/wings ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
RELEASE=$(curl -s https://api.github.com/repos/pelican-dev/wings/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
||||
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop wings
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
msg_info "Updating ${APP} to v${RELEASE}"
|
||||
rm /usr/local/bin/wings
|
||||
wget -q -O /usr/local/bin/wings "https://github.com/pelican-dev/wings/releases/download/v${RELEASE}/wings_linux_amd64"
|
||||
chmod u+x /usr/local/bin/wings
|
||||
echo "${RELEASE}" >/opt/${APP}_version.txt
|
||||
msg_ok "Updated $APP to v${RELEASE}"
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start wings
|
||||
msg_ok "Started Service"
|
||||
msg_ok "Updated Successfully"
|
||||
else
|
||||
msg_ok "No update required. ${APP} is already at v${RELEASE}"
|
||||
fi
|
||||
exit
|
||||
}
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
msg_ok "Completed Successfully!\n"
|
||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
@ -27,7 +27,7 @@ function update_script() {
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
msg_error "There is currently no update path available."
|
||||
msg_error "Currently we don't provide an update function for this ${APP}."
|
||||
exit
|
||||
}
|
||||
|
||||
|
@ -27,7 +27,7 @@ function update_script() {
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
msg_error "There is currently no update path available."
|
||||
msg_error "Currently we don't provide an update function for this ${APP}."
|
||||
exit
|
||||
}
|
||||
|
||||
|
@ -27,7 +27,7 @@ function update_script() {
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
msg_error "There is currently no update path available."
|
||||
msg_error "Currently we don't provide an update function for this ${APP}."
|
||||
exit
|
||||
}
|
||||
|
||||
|
@ -31,8 +31,8 @@ function update_script() {
|
||||
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
|
||||
msg_info "Updating $APP to ${RELEASE}"
|
||||
systemctl stop sabnzbd.service
|
||||
$STD tar zxvf <(curl -fsSL https://github.com/sabnzbd/sabnzbd/releases/download/$RELEASE/SABnzbd-${RELEASE}-src.tar.gz)
|
||||
$STD \cp -r SABnzbd-${RELEASE}/* /opt/sabnzbd
|
||||
tar zxvf <(curl -fsSL https://github.com/sabnzbd/sabnzbd/releases/download/$RELEASE/SABnzbd-${RELEASE}-src.tar.gz)
|
||||
cp -rf SABnzbd-${RELEASE}/* /opt/sabnzbd
|
||||
rm -rf SABnzbd-${RELEASE}
|
||||
cd /opt/sabnzbd
|
||||
$STD python3 -m pip install -r requirements.txt
|
||||
@ -40,7 +40,7 @@ function update_script() {
|
||||
systemctl start sabnzbd.service
|
||||
msg_ok "Updated ${APP} to ${RELEASE}"
|
||||
else
|
||||
msg_info "No update required. ${APP} is already at ${RELEASE}"
|
||||
msg_ok "No update required. ${APP} is already at ${RELEASE}"
|
||||
fi
|
||||
exit
|
||||
}
|
||||
|
@ -27,8 +27,7 @@ function update_script() {
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
msg_error "There is currently no update path available."
|
||||
exit
|
||||
msg_error "Currently we don't provide an update function for this ${APP}."
|
||||
exit
|
||||
}
|
||||
|
||||
|
41
ct/web-check.sh
Normal file
41
ct/web-check.sh
Normal file
@ -0,0 +1,41 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: CrazyWolf13
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/Lissy93/web-check
|
||||
|
||||
APP="web-check"
|
||||
TAGS="network;analysis"
|
||||
var_cpu="2"
|
||||
var_ram="2048"
|
||||
var_disk="12"
|
||||
var_os="debian"
|
||||
var_version="12"
|
||||
var_unprivileged="1"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
if [[ ! -d /opt/web-check ]]; 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}"
|
||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
|
@ -1,6 +1,6 @@
|
||||
"use client";
|
||||
|
||||
import React, { useEffect, useState } from "react";
|
||||
import React, { JSX, useEffect, useState } from "react";
|
||||
import DatePicker from 'react-datepicker';
|
||||
import 'react-datepicker/dist/react-datepicker.css';
|
||||
import ApplicationChart from "../../components/ApplicationChart";
|
||||
@ -21,28 +21,45 @@ interface DataModel {
|
||||
status: string;
|
||||
error: string;
|
||||
type: string;
|
||||
[key: string]: any;
|
||||
}
|
||||
|
||||
interface SummaryData {
|
||||
total_entries: number;
|
||||
status_count: Record<string, number>;
|
||||
nsapp_count: Record<string, number>;
|
||||
}
|
||||
|
||||
const DataFetcher: React.FC = () => {
|
||||
const [data, setData] = useState<DataModel[]>([]);
|
||||
const [summary, setSummary] = useState<SummaryData | null>(null);
|
||||
const [loading, setLoading] = useState<boolean>(true);
|
||||
const [error, setError] = useState<string | null>(null);
|
||||
const [searchQuery, setSearchQuery] = useState('');
|
||||
const [startDate, setStartDate] = useState<Date | null>(null);
|
||||
const [endDate, setEndDate] = useState<Date | null>(null);
|
||||
const [sortConfig, setSortConfig] = useState<{ key: keyof DataModel | null, direction: 'ascending' | 'descending' }>({ key: 'id', direction: 'descending' });
|
||||
const [itemsPerPage, setItemsPerPage] = useState(25);
|
||||
const [currentPage, setCurrentPage] = useState(1);
|
||||
|
||||
const [showErrorRow, setShowErrorRow] = useState<number | null>(null);
|
||||
|
||||
const [itemsPerPage, setItemsPerPage] = useState(25);
|
||||
const [sortConfig, setSortConfig] = useState<{ key: string; direction: 'ascending' | 'descending' } | null>(null);
|
||||
|
||||
useEffect(() => {
|
||||
const fetchData = async () => {
|
||||
const fetchSummary = async () => {
|
||||
try {
|
||||
const response = await fetch("https://api.htl-braunau.at/data/json");
|
||||
if (!response.ok) throw new Error("Failed to fetch data: ${response.statusText}");
|
||||
const response = await fetch("https://api.htl-braunau.at/data/summary");
|
||||
if (!response.ok) throw new Error(`Failed to fetch summary: ${response.statusText}`);
|
||||
const result: SummaryData = await response.json();
|
||||
setSummary(result);
|
||||
} catch (err) {
|
||||
setError((err as Error).message);
|
||||
}
|
||||
};
|
||||
|
||||
fetchSummary();
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
const fetchPaginatedData = async () => {
|
||||
setLoading(true);
|
||||
try {
|
||||
const response = await fetch(`https://api.htl-braunau.at/data/paginated?page=${currentPage}&limit=${itemsPerPage === 0 ? '' : itemsPerPage}`);
|
||||
if (!response.ok) throw new Error(`Failed to fetch data: ${response.statusText}`);
|
||||
const result: DataModel[] = await response.json();
|
||||
setData(result);
|
||||
} catch (err) {
|
||||
@ -52,52 +69,34 @@ const DataFetcher: React.FC = () => {
|
||||
}
|
||||
};
|
||||
|
||||
fetchData();
|
||||
}, []);
|
||||
|
||||
|
||||
const filteredData = data.filter(item => {
|
||||
const matchesSearchQuery = Object.values(item).some(value =>
|
||||
value.toString().toLowerCase().includes(searchQuery.toLowerCase())
|
||||
);
|
||||
const itemDate = new Date(item.created_at);
|
||||
const matchesDateRange = (!startDate || itemDate >= startDate) && (!endDate || itemDate <= endDate);
|
||||
return matchesSearchQuery && matchesDateRange;
|
||||
});
|
||||
fetchPaginatedData();
|
||||
}, [currentPage, itemsPerPage]);
|
||||
|
||||
const sortedData = React.useMemo(() => {
|
||||
let sortableData = [...filteredData];
|
||||
if (sortConfig.key !== null) {
|
||||
sortableData.sort((a, b) => {
|
||||
if (sortConfig.key !== null && a[sortConfig.key] < b[sortConfig.key]) {
|
||||
return sortConfig.direction === 'ascending' ? -1 : 1;
|
||||
}
|
||||
if (sortConfig.key !== null && a[sortConfig.key] > b[sortConfig.key]) {
|
||||
return sortConfig.direction === 'ascending' ? 1 : -1;
|
||||
}
|
||||
return 0;
|
||||
});
|
||||
}
|
||||
return sortableData;
|
||||
}, [filteredData, sortConfig]);
|
||||
if (!sortConfig) return data;
|
||||
const sorted = [...data].sort((a, b) => {
|
||||
if (a[sortConfig.key] < b[sortConfig.key]) {
|
||||
return sortConfig.direction === 'ascending' ? -1 : 1;
|
||||
}
|
||||
if (a[sortConfig.key] > b[sortConfig.key]) {
|
||||
return sortConfig.direction === 'ascending' ? 1 : -1;
|
||||
}
|
||||
return 0;
|
||||
});
|
||||
return sorted;
|
||||
}, [data, sortConfig]);
|
||||
|
||||
const requestSort = (key: keyof DataModel | null) => {
|
||||
if (loading) return <p>Loading...</p>;
|
||||
if (error) return <p>Error: {error}</p>;
|
||||
|
||||
const requestSort = (key: string) => {
|
||||
let direction: 'ascending' | 'descending' = 'ascending';
|
||||
if (sortConfig.key === key && sortConfig.direction === 'ascending') {
|
||||
direction = 'descending';
|
||||
} else if (sortConfig.key === key && sortConfig.direction === 'descending') {
|
||||
direction = 'ascending';
|
||||
} else {
|
||||
if (sortConfig && sortConfig.key === key && sortConfig.direction === 'ascending') {
|
||||
direction = 'descending';
|
||||
}
|
||||
setSortConfig({ key, direction });
|
||||
};
|
||||
|
||||
interface SortConfig {
|
||||
key: keyof DataModel | null;
|
||||
direction: 'ascending' | 'descending';
|
||||
}
|
||||
|
||||
const formatDate = (dateString: string): string => {
|
||||
const date = new Date(dateString);
|
||||
const year = date.getFullYear();
|
||||
@ -109,86 +108,15 @@ const DataFetcher: React.FC = () => {
|
||||
return `${day}.${month}.${year} ${hours}:${minutes} ${timezoneOffset} GMT`;
|
||||
};
|
||||
|
||||
const handleItemsPerPageChange = (event: React.ChangeEvent<HTMLSelectElement>) => {
|
||||
setItemsPerPage(Number(event.target.value));
|
||||
setCurrentPage(1);
|
||||
};
|
||||
|
||||
const paginatedData = sortedData.slice((currentPage - 1) * itemsPerPage, currentPage * itemsPerPage);
|
||||
|
||||
|
||||
if (loading) return <p>Loading...</p>;
|
||||
if (error) return <p>Error: {error}</p>;
|
||||
|
||||
var installingCounts: number = 0;
|
||||
var failedCounts: number = 0;
|
||||
var doneCounts: number = 0
|
||||
var unknownCounts: number = 0;
|
||||
data.forEach((item) => {
|
||||
if (item.status === "installing") {
|
||||
installingCounts += 1;
|
||||
} else if (item.status === "failed") {
|
||||
failedCounts += 1;
|
||||
}
|
||||
else if (item.status === "done") {
|
||||
doneCounts += 1;
|
||||
}
|
||||
else {
|
||||
unknownCounts += 1;
|
||||
}
|
||||
});
|
||||
|
||||
return (
|
||||
<div className="p-6 mt-20">
|
||||
<h1 className="text-2xl font-bold mb-4 text-center">Created LXCs</h1>
|
||||
<div className="mb-4 flex space-x-4">
|
||||
<div>
|
||||
<input
|
||||
type="text"
|
||||
placeholder="Search..."
|
||||
value={searchQuery}
|
||||
onChange={e => setSearchQuery(e.target.value)}
|
||||
className="p-2 border"
|
||||
/>
|
||||
<label className="text-sm text-gray-600 mt-1 block">Search by keyword</label>
|
||||
</div>
|
||||
<div>
|
||||
<DatePicker
|
||||
selected={startDate}
|
||||
onChange={date => setStartDate(date)}
|
||||
selectsStart
|
||||
startDate={startDate}
|
||||
endDate={endDate}
|
||||
placeholderText="Start date"
|
||||
className="p-2 border"
|
||||
/>
|
||||
<label className="text-sm text-gray-600 mt-1 block">Set a start date</label>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<DatePicker
|
||||
selected={endDate}
|
||||
onChange={date => setEndDate(date)}
|
||||
selectsEnd
|
||||
startDate={startDate}
|
||||
endDate={endDate}
|
||||
placeholderText="End date"
|
||||
className="p-2 border"
|
||||
/>
|
||||
<label className="text-sm text-gray-600 mt-1 block">Set a end date</label>
|
||||
</div>
|
||||
</div>
|
||||
<ApplicationChart data={filteredData} />
|
||||
<ApplicationChart data={summary} />
|
||||
<p className="text-lg font-bold mt-4"> </p>
|
||||
<div className="mb-4 flex justify-between items-center">
|
||||
<p className="text-lg font-bold">{filteredData.length} results found</p>
|
||||
<p className="text-lg font">Status Legend: 🔄 installing {installingCounts} | ✔️ completetd {doneCounts} | ❌ failed {failedCounts} | ❓ unknown {unknownCounts}</p>
|
||||
<select value={itemsPerPage} onChange={handleItemsPerPageChange} className="p-2 border">
|
||||
<option value={25}>25</option>
|
||||
<option value={50}>50</option>
|
||||
<option value={100}>100</option>
|
||||
<option value={200}>200</option>
|
||||
</select>
|
||||
</div>
|
||||
<p className="text-lg font-bold">{summary?.total_entries} results found</p>
|
||||
<p className="text-lg font">Status Legend: 🔄 installing {summary?.status_count["installing"] ?? 0} | ✔️ completed {summary?.status_count["done"] ?? 0} | ❌ failed {summary?.status_count["failed"] ?? 0} | ❓ unknown</p>
|
||||
</div>
|
||||
<div className="overflow-x-auto">
|
||||
<div className="overflow-y-auto lg:overflow-y-visible">
|
||||
<table className="min-w-full table-auto border-collapse">
|
||||
@ -209,7 +137,7 @@ const DataFetcher: React.FC = () => {
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{paginatedData.map((item, index) => (
|
||||
{sortedData.map((item, index) => (
|
||||
<tr key={index}>
|
||||
<td className="px-4 py-2 border-b">
|
||||
{item.status === "done" ? (
|
||||
@ -237,20 +165,7 @@ const DataFetcher: React.FC = () => {
|
||||
<td className="px-4 py-2 border-b">{item.ram_size}</td>
|
||||
<td className="px-4 py-2 border-b">{item.method}</td>
|
||||
<td className="px-4 py-2 border-b">{item.pve_version}</td>
|
||||
<td className="px-4 py-2 border-b">
|
||||
{item.error && item.error !== "none" ? (
|
||||
showErrorRow === index ? (
|
||||
<>
|
||||
{item.error}
|
||||
<button onClick={() => setShowErrorRow(null)}>{item.error}</button>
|
||||
</>
|
||||
) : (
|
||||
<button onClick={() => setShowErrorRow(index)}>Click to show error</button>
|
||||
)
|
||||
) : (
|
||||
"none"
|
||||
)}
|
||||
</td>
|
||||
<td className="px-4 py-2 border-b">{item.error}</td>
|
||||
<td className="px-4 py-2 border-b">{formatDate(item.created_at)}</td>
|
||||
</tr>
|
||||
))}
|
||||
@ -259,26 +174,25 @@ const DataFetcher: React.FC = () => {
|
||||
</div>
|
||||
</div>
|
||||
<div className="mt-4 flex justify-between items-center">
|
||||
<button
|
||||
onClick={() => setCurrentPage(prev => Math.max(prev - 1, 1))}
|
||||
disabled={currentPage === 1}
|
||||
className="p-2 border"
|
||||
>
|
||||
Previous
|
||||
</button>
|
||||
<button onClick={() => setCurrentPage(prev => Math.max(prev - 1, 1))} disabled={currentPage === 1} className="p-2 border">Previous</button>
|
||||
<span>Page {currentPage}</span>
|
||||
<button
|
||||
onClick={() => setCurrentPage(prev => (prev * itemsPerPage < sortedData.length ? prev + 1 : prev))}
|
||||
disabled={currentPage * itemsPerPage >= sortedData.length}
|
||||
<button onClick={() => setCurrentPage(prev => prev + 1)} className="p-2 border">Next</button>
|
||||
<select
|
||||
value={itemsPerPage}
|
||||
onChange={(e) => setItemsPerPage(Number(e.target.value))}
|
||||
className="p-2 border"
|
||||
>
|
||||
Next
|
||||
</button>
|
||||
<option value={10}>10</option>
|
||||
<option value={20}>20</option>
|
||||
<option value={50}>50</option>
|
||||
<option value={100}>100</option>
|
||||
<option value={250}>250</option>
|
||||
<option value={500}>500</option>
|
||||
<option value={5000}>5000</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
|
||||
export default DataFetcher;
|
||||
|
@ -111,7 +111,7 @@ export default function Page() {
|
||||
of Proxmox Virtual Environment (VE).
|
||||
</p>
|
||||
<p>
|
||||
With 200+ scripts to help you manage your{" "}
|
||||
With 300+ scripts to help you manage your{" "}
|
||||
<b>Proxmox VE environment</b>. Whether you're a seasoned
|
||||
user or a newcomer, we've got you covered.
|
||||
</p>
|
||||
|
@ -25,12 +25,16 @@ import { Chart as ChartJS, ArcElement, Tooltip as ChartTooltip, Legend } from "c
|
||||
import ChartDataLabels from "chartjs-plugin-datalabels";
|
||||
import { BarChart3, PieChart } from "lucide-react";
|
||||
import React, { useState } from "react";
|
||||
import { Pie } from "react-chartjs-2";
|
||||
import { Pie, Bar } from "react-chartjs-2";
|
||||
|
||||
ChartJS.register(ArcElement, ChartTooltip, Legend, ChartDataLabels);
|
||||
|
||||
interface SummaryData {
|
||||
nsapp_count: Record<string, number>;
|
||||
}
|
||||
|
||||
interface ApplicationChartProps {
|
||||
data: { nsapp: string }[];
|
||||
data: SummaryData | null;
|
||||
}
|
||||
|
||||
const ITEMS_PER_PAGE = 20;
|
||||
@ -57,13 +61,9 @@ export default function ApplicationChart({ data }: ApplicationChartProps) {
|
||||
const [chartStartIndex, setChartStartIndex] = useState(0);
|
||||
const [tableLimit, setTableLimit] = useState(ITEMS_PER_PAGE);
|
||||
|
||||
// Calculate application counts
|
||||
const appCounts = data.reduce((acc, item) => {
|
||||
acc[item.nsapp] = (acc[item.nsapp] || 0) + 1;
|
||||
return acc;
|
||||
}, {} as Record<string, number>);
|
||||
if (!data) return null;
|
||||
|
||||
const sortedApps = Object.entries(appCounts)
|
||||
const sortedApps = Object.entries(data.nsapp_count)
|
||||
.sort(([, a], [, b]) => b - a);
|
||||
|
||||
const chartApps = sortedApps.slice(
|
||||
|
@ -37,10 +37,6 @@ export default function CodeCopyButton({
|
||||
);
|
||||
}, 500);
|
||||
}
|
||||
|
||||
// toast.success(`copied ${type} to clipboard`, {
|
||||
// icon: <ClipboardCheck className="h-4 w-4" />,
|
||||
// });
|
||||
};
|
||||
|
||||
return (
|
||||
@ -49,17 +45,17 @@ export default function CodeCopyButton({
|
||||
<div className="overflow-x-auto whitespace-pre-wrap text-nowrap break-all pr-4 text-sm">
|
||||
{!isMobile && children ? children : "Copy install command"}
|
||||
</div>
|
||||
<div
|
||||
className={cn(" right-0 cursor-pointer bg-muted px-3 py-4")}
|
||||
<button
|
||||
onClick={() => handleCopy("install command", children)}
|
||||
className={cn("bg-muted px-3 py-4")}
|
||||
title="Copy"
|
||||
>
|
||||
{hasCopied ? (
|
||||
<CheckIcon className="h-4 w-4" />
|
||||
) : (
|
||||
<ClipboardIcon className="h-4 w-4" />
|
||||
)}
|
||||
<span className="sr-only">Copy</span>
|
||||
</div>
|
||||
</button>
|
||||
</Card>
|
||||
</div>
|
||||
);
|
||||
|
86
install/bytestash-install.sh
Normal file
86
install/bytestash-install.sh
Normal file
@ -0,0 +1,86 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: Slaviša Arežina (tremor021)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/jordan-dalby/ByteStash
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt-get install -y \
|
||||
sudo \
|
||||
curl \
|
||||
mc \
|
||||
gnupg
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
msg_info "Setting up Node.js Repository"
|
||||
mkdir -p /etc/apt/keyrings
|
||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
|
||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
|
||||
msg_ok "Set up Node.js Repository"
|
||||
|
||||
msg_info "Installing Node.js"
|
||||
$STD apt-get update
|
||||
$STD apt-get install -y nodejs
|
||||
msg_ok "Installed Node.js"
|
||||
|
||||
msg_info "Installing ByteStash"
|
||||
temp_file=$(mktemp)
|
||||
RELEASE=$(curl -s https://api.github.com/repos/jordan-dalby/ByteStash/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
||||
wget -q "https://github.com/jordan-dalby/ByteStash/archive/refs/tags/v${RELEASE}.tar.gz" -O $temp_file
|
||||
tar zxf $temp_file
|
||||
mv ByteStash-${RELEASE} /opt/bytestash
|
||||
cd /opt/bytestash/server
|
||||
$STD npm install
|
||||
cd /opt/bytestash/client
|
||||
$STD npm install
|
||||
echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt"
|
||||
msg_ok "Installed ByteStash"
|
||||
|
||||
msg_info "Creating Service"
|
||||
cat <<EOF >/etc/systemd/system/bytestash-backend.service
|
||||
[Unit]
|
||||
Description=ByteStash Backend Service
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
WorkingDirectory=/opt/bytestash/server
|
||||
ExecStart=/usr/bin/node src/app.js
|
||||
Restart=always
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
cat <<EOF >/etc/systemd/system/bytestash-frontend.service
|
||||
[Unit]
|
||||
Description=ByteStash Frontend Service
|
||||
After=network.target bytestash-backend.service
|
||||
|
||||
[Service]
|
||||
WorkingDirectory=/opt/bytestash/client
|
||||
ExecStart=/usr/bin/npx vite --host
|
||||
Restart=always
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now bytestash-backend
|
||||
systemctl enable -q --now bytestash-frontend
|
||||
msg_ok "Created Service"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
|
||||
msg_info "Cleaning up"
|
||||
rm -f $temp_file
|
||||
$STD apt-get -y autoremove
|
||||
$STD apt-get -y autoclean
|
||||
msg_ok "Cleaned"
|
@ -92,6 +92,11 @@ set +a
|
||||
export DB_DIALECT='sqlite'
|
||||
export AUTH_SECRET=$(openssl rand -base64 32)
|
||||
node /opt/homarr_db/migrations/$DB_DIALECT/migrate.cjs /opt/homarr_db/migrations/$DB_DIALECT
|
||||
for dir in $(find /opt/homarr_db/migrations/migrations -mindepth 1 -maxdepth 1 -type d); do
|
||||
dirname=$(basename "$dir")
|
||||
mkdir -p "/opt/homarr_db/migrations/$dirname"
|
||||
cp -r "$dir"/* "/opt/homarr_db/migrations/$dirname/" 2>/dev/null || true
|
||||
done
|
||||
export HOSTNAME=$(ip route get 1.1.1.1 | grep -oP 'src \K[^ ]+')
|
||||
envsubst '${HOSTNAME}' < /etc/nginx/templates/nginx.conf > /etc/nginx/nginx.conf
|
||||
nginx -g 'daemon off;' &
|
||||
|
@ -1,11 +1,11 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2025 tteck
|
||||
# Author: tteck (tteckster)
|
||||
# License: MIT
|
||||
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: tteck (tteckster) | Co-Author: Slaviša Arežina (tremor021)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/keycloak/keycloak
|
||||
|
||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
@ -13,40 +13,51 @@ setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing Dependencies (Patience)"
|
||||
$STD apt-get install -y curl
|
||||
$STD apt-get install -y sudo
|
||||
$STD apt-get install -y mc
|
||||
$STD apt-get install -y ca-certificates-java
|
||||
$STD apt-get install -y openjdk-17-jre-headless
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt-get install -y \
|
||||
curl \
|
||||
sudo \
|
||||
mc \
|
||||
gnupg
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
msg_info "Installing OpenJDK"
|
||||
wget -qO- https://packages.adoptium.net/artifactory/api/gpg/key/public | gpg --dearmor >/etc/apt/trusted.gpg.d/adoptium.gpg
|
||||
echo 'deb [arch=amd64 signed-by=/etc/apt/trusted.gpg.d/adoptium.gpg] https://packages.adoptium.net/artifactory/deb bookworm main' >/etc/apt/sources.list.d/adoptium.list
|
||||
$STD apt-get update
|
||||
$STD apt-get install -y temurin-21-jre
|
||||
msg_ok "Installed OpenJDK"
|
||||
|
||||
msg_info "Installing Keycloak"
|
||||
temp_file=$(mktemp)
|
||||
RELEASE=$(curl -s https://api.github.com/repos/keycloak/keycloak/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
|
||||
msg_info "Installing Keycloak v$RELEASE"
|
||||
cd /opt
|
||||
wget -q https://github.com/keycloak/keycloak/releases/download/$RELEASE/keycloak-$RELEASE.tar.gz
|
||||
$STD tar -xvf keycloak-$RELEASE.tar.gz
|
||||
mv keycloak-$RELEASE keycloak
|
||||
wget -q https://github.com/keycloak/keycloak/releases/download/$RELEASE/keycloak-$RELEASE.tar.gz -O $temp_file
|
||||
tar xzf $temp_file
|
||||
mv keycloak-$RELEASE /opt/keycloak
|
||||
msg_ok "Installed Keycloak"
|
||||
|
||||
msg_info "Creating Service"
|
||||
service_path="/etc/systemd/system/keycloak.service"
|
||||
echo "[Unit]
|
||||
Description=Keycloak
|
||||
After=network-online.target
|
||||
cat <<EOF >/etc/systemd/system/keycloak.service
|
||||
[Unit]
|
||||
Description=Keycloak Service
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
User=root
|
||||
WorkingDirectory=/opt/keycloak
|
||||
ExecStart=/opt/keycloak/bin/kc.sh start-dev
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target" >$service_path
|
||||
$STD systemctl enable --now keycloak.service
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now keycloak
|
||||
msg_ok "Created Service"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
|
||||
msg_info "Cleaning up"
|
||||
rm -f $temp_file
|
||||
$STD apt-get -y autoremove
|
||||
$STD apt-get -y autoclean
|
||||
msg_ok "Cleaned"
|
||||
|
@ -74,8 +74,9 @@ $STD bin/console kimai:install -n
|
||||
chown -R :www-data /opt/*
|
||||
chmod -R g+r /opt/*
|
||||
chmod -R g+rw /opt/*
|
||||
sudo chown -R www-data:www-data /opt/*
|
||||
sudo chmod -R 755 /opt/*
|
||||
chown -R www-data:www-data /opt/*
|
||||
chmod -R 755 /opt/*
|
||||
chmod -R 777 /opt/kimai/var/
|
||||
$STD expect <<EOF
|
||||
set timeout -1
|
||||
log_user 0
|
||||
@ -88,6 +89,19 @@ send "helper-scripts.com\r"
|
||||
expect eof
|
||||
EOF
|
||||
$STD composer update --no-interaction
|
||||
cat <<EOF >/opt/kimai/config/packages/local.yaml
|
||||
kimai:
|
||||
timesheet:
|
||||
rounding:
|
||||
default:
|
||||
begin: 15
|
||||
end: 15
|
||||
|
||||
admin_lte:
|
||||
options:
|
||||
default_avatar: build/apple-touch-icon.png
|
||||
EOF
|
||||
|
||||
echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt"
|
||||
msg_ok "Installed Kimai"
|
||||
|
||||
|
106
install/outline-install.sh
Normal file
106
install/outline-install.sh
Normal file
@ -0,0 +1,106 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: Slaviša Arežina (tremor021)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/outline/outline
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt-get install -y \
|
||||
curl \
|
||||
sudo \
|
||||
mc \
|
||||
gnupg \
|
||||
mkcert \
|
||||
git \
|
||||
redis
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
msg_info "Setting up Node.js Repository"
|
||||
mkdir -p /etc/apt/keyrings
|
||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
|
||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
|
||||
msg_ok "Set up Node.js Repository"
|
||||
|
||||
msg_info "Setting up PostgreSQL Repository"
|
||||
curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg
|
||||
echo "deb https://apt.postgresql.org/pub/repos/apt bookworm-pgdg main" >/etc/apt/sources.list.d/pgdg.list
|
||||
msg_ok "Set up PostgreSQL Repository"
|
||||
|
||||
msg_info "Installing Node.js"
|
||||
$STD apt-get update
|
||||
$STD apt-get install -y nodejs
|
||||
$STD npm install -g yarn
|
||||
msg_ok "Installed Node.js"
|
||||
|
||||
msg_info "Install/Set up PostgreSQL Database"
|
||||
$STD apt-get install -y postgresql-16
|
||||
DB_NAME="outline"
|
||||
DB_USER="outline"
|
||||
DB_PASS="$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13)"
|
||||
SECRET_KEY="$(openssl rand -hex 32)"
|
||||
$STD sudo -u postgres psql -c "CREATE ROLE $DB_USER WITH LOGIN PASSWORD '$DB_PASS';"
|
||||
$STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME WITH OWNER $DB_USER ENCODING 'UTF8' TEMPLATE template0;"
|
||||
$STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET client_encoding TO 'utf8';"
|
||||
$STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET default_transaction_isolation TO 'read committed';"
|
||||
$STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET timezone TO 'UTC';"
|
||||
msg_ok "Set up PostgreSQL"
|
||||
|
||||
msg_info "Setup Outline (Patience)"
|
||||
temp_file=$(mktemp)
|
||||
LOCAL_IP="$(hostname -I | awk '{print $1}')"
|
||||
RELEASE=$(curl -s https://api.github.com/repos/outline/outline/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
||||
wget -q "https://github.com/outline/outline/archive/refs/tags/v${RELEASE}.tar.gz" -O $temp_file
|
||||
tar zxf $temp_file
|
||||
mv outline-${RELEASE} /opt/outline
|
||||
cd /opt/outline
|
||||
cp .env.sample .env
|
||||
sed -i 's/NODE_ENV=production/NODE_ENV=development/g' /opt/outline/.env
|
||||
sed -i "s/generate_a_new_key/${SECRET_KEY}/g" /opt/outline/.env
|
||||
sed -i "s/user:pass@postgres/${DB_USER}:${DB_PASS}@localhost/g" /opt/outline/.env
|
||||
sed -i 's/redis:6379/localhost:6379/g' /opt/outline/.env
|
||||
sed -i "32s#URL=#URL=http://${LOCAL_IP}#g" /opt/outline/.env
|
||||
sed -i 's/FORCE_HTTPS=true/FORCE_HTTPS=false/g' /opt/outline/.env
|
||||
$STD yarn install --frozen-lockfile
|
||||
export NODE_OPTIONS="--max-old-space-size=3584"
|
||||
$STD yarn build
|
||||
sed -i 's/NODE_ENV=development/NODE_ENV=production/g' /opt/outline/.env
|
||||
echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt"
|
||||
msg_ok "Setup Outline"
|
||||
|
||||
msg_info "Creating Service"
|
||||
cat <<EOF >/etc/systemd/system/outline.service
|
||||
[Unit]
|
||||
Description=Outline Service
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=root
|
||||
WorkingDirectory=/opt/outline
|
||||
ExecStart=/usr/bin/node ./build/server/index.js
|
||||
Restart=always
|
||||
EnvironmentFile=/opt/outline/.env
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now outline
|
||||
msg_ok "Created Service"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
|
||||
msg_info "Cleaning up"
|
||||
rm -rf $temp_file
|
||||
$STD apt-get -y autoremove
|
||||
$STD apt-get -y autoclean
|
||||
msg_ok "Cleaned"
|
104
install/pelican-panel-install.sh
Normal file
104
install/pelican-panel-install.sh
Normal file
@ -0,0 +1,104 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: bvdberg01
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
|
||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt-get install -y \
|
||||
curl \
|
||||
sudo \
|
||||
mc \
|
||||
lsb-release \
|
||||
mariadb-server \
|
||||
mariadb-client \
|
||||
apache2 \
|
||||
composer
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
msg_info "Adding PHP8.3 Repository"
|
||||
$STD curl -sSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb
|
||||
$STD dpkg -i /tmp/debsuryorg-archive-keyring.deb
|
||||
$STD sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
|
||||
$STD apt-get update
|
||||
msg_ok "Added PHP8.3 Repository"
|
||||
|
||||
msg_info "Installing PHP"
|
||||
$STD apt-get remove -y php8.2*
|
||||
$STD apt-get install -y \
|
||||
php8.3 \
|
||||
php8.3-{gd,mysql,mbstring,bcmath,xml,curl,zip,intl,sqlite3,fpm} \
|
||||
libapache2-mod-php8.3
|
||||
msg_info "Installed PHP"
|
||||
|
||||
msg_info "Setting up MariaDB"
|
||||
DB_NAME=panel
|
||||
DB_USER=pelican
|
||||
DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
|
||||
$STD mysql -u root -e "CREATE DATABASE $DB_NAME;"
|
||||
$STD mysql -u root -e "CREATE USER '$DB_USER'@'localhost' IDENTIFIED WITH mysql_native_password AS PASSWORD('$DB_PASS');"
|
||||
$STD mysql -u root -e "GRANT ALL ON $DB_NAME.* TO '$DB_USER'@'localhost'; FLUSH PRIVILEGES;"
|
||||
{
|
||||
echo "Pelican Panel-Credentials"
|
||||
echo "Pelican Panel Database User: $DB_USER"
|
||||
echo "Pelican Panel Database Password: $DB_PASS"
|
||||
echo "Pelican Panel Database Name: $DB_NAME"
|
||||
} >> ~/pelican-panel.creds
|
||||
msg_ok "Set up MariaDB"
|
||||
|
||||
msg_info "Installing Pelican Panel"
|
||||
RELEASE=$(curl -s https://api.github.com/repos/pelican-dev/panel/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
||||
mkdir /opt/pelican-panel
|
||||
cd /opt/pelican-panel
|
||||
wget -q "https://github.com/pelican-dev/panel/releases/download/v${RELEASE}/panel.tar.gz"
|
||||
tar -xzf "panel.tar.gz"
|
||||
$STD composer install --no-dev --optimize-autoloader --no-interaction
|
||||
$STD php artisan p:environment:setup
|
||||
$STD php artisan p:environment:queue-service --no-interaction
|
||||
echo "* * * * * php /opt/pelican-panel/artisan schedule:run >> /dev/null 2>&1" | crontab -u www-data -
|
||||
chown -R www-data:www-data /opt/pelican-panel
|
||||
chmod -R 755 /opt/pelican-panel/storage /opt/pelican-panel/bootstrap/cache/
|
||||
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
|
||||
msg_ok "Installed Pelican Panel"
|
||||
|
||||
msg_info "Creating Service"
|
||||
cat <<EOF >/etc/apache2/sites-available/pelican.conf
|
||||
<VirtualHost *:80>
|
||||
ServerName pelican
|
||||
DocumentRoot /opt/pelican-panel/public
|
||||
AllowEncodedSlashes On
|
||||
php_value upload_max_filesize 100M
|
||||
php_value post_max_size 100M
|
||||
|
||||
<Directory /opt/pelican-panel/public>
|
||||
Options Indexes FollowSymLinks
|
||||
AllowOverride All
|
||||
Require all granted
|
||||
</Directory>
|
||||
|
||||
ErrorLog /var/log/apache2/pelican_error.log
|
||||
CustomLog /var/log/apache2/pelican_access.log combined
|
||||
</VirtualHost>
|
||||
EOF
|
||||
$STD a2ensite pelican
|
||||
$STD a2enmod rewrite
|
||||
$STD a2dissite 000-default.conf
|
||||
$STD systemctl reload apache2
|
||||
msg_ok "Created Service"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
|
||||
msg_info "Cleaning up"
|
||||
rm -rf "/opt/pelican-panel/panel.tar.gz"
|
||||
$STD apt-get -y autoremove
|
||||
$STD apt-get -y autoclean
|
||||
msg_ok "Cleaned"
|
69
install/pelican-wings-install.sh
Normal file
69
install/pelican-wings-install.sh
Normal file
@ -0,0 +1,69 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: bvdberg01
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
|
||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt-get install -y \
|
||||
curl \
|
||||
sudo \
|
||||
mc
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
msg_info "Installing Docker"
|
||||
DOCKER_CONFIG_PATH='/etc/docker/daemon.json'
|
||||
mkdir -p $(dirname $DOCKER_CONFIG_PATH)
|
||||
echo -e '{\n "log-driver": "journald"\n}' >/etc/docker/daemon.json
|
||||
$STD sh <(curl -sSL https://get.docker.com)
|
||||
systemctl enable -q --now docker
|
||||
msg_ok "Installed Docker"
|
||||
|
||||
msg_info "Installing Pelican Wings"
|
||||
RELEASE=$(curl -s https://api.github.com/repos/pelican-dev/wings/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
|
||||
wget -q -O /usr/local/bin/wings "https://github.com/pelican-dev/wings/releases/download/v${RELEASE}/wings_linux_amd64"
|
||||
chmod u+x /usr/local/bin/wings
|
||||
mkdir -p /etc/pelican /var/run/wings
|
||||
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
|
||||
msg_ok "Installed Pelican Wings"
|
||||
|
||||
msg_info "Creating Service"
|
||||
cat <<EOF >/etc/systemd/system/wings.service
|
||||
[Unit]
|
||||
Description=Wings Daemon
|
||||
After=docker.service
|
||||
Requires=docker.service
|
||||
PartOf=docker.service
|
||||
|
||||
[Service]
|
||||
User=root
|
||||
WorkingDirectory=/etc/pelican
|
||||
LimitNOFILE=4096
|
||||
PIDFile=/var/run/wings/daemon.pid
|
||||
ExecStart=/usr/local/bin/wings
|
||||
Restart=on-failure
|
||||
StartLimitInterval=180
|
||||
StartLimitBurst=30
|
||||
RestartSec=5s
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now wings
|
||||
msg_ok "Created Service"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
|
||||
msg_info "Cleaning up"
|
||||
$STD apt-get -y autoremove
|
||||
$STD apt-get -y autoclean
|
||||
msg_ok "Cleaned"
|
@ -141,7 +141,7 @@ server=8.8.8.8
|
||||
server=8.8.4.4
|
||||
EOF
|
||||
|
||||
sed -i -E "s|^(upstreams =).*|\1 [\"127.0.0.1#5335\", \"8.8.4.4\"]|" /etc/pihole/pihole.toml
|
||||
sed -i -E '/^\s*upstreams\s*=\s*\[/,/^\s*\]/c\ upstreams = [\n "127.0.0.1#5335",\n "8.8.4.4"\n ]' /etc/pihole/pihole.toml
|
||||
systemctl enable -q --now unbound
|
||||
systemctl restart pihole-FTL.service
|
||||
msg_ok "Installed Unbound"
|
||||
|
@ -43,7 +43,6 @@ motd_ssh
|
||||
customize
|
||||
|
||||
msg_info "Cleaning up"
|
||||
rm -rf $RELEASE
|
||||
$STD apt-get -y autoremove
|
||||
$STD apt-get -y autoclean
|
||||
msg_ok "Cleaned"
|
||||
|
@ -61,7 +61,7 @@ EOF
|
||||
|
||||
touch /var/log/unbound.log
|
||||
chown unbound:unbound /var/log/unbound.log
|
||||
|
||||
sleep 5
|
||||
systemctl restart unbound
|
||||
msg_ok "Installed Unbound"
|
||||
|
||||
|
160
install/web-check-install.sh
Normal file
160
install/web-check-install.sh
Normal file
@ -0,0 +1,160 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2025 community-scripts ORG
|
||||
# Author: CrazyWolf13
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/lissy93/web-check
|
||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
|
||||
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
$STD apt-get -y install --no-install-recommends \
|
||||
curl \
|
||||
sudo \
|
||||
mc \
|
||||
git \
|
||||
gnupg \
|
||||
traceroute \
|
||||
make \
|
||||
g++ \
|
||||
traceroute \
|
||||
xvfb \
|
||||
dbus \
|
||||
xorg \
|
||||
xvfb \
|
||||
gtk2-engines-pixbuf \
|
||||
dbus-x11 \
|
||||
xfonts-base \
|
||||
xfonts-100dpi \
|
||||
xfonts-75dpi \
|
||||
xfonts-scalable \
|
||||
imagemagick \
|
||||
x11-apps
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
msg_info "Setting up Node.js Repository"
|
||||
mkdir -p /etc/apt/keyrings
|
||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
|
||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
|
||||
msg_ok "Set up Node.js Repository"
|
||||
|
||||
msg_info "Setup Python3"
|
||||
$STD apt-get install -y python3
|
||||
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
|
||||
msg_ok "Setup Python3"
|
||||
|
||||
msg_info "Installing Chromium"
|
||||
curl -fsSL https://dl-ssl.google.com/linux/linux_signing_key.pub | gpg --dearmor -o /etc/apt/trusted.gpg.d/google-archive.gpg
|
||||
echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >/etc/apt/sources.list.d/google.list
|
||||
$STD apt-get update
|
||||
$STD apt-get -y install \
|
||||
chromium \
|
||||
libxss1 \
|
||||
lsb-release
|
||||
msg_ok "Installed Chromium"
|
||||
|
||||
msg_info "Installing Node.js"
|
||||
$STD apt-get update
|
||||
$STD apt-get install -y nodejs
|
||||
$STD npm install -g yarn
|
||||
msg_ok "Installed Node.js"
|
||||
|
||||
msg_info "Setting up Chromium"
|
||||
/usr/bin/chromium --no-sandbox --version > /etc/chromium-version
|
||||
chmod 755 /usr/bin/chromium
|
||||
msg_ok "Setup Chromium"
|
||||
|
||||
msg_info "Installing Web-Check (Patience)"
|
||||
temp_file=$(mktemp)
|
||||
RELEASE="patch-1"
|
||||
wget -q "https://github.com/CrazyWolf13/web-check/archive/refs/heads/${RELEASE}.tar.gz" -O $temp_file
|
||||
tar xzf $temp_file
|
||||
mv web-check-${RELEASE} /opt/web-check
|
||||
cd /opt/web-check
|
||||
cat <<'EOF' > /opt/web-check/.env
|
||||
CHROME_PATH=/usr/bin/chromium
|
||||
PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium
|
||||
HEADLESS=true
|
||||
GOOGLE_CLOUD_API_KEY=''
|
||||
REACT_APP_SHODAN_API_KEY=''
|
||||
REACT_APP_WHO_API_KEY=''
|
||||
SECURITY_TRAILS_API_KEY=''
|
||||
CLOUDMERSIVE_API_KEY=''
|
||||
TRANCO_USERNAME=''
|
||||
TRANCO_API_KEY=''
|
||||
URL_SCAN_API_KEY=''
|
||||
BUILT_WITH_API_KEY=''
|
||||
TORRENT_IP_API_KEY=''
|
||||
PORT='3000'
|
||||
DISABLE_GUI='false'
|
||||
API_TIMEOUT_LIMIT='10000'
|
||||
API_CORS_ORIGIN='*'
|
||||
API_ENABLE_RATE_LIMIT='false'
|
||||
REACT_APP_API_ENDPOINT='/api'
|
||||
ENABLE_ANALYTICS='false'
|
||||
EOF
|
||||
$STD yarn install --frozen-lockfile --network-timeout 100000
|
||||
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
|
||||
msg_ok "Installed Web-Check"
|
||||
|
||||
msg_info "Building Web-Check"
|
||||
$STD yarn build --production
|
||||
msg_ok "Built Web-Check"
|
||||
|
||||
msg_info "Creating Service"
|
||||
cat <<'EOF' > /opt/run_web-check.sh
|
||||
#!/bin/bash
|
||||
SCREEN_RESOLUTION="1280x1024x24"
|
||||
if ! systemctl is-active --quiet dbus; then
|
||||
echo "Warning: dbus service is not running. Some features may not work properly."
|
||||
fi
|
||||
[[ -z "${DISPLAY}" ]] && export DISPLAY=":99"
|
||||
Xvfb "${DISPLAY}" -screen 0 "${SCREEN_RESOLUTION}" &
|
||||
XVFB_PID=$!
|
||||
sleep 2
|
||||
cd /opt/web-check
|
||||
exec yarn start
|
||||
EOF
|
||||
chmod +x /opt/run_web-check.sh
|
||||
cat <<'EOF' > /etc/systemd/system/web-check.service
|
||||
[Unit]
|
||||
Description=Web Check Service
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=root
|
||||
Group=root
|
||||
WorkingDirectory=/opt/web-check
|
||||
EnvironmentFile=/opt/web-check/.env
|
||||
ExecStartPre=/bin/bash -c "service dbus start || true"
|
||||
ExecStartPre=/bin/bash -c "if ! pgrep -f 'Xvfb.*:99' > /dev/null; then Xvfb :99 -screen 0 1280x1024x24 & fi"
|
||||
ExecStart=/opt/run_web-check.sh
|
||||
Restart=on-failure
|
||||
Environment=DISPLAY=:99
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now web-check
|
||||
msg_ok "Created Service"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
|
||||
msg_info "Cleaning up"
|
||||
rm -rf $temp_file
|
||||
rm -rf /var/lib/apt/lists/* /app/node_modules/.cache
|
||||
$STD apt-get -y autoremove
|
||||
$STD apt-get -y autoclean
|
||||
msg_ok "Cleaned"
|
||||
|
||||
motd_ssh
|
||||
customize
|
@ -50,7 +50,7 @@ mv zigbee2mqtt-${RELEASE} /opt/zigbee2mqtt
|
||||
cd /opt/zigbee2mqtt/data
|
||||
mv configuration.example.yaml configuration.yaml
|
||||
cd /opt/zigbee2mqtt
|
||||
$STD pnpm install --frozen-lockfile
|
||||
$STD pnpm install --no-frozen-lockfile
|
||||
$STD pnpm build
|
||||
msg_ok "Installed Zigbee2MQTT"
|
||||
|
||||
|
@ -46,7 +46,6 @@ msg_info "Installing Zitadel"
|
||||
RELEASE=$(curl -si https://github.com/zitadel/zitadel/releases/latest | grep location: | cut -d '/' -f 8 | tr -d '\r')
|
||||
wget -qc https://github.com/zitadel/zitadel/releases/download/$RELEASE/zitadel-linux-amd64.tar.gz -O - | tar -xz
|
||||
mv zitadel-linux-amd64/zitadel /usr/local/bin
|
||||
echo "${RELEASE}" >"/opt/zitadel_version.txt"
|
||||
msg_ok "Installed Zitadel"
|
||||
|
||||
msg_info "Setting up Zitadel Environments"
|
||||
@ -126,7 +125,7 @@ zitadel start-from-init --masterkeyFile /opt/zitadel/.masterkey --config /opt/zi
|
||||
sleep 60
|
||||
kill $(lsof -i | awk '/zitadel/ {print $2}' | head -n1)
|
||||
useradd zitadel
|
||||
echo -e "$(zitadel -v | grep -oP 'v\d+\.\d+\.\d+')" > /opt/Zitadel_version.txt
|
||||
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
|
||||
msg_ok "Zitadel initialized"
|
||||
|
||||
msg_info "Set ExternalDomain to current IP and restart Zitadel"
|
||||
|
34
json/bytestash.json
Normal file
34
json/bytestash.json
Normal file
@ -0,0 +1,34 @@
|
||||
{
|
||||
"name": "ByteStash",
|
||||
"slug": "bytestash",
|
||||
"categories": [
|
||||
20
|
||||
],
|
||||
"date_created": "2025-02-27",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": 3000,
|
||||
"documentation": "https://github.com/jordan-dalby/ByteStash/wiki",
|
||||
"website": "https://github.com/jordan-dalby/ByteStash",
|
||||
"logo": "https://raw.githubusercontent.com/jordan-dalby/ByteStash/refs/heads/main/client/public/logo192.png",
|
||||
"description": "ByteStash is a self-hosted web application designed to store, organise, and manage your code snippets efficiently. With support for creating, editing, and filtering snippets, ByteStash helps you keep track of your code in one secure place.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/bytestash.sh",
|
||||
"resources": {
|
||||
"cpu": 1,
|
||||
"ram": 1024,
|
||||
"hdd": 4,
|
||||
"os": "debian",
|
||||
"version": "12"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": []
|
||||
}
|
@ -12,7 +12,7 @@
|
||||
"documentation": "https://go2docs.graylog.org/current/home.htm",
|
||||
"website": "https://graylog.org/",
|
||||
"logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/graylog.svg",
|
||||
"description": "Graylog is a free and open log management platform.",
|
||||
"description": "Graylog is an open-source log management and analysis platform that centralizes and processes log data from various sources, enabling real-time search, analysis, and alerting for IT infrastructure monitoring and troubleshooting.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
|
43
json/outline.json
Normal file
43
json/outline.json
Normal file
@ -0,0 +1,43 @@
|
||||
{
|
||||
"name": "Outline",
|
||||
"slug": "outline",
|
||||
"categories": [
|
||||
12
|
||||
],
|
||||
"date_created": "2025-02-26",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": 3000,
|
||||
"documentation": "https://docs.getoutline.com/s/hosting/",
|
||||
"website": "https://www.getoutline.com",
|
||||
"logo": "https://www.getoutline.com/images/logo.svg",
|
||||
"description": "The fastest knowledge base for growing teams. Beautiful, realtime collaborative, feature packed, and markdown compatible. It’s time to get your team’s knowledge organized.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/outline.sh",
|
||||
"resources": {
|
||||
"cpu": 2,
|
||||
"ram": 4096,
|
||||
"hdd": 8,
|
||||
"os": "debian",
|
||||
"version": "12"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": [
|
||||
{
|
||||
"text": "After installation finishes, application will do a database migration so web UI might be unavailable for a minute or two. Also you need to manually add authentication and/or enable HTTPS.",
|
||||
"type": "info"
|
||||
},
|
||||
{
|
||||
"text": "Configuration file is at: `/opt/outline/.env`. Modify to suit your environment.",
|
||||
"type": "info"
|
||||
}
|
||||
]
|
||||
}
|
43
json/pelican-panel.json
Normal file
43
json/pelican-panel.json
Normal file
@ -0,0 +1,43 @@
|
||||
{
|
||||
"name": "Pelican Panel",
|
||||
"slug": "pelican-panel",
|
||||
"categories": [
|
||||
24
|
||||
],
|
||||
"date_created": "2025-02-27",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": 80,
|
||||
"documentation": "https://pelican.dev/docs/panel/getting-started",
|
||||
"website": "https://pelican.dev/",
|
||||
"logo": "https://pelican.dev/img/logo.png",
|
||||
"description": "Pelican Panel is a web-based control panel for managing game and application servers. It provides an intuitive interface to start, stop, configure, and monitor servers easily. It works alongside Pelican Wings, a lightweight daemon that handles server deployments and resource management.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/pelican-panel.sh",
|
||||
"resources": {
|
||||
"cpu": 2,
|
||||
"ram": 1024,
|
||||
"hdd": 4,
|
||||
"os": "Debian",
|
||||
"version": "12"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": [
|
||||
{
|
||||
"text": "Database credentials: `cat ~/pelican-panel.creds`",
|
||||
"type": "info"
|
||||
},
|
||||
{
|
||||
"text": "Step 5 of the Panel installer can be skipped because it has already been set up by the script.",
|
||||
"type": "info"
|
||||
}
|
||||
]
|
||||
}
|
39
json/pelican-wings.json
Normal file
39
json/pelican-wings.json
Normal file
@ -0,0 +1,39 @@
|
||||
{
|
||||
"name": "Pelican Wings",
|
||||
"slug": "pelican-wings",
|
||||
"categories": [
|
||||
24
|
||||
],
|
||||
"date_created": "2025-02-27",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": null,
|
||||
"documentation": "https://pelican.dev/docs/wings/install",
|
||||
"website": "https://pelican.dev/",
|
||||
"logo": "https://pelican.dev/img/logo.png",
|
||||
"description": "Pelican Wings is Pelican's server control plane, built for the rapidly changing gaming industry and designed to be highly performant and secure. Wings provides an HTTP API allowing you to interface directly with running server instances, fetch server logs, generate backups, and control all aspects of the server lifecycle.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/pelican-wings.sh",
|
||||
"resources": {
|
||||
"cpu": 2,
|
||||
"ram": 4096,
|
||||
"hdd": 8,
|
||||
"os": "Debian",
|
||||
"version": "12"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": [
|
||||
{
|
||||
"text": "After installation, you need to use the Auto Deploy command generated by Pelican Panel and, after running the command, restart the Wings service with `systemctl restart wings.service`",
|
||||
"type": "info"
|
||||
}
|
||||
]
|
||||
}
|
@ -9,8 +9,8 @@
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": 80,
|
||||
"documentation": "https://stonith404.github.io/pocket-id/introduction",
|
||||
"website": "https://github.com/stonith404/pocket-id",
|
||||
"documentation": "https://pocket-id.org/docs/",
|
||||
"website": "https://github.com/pocket-id/pocket-id",
|
||||
"logo": "https://raw.githubusercontent.com/pocket-id/pocket-id/refs/heads/main/backend/resources/images/logoDark.svg",
|
||||
"description": "Pocket ID is a simple OIDC provider that allows users to authenticate with their passkeys to your services.",
|
||||
"install_methods": [
|
||||
|
34
json/web-check.json
Normal file
34
json/web-check.json
Normal file
@ -0,0 +1,34 @@
|
||||
{
|
||||
"name": "Web-Check",
|
||||
"slug": "web-check",
|
||||
"categories": [
|
||||
4
|
||||
],
|
||||
"date_created": "2025-02-27",
|
||||
"type": "ct",
|
||||
"updateable": false,
|
||||
"privileged": false,
|
||||
"interface_port": 3000,
|
||||
"documentation": "https://github.com/Lissy93/web-check/blob/master/.github/README.md",
|
||||
"website": "https://github.com/lissy93/web-check",
|
||||
"logo": "https://raw.githubusercontent.com/Lissy93/web-check/refs/heads/master/.github/web-check-logo.png",
|
||||
"description": "Get an insight into the inner-workings of a given website: uncover potential attack vectors, analyse server architecture, view security configurations, and learn what technologies a site is using.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/web-check.sh",
|
||||
"resources": {
|
||||
"cpu": 2,
|
||||
"ram": 2048,
|
||||
"hdd": 12,
|
||||
"os": "debian",
|
||||
"version": "12"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": []
|
||||
}
|
@ -30,5 +30,10 @@
|
||||
"username": "admin",
|
||||
"password": "adminadmin"
|
||||
},
|
||||
"notes": []
|
||||
}
|
||||
"notes": [
|
||||
{
|
||||
"text": "Enable proxy support by uncommenting this line in `/home/wger/src/settings.py` and pointing it to your URL: `# CSRF_TRUSTED_ORIGINS = ['http://127.0.0.1', 'https://my.domain.example.com']`, then restart the service `systemctl restart wger`.",
|
||||
"type": "info"
|
||||
}
|
||||
]
|
||||
}
|
@ -76,7 +76,7 @@ error_handler() {
|
||||
local command="$2"
|
||||
local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
|
||||
echo -e "\n$error_message"
|
||||
if [[ "$line_number" -eq 44 ]]; then
|
||||
if [[ "$line_number" -eq 50 ]]; then
|
||||
echo -e "The silent function has suppressed the error, run the script with verbose mode enabled, which will provide more detailed output.\n"
|
||||
post_update_to_api "failed" "No error message, script ran in silent mode"
|
||||
else
|
||||
|
Reference in New Issue
Block a user