Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Pocketpair official image. `./palworld-manager.sh update` follows the tag
# published in Pocketpair's official Compose file.
PALWORLD_IMAGE_REPOSITORY=ghcr.io/pocketpairjp/palserver
PALWORLD_IMAGE=ghcr.io/pocketpairjp/palserver:v1.0.0.100427

# Public game port. Only UDP 8211 needs to be opened on the firewall/router.
PALWORLD_PORT=8211
PALWORLD_BIND_IP=0.0.0.0

# The REST API is deliberately bound to loopback by compose.yaml.
REST_API_PORT=8212

# External backup retention policy.
BACKUP_RETENTION_DAYS=14
BACKUP_MAX_COUNT=168
8 changes: 8 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
* text=auto
.env.example text eol=lf
.gitattributes text eol=lf
.gitignore text eol=lf
*.sh text eol=lf
*.yaml text eol=lf
*.yml text eol=lf
*.md text eol=lf
33 changes: 33 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
name: CI

on:
push:
pull_request:

permissions:
contents: read

jobs:
validate:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Check out repository
uses: actions/checkout@v7

- name: Install ShellCheck
run: sudo apt-get update && sudo apt-get install -y shellcheck

- name: Check shell syntax
run: bash -n palworld-manager.sh && sh -n helper.sh

- name: Run ShellCheck
run: shellcheck palworld-manager.sh helper.sh

- name: Validate Compose model
run: cp .env.example .env && docker compose config --quiet

- name: Verify official image and REST API binding
run: |
grep -q 'ghcr.io/pocketpairjp/palserver:' compose.yaml
grep -q '127.0.0.1:' compose.yaml
7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
.env
.paldsms-admin-password
Saved/
Saved.pre-restore-*/
Saved.failed-restore-*/
backups/
.restore.*/
19 changes: 19 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Changelog

## 2.0.0 - 2026-07-14

- Rebuilt the project around Pocketpair's official Palworld server image.
- Updated the default image to `v1.0.0.100427`.
- Added official-image tag discovery and rollback-safe updates.
- Replaced bundled `mcrcon` usage with the official loopback-only REST API.
- Added verified external backups, retention controls, and restore rollback.
- Added game-native rolling backups through `bIsUseBackupSaveData=True`.
- Added systemd backup and update timers.
- Added Debian/Ubuntu Docker Engine and Compose v2 installation.
- Added environment diagnostics, redesigned documentation, a migration guide, security policy,
contribution guide, and CI checks.
- Archived v1.1 ZIP distributions under `legacy/`.

## 1.1 - 2024-02-07

- Historical ZIP-based Chinese, English, and Japanese distributions.
25 changes: 25 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Contributing

Contributions that improve compatibility, backup safety, documentation, or Linux distribution
support are welcome.

## Before opening a pull request

1. Base changes on the current default branch and keep each pull request focused.
2. Preserve Bash 4+ compatibility and LF line endings.
3. Do not add bundled credentials, save data, backups, or unreviewed executables.
4. Keep the REST API loopback-only by default.
5. Update the README and changelog when user-visible behavior changes.

Run the same checks used by CI:

```bash
bash -n palworld-manager.sh
sh -n helper.sh
shellcheck palworld-manager.sh helper.sh
cp .env.example .env
docker compose config --quiet
```

For backup, restore, or update changes, describe the failure and rollback cases you tested in the
pull-request body.
Loading