init: yolks for GMod 64-bit and Stalwart Mail Server
This commit is contained in:
@@ -0,0 +1,7 @@
|
||||
.git
|
||||
.github
|
||||
.dockerignore
|
||||
.gitignore
|
||||
*.md
|
||||
LICENSE
|
||||
eggs/
|
||||
@@ -0,0 +1,56 @@
|
||||
name: Build GMod Yolk
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
paths:
|
||||
- 'games/gmod/**'
|
||||
workflow_dispatch:
|
||||
|
||||
env:
|
||||
REGISTRY: gitea.refoseltw.ru
|
||||
IMAGE_NAME: RefoselTeamWork/yolks
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Login to Gitea Container Registry
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
username: ${{ secrets.GITEA_USERNAME }}
|
||||
password: ${{ secrets.GITEA_TOKEN }}
|
||||
|
||||
- name: Extract metadata
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||
tags: |
|
||||
type=raw,value=latest
|
||||
type=sha,prefix=
|
||||
|
||||
- name: Build and push
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
context: ./games/gmod
|
||||
platforms: linux/amd64
|
||||
push: true
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
@@ -0,0 +1,57 @@
|
||||
name: Build Stalwart Mail Yolk
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
paths:
|
||||
- 'apps/stalwart/**'
|
||||
workflow_dispatch:
|
||||
|
||||
env:
|
||||
REGISTRY: gitea.refoseltw.ru
|
||||
IMAGE_NAME: RefoselTeamWork/yolks
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Login to Gitea Container Registry
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
username: ${{ secrets.GITEA_USERNAME }}
|
||||
password: ${{ secrets.GITEA_TOKEN }}
|
||||
|
||||
- name: Extract metadata
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||
tags: |
|
||||
type=raw,value=stalwart
|
||||
type=raw,value=stalwart-latest
|
||||
type=sha,prefix=stalwart-
|
||||
|
||||
- name: Build and push
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
context: ./apps/stalwart
|
||||
platforms: linux/amd64
|
||||
push: true
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
@@ -0,0 +1,4 @@
|
||||
*.log
|
||||
*.tmp
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
@@ -0,0 +1,50 @@
|
||||
FROM debian:bookworm-slim
|
||||
|
||||
LABEL author="RefoselTeam" maintainer="admin@refoseltw.ru"
|
||||
|
||||
LABEL org.opencontainers.image.source="https://gitea.refoseltw.ru/RefoselTeamWork/yolks"
|
||||
LABEL org.opencontainers.image.licenses=MIT
|
||||
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
# Install dependencies
|
||||
RUN apt update \
|
||||
&& apt upgrade -y \
|
||||
&& apt install -y \
|
||||
curl \
|
||||
gnupg \
|
||||
ca-certificates \
|
||||
tini \
|
||||
tzdata \
|
||||
unzip \
|
||||
git \
|
||||
&& apt clean \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Install Stalwart Mail Server
|
||||
RUN curl -sSL https://stalw.art/install.sh | bash
|
||||
|
||||
# Create directories
|
||||
RUN mkdir -p /home/container/stalwart-mail \
|
||||
&& mkdir -p /home/container/stalwart-mail/data \
|
||||
&& mkdir -p /home/container/stalwart-mail/certs \
|
||||
&& mkdir -p /home/container/stalwart-mail/logs
|
||||
|
||||
# Setup user
|
||||
RUN useradd -m -d /home/container -s /bin/bash container \
|
||||
&& chown -R container:container /home/container
|
||||
|
||||
USER container
|
||||
ENV USER=container HOME=/home/container
|
||||
WORKDIR /home/container
|
||||
|
||||
EXPOSE 8080 465 587 993 995 4190
|
||||
|
||||
STOPSIGNAL SIGINT
|
||||
|
||||
COPY --chown=container:container ./entrypoint.sh /entrypoint.sh
|
||||
COPY --chown=container:container ./config.toml /entrypoint-config.toml
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
ENTRYPOINT ["/usr/bin/tini", "-g", "--"]
|
||||
CMD ["/entrypoint.sh"]
|
||||
@@ -0,0 +1,260 @@
|
||||
[storage]
|
||||
data = "{{STORAGE_DATA}}"
|
||||
logs = "{{STORAGE_LOGS}}"
|
||||
queue = "{{STORAGE_DATA}}/queue"
|
||||
blobs = "{{STORAGE_DATA}}/blobs"
|
||||
|
||||
[lookup]
|
||||
default = "internal"
|
||||
|
||||
[lookup.internal]
|
||||
hostname = "{{MAIL_HOSTNAME}}"
|
||||
domain = "{{MAIL_DOMAIN}}"
|
||||
|
||||
[smtp]
|
||||
hostname = "{{MAIL_HOSTNAME}}"
|
||||
bind = ["0.0.0.0:{{SMTP_PORT}}", "[::]:{{SMTP_PORT}}"]
|
||||
concurrency.remote = 10
|
||||
max-message-size = 52428800
|
||||
|
||||
[smtp.auth]
|
||||
directory = "internal"
|
||||
|
||||
[smtp.session]
|
||||
ehlo-required = true
|
||||
max-recipients = 100
|
||||
|
||||
[imap]
|
||||
bind = ["0.0.0.0:{{IMAP_PORT}}", "[::]:{{IMAP_PORT}}"]
|
||||
max-connections = 50
|
||||
|
||||
[jmap]
|
||||
bind = ["0.0.0.0:8081", "[::]:8081"]
|
||||
|
||||
[http]
|
||||
bind = ["0.0.0.0:{{HTTP_PORT}}", "[::]:{{HTTP_PORT}}"]
|
||||
url = "http://{{MAIL_HOSTNAME}}:{{HTTP_PORT}}"
|
||||
|
||||
[http.auth]
|
||||
directory = "internal"
|
||||
|
||||
[manager]
|
||||
enable = true
|
||||
|
||||
[metrics]
|
||||
enable = true
|
||||
|
||||
[submission]
|
||||
bind = ["0.0.0.0:{{SUBMISSION_PORT}}", "[::]:{{SUBMISSION_PORT}}"]
|
||||
|
||||
[sieve]
|
||||
bind = ["0.0.0.0:{{MANAGESIEVE_PORT}}", "[::]:{{MANAGESIEVE_PORT}}"]
|
||||
|
||||
[acme]
|
||||
enable = false
|
||||
|
||||
[dkim]
|
||||
domain = "{{MAIL_DOMAIN}}"
|
||||
selector = "stalwart"
|
||||
|
||||
[authentication]
|
||||
directory = "internal"
|
||||
fail2ban = true
|
||||
|
||||
[authentication.directory.internal]
|
||||
enable = true
|
||||
class = "internal"
|
||||
|
||||
[authentication.directory.internal.config]
|
||||
backend = "rocksdb"
|
||||
path = "{{STORAGE_DATA}}/auth"
|
||||
|
||||
[authentication.directory.internal.config.password.schemes]
|
||||
argon2 = true
|
||||
bcrypt = true
|
||||
sha512 = true
|
||||
|
||||
[authentication.directory.internal.config.password.max]
|
||||
iterations = 10
|
||||
size = 32
|
||||
|
||||
[authentication.directory.internal.config.password.force]
|
||||
iterations = false
|
||||
size = false
|
||||
|
||||
[authentication.directory.internal.config.throttling]
|
||||
max-auth-per-ip = 10
|
||||
max-errors-per-ip = 10
|
||||
window-secs = 600
|
||||
|
||||
[authentication.directory.internal.config.heartbeat]
|
||||
enable = false
|
||||
interval-secs = 0
|
||||
|
||||
[authentication.fallback]
|
||||
enable = true
|
||||
|
||||
[authentication.fallback.class]
|
||||
enable = true
|
||||
require-scope = false
|
||||
|
||||
[authentication.fallback.class.config]
|
||||
verify-email = false
|
||||
verify-subaddress = false
|
||||
|
||||
[authentication.fallback.class.config.domain]
|
||||
names = []
|
||||
catch-all = false
|
||||
tag-plus = true
|
||||
tag-hyphen = false
|
||||
|
||||
[authentication.fallback.class.config.oidc]
|
||||
enable = false
|
||||
discovery-url = ""
|
||||
client-id = ""
|
||||
client-secret = ""
|
||||
allow-signup = false
|
||||
scopes = ["openid", "email", "profile"]
|
||||
grant-type = "authorization-code"
|
||||
auth-url = ""
|
||||
token-url = ""
|
||||
userinfo-url = ""
|
||||
jwt-key = ""
|
||||
jwk-url = ""
|
||||
|
||||
[storage.data]
|
||||
type = "rocksdb"
|
||||
path = "{{STORAGE_DATA}}/data"
|
||||
|
||||
[storage.logs]
|
||||
type = "rocksdb"
|
||||
path = "{{STORAGE_DATA}}/logs"
|
||||
|
||||
[storage.queue]
|
||||
type = "rocksdb"
|
||||
path = "{{STORAGE_DATA}}/queue"
|
||||
|
||||
[storage.blobs]
|
||||
type = "rocksdb"
|
||||
path = "{{STORAGE_DATA}}/blobs"
|
||||
|
||||
[storage.fts]
|
||||
type = "rocksdb"
|
||||
path = "{{STORAGE_DATA}}/fts"
|
||||
|
||||
[storage.privacy]
|
||||
type = "rocksdb"
|
||||
path = "{{STORAGE_DATA}}/privacy"
|
||||
|
||||
[storage.counters]
|
||||
type = "rocksdb"
|
||||
path = "{{STORAGE_DATA}}/counters"
|
||||
|
||||
[storage.pool]
|
||||
type = "rocksdb"
|
||||
path = "{{STORAGE_DATA}}/pool"
|
||||
|
||||
[storage.cache]
|
||||
type = "rocksdb"
|
||||
path = "{{STORAGE_DATA}}/cache"
|
||||
|
||||
[storage.envelope]
|
||||
type = "rocksdb"
|
||||
path = "{{STORAGE_DATA}}/envelope"
|
||||
|
||||
[storage.index]
|
||||
type = "rocksdb"
|
||||
path = "{{STORAGE_DATA}}/index"
|
||||
|
||||
[storage.spam-filter]
|
||||
type = "rocksdb"
|
||||
path = "{{STORAGE_DATA}}/spam-filter"
|
||||
|
||||
[storage.in-memory]
|
||||
type = "memory"
|
||||
|
||||
[storage.static]
|
||||
type = "memory"
|
||||
|
||||
[repository]
|
||||
default = "rocksdb"
|
||||
|
||||
[repository.rocksdb]
|
||||
driver = "rocksdb"
|
||||
|
||||
[smtp.queue]
|
||||
retry = [60, 300, 900, 3600, 7200, 21600, 43200]
|
||||
max-retries = 10
|
||||
max-size = 52428800
|
||||
notify = ["postmaster@{{MAIL_DOMAIN}}"]
|
||||
path = "{{STORAGE_DATA}}/queue"
|
||||
|
||||
[smtp.queue.remote]
|
||||
concurrency = 10
|
||||
timeout = 300
|
||||
|
||||
[smtp.outgoing]
|
||||
max-helo = 5
|
||||
max-recipients = 100
|
||||
max-connection-age = 600
|
||||
max-connections = 10
|
||||
greeting-delay = 0
|
||||
|
||||
[smtp.dkim]
|
||||
sign = ["{{MAIL_DOMAIN}}"]
|
||||
keys = []
|
||||
|
||||
[smtp.dmarc]
|
||||
reject = false
|
||||
allow-unsigned = true
|
||||
tag-only = false
|
||||
|
||||
[smtp.spam-filter]
|
||||
enable = true
|
||||
path = "{{STORAGE_DATA}}/spam-filter"
|
||||
|
||||
[smtp.auth.rate-limit]
|
||||
max-per-ip = 10
|
||||
window-secs = 600
|
||||
|
||||
[http.dashboard]
|
||||
enable = true
|
||||
|
||||
[http.api]
|
||||
enable = true
|
||||
|
||||
[http.webmail]
|
||||
enable = false
|
||||
|
||||
[http.static]
|
||||
enable = true
|
||||
|
||||
[http.cors]
|
||||
allow-origin = "*"
|
||||
allow-methods = ["GET", "POST", "PUT", "DELETE"]
|
||||
allow-headers = ["Content-Type", "Authorization"]
|
||||
max-age = 3600
|
||||
|
||||
[http.tls]
|
||||
enable = false
|
||||
certificate = ""
|
||||
private-key = ""
|
||||
|
||||
[logging]
|
||||
level = "info"
|
||||
|
||||
[logging.channel.smtp]
|
||||
enable = true
|
||||
level = "info"
|
||||
|
||||
[logging.channel.auth]
|
||||
enable = true
|
||||
level = "info"
|
||||
|
||||
[logging.channel.store]
|
||||
enable = false
|
||||
level = "info"
|
||||
|
||||
[logging.channel.http]
|
||||
enable = true
|
||||
level = "info"
|
||||
@@ -0,0 +1,86 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Wait for the container to fully initialize
|
||||
sleep 1
|
||||
|
||||
# Default the TZ environment variable to UTC.
|
||||
TZ=${TZ:-UTC}
|
||||
export TZ
|
||||
|
||||
# Switch to the container's working directory
|
||||
cd /home/container || exit 1
|
||||
|
||||
# Stalwart paths
|
||||
STALWART_HOME="/home/container/stalwart-mail"
|
||||
STALWART_CONFIG="${STALWART_HOME}/config.toml"
|
||||
STALWART_DATA="${STALWART_HOME}/data"
|
||||
STALWART_CERTS="${STALWART_HOME}/certs"
|
||||
STALWART_LOGS="${STALWART_HOME}/logs"
|
||||
|
||||
# Create config from template if not exists
|
||||
if [ ! -f "${STALWART_CONFIG}" ]; then
|
||||
echo "Generating Stalwart configuration..."
|
||||
cp /entrypoint-config.toml "${STALWART_CONFIG}"
|
||||
|
||||
# Replace placeholders with environment variables
|
||||
sed -i "s|{{MAIL_DOMAIN}}|${MAIL_DOMAIN:-mail.example.com}|g" "${STALWART_CONFIG}"
|
||||
sed -i "s|{{MAIL_HOSTNAME}}|${MAIL_HOSTNAME:-$(hostname)|g" "${STALWART_CONFIG}"
|
||||
sed -i "s|{{ADMIN_EMAIL}}|${ADMIN_EMAIL:-admin@${MAIL_DOMAIN:-mail.example.com}}|g" "${STALWART_CONFIG}"
|
||||
sed -i "s|{{HTTP_PORT}}|${HTTP_PORT:-8080}|g" "${STALWART_CONFIG}"
|
||||
sed -i "s|{{SMTP_PORT}}|${SMTP_PORT:-465}|g" "${STALWART_CONFIG}"
|
||||
sed -i "s|{{SUBMISSION_PORT}}|${SUBMISSION_PORT:-587}|g" "${STALWART_CONFIG}"
|
||||
sed -i "s|{{IMAP_PORT}}|${IMAP_PORT:-993}|g" "${STALWART_CONFIG}"
|
||||
sed -i "s|{{MANAGESIEVE_PORT}}|${MANAGESIEVE_PORT:-4190}|g" "${STALWART_CONFIG}"
|
||||
sed -i "s|{{STORAGE_DATA}}|${STALWART_DATA}|g" "${STALWART_CONFIG}"
|
||||
sed -i "s|{{STORAGE_LOGS}}|${STALWART_LOGS}|g" "${STALWART_CONFIG}"
|
||||
|
||||
echo "Configuration generated."
|
||||
fi
|
||||
|
||||
# Generate admin password if not set
|
||||
if [ ! -f "${STALWART_HOME}/.admin_created" ]; then
|
||||
ADMIN_PASS=${ADMIN_PASSWORD:-$(openssl rand -base64 16)}
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo " Stalwart Mail Server"
|
||||
echo "=========================================="
|
||||
echo " Admin URL: http://${SERVER_IP:-0.0.0.0}:${HTTP_PORT:-8080}"
|
||||
echo " Admin Email: ${ADMIN_EMAIL:-admin@${MAIL_DOMAIN:-mail.example.com}}"
|
||||
echo " Admin Pass: ${ADMIN_PASS}"
|
||||
echo "=========================================="
|
||||
echo " IMPORTANT: Save these credentials!"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
|
||||
# Create admin account
|
||||
/home/container/stalwart-mail/bin/stalwart-mail --config "${STALWART_CONFIG}" --write-config
|
||||
|
||||
touch "${STALWART_HOME}/.admin_created"
|
||||
fi
|
||||
|
||||
# Clone Git repos if GIT_REPOS is set (for custom configs, filters, etc.)
|
||||
if [ ! -z "${GIT_REPOS}" ]; then
|
||||
IFS=',' read -ra REPOS <<< "$GIT_REPOS"
|
||||
for repo in "${REPOS[@]}"; do
|
||||
repo=$(echo "$repo" | xargs)
|
||||
if [ ! -z "$repo" ]; then
|
||||
REPO_NAME=$(basename "$repo" .git)
|
||||
CLONE_DIR="${STALWART_HOME}/plugins/${REPO_NAME}"
|
||||
if [ -d "${CLONE_DIR}/.git" ]; then
|
||||
echo "Updating plugin: ${REPO_NAME}..."
|
||||
cd "${CLONE_DIR}" && git pull && cd /home/container
|
||||
else
|
||||
echo "Cloning plugin: ${REPO_NAME}..."
|
||||
mkdir -p "${STALWART_HOME}/plugins"
|
||||
git clone "$repo" "${CLONE_DIR}"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# Replace Startup Variables
|
||||
MODIFIED_STARTUP=$(echo ${STARTUP} | sed -e 's/{{/${/g' -e 's/}}/}/g')
|
||||
echo -e ":/home/container$ ${MODIFIED_STARTUP}"
|
||||
|
||||
# Run the Server
|
||||
eval ${MODIFIED_STARTUP}
|
||||
@@ -0,0 +1,177 @@
|
||||
{
|
||||
"meta": {
|
||||
"version": "PTDL_v2",
|
||||
"description": "Garry's Mod Dedicated Server (64-bit) with Steam Workshop & Git support"
|
||||
},
|
||||
"name": "Garry's Mod 64-bit",
|
||||
"author": "admin@refoseltw.ru",
|
||||
"description": "Garry's Mod Dedicated Server running in 64-bit mode with Steam Workshop and Git addon loading support.",
|
||||
"features": null,
|
||||
"images": [
|
||||
{
|
||||
"image": "gitea.refoseltw.ru/RefoselTeamWork/yolks:latest",
|
||||
"meta": {
|
||||
"ghcr_enabled": false,
|
||||
"ghcr_organization": "",
|
||||
"ghcr_repo": ""
|
||||
}
|
||||
}
|
||||
],
|
||||
"file_denylist": [
|
||||
"server.cfg"
|
||||
],
|
||||
"startup": "/home/container/server/srcds_run -game garrysmod +map {{SRCDS_MAP}} +maxplayers {{SRCDS_MAX_PLAYERS}} -port {{SERVER_PORT}} -tickrate {{SRCDS_TICKRATE}} +ip 0.0.0.0 -autoupdate +gamemode {{SRCDS_GAMEMODE}}",
|
||||
"script": {
|
||||
"container": "gitea.refoseltw.ru/RefoselTeamWork/installers:debian",
|
||||
"entrypoint": "bash",
|
||||
"extends": ""
|
||||
},
|
||||
"config": {
|
||||
"files": "{}",
|
||||
"stop": "quit",
|
||||
"logs": "{}",
|
||||
"startup": {
|
||||
"done": "VAC secure mode is activated."
|
||||
},
|
||||
"professionally": false
|
||||
},
|
||||
"allocator": 0,
|
||||
"tags": [
|
||||
"gmod",
|
||||
"garrys-mod",
|
||||
"source-engine",
|
||||
"64bit"
|
||||
],
|
||||
"credits": "RefoselTeam",
|
||||
"update_url": "",
|
||||
"force_outgoing_ip": false,
|
||||
"remove_old_files": false,
|
||||
"variables": [
|
||||
{
|
||||
"name": "Hostname",
|
||||
"description": "The hostname of the server.",
|
||||
"env_variable": "SRCDS_HOSTNAME",
|
||||
"default_value": "Garry's Mod Server",
|
||||
"user_viewable": true,
|
||||
"user_editable": true,
|
||||
"rules": "required|string|between:1,64"
|
||||
},
|
||||
{
|
||||
"name": "Server Password",
|
||||
"description": "Password to join the server. Leave empty for no password.",
|
||||
"env_variable": "SRCDS_PASSWORD",
|
||||
"default_value": "",
|
||||
"user_viewable": true,
|
||||
"user_editable": true,
|
||||
"rules": "nullable|string|between:0,32"
|
||||
},
|
||||
{
|
||||
"name": "RCON Password",
|
||||
"description": "Remote console password. Change this!",
|
||||
"env_variable": "SRCDS_RCON_PASSWORD",
|
||||
"default_value": "changeme",
|
||||
"user_viewable": false,
|
||||
"user_editable": true,
|
||||
"rules": "required|string|between:1,32"
|
||||
},
|
||||
{
|
||||
"name": "Gamemode",
|
||||
"description": "The gamemode to use (sandbox, darkrp, etc).",
|
||||
"env_variable": "SRCDS_GAMEMODE",
|
||||
"default_value": "sandbox",
|
||||
"user_viewable": true,
|
||||
"user_editable": true,
|
||||
"rules": "required|string|between:1,32"
|
||||
},
|
||||
{
|
||||
"name": "Map",
|
||||
"description": "The starting map for the server.",
|
||||
"env_variable": "SRCDS_MAP",
|
||||
"default_value": "gm_flatgrass",
|
||||
"user_viewable": true,
|
||||
"user_editable": true,
|
||||
"rules": "required|string|between:1,32"
|
||||
},
|
||||
{
|
||||
"name": "Max Players",
|
||||
"description": "Maximum number of players allowed.",
|
||||
"env_variable": "SRCDS_MAX_PLAYERS",
|
||||
"default_value": "16",
|
||||
"user_viewable": true,
|
||||
"user_editable": true,
|
||||
"rules": "required|integer|between:1,128"
|
||||
},
|
||||
{
|
||||
"name": "Tickrate",
|
||||
"description": "Server tickrate (66 or 128 recommended).",
|
||||
"env_variable": "SRCDS_TICKRATE",
|
||||
"default_value": "66",
|
||||
"user_viewable": true,
|
||||
"user_editable": true,
|
||||
"rules": "required|integer|between:33,128"
|
||||
},
|
||||
{
|
||||
"name": "Region",
|
||||
"description": "Server region (255 = global, 0 = US East, 1 = US West, 2 = South America, 3 = Europe, 4 = Asia, 5 = Australia, 6 = Middle East, 7 = Africa).",
|
||||
"env_variable": "SRCDS_REGION",
|
||||
"default_value": "255",
|
||||
"user_viewable": true,
|
||||
"user_editable": false,
|
||||
"rules": "required|integer|between:0,255"
|
||||
},
|
||||
{
|
||||
"name": "Workshop Collection ID",
|
||||
"description": "Steam Workshop collection ID to auto-load on startup.",
|
||||
"env_variable": "SRCDS_WORKSHOP_COLLECTION",
|
||||
"default_value": "",
|
||||
"user_viewable": true,
|
||||
"user_editable": true,
|
||||
"rules": "nullable|string|between:0,64"
|
||||
},
|
||||
{
|
||||
"name": "Git Repositories",
|
||||
"description": "Comma-separated list of Git repo URLs to clone into addons/ (e.g. https://github.com/user/repo.git,https://gitlab.com/user/repo2.git).",
|
||||
"env_variable": "GIT_REPOS",
|
||||
"default_value": "",
|
||||
"user_viewable": true,
|
||||
"user_editable": true,
|
||||
"rules": "nullable|string|between:0,1024"
|
||||
},
|
||||
{
|
||||
"name": "Steam Beta Branch",
|
||||
"description": "Steam beta branch to use. Leave empty for default.",
|
||||
"env_variable": "SRCDS_BETAID",
|
||||
"default_value": "",
|
||||
"user_viewable": true,
|
||||
"user_editable": true,
|
||||
"rules": "nullable|string|between:0,64"
|
||||
},
|
||||
{
|
||||
"name": "Beta Password",
|
||||
"description": "Password for the beta branch.",
|
||||
"env_variable": "SRCDS_BETAPASS",
|
||||
"default_value": "",
|
||||
"user_viewable": true,
|
||||
"user_editable": true,
|
||||
"rules": "nullable|string|between:0,64"
|
||||
},
|
||||
{
|
||||
"name": "Auto Update",
|
||||
"description": "Automatically update the server on restart (1 = yes, 0 = no).",
|
||||
"env_variable": "AUTO_UPDATE",
|
||||
"default_value": "1",
|
||||
"user_viewable": true,
|
||||
"user_editable": true,
|
||||
"rules": "required|boolean"
|
||||
},
|
||||
{
|
||||
"name": "Validate Files",
|
||||
"description": "Validate server files on update (1 = yes, 0 = no).",
|
||||
"env_variable": "VALIDATE",
|
||||
"default_value": "",
|
||||
"user_viewable": true,
|
||||
"user_editable": true,
|
||||
"rules": "nullable|boolean"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,151 @@
|
||||
{
|
||||
"meta": {
|
||||
"version": "PTDL_v2",
|
||||
"description": "Stalwart Mail Server - All-in-one SMTP, IMAP, JMAP, CalDAV, CardDAV"
|
||||
},
|
||||
"name": "Stalwart Mail Server",
|
||||
"author": "admin@refoseltw.ru",
|
||||
"description": "Stalwart Mail Server - secure, scalable all-in-one mail server with SMTP, IMAP, JMAP, CalDAV, CardDAV and built-in spam filter. Single binary, zero dependencies.",
|
||||
"features": null,
|
||||
"images": [
|
||||
{
|
||||
"image": "gitea.refoseltw.ru/RefoselTeamWork/yolks:stalwart",
|
||||
"meta": {
|
||||
"ghcr_enabled": false,
|
||||
"ghcr_organization": "",
|
||||
"ghcr_repo": ""
|
||||
}
|
||||
}
|
||||
],
|
||||
"file_denylist": [],
|
||||
"startup": "/home/container/stalwart-mail/bin/stalwart-mail --config /home/container/stalwart-mail/config.toml",
|
||||
"script": {
|
||||
"container": "gitea.refoseltw.ru/RefoselTeamWork/installers:debian",
|
||||
"entrypoint": "bash",
|
||||
"extends": ""
|
||||
},
|
||||
"config": {
|
||||
"files": "{}",
|
||||
"stop": "^C",
|
||||
"logs": "{}",
|
||||
"startup": {
|
||||
"done": "listening on"
|
||||
},
|
||||
"professionally": false
|
||||
},
|
||||
"allocator": 0,
|
||||
"tags": [
|
||||
"mail",
|
||||
"smtp",
|
||||
"imap",
|
||||
"jmap",
|
||||
"caldav",
|
||||
"carddav",
|
||||
"email"
|
||||
],
|
||||
"credits": "RefoselTeam",
|
||||
"update_url": "",
|
||||
"force_outgoing_ip": false,
|
||||
"remove_old_files": false,
|
||||
"variables": [
|
||||
{
|
||||
"name": "Mail Domain",
|
||||
"description": "Your mail domain (e.g. mail.example.com). This is the FQDN for the mail server.",
|
||||
"env_variable": "MAIL_DOMAIN",
|
||||
"default_value": "mail.example.com",
|
||||
"user_viewable": true,
|
||||
"user_editable": true,
|
||||
"rules": "required|fqdn"
|
||||
},
|
||||
{
|
||||
"name": "Mail Hostname",
|
||||
"description": "Server hostname (FQDN). Usually same as mail domain.",
|
||||
"env_variable": "MAIL_HOSTNAME",
|
||||
"default_value": "",
|
||||
"user_viewable": true,
|
||||
"user_editable": true,
|
||||
"rules": "nullable|fqdn"
|
||||
},
|
||||
{
|
||||
"name": "Admin Email",
|
||||
"description": "Email address for the admin account.",
|
||||
"env_variable": "ADMIN_EMAIL",
|
||||
"default_value": "",
|
||||
"user_viewable": true,
|
||||
"user_editable": true,
|
||||
"rules": "nullable|email"
|
||||
},
|
||||
{
|
||||
"name": "Admin Password",
|
||||
"description": "Password for the admin account. If empty, a random password will be generated.",
|
||||
"env_variable": "ADMIN_PASSWORD",
|
||||
"default_value": "",
|
||||
"user_viewable": true,
|
||||
"user_editable": true,
|
||||
"rules": "nullable|string|between:8,128"
|
||||
},
|
||||
{
|
||||
"name": "HTTP Port",
|
||||
"description": "Port for the web admin panel.",
|
||||
"env_variable": "HTTP_PORT",
|
||||
"default_value": "8080",
|
||||
"user_viewable": true,
|
||||
"user_editable": true,
|
||||
"rules": "required|integer|between:1024,65535"
|
||||
},
|
||||
{
|
||||
"name": "SMTP Port",
|
||||
"description": "Port for SMTPS (SSL/TLS).",
|
||||
"env_variable": "SMTP_PORT",
|
||||
"default_value": "465",
|
||||
"user_viewable": true,
|
||||
"user_editable": false,
|
||||
"rules": "required|integer|between:1,65535"
|
||||
},
|
||||
{
|
||||
"name": "Submission Port",
|
||||
"description": "Port for SMTP Submission (STARTTLS).",
|
||||
"env_variable": "SUBMISSION_PORT",
|
||||
"default_value": "587",
|
||||
"user_viewable": true,
|
||||
"user_editable": false,
|
||||
"rules": "required|integer|between:1,65535"
|
||||
},
|
||||
{
|
||||
"name": "IMAP Port",
|
||||
"description": "Port for IMAPS (SSL/TLS).",
|
||||
"env_variable": "IMAP_PORT",
|
||||
"default_value": "993",
|
||||
"user_viewable": true,
|
||||
"user_editable": false,
|
||||
"rules": "required|integer|between:1,65535"
|
||||
},
|
||||
{
|
||||
"name": "ManageSieve Port",
|
||||
"description": "Port for ManageSieve.",
|
||||
"env_variable": "MANAGESIEVE_PORT",
|
||||
"default_value": "4190",
|
||||
"user_viewable": true,
|
||||
"user_editable": false,
|
||||
"rules": "required|integer|between:1,65535"
|
||||
},
|
||||
{
|
||||
"name": "Git Repositories",
|
||||
"description": "Comma-separated list of Git repo URLs to clone into plugins/ (for custom configs, filters, etc).",
|
||||
"env_variable": "GIT_REPOS",
|
||||
"default_value": "",
|
||||
"user_viewable": true,
|
||||
"user_editable": true,
|
||||
"rules": "nullable|string|between:0,1024"
|
||||
},
|
||||
{
|
||||
"name": "Timezone",
|
||||
"description": "Server timezone.",
|
||||
"env_variable": "TZ",
|
||||
"default_value": "UTC",
|
||||
"user_viewable": true,
|
||||
"user_editable": true,
|
||||
"rules": "required|string|between:1,64"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
FROM --platform=$TARGETOS/$TARGETARCH debian:bookworm-slim
|
||||
|
||||
LABEL author="RefoselTeam" maintainer="admin@refoseltw.ru"
|
||||
|
||||
LABEL org.opencontainers.image.source="https://gitea.refoseltw.ru/RefoselTeamWork/yolks"
|
||||
LABEL org.opencontainers.image.licenses=MIT
|
||||
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
RUN dpkg --add-architecture i386 \
|
||||
&& apt update \
|
||||
&& apt upgrade -y \
|
||||
&& apt install -y \
|
||||
curl \
|
||||
g++ \
|
||||
gcc \
|
||||
gdb \
|
||||
git \
|
||||
iproute2 \
|
||||
locales \
|
||||
net-tools \
|
||||
netcat-traditional \
|
||||
tar \
|
||||
telnet \
|
||||
tini \
|
||||
tzdata \
|
||||
wget \
|
||||
lib32gcc-s1 \
|
||||
lib32stdc++6 \
|
||||
lib32tinfo6 \
|
||||
lib32z1 \
|
||||
libcurl3-gnutls:i386 \
|
||||
libcurl4-gnutls-dev:i386 \
|
||||
libcurl4:i386 \
|
||||
libfontconfig1 \
|
||||
libgcc-11-dev \
|
||||
libgcc-12-dev \
|
||||
libncurses5:i386 \
|
||||
libsdl1.2debian \
|
||||
libsdl2-2.0-0:i386 \
|
||||
libssl-dev:i386 \
|
||||
libtinfo6:i386 \
|
||||
&& apt clean \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Install SteamCMD
|
||||
RUN mkdir -p /usr/games/steamcmd \
|
||||
&& cd /usr/games/steamcmd \
|
||||
&& curl -sSL https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz | tar -xzv
|
||||
|
||||
# Install rcon
|
||||
RUN cd /tmp/ \
|
||||
&& curl -sSL https://github.com/gorcon/rcon-cli/releases/download/v0.10.3/rcon-0.10.3-amd64_linux.tar.gz > rcon.tar.gz \
|
||||
&& tar xvf rcon.tar.gz \
|
||||
&& mv rcon-0.10.3-amd64_linux/rcon /usr/local/bin/ \
|
||||
&& rm -rf /tmp/*
|
||||
|
||||
# Temp fix for things that still need libssl1.1
|
||||
RUN if [ "$(uname -m)" = "x86_64" ]; then \
|
||||
wget http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.0g-2ubuntu4_amd64.deb && \
|
||||
dpkg -i libssl1.1_1.1.0g-2ubuntu4_amd64.deb && \
|
||||
rm libssl1.1_1.1.0g-2ubuntu4_amd64.deb; \
|
||||
fi
|
||||
|
||||
# Set the locale
|
||||
RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && \
|
||||
locale-gen
|
||||
ENV LANG=en_US.UTF-8
|
||||
ENV LANGUAGE=en_US:en
|
||||
ENV LC_ALL=en_US.UTF-8
|
||||
|
||||
# Setup user and working directory
|
||||
RUN useradd -m -d /home/container -s /bin/bash container
|
||||
USER container
|
||||
ENV USER=container HOME=/home/container
|
||||
WORKDIR /home/container
|
||||
|
||||
STOPSIGNAL SIGINT
|
||||
|
||||
COPY --chown=container:container ./entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
ENTRYPOINT ["/usr/bin/tini", "-g", "--"]
|
||||
CMD ["/entrypoint.sh"]
|
||||
@@ -0,0 +1,73 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Wait for the container to fully initialize
|
||||
sleep 1
|
||||
|
||||
# Default the TZ environment variable to UTC.
|
||||
TZ=${TZ:-UTC}
|
||||
export TZ
|
||||
|
||||
# Set environment variable that holds the Internal Docker IP
|
||||
INTERNAL_IP=$(ip route get 1 | awk '{print $(NF-2);exit}')
|
||||
export INTERNAL_IP
|
||||
|
||||
# Switch to the container's working directory
|
||||
cd /home/container || exit 1
|
||||
|
||||
# Default steam user
|
||||
if [ "${STEAM_USER}" == "" ]; then
|
||||
echo -e "steam user is not set.\n"
|
||||
echo -e "Using anonymous user.\n"
|
||||
STEAM_USER=anonymous
|
||||
STEAM_PASS=""
|
||||
STEAM_AUTH=""
|
||||
else
|
||||
echo -e "user set to ${STEAM_USER}"
|
||||
fi
|
||||
|
||||
# Auto update
|
||||
if [ -z ${AUTO_UPDATE} ] || [ "${AUTO_UPDATE}" == "1" ]; then
|
||||
if [ ! -z ${SRCDS_APPID} ]; then
|
||||
/usr/games/steamcmd/steamcmd.sh +force_install_dir /home/container +login ${STEAM_USER} ${STEAM_PASS} ${STEAM_AUTH} +app_update 1007 +app_update ${SRCDS_APPID} $( [[ -z ${SRCDS_BETAID} ]] || printf %s "-beta ${SRCDS_BETAID}" ) $( [[ -z ${SRCDS_BETAPASS} ]] || printf %s "-betapassword ${SRCDS_BETAPASS}" ) $( [[ -z ${HLDS_GAME} ]] || printf %s "+app_set_config 90 mod ${HLDS_GAME}" ) $( [[ -z ${VALIDATE} ]] || printf %s "validate" ) +quit
|
||||
else
|
||||
echo -e "No appid set. Starting Server"
|
||||
fi
|
||||
else
|
||||
echo -e "Not updating game server as auto update was set to 0. Starting Server"
|
||||
fi
|
||||
|
||||
# Create Steam SDK symlinks
|
||||
mkdir -p .steam/sdk64
|
||||
ln -sf /usr/games/steamcmd/linux64/steamclient.so .steam/sdk64/steamclient.so
|
||||
ln -sf /usr/games/steamcmd/linux32/steamclient.so .steam/sdk32/steamclient.so
|
||||
|
||||
# Clone Git addons if GIT_REPOS is set
|
||||
if [ ! -z "${GIT_REPOS}" ]; then
|
||||
IFS=',' read -ra REPOS <<< "$GIT_REPOS"
|
||||
for repo in "${REPOS[@]}"; do
|
||||
repo=$(echo "$repo" | xargs)
|
||||
if [ ! -z "$repo" ]; then
|
||||
REPO_NAME=$(basename "$repo" .git)
|
||||
ADDON_DIR="garrysmod/addons/${REPO_NAME}"
|
||||
if [ -d "$ADDON_DIR/.git" ]; then
|
||||
echo "Updating Git addon: ${REPO_NAME}..."
|
||||
cd "$ADDON_DIR" && git pull && cd /home/container
|
||||
else
|
||||
echo "Cloning Git addon: ${REPO_NAME}..."
|
||||
git clone "$repo" "$ADDON_DIR"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# Load Workshop collection
|
||||
if [ ! -z "${SRCDS_WORKSHOP_COLLECTION}" ]; then
|
||||
echo "Workshop collection ${SRCDS_WORKSHOP_COLLECTION} will be loaded on first start."
|
||||
fi
|
||||
|
||||
# Replace Startup Variables
|
||||
MODIFIED_STARTUP=$(echo ${STARTUP} | sed -e 's/{{/${/g' -e 's/}}/}/g')
|
||||
echo -e ":/home/container$ ${MODIFIED_STARTUP}"
|
||||
|
||||
# Run the Server
|
||||
eval ${MODIFIED_STARTUP}
|
||||
Reference in New Issue
Block a user