New Minecraft Role
This commit is contained in:
12
ansible.cfg
Normal file
12
ansible.cfg
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
[defaults]
|
||||||
|
inventory = inventory
|
||||||
|
library = library
|
||||||
|
vault_password_file = ./.ansible_vault_pass
|
||||||
|
|
||||||
|
[privilege_escalation]
|
||||||
|
become = true
|
||||||
|
become_method = su
|
||||||
|
become_user = root
|
||||||
|
|
||||||
|
[ssh_connection]
|
||||||
|
scp_if_ssh=True
|
||||||
7
inventory/group_vars/all/users.yml
Normal file
7
inventory/group_vars/all/users.yml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
userdb:
|
||||||
|
user:
|
||||||
|
user_group: user
|
||||||
|
user_pass: "salt"
|
||||||
|
key: "ssh-rsa"
|
||||||
|
virt_manage: True
|
||||||
9
inventory/vm.yml
Normal file
9
inventory/vm.yml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
all:
|
||||||
|
hosts:
|
||||||
|
server
|
||||||
|
ansible_host: 192.168.1.100
|
||||||
|
ansible_port: 22
|
||||||
|
ssh_port: 22
|
||||||
|
vars:
|
||||||
|
hosts_gateway: 192.168.1.1
|
||||||
20
roles/minecraft/README.md
Normal file
20
roles/minecraft/README.md
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
# minecraft role
|
||||||
|
|
||||||
|
Роль для разворачивания сервера майнкрафта.
|
||||||
|
|
||||||
|
Перед прокаткой роли необходимо поставить некоторые модули к ansible:
|
||||||
|
```
|
||||||
|
ansible-galaxy collection install community.general
|
||||||
|
```
|
||||||
|
|
||||||
|
На хосте должен быть настроен sshd (PermitRootLogin yes) и установлен Python3.
|
||||||
|
|
||||||
|
Первый запуск роли происходит с помощью команды:
|
||||||
|
```
|
||||||
|
ansible-playbook -l server roles/minecraft/minecraft.yml -u root --ask-pass
|
||||||
|
```
|
||||||
|
|
||||||
|
После настройки системы роль может запускаться следующим образом:
|
||||||
|
```
|
||||||
|
ansible-playbook -l server roles/minecraft/minecraft.yml -K
|
||||||
|
```
|
||||||
136
roles/minecraft/defaults/main.yml
Normal file
136
roles/minecraft/defaults/main.yml
Normal file
@@ -0,0 +1,136 @@
|
|||||||
|
---
|
||||||
|
### COMMON ###
|
||||||
|
|
||||||
|
alpine_version: latest-stable
|
||||||
|
|
||||||
|
|
||||||
|
### PACKAGES ###
|
||||||
|
|
||||||
|
system_pkgs:
|
||||||
|
- chrony
|
||||||
|
- tzdata
|
||||||
|
- htop
|
||||||
|
- screen
|
||||||
|
- git
|
||||||
|
- wget
|
||||||
|
- mc
|
||||||
|
- ncdu
|
||||||
|
- vim
|
||||||
|
- nano
|
||||||
|
- rsync
|
||||||
|
- unzip
|
||||||
|
- tar
|
||||||
|
|
||||||
|
mine_pkgs:
|
||||||
|
- openjdk17-jdk
|
||||||
|
- ncurses
|
||||||
|
- rcon
|
||||||
|
|
||||||
|
ext_pkgs:
|
||||||
|
- mariadb
|
||||||
|
- mariadb-client
|
||||||
|
- mariadb-backup
|
||||||
|
- py3-pymysql
|
||||||
|
- nginx
|
||||||
|
- php82-fpm
|
||||||
|
- php-pdo_mysql
|
||||||
|
- php82-mysqli
|
||||||
|
- php82-session
|
||||||
|
|
||||||
|
|
||||||
|
### Nginx ###
|
||||||
|
|
||||||
|
nginx_user: nginx
|
||||||
|
worker_processes: auto
|
||||||
|
worker_connections: 1024
|
||||||
|
root_dir: /srv/www
|
||||||
|
log_dir: /var/log/nginx
|
||||||
|
|
||||||
|
|
||||||
|
### php-fpm ###
|
||||||
|
|
||||||
|
phpfpm_ver: "php82-fpm"
|
||||||
|
phpfpm_init: "php-fpm82"
|
||||||
|
phpfpm_path: "/etc/php82/"
|
||||||
|
|
||||||
|
|
||||||
|
### MariaDB ###
|
||||||
|
|
||||||
|
sql_user: minecraft_sql
|
||||||
|
sql_pass: !vault |
|
||||||
|
$ANSIBLE_VAULT;1.1;AES256
|
||||||
|
blabla
|
||||||
|
|
||||||
|
minecraft_db:
|
||||||
|
- dynmap
|
||||||
|
- logsec
|
||||||
|
- permissionsex
|
||||||
|
- luckperms
|
||||||
|
|
||||||
|
### SSH ###
|
||||||
|
|
||||||
|
# SEE in inventory lxc.yml
|
||||||
|
|
||||||
|
### SERVER ###
|
||||||
|
|
||||||
|
server_user: user
|
||||||
|
|
||||||
|
MINHEAP: 2G
|
||||||
|
MAXHEAP: 10G
|
||||||
|
|
||||||
|
### SERVER CONFIG ###
|
||||||
|
|
||||||
|
rcon_port: 25566
|
||||||
|
# survival, creative, adventure, spectator
|
||||||
|
gamemode: survival
|
||||||
|
enforce_secure_profile: false
|
||||||
|
level_name: world
|
||||||
|
server_status: Hello
|
||||||
|
view_distance: 10
|
||||||
|
game_port: 25565
|
||||||
|
# true or false
|
||||||
|
pvp: true
|
||||||
|
# Обновление блоков (актуально для редстоун машин)
|
||||||
|
# default - 1000000
|
||||||
|
neighbor_updates: 1000
|
||||||
|
# peaceful, easy, normal and hard
|
||||||
|
difficulty: hard
|
||||||
|
# Размер пакета до его сжатия, больше значение - большая производительность
|
||||||
|
# CPU (но при этом пользователи со слабым интернетом страдают).
|
||||||
|
# -1 отключает компрессию
|
||||||
|
network_compression_threshold: 128
|
||||||
|
max_players: 100
|
||||||
|
# true or false
|
||||||
|
enable_rcon: false
|
||||||
|
#Позволяет изменять права операторов.
|
||||||
|
# 1 — Операторы могут ломать / ставить блоки внутри радиуса защиты
|
||||||
|
# территории спауна.
|
||||||
|
# 2 — Операторы могут использовать команды /clear, /difficulty, /effect,
|
||||||
|
# /gamemode, /gamerule, /give, /tp, и могут изменять командные блоки.
|
||||||
|
# 3 — Операторы могут использовать команды /ban, /deop, /kick, и /op.
|
||||||
|
# 4 — Операторы могут использовать команду /stop.
|
||||||
|
op_permission_level: 3
|
||||||
|
# Позволяет изменять дистанцию рендера энтити для клиентов в процентах.
|
||||||
|
# Более высокие значения могут привести к снижению производительности сервера,
|
||||||
|
# поскольку чем выше значение, тем выше дальность прорисовки энтити и больше
|
||||||
|
# ресурсов нужно для их обработки.
|
||||||
|
# Это настройка выражается в процентах (100% — по умолчанию). Например,
|
||||||
|
# установка этого значения на 50 уменьшит дальность рендера энтити вдвое.
|
||||||
|
# Представляет собой серверный аналог изменения прорисовки у клиента.
|
||||||
|
entity_broadcast_range: 150
|
||||||
|
simulation_distance: 10
|
||||||
|
rcon_password: 12345qaz
|
||||||
|
spawn_protection: 3
|
||||||
|
|
||||||
|
|
||||||
|
### OPS ###
|
||||||
|
|
||||||
|
ops:
|
||||||
|
Player:
|
||||||
|
uuid: "blabla"
|
||||||
|
level: 3
|
||||||
|
bypassesPlayerLimit: false
|
||||||
|
Admin:
|
||||||
|
uuid: "blabla"
|
||||||
|
level: 3
|
||||||
|
bypassesPlayerLimit: false
|
||||||
17
roles/minecraft/files/mariadb/mariadb-server.cnf
Normal file
17
roles/minecraft/files/mariadb/mariadb-server.cnf
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
[server]
|
||||||
|
bind-address=127.0.0.1
|
||||||
|
|
||||||
|
|
||||||
|
[mysqld]
|
||||||
|
#skip-networking
|
||||||
|
|
||||||
|
|
||||||
|
[galera]
|
||||||
|
|
||||||
|
|
||||||
|
[embedded]
|
||||||
|
|
||||||
|
|
||||||
|
[mariadb]
|
||||||
|
|
||||||
|
[mariadb-10.5]
|
||||||
Binary file not shown.
BIN
roles/minecraft/files/plugins/AntiPopup-7.3.jar
Normal file
BIN
roles/minecraft/files/plugins/AntiPopup-7.3.jar
Normal file
Binary file not shown.
BIN
roles/minecraft/files/plugins/Dynmap-3.7-beta-4-spigot.jar
Normal file
BIN
roles/minecraft/files/plugins/Dynmap-3.7-beta-4-spigot.jar
Normal file
Binary file not shown.
BIN
roles/minecraft/files/plugins/EssentialsX-2.20.1.jar
Normal file
BIN
roles/minecraft/files/plugins/EssentialsX-2.20.1.jar
Normal file
Binary file not shown.
BIN
roles/minecraft/files/plugins/EssentialsXChat-2.20.1.jar
Normal file
BIN
roles/minecraft/files/plugins/EssentialsXChat-2.20.1.jar
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
roles/minecraft/files/plugins/Geyser-Spigot.jar
Normal file
BIN
roles/minecraft/files/plugins/Geyser-Spigot.jar
Normal file
Binary file not shown.
BIN
roles/minecraft/files/plugins/LoginSecurity-Spigot-3.3.0.jar
Normal file
BIN
roles/minecraft/files/plugins/LoginSecurity-Spigot-3.3.0.jar
Normal file
Binary file not shown.
BIN
roles/minecraft/files/plugins/LuckPerms-Bukkit-5.4.102.jar
Normal file
BIN
roles/minecraft/files/plugins/LuckPerms-Bukkit-5.4.102.jar
Normal file
Binary file not shown.
BIN
roles/minecraft/files/plugins/ProtocolLib.jar
Normal file
BIN
roles/minecraft/files/plugins/ProtocolLib.jar
Normal file
Binary file not shown.
BIN
roles/minecraft/files/plugins/SkinsRestorer.jar
Normal file
BIN
roles/minecraft/files/plugins/SkinsRestorer.jar
Normal file
Binary file not shown.
BIN
roles/minecraft/files/plugins/Vault.jar
Normal file
BIN
roles/minecraft/files/plugins/Vault.jar
Normal file
Binary file not shown.
BIN
roles/minecraft/files/plugins/floodgate-spigot.jar
Normal file
BIN
roles/minecraft/files/plugins/floodgate-spigot.jar
Normal file
Binary file not shown.
Binary file not shown.
BIN
roles/minecraft/files/plugins/spark-1.10.58-bukkit.jar
Normal file
BIN
roles/minecraft/files/plugins/spark-1.10.58-bukkit.jar
Normal file
Binary file not shown.
4
roles/minecraft/files/repositories
Normal file
4
roles/minecraft/files/repositories
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
# Managed by Ansible
|
||||||
|
|
||||||
|
http://mirror.yandex.ru/mirrors/alpine/latest-stable/main
|
||||||
|
http://mirror.yandex.ru/mirrors/alpine/latest-stable/community
|
||||||
BIN
roles/minecraft/files/server-icon.png
Normal file
BIN
roles/minecraft/files/server-icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 16 KiB |
BIN
roles/minecraft/files/server-icon_1.png
Normal file
BIN
roles/minecraft/files/server-icon_1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 8.2 KiB |
BIN
roles/minecraft/files/server-icon_2.png
Normal file
BIN
roles/minecraft/files/server-icon_2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 11 KiB |
BIN
roles/minecraft/files/server-icon_3.png
Normal file
BIN
roles/minecraft/files/server-icon_3.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 8.0 KiB |
1
roles/minecraft/files/server/eula.txt
Normal file
1
roles/minecraft/files/server/eula.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
eula=true
|
||||||
BIN
roles/minecraft/files/server/paper-1.20.4-378.jar
Normal file
BIN
roles/minecraft/files/server/paper-1.20.4-378.jar
Normal file
Binary file not shown.
35
roles/minecraft/handlers/main.yml
Normal file
35
roles/minecraft/handlers/main.yml
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
---
|
||||||
|
- name: Restart ssh server
|
||||||
|
ansible.builtin.service:
|
||||||
|
name: sshd
|
||||||
|
state: restarted
|
||||||
|
|
||||||
|
- name: Restart chronyd
|
||||||
|
ansible.builtin.service:
|
||||||
|
name: chronyd
|
||||||
|
state: restarted
|
||||||
|
|
||||||
|
- name: Restart minecraft Server
|
||||||
|
ansible.builtin.service:
|
||||||
|
name: minecraftd
|
||||||
|
state: restarted
|
||||||
|
|
||||||
|
- name: Reload minecraft Server
|
||||||
|
ansible.builtin.service:
|
||||||
|
name: minecraftd
|
||||||
|
state: reloaded
|
||||||
|
|
||||||
|
- name: Restart MariaDB
|
||||||
|
ansible.builtin.service:
|
||||||
|
name: mariadb
|
||||||
|
state: restarted
|
||||||
|
|
||||||
|
- name: Restart php-fpm
|
||||||
|
ansible.builtin.service:
|
||||||
|
name: "{{ phpfpm_init }}"
|
||||||
|
state: restarted
|
||||||
|
|
||||||
|
- name: Restart nginx
|
||||||
|
ansible.builtin.service:
|
||||||
|
name: nginx
|
||||||
|
state: restarted
|
||||||
8
roles/minecraft/minecraft.yml
Normal file
8
roles/minecraft/minecraft.yml
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
- name: Minecraft Role
|
||||||
|
become: yes
|
||||||
|
hosts: all
|
||||||
|
gather_facts: yes
|
||||||
|
|
||||||
|
roles:
|
||||||
|
- ../minecraft
|
||||||
24
roles/minecraft/tasks/backups.yml
Normal file
24
roles/minecraft/tasks/backups.yml
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
---
|
||||||
|
- name: Create a backup directory
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: "/home/{{ server_user }}/backups"
|
||||||
|
state: directory
|
||||||
|
owner: "{{ server_user }}"
|
||||||
|
group: "{{ server_user }}"
|
||||||
|
mode: '0755'
|
||||||
|
|
||||||
|
- name: Generate backup script
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: backup_server.j2
|
||||||
|
dest: "/home/{{ server_user }}/backup_server.sh"
|
||||||
|
owner: "{{ server_user }}"
|
||||||
|
group: "{{ server_user }}"
|
||||||
|
mode: '0755'
|
||||||
|
|
||||||
|
- name: Creates a cron file for backup
|
||||||
|
ansible.builtin.cron:
|
||||||
|
name: Backup Minecraft server
|
||||||
|
minute: "0"
|
||||||
|
hour: "1"
|
||||||
|
user: "{{ server_user }}"
|
||||||
|
job: "/home/{{ server_user }}/backup_server.sh"
|
||||||
54
roles/minecraft/tasks/basic.yml
Normal file
54
roles/minecraft/tasks/basic.yml
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
---
|
||||||
|
- name: Rename host
|
||||||
|
ansible.builtin.hostname:
|
||||||
|
name: "{{ inventory_hostname }}"
|
||||||
|
|
||||||
|
- name: Change hosts
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: hosts.j2
|
||||||
|
dest: /etc/hosts
|
||||||
|
backup: true
|
||||||
|
|
||||||
|
- name: Change MOTD file
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: motd.j2
|
||||||
|
dest: /etc/motd
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: '0644'
|
||||||
|
backup: true
|
||||||
|
|
||||||
|
- name: Set timezone to Europe/Moscow
|
||||||
|
community.general.timezone:
|
||||||
|
name: Europe/Moscow
|
||||||
|
|
||||||
|
- name: Modify chronyd init.d args
|
||||||
|
ansible.builtin.lineinfile:
|
||||||
|
path: /etc/conf.d/chronyd
|
||||||
|
regexp: 'ARGS=""'
|
||||||
|
line: 'ARGS="-x"'
|
||||||
|
|
||||||
|
- name: Add Chrony to boot
|
||||||
|
ansible.builtin.service:
|
||||||
|
name: chronyd
|
||||||
|
runlevel: default
|
||||||
|
enabled: True
|
||||||
|
use: openrc
|
||||||
|
when: not ansible_check_mode
|
||||||
|
notify: Restart chronyd
|
||||||
|
|
||||||
|
- name: Create sshd.conf
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: sshd_config.j2
|
||||||
|
dest: /etc/ssh/sshd_config
|
||||||
|
validate: /usr/sbin/sshd -t -f %s
|
||||||
|
backup: true
|
||||||
|
notify: Restart ssh server
|
||||||
|
|
||||||
|
- name: Add sshd to boot
|
||||||
|
ansible.builtin.service:
|
||||||
|
name: sshd
|
||||||
|
runlevel: default
|
||||||
|
enabled: True
|
||||||
|
use: openrc
|
||||||
|
when: not ansible_check_mode
|
||||||
108
roles/minecraft/tasks/main.yml
Normal file
108
roles/minecraft/tasks/main.yml
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
---
|
||||||
|
- name: Update and install packets
|
||||||
|
ansible.builtin.include_tasks:
|
||||||
|
file: packets.yml
|
||||||
|
apply:
|
||||||
|
tags:
|
||||||
|
- run_update
|
||||||
|
tags:
|
||||||
|
- always
|
||||||
|
|
||||||
|
- name: Make basic configure
|
||||||
|
ansible.builtin.include_tasks:
|
||||||
|
file: basic.yml
|
||||||
|
apply:
|
||||||
|
tags:
|
||||||
|
- run_basic
|
||||||
|
tags:
|
||||||
|
- always
|
||||||
|
|
||||||
|
- name: Create users
|
||||||
|
ansible.builtin.include_tasks:
|
||||||
|
file: users.yml
|
||||||
|
apply:
|
||||||
|
tags:
|
||||||
|
- run_users
|
||||||
|
tags:
|
||||||
|
- always
|
||||||
|
|
||||||
|
- name: Deploy Initd server daemon
|
||||||
|
ansible.builtin.include_tasks:
|
||||||
|
file: service.yml
|
||||||
|
apply:
|
||||||
|
tags:
|
||||||
|
- run_service
|
||||||
|
tags:
|
||||||
|
- always
|
||||||
|
|
||||||
|
- name: Deploy Server
|
||||||
|
ansible.builtin.include_tasks:
|
||||||
|
file: server.yml
|
||||||
|
apply:
|
||||||
|
tags:
|
||||||
|
- run_server
|
||||||
|
tags:
|
||||||
|
- always
|
||||||
|
|
||||||
|
- name: Make backuping
|
||||||
|
ansible.builtin.include_tasks:
|
||||||
|
file: backups.yml
|
||||||
|
apply:
|
||||||
|
tags:
|
||||||
|
- run_backups
|
||||||
|
tags:
|
||||||
|
- always
|
||||||
|
|
||||||
|
- name: Install plugins
|
||||||
|
ansible.builtin.include_tasks:
|
||||||
|
file: plugins.yml
|
||||||
|
apply:
|
||||||
|
tags:
|
||||||
|
- run_plugins
|
||||||
|
tags:
|
||||||
|
- always
|
||||||
|
|
||||||
|
- name: Config OPs
|
||||||
|
ansible.builtin.include_tasks:
|
||||||
|
file: ops.yml
|
||||||
|
apply:
|
||||||
|
tags:
|
||||||
|
- run_ops
|
||||||
|
tags:
|
||||||
|
- always
|
||||||
|
|
||||||
|
- name: Configure MariaDB server
|
||||||
|
ansible.builtin.include_tasks:
|
||||||
|
file: mariadb.yml
|
||||||
|
apply:
|
||||||
|
tags:
|
||||||
|
- run_mariadb
|
||||||
|
tags:
|
||||||
|
- always
|
||||||
|
|
||||||
|
- name: Configure php-fpm
|
||||||
|
ansible.builtin.include_tasks:
|
||||||
|
file: php.yml
|
||||||
|
apply:
|
||||||
|
tags:
|
||||||
|
- run_php
|
||||||
|
tags:
|
||||||
|
- always
|
||||||
|
|
||||||
|
- name: Configure nginx
|
||||||
|
ansible.builtin.include_tasks:
|
||||||
|
file: nginx.yml
|
||||||
|
apply:
|
||||||
|
tags:
|
||||||
|
- run_nginx
|
||||||
|
tags:
|
||||||
|
- always
|
||||||
|
|
||||||
|
- name: Tuning server and plugins
|
||||||
|
ansible.builtin.include_tasks:
|
||||||
|
file: tuning.yml
|
||||||
|
apply:
|
||||||
|
tags:
|
||||||
|
- run_tuning
|
||||||
|
tags:
|
||||||
|
- always
|
||||||
101
roles/minecraft/tasks/mariadb.yml
Normal file
101
roles/minecraft/tasks/mariadb.yml
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
---
|
||||||
|
- name: Update repositories
|
||||||
|
community.general.apk:
|
||||||
|
update_cache: true
|
||||||
|
|
||||||
|
- name: Install ext packages
|
||||||
|
community.general.apk:
|
||||||
|
name: "{{ ext_pkgs }}"
|
||||||
|
state: present
|
||||||
|
when: not ansible_check_mode
|
||||||
|
|
||||||
|
- name: Check that the mysql dir exists
|
||||||
|
ansible.builtin.stat :
|
||||||
|
path: /var/lib/mysql
|
||||||
|
register: stat_result
|
||||||
|
|
||||||
|
- name: Init Mariadb
|
||||||
|
ansible.builtin.service:
|
||||||
|
name: mariadb
|
||||||
|
state: stopped
|
||||||
|
args: setup
|
||||||
|
when: not stat_result.stat.exists
|
||||||
|
|
||||||
|
- name: Deploy mariadb config
|
||||||
|
copy:
|
||||||
|
src: "files/mariadb/mariadb-server.cnf"
|
||||||
|
dest: "/etc/my.cnf.d/mariadb-server.cnf"
|
||||||
|
mode: '0644'
|
||||||
|
notify: Restart MariaDB
|
||||||
|
|
||||||
|
- name: Flush handlers
|
||||||
|
meta: flush_handlers
|
||||||
|
|
||||||
|
- name: mysql_secure_installation
|
||||||
|
when: not stat_result.stat.exists
|
||||||
|
block:
|
||||||
|
- name: Removes all anonymous user accounts
|
||||||
|
community.mysql.mysql_user:
|
||||||
|
login_user: root
|
||||||
|
login_unix_socket: /run/mysqld/mysqld.sock
|
||||||
|
name: ''
|
||||||
|
host_all: true
|
||||||
|
state: absent
|
||||||
|
|
||||||
|
- name: Delete Hostname based MySQL user
|
||||||
|
community.mysql.mysql_user:
|
||||||
|
login_user: root
|
||||||
|
login_unix_socket: /run/mysqld/mysqld.sock
|
||||||
|
name: root
|
||||||
|
host: "{{ansible_nodename}}"
|
||||||
|
state: absent
|
||||||
|
|
||||||
|
- name: Remove MySQL test database
|
||||||
|
community.mysql.mysql_db:
|
||||||
|
login_user: root
|
||||||
|
login_unix_socket: /run/mysqld/mysqld.sock
|
||||||
|
name: test
|
||||||
|
state: absent
|
||||||
|
|
||||||
|
- name: Reload privilege tables
|
||||||
|
ansible.builtin.command: 'mysql -ne "{{ item }}"'
|
||||||
|
with_items:
|
||||||
|
- FLUSH PRIVILEGES
|
||||||
|
changed_when: False
|
||||||
|
|
||||||
|
- name: Add MariaDB to boot
|
||||||
|
ansible.builtin.service:
|
||||||
|
name: mariadb
|
||||||
|
runlevel: default
|
||||||
|
enabled: True
|
||||||
|
use: openrc
|
||||||
|
when: not ansible_check_mode
|
||||||
|
|
||||||
|
# Minecraft Role Tasks
|
||||||
|
- name: Config Mysql Users And DB for Minecraft
|
||||||
|
tags: mine_db
|
||||||
|
block:
|
||||||
|
- name: Create a Dynmap Database
|
||||||
|
community.mysql.mysql_db:
|
||||||
|
login_user: root
|
||||||
|
login_unix_socket: /run/mysqld/mysqld.sock
|
||||||
|
name: "{{ minecraft_db }}"
|
||||||
|
state: present
|
||||||
|
|
||||||
|
- name: Create user and priv db
|
||||||
|
community.mysql.mysql_user:
|
||||||
|
login_user: root
|
||||||
|
login_unix_socket: /run/mysqld/mysqld.sock
|
||||||
|
name: "{{ sql_user }}"
|
||||||
|
password: "{{ sql_pass }}"
|
||||||
|
priv:
|
||||||
|
"{{ item }}.*:ALL"
|
||||||
|
state: present
|
||||||
|
append_privs: True
|
||||||
|
with_items: "{{ minecraft_db }}"
|
||||||
|
|
||||||
|
- name: Reload privilege tables
|
||||||
|
ansible.builtin.command: 'mysql -ne "{{ item }}"'
|
||||||
|
with_items:
|
||||||
|
- FLUSH PRIVILEGES
|
||||||
|
changed_when: False
|
||||||
24
roles/minecraft/tasks/nginx.yml
Normal file
24
roles/minecraft/tasks/nginx.yml
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
---
|
||||||
|
- name: Update repositories
|
||||||
|
community.general.apk:
|
||||||
|
update_cache: true
|
||||||
|
|
||||||
|
- name: Install ext packages
|
||||||
|
community.general.apk:
|
||||||
|
name: "{{ ext_pkgs }}"
|
||||||
|
state: present
|
||||||
|
when: not ansible_check_mode
|
||||||
|
|
||||||
|
- name: Add nginx to boot
|
||||||
|
ansible.builtin.service:
|
||||||
|
name: nginx
|
||||||
|
runlevel: default
|
||||||
|
enabled: True
|
||||||
|
use: openrc
|
||||||
|
when: not ansible_check_mode
|
||||||
|
|
||||||
|
- name: Deploy nginx.conf
|
||||||
|
template:
|
||||||
|
src: templates/nginx.j2
|
||||||
|
dest: /etc/nginx/nginx.conf
|
||||||
|
notify: Restart nginx
|
||||||
25
roles/minecraft/tasks/ops.yml
Normal file
25
roles/minecraft/tasks/ops.yml
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
---
|
||||||
|
- name: Initiate Op List
|
||||||
|
ansible.builtin.set_fact:
|
||||||
|
op_list: []
|
||||||
|
|
||||||
|
- name: Add new JSON Objects to List
|
||||||
|
ansible.builtin.set_fact:
|
||||||
|
op_list: "{{ op_list +
|
||||||
|
[{ 'uuid': ops[item].uuid,
|
||||||
|
'name': item,
|
||||||
|
'level': ops[item].level,
|
||||||
|
'bypassesPlayerLimit': ops[item].bypassesPlayerLimit}] }}"
|
||||||
|
with_items: "{{ ops }}"
|
||||||
|
|
||||||
|
- name: Debug
|
||||||
|
ansible.builtin.debug:
|
||||||
|
var: op_list
|
||||||
|
|
||||||
|
- name: Write output json file
|
||||||
|
ansible.builtin.copy:
|
||||||
|
dest: "/home/{{ server_user }}/minecraft/ops.json"
|
||||||
|
owner: "{{ server_user }}"
|
||||||
|
group: "{{ server_user }}"
|
||||||
|
mode: '0644'
|
||||||
|
content: "{{ op_list | to_nice_json(sort_keys=False, indent=2) }}"
|
||||||
29
roles/minecraft/tasks/packets.yml
Normal file
29
roles/minecraft/tasks/packets.yml
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
---
|
||||||
|
- name: Config repos
|
||||||
|
ansible.builtin.copy:
|
||||||
|
src: repositories
|
||||||
|
dest: /etc/apk/
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: '0644'
|
||||||
|
backup: true
|
||||||
|
|
||||||
|
- name: Update repositories
|
||||||
|
community.general.apk:
|
||||||
|
update_cache: true
|
||||||
|
|
||||||
|
- name: Update all installed packages to the latest versions
|
||||||
|
community.general.apk:
|
||||||
|
upgrade: yes
|
||||||
|
|
||||||
|
- name: Install system packages
|
||||||
|
community.general.apk:
|
||||||
|
name: "{{ system_pkgs }}"
|
||||||
|
state: present
|
||||||
|
when: not ansible_check_mode
|
||||||
|
|
||||||
|
- name: Install minecraft packages
|
||||||
|
community.general.apk:
|
||||||
|
name: "{{ mine_pkgs }}"
|
||||||
|
state: present
|
||||||
|
when: not ansible_check_mode
|
||||||
28
roles/minecraft/tasks/php.yml
Normal file
28
roles/minecraft/tasks/php.yml
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
---
|
||||||
|
- name: Update repositories
|
||||||
|
community.general.apk:
|
||||||
|
update_cache: true
|
||||||
|
|
||||||
|
- name: Install ext packages
|
||||||
|
community.general.apk:
|
||||||
|
name: "{{ ext_pkgs }}"
|
||||||
|
state: present
|
||||||
|
when: not ansible_check_mode
|
||||||
|
|
||||||
|
- name: Add php-fpm to boot
|
||||||
|
ansible.builtin.service:
|
||||||
|
name: "{{ phpfpm_init }}"
|
||||||
|
runlevel: default
|
||||||
|
enabled: True
|
||||||
|
use: openrc
|
||||||
|
when: not ansible_check_mode
|
||||||
|
|
||||||
|
- name: Configure php-fpm
|
||||||
|
lineinfile:
|
||||||
|
dest: "{{ phpfpm_path}}/php-fpm.d/www.conf"
|
||||||
|
regexp: "^{{ item.property | regex_escape() }} = "
|
||||||
|
line: "{{ item.property }} = {{ item.value }}"
|
||||||
|
with_items:
|
||||||
|
- { property: 'user', value: 'nginx' }
|
||||||
|
- { property: 'group', value: 'nginx' }
|
||||||
|
notify: Restart php-fpm
|
||||||
9
roles/minecraft/tasks/plugins.yml
Normal file
9
roles/minecraft/tasks/plugins.yml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
- name: Deploy plugins
|
||||||
|
copy:
|
||||||
|
src: "files/plugins/"
|
||||||
|
dest: "/home/{{ server_user }}/minecraft/plugins/"
|
||||||
|
owner: "{{ server_user }}"
|
||||||
|
group: "{{ server_user }}"
|
||||||
|
mode: '0644'
|
||||||
|
notify: Restart minecraft Server
|
||||||
38
roles/minecraft/tasks/server.yml
Normal file
38
roles/minecraft/tasks/server.yml
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
---
|
||||||
|
- name: Create a server directory
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: "/home/{{ server_user }}/minecraft"
|
||||||
|
state: directory
|
||||||
|
owner: "{{ server_user }}"
|
||||||
|
group: "{{ server_user }}"
|
||||||
|
mode: '0755'
|
||||||
|
|
||||||
|
- name: Deploy server files
|
||||||
|
copy:
|
||||||
|
src: "files/server/"
|
||||||
|
dest: "/home/{{ server_user }}/minecraft/"
|
||||||
|
owner: "{{ server_user }}"
|
||||||
|
group: "{{ server_user }}"
|
||||||
|
mode: '0644'
|
||||||
|
notify: Restart minecraft Server
|
||||||
|
tags: update_server
|
||||||
|
|
||||||
|
- name: Deploy server icon
|
||||||
|
ansible.builtin.copy:
|
||||||
|
src: server-icon.png
|
||||||
|
dest: "/home/{{ server_user }}/minecraft/"
|
||||||
|
owner: "{{ server_user }}"
|
||||||
|
group: "{{ server_user }}"
|
||||||
|
mode: '0644'
|
||||||
|
backup: true
|
||||||
|
notify: Restart minecraft Server
|
||||||
|
tags: icon_deploy
|
||||||
|
|
||||||
|
- name: Generate server config
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: server.properties.j2
|
||||||
|
dest: "/home/{{ server_user }}/minecraft/server.properties"
|
||||||
|
owner: "{{ server_user }}"
|
||||||
|
group: "{{ server_user }}"
|
||||||
|
notify: Restart minecraft Server
|
||||||
|
tags: config_deploy
|
||||||
26
roles/minecraft/tasks/service.yml
Normal file
26
roles/minecraft/tasks/service.yml
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
---
|
||||||
|
- name: Deploy openrc service params
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: minecraft-rc.j2
|
||||||
|
dest: /etc/conf.d/minecraftd
|
||||||
|
mode: '0644'
|
||||||
|
|
||||||
|
- name: Deploy base openrc service
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: minecraft.j2
|
||||||
|
dest: /etc/init.d/minecraft
|
||||||
|
mode: '0755'
|
||||||
|
|
||||||
|
- name: Create a symbolic link to openrc service
|
||||||
|
ansible.builtin.file:
|
||||||
|
src: /etc/init.d/minecraft
|
||||||
|
dest: /etc/init.d/minecraftd
|
||||||
|
state: link
|
||||||
|
mode: '0755'
|
||||||
|
|
||||||
|
- name: Add minecraft server to boot
|
||||||
|
ansible.builtin.service:
|
||||||
|
name: minecraftd
|
||||||
|
runlevel: default
|
||||||
|
enabled: True
|
||||||
|
use: openrc
|
||||||
2
roles/minecraft/tasks/tuning.yml
Normal file
2
roles/minecraft/tasks/tuning.yml
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
---
|
||||||
|
# Disable plugin list
|
||||||
22
roles/minecraft/tasks/users.yml
Normal file
22
roles/minecraft/tasks/users.yml
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
---
|
||||||
|
- name: Ensure group "{{ userdb[item].user_group }}" exists
|
||||||
|
ansible.builtin.group:
|
||||||
|
name: "{{ userdb[item].user_group }}"
|
||||||
|
state: present
|
||||||
|
with_items: "{{ userdb }}"
|
||||||
|
|
||||||
|
- name: Add user "{{ item }}"
|
||||||
|
ansible.builtin.user:
|
||||||
|
name: "{{ item }}"
|
||||||
|
# shell: /bin/bash
|
||||||
|
group: "{{ userdb[item].user_group }}"
|
||||||
|
password: "{{ userdb[item].user_pass }}"
|
||||||
|
comment: "My Default user"
|
||||||
|
with_items: "{{ userdb }}"
|
||||||
|
|
||||||
|
- name: Deploy authorized key for users
|
||||||
|
ansible.posix.authorized_key:
|
||||||
|
user: "{{ item }}"
|
||||||
|
key: "{{ userdb[item].key }}"
|
||||||
|
with_items: "{{ userdb }}"
|
||||||
|
when: not ansible_check_mode
|
||||||
11
roles/minecraft/templates/1minecraft-rc.j2
Normal file
11
roles/minecraft/templates/1minecraft-rc.j2
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# /etc/conf.d/minecraft
|
||||||
|
#
|
||||||
|
# Minecraft - OpenRC scripts
|
||||||
|
# Copyright (C) 2017-2019 João Brázio [joao@brazio.org]
|
||||||
|
#
|
||||||
|
|
||||||
|
MINHEAP={{ MINHEAP }}
|
||||||
|
MAXHEAP={{ MAXHEAP }}
|
||||||
|
|
||||||
|
# https://aikar.co/2018/07/02/tuning-the-jvm-g1gc-garbage-collector-flags-for-minecraft/
|
||||||
|
#CUSTOMARGS="-XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1"
|
||||||
125
roles/minecraft/templates/1minecraft.j2
Normal file
125
roles/minecraft/templates/1minecraft.j2
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
#!/sbin/openrc-run
|
||||||
|
# /etc/init.d/minecraft
|
||||||
|
#
|
||||||
|
# Minecraft - OpenRC scripts
|
||||||
|
# Copyright (C) 2017-2019 João Brázio [joao@brazio.org]
|
||||||
|
#
|
||||||
|
# Expects the game folder to be located at /srv/minecraft/<instance>
|
||||||
|
# Don't use directly the /etc/init.d/minecraft script, create a symlink for you instance.
|
||||||
|
#
|
||||||
|
# This is an example for Paper:
|
||||||
|
# - mkdir -p /srv/minecraft/paper
|
||||||
|
# - Download paper jar and place it there
|
||||||
|
# - ln -s /etc/init.d/minecraft /etc/init.d/minecraft.paper
|
||||||
|
# - cp /etc/conf.d/minecraft /etc/conf.d/minecraft.paper
|
||||||
|
#
|
||||||
|
# Dependencies:
|
||||||
|
# - Java VM at /usr/bin/java
|
||||||
|
# - mcrcon [https://github.com/Tiiffi/mcrcon]
|
||||||
|
#
|
||||||
|
|
||||||
|
USER={{ server_user }}
|
||||||
|
GROUP={{ server_user }}
|
||||||
|
|
||||||
|
INSTANCE=${RC_SVCNAME##*.}
|
||||||
|
BASE="/home/{{ server_user }}/minecraft"
|
||||||
|
PIDFILE="/var/run/${RC_SVCNAME}.pid"
|
||||||
|
RCON="/usr/bin/rcon"
|
||||||
|
BIN="$(ls ${BASE} -v 2>/dev/null | grep -i "craftbukkit.*jar\\|spigot.*jar\\|paper*.*jar\\|minecraft_server.*jar" | head -n 1)"
|
||||||
|
|
||||||
|
config_get () {
|
||||||
|
echo $(grep ${1} "${BASE}/server.properties" | cut -d '=' -f 2)
|
||||||
|
}
|
||||||
|
|
||||||
|
depend () {
|
||||||
|
need net
|
||||||
|
}
|
||||||
|
|
||||||
|
start_pre () {
|
||||||
|
if [ -z "${BIN}" ]; then
|
||||||
|
eerror "${RC_SVCNAME} cannot find a proper server jar."
|
||||||
|
eerror "Check your game installation at ${BASE}."
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
[ -f "${PIDFILE}" ] && rm ${PIDFILE}
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
start () {
|
||||||
|
ebegin "Starting Minecraft server ${INSTANCE}"
|
||||||
|
start-stop-daemon --start --chdir ${BASE} --pidfile ${PIDFILE} --make-pidfile \
|
||||||
|
--exec /usr/bin/java --user ${USER} --group ${GROUP} \
|
||||||
|
--background -- -server -Xms${MINHEAP:-128M} -Xmx${MAXHEAP:-1024M} \
|
||||||
|
${CUSTOMARGS} -jar ${BIN} nogui
|
||||||
|
eend $?
|
||||||
|
}
|
||||||
|
|
||||||
|
stop_pre () {
|
||||||
|
if [ ! -f "${BASE}/server.properties" ]; then
|
||||||
|
eerror "${RC_SVCNAME} cannot find a proper server config file."
|
||||||
|
eerror "Check your game installation at ${BASE}."
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
stop () {
|
||||||
|
ebegin "Stopping Minecraft server ${INSTANCE}"
|
||||||
|
|
||||||
|
if [ "$(config_get enable-rcon)" = "true" ]; then
|
||||||
|
# Fetch rcon configuration
|
||||||
|
RCON_SRV=$(config_get server.ip)
|
||||||
|
RCON_PORT=$(config_get rcon.port)
|
||||||
|
RCON_PASS=$(config_get rcon.password)
|
||||||
|
|
||||||
|
# Try to soft kill the server
|
||||||
|
${RCON} -H ${RCON_SRV:-127.0.0.1} -p ${RCON_PORT} -m -P ${RCON_PASS} save-all 1>/dev/null 2>&1
|
||||||
|
${RCON} -H ${RCON_SRV:-127.0.0.1} -p ${RCON_PORT} -m -P ${RCON_PASS} stop 1>/dev/null 2>&1
|
||||||
|
|
||||||
|
i=0
|
||||||
|
PID=$(cat ${PIDFILE})
|
||||||
|
|
||||||
|
while [ "${i}" -le 30 ]; do
|
||||||
|
kill -0 ${PID} 2>/dev/null && sleep 1 || break
|
||||||
|
i=$(( i + 1 ))
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Hard stop the server
|
||||||
|
start-stop-daemon --stop --chdir ${BASE} --pidfile ${PIDFILE} --user ${USER} --group ${GROUP} --retry 5 2>/dev/null
|
||||||
|
eend 0
|
||||||
|
}
|
||||||
|
|
||||||
|
status () {
|
||||||
|
if [ "$(config_get enable-rcon)" = "true" ]; then
|
||||||
|
# Fetch rcon configuration
|
||||||
|
RCON_SRV=$(config_get server.ip)
|
||||||
|
RCON_PORT=$(config_get rcon.port)
|
||||||
|
RCON_PASS=$(config_get rcon.password)
|
||||||
|
|
||||||
|
${RCON} -H ${RCON_SRV:-127.0.0.1} -p ${RCON_PORT} -m -P ${RCON_PASS} version
|
||||||
|
${RCON} -H ${RCON_SRV:-127.0.0.1} -p ${RCON_PORT} -m -P ${RCON_PASS} tps
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
backup() {
|
||||||
|
saveoff
|
||||||
|
|
||||||
|
NOW=`date "+%Y-%m-%d_%Hh%M"`
|
||||||
|
BACKUP_FILE="${BACKUP_BASE}/backup_${NOW}.tar"
|
||||||
|
einfo "Backing up minecraft world..."
|
||||||
|
as_user "tar -C \"${BASE}\" -cf \"$BACKUP_FILE\" ${WORLDS}"
|
||||||
|
|
||||||
|
einfo "Backing up ${BIN}"
|
||||||
|
as_user "tar -C \"${BASE}\" -rf \"$BACKUP_FILE\" ${BIN} server.properties"
|
||||||
|
|
||||||
|
saveon
|
||||||
|
|
||||||
|
einfo "Compressing backup..."
|
||||||
|
as_user "gzip -f \"$BACKUP_FILE\""
|
||||||
|
einfo "Done."
|
||||||
|
}
|
||||||
8
roles/minecraft/templates/backup_server.j2
Normal file
8
roles/minecraft/templates/backup_server.j2
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Working dir
|
||||||
|
cd /home/{{ server_user }}/backups
|
||||||
|
# Delete old backups
|
||||||
|
find . -name "backup_*.tar.gz" -type f -mtime +1 -delete
|
||||||
|
# Start backup
|
||||||
|
rc-service minecraftd backup
|
||||||
1
roles/minecraft/templates/hosts.j2
Normal file
1
roles/minecraft/templates/hosts.j2
Normal file
@@ -0,0 +1 @@
|
|||||||
|
127.0.0.1 {{ inventory_hostname }}.my.domain {{ inventory_hostname }} localhost.localdomain localhost
|
||||||
23
roles/minecraft/templates/minecraft-rc.j2
Normal file
23
roles/minecraft/templates/minecraft-rc.j2
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
# /etc/conf.d/minecraft
|
||||||
|
#
|
||||||
|
# Minecraft - OpenRC scripts
|
||||||
|
# Copyright (C) 2024 Santic Zombie [email@santic-zombie.ru]
|
||||||
|
#
|
||||||
|
#
|
||||||
|
|
||||||
|
MINHEAP={{ MINHEAP }}
|
||||||
|
MAXHEAP={{ MAXHEAP }}
|
||||||
|
|
||||||
|
USER={{ server_user }}
|
||||||
|
GROUP={{ server_user }}
|
||||||
|
|
||||||
|
BASE="/home/{{ server_user }}/minecraft"
|
||||||
|
BACKUP_BASE="/home/{{ server_user }}/backups"
|
||||||
|
|
||||||
|
SCREENNAME="Minecraft"
|
||||||
|
|
||||||
|
WORLDS="{{ level_name }} {{ level_name }}_nether {{ level_name }}_the_end"
|
||||||
|
|
||||||
|
|
||||||
|
# https://aikar.co/2018/07/02/tuning-the-jvm-g1gc-garbage-collector-flags-for-minecraft/
|
||||||
|
#CUSTOMARGS="-XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1"
|
||||||
158
roles/minecraft/templates/minecraft.j2
Normal file
158
roles/minecraft/templates/minecraft.j2
Normal file
@@ -0,0 +1,158 @@
|
|||||||
|
#!/sbin/openrc-run
|
||||||
|
# /etc/init.d/minecraft
|
||||||
|
#
|
||||||
|
# Minecraft - OpenRC scripts
|
||||||
|
# Copyright (C) 2024 Santic Zombie [email@santic-zombie.ru]
|
||||||
|
#
|
||||||
|
#
|
||||||
|
|
||||||
|
extra_commands="reload backup listen"
|
||||||
|
|
||||||
|
INSTANCE=${RC_SVCNAME##*.}
|
||||||
|
PIDFILE="/var/run/${RC_SVCNAME}.pid"
|
||||||
|
BIN="$(ls ${BASE} -v 2>/dev/null | grep -i "craftbukkit.*jar\\|spigot.*jar\\|paper*.*jar\\|minecraft_server.*jar" | head -n 1)"
|
||||||
|
INVOCATION="/usr/bin/java -server -Xms${MINHEAP:-128M} -Xmx${MAXHEAP:-1024M} \
|
||||||
|
${CUSTOMARGS} -jar ${BIN} nogui"
|
||||||
|
|
||||||
|
depend() {
|
||||||
|
need net localmount
|
||||||
|
after bootmisc
|
||||||
|
use logger
|
||||||
|
}
|
||||||
|
|
||||||
|
ME=`whoami`
|
||||||
|
as_user() {
|
||||||
|
if [ "${ME}" = "${USER}" ] ; then
|
||||||
|
ash -c "$1"
|
||||||
|
else
|
||||||
|
su - "${USER}" -c "$1"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
start_pre () {
|
||||||
|
if [ -z "${BIN}" ]; then
|
||||||
|
eerror "${RC_SVCNAME} cannot find a proper server jar."
|
||||||
|
eerror "Check your game installation at ${BASE}."
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
[ -f "${PIDFILE}" ] && rm ${PIDFILE}
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
start () {
|
||||||
|
ebegin "Starting Minecraft server daemon"
|
||||||
|
if pgrep -u "${USER}" -f "${BIN}" > /dev/null ; then
|
||||||
|
einfo "Minecraft server is already running!"
|
||||||
|
else
|
||||||
|
ebegin "Starting in progress"
|
||||||
|
cd "${BASE}"
|
||||||
|
as_user "cd ${BASE} && screen -dmS ${SCREENNAME} ${INVOCATION}"
|
||||||
|
sleep 10
|
||||||
|
pgrep -f "${BIN}" | tail -1 > "${PIDFILE}"
|
||||||
|
if pgrep -u "${USER}" -f "${BIN}" | tail -1 > /dev/null ; then
|
||||||
|
einfo "${INSTANCE} is now running."
|
||||||
|
else
|
||||||
|
eerror "Error! Could not start ${INSTANCE}! :("
|
||||||
|
return 2
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
stop() {
|
||||||
|
ebegin "Stopping Minecraft server daemon"
|
||||||
|
if pgrep -u "${USER}" -f "${BIN}" > /dev/null ; then
|
||||||
|
ebegin "Stopping in progress"
|
||||||
|
as_user "screen -p 0 -S ${SCREENNAME} -X eval 'stuff \"say SERVER SHUTTING DOWN IN 30 SECONDS. Saving map...\"\015'"
|
||||||
|
as_user "screen -p 0 -S ${SCREENNAME} -X eval 'stuff \"save-all\"\015'"
|
||||||
|
sleep 10
|
||||||
|
as_user "screen -p 0 -S ${SCREENNAME} -X eval 'stuff \"stop\"\015'"
|
||||||
|
sleep 10
|
||||||
|
else
|
||||||
|
einfo "${INSTANCE} was not running."
|
||||||
|
fi
|
||||||
|
if pgrep -u "${USER}" -f "${BIN}" > /dev/null ; then
|
||||||
|
eerror "Error! ${INSTANCE} could not be stopped."
|
||||||
|
else
|
||||||
|
einfo "${INSTANCE} is stopped."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Hard stop the server
|
||||||
|
start-stop-daemon --stop --chdir ${BASE} --pidfile ${PIDFILE} --user ${USER} --group ${GROUP} --retry 5 2>/dev/null
|
||||||
|
eend 0
|
||||||
|
}
|
||||||
|
|
||||||
|
restart() {
|
||||||
|
ebegin "Reload Minecraft server daemon"
|
||||||
|
stop
|
||||||
|
start
|
||||||
|
eend $?
|
||||||
|
}
|
||||||
|
|
||||||
|
reload() {
|
||||||
|
ebegin "Reload Minecraft server"
|
||||||
|
if pgrep -u "${USER}" -f "${BIN}" > /dev/null ; then
|
||||||
|
ebegin "Reloading in progress"
|
||||||
|
as_user "screen -p 0 -S ${SCREENNAME} -X eval 'stuff \"say SERVER RELOADING IN 40 SECONDS. Saving map...\"\015'"
|
||||||
|
as_user "screen -p 0 -S ${SCREENNAME} -X eval 'stuff \"save-all\"\015'"
|
||||||
|
sleep 10
|
||||||
|
as_user "screen -p 0 -S ${SCREENNAME} -X eval 'stuff \"reload\"\015'"
|
||||||
|
as_user "screen -p 0 -S ${SCREENNAME} -X eval 'stuff \"reload confirm\"\015'"
|
||||||
|
sleep 10
|
||||||
|
else
|
||||||
|
einfo "${INSTANCE} was not running."
|
||||||
|
fi
|
||||||
|
if pgrep -u "${USER}" -f "${BIN}" > /dev/null ; then
|
||||||
|
einfo "Server reloaded."
|
||||||
|
as_user "screen -p 0 -S ${SCREENNAME} -X eval 'stuff \"say SERVER SUCCESSFULLY RELOADED!\"\015'"
|
||||||
|
else
|
||||||
|
eerror "Error! ${INSTANCE} could not reloaded! :("
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
saveoff() {
|
||||||
|
if pgrep -u "${USER}" -f "${BIN}" > /dev/null ; then
|
||||||
|
einfo "Server is running... suspending saves"
|
||||||
|
as_user "screen -p 0 -S ${SCREENNAME} -X eval 'stuff \"say SERVER BACKUP STARTING. Server going readonly...\"\015'"
|
||||||
|
as_user "screen -p 0 -S ${SCREENNAME} -X eval 'stuff \"save-off\"\015'"
|
||||||
|
as_user "screen -p 0 -S ${SCREENNAME} -X eval 'stuff \"save-all\"\015'"
|
||||||
|
sync
|
||||||
|
sleep 10
|
||||||
|
else
|
||||||
|
einfo "${INSTANCE} is not running."
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
saveon() {
|
||||||
|
if pgrep -u "${USER}" -f "${BIN}" > /dev/null ; then
|
||||||
|
einfo "Server is running... re-enabling saves"
|
||||||
|
as_user "screen -p 0 -S ${SCREENNAME} -X eval 'stuff \"save-on\"\015'"
|
||||||
|
as_user "screen -p 0 -S ${SCREENNAME} -X eval 'stuff \"say SERVER BACKUP ENDED. Server going read-write...\"\015'"
|
||||||
|
else
|
||||||
|
echo "${INSTANCE} is not running. Not resuming saves."
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
backup() {
|
||||||
|
saveoff
|
||||||
|
|
||||||
|
NOW=`date "+%Y-%m-%d_%Hh%M"`
|
||||||
|
BACKUP_FILE="${BACKUP_BASE}/backup_${NOW}.tar"
|
||||||
|
einfo "Backing up minecraft server..."
|
||||||
|
as_user "tar -C \"${BASE}\" -cf \"$BACKUP_FILE\" ."
|
||||||
|
|
||||||
|
saveon
|
||||||
|
|
||||||
|
einfo "Compressing backup..."
|
||||||
|
as_user "gzip -f \"$BACKUP_FILE\""
|
||||||
|
einfo "Done."
|
||||||
|
}
|
||||||
|
|
||||||
|
listen() {
|
||||||
|
if pgrep -u "${USER}" -f "${BIN}" > /dev/null ; then
|
||||||
|
as_user "tail -f ${BASE}/logs/latest.log"
|
||||||
|
else
|
||||||
|
echo "${INSTANCE} is not running. Cannot listen to server."
|
||||||
|
fi
|
||||||
|
}
|
||||||
14
roles/minecraft/templates/motd.j2
Normal file
14
roles/minecraft/templates/motd.j2
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
Welcome to {{ inventory_hostname }} Server! ^_^
|
||||||
|
|
||||||
|
:\ /; _
|
||||||
|
; \___/ ; ; ;
|
||||||
|
,:-"' `"-:. / ;
|
||||||
|
_ /,---. ,---.\ _ _; /
|
||||||
|
_:>(( | ) ( | ))<:_ ,-""_,"
|
||||||
|
\````` `````/""""",-""
|
||||||
|
'-.._ v _..-' )
|
||||||
|
/ ___ ____,.. \
|
||||||
|
/ / | | | ( \. \
|
||||||
|
nya / / | | | | \ \
|
||||||
|
`" `" `" `"
|
||||||
58
roles/minecraft/templates/nginx.j2
Normal file
58
roles/minecraft/templates/nginx.j2
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
user {{ nginx_user }};
|
||||||
|
worker_processes {{ worker_processes }};
|
||||||
|
|
||||||
|
error_log {{ log_dir }}/error.log;
|
||||||
|
error_log {{ log_dir }}/error.log notice;
|
||||||
|
error_log {{ log_dir }}/error.log info;
|
||||||
|
|
||||||
|
events {
|
||||||
|
worker_connections {{ worker_connections }};
|
||||||
|
}
|
||||||
|
|
||||||
|
http {
|
||||||
|
include mime.types;
|
||||||
|
default_type application/octet-stream;
|
||||||
|
|
||||||
|
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
|
||||||
|
'$status $body_bytes_sent "$http_referer" '
|
||||||
|
'"$http_user_agent" "$http_x_forwarded_for"';
|
||||||
|
|
||||||
|
access_log {{ log_dir }}/access.log main;
|
||||||
|
|
||||||
|
sendfile on;
|
||||||
|
tcp_nopush on;
|
||||||
|
#keepalive_timeout 65;
|
||||||
|
gzip on;
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 80 default_server;
|
||||||
|
#server_name _;
|
||||||
|
|
||||||
|
root /srv/dynmap/web;
|
||||||
|
|
||||||
|
index index.php index.html index.htm;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
# First attempt to serve request as file, then
|
||||||
|
# as directory, then fall back to displaying a 404.
|
||||||
|
try_files $uri $uri/ =404;
|
||||||
|
}
|
||||||
|
|
||||||
|
# pass PHP scripts to FastCGI server
|
||||||
|
|
||||||
|
location ~ \.php$ {
|
||||||
|
fastcgi_pass 127.0.0.1:9000;
|
||||||
|
fastcgi_index index.php;
|
||||||
|
include fastcgi.conf;
|
||||||
|
}
|
||||||
|
|
||||||
|
# deny access to .htaccess files, if Apache's document root
|
||||||
|
# concurs with nginx's one
|
||||||
|
#
|
||||||
|
location ~ /\.ht {
|
||||||
|
deny all;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#include sites-enabled/*;
|
||||||
|
}
|
||||||
59
roles/minecraft/templates/server.properties.j2
Normal file
59
roles/minecraft/templates/server.properties.j2
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
enable-jmx-monitoring=false
|
||||||
|
rcon.port={{ rcon_port }}
|
||||||
|
level-seed=
|
||||||
|
gamemode={{ gamemode }}
|
||||||
|
enable-command-block=false
|
||||||
|
enable-query=false
|
||||||
|
generator-settings={}
|
||||||
|
enforce-secure-profile={{ enforce_secure_profile }}
|
||||||
|
level-name={{ level_name }}
|
||||||
|
motd={{ server_status }}
|
||||||
|
query.port={{ game_port }}
|
||||||
|
pvp={{ pvp }}
|
||||||
|
generate-structures=true
|
||||||
|
max-chained-neighbor-updates={{ neighbor_updates }}
|
||||||
|
difficulty={{ difficulty }}
|
||||||
|
network-compression-threshold={{ network_compression_threshold }}
|
||||||
|
max-tick-time=60000
|
||||||
|
require-resource-pack=false
|
||||||
|
use-native-transport=true
|
||||||
|
max-players={{ max_players }}
|
||||||
|
online-mode=false
|
||||||
|
enable-status=true
|
||||||
|
allow-flight=false
|
||||||
|
initial-disabled-packs=
|
||||||
|
broadcast-rcon-to-ops=true
|
||||||
|
view-distance={{ view_distance }}
|
||||||
|
server-ip=
|
||||||
|
resource-pack-prompt=
|
||||||
|
allow-nether=true
|
||||||
|
server-port={{ game_port }}
|
||||||
|
enable-rcon={{ enable_rcon }}
|
||||||
|
sync-chunk-writes=true
|
||||||
|
resource-pack-id=
|
||||||
|
op-permission-level={{ op_permission_level }}
|
||||||
|
prevent-proxy-connections=false
|
||||||
|
hide-online-players=false
|
||||||
|
resource-pack=
|
||||||
|
entity-broadcast-range-percentage={{ entity_broadcast_range }}
|
||||||
|
simulation-distance={{ simulation_distance }}
|
||||||
|
rcon.password={{ rcon_password }}
|
||||||
|
player-idle-timeout=0
|
||||||
|
debug=false
|
||||||
|
force-gamemode=false
|
||||||
|
rate-limit=0
|
||||||
|
hardcore=false
|
||||||
|
white-list=false
|
||||||
|
broadcast-console-to-ops=true
|
||||||
|
spawn-npcs=true
|
||||||
|
spawn-animals=true
|
||||||
|
log-ips=true
|
||||||
|
function-permission-level=2
|
||||||
|
initial-enabled-packs=vanilla
|
||||||
|
level-type=minecraft\:normal
|
||||||
|
text-filtering-config=
|
||||||
|
spawn-monsters=true
|
||||||
|
enforce-whitelist=false
|
||||||
|
spawn-protection={{ spawn_protection }}
|
||||||
|
resource-pack-sha1=
|
||||||
|
max-world-size=29999984
|
||||||
6
roles/minecraft/templates/sshd_config.j2
Normal file
6
roles/minecraft/templates/sshd_config.j2
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
Port {{ ssh_port }}
|
||||||
|
PubkeyAuthentication yes
|
||||||
|
PasswordAuthentication no
|
||||||
|
PermitEmptyPasswords no
|
||||||
|
ChallengeResponseAuthentication no
|
||||||
|
Subsystem sftp /usr/lib/ssh/sftp-server
|
||||||
Reference in New Issue
Block a user