123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341 |
- #!/bin/bash
- # Logseq Linux Installer Script
- # This script installs Logseq on Linux systems
- # Usage: ./install-linux.sh [version]
- set -e # Exit on any error
- # Default values
- DEFAULT_VERSION="latest"
- INSTALL_DIR="/opt/logseq"
- BIN_DIR="/usr/local/bin"
- # Colors for output
- RED='\033[0;31m'
- GREEN='\033[0;32m'
- YELLOW='\033[1;33m'
- NC='\033[0m' # No Color
- # Helper functions
- log_info() {
- echo -e "${GREEN}[INFO]${NC} $1"
- }
- log_warn() {
- echo -e "${YELLOW}[WARN]${NC} $1"
- }
- log_error() {
- echo -e "${RED}[ERROR]${NC} $1"
- }
- show_help() {
- cat << HELP
- Logseq Linux Installer
- This script installs Logseq on Linux systems.
- USAGE:
- $0 [VERSION] [OPTIONS]
- $0 uninstall
- COMMANDS:
- install (default) Install Logseq
- uninstall Removes Logseq installation (keeps user data)
- ARGUMENTS:
- VERSION Version to install (e.g., "0.10.14"). Default: latest
- OPTIONS:
- --help, -h Show this help message
- --prefix DIR Installation prefix (default: /opt/logseq)
- --user Install for current user only
- --no-desktop Skip desktop integration
- --verbose, -v Verbose output
- EXAMPLES:
- $0 # Install latest version
- $0 0.10.14 # Install specific version
- $0 --user # Install for current user
- $0 --prefix ~/.local/share/logseq # Custom install location
- For more information, visit: https://github.com/logseq/logseq
- HELP
- }
- uninstall() {
- log_info "Searching for Logseq installations..."
-
- local user_removed=false
- local system_removed=false
-
- # User installation paths
- local -a user_paths=(
- "$HOME/.local/share/logseq"
- "$HOME/.local/bin/logseq"
- "$HOME/.local/share/applications/logseq.desktop"
- "$HOME/.local/share/icons/hicolor/512x512/apps/logseq.png"
- )
-
- # System installation paths
- local -a system_paths=(
- "/opt/logseq"
- "/usr/local/bin/logseq"
- "/usr/share/applications/logseq.desktop"
- "/usr/share/icons/hicolor/512x512/apps/logseq.png"
- )
-
- # Remove user installation
- log_info "Checking user installation..."
- for path in "${user_paths[@]}"; do
- if [[ -e "$path" ]] || [[ -L "$path" ]]; then
- log_info "Removing: $path"
- rm -rf "$path"
- user_removed=true
- fi
- done
-
- # Remove system installation
- log_info "Checking system-wide installation..."
- for path in "${system_paths[@]}"; do
- if [[ -e "$path" ]] || [[ -L "$path" ]]; then
- if [[ "$EUID" -ne 0 ]]; then
- log_warn "System-wide installation found at $path, but root privileges required"
- log_warn "Run with sudo to uninstall system-wide installation"
- else
- log_info "Removing: $path"
- rm -rf "$path"
- system_removed=true
- fi
- fi
- done
-
- # Update desktop databases
- if [[ "$user_removed" == true ]] && [[ -d "$HOME/.local/share/applications" ]]; then
- update-desktop-database "$HOME/.local/share/applications" 2>/dev/null || true
- fi
-
- if [[ "$system_removed" == true ]]; then
- update-desktop-database /usr/share/applications 2>/dev/null || true
- fi
-
- # Final status message
- if [[ "$user_removed" == true ]] || [[ "$system_removed" == true ]]; then
- log_info "Logseq has been uninstalled successfully!"
- else
- log_warn "No Logseq installation found in default locations"
- fi
- }
- # Parse command line arguments
- VERSION="$DEFAULT_VERSION"
- USER_INSTALL=false
- SKIP_DESKTOP=false
- VERBOSE=false
- while [[ $# -gt 0 ]]; do
- case $1 in
- --help|-h)
- show_help
- exit 0
- ;;
- --prefix)
- INSTALL_DIR="$2"
- shift 2
- ;;
- --user)
- USER_INSTALL=true
- shift
- ;;
- --no-desktop)
- SKIP_DESKTOP=true
- shift
- ;;
- --verbose|-v)
- VERBOSE=true
- shift
- ;;
- uninstall)
- uninstall
- exit 0
- ;;
- -*)
- log_error "Unknown option: $1"
- show_help
- exit 1
- ;;
- *)
- VERSION="$1"
- shift
- ;;
- esac
- done
- # Set installation paths based on user/system install
- if [[ "$USER_INSTALL" == true ]]; then
- INSTALL_DIR="${INSTALL_DIR/#\/opt\/logseq/$HOME/.local/share/logseq}"
- BIN_DIR="$HOME/.local/bin"
- mkdir -p "$BIN_DIR"
-
- # Add local bin to PATH if not already there
- if ! echo "$PATH" | grep -q "$HOME/.local/bin"; then
- log_info "Adding $HOME/.local/bin to PATH..."
- export PATH="$HOME/.local/bin:$PATH"
- echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
- fi
- fi
- log_info "Installing Logseq $VERSION to $INSTALL_DIR"
- # Check if running as root for system-wide installation
- if [[ "$USER_INSTALL" == false && $EUID -ne 0 ]]; then
- log_warn "System-wide installation requires root privileges"
- log_warn "Run with sudo or use --user for user-specific installation"
- exit 1
- fi
- # Create temporary directory
- TEMP_DIR=$(mktemp -d)
- if [[ "$VERBOSE" == true ]]; then
- log_info "Using temporary directory: $TEMP_DIR"
- fi
- cd "$TEMP_DIR"
- # Determine download URL
- if [[ "$VERSION" == "latest" ]]; then
- log_info "Fetching latest release information..."
- LATEST_RELEASE=$(curl -s https://api.github.com/repos/logseq/logseq/releases/latest)
- DOWNLOAD_URL=$(echo "$LATEST_RELEASE" | grep -o '"browser_download_url": "[^"]*Logseq-linux-x64-[^"]*\.zip"' | cut -d'"' -f4)
-
- if [[ -z "$DOWNLOAD_URL" ]]; then
- log_error "Could not find download URL for latest version"
- exit 1
- fi
- else
- DOWNLOAD_URL="https://github.com/logseq/logseq/releases/download/${VERSION}/Logseq-linux-x64-${VERSION}.zip"
- fi
- log_info "Download URL: $DOWNLOAD_URL"
- # Download Logseq
- log_info "Downloading Logseq..."
- if ! wget -q --show-progress -O logseq.zip "$DOWNLOAD_URL"; then
- log_error "Failed to download Logseq $VERSION"
- log_error "Please check if version $VERSION exists on GitHub releases"
- rm -rf "$TEMP_DIR"
- exit 1
- fi
- # Extract archive
- log_info "Extracting archive..."
- unzip -q logseq.zip
- # Find the extracted directory
- EXTRACTED_DIR=$(find . -maxdepth 2 -type d -name "Logseq-linux-x64*" | head -1)
- if [[ -z "$EXTRACTED_DIR" ]]; then
- log_error "Could not find extracted Logseq directory"
- rm -rf "$TEMP_DIR"
- exit 1
- fi
- # Install files
- log_info "Installing files..."
- if [[ "$USER_INSTALL" == false ]]; then
- mkdir -p "$INSTALL_DIR"
- cp -r "$EXTRACTED_DIR"/* "$INSTALL_DIR/"
- chmod +x "$INSTALL_DIR/Logseq"
- ln -sf "$INSTALL_DIR/Logseq" "$BIN_DIR/logseq"
- else
- mkdir -p "$INSTALL_DIR"
- cp -r "$EXTRACTED_DIR"/* "$INSTALL_DIR/"
- chmod +x "$INSTALL_DIR/Logseq"
- ln -sf "$INSTALL_DIR/Logseq" "$BIN_DIR/logseq"
- fi
- # Fix sandbox permissions
- if [[ "$USER_INSTALL" == false && -f "$INSTALL_DIR/chrome-sandbox" ]]; then
- log_info "Setting sandbox permissions..."
- chown root:root "$INSTALL_DIR/chrome-sandbox"
- chmod 4755 "$INSTALL_DIR/chrome-sandbox"
- fi
- # Desktop integration
- if [[ "$SKIP_DESKTOP" == false ]]; then
- log_info "Creating desktop integration..."
- DESKTOP_FILE="/usr/share/applications/logseq.desktop"
- if [[ "$USER_INSTALL" == true ]]; then
- mkdir -p ~/.local/share/applications/
- DESKTOP_FILE="$HOME/.local/share/applications/logseq.desktop"
- fi
- # Copy icon to standard location
- ICON_DIR="/usr/share/icons/hicolor/512x512/apps/"
- if [[ "$USER_INSTALL" == true ]]; then
- ICON_DIR="$HOME/.local/share/icons/hicolor/512x512/apps/"
- mkdir -p "$ICON_DIR"
- fi
-
- # Create desktop file
- cat > "$DESKTOP_FILE" << DESKTOP_EOF
- [Desktop Entry]
- Version=1.0
- Name=Logseq
- Comment=Logseq - A privacy-first, open-source platform for knowledge management and collaboration
- Exec=$INSTALL_DIR/Logseq $([ "$USER_INSTALL" = true ] && echo "--no-sandbox") %U
- Icon=$ICON_DIR/logseq.png
- Terminal=false
- Type=Application
- Categories=Office;Productivity;Utility;TextEditor;
- MimeType=application/x-logseq;
- StartupWMClass=Logseq
- DESKTOP_EOF
-
- # Make desktop file executable
- chmod +x "$DESKTOP_FILE"
-
- if [[ -f "$INSTALL_DIR/resources/app.asar.unpacked/dist/icon.png" ]]; then
-
- cp "$INSTALL_DIR/resources/app.asar.unpacked/dist/icon.png" "$ICON_DIR/logseq.png"
-
- # Update desktop file to use the copied icon
- if [[ "$USER_INSTALL" == false ]]; then
- sed -i 's|Icon=$INSTALL_DIR/resources/app.asar.unpacked/dist/icon.png|Icon=logseq|' "$DESKTOP_FILE"
- fi
- fi
- if [[ "$USER_INSTALL" == true && -f "$INSTALL_DIR/resources/app/icon.png" ]]; then
- cp "$INSTALL_DIR/resources/app/icon.png" "$ICON_DIR/logseq.png"
- fi
-
- # Update desktop database
- if [[ "$USER_INSTALL" == false ]]; then
- update-desktop-database /usr/share/applications/ 2>/dev/null || true
- else
- update-desktop-database ~/.local/share/applications/ 2>/dev/null || true
- fi
- fi
- # Clean up
- rm -rf "$TEMP_DIR"
- # Verify installation
- if command -v logseq >/dev/null 2>&1; then
- INSTALLED_VERSION=$(logseq --version 2>/dev/null | head -1 || echo "unknown")
- log_info "Logseq installed successfully!"
- log_info "Version: $INSTALLED_VERSION"
- log_info "Location: $INSTALL_DIR"
- log_info "Command: logseq"
-
- if [[ "$SKIP_DESKTOP" == false ]]; then
- log_info "Desktop integration: Enabled"
- log_info "You can find Logseq in your applications menu"
- fi
- else
- log_error "Installation completed but 'logseq' command not found in PATH"
- log_info "You may need to restart your terminal or add $BIN_DIR to your PATH"
- fi
- log_info "Installation completed successfully!"
|