-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinstall.sh
More file actions
163 lines (141 loc) · 5.67 KB
/
Copy pathinstall.sh
File metadata and controls
163 lines (141 loc) · 5.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#!/usr/bin/env bash
# =============================================================================
# install.sh – Bootstrap script for Ubuntu 22.04 (ARM / x86_64)
# Installs: Docker, Docker Compose v2, and all project dependencies.
# =============================================================================
set -euo pipefail
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m' # No Colour
log() { echo -e "${CYAN}[install]${NC} $*"; }
success(){ echo -e "${GREEN}[install]${NC} $*"; }
warn() { echo -e "${YELLOW}[install]${NC} $*"; }
error() { echo -e "${RED}[install]${NC} $*" >&2; }
# --------------------------------------------------------------------------
# Pre-flight checks
# --------------------------------------------------------------------------
if [[ "$EUID" -ne 0 ]]; then
error "Please run this script as root or with sudo."
exit 1
fi
if ! grep -qi "ubuntu" /etc/os-release 2>/dev/null; then
warn "This script is designed for Ubuntu 22.04. Proceeding anyway – YMMV."
fi
log "Starting system bootstrap…"
# --------------------------------------------------------------------------
# System update & base dependencies
# --------------------------------------------------------------------------
log "Updating package lists…"
apt-get update -qq
log "Installing base dependencies…"
apt-get install -y --no-install-recommends \
ca-certificates \
curl \
wget \
gnupg \
lsb-release \
unzip \
git \
jq \
cron \
logrotate \
make
systemctl enable --now cron
# --------------------------------------------------------------------------
# Docker Engine
# --------------------------------------------------------------------------
if command -v docker &>/dev/null; then
warn "Docker is already installed ($(docker --version)). Skipping."
else
log "Installing Docker Engine…"
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
| gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \
| tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update -qq
apt-get install -y docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin
systemctl enable --now docker
success "Docker installed: $(docker --version)"
fi
# --------------------------------------------------------------------------
# Add current (non-root) user to docker group
# --------------------------------------------------------------------------
REAL_USER="${SUDO_USER:-$USER}"
if [[ -n "${REAL_USER}" && "${REAL_USER}" != "root" ]]; then
usermod -aG docker "${REAL_USER}"
warn "User '${REAL_USER}' added to docker group. Log out and back in to apply."
fi
# --------------------------------------------------------------------------
# Java 17 (host-level, optional – server runs in Docker but useful for local tools)
# --------------------------------------------------------------------------
if command -v java &>/dev/null && java -version 2>&1 | grep -q "17"; then
warn "Java 17 already installed. Skipping."
else
log "Installing OpenJDK 17…"
apt-get install -y --no-install-recommends openjdk-17-jdk-headless
success "Java installed: $(java -version 2>&1 | head -1)"
fi
# --------------------------------------------------------------------------
# Project setup
# --------------------------------------------------------------------------
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
log "Creating required directories…"
mkdir -p "${SCRIPT_DIR}/server-files" "${SCRIPT_DIR}/backups"
if [[ ! -f "${SCRIPT_DIR}/.env" ]]; then
log "Creating .env from .env.example…"
cp "${SCRIPT_DIR}/.env.example" "${SCRIPT_DIR}/.env"
warn "→ Edit .env to set your RCON_PASSWORD and other settings before starting."
else
warn ".env already exists – skipping copy."
fi
if [[ -f "${SCRIPT_DIR}/.env" ]]; then
# shellcheck disable=SC1090
set -a
source "${SCRIPT_DIR}/.env"
set +a
fi
log "Setting executable permissions on scripts…"
chmod +x "${SCRIPT_DIR}"/scripts/*.sh
# --------------------------------------------------------------------------
# Cron job for daily backups
# --------------------------------------------------------------------------
BASH_BIN="$(command -v bash)"
BACKUP_CRON_SCHEDULE="${BACKUP_CRON:-0 3 * * *}"
BACKUP_CRON_FILE="/etc/cron.d/minecraft-server-backup"
cat > "${BACKUP_CRON_FILE}" <<EOF
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
${BACKUP_CRON_SCHEDULE} root "${BASH_BIN}" "${SCRIPT_DIR}/scripts/backup.sh" >> /var/log/mc-backup.log 2>&1
EOF
chmod 0644 "${BACKUP_CRON_FILE}"
success "Daily backup cron job installed in /etc/cron.d/minecraft-server-backup (${BACKUP_CRON_SCHEDULE})."
# --------------------------------------------------------------------------
# Log rotation
# --------------------------------------------------------------------------
cat > /etc/logrotate.d/minecraft-server <<'LOGROTATE'
/var/log/mc-backup.log {
weekly
rotate 4
compress
missingok
notifempty
}
LOGROTATE
success "Log rotation configured."
# --------------------------------------------------------------------------
# Done
# --------------------------------------------------------------------------
echo ""
success "Bootstrap complete!"
echo -e "${CYAN}Next steps:${NC}"
echo " 1. Edit .env – set passwords and tune MEMORY, MAX_PLAYERS, etc."
echo " 2. (Optional) Place modpack server files in ./server-files/"
echo " 3. Run: make start (or: docker compose up -d)"
echo ""