forgejo-actions-guide-docker.txt
· 10 KiB · Text
Raw
#!/bin/bash
# =============================================================================
# FORGEJO RUNNER - FULL SYSTEM DEPLOYMENT WITH SYSTEMD
# Supports both DIRECT and DOCKER modes
# =============================================================================
# --- CONFIGURATION VARIABLES ---
FORGEJO_URL="https://your-forgejo-domain.com" # CHANGE THIS
REGISTRATION_TOKEN="your-registration-token" # CHANGE THIS
RUNNER_NAME="selfhosted-runner-01"
RUNNER_VERSION="latest" # Can be "latest" or specific like "v4.0.0"
RUNNER_MODE="direct" # "direct" or "docker"
# Direct mode variables
RUNNER_USER="forgejo-runner"
RUNNER_HOME="/opt/forgejo-runner"
# Docker mode variables
COMPOSE_DIR="$HOME/forgejo-runner"
DIND_IMAGE="docker:dind"
RUNNER_IMAGE="data.forgejo.org/forgejo/runner"
# =============================================================================
set -e
echo "============================================================"
echo "FORGEJO RUNNER DEPLOYMENT"
echo "============================================================"
echo "Mode: $RUNNER_MODE"
echo "Version: $RUNNER_VERSION"
echo "Instance: $FORGEJO_URL"
echo ""
# --- STEP 1: Detect system architecture ---
ARCH=$(uname -m)
case $ARCH in
x86_64)
ARCH="amd64"
;;
aarch64|arm64)
ARCH="arm64"
;;
armv7l|armhf)
ARCH="armv7"
;;
*)
echo "Unsupported architecture: $ARCH"
exit 1
;;
esac
echo "Detected architecture: $ARCH"
# --- STEP 2: Get actual version if "latest" ---
if [ "$RUNNER_VERSION" = "latest" ]; then
echo "Fetching latest version..."
RUNNER_VERSION=$(curl -s https://code.forgejo.org/forgejo/runner/releases/latest | \
grep -o 'v[0-9]\+\.[0-9]\+\.[0-9]\+' | head -1)
if [ -z "$RUNNER_VERSION" ]; then
echo "Failed to fetch latest version, using fallback v4.0.0"
RUNNER_VERSION="v4.0.0"
fi
echo "Latest version: $RUNNER_VERSION"
fi
# --- STEP 3: Check Docker ---
echo "Checking Docker..."
if ! command -v docker &> /dev/null; then
echo "ERROR: Docker is not installed. Please install Docker first."
exit 1
fi
if ! systemctl is-active --quiet docker; then
echo "ERROR: Docker service is not running."
echo "Start it with: sudo systemctl start docker"
exit 1
fi
echo "Docker is running as systemd service"
echo ""
# =============================================================================
# DIRECT MODE INSTALLATION
# =============================================================================
if [ "$RUNNER_MODE" = "direct" ]; then
echo "=== DIRECT MODE INSTALLATION ==="
echo ""
# --- Create runner user ---
echo "Creating runner user..."
if ! id "$RUNNER_USER" &>/dev/null; then
sudo useradd -r -m -d "$RUNNER_HOME" -s /bin/bash "$RUNNER_USER"
sudo usermod -aG docker "$RUNNER_USER"
else
echo "User $RUNNER_USER already exists"
sudo usermod -aG docker "$RUNNER_USER"
fi
# --- Download runner binary ---
echo "Downloading Forgejo runner binary..."
sudo -u "$RUNNER_USER" mkdir -p "$RUNNER_HOME/bin"
VERSION_NUM=${RUNNER_VERSION#v}
DOWNLOAD_URL="https://code.forgejo.org/forgejo/runner/releases/download/$RUNNER_VERSION/forgejo-runner-${VERSION_NUM}-linux-$ARCH"
echo "Downloading from: $DOWNLOAD_URL"
sudo -u "$RUNNER_USER" curl -L "$DOWNLOAD_URL" -o "$RUNNER_HOME/bin/forgejo-runner"
sudo chmod +x "$RUNNER_HOME/bin/forgejo-runner"
sudo chown -R "$RUNNER_USER":"$RUNNER_USER" "$RUNNER_HOME"
# --- Register runner ---
echo "Registering runner with Forgejo..."
sudo -u "$RUNNER_USER" "$RUNNER_HOME/bin/forgejo-runner" register \
--token "$REGISTRATION_TOKEN" \
--name "$RUNNER_NAME" \
--instance "$FORGEJO_URL" \
--labels docker:docker://node:20-bookworm \
--no-interactive
# --- Create config.yaml ---
echo "Creating configuration..."
sudo -u "$RUNNER_USER" tee "$RUNNER_HOME/config.yaml" > /dev/null << 'EOF'
log:
level: info
runner:
file: .runner
envs:
DOCKER_HOST: unix:///var/run/docker.sock
cache:
enabled: false
dir: /opt/forgejo-runner/cache
fetch_interval: 30
fetch_timeout: 30s
docker:
host: unix:///var/run/docker.sock
privileged: false
options: >-
-v /var/run/docker.sock:/var/run/docker.sock
--add-host=host.docker.internal:host-gateway
container:
network: host
options: >-
--add-host=host.docker.internal:host-gateway
volumes:
- /opt/forgejo-runner/cache:/cache
- /var/run/docker.sock:/var/run/docker.sock
EOF
# --- Create systemd service ---
echo "Creating systemd service..."
sudo tee /etc/systemd/system/forgejo-runner.service > /dev/null << EOF
[Unit]
Description=Forgejo Actions Runner
After=docker.service
Requires=docker.service
[Service]
Type=simple
User=$RUNNER_USER
Group=$RUNNER_USER
WorkingDirectory=$RUNNER_HOME
ExecStart=$RUNNER_HOME/bin/forgejo-runner daemon --config $RUNNER_HOME/config.yaml
Restart=always
RestartSec=10
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=65536
LimitNPROC=65536
[Install]
WantedBy=multi-user.target
EOF
# --- Enable and start service ---
echo "Starting service..."
sudo systemctl daemon-reload
sudo systemctl enable forgejo-runner.service
sudo systemctl start forgejo-runner.service
echo ""
echo "=== DIRECT MODE DEPLOYMENT COMPLETE ==="
echo ""
echo "Service status:"
sudo systemctl status forgejo-runner.service --no-pager
echo ""
echo "To view logs:"
echo " sudo journalctl -u forgejo-runner -f"
echo ""
echo "Runner location: $RUNNER_HOME"
# =============================================================================
# DOCKER MODE INSTALLATION
# =============================================================================
elif [ "$RUNNER_MODE" = "docker" ]; then
echo "=== DOCKER MODE INSTALLATION ==="
echo ""
# --- Create working directory ---
echo "Creating working directory..."
mkdir -p "$COMPOSE_DIR"/{data,cache}
cd "$COMPOSE_DIR"
# --- Register runner using Docker ---
echo "Registering runner with Forgejo..."
docker run -it --rm \
-v "$(pwd)/data:/data" \
-w /data \
--user root \
"${RUNNER_IMAGE}:${RUNNER_VERSION#v}" \
forgejo-runner register \
--no-interactive \
--token "$REGISTRATION_TOKEN" \
--name "$RUNNER_NAME" \
--instance "$FORGEJO_URL" \
--labels "$RUNNER_NAME:host"
# --- Generate config.yaml ---
echo "Generating configuration..."
docker run --rm \
-v "$(pwd)/data:/data" \
-w /data \
"${RUNNER_IMAGE}:${RUNNER_VERSION#v}" \
forgejo-runner generate-config > data/config.yaml
# --- Customize config.yaml ---
echo "Customizing configuration..."
cat > data/config.yaml << EOF
instance: $FORGEJO_URL
token: "$REGISTRATION_TOKEN"
log:
level: info
runner:
file: .runner
capacity: 1
timeout: 30m
shutdown_timeout: 30m
insecure: true
fetch_timeout: 30s
fetch_interval: 60s
report_interval: 10s
labels:
- "$RUNNER_NAME:host"
cache:
enabled: true
dir: ""
container:
privileged: false
valid_volumes:
- '**'
docker_host: ""
force_pull: false
host:
workdir_parent: ""
EOF
# --- Create docker-compose.yml ---
echo "Creating docker-compose.yml..."
cat > docker-compose.yml << EOF
version: '3.8'
services:
docker-in-docker:
image: $DIND_IMAGE
container_name: ${RUNNER_NAME}_dind
privileged: true
command: ['dockerd', '-H', 'tcp://0.0.0.0:2375', '--tls=false']
restart: unless-stopped
volumes:
- dind-storage:/var/lib/docker
runner:
image: ${RUNNER_IMAGE}:${RUNNER_VERSION#v}
container_name: ${RUNNER_NAME}
depends_on:
docker-in-docker:
condition: service_started
environment:
DOCKER_HOST: tcp://docker-in-docker:2375
user: 0:0
volumes:
- ./data:/data
- ./cache:/cache
restart: unless-stopped
command: /bin/sh -c "
apk update && apk add --no-cache nodejs npm &&
sleep 5 &&
forgejo-runner daemon --config /data/config.yaml
"
volumes:
dind-storage:
EOF
# --- Create systemd service for docker-compose ---
echo "Creating systemd service..."
sudo tee /etc/systemd/system/forgejo-runner-docker.service > /dev/null << EOF
[Unit]
Description=Forgejo Runner (Docker Compose)
After=docker.service
Requires=docker.service
[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=$COMPOSE_DIR
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down
ExecReload=/usr/bin/docker compose restart
StandardOutput=journal
User=$USER
Group=$USER
[Install]
WantedBy=multi-user.target
EOF
# --- Enable and start service ---
echo "Starting service..."
sudo systemctl daemon-reload
sudo systemctl enable forgejo-runner-docker.service
sudo systemctl start forgejo-runner-docker.service
echo ""
echo "=== DOCKER MODE DEPLOYMENT COMPLETE ==="
echo ""
echo "Service status:"
sudo systemctl status forgejo-runner-docker.service --no-pager
echo ""
echo "To view logs:"
echo " docker compose -f $COMPOSE_DIR/docker-compose.yml logs -f runner"
echo ""
echo "To manage:"
echo " cd $COMPOSE_DIR"
echo " docker compose up -d # start"
echo " docker compose down # stop"
echo " docker compose restart # restart"
echo ""
echo "Runner location: $COMPOSE_DIR"
# =============================================================================
# INVALID MODE
# =============================================================================
else
echo "ERROR: Invalid RUNNER_MODE. Use 'direct' or 'docker'"
exit 1
fi
echo ""
echo "============================================================"
echo "DEPLOYMENT COMPLETE"
echo "============================================================"
echo ""
echo "Runner should now appear online in Forgejo Admin -> Actions -> Runners"
echo "URL: $FORGEJO_URL/admin/actions/runners"
echo ""
echo "If runner shows offline, check:"
echo " - Registration token is valid"
echo " - Forgejo URL is accessible"
echo " - Docker is running: sudo systemctl status docker"
echo "============================================================"
| 1 | #!/bin/bash |
| 2 | # ============================================================================= |
| 3 | # FORGEJO RUNNER - FULL SYSTEM DEPLOYMENT WITH SYSTEMD |
| 4 | # Supports both DIRECT and DOCKER modes |
| 5 | # ============================================================================= |
| 6 | |
| 7 | # --- CONFIGURATION VARIABLES --- |
| 8 | FORGEJO_URL="https://your-forgejo-domain.com" # CHANGE THIS |
| 9 | REGISTRATION_TOKEN="your-registration-token" # CHANGE THIS |
| 10 | RUNNER_NAME="selfhosted-runner-01" |
| 11 | RUNNER_VERSION="latest" # Can be "latest" or specific like "v4.0.0" |
| 12 | RUNNER_MODE="direct" # "direct" or "docker" |
| 13 | |
| 14 | # Direct mode variables |
| 15 | RUNNER_USER="forgejo-runner" |
| 16 | RUNNER_HOME="/opt/forgejo-runner" |
| 17 | |
| 18 | # Docker mode variables |
| 19 | COMPOSE_DIR="$HOME/forgejo-runner" |
| 20 | DIND_IMAGE="docker:dind" |
| 21 | RUNNER_IMAGE="data.forgejo.org/forgejo/runner" |
| 22 | # ============================================================================= |
| 23 | |
| 24 | set -e |
| 25 | |
| 26 | echo "============================================================" |
| 27 | echo "FORGEJO RUNNER DEPLOYMENT" |
| 28 | echo "============================================================" |
| 29 | echo "Mode: $RUNNER_MODE" |
| 30 | echo "Version: $RUNNER_VERSION" |
| 31 | echo "Instance: $FORGEJO_URL" |
| 32 | echo "" |
| 33 | |
| 34 | # --- STEP 1: Detect system architecture --- |
| 35 | ARCH=$(uname -m) |
| 36 | case $ARCH in |
| 37 | x86_64) |
| 38 | ARCH="amd64" |
| 39 | ;; |
| 40 | aarch64|arm64) |
| 41 | ARCH="arm64" |
| 42 | ;; |
| 43 | armv7l|armhf) |
| 44 | ARCH="armv7" |
| 45 | ;; |
| 46 | *) |
| 47 | echo "Unsupported architecture: $ARCH" |
| 48 | exit 1 |
| 49 | ;; |
| 50 | esac |
| 51 | echo "Detected architecture: $ARCH" |
| 52 | |
| 53 | # --- STEP 2: Get actual version if "latest" --- |
| 54 | if [ "$RUNNER_VERSION" = "latest" ]; then |
| 55 | echo "Fetching latest version..." |
| 56 | RUNNER_VERSION=$(curl -s https://code.forgejo.org/forgejo/runner/releases/latest | \ |
| 57 | grep -o 'v[0-9]\+\.[0-9]\+\.[0-9]\+' | head -1) |
| 58 | if [ -z "$RUNNER_VERSION" ]; then |
| 59 | echo "Failed to fetch latest version, using fallback v4.0.0" |
| 60 | RUNNER_VERSION="v4.0.0" |
| 61 | fi |
| 62 | echo "Latest version: $RUNNER_VERSION" |
| 63 | fi |
| 64 | |
| 65 | # --- STEP 3: Check Docker --- |
| 66 | echo "Checking Docker..." |
| 67 | if ! command -v docker &> /dev/null; then |
| 68 | echo "ERROR: Docker is not installed. Please install Docker first." |
| 69 | exit 1 |
| 70 | fi |
| 71 | |
| 72 | if ! systemctl is-active --quiet docker; then |
| 73 | echo "ERROR: Docker service is not running." |
| 74 | echo "Start it with: sudo systemctl start docker" |
| 75 | exit 1 |
| 76 | fi |
| 77 | echo "Docker is running as systemd service" |
| 78 | echo "" |
| 79 | |
| 80 | # ============================================================================= |
| 81 | # DIRECT MODE INSTALLATION |
| 82 | # ============================================================================= |
| 83 | if [ "$RUNNER_MODE" = "direct" ]; then |
| 84 | echo "=== DIRECT MODE INSTALLATION ===" |
| 85 | echo "" |
| 86 | |
| 87 | # --- Create runner user --- |
| 88 | echo "Creating runner user..." |
| 89 | if ! id "$RUNNER_USER" &>/dev/null; then |
| 90 | sudo useradd -r -m -d "$RUNNER_HOME" -s /bin/bash "$RUNNER_USER" |
| 91 | sudo usermod -aG docker "$RUNNER_USER" |
| 92 | else |
| 93 | echo "User $RUNNER_USER already exists" |
| 94 | sudo usermod -aG docker "$RUNNER_USER" |
| 95 | fi |
| 96 | |
| 97 | # --- Download runner binary --- |
| 98 | echo "Downloading Forgejo runner binary..." |
| 99 | sudo -u "$RUNNER_USER" mkdir -p "$RUNNER_HOME/bin" |
| 100 | |
| 101 | VERSION_NUM=${RUNNER_VERSION#v} |
| 102 | DOWNLOAD_URL="https://code.forgejo.org/forgejo/runner/releases/download/$RUNNER_VERSION/forgejo-runner-${VERSION_NUM}-linux-$ARCH" |
| 103 | |
| 104 | echo "Downloading from: $DOWNLOAD_URL" |
| 105 | sudo -u "$RUNNER_USER" curl -L "$DOWNLOAD_URL" -o "$RUNNER_HOME/bin/forgejo-runner" |
| 106 | sudo chmod +x "$RUNNER_HOME/bin/forgejo-runner" |
| 107 | sudo chown -R "$RUNNER_USER":"$RUNNER_USER" "$RUNNER_HOME" |
| 108 | |
| 109 | # --- Register runner --- |
| 110 | echo "Registering runner with Forgejo..." |
| 111 | sudo -u "$RUNNER_USER" "$RUNNER_HOME/bin/forgejo-runner" register \ |
| 112 | --token "$REGISTRATION_TOKEN" \ |
| 113 | --name "$RUNNER_NAME" \ |
| 114 | --instance "$FORGEJO_URL" \ |
| 115 | --labels docker:docker://node:20-bookworm \ |
| 116 | --no-interactive |
| 117 | |
| 118 | # --- Create config.yaml --- |
| 119 | echo "Creating configuration..." |
| 120 | sudo -u "$RUNNER_USER" tee "$RUNNER_HOME/config.yaml" > /dev/null << 'EOF' |
| 121 | log: |
| 122 | level: info |
| 123 | |
| 124 | runner: |
| 125 | file: .runner |
| 126 | envs: |
| 127 | DOCKER_HOST: unix:///var/run/docker.sock |
| 128 | cache: |
| 129 | enabled: false |
| 130 | dir: /opt/forgejo-runner/cache |
| 131 | fetch_interval: 30 |
| 132 | fetch_timeout: 30s |
| 133 | |
| 134 | docker: |
| 135 | host: unix:///var/run/docker.sock |
| 136 | privileged: false |
| 137 | options: >- |
| 138 | -v /var/run/docker.sock:/var/run/docker.sock |
| 139 | --add-host=host.docker.internal:host-gateway |
| 140 | |
| 141 | container: |
| 142 | network: host |
| 143 | options: >- |
| 144 | --add-host=host.docker.internal:host-gateway |
| 145 | volumes: |
| 146 | - /opt/forgejo-runner/cache:/cache |
| 147 | - /var/run/docker.sock:/var/run/docker.sock |
| 148 | EOF |
| 149 | |
| 150 | # --- Create systemd service --- |
| 151 | echo "Creating systemd service..." |
| 152 | sudo tee /etc/systemd/system/forgejo-runner.service > /dev/null << EOF |
| 153 | [Unit] |
| 154 | Description=Forgejo Actions Runner |
| 155 | After=docker.service |
| 156 | Requires=docker.service |
| 157 | |
| 158 | [Service] |
| 159 | Type=simple |
| 160 | User=$RUNNER_USER |
| 161 | Group=$RUNNER_USER |
| 162 | WorkingDirectory=$RUNNER_HOME |
| 163 | ExecStart=$RUNNER_HOME/bin/forgejo-runner daemon --config $RUNNER_HOME/config.yaml |
| 164 | Restart=always |
| 165 | RestartSec=10 |
| 166 | StartLimitBurst=3 |
| 167 | StartLimitInterval=60s |
| 168 | LimitNOFILE=65536 |
| 169 | LimitNPROC=65536 |
| 170 | |
| 171 | [Install] |
| 172 | WantedBy=multi-user.target |
| 173 | EOF |
| 174 | |
| 175 | # --- Enable and start service --- |
| 176 | echo "Starting service..." |
| 177 | sudo systemctl daemon-reload |
| 178 | sudo systemctl enable forgejo-runner.service |
| 179 | sudo systemctl start forgejo-runner.service |
| 180 | |
| 181 | echo "" |
| 182 | echo "=== DIRECT MODE DEPLOYMENT COMPLETE ===" |
| 183 | echo "" |
| 184 | echo "Service status:" |
| 185 | sudo systemctl status forgejo-runner.service --no-pager |
| 186 | echo "" |
| 187 | echo "To view logs:" |
| 188 | echo " sudo journalctl -u forgejo-runner -f" |
| 189 | echo "" |
| 190 | echo "Runner location: $RUNNER_HOME" |
| 191 | |
| 192 | # ============================================================================= |
| 193 | # DOCKER MODE INSTALLATION |
| 194 | # ============================================================================= |
| 195 | elif [ "$RUNNER_MODE" = "docker" ]; then |
| 196 | echo "=== DOCKER MODE INSTALLATION ===" |
| 197 | echo "" |
| 198 | |
| 199 | # --- Create working directory --- |
| 200 | echo "Creating working directory..." |
| 201 | mkdir -p "$COMPOSE_DIR"/{data,cache} |
| 202 | cd "$COMPOSE_DIR" |
| 203 | |
| 204 | # --- Register runner using Docker --- |
| 205 | echo "Registering runner with Forgejo..." |
| 206 | docker run -it --rm \ |
| 207 | -v "$(pwd)/data:/data" \ |
| 208 | -w /data \ |
| 209 | --user root \ |
| 210 | "${RUNNER_IMAGE}:${RUNNER_VERSION#v}" \ |
| 211 | forgejo-runner register \ |
| 212 | --no-interactive \ |
| 213 | --token "$REGISTRATION_TOKEN" \ |
| 214 | --name "$RUNNER_NAME" \ |
| 215 | --instance "$FORGEJO_URL" \ |
| 216 | --labels "$RUNNER_NAME:host" |
| 217 | |
| 218 | # --- Generate config.yaml --- |
| 219 | echo "Generating configuration..." |
| 220 | docker run --rm \ |
| 221 | -v "$(pwd)/data:/data" \ |
| 222 | -w /data \ |
| 223 | "${RUNNER_IMAGE}:${RUNNER_VERSION#v}" \ |
| 224 | forgejo-runner generate-config > data/config.yaml |
| 225 | |
| 226 | # --- Customize config.yaml --- |
| 227 | echo "Customizing configuration..." |
| 228 | cat > data/config.yaml << EOF |
| 229 | instance: $FORGEJO_URL |
| 230 | token: "$REGISTRATION_TOKEN" |
| 231 | |
| 232 | log: |
| 233 | level: info |
| 234 | |
| 235 | runner: |
| 236 | file: .runner |
| 237 | capacity: 1 |
| 238 | timeout: 30m |
| 239 | shutdown_timeout: 30m |
| 240 | insecure: true |
| 241 | fetch_timeout: 30s |
| 242 | fetch_interval: 60s |
| 243 | report_interval: 10s |
| 244 | labels: |
| 245 | - "$RUNNER_NAME:host" |
| 246 | |
| 247 | cache: |
| 248 | enabled: true |
| 249 | dir: "" |
| 250 | |
| 251 | container: |
| 252 | privileged: false |
| 253 | valid_volumes: |
| 254 | - '**' |
| 255 | docker_host: "" |
| 256 | force_pull: false |
| 257 | |
| 258 | host: |
| 259 | workdir_parent: "" |
| 260 | EOF |
| 261 | |
| 262 | # --- Create docker-compose.yml --- |
| 263 | echo "Creating docker-compose.yml..." |
| 264 | cat > docker-compose.yml << EOF |
| 265 | version: '3.8' |
| 266 | |
| 267 | services: |
| 268 | docker-in-docker: |
| 269 | image: $DIND_IMAGE |
| 270 | container_name: ${RUNNER_NAME}_dind |
| 271 | privileged: true |
| 272 | command: ['dockerd', '-H', 'tcp://0.0.0.0:2375', '--tls=false'] |
| 273 | restart: unless-stopped |
| 274 | volumes: |
| 275 | - dind-storage:/var/lib/docker |
| 276 | |
| 277 | runner: |
| 278 | image: ${RUNNER_IMAGE}:${RUNNER_VERSION#v} |
| 279 | container_name: ${RUNNER_NAME} |
| 280 | depends_on: |
| 281 | docker-in-docker: |
| 282 | condition: service_started |
| 283 | environment: |
| 284 | DOCKER_HOST: tcp://docker-in-docker:2375 |
| 285 | user: 0:0 |
| 286 | volumes: |
| 287 | - ./data:/data |
| 288 | - ./cache:/cache |
| 289 | restart: unless-stopped |
| 290 | command: /bin/sh -c " |
| 291 | apk update && apk add --no-cache nodejs npm && |
| 292 | sleep 5 && |
| 293 | forgejo-runner daemon --config /data/config.yaml |
| 294 | " |
| 295 | |
| 296 | volumes: |
| 297 | dind-storage: |
| 298 | EOF |
| 299 | |
| 300 | # --- Create systemd service for docker-compose --- |
| 301 | echo "Creating systemd service..." |
| 302 | sudo tee /etc/systemd/system/forgejo-runner-docker.service > /dev/null << EOF |
| 303 | [Unit] |
| 304 | Description=Forgejo Runner (Docker Compose) |
| 305 | After=docker.service |
| 306 | Requires=docker.service |
| 307 | |
| 308 | [Service] |
| 309 | Type=oneshot |
| 310 | RemainAfterExit=yes |
| 311 | WorkingDirectory=$COMPOSE_DIR |
| 312 | ExecStart=/usr/bin/docker compose up -d |
| 313 | ExecStop=/usr/bin/docker compose down |
| 314 | ExecReload=/usr/bin/docker compose restart |
| 315 | StandardOutput=journal |
| 316 | User=$USER |
| 317 | Group=$USER |
| 318 | |
| 319 | [Install] |
| 320 | WantedBy=multi-user.target |
| 321 | EOF |
| 322 | |
| 323 | # --- Enable and start service --- |
| 324 | echo "Starting service..." |
| 325 | sudo systemctl daemon-reload |
| 326 | sudo systemctl enable forgejo-runner-docker.service |
| 327 | sudo systemctl start forgejo-runner-docker.service |
| 328 | |
| 329 | echo "" |
| 330 | echo "=== DOCKER MODE DEPLOYMENT COMPLETE ===" |
| 331 | echo "" |
| 332 | echo "Service status:" |
| 333 | sudo systemctl status forgejo-runner-docker.service --no-pager |
| 334 | echo "" |
| 335 | echo "To view logs:" |
| 336 | echo " docker compose -f $COMPOSE_DIR/docker-compose.yml logs -f runner" |
| 337 | echo "" |
| 338 | echo "To manage:" |
| 339 | echo " cd $COMPOSE_DIR" |
| 340 | echo " docker compose up -d # start" |
| 341 | echo " docker compose down # stop" |
| 342 | echo " docker compose restart # restart" |
| 343 | echo "" |
| 344 | echo "Runner location: $COMPOSE_DIR" |
| 345 | |
| 346 | # ============================================================================= |
| 347 | # INVALID MODE |
| 348 | # ============================================================================= |
| 349 | else |
| 350 | echo "ERROR: Invalid RUNNER_MODE. Use 'direct' or 'docker'" |
| 351 | exit 1 |
| 352 | fi |
| 353 | |
| 354 | echo "" |
| 355 | echo "============================================================" |
| 356 | echo "DEPLOYMENT COMPLETE" |
| 357 | echo "============================================================" |
| 358 | echo "" |
| 359 | echo "Runner should now appear online in Forgejo Admin -> Actions -> Runners" |
| 360 | echo "URL: $FORGEJO_URL/admin/actions/runners" |
| 361 | echo "" |
| 362 | echo "If runner shows offline, check:" |
| 363 | echo " - Registration token is valid" |
| 364 | echo " - Forgejo URL is accessible" |
| 365 | echo " - Docker is running: sudo systemctl status docker" |
| 366 | echo "============================================================" |