67
README.md
Normal file
67
README.md
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
# Hytale Server Systemd Setup
|
||||||
|
|
||||||
|
## Files
|
||||||
|
|
||||||
|
| File | Description | Target on Server |
|
||||||
|
|------|-------------|------------------|
|
||||||
|
| `hytale.service` | Main service for the server | `/etc/systemd/system/` |
|
||||||
|
| `hytale-update.sh` | Update script | `/opt/hytale/` |
|
||||||
|
| `hytale-update.service` | Service for updates | `/etc/systemd/system/` |
|
||||||
|
| `hytale-update.timer` | Timer for daily updates at 4 AM | `/etc/systemd/system/` |
|
||||||
|
|
||||||
|
## Installation on the Server
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Copy files
|
||||||
|
sudo cp hytale.service /etc/systemd/system/
|
||||||
|
sudo cp hytale-update.service /etc/systemd/system/
|
||||||
|
sudo cp hytale-update.timer /etc/systemd/system/
|
||||||
|
cp hytale-update.sh /opt/hytale/
|
||||||
|
chmod +x /opt/hytale/hytale-update.sh
|
||||||
|
|
||||||
|
# 2. Create log file
|
||||||
|
sudo touch /var/log/hytale-update.log
|
||||||
|
sudo chown mars3142:mars3142 /var/log/hytale-update.log
|
||||||
|
|
||||||
|
# 3. Reload systemd
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
|
||||||
|
# 4. Enable and start server service
|
||||||
|
sudo systemctl enable hytale.service
|
||||||
|
sudo systemctl start hytale.service
|
||||||
|
|
||||||
|
# 5. Enable update timer
|
||||||
|
sudo systemctl enable hytale-update.timer
|
||||||
|
sudo systemctl start hytale-update.timer
|
||||||
|
```
|
||||||
|
|
||||||
|
## Useful Commands
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Server status
|
||||||
|
sudo systemctl status hytale.service
|
||||||
|
|
||||||
|
# Show server logs
|
||||||
|
sudo journalctl -u hytale.service -f
|
||||||
|
|
||||||
|
# Manually stop/start server
|
||||||
|
sudo systemctl stop hytale.service
|
||||||
|
sudo systemctl start hytale.service
|
||||||
|
sudo systemctl restart hytale.service
|
||||||
|
|
||||||
|
# Run update manually
|
||||||
|
sudo /opt/hytale/hytale-update.sh
|
||||||
|
|
||||||
|
# Check timer status
|
||||||
|
sudo systemctl list-timers | grep hytale
|
||||||
|
|
||||||
|
# Show update logs
|
||||||
|
cat /var/log/hytale-update.log
|
||||||
|
```
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
- The server starts automatically after a reboot
|
||||||
|
- Updates are checked daily at 4:00 AM
|
||||||
|
- Already applied updates are stored in `/opt/hytale/.applied_updates`
|
||||||
|
- When an update is found, the server is automatically stopped, updated, and restarted
|
||||||
12
hytale-update.service
Normal file
12
hytale-update.service
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Hytale Server Update Service
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
ExecStart=/opt/hytale/hytale-update.sh
|
||||||
|
User=root
|
||||||
|
Group=root
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
66
hytale-update.sh
Normal file
66
hytale-update.sh
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Hytale Server Update Script
|
||||||
|
# Runs the updater, extracts new files, and restarts the server
|
||||||
|
#
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
HYTALE_DIR="/opt/hytale"
|
||||||
|
LOG_FILE="/var/log/hytale-update.log"
|
||||||
|
|
||||||
|
log() {
|
||||||
|
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
|
||||||
|
}
|
||||||
|
|
||||||
|
cd "$HYTALE_DIR"
|
||||||
|
|
||||||
|
log "Starting update check..."
|
||||||
|
|
||||||
|
# Run the updater to check for and download updates
|
||||||
|
# The updater downloads files like "2026-01-17-abcdef.zip"
|
||||||
|
./updater 2>&1 | tee -a "$LOG_FILE"
|
||||||
|
|
||||||
|
# Find the newest zip file (pattern: YYYY-MM-DD-*.zip)
|
||||||
|
NEWEST_ZIP=$(ls -t [0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-*.zip 2>/dev/null | head -n1)
|
||||||
|
|
||||||
|
if [ -z "$NEWEST_ZIP" ]; then
|
||||||
|
log "No update zip found. Nothing to do."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if this update was already applied
|
||||||
|
APPLIED_MARKER=".applied_updates"
|
||||||
|
if grep -Fxq "$NEWEST_ZIP" "$APPLIED_MARKER" 2>/dev/null; then
|
||||||
|
log "Update $NEWEST_ZIP was already applied. Skipping."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
log "New update found: $NEWEST_ZIP"
|
||||||
|
|
||||||
|
# Stop the server
|
||||||
|
log "Stopping Hytale server..."
|
||||||
|
systemctl stop hytale.service || true
|
||||||
|
|
||||||
|
# Wait for server to fully stop
|
||||||
|
sleep 5
|
||||||
|
|
||||||
|
# Extract the update directly to /opt/hytale
|
||||||
|
log "Extracting $NEWEST_ZIP to $HYTALE_DIR..."
|
||||||
|
unzip -o "$NEWEST_ZIP" -d "$HYTALE_DIR"
|
||||||
|
|
||||||
|
# Fix file ownership (since this script runs as root)
|
||||||
|
chown -R mars3142:mars3142 "$HYTALE_DIR"
|
||||||
|
|
||||||
|
# Mark this update as applied
|
||||||
|
echo "$NEWEST_ZIP" >> "$APPLIED_MARKER"
|
||||||
|
|
||||||
|
# Start the server again
|
||||||
|
log "Starting Hytale server..."
|
||||||
|
systemctl start hytale.service
|
||||||
|
|
||||||
|
# Cleanup: keep only the 3 newest zip files
|
||||||
|
log "Cleaning up old zip files..."
|
||||||
|
ls -t [0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-*.zip 2>/dev/null | tail -n +4 | xargs -r rm -f
|
||||||
|
|
||||||
|
log "Update complete!"
|
||||||
9
hytale-update.timer
Normal file
9
hytale-update.timer
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Daily Hytale Server Update Check at 4:00 AM
|
||||||
|
|
||||||
|
[Timer]
|
||||||
|
OnCalendar=*-*-* 04:00:00
|
||||||
|
Persistent=true
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=timers.target
|
||||||
27
hytale.service
Normal file
27
hytale.service
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Hytale Game Server
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=mars3142
|
||||||
|
Group=mars3142
|
||||||
|
WorkingDirectory=/opt/hytale/Server
|
||||||
|
|
||||||
|
# SDKMAN Java path for user mars3142
|
||||||
|
Environment="JAVA_HOME=/home/mars3142/.sdkman/candidates/java/current"
|
||||||
|
Environment="PATH=/home/mars3142/.sdkman/candidates/java/current/bin:/usr/local/bin:/usr/bin:/bin"
|
||||||
|
|
||||||
|
ExecStart=/home/mars3142/.sdkman/candidates/java/current/bin/java -jar HytaleServer.jar --assets ../Assets.zip
|
||||||
|
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=10
|
||||||
|
|
||||||
|
# Security hardening
|
||||||
|
NoNewPrivileges=true
|
||||||
|
ProtectSystem=strict
|
||||||
|
ReadWritePaths=/opt/hytale
|
||||||
|
ProtectHome=read-only
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
Reference in New Issue
Block a user