| 1 | #!/bin/bash |
| 2 | set -euo pipefail |
| 3 | |
| 4 | # Configuration |
| 5 | DISK_SIZE_MB="${OPENHUB_DISK_SIZE_MB:-1024}" # Total disk limit (default 1 GiB) |
| 6 | DATA_DIR="/srv/openhub" |
| 7 | DISK_IMG="/srv/openhub.img" |
| 8 | |
| 9 | echo "=== openhub setup ===" |
| 10 | |
| 11 | # 1. Create service user |
| 12 | if ! id openhub &>/dev/null; then |
| 13 | echo "Creating openhub user..." |
| 14 | useradd --system --shell /usr/sbin/nologin --home-dir "$DATA_DIR" openhub |
| 15 | fi |
| 16 | |
| 17 | # 2. Create fixed-size loopback filesystem for disk quota |
| 18 | if [ ! -f "$DISK_IMG" ]; then |
| 19 | echo "Creating ${DISK_SIZE_MB}MB disk image at $DISK_IMG..." |
| 20 | dd if=/dev/zero of="$DISK_IMG" bs=1M count="$DISK_SIZE_MB" status=progress |
| 21 | mkfs.ext4 -m 0 "$DISK_IMG" |
| 22 | fi |
| 23 | |
| 24 | mkdir -p "$DATA_DIR" |
| 25 | |
| 26 | # Mount if not already mounted |
| 27 | if ! mountpoint -q "$DATA_DIR"; then |
| 28 | echo "Mounting disk image..." |
| 29 | mount -o loop "$DISK_IMG" "$DATA_DIR" |
| 30 | fi |
| 31 | |
| 32 | # Add fstab entry if missing |
| 33 | if ! grep -q "$DISK_IMG" /etc/fstab; then |
| 34 | echo "$DISK_IMG $DATA_DIR ext4 loop,defaults 0 0" >> /etc/fstab |
| 35 | echo "Added fstab entry." |
| 36 | fi |
| 37 | |
| 38 | # 3. Create directories |
| 39 | mkdir -p "$DATA_DIR/repos" |
| 40 | chown -R openhub:openhub "$DATA_DIR" |
| 41 | |
| 42 | # 4. Build and install binaries |
| 43 | echo "Building release binaries..." |
| 44 | SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" |
| 45 | PROJECT_DIR="$(dirname "$SCRIPT_DIR")" |
| 46 | |
| 47 | # Need DATABASE_URL for sqlx compile-time checks |
| 48 | if [ ! -f "$DATA_DIR/openhub.db" ]; then |
| 49 | echo "Initializing database..." |
| 50 | sqlite3 "$DATA_DIR/openhub.db" < "$PROJECT_DIR/migrations/0001_init.sql" |
| 51 | chown openhub:openhub "$DATA_DIR/openhub.db" |
| 52 | fi |
| 53 | |
| 54 | export DATABASE_URL="sqlite:$DATA_DIR/openhub.db" |
| 55 | cd "$PROJECT_DIR" |
| 56 | cargo build --release |
| 57 | |
| 58 | echo "Installing binaries..." |
| 59 | install -m 755 target/release/openhub /usr/local/bin/openhub |
| 60 | install -m 755 target/release/git-quota-hook /usr/local/bin/git-quota-hook |
| 61 | |
| 62 | # 5. Install systemd unit |
| 63 | install -m 644 deploy/openhub.service /etc/systemd/system/openhub.service |
| 64 | systemctl daemon-reload |
| 65 | systemctl enable openhub |
| 66 | |
| 67 | echo "" |
| 68 | echo "=== Setup complete ===" |
| 69 | echo "Disk limit: ${DISK_SIZE_MB}MB at $DATA_DIR" |
| 70 | echo "" |
| 71 | echo "Start with: systemctl start openhub" |
| 72 | echo "Logs: journalctl -u openhub -f" |
| 73 | echo "Status: systemctl status openhub" |