Last active 1 month ago

forgejo runner install script

Revision 17fee0392ab18cebc9851295b3bbb4684948d91a

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