diff --git a/README.md b/README.md index 16c499b..96161c3 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,13 @@ -# VyManager +# 🖥️ VyManager Modern web interface to make configuring, deploying and monitoring VyOS routers easier +## ❌ Legacy version. This version will be announced End of Life very soon. Migrate to our widely improved [Open Beta](https://github.com/Community-VyProjects/VyManager/tree/beta). + +--- + +### 🔐 VyManager Legacy + ## VyOS Version Support Currently being developed for: - VyOS 1.4-sagitta **(full)** @@ -13,8 +19,6 @@ Currently being developed for: [💭 Feel free to join our official Discord community](https://discord.gg/k9SSkK7wPQ) -**[Live Demo (limited uptime during some periods)](https://vymanager.vyprojects.org)** - ![alt text](image.png) --- diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 116681d..6f82717 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -27,7 +27,7 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "lucide-react": "^0.292.0", - "next": "^15.5.2", + "next": "^15.5.7", "next-themes": "^0.2.1", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -745,9 +745,9 @@ } }, "node_modules/@next/env": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.2.tgz", - "integrity": "sha512-Qe06ew4zt12LeO6N7j8/nULSOe3fMXE4dM6xgpBQNvdzyK1sv5y4oAP3bq4LamrvGCZtmRYnW8URFCeX5nFgGg==", + "version": "15.5.7", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.7.tgz", + "integrity": "sha512-4h6Y2NyEkIEN7Z8YxkA27pq6zTkS09bUSYC0xjd0NpwFxjnIKeZEeH591o5WECSmjpUhLn3H2QLJcDye3Uzcvg==", "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { @@ -760,9 +760,9 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.2.tgz", - "integrity": "sha512-8bGt577BXGSd4iqFygmzIfTYizHb0LGWqH+qgIF/2EDxS5JsSdERJKA8WgwDyNBZgTIIA4D8qUtoQHmxIIquoQ==", + "version": "15.5.7", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.7.tgz", + "integrity": "sha512-IZwtxCEpI91HVU/rAUOOobWSZv4P2DeTtNaCdHqLcTJU4wdNXgAySvKa/qJCgR5m6KI8UsKDXtO2B31jcaw1Yw==", "cpu": [ "arm64" ], @@ -776,9 +776,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.2.tgz", - "integrity": "sha512-2DjnmR6JHK4X+dgTXt5/sOCu/7yPtqpYt8s8hLkHFK3MGkka2snTv3yRMdHvuRtJVkPwCGsvBSwmoQCHatauFQ==", + "version": "15.5.7", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.7.tgz", + "integrity": "sha512-UP6CaDBcqaCBuiq/gfCEJw7sPEoX1aIjZHnBWN9v9qYHQdMKvCKcAVs4OX1vIjeE+tC5EIuwDTVIoXpUes29lg==", "cpu": [ "x64" ], @@ -792,9 +792,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.2.tgz", - "integrity": "sha512-3j7SWDBS2Wov/L9q0mFJtEvQ5miIqfO4l7d2m9Mo06ddsgUK8gWfHGgbjdFlCp2Ek7MmMQZSxpGFqcC8zGh2AA==", + "version": "15.5.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.7.tgz", + "integrity": "sha512-NCslw3GrNIw7OgmRBxHtdWFQYhexoUCq+0oS2ccjyYLtcn1SzGzeM54jpTFonIMUjNbHmpKpziXnpxhSWLcmBA==", "cpu": [ "arm64" ], @@ -808,9 +808,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.2.tgz", - "integrity": "sha512-s6N8k8dF9YGc5T01UPQ08yxsK6fUow5gG1/axWc1HVVBYQBgOjca4oUZF7s4p+kwhkB1bDSGR8QznWrFZ/Rt5g==", + "version": "15.5.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.7.tgz", + "integrity": "sha512-nfymt+SE5cvtTrG9u1wdoxBr9bVB7mtKTcj0ltRn6gkP/2Nu1zM5ei8rwP9qKQP0Y//umK+TtkKgNtfboBxRrw==", "cpu": [ "arm64" ], @@ -824,9 +824,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.2.tgz", - "integrity": "sha512-o1RV/KOODQh6dM6ZRJGZbc+MOAHww33Vbs5JC9Mp1gDk8cpEO+cYC/l7rweiEalkSm5/1WGa4zY7xrNwObN4+Q==", + "version": "15.5.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.7.tgz", + "integrity": "sha512-hvXcZvCaaEbCZcVzcY7E1uXN9xWZfFvkNHwbe/n4OkRhFWrs1J1QV+4U1BN06tXLdaS4DazEGXwgqnu/VMcmqw==", "cpu": [ "x64" ], @@ -840,9 +840,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.2.tgz", - "integrity": "sha512-/VUnh7w8RElYZ0IV83nUcP/J4KJ6LLYliiBIri3p3aW2giF+PAVgZb6mk8jbQSB3WlTai8gEmCAr7kptFa1H6g==", + "version": "15.5.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.7.tgz", + "integrity": "sha512-4IUO539b8FmF0odY6/SqANJdgwn1xs1GkPO5doZugwZ3ETF6JUdckk7RGmsfSf7ws8Qb2YB5It33mvNL/0acqA==", "cpu": [ "x64" ], @@ -856,9 +856,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.2.tgz", - "integrity": "sha512-sMPyTvRcNKXseNQ/7qRfVRLa0VhR0esmQ29DD6pqvG71+JdVnESJaHPA8t7bc67KD5spP3+DOCNLhqlEI2ZgQg==", + "version": "15.5.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.7.tgz", + "integrity": "sha512-CpJVTkYI3ZajQkC5vajM7/ApKJUOlm6uP4BknM3XKvJ7VXAvCqSjSLmM0LKdYzn6nBJVSjdclx8nYJSa3xlTgQ==", "cpu": [ "arm64" ], @@ -872,9 +872,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.2.tgz", - "integrity": "sha512-W5VvyZHnxG/2ukhZF/9Ikdra5fdNftxI6ybeVKYvBPDtyx7x4jPPSNduUkfH5fo3zG0JQ0bPxgy41af2JX5D4Q==", + "version": "15.5.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.7.tgz", + "integrity": "sha512-gMzgBX164I6DN+9/PGA+9dQiwmTkE4TloBNx8Kv9UiGARsr9Nba7IpcBRA1iTV9vwlYnrE3Uy6I7Aj6qLjQuqw==", "cpu": [ "x64" ], @@ -1932,6 +1932,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.20.tgz", "integrity": "sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==", "devOptional": true, + "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -1942,6 +1943,7 @@ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.6.tgz", "integrity": "sha512-nf22//wEbKXusP6E9pfOCDwFdHAX4u172eaJI4YkDRQEZiorm6KfYnSC2SWLDMVWUOWPERmJnN0ujeAfTBLvrw==", "devOptional": true, + "peer": true, "peerDependencies": { "@types/react": "^18.0.0" } @@ -1980,6 +1982,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.29.1.tgz", "integrity": "sha512-zczrHVEqEaTwh12gWBIJWj8nx+ayDcCJs06yoNMY0kwjMWDM6+kppljY+BxWI06d2Ja+h4+WdufDcwMnnMEWmg==", "dev": true, + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.29.1", "@typescript-eslint/types": "8.29.1", @@ -2377,6 +2380,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "dev": true, + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2771,6 +2775,7 @@ "url": "https://github.com/sponsors/ai" } ], + "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", @@ -3400,6 +3405,7 @@ "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -3562,6 +3568,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", "dev": true, + "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.8", @@ -5065,12 +5072,12 @@ "dev": true }, "node_modules/next": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/next/-/next-15.5.2.tgz", - "integrity": "sha512-H8Otr7abj1glFhbGnvUt3gz++0AF1+QoCXEBmd/6aKbfdFwrn0LpA836Ed5+00va/7HQSDD+mOoVhn3tNy3e/Q==", + "version": "15.5.7", + "resolved": "https://registry.npmjs.org/next/-/next-15.5.7.tgz", + "integrity": "sha512-+t2/0jIJ48kUpGKkdlhgkv+zPTEOoXyr60qXe68eB/pl3CMJaLeIGjzp5D6Oqt25hCBiBTt8wEeeAzfJvUKnPQ==", "license": "MIT", "dependencies": { - "@next/env": "15.5.2", + "@next/env": "15.5.7", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", @@ -5083,14 +5090,14 @@ "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "15.5.2", - "@next/swc-darwin-x64": "15.5.2", - "@next/swc-linux-arm64-gnu": "15.5.2", - "@next/swc-linux-arm64-musl": "15.5.2", - "@next/swc-linux-x64-gnu": "15.5.2", - "@next/swc-linux-x64-musl": "15.5.2", - "@next/swc-win32-arm64-msvc": "15.5.2", - "@next/swc-win32-x64-msvc": "15.5.2", + "@next/swc-darwin-arm64": "15.5.7", + "@next/swc-darwin-x64": "15.5.7", + "@next/swc-linux-arm64-gnu": "15.5.7", + "@next/swc-linux-arm64-musl": "15.5.7", + "@next/swc-linux-x64-gnu": "15.5.7", + "@next/swc-linux-x64-musl": "15.5.7", + "@next/swc-win32-arm64-msvc": "15.5.7", + "@next/swc-win32-x64-msvc": "15.5.7", "sharp": "^0.34.3" }, "peerDependencies": { @@ -5488,6 +5495,7 @@ "url": "https://github.com/sponsors/ai" } ], + "peer": true, "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", @@ -5628,6 +5636,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -5639,6 +5648,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -5651,6 +5661,7 @@ "version": "7.55.0", "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.55.0.tgz", "integrity": "sha512-XRnjsH3GVMQz1moZTW53MxfoWN7aDpUg/GpVNc4A3eXRVNdGXfbzJ4vM4aLQ8g6XCUh1nIbx70aaNCl7kxnjog==", + "peer": true, "engines": { "node": ">=18.0.0" }, @@ -6498,6 +6509,7 @@ "version": "3.4.17", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "peer": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -6632,6 +6644,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, + "peer": true, "engines": { "node": ">=12" }, @@ -6795,6 +6808,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "dev": true, + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" diff --git a/frontend/package.json b/frontend/package.json index 1c1fcf8..852dbb1 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -28,7 +28,7 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "lucide-react": "^0.292.0", - "next": "^15.5.2", + "next": "^15.5.7", "next-themes": "^0.2.1", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/scripts/vymanager-install-2404-readme.txt b/scripts/vymanager-install-2404-readme.txt new file mode 100644 index 0000000..b989b0c --- /dev/null +++ b/scripts/vymanager-install-2404-readme.txt @@ -0,0 +1,26 @@ +################################################################################ +# Script Name : vymanager-install-2404-readme.txt +# Description : This is a readme file to show you how to get this script up and running. +# Author : John Harrison +# Created : 2025-12-17 +# Version : 1.0.0 +# License : MIT +# +# Project : ExileSolutionsCloud +# Repository : https://github.com/jharrison712/exilesolutionscloud +# +# Changelog: +# [2025-11-17] v1.0.0 — First stable release +################################################################################ + +# 1. Download the script from GitHub +sudo wget https://raw.githubusercontent.com/USERNAME/REPO/main/Linux/FILENAME + +# 2. Convert file to Unix format (avoids CRLF issues) +sudo dos2unix FILENAME + +# 3. Make the script executable +sudo chmod +x FILENAME + +# 4. Run the script +./FILENAME \ No newline at end of file diff --git a/scripts/vymanager-install-2404.sh b/scripts/vymanager-install-2404.sh new file mode 100644 index 0000000..6720117 --- /dev/null +++ b/scripts/vymanager-install-2404.sh @@ -0,0 +1,280 @@ +#!/bin/bash +################################################################################ +# Script Name : vymanager-install-2404.sh +# Description : Interactive installer for vymanager on Ubuntu 24.04 LTS. +# Author : John Harrison +# Created : 2025-12-15 +# Version : 1.0.0 +# License : MIT +# +# Project : ExileSolutionsCloud +# Repository : https://github.com/jharrison712/exilesolutionscloud +# +# Changelog: +# [2025-11-11] v1.0.0 — First stable release (full rewrite). +################################################################################ +set -euo pipefail + +################################# COLORS ####################################### +if [[ -t 1 ]]; then + BOLD="\e[1m"; RED="\e[31m"; GREEN="\e[32m"; YELLOW="\e[33m"; BLUE="\e[34m"; RESET="\e[0m" +else + BOLD=""; RED=""; GREEN=""; YELLOW=""; BLUE=""; RESET="" +fi + +log_step() { echo -e "${BLUE}${BOLD}==>${RESET} ${BLUE}$*${RESET}"; } +log_info() { echo -e "${GREEN}[*]${RESET} $*"; } +log_warn() { echo -e "${YELLOW}[!]${RESET} $*"; } +log_error() { echo -e "${RED}[x]${RESET} $*" >&2; } +log_success() { echo -e "${GREEN}${BOLD}✔${RESET} $*"; } + +require_root() { + [[ $EUID -eq 0 ]] || { log_error "Run this script as root (sudo)."; exit 1; } +} + +gen_secret() { + openssl rand -base64 48 | tr -d '\n' +} + +detect_ip() { + hostname -I 2>/dev/null | awk '{print $1}' +} + +require_root + +############################################################################### +# GLOBAL VARIABLES +############################################################################### +SERVER_IP="$(detect_ip)" +INSTALL_DIR="/opt/vymanager" +SERVICE_USER="vymanager" +SERVICE_HOME="/var/lib/vymanager" + +DB_NAME="vymanager_auth" +DB_USER="vymanager" +DB_PASS="$(gen_secret)" +DATABASE_URL="postgresql://${DB_USER}:${DB_PASS}@localhost:5432/${DB_NAME}" + +BETTER_AUTH_SECRET="$(gen_secret)" +VYOS_API_KEY="$(gen_secret)" + +############################################################################### +# BANNER +############################################################################### +echo +echo "###############################################################################" +echo "# VyManager Production Installer (NO Docker)" +echo "#" +echo "# Frontend : http://${SERVER_IP}:3000" +echo "# Backend : http://${SERVER_IP}:8000" +echo "# Docs : http://${SERVER_IP}:8000/docs" +echo "###############################################################################" +echo + +############################################################################### +# VyOS SETUP +############################################################################### +log_step "VyOS REST API key generated" + +echo +echo "==================== RUN ON VYOS ROUTER ====================" +echo "conf" +echo "set service https api keys id fastapi key '${VYOS_API_KEY}'" +echo "set service https api rest" +echo "# optional:" +echo "# set service https api graphql" +echo "commit" +echo "save" +echo "exit" +echo "============================================================" +echo +read -r -p "Press ENTER once the VyOS commands are applied..." + +############################################################################### +# VyOS CONFIG INPUT +############################################################################### +log_step "VyOS connection configuration" + +read -r -p "VyOS hostname/IP [192.168.1.1]: " VYOS_HOSTNAME +VYOS_HOSTNAME="${VYOS_HOSTNAME:-192.168.1.1}" + +read -r -p "VyOS device label [vyos15]: " VYOS_NAME +VYOS_NAME="${VYOS_NAME:-vyos15}" + +read -r -p "VyOS HTTPS port [443]: " VYOS_PORT +VYOS_PORT="${VYOS_PORT:-443}" + +read -r -p "Verify VyOS SSL certificate? [y/N]: " _ssl +[[ "${_ssl,,}" == "y" ]] && VYOS_VERIFY_SSL="true" || VYOS_VERIFY_SSL="false" + +############################################################################### +# OS DEPENDENCIES +############################################################################### +log_step "Installing OS dependencies" +apt update -y +apt install -y \ + git curl ca-certificates gnupg build-essential \ + python3 python3-venv python3-pip \ + postgresql postgresql-client + +############################################################################### +# NODE.JS 24 +############################################################################### +log_step "Installing Node.js 24.x" +apt remove -y nodejs npm || true +curl -fsSL https://deb.nodesource.com/setup_24.x | bash - +apt install -y nodejs +log_success "Node $(node -v) | npm $(npm -v)" + +############################################################################### +# SERVICE USER +############################################################################### +log_step "Creating service user" +if ! id "${SERVICE_USER}" &>/dev/null; then + useradd -r -m -d "${SERVICE_HOME}" -s /usr/sbin/nologin "${SERVICE_USER}" +fi + +############################################################################### +# POSTGRESQL (PRISMA-SAFE FIX) +############################################################################### +log_step "Configuring PostgreSQL (deterministic + Prisma-safe)" +systemctl enable --now postgresql + +PG_HBA="/etc/postgresql/$(ls /etc/postgresql)/main/pg_hba.conf" +sed -i 's/peer/scram-sha-256/g' "$PG_HBA" +systemctl reload postgresql + +sudo -u postgres psql < .env </etc/systemd/system/vymanager-backend.service </etc/systemd/system/vymanager-frontend.service <