Last active 1 month ago

forgejo runner install script

Revision 91d2f5b0440a40f12d1d32197cb564a268c7cb2b

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
64
65# --- STEP 3: Check Docker ---
66echo "Checking Docker..."
67if ! command -v docker &> /dev/null; then
68 echo "ERROR: Docker is not installed. Please install Docker first."
69 exit 1
70fi
71
72if ! 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
76fi
77echo "Docker is running as systemd service"
78echo ""
79
80# =============================================================================
81# DIRECT MODE INSTALLATION
82# =============================================================================
83if [ "$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'
121log:
122 level: info
123
124runner:
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
134docker:
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
141container:
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
148EOF
149
150 # --- Create systemd service ---
151 echo "Creating systemd service..."
152 sudo tee /etc/systemd/system/forgejo-runner.service > /dev/null << EOF
153[Unit]
154Description=Forgejo Actions Runner
155After=docker.service
156Requires=docker.service
157
158[Service]
159Type=simple
160User=$RUNNER_USER
161Group=$RUNNER_USER
162WorkingDirectory=$RUNNER_HOME
163ExecStart=$RUNNER_HOME/bin/forgejo-runner daemon --config $RUNNER_HOME/config.yaml
164Restart=always
165RestartSec=10
166StartLimitBurst=3
167StartLimitInterval=60s
168LimitNOFILE=65536
169LimitNPROC=65536
170
171[Install]
172WantedBy=multi-user.target
173EOF
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# =============================================================================
195elif [ "$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
229instance: $FORGEJO_URL
230token: "$REGISTRATION_TOKEN"
231
232log:
233 level: info
234
235runner:
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
247cache:
248 enabled: true
249 dir: ""
250
251container:
252 privileged: false
253 valid_volumes:
254 - '**'
255 docker_host: ""
256 force_pull: false
257
258host:
259 workdir_parent: ""
260EOF
261
262 # --- Create docker-compose.yml ---
263 echo "Creating docker-compose.yml..."
264 cat > docker-compose.yml << EOF
265version: '3.8'
266
267services:
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
296volumes:
297 dind-storage:
298EOF
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]
304Description=Forgejo Runner (Docker Compose)
305After=docker.service
306Requires=docker.service
307
308[Service]
309Type=oneshot
310RemainAfterExit=yes
311WorkingDirectory=$COMPOSE_DIR
312ExecStart=/usr/bin/docker compose up -d
313ExecStop=/usr/bin/docker compose down
314ExecReload=/usr/bin/docker compose restart
315StandardOutput=journal
316User=$USER
317Group=$USER
318
319[Install]
320WantedBy=multi-user.target
321EOF
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# =============================================================================
349else
350 echo "ERROR: Invalid RUNNER_MODE. Use 'direct' or 'docker'"
351 exit 1
352fi
353
354echo ""
355echo "============================================================"
356echo "DEPLOYMENT COMPLETE"
357echo "============================================================"
358echo ""
359echo "Runner should now appear online in Forgejo Admin -> Actions -> Runners"
360echo "URL: $FORGEJO_URL/admin/actions/runners"
361echo ""
362echo "If runner shows offline, check:"
363echo " - Registration token is valid"
364echo " - Forgejo URL is accessible"
365echo " - Docker is running: sudo systemctl status docker"
366echo "============================================================"