Last active 1 month ago

forgejo runner install script

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="http://192.168.2.76:3006" # CHANGE THIS
9REGISTRATION_TOKEN="your-registration-token" # CHANGE THIS
10RUNNER_NAME="selfhosted-runner-01"
11RUNNER_VERSION="latest" # "latest" or specific version
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 "Instance: $FORGEJO_URL"
31echo ""
32
33# --- STEP 1: Detect architecture ---
34echo "Detecting architecture..."
35export ARCH=$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/;s/armv7l/armv7/')
36echo "Architecture: $ARCH"
37
38# --- STEP 2: Get latest version ---
39if [ "$RUNNER_VERSION" = "latest" ]; then
40 echo "Fetching latest version..."
41 export RUNNER_VERSION=$(curl -s https://code.forgejo.org/api/v1/repos/forgejo/runner/releases/latest | grep -o '"tag_name":"v[0-9]\+\.[0-9]\+\.[0-9]\+"' | head -1 | sed 's/"tag_name":"//' | sed 's/"//' | sed 's/^v//')
42 echo "Version: $RUNNER_VERSION"
43else
44 RUNNER_VERSION=${RUNNER_VERSION#v}
45 echo "Version: $RUNNER_VERSION"
46fi
47echo ""
48
49# =============================================================================
50# DIRECT MODE
51# =============================================================================
52if [ "$RUNNER_MODE" = "direct" ]; then
53 echo "=== DIRECT MODE INSTALLATION ==="
54 echo "Installing runner directly on the system"
55 echo ""
56
57 # --- Create runner user if not exists ---
58 echo "Creating runner user..."
59 if ! id "$RUNNER_USER" &>/dev/null; then
60 sudo useradd -r -m -d "$RUNNER_HOME" -s /bin/bash "$RUNNER_USER"
61 echo "User $RUNNER_USER created"
62 else
63 echo "User $RUNNER_USER already exists"
64 fi
65
66 # --- Create directory structure ---
67 echo "Creating directory structure..."
68 sudo mkdir -p "$RUNNER_HOME/bin"
69 sudo chown -R "$RUNNER_USER":"$RUNNER_USER" "$RUNNER_HOME"
70
71 # --- Download binary ---
72 echo "Downloading runner binary..."
73 sudo -u "$RUNNER_USER" wget -O "$RUNNER_HOME/bin/forgejo-runner" \
74 https://code.forgejo.org/forgejo/runner/releases/download/v${RUNNER_VERSION}/forgejo-runner-${RUNNER_VERSION}-linux-${ARCH}
75
76 # --- Make executable ---
77 echo "Making executable..."
78 sudo chmod +x "$RUNNER_HOME/bin/forgejo-runner"
79
80 # --- Register runner ---
81 echo "Registering runner with Forgejo..."
82 sudo -u "$RUNNER_USER" "$RUNNER_HOME/bin/forgejo-runner" register \
83 --token "$REGISTRATION_TOKEN" \
84 --name "$RUNNER_NAME" \
85 --instance "$FORGEJO_URL" \
86 --labels "$RUNNER_NAME:host" \
87 --no-interactive
88
89 # --- Create config.yaml ---
90 echo "Creating configuration..."
91 sudo -u "$RUNNER_USER" tee "$RUNNER_HOME/config.yaml" > /dev/null << EOF
92instance: $FORGEJO_URL
93token: "$REGISTRATION_TOKEN"
94
95log:
96 level: info
97
98runner:
99 file: .runner
100 capacity: 1
101 timeout: 30m
102 shutdown_timeout: 30m
103 insecure: true
104 fetch_timeout: 30s
105 fetch_interval: 60s
106 report_interval: 10s
107 labels:
108 - "$RUNNER_NAME:host"
109
110cache:
111 enabled: true
112 dir: ""
113
114host:
115 workdir_parent: ""
116EOF
117
118 # --- Create systemd service ---
119 echo "Creating systemd service..."
120 sudo tee /etc/systemd/system/forgejo-runner.service > /dev/null << EOF
121[Unit]
122Description=Forgejo Actions Runner
123After=network.target
124
125[Service]
126Type=simple
127User=$RUNNER_USER
128Group=$RUNNER_USER
129WorkingDirectory=$RUNNER_HOME
130ExecStart=$RUNNER_HOME/bin/forgejo-runner daemon --config $RUNNER_HOME/config.yaml
131Restart=always
132RestartSec=10
133StartLimitBurst=3
134StartLimitInterval=60s
135LimitNOFILE=65536
136LimitNPROC=65536
137
138[Install]
139WantedBy=multi-user.target
140EOF
141
142 # --- Enable and start service ---
143 echo "Starting service..."
144 sudo systemctl daemon-reload
145 sudo systemctl enable forgejo-runner.service
146 sudo systemctl start forgejo-runner.service
147
148 echo ""
149 echo "=== DIRECT MODE DEPLOYMENT COMPLETE ==="
150 echo ""
151 echo "Service status:"
152 sudo systemctl status forgejo-runner.service --no-pager
153 echo ""
154 echo "To view logs:"
155 echo " sudo journalctl -u forgejo-runner -f"
156 echo ""
157 echo "Runner location: $RUNNER_HOME/bin/forgejo-runner"
158 echo "Config location: $RUNNER_HOME/config.yaml"
159 echo "User: $RUNNER_USER"
160
161# =============================================================================
162# DOCKER MODE
163# =============================================================================
164elif [ "$RUNNER_MODE" = "docker" ]; then
165 echo "=== DOCKER MODE INSTALLATION ==="
166 echo "Installing runner with Docker Compose"
167 echo ""
168
169 # --- Check Docker ---
170 echo "Checking Docker..."
171 if ! command -v docker &> /dev/null; then
172 echo "Docker not found. Installing Docker..."
173 curl -fsSL https://get.docker.com -o get-docker.sh
174 sudo sh get-docker.sh
175 sudo usermod -aG docker $USER
176 sudo systemctl enable docker --now
177 rm get-docker.sh
178 echo "Docker installed successfully"
179 else
180 echo "Docker is already installed"
181 fi
182
183 if ! systemctl is-active --quiet docker; then
184 echo "Starting Docker service..."
185 sudo systemctl start docker
186 fi
187 echo "Docker is running"
188
189 # --- Check Docker Compose ---
190 echo "Checking Docker Compose..."
191 if ! command -v docker compose &> /dev/null; then
192 echo "Docker Compose not found. Installing..."
193 if command -v apt-get &> /dev/null; then
194 sudo apt-get update && sudo apt-get install -y docker-compose-plugin
195 elif command -v yum &> /dev/null; then
196 sudo yum install -y docker-compose-plugin
197 else
198 echo "ERROR: Could not install docker-compose-plugin"
199 echo "Please install Docker Compose manually"
200 exit 1
201 fi
202 else
203 echo "Docker Compose is already installed"
204 fi
205 echo ""
206
207 # --- Create working directory ---
208 echo "Creating working directory..."
209 mkdir -p "$COMPOSE_DIR"/{data,cache}
210 cd "$COMPOSE_DIR"
211
212 # --- Register runner using Docker ---
213 echo "Registering runner with Forgejo..."
214 docker run -it --rm \
215 -v $(pwd)/data:/data \
216 -w /data \
217 --user root \
218 ${RUNNER_IMAGE}:${RUNNER_VERSION} \
219 forgejo-runner register \
220 --no-interactive \
221 --token "$REGISTRATION_TOKEN" \
222 --name "$RUNNER_NAME" \
223 --instance "$FORGEJO_URL" \
224 --labels "$RUNNER_NAME:host"
225
226 # --- Generate config.yaml ---
227 echo "Creating 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}
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 ---
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 ""
362if [ "$RUNNER_MODE" = "direct" ]; then
363 echo "To check runner logs: sudo journalctl -u forgejo-runner -f"
364 echo "Runner user: $RUNNER_USER"
365 echo "Runner home: $RUNNER_HOME"
366else
367 echo "To check runner logs: docker compose -f $COMPOSE_DIR/docker-compose.yml logs -f runner"
368 echo "Runner location: $COMPOSE_DIR"
369fi
370echo "============================================================"