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