157 lines
4.9 KiB
Bash
Executable File
157 lines
4.9 KiB
Bash
Executable File
#!/bin/bash
|
|
# Info: Script to install Radicle
|
|
# Author: Provisioning System
|
|
# Release: 1.0
|
|
# Date: 2025-07-24
|
|
|
|
USAGE="install-radicle.sh"
|
|
[ "$1" == "-h" ] && echo "$USAGE" && exit 1
|
|
|
|
[ -r "env-radicle" ] && . ./env-radicle
|
|
|
|
RADICLE_VERSION=${RADICLE_VERSION:-1.0.0}
|
|
|
|
RADICLE_URL=https://github.com/radicle-dev/radicle-node/releases/download
|
|
ARCH="$(uname -m | sed -e 's/x86_64/x86_64/' -e 's/aarch64$/aarch64/')"
|
|
RADICLE_FILE=v${RADICLE_VERSION}/radicle-node-v${RADICLE_VERSION}-${ARCH}-unknown-linux-gnu.tar.xz
|
|
RADICLE_ARCHIVE=radicle-node-v${RADICLE_VERSION}-${ARCH}-unknown-linux-gnu.tar.xz
|
|
|
|
RADICLE_RUN_PATH=${RADICLE_RUN_PATH:-/usr/local/bin}
|
|
RADICLE_SYSTEMCTL_MODE=${RADICLE_SYSTEMCTL_MODE:-enabled}
|
|
|
|
RADICLE_CONFIG_PATH=${RADICLE_CONFIG_PATH:-/etc/radicle}
|
|
RADICLE_WORK_PATH=${RADICLE_WORK_PATH:-/var/lib/radicle}
|
|
RADICLE_STORAGE_PATH=${RADICLE_STORAGE_PATH:-/var/lib/radicle/storage}
|
|
|
|
RADICLE_RUN_USER=${RADICLE_RUN_USER:-radicle}
|
|
RADICLE_RUN_GROUP=${RADICLE_RUN_GROUP:-radicle}
|
|
RADICLE_RUN_USER_HOME=${RADICLE_RUN_USER_HOME:-/home/radicle}
|
|
|
|
RADICLE_BIND_ADDR=${RADICLE_BIND_ADDR:-0.0.0.0}
|
|
RADICLE_BIND_PORT=${RADICLE_BIND_PORT:-8776}
|
|
RADICLE_PEER_PORT=${RADICLE_PEER_PORT:-8777}
|
|
RADICLE_WEB_UI_PORT=${RADICLE_WEB_UI_PORT:-8080}
|
|
|
|
RADICLE_LOG_LEVEL=${RADICLE_LOG_LEVEL:-info}
|
|
|
|
echo "Installing Radicle ${RADICLE_VERSION}..."
|
|
|
|
# Create user and group
|
|
if ! id "$RADICLE_RUN_USER" &>/dev/null; then
|
|
groupadd -r "$RADICLE_RUN_GROUP"
|
|
useradd -r -g "$RADICLE_RUN_GROUP" -d "$RADICLE_RUN_USER_HOME" -s /bin/bash -c "Radicle service user" "$RADICLE_RUN_USER"
|
|
fi
|
|
|
|
# Create directories
|
|
mkdir -p "$RADICLE_CONFIG_PATH"
|
|
mkdir -p "$RADICLE_WORK_PATH"
|
|
mkdir -p "$RADICLE_STORAGE_PATH"
|
|
mkdir -p "$RADICLE_RUN_USER_HOME"
|
|
|
|
# Download and install Radicle
|
|
cd /tmp
|
|
echo "Downloading Radicle from ${RADICLE_URL}/${RADICLE_FILE}..."
|
|
curl -L -o "$RADICLE_ARCHIVE" "${RADICLE_URL}/${RADICLE_FILE}"
|
|
|
|
if [ ! -f "$RADICLE_ARCHIVE" ]; then
|
|
echo "Failed to download Radicle archive"
|
|
exit 1
|
|
fi
|
|
|
|
# Extract and install binaries
|
|
echo "Extracting Radicle..."
|
|
tar -xf "$RADICLE_ARCHIVE"
|
|
EXTRACT_DIR=$(tar -tf "$RADICLE_ARCHIVE" | head -1 | cut -f1 -d"/")
|
|
cd "$EXTRACT_DIR"
|
|
|
|
# Install binaries
|
|
cp rad "$RADICLE_RUN_PATH/"
|
|
cp radicle-node "$RADICLE_RUN_PATH/"
|
|
cp radicle-httpd "$RADICLE_RUN_PATH/"
|
|
|
|
# Make binaries executable
|
|
chmod +x "$RADICLE_RUN_PATH/rad"
|
|
chmod +x "$RADICLE_RUN_PATH/radicle-node"
|
|
chmod +x "$RADICLE_RUN_PATH/radicle-httpd"
|
|
|
|
# Set ownership
|
|
chown -R "$RADICLE_RUN_USER:$RADICLE_RUN_GROUP" "$RADICLE_WORK_PATH"
|
|
chown -R "$RADICLE_RUN_USER:$RADICLE_RUN_GROUP" "$RADICLE_STORAGE_PATH"
|
|
chown -R "$RADICLE_RUN_USER:$RADICLE_RUN_GROUP" "$RADICLE_RUN_USER_HOME"
|
|
chown -R "$RADICLE_RUN_USER:$RADICLE_RUN_GROUP" "$RADICLE_CONFIG_PATH"
|
|
|
|
# Initialize Radicle node if not already initialized
|
|
if [ ! -f "$RADICLE_STORAGE_PATH/node.json" ]; then
|
|
echo "Initializing Radicle node..."
|
|
sudo -u "$RADICLE_RUN_USER" RAD_HOME="$RADICLE_WORK_PATH" "$RADICLE_RUN_PATH/rad" auth --init
|
|
fi
|
|
|
|
# Create systemd service file
|
|
cat > /etc/systemd/system/radicle-node.service << EOF
|
|
[Unit]
|
|
Description=Radicle Node
|
|
After=network.target
|
|
|
|
[Service]
|
|
Type=simple
|
|
User=$RADICLE_RUN_USER
|
|
Group=$RADICLE_RUN_GROUP
|
|
Environment=RAD_HOME=$RADICLE_WORK_PATH
|
|
WorkingDirectory=$RADICLE_WORK_PATH
|
|
ExecStart=$RADICLE_RUN_PATH/radicle-node --listen $RADICLE_BIND_ADDR:$RADICLE_PEER_PORT --log $RADICLE_LOG_LEVEL
|
|
Restart=always
|
|
RestartSec=10
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
EOF
|
|
|
|
# Create systemd service file for HTTP daemon
|
|
if [ "${RADICLE_HTTPD_ENABLED:-true}" = "true" ]; then
|
|
cat > /etc/systemd/system/radicle-httpd.service << EOF
|
|
[Unit]
|
|
Description=Radicle HTTP Daemon
|
|
After=network.target radicle-node.service
|
|
Requires=radicle-node.service
|
|
|
|
[Service]
|
|
Type=simple
|
|
User=$RADICLE_RUN_USER
|
|
Group=$RADICLE_RUN_GROUP
|
|
Environment=RAD_HOME=$RADICLE_WORK_PATH
|
|
WorkingDirectory=$RADICLE_WORK_PATH
|
|
ExecStart=$RADICLE_RUN_PATH/radicle-httpd --listen ${RADICLE_HTTPD_BIND_ADDR:-$RADICLE_BIND_ADDR}:${RADICLE_HTTPD_BIND_PORT:-$RADICLE_WEB_UI_PORT}
|
|
Restart=always
|
|
RestartSec=10
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
EOF
|
|
|
|
# Enable and start HTTP daemon service
|
|
systemctl daemon-reload
|
|
systemctl "$RADICLE_SYSTEMCTL_MODE" radicle-httpd.service
|
|
if [ "$RADICLE_SYSTEMCTL_MODE" = "enabled" ]; then
|
|
systemctl start radicle-httpd.service
|
|
fi
|
|
fi
|
|
|
|
# Enable and start node service
|
|
systemctl daemon-reload
|
|
systemctl "$RADICLE_SYSTEMCTL_MODE" radicle-node.service
|
|
|
|
if [ "$RADICLE_SYSTEMCTL_MODE" = "enabled" ]; then
|
|
systemctl start radicle-node.service
|
|
fi
|
|
|
|
# Cleanup
|
|
cd /
|
|
rm -rf /tmp/"$RADICLE_ARCHIVE" /tmp/"$EXTRACT_DIR"
|
|
|
|
echo "Radicle installation completed!"
|
|
echo "Node service: radicle-node.service"
|
|
if [ "${RADICLE_HTTPD_ENABLED:-true}" = "true" ]; then
|
|
echo "HTTP daemon service: radicle-httpd.service"
|
|
echo "Web UI available at: http://${RADICLE_HTTPD_BIND_ADDR:-$RADICLE_BIND_ADDR}:${RADICLE_HTTPD_BIND_PORT:-$RADICLE_WEB_UI_PORT}"
|
|
fi
|
|
echo "Storage path: $RADICLE_STORAGE_PATH" |