Skip to content
Open
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
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,8 @@ Below is a categorized list of games with links to their respective server confi

#### [Romestead](./romestead)

#### [SCP: Secret Laboratory](./scpsl)

#### [SCUM](./scum)

#### [Plains of Pain](./plains_of_pain)
Expand Down
4 changes: 4 additions & 0 deletions scpsl/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@ This Server is NOT compatible with ServerMod2 or MultiAdmin

SCP: Secret Laboratory Pterodactyl egg with Exiled Plugin Framework <https://github.com/Exiled-Team/EXILED>

## [scpsl-egg](scpsl-egg)

SCP: Secret Laboratory Pterodactyl egg with EXILED and [SCPDiscord](https://github.com/KarlOfDuty/SCPDiscord/) support

## Documentation

Official technical documentation is available at <https://techwiki.scpslgame.com>.
Expand Down
52 changes: 52 additions & 0 deletions scpsl/scpsl-egg/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
## Documentation

Official technical documentation is available at <https://techwiki.scpslgame.com>.

## Minimum RAM

Minimum memory required to run the server: `4096 MB`

## Server Port

Default port required to run the server.

| Port | Default |
|---------|---------|
| Game | 7777 |


## Features:
- Game branch tag support (e.g for public betas)
- Can use private branches as well, see the SteamDepotDownloader [documentation](https://github.com/SteamRE/DepotDownloader#authentication)
- Options to choose the release, pre-release or a specific version of [EXILED](https://github.com/ExMod-Team/EXILED)
- Support to run the [SCPDiscord](https://github.com/KarlOfDuty/SCPDiscord/) Bot alongside the plugin
- FFmpeg support (for use with audio player plugins)


## Using the SCPDiscord bot
1. Go to the startup tab in your server, then set `INSTALL SCP DISCORD?` to `true`.
2. Under the settings tab, press "Reinstall Server" and wait until the server has finished the process. **Re-installing will *not* delete your important files.**
1. Go to the files tab, and go to `/.egg/SCPDBot` and open `config.yml` to configure the bot.
> [!TIP]
> **To configure the bot and plugin, read the [installation guide](https://github.com/KarlOfDuty/SCPDiscord/blob/main/docs/Installation.md).**


## Verification

The server must be verified in order for it to be visible in the server browser.
Make sure your server complies with the [Community Server Guidelines](https://scpslgame.com/CSG.pdf).

### Automatic Verification

Run one of the following commands in the server console:

* `!verify static` if you have a static IP address.
* `!verify dynamic` if you have a dynamic IP address.

### Manual Verification

Send an email to safety.compliance@scpslgame.com with the following info:

* Your Public IPv4 (IPv6 or Domain Server Verification isn't supported).
* Whether your IP is Static or Dynamic.
* The port that your server is running on.
82 changes: 82 additions & 0 deletions scpsl/scpsl-egg/scpsl-egg.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
{
"_comment": "PTERODACTYL: Update URL is used for Pelican",
"meta": {
"version": "PTDL_v2",
"update_url": "https:\/\/raw.githubusercontent.com\/EsserGaming\/scpsl-egg\/refs\/heads\/master\/scpsl-egg.json"
},
"exported_at": "2026-07-09T21:07:06-05:00",
"name": "scpsl-egg",
"author": "upwordstudent@gmail.com",
"description": "A customizable egg for the SCP: Secret Laboratory Dedicated Linux server builds.",
"features": [],
"docker_images": {
"ghcr.io\/ptero-eggs\/yolks:debian_trixie": "ghcr.io\/ptero-eggs\/yolks:debian_trixie"
},
"file_denylist": [],
"startup": "[ \"{{INSTALL_SCPDBOT}}\" = \"true\" ] && .\/.egg\/SCPDBot\/scpdiscord --config .\/.egg\/SCPDBot\/config.yml & .\/LocalAdmin {{SERVER_PORT}}",
"config": {
"files": "{}",
"startup": "{\r\n \"done\": \"Waiting for players..\"\r\n}",
"logs": "{}",
"stop": "exit"
},
"scripts": {
"installation": {
"script": "#!\/bin\/bash\r\n# steamcmd Base Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\n\r\necho \"\r\n$(tput setaf 4) ____________________________ ______________\r\n$(tput setaf 4) \/ _____\/\\_ ___ \\______ \\ \/\\ \/ _____\/| |\r\n$(tput setaf 4) \\_____ \\ \/ \\ \\\/| ___\/ \\\/ \\_____ \\ | |\r\n$(tput setaf 4) \/ || \\___| | \/\\ \/ \\| |___\r\n$(tput setaf 4)\/_________\/ \\________\/____| \\\/ \/_________\/|________|\r\n$(tput setaf 1) ___ __ __ __\r\n$(tput setaf 1)| | ____ _______\/ |______ | | | | ___________\r\n$(tput setaf 1)| |\/ \\ \/ ___\/\\ __\\__ \\ | | | | _\/ __ \\_ __ |\r\n$(tput setaf 1)| | | |\\___ \\ | | \/ __ \\| |_| |_\\ ___\/| | \\\/\r\n$(tput setaf 1)|___|___|__\/______| |__| (______|____|____\/\\___ |__|\r\n$(tput sgr0)\r\n\"\r\n\r\necho \"\r\n$(tput setaf 2)This installer was created by $(tput setaf 1)Parkeymon$(tput setaf 2) and maintained by $(tput setaf 6)EsserGaming$(tput setaf 2).$(tput sgr0)\r\n\"\r\n\r\n# Download SteamDepotDownloader and install it.\r\ncd \/tmp || { \r\n echo \"$(tput setaf 1) FAILED TO MOUNT TO \/TMP\"\r\n exit \r\n}\r\nmkdir -p \/mnt\/server\/.DepotDownloader\r\ncurl -sSL -o DepotDownloader-linux-x64.zip https:\/\/github.com\/SteamRE\/DepotDownloader\/releases\/latest\/download\/DepotDownloader-linux-x64.zip\r\nunzip -oq DepotDownloader-linux-x64.zip -d \/mnt\/server\/.DepotDownloader\r\ncd \/mnt\/server\/.DepotDownloader || {\r\n echo \"$(tput setaf 1) FAILED TO MOUNT TO \/mnt\/server\/.DepotDownloader\"\r\n exit\r\n}\r\n\r\n# Install SCP: Secret Laboratory using SteamDepotDownloader\r\nchown -R root:root \/mnt\r\nexport HOME=\/mnt\/server\r\n\r\nif [ \"${BRANCH_TAG}\" == \"\" ]; then\r\n echo \"$(tput setaf 4)Installing SCP:SL..$(tput sgr0)\"\r\n .\/DepotDownloader -app 996560 -depot 996562 -dir \/mnt\/server -validate > \/dev\/null # silence output\r\n echo \"$(tput setaf 2)Done.$(tput sgr0)\"\r\nelse\r\n echo \"$(tput setaf 4)Installing SCP:SL $(tput bold)on custom branch (output enabled)..$(tput sgr0)\" \r\n .\/DepotDownloader -app 996560 -depot 996562 -branch ${BRANCH_TAG} -dir \/mnt\/server -validate # keeping this normal if debugging is needed\r\nfi\r\n\r\n# Exit if \/mnt\/server doesn't exist\r\ncd \/mnt\/server || {\r\n echo \"$(tput setaf 1) FAILED TO MOUNT TO \/mnt\/server\"\r\n exit\r\n}\r\n\r\n# Ensure permissions are correct\r\nchmod +x LocalAdmin SCPSL.x86_64\r\n\r\n#Install SCPDiscord Bot\r\nif [ \"${INSTALL_SCPDBOT}\" == \"true\" ]; then\r\n mkdir -p \/mnt\/server\/.egg\/SCPDBot\r\n # Remove old SCPDiscord bot\r\n rm \/mnt\/server\/.egg\/SCPDBot\/scpdiscord >\/dev\/null 2>&1\r\n\r\n echo \"$(tput setaf 5)Installing latest SCPDiscord Bot.\"\r\n wget -q https:\/\/github.com\/KarlOfDuty\/SCPDiscord\/releases\/latest\/download\/scpdiscord -P \/mnt\/server\/.egg\/SCPDBot\r\n chmod +x \/mnt\/server\/.egg\/SCPDBot\/scpdiscord\r\nelse\r\n echo $(tput setaf 3)\"Skipping SCPDiscord Bot install.\"$(tput sgr0)\r\nfi\r\n\r\n #Install SCPDiscord Plugin\r\n if [ \"${INSTALL_SCPDPLUGIN}\" == \"true\" ]; then\r\n rm '\/mnt\/server\/.config\/SCP Secret Laboratory\/LabAPI\/plugins\/global\/SCPDiscord.dll' >\/dev\/null 2>&1\r\n echo \"$(tput setaf 5)Installing SCPDiscord Plugin.\"\r\n\r\n echo \"$(tput setaf 5)SCPDiscord: Grabbing plugin and dependencies..\"\r\n wget -q https:\/\/github.com\/KarlOfDuty\/SCPDiscord\/releases\/latest\/download\/dependencies.zip -P '\/mnt\/server\/.config\/SCP Secret Laboratory\/LabAPI\/dependencies\/global'\r\n wget -q https:\/\/github.com\/KarlOfDuty\/SCPDiscord\/releases\/latest\/download\/SCPDiscord.dll -P '\/mnt\/server\/.config\/SCP Secret Laboratory\/LabAPI\/plugins\/global'\r\n\r\n\r\n echo \"$(tput setaf 5)SCPDiscord: Extracting dependencies..\"\r\n unzip -oq '\/mnt\/server\/.config\/SCP Secret Laboratory\/LabAPI\/dependencies\/global\/dependencies.zip' -d '\/mnt\/server\/.config\/SCP Secret Laboratory\/LabAPI\/dependencies\/global\/'\r\n rm '\/mnt\/server\/.config\/SCP Secret Laboratory\/LabAPI\/dependencies\/global\/dependencies.zip' >\/dev\/null 2>&1\r\nelse\r\n echo $(tput setaf 3)\"Skipping SCPDiscord Plugin install.\"$(tput sgr0)\r\nfi\r\n\r\n\r\n# EXILED installation\r\nif [[ \"${INSTALL_EXILED}\" == \"true\" ]]; then\r\n echo \"$(tput setaf 4)Downloading $(tput setaf 1)EXILED $(tput setaf 4)installer.\"\r\n mkdir -p .config\/\r\n rm Exiled.Installer-Linux >\/dev\/null 2>&1\r\n wget -q https:\/\/github.com\/ExMod-Team\/EXILED\/releases\/latest\/download\/Exiled.Installer-Linux\r\n chmod +x .\/Exiled.Installer-Linux\r\n\r\n if [[ \"${EXILED_PRE}\" == \"true\" ]]; then\r\n echo \"$(tput setaf 4)Installing latest $(tput setaf 1)EXILED $(tput setaf 4)pre-release..\"\r\n .\/Exiled.Installer-Linux -p \/mnt\/server\/ --pre-releases >\/dev\/null\r\n\r\n elif [[ \"${EXILED_PRE}\" == \"false\" ]]; then\r\n echo \"$(tput setaf 4)Installing latest $(tput setaf 1)EXILED $(tput setaf 4)release..\"\r\n .\/Exiled.Installer-Linux -p \/mnt\/server\/ --skip-version-select >\/dev\/null\r\n\r\n else\r\n echo \"$(tput setaf 4)Installing $(tput setaf 1)EXILED$ $(tput setaf 4)version: $(tput bold)$(tput setaf 1)${EXILED_PRE}$(tput sgr0)\"\r\n .\/Exiled.Installer-Linux -p \/mnt\/server\/ --target-version \"${EXILED_PRE}\" # un-silenced in case debugging is needed\r\n\r\n fi\r\nelse\r\n echo $(tput setaf 3)\"Skipping Exiled installation.\"$(tput sgr0)\r\nfi\r\n\r\n\r\n# Cleanup, I also silenced rm if it doesn't find the file.\r\necho \"$(tput setaf 5)Cleaning up..$(tput sgr 0)\"\r\nrm \/mnt\/server\/core >\/dev\/null 2>&1\r\nrm \/mnt\/server\/Exiled.Installer-Linux >\/dev\/null 2>&1\r\nrm \/mnt\/server\/config-gameplay.txt >\/dev\/null 2>&1\r\nrm -r \/mnt\/server\/? >\/dev\/null 2>&1\r\nrm -r \/mnt\/server\/.local >\/dev\/null 2>&1\r\n\r\necho \"$(tput setaf 2)Installation Complete!$(tput sgr 0)\"",
"container": "ghcr.io\/ptero-eggs\/installers:debian",
"entrypoint": "bash"
}
},
"variables": [
{
"name": "Branch Tag",
"description": "Keep empty for public branch.\r\nFor branches with passwords add \"-branchpassword \" before the password.",
"env_variable": "BRANCH_TAG",
"default_value": "",
"user_viewable": true,
"user_editable": true,
"rules": "max:200",
"field_type": "text"
},
{
"name": "Install EXILED?",
"description": "Installs the latest EXILED release.",
"env_variable": "INSTALL_EXILED",
"default_value": "false",
"user_viewable": true,
"user_editable": true,
"rules": "required|string|max:5",
"field_type": "text"
},
{
"name": "Use EXILED Pre-Releases?",
"description": "Allows you to install the latest Pre-Release of EXILED.\r\nTo install a specific version, replace with the specified EXILED version.",
"env_variable": "EXILED_PRE",
"default_value": "false",
"user_viewable": true,
"user_editable": true,
"rules": "required|string|max:20",
"field_type": "text"
},
{
"name": "Install SCPDiscord?",
"description": "This will install the SCPDiscord Bot and start it alongside the SL server.",
"env_variable": "INSTALL_SCPDBOT",
"default_value": "false",
"user_viewable": true,
"user_editable": true,
"rules": "required|string|max:5",
"field_type": "text"
},
{
"name": "Install SCPDiscord Plugin?",
"description": "Disable if you use a plugin manager. The plugin will be installed for LabAPI.",
"env_variable": "INSTALL_SCPDPLUGIN",
"default_value": "false",
"user_viewable": true,
"user_editable": true,
"rules": "required|string|max:20",
"field_type": "text"
}
]
}