Compare commits

..

7 Commits

Author SHA1 Message Date
Tobias
f96cfda176 Change APPLICATION_VERSION to var_appversion 2026-02-12 20:42:59 +01:00
Tobias
b4864de234 Remove APPLICATION_VERSION export 2026-02-12 20:42:09 +01:00
Tobias
277a909f4b fix: wrong commit 2026-02-10 10:48:09 +01:00
Tobias
4605fa4aec fix: wrong commit 2026-02-10 10:47:52 +01:00
Tobias
cb7c95ec42 fix wrong commit 2026-02-10 10:47:26 +01:00
CrazyWolf13
ca2f0706d9 add: overwriteable app version var 2026-02-10 10:44:21 +01:00
CrazyWolf13
7d81a301c4 refactor: homepage 2026-02-06 08:09:07 +01:00
13 changed files with 101 additions and 360 deletions

83
.github/workflows/lock-issue.yaml generated vendored
View File

@@ -18,6 +18,7 @@ jobs:
with: with:
script: | script: |
const daysBeforeLock = 3; const daysBeforeLock = 3;
const cutoffDate = new Date('2026-01-27T00:00:00Z');
const lockDate = new Date(); const lockDate = new Date();
lockDate.setDate(lockDate.getDate() - daysBeforeLock); lockDate.setDate(lockDate.getDate() - daysBeforeLock);
@@ -28,50 +29,48 @@ jobs:
/dependabot/i /dependabot/i
]; ];
// Search for closed, unlocked issues older than 3 days (paginated, oldest first) // Search for closed, unlocked issues older than 3 days
let page = 1; const issues = await github.rest.search.issuesAndPullRequests({
let totalLocked = 0; q: `repo:${context.repo.owner}/${context.repo.repo} is:closed is:unlocked updated:<${lockDate.toISOString().split('T')[0]}`,
per_page: 50
});
while (true) { console.log(`Found ${issues.data.items.length} issues/PRs to process`);
const issues = await github.rest.search.issuesAndPullRequests({
q: `repo:${context.repo.owner}/${context.repo.repo} is:closed is:unlocked updated:<${lockDate.toISOString().split('T')[0]}`, for (const item of issues.data.items) {
sort: 'updated', // Skip excluded items
order: 'asc', const shouldExclude = excludePatterns.some(pattern => pattern.test(item.title));
per_page: 100, if (shouldExclude) {
page: page console.log(`Skipped #${item.number}: "${item.title}" (matches exclude pattern)`);
}); continue;
if (issues.data.items.length === 0) break;
console.log(`Page ${page}: ${issues.data.items.length} items (total available: ${issues.data.total_count})`);
for (const item of issues.data.items) {
// Skip excluded items
const shouldExclude = excludePatterns.some(pattern => pattern.test(item.title));
if (shouldExclude) {
console.log(`Skipped #${item.number}: "${item.title}" (matches exclude pattern)`);
continue;
}
try {
// Lock the issue/PR silently
await github.rest.issues.lock({
...context.repo,
issue_number: item.number,
lock_reason: 'resolved'
});
totalLocked++;
console.log(`Locked #${item.number} (${item.pull_request ? 'PR' : 'Issue'})`);
} catch (error) {
console.log(`Failed to lock #${item.number}: ${error.message}`);
}
} }
page++; const createdAt = new Date(item.created_at);
const isNew = createdAt >= cutoffDate;
// GitHub search API limit: max 10000 results (100 pages * 100) - temporarily increased try {
if (page > 100) break; // Add comment only for new issues (created after 2026-01-27)
if (isNew) {
const comment = item.pull_request
? 'This pull request has been automatically locked. Please open a new issue for related bugs.'
: 'This issue has been automatically locked. Please open a new issue for related bugs and reference this issue if needed.';
await github.rest.issues.createComment({
...context.repo,
issue_number: item.number,
body: comment
});
}
// Lock the issue/PR
await github.rest.issues.lock({
...context.repo,
issue_number: item.number,
lock_reason: 'resolved'
});
console.log(`Locked #${item.number} (${item.pull_request ? 'PR' : 'Issue'})`);
} catch (error) {
console.log(`Failed to lock #${item.number}: ${error.message}`);
}
} }
console.log(`Total locked: ${totalLocked} issues/PRs`);

View File

@@ -772,24 +772,6 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
</details> </details>
## 2026-02-03
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- [FIX] Shelfmark: unpin Chromium version [@vhsdream](https://github.com/vhsdream) ([#11505](https://github.com/community-scripts/ProxmoxVE/pull/11505))
- #### ✨ New Features
- [FEAT] Scanopy: automatically update integrated daemon [@vhsdream](https://github.com/vhsdream) ([#11506](https://github.com/community-scripts/ProxmoxVE/pull/11506))
### 🌐 Website
- #### 🐞 Bug Fixes
- fix(frontend): decouple table pagination from summary fetching [@ls-root](https://github.com/ls-root) ([#11495](https://github.com/community-scripts/ProxmoxVE/pull/11495))
## 2026-02-02 ## 2026-02-02
### 🆕 New Scripts ### 🆕 New Scripts
@@ -801,7 +783,6 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
- #### 🐞 Bug Fixes - #### 🐞 Bug Fixes
- Grist: Update dependencies [@tremor021](https://github.com/tremor021) ([#11489](https://github.com/community-scripts/ProxmoxVE/pull/11489))
- Allow "downgrade" of libigdgmm12 [@vhsdream](https://github.com/vhsdream) ([#11478](https://github.com/community-scripts/ProxmoxVE/pull/11478)) - Allow "downgrade" of libigdgmm12 [@vhsdream](https://github.com/vhsdream) ([#11478](https://github.com/community-scripts/ProxmoxVE/pull/11478))
- Disable NPM install and update due to OpenResty SHA-1 signature issues [@MickLesk](https://github.com/MickLesk) ([#11471](https://github.com/community-scripts/ProxmoxVE/pull/11471)) - Disable NPM install and update due to OpenResty SHA-1 signature issues [@MickLesk](https://github.com/MickLesk) ([#11471](https://github.com/community-scripts/ProxmoxVE/pull/11471))

View File

@@ -29,8 +29,6 @@ function update_script() {
exit exit
fi fi
ensure_dependencies git
if check_for_gh_release "grist" "gristlabs/grist-core"; then if check_for_gh_release "grist" "gristlabs/grist-core"; then
msg_info "Stopping Service" msg_info "Stopping Service"
systemctl stop grist systemctl stop grist

View File

@@ -67,18 +67,11 @@ function update_script() {
mv ./target/release/server /usr/bin/scanopy-server mv ./target/release/server /usr/bin/scanopy-server
msg_ok "Built scanopy-server" msg_ok "Built scanopy-server"
[[ -f /etc/systemd/system/scanopy-daemon.service ]] &&
fetch_and_deploy_gh_release "scanopy" "scanopy/scanopy" "singlefile" "latest" "/usr/local/bin" "scanopy-daemon-linux-amd64" &&
rm -f /usr/bin/scanopy-daemon ~/configure_daemon.sh &&
sed -i -e 's|usr/bin|usr/local/bin|' \
-e 's/push/daemon_poll/' \
-e 's/pull/server_poll/' /etc/systemd/system/scanopy-daemon.service &&
systemctl daemon-reload
msg_info "Starting services" msg_info "Starting services"
systemctl start scanopy-server systemctl start scanopy-server
[[ -f /etc/systemd/system/scanopy-daemon.service ]] && systemctl start scanopy-daemon [[ -f /etc/systemd/system/scanopy-daemon.service ]] && systemctl start scanopy-daemon
msg_ok "Updated successfully!" msg_ok "Updated successfully!"
msg_warn "Update your integrated daemon via the UI"
fi fi
exit exit
} }

View File

@@ -72,12 +72,10 @@ function update_script() {
systemctl stop vaultwarden systemctl stop vaultwarden
msg_ok "Stopped Service" msg_ok "Stopped Service"
fetch_and_deploy_gh_release "vaultwarden_webvault" "dani-garcia/bw_web_builds" "prebuild" "latest" "/opt/vaultwarden" "bw_web_*.tar.gz"
msg_info "Updating Web-Vault to $WVRELEASE" msg_info "Updating Web-Vault to $WVRELEASE"
rm -rf /opt/vaultwarden/web-vault rm -rf /opt/vaultwarden/web-vault
mkdir -p /opt/vaultwarden/web-vault
fetch_and_deploy_gh_release "vaultwarden_webvault" "dani-garcia/bw_web_builds" "prebuild" "latest" "/opt/vaultwarden/web-vault" "bw_web_*.tar.gz"
chown -R root:root /opt/vaultwarden/web-vault/ chown -R root:root /opt/vaultwarden/web-vault/
msg_ok "Updated Web-Vault to ${WVRELEASE}" msg_ok "Updated Web-Vault to ${WVRELEASE}"

View File

@@ -1,86 +0,0 @@
#!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-2026 community-scripts ORG
# Author: CrazyWolf13
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://wealthfolio.app/
APP="Wealthfolio"
var_tags="${var_tags:-finance;portfolio}"
var_cpu="${var_cpu:-4}"
var_ram="${var_ram:-4096}"
var_disk="${var_disk:-10}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -d /opt/wealthfolio ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if check_for_gh_release "wealthfolio" "afadil/wealthfolio"; then
msg_info "Stopping Service"
systemctl stop wealthfolio
msg_ok "Stopped Service"
msg_info "Backing up Data"
cp -r /opt/wealthfolio_data /opt/wealthfolio_data_backup
cp /opt/wealthfolio/.env /opt/wealthfolio_env_backup
msg_ok "Backed up Data"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "wealthfolio" "afadil/wealthfolio" "tarball"
msg_info "Building Frontend (patience)"
cd /opt/wealthfolio
$STD pnpm install --frozen-lockfile
$STD pnpm tsc
$STD pnpm vite build
msg_ok "Built Frontend"
msg_info "Building Backend (patience)"
cd /opt/wealthfolio/src-server
source ~/.cargo/env
$STD cargo build --release --manifest-path Cargo.toml
cp /opt/wealthfolio/src-server/target/release/wealthfolio-server /usr/local/bin/wealthfolio-server
chmod +x /usr/local/bin/wealthfolio-server
msg_ok "Built Backend"
msg_info "Restoring Data"
cp -r /opt/wealthfolio_data_backup/. /opt/wealthfolio_data
cp /opt/wealthfolio_env_backup /opt/wealthfolio/.env
rm -rf /opt/wealthfolio_data_backup /opt/wealthfolio_env_backup
msg_ok "Restored Data"
msg_info "Cleaning Up"
rm -rf /opt/wealthfolio/src-server/target
rm -rf /root/.cargo/registry
rm -rf /opt/wealthfolio/node_modules
msg_ok "Cleaned Up"
msg_info "Starting Service"
systemctl start wealthfolio
msg_ok "Started Service"
msg_ok "Updated successfully!"
fi
exit
}
start
build_container
description
msg_ok "Completed successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}"

View File

@@ -1,5 +1,5 @@
{ {
"generated": "2026-02-03T18:19:44Z", "generated": "2026-02-02T12:12:15Z",
"versions": [ "versions": [
{ {
"slug": "2fauth", "slug": "2fauth",
@@ -95,9 +95,9 @@
{ {
"slug": "bar-assistant", "slug": "bar-assistant",
"repo": "karlomikus/bar-assistant", "repo": "karlomikus/bar-assistant",
"version": "v5.13.1", "version": "v5.13.0",
"pinned": false, "pinned": false,
"date": "2026-02-02T18:47:43Z" "date": "2026-02-01T15:49:21Z"
}, },
{ {
"slug": "bazarr", "slug": "bazarr",
@@ -109,9 +109,9 @@
{ {
"slug": "bentopdf", "slug": "bentopdf",
"repo": "alam00000/bentopdf", "repo": "alam00000/bentopdf",
"version": "v2.1.0", "version": "v2.0.0",
"pinned": false, "pinned": false,
"date": "2026-02-02T14:30:55Z" "date": "2026-01-31T10:13:47Z"
}, },
{ {
"slug": "beszel", "slug": "beszel",
@@ -186,9 +186,9 @@
{ {
"slug": "comfyui", "slug": "comfyui",
"repo": "comfyanonymous/ComfyUI", "repo": "comfyanonymous/ComfyUI",
"version": "v0.12.0", "version": "v0.11.1",
"pinned": false, "pinned": false,
"date": "2026-02-03T08:54:29Z" "date": "2026-01-29T07:52:21Z"
}, },
{ {
"slug": "commafeed", "slug": "commafeed",
@@ -312,9 +312,9 @@
{ {
"slug": "ersatztv", "slug": "ersatztv",
"repo": "ErsatzTV/ErsatzTV", "repo": "ErsatzTV/ErsatzTV",
"version": "v26.2.0", "version": "v26.1.1",
"pinned": false, "pinned": false,
"date": "2026-02-02T20:54:26Z" "date": "2026-01-08T22:02:15Z"
}, },
{ {
"slug": "excalidraw", "slug": "excalidraw",
@@ -543,9 +543,9 @@
{ {
"slug": "jackett", "slug": "jackett",
"repo": "Jackett/Jackett", "repo": "Jackett/Jackett",
"version": "v0.24.1019", "version": "v0.24.1012",
"pinned": false, "pinned": false,
"date": "2026-02-03T06:01:43Z" "date": "2026-02-02T11:05:14Z"
}, },
{ {
"slug": "joplin-server", "slug": "joplin-server",
@@ -669,9 +669,9 @@
{ {
"slug": "libretranslate", "slug": "libretranslate",
"repo": "LibreTranslate/LibreTranslate", "repo": "LibreTranslate/LibreTranslate",
"version": "v1.8.4", "version": "v1.8.3",
"pinned": false, "pinned": false,
"date": "2026-02-02T17:45:16Z" "date": "2025-12-04T21:07:00Z"
}, },
{ {
"slug": "lidarr", "slug": "lidarr",
@@ -746,9 +746,9 @@
{ {
"slug": "mealie", "slug": "mealie",
"repo": "mealie-recipes/mealie", "repo": "mealie-recipes/mealie",
"version": "v3.10.1", "version": "v3.9.2",
"pinned": false, "pinned": false,
"date": "2026-02-03T01:04:38Z" "date": "2026-01-02T19:40:09Z"
}, },
{ {
"slug": "mediamanager", "slug": "mediamanager",
@@ -830,9 +830,9 @@
{ {
"slug": "netbox", "slug": "netbox",
"repo": "netbox-community/netbox", "repo": "netbox-community/netbox",
"version": "v4.5.2", "version": "v4.5.1",
"pinned": false, "pinned": false,
"date": "2026-02-03T13:54:26Z" "date": "2026-01-20T19:45:05Z"
}, },
{ {
"slug": "nocodb", "slug": "nocodb",
@@ -879,9 +879,9 @@
{ {
"slug": "opengist", "slug": "opengist",
"repo": "thomiceli/opengist", "repo": "thomiceli/opengist",
"version": "v1.12.1", "version": "v1.12.0",
"pinned": false, "pinned": false,
"date": "2026-02-03T09:00:43Z" "date": "2026-01-27T15:31:57Z"
}, },
{ {
"slug": "ots", "slug": "ots",
@@ -1054,9 +1054,9 @@
{ {
"slug": "prometheus-alertmanager", "slug": "prometheus-alertmanager",
"repo": "prometheus/alertmanager", "repo": "prometheus/alertmanager",
"version": "v0.31.0", "version": "v0.30.1",
"pinned": false, "pinned": false,
"date": "2026-02-02T13:34:15Z" "date": "2026-01-12T23:30:06Z"
}, },
{ {
"slug": "prometheus-blackbox-exporter", "slug": "prometheus-blackbox-exporter",
@@ -1201,9 +1201,9 @@
{ {
"slug": "scanopy", "slug": "scanopy",
"repo": "scanopy/scanopy", "repo": "scanopy/scanopy",
"version": "v0.14.2", "version": "v0.14.0",
"pinned": false, "pinned": false,
"date": "2026-02-03T00:35:22Z" "date": "2026-02-01T17:02:37Z"
}, },
{ {
"slug": "scraparr", "slug": "scraparr",
@@ -1355,9 +1355,9 @@
{ {
"slug": "thingsboard", "slug": "thingsboard",
"repo": "thingsboard/thingsboard", "repo": "thingsboard/thingsboard",
"version": "v4.3.0.1", "version": "v4.3",
"pinned": false, "pinned": false,
"date": "2026-02-03T12:39:14Z" "date": "2026-01-20T14:27:07Z"
}, },
{ {
"slug": "threadfin", "slug": "threadfin",
@@ -1471,19 +1471,12 @@
"pinned": false, "pinned": false,
"date": "2025-10-22T17:03:54Z" "date": "2025-10-22T17:03:54Z"
}, },
{
"slug": "vaultwarden",
"repo": "dani-garcia/vaultwarden",
"version": "1.35.2",
"pinned": false,
"date": "2026-01-09T18:37:04Z"
},
{ {
"slug": "victoriametrics", "slug": "victoriametrics",
"repo": "VictoriaMetrics/VictoriaMetrics", "repo": "VictoriaMetrics/VictoriaMetrics",
"version": "v1.135.0", "version": "v1.134.0",
"pinned": false, "pinned": false,
"date": "2026-02-02T14:20:15Z" "date": "2026-01-19T13:29:43Z"
}, },
{ {
"slug": "vikunja", "slug": "vikunja",
@@ -1607,9 +1600,9 @@
{ {
"slug": "zwave-js-ui", "slug": "zwave-js-ui",
"repo": "zwave-js/zwave-js-ui", "repo": "zwave-js/zwave-js-ui",
"version": "v11.11.0", "version": "v11.10.1",
"pinned": false, "pinned": false,
"date": "2026-02-03T13:13:05Z" "date": "2026-01-15T15:58:06Z"
} }
] ]
} }

View File

@@ -1,40 +0,0 @@
{
"name": "Wealthfolio",
"slug": "wealthfolio",
"categories": [
23
],
"date_created": "2026-02-03",
"type": "ct",
"updateable": true,
"privileged": false,
"interface_port": 8080,
"documentation": "https://wealthfolio.app/docs/introduction/",
"config_path": "/opt/wealthfolio/.env",
"website": "https://wealthfolio.app/",
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/wealthfolio.webp",
"description": "Wealthfolio is a beautiful, privacy-focused investment tracker with local data storage. Track your portfolio across multiple accounts and asset types with detailed performance analytics, goal planning, and multi-currency support.",
"install_methods": [
{
"type": "default",
"script": "ct/wealthfolio.sh",
"resources": {
"cpu": 4,
"ram": 4096,
"hdd": 10,
"os": "Debian",
"version": "13"
}
}
],
"default_credentials": {
"username": null,
"password": "See ~/wealthfolio.creds"
},
"notes": [
{
"text": "Login password is stored in ~/wealthfolio.creds",
"type": "info"
}
]
}

View File

@@ -94,8 +94,7 @@ const chartConfigApps = {
export default function DataPage() { export default function DataPage() {
const [data, setData] = useState<DataModel[]>([]); const [data, setData] = useState<DataModel[]>([]);
const [summary, setSummary] = useState<SummaryData | null>(null); const [summary, setSummary] = useState<SummaryData | null>(null);
const [summaryLoading, setSummaryLoading] = useState<boolean>(true); const [loading, setLoading] = useState<boolean>(true);
const [dataLoading, setDataLoading] = useState<boolean>(true);
const [error, setError] = useState<string | null>(null); const [error, setError] = useState<string | null>(null);
const [currentPage, setCurrentPage] = useState(1); const [currentPage, setCurrentPage] = useState(1);
const [itemsPerPage, setItemsPerPage] = useState(25); const [itemsPerPage, setItemsPerPage] = useState(25);
@@ -106,40 +105,35 @@ export default function DataPage() {
const nf = new Intl.NumberFormat("en-US", { maximumFractionDigits: 0 }); const nf = new Intl.NumberFormat("en-US", { maximumFractionDigits: 0 });
// Fetch summary only once on mount
useEffect(() => { useEffect(() => {
const fetchSummary = async () => { const fetchData = async () => {
setLoading(true);
try { try {
const summaryRes = await fetch("https://api.htl-braunau.at/data/summary"); const [summaryRes, dataRes] = await Promise.all([
fetch("https://api.htl-braunau.at/data/summary"),
fetch(
`https://api.htl-braunau.at/data/paginated?page=${currentPage}&limit=${
itemsPerPage === 0 ? "" : itemsPerPage
}`,
),
]);
if (!summaryRes.ok) { if (!summaryRes.ok) {
throw new Error(`Failed to fetch summary: ${summaryRes.statusText}`); throw new Error(`Failed to fetch summary: ${summaryRes.statusText}`);
} }
const summaryData: SummaryData = await summaryRes.json();
setSummary(summaryData);
} catch (err) {
setError((err as Error).message);
} finally {
setSummaryLoading(false);
}
};
fetchSummary();
}, []);
useEffect(() => {
const fetchData = async () => {
setDataLoading(true);
try {
const dataRes = await fetch(`https://api.htl-braunau.at/data/paginated?page=${currentPage}&limit=${itemsPerPage}`);
if (!dataRes.ok) { if (!dataRes.ok) {
throw new Error(`Failed to fetch data: ${dataRes.statusText}`); throw new Error(`Failed to fetch data: ${dataRes.statusText}`);
} }
const summaryData: SummaryData = await summaryRes.json();
const pageData: DataModel[] = await dataRes.json(); const pageData: DataModel[] = await dataRes.json();
setSummary(summaryData);
setData(pageData); setData(pageData);
} catch (err) { } catch (err) {
setError((err as Error).message); setError((err as Error).message);
} finally { } finally {
setDataLoading(false); setLoading(false);
} }
}; };
@@ -312,7 +306,7 @@ export default function DataPage() {
</CardHeader> </CardHeader>
<CardContent className="pl-2"> <CardContent className="pl-2">
<div className="h-[300px] w-full"> <div className="h-[300px] w-full">
{summaryLoading ? ( {loading ? (
<div className="flex h-full w-full items-center justify-center"> <div className="flex h-full w-full items-center justify-center">
<Loader2 className="h-8 w-8 animate-spin text-muted-foreground" /> <Loader2 className="h-8 w-8 animate-spin text-muted-foreground" />
</div> </div>
@@ -417,7 +411,7 @@ export default function DataPage() {
</TableRow> </TableRow>
</TableHeader> </TableHeader>
<TableBody> <TableBody>
{dataLoading ? ( {loading ? (
<TableRow> <TableRow>
<TableCell colSpan={8} className="h-24 text-center"> <TableCell colSpan={8} className="h-24 text-center">
<div className="flex items-center justify-center gap-2"> <div className="flex items-center justify-center gap-2">
@@ -484,7 +478,7 @@ export default function DataPage() {
variant="outline" variant="outline"
size="sm" size="sm"
onClick={() => setCurrentPage((prev) => Math.max(prev - 1, 1))} onClick={() => setCurrentPage((prev) => Math.max(prev - 1, 1))}
disabled={currentPage === 1 || dataLoading} disabled={currentPage === 1 || loading}
> >
<ChevronLeft className="mr-2 h-4 w-4" /> <ChevronLeft className="mr-2 h-4 w-4" />
Previous Previous
@@ -494,7 +488,7 @@ export default function DataPage() {
variant="outline" variant="outline"
size="sm" size="sm"
onClick={() => setCurrentPage((prev) => prev + 1)} onClick={() => setCurrentPage((prev) => prev + 1)}
disabled={dataLoading || sortedData.length < itemsPerPage} disabled={loading || sortedData.length < itemsPerPage}
> >
Next Next
<ChevronRight className="ml-2 h-4 w-4" /> <ChevronRight className="ml-2 h-4 w-4" />

View File

@@ -17,8 +17,7 @@ msg_info "Installing Dependencies"
$STD apt install -y \ $STD apt install -y \
make \ make \
ca-certificates \ ca-certificates \
python3-venv \ python3-venv
git
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
NODE_VERSION="22" NODE_MODULE="yarn@latest" setup_nodejs NODE_VERSION="22" NODE_MODULE="yarn@latest" setup_nodejs
fetch_and_deploy_gh_release "grist" "gristlabs/grist-core" "tarball" fetch_and_deploy_gh_release "grist" "gristlabs/grist-core" "tarball"

View File

@@ -105,13 +105,14 @@ elif [[ "$DEPLOYMENT_TYPE" == "4" ]]; then
sed -i '/_BYPASS=/s/true/false/' /etc/shelfmark/.env sed -i '/_BYPASS=/s/true/false/' /etc/shelfmark/.env
else else
DEPLOYMENT_TYPE="1" DEPLOYMENT_TYPE="1"
CHROME_VERSION=$(curl -fsSL https://raw.githubusercontent.com/calibrain/shelfmark/refs/heads/main/Dockerfile | sed -n '/chromium=/s/[^=]*=//p' | awk '{print $1}')
msg_info "Installing internal bypasser dependencies" msg_info "Installing internal bypasser dependencies"
$STD apt install -y --no-install-recommends \ $STD apt install -y --no-install-recommends \
xvfb \ xvfb \
ffmpeg \ ffmpeg \
chromium-common \ chromium-common=${CHROME_VERSION} \
chromium \ chromium=${CHROME_VERSION} \
chromium-driver \ chromium-driver=${CHROME_VERSION} \
python3-tk python3-tk
msg_ok "Installed internal bypasser dependencies" msg_ok "Installed internal bypasser dependencies"
fi fi

View File

@@ -1,89 +0,0 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
# Author: CrazyWolf13
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://wealthfolio.app/
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
msg_info "Installing Dependencies"
$STD apt install -y \
pkg-config \
libssl-dev \
build-essential \
libsqlite3-dev \
argon2
msg_ok "Installed Dependencies"
setup_rust
NODE_MODULE="pnpm" setup_nodejs
fetch_and_deploy_gh_release "wealthfolio" "afadil/wealthfolio" "tarball"
msg_info "Building Frontend (patience)"
cd /opt/wealthfolio
$STD pnpm install --frozen-lockfile
$STD pnpm tsc
$STD pnpm vite build
msg_ok "Built Frontend"
msg_info "Building Backend (patience)"
cd /opt/wealthfolio/src-server
$STD cargo build --release --manifest-path Cargo.toml
cp /opt/wealthfolio/src-server/target/release/wealthfolio-server /usr/local/bin/wealthfolio-server
chmod +x /usr/local/bin/wealthfolio-server
msg_ok "Built Backend"
msg_info "Configuring Wealthfolio"
mkdir -p /opt/wealthfolio_data
SECRET_KEY=$(openssl rand -base64 32)
WF_PASSWORD=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-16)
WF_PASSWORD_HASH=$(echo -n "$WF_PASSWORD" | argon2 "$(openssl rand -base64 16)" -id -e)
cat <<EOF >/opt/wealthfolio/.env
WF_LISTEN_ADDR=0.0.0.0:8080
WF_DB_PATH=/opt/wealthfolio_data/wealthfolio.db
WF_SECRET_KEY=${SECRET_KEY}
WF_AUTH_PASSWORD_HASH=${WF_PASSWORD_HASH}
WF_STATIC_DIR=/opt/wealthfolio/dist
WF_CORS_ALLOW_ORIGINS=*
WF_REQUEST_TIMEOUT_MS=30000
EOF
echo "WF_PASSWORD=${WF_PASSWORD}" >~/wealthfolio.creds
msg_ok "Configured Wealthfolio"
msg_info "Cleaning Up"
rm -rf /opt/wealthfolio/src-server/target
rm -rf /root/.cargo/registry
rm -rf /opt/wealthfolio/node_modules
msg_ok "Cleaned Up"
msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/wealthfolio.service
[Unit]
Description=Wealthfolio Investment Tracker
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/wealthfolio
EnvironmentFile=/opt/wealthfolio/.env
ExecStart=/usr/local/bin/wealthfolio-server
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now wealthfolio
msg_ok "Created Service"
motd_ssh
customize
cleanup_lxc

View File

@@ -1890,7 +1890,7 @@ function fetch_and_deploy_codeberg_release() {
local app="$1" local app="$1"
local repo="$2" local repo="$2"
local mode="${3:-tarball}" # tarball | binary | prebuild | singlefile | tag local mode="${3:-tarball}" # tarball | binary | prebuild | singlefile | tag
local version="${4:-latest}" local version="${var_appversion:-${4:-latest}}"
local target="${5:-/opt/$app}" local target="${5:-/opt/$app}"
local asset_pattern="${6:-}" local asset_pattern="${6:-}"
@@ -2322,7 +2322,7 @@ function fetch_and_deploy_gh_release() {
local app="$1" local app="$1"
local repo="$2" local repo="$2"
local mode="${3:-tarball}" # tarball | binary | prebuild | singlefile local mode="${3:-tarball}" # tarball | binary | prebuild | singlefile
local version="${4:-latest}" local version="${var_appversion:-${4:-latest}}"
local target="${5:-/opt/$app}" local target="${5:-/opt/$app}"
local asset_pattern="${6:-}" local asset_pattern="${6:-}"