Minecraftサーバーで自動再起動を行う

プラグインとかもあったけど、cronでスクリプト実行するほうがシンプルで簡単そうだったのでやってみた。

こちらを参考に、でもここにある通りだとうまく動かなかったので、多少手を入れてます。

qiita.com

# ------------設定箇所---------------
# 再起動までの待機時間(秒)
WAIT=60

# screenの名前
SCREEN_NAME=Minecraft

# ---------------------------------

# 15分前からsayコマンドで予告メッセージを出していく
screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "say 15分後にサーバーを再起動します\015"'
sleep 300

screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "say 10分後にサーバーを再起動します\015"'
sleep 300

screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "say 5分後にサーバーを再起動します\015"'
sleep 120

screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "say 3分後にサーバーを再起動します\015"'
sleep 120

screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "say 1分後にサーバーを再起動します\015"'
sleep 30

screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "say 30秒後にサーバーを再起動します\015"'
sleep 20

screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "say 10秒後にサーバーを再起動します\015"'
sleep 5

screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "say 5秒後にサーバーを再起動します\015"'
sleep 1

screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "say 4秒後にサーバーを再起動します\015"'
sleep 1

screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "say 3秒後にサーバーを再起動します\015"'
sleep 1

screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "say 2秒後にサーバーを再起動します\015"'
sleep 1

screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "say 1秒後にサーバーを再起動します\015"'
sleep 1

# いざstopコマンド実行!
screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "stop\015"'

# 指定した秒数待機
sleep $WAIT

# 起動スクリプトがあるディレクトリに移動して、いざ起動!
screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "cd minecraft-spigot_1.19.4"\015'
screen -p 0 -S ${SCREEN_NAME} -X eval 'stuff "./Minecraft_start.sh\015"'

ひたすらscreenに干渉してコマンドを投げていくだけです。
ちゃんと作るならコマンドの結果とかチェックしたい感じ。
特にstopのあと、単に60秒WAITするんじゃなくて、stopが終わったのを確認してstartできたらなーと思ったり。

このスクリプトをcronに登録してあげます。

mstudy-diary.hatenablog.com

無事、毎日8時半に再起動が行われるようになりました。
めでたしめでたし。

特定の時間にスクリプトを実行したい~cronの設定~

タイトルの通り。なんか意外と難しくてハマったのでメモ。

環境はUbuntuです。AWSの22.04のやつ。

結論をまとめると、やり方はこんな感じ。

# cronインストール
apt install cron

#cronの設定ファイルを開く
vi /etc/crontab

と、↓のようなファイルが開かれるので、設定を追記するだけ。

# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
# You can also override PATH, but by default, newer versions inherit it from the environment
#PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
# 17 *   * * *   root    cd / && run-parts --report /etc/cron.hourly
# 25 6   * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
# 47 6   * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
# 52 6   1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
# ↑ここまでは初期設定として入ってるやつ。日次実行とか週次実行のスクリプトが用意されてるっぽいけど、今回はやりたいことが決まってるのでコメントアウトして無視した。
30 8    * * *   root    cd /home/ubuntu/Minecraft/script && ./restart.sh
#

わかればあっさり。これで毎日8時30分にrestart.shを実行してくれるようになった。

Minecraftプラグイン開発③~昼を長くしたい~

タイトルの通り、昼を長くしたい。作業してると夜来るのめっちゃ早い。
(と、遊んでる人に言われた。私自身はあんまりがっつり作業したことないんですが・・)

需要が少なくなさそうだと思ったので調べてみると、案の定プラグインを発見。

https://legacy.curseforge.com/minecraft/mc-mods/longer-days:Longer Days

ところが、これ、Spigotサーバーでは使えないっぽい?
ForgeというModが前提になっていて、これがSpigotで動くのかよくわからん。

Spigotで動くやつ、ないんか~(※)と思って、じゃあ開発してみるか、せっかくだし!ということでやってみた。

(※この記事を書くためにググりなおしたらありました。同じ名前のSpigot用のやつ。
https://www.spigotmc.org/resources/longerdays.80610/

なんかこういうことってあるよね・・)

そしてできたプラグインがこれ。

github.com

ChangeCycleOfTheDayとの名の通り、
できればプロパティの設定で自由に昼夜の長さを変えられるようにしたいんだけど、
とりあえずサーバー利用者から昼を長くして!昼50分夜10分で!というリクエストがあったので、
時間もべた書きで動くものを作った。
あんまりハマりポイントもなく、参考にしたのはこれくらい。

tererun.hatenablog.com

けっこう簡単だったので、なんかもっといろいろ作ってみたい。
サーバー利用者の方、欲しいものあったらリクエストください。

楽しくて快適なサーバーにしよう。

ちなみに、githubでソース公開も初めてやってみた。
gitも慣れたいな~

Minecraftプラグイン開発②~プロジェクトをgitで管理~

サンプルプロジェクトが無事動いたところで、せっかくなのでgitでソースを管理してみる。

  1. gitHube上でリポジトリを作る
    gitHubアカウントでログインし、リポジトリ一覧の緑色のNewからリポジトリを作る。

  2. Eclipsにもどって、プロジェクトを右クリック→チーム→プロジェクトの共有

  3. Gitを選択

  4. 「作成」を押下して、任意の場所にリポジトリを作る

  5. 「完了」を押すと、プロジェクトが紐づけされる。

  6. プロジェクトを右クリックしてチームを選ぶと、コミットができるようになっているのでコミット&プッシュする。
    認証が求められたら、ユーザーIDはgithubのユーザーID、パスワードはアクセストークを入れる。
    この辺りはこのサイトを参考にした

skill-for-it.com


pushまでうまくいったところで、せっかくなのでdevブランチを作って、devにコミット&プルリク&マージもやってみた。

プラグイン開発がうまくいったら、プロジェクト公開とかしてみたいな~。

Minecraftプラグイン開発①~サンプルでお試し~

Minecraftプラグインを開発したくなったので、やってみる。
まずはQiitaでみつけたサンプルプロジェクトを動かしてみた。

環境

環境:AWS
OS:Ubuntu
サーバーソフト:Spigot

やってみる

ほぼこちらの記事を参考にさせていただいた。 qiita.com

この記事でハマったポイントは、メインのクラス名が「QIitaPlugin」になってるけど、
「QiitaSample」にしないとうまくプラグインとして動作しなかった。(ビルドは通った)

メインクラスのクラス名と、

public class QiitaSample extends JavaPlugin{
    //↓ onEnableはロードされた時に実行されるメソッド
    @Override
    public void onEnable() {
        // ↓ サーバー上にログを残す
        getLogger().info("Hello, Qiita!");
    }
}

plugin.ymlのメインクラスの指定箇所、

name: "QiitaSample"
version: "${project.version}"
main: "[パッケージ名].QiitaSample"
api-version: "1.13"

もう1つ、pom.xmlのartifactId

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>任意のグループID</groupId>
  <artifactId>QiitaSample</artifactId>
  <version>1.0.0</version>

がすべて揃ってないと動かないっぽい?丁寧に実験はしてないけど、これを全部揃えたら無事Spigotで動作した。
サンプルプロジェクトの設定は無事うまくいったので、中身の開発やっていくぞ~!

AWSに立てたマイクラサーバーで荒らし対策

せっかく立ててみんなで遊んでいたマイクラサーバーが荒らされた。
今後の荒らし対策としてやったことのメモ。

イクラサーバーとして

①CoreProtectの導入
Spigotサーバーで使えるプラグイン
CoreProductを導入しました。 使い方はこのサイトがわかりやすかった。
https://genkoku.city/coreprotect
特定のユーザーの操作だけロールバックできる。

AWSとして

①EBSのライフサイクルマネージャーでバックアップ
いつでもロールバックできるようにした。(最初から設定はしていたつもりだったのだが、ミスってた。)
24時間ごとに1度のバックアップを7日間保持するのと、
6時間ごとのバックアップを1日だけ保持。
荒らしが来ても最悪6時間前には戻せるようにした。

②ネットワークACLで荒らしのIPをブロック
セキュリティグループはホワイトリスト方式なので、特定のIPのインバウンド通信を拒否、っていうのができない。
イクラで/banしたあと、念のためIPごとブロック。
まあ荒らしってIPころころ変えてそうだから、どのくらい意味があるかはわからないけど。

③海外IPをまとめて拒否設定
これが結構頭を使った。
日本国内のIPは調べると一覧を取得できる(こことか)ので、要はホワイトリスト方式で日本のIPをすべて許可すれば良いんだけど、
・セキュリティグループ・・許可できるルールの上限が1000。足りない。
・WAF・・ALBかCloudFrontにしか設定できず、HTTP通信じゃないとダメ。マイクラTCP通信には使えない。
.htaccess・・これもApacheが動いてないとダメ。
ってことで、どうやったかと言うと、基本に返ってiptablesで設定した。
参考にしたのはこれ。

qiita.com

このサービス定義の個所に、こんな感じで日本のIPの許可設定をする。

##### サービス設定ここから #####
iptables -A INPUT -s 1.0.16.0/20 -p tcp --dport 25565 -j ACCEPT
iptables -A INPUT -s 1.0.64.0/18 -p tcp --dport 25565 -j ACCEPT
・・・(2600行くらい続く)
##### サービス設定ここまで #####

海外が手放したIPを日本で取得した場合とか、ブロックしたくない人が弾かれる可能性もあるけど、
そういう場合は個別で/32で許可設定を入れれば対応できるので許容することにした。

この設定だけだと、拒否した通信のログがkern.logに出力されてしまうので
出力先を分ける設定もしてみた。

engetu21.hatenablog.com

これ、ディストリビューションによって結構やり方が違って、
最初ubuntuじゃないディストリビューションの記事を参考にしちゃったりしてちょっとハマった。

ついでにログローテートも設定しておいた。

www.tsubock-lab.xyz

余談

iptablesで設定した直後から、ログにDROPしたパケットの情報がモリモリ表示されるように。
IPを検索してみたら、「MinecraftHacking」って出てきて、
要はポートを25565で固定してランダムでIPアドレス設定して、稼働しているマイクラサーバーをスキャンしている人がいるらしい。
私の立てたサーバー、IP公開してないのに荒らしが来たのもたぶんこれが原因。
イクラサーバー立てる人は、完全ホワイトリスト方式にするとか、やったほうが良いです。

念のため、スキャンっぽいIPは全部ネットワークACLで拒否設定しておいた。
同じIPでログが埋まるのも嫌だしね。

追記

上記の設定だと、ubuntuを再起動するためにシェルを叩き直さないといけない。
こちらを参考に永続化の設定をした。

iwashi.co

プロジェクトマネジメント入門

Udemyのプロジェクトマネジメント入門の講座を見たので、気になったところのメモと感想。

PMBOK Guide:世界でもっとも認められているプロジェクトマネジメントガイド。
へー。
マネジメントのグローバル基準:PMI。 PMP:PMIの資格。

PMBOKガイドは、業界に限らずまとめたものなので、どのような業界でも使える実践知。 職種を問わず使える知識体系。 PMCDFは、特に人間関係スキルを書いたもの。

参考図書の『伝説のPMが教える 私のいち押しプロジェクト』おもしろそう。 『プロジェクトを加速する人間関係術』

10個の知識エリア。これが必須の知識体系の項目

  • 統合
  • スコープ
  • スケジュール
  • コスト
  • 品質
  • 資源
  • コミュニケーション
  • リスク
  • 調達
  • ステークホルダ

5個のプロセス群れ

この10×5のマトリクスのマスを「知識エリア」 自分のプロジェクトに必要な知識エリアを選ぶことが大事。49プロセス。 選択作業=テーラリング

プロジェクトマネジメントの手法を取り入れると、 プロジェクトの成功率が上がる。(出展:日経コンピュータ2008年12月1日) 46%、24%

感想

マネージャーって、何を勉強したら良いんだろうなと漠然と思っていたんだけど、こんなに体系的にまとまった理論があったんだ、と思った。
本格的にマネージャーポジションに就けるのがいつになるかわからないけど、その前に勉強しておきたい。
PMPとってみたいな。