From ce7bec3af52e7d5bd44ee5d42f16ae1af0e73652 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B8=D0=BA=D1=82=D0=BE=D1=80?= <78488229+viktor138irk@users.noreply.github.com> Date: Fri, 8 May 2026 22:59:05 +0900 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=B3=D0=BE=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=20=D0=B0=D0=B2=D1=82=D0=BE=D1=83=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D1=89=D0=B8=D0=BA=20WSMessenger?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/install.sh | 192 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 174 insertions(+), 18 deletions(-) diff --git a/scripts/install.sh b/scripts/install.sh index 466d67b..ea80b88 100644 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -1,29 +1,185 @@ #!/usr/bin/env bash -set -e +set -Eeuo pipefail -echo "== WSMessenger Installer ==" +PROJECT_NAME="WSMessenger" +INSTALL_DIR="${INSTALL_DIR:-/opt/swmessenger}" +SOURCE_DIR="${SOURCE_DIR:-$INSTALL_DIR/source}" +DATA_DIR="${DATA_DIR:-$INSTALL_DIR/data}" +BACKUP_DIR="${BACKUP_DIR:-$INSTALL_DIR/backups}" +ENV_FILE="${ENV_FILE:-$INSTALL_DIR/.env}" +COMPOSE_FILE="${COMPOSE_FILE:-$SOURCE_DIR/docker-compose.yml}" +SERVER_NAME="${SERVER_NAME:-matrix.stackworks.ru}" +REPORT_STATS="${REPORT_STATS:-no}" +AUTO_START="${AUTO_START:-yes}" -echo "[1/5] Creating directories" -mkdir -p /opt/swmessenger -mkdir -p /opt/swmessenger/backups -mkdir -p /opt/swmessenger/source +log() { + echo "[INFO] $*" +} -echo "[2/5] Checking Docker" -if ! command -v docker >/dev/null 2>&1; then - echo "Docker not installed" +warn() { + echo "[WARN] $*" +} + +fail() { + echo "[ERROR] $*" >&2 exit 1 -fi +} -echo "[3/5] Checking Docker Compose" -docker compose version >/dev/null +need_root() { + if [ "$(id -u)" -ne 0 ]; then + fail "Run as root: sudo bash scripts/install.sh" + fi +} -echo "[4/5] Starting containers" -docker compose up -d +need_command() { + command -v "$1" >/dev/null 2>&1 || fail "Required command not found: $1" +} -echo "[5/5] Done" +random_secret() { + if command -v openssl >/dev/null 2>&1; then + openssl rand -hex 32 + else + tr -dc 'a-f0-9' /dev/null 2>&1 || fail "Docker Compose plugin is required" + need_command sed + need_command grep + need_command ss +} + +write_env() { + if [ -f "$ENV_FILE" ]; then + warn ".env already exists, keeping it: $ENV_FILE" + return + fi + + log "Creating .env" + POSTGRES_PASSWORD="$(random_secret)" + REGISTRATION_SHARED_SECRET="$(random_secret)" + MACAROON_SECRET_KEY="$(random_secret)" + FORM_SECRET="$(random_secret)" + + cat > "$ENV_FILE" <> "$DATA_DIR/synapse/homeserver.yaml" <<'EOF' + +# WSMessenger managed PostgreSQL database config +database: + name: psycopg2 + args: + user: synapse + password: __POSTGRES_PASSWORD__ + database: synapse + host: postgres + cp_min: 5 + cp_max: 10 + +# WSMessenger reverse proxy mode +public_baseurl: https://__SERVER_NAME__/ +trusted_key_servers: + - server_name: matrix.org +EOF + + . "$ENV_FILE" + sed -i "s|__POSTGRES_PASSWORD__|$POSTGRES_PASSWORD|g" "$DATA_DIR/synapse/homeserver.yaml" + sed -i "s|__SERVER_NAME__|$SERVER_NAME|g" "$DATA_DIR/synapse/homeserver.yaml" +} + +start_stack() { + if [ "$AUTO_START" != "yes" ]; then + warn "AUTO_START is not yes, skipping docker compose up" + return + fi + + log "Starting WSMessenger containers" + cd "$SOURCE_DIR" + docker compose --env-file "$ENV_FILE" up -d +} + +show_next_steps() { + echo + echo "== Installation complete ==" + echo + echo "Matrix local endpoint: http://127.0.0.1:8008" + echo "Server name: $SERVER_NAME" + echo + echo "FastPanel was NOT modified. Configure reverse proxy manually when ready:" + echo " https://$SERVER_NAME -> http://127.0.0.1:8008" + echo + echo "Healthcheck:" + echo " sudo bash $SOURCE_DIR/scripts/healthcheck.sh" + echo +} + +main() { + echo "== $PROJECT_NAME Auto Installer ==" + need_root + check_protected_assets + safe_mkdirs + check_requirements + ensure_compose_file + write_env + generate_synapse_config + patch_synapse_config + start_stack + show_next_steps +} + +main "$@"