20200818のLinuxに関する記事は5件です。

【minecraftサーバ】MOD・プラグイン不要!!自動バックアップ+再起動システム

シェルによるバックアップシステム

Minecraftのサーバを運営していて
定期的にバックアップと再起動をしたいと思って作りました。

minecraft内での処理ではなくシェルスクリプトを使いOS側から操作することにより
MODやプラグイン無しでも動作します。

自分のために忘れないように記事にします

※あくまで自忘禄です。これにより不具合やトラブルが発生しても、当方責任は取りません。

条件

この記事では以下の条件での作成をしています。

  • Linuxサーバーであること。(Windowsでもbatを使えばおそらく可能)
  • Forge ServerでもBukkit Serverでも問題ありません。
  • 全てのバージョンに対応しています

※この記事はCentOS7向けに書いております。
 他でもおそらく可能ですが、コマンドが一部違う部分があると思うので、置き換えてください。

事前準備

サーバーのプロセスをscreen環境で動かしていた方が何かと都合がいいのでscreenが入っていない場合はインストールをします。

# yum -y install screen

rootユーザかsudoで実行してください。

次にバックアップデータを保存しておくディレクトリを作ります。
場所及びディレクトリ名は自由です。(Minecraftサーバのworldディレクトリ内だけ避けてください)

$ mkdir backup

シェルスクリプト

今回のメインとなるプログラムです。
まずは自分の好きな場所にシェルを作りましょう。
以下マイクラサーバと同じユーザで行ってください。
viエディタの使い方

$ vi backup.sh

↓コピペ↓(※ファイルのパスだけ書き換え必要)

backup.sh
#!/bin/bash
#
#マイクラのバックアップ自動作成スクリプト

#######ゲーム中の人のためにメッセージを送ります。#######
time1=60 #この数字をいじることで再起動までの時間を調整可能
screen -S minecraft -X stuff 'say §a§l§n自動アナウンス'`echo -ne '\015'`
screen -S minecraft -X stuff 'say §b'$time1'§秒後に§lバックアップ§6及び§l再起動§6を行います。'`echo -ne '\015'`
time2=`expr $time1 - 10`
sleep `expr $time2`
screen -S minecraft -X stuff 'say §cまもなくサーバーが自動停止します。'`echo -ne '\015'`
sleep 10
screen -S minecraft -X stuff 'stop'`echo -ne '\015'` #minecraft終了

########## minecarftが完全に終了するまで待機 ##########
#javaのプロセス数を数えてるため
#ほかにjavaを動かしていたら調整してください
count1=`ps -ef | grep java | grep -v grep | wc -l`
while :
do
    if [ $count1 = 0 ] ; then
        break
    else
        sleep 0.5
        count1=`ps -ef | grep java | grep -v grep | wc -l`
    fi
done


############## バックアップ開始 #################
#ワールドディレクトリのコピー
cp マイクラのパス/world バックアップディレクトリのパス/backup

#zipに圧縮
zip バックアップディレクトリのパス/backup/world バックアップディレクトリのパス/backup

#ファイル名に日付を付ける
cp -aiv バックアップディレクトリのパス/backup/world.zip バックアップディレクトリのパス/backup/world.`date "+%Y%m%d_%H%M"`.zip

#いらないものを消す
rm -rf バックアップディレクトリのパス/backup/world
rm バックアップディレクトリのパス/backup/world.zip

############# minecraft再起動 ##############
screen -S minecraft -X stuff 'java -Xmx4096M -Xms1024M -jar  サーバーjarの絶対パス(例/home/User/Minecraft/server.jar) nogui'`echo -ne '\015'`
#javaの引数は任意

細かな調整は各自お願いします。

実行できるように権限を付与します

$ chmod 744 backup.sh

サーバーの起動

コマンドを送ったりする関係上サーバはscreen上で起動します。←ここ重要
screenは仮想デスクトップみたいなものです。
minecraftという名前のscreenを起動します。

$ screen -S minecraft

既にminecraftというscreenが起動している場合はアタッチします。

$ screen -r minecraft

screen内でMinecraft Serverを実行します。
シェルからでもコマンドからでも
↓コマンドの場合

$ cd マイクラサーバのパス
$ java -Xmx4096M -Xms1024M -jar server.jar nogui

これでサーバーがいつも通り起動すると思うのでデタッチします。

Ctrlキー + aキーを押した後にdキーを押す。

するとLinuxのコマンドラインに戻ってきますが、裏ではマイクラのサーバが動いています。
マイクラのコンソールに戻りたいときは上記のアタッチをしてください

バックアップの実行

screenをデタッチした状態でシェルを実行します。

$ ./backup.sh

マイクラ内にメッセージが出現して
自動停止→バックアップ→自動起動が行われれば成功です。
2020-08-18_19.43.42_LI.jpg
このようにバックファイルデータが作成されます。
コメント 2020-08-18 195033.jpg
バックアップの復旧はzipを解凍後worldディレクトリと置き換えてください。

以上で終了です。
お疲れさまでした。

応用編

24時間サーバー向け 定時実行

毎日一定の時間に自動実行することが可能です。
そのためにcronを使用します。

CentOSには既にcronが入っているはずですが、入っていなかったらインストールします。

# yum -y install crontabs

クーロンを作成します。マイクラサーバと同じユーザで行ってください

$ crontab -e

viエディタが起動します
以下例です。
例えば、AM6:00とPM4時に実行かけたかったとすると

crontab
0 6,16 * * * /home/User/backup.sh(backup.shの絶対パス)

と、記述します。
詳しくはこちらの記事が優良なのでご覧ください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ubuntu20.04にプリザンターをインストール(.NetCore3.1/PostgreSQL版)

Ubuntuに.NETCore3.1版のプリザンターをインストールしようと思ったが、
公式ページにはRHEL/CentOSのインストール方法しか無かったためやってみた。

Pleasanter with PostgreSQLをRHEL8/CentOS8にインストールする
https://pleasanter.net/fs/publishes/1490231/edit

.NET Core 3.1をインストール

$ wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
$ sudo dpkg -i packages-microsoft-prod.deb

$ sudo apt update
$ sudo apt install -y apt-transport-https
$ sudo apt update
$ sudo apt install -y dotnet-sdk-3.1

$ sudo apt install -y libgdiplus

PostgreSQL12のインストール

$ curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
$ sudo apt-add-repository 'deb http://apt.postgresql.org/pub/repos/apt focal-pgdg main'

$ sudo vi /etc/apt/sources.list

deb http://apt.postgresql.org/pub/repos/apt focal-pgdg main
↓
deb [arch=amd64] http://apt.postgresql.org/pub/repos/apt focal-pgdg main

$ sudo apt update
$ sudo apt install postgresql-12 pgadmin4 postgresql-contrib

# 成功しました。以下のようにしてデータベースサーバを起動することができます:
# 
#     pg_ctlcluster 12 main start
# 
# Ver Cluster Port Status Owner    Data directory              Log file
# 12  main    5432 down   postgres /var/lib/postgresql/12/main /var/log/postgresql/postgresql-12-main.log

ログ出力設定

以下を設定します。

$ sudo vi /etc/postgresql/12/main/postgresql.conf

log_destination = 'stderr'
logging_collector = on
log_line_prefix = '[%t]%u %d %p[%l]'

ユーザー設定&DB作成

パスワードを設定後、PostgreSQLを起動

$ sudo passwd postgres

$ su - postgres
$ psql -U postgres

postgres=# alter role postgres with password 'パスワード';

# DB作成
postgres=# create database "Implem.Pleasanter";

全文検索用モジュール(pg_trgm)インストール

postgres=# \c "Implem.Pleasanter";
Implem.Pleasanter=# CREATE EXTENSION pg_trgm;

プリザンターの導入

Pleasanterをダウンロードして、解凍

$ unzip Pleasanter.NetCore_1.1.5.1.zip

DBの構成

pleasanter/Implem.Pleasanter/App_Data/Parameters/Rds.json を以下のように設定します。

{
       "Dbms": "PostgreSQL",
       "Provider": "Local",
       "TimeZoneInfo": "Tokyo Standard Time",
       "SaConnectionString":"Server=localhost;Port=5432;Database=postgres;UID=postgres;PWD=<設定したパスワード>",
       "OwnerConnectionString":"Server=localhost;Port=5432;Database=#ServiceName#;UID=#ServiceName#_Owner;PWD=SetAdminsPWD",
       "UserConnectionString":"Server=localhost;Port=5432;Database=#ServiceName#;UID=#ServiceName#_User;PWD=SetUsersPWD",
       "SqlCommandTimeOut": 600,
       "MinimumTime": 3,
       "DeadlockRetryCount": 4,
       "DeadlockRetryInterval": 1000
}

Implem.CodeDefinerフォルダーに移動し、CodeDefinerを実行します。

$ cd pleasanter/Implem.CodeDefiner
$ dotnet Implem.CodeDefiner.NetCore.dll _rds

以下のコマンドでPleasnterを実行し、起動確認を行います。

$ cd ../Implem.Pleasanter
$ dotnet Implem.Pleasanter.NetCore.dll

別のターミナルで "http://localhost:5000/" にアクセスし、正常なレスポンスが帰ってくることを確認します。

$ curl -v http://localhost:5000/

* About to connect() to localhost port 5000 (#0)
*   Trying ::1...
* Connected to localhost (::1) port 5000 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: localhost:5000
> Accept: */*
>
< HTTP/1.1 302 Found
< Date: Mon, 25 May 2020 15:13:08 GMT
< Server: Kestrel
< Content-Length: 0
< Location: http://localhost:5000/users/login?ReturnUrl=%2F
確認できたらCtrl+Cで終了します。

Pleasanterサービス用スクリプトの作成

$ sudo vi /etc/systemd/system/pleasanter.service

[Unit]
Description = Pleasanter
Documentation =
Wants=network.target
After=network.target

[Service]
ExecStart = /usr/bin/dotnet Implem.Pleasanter.NetCore.dll
WorkingDirectory = /home/hogehoge/pleasanter/Implem.Pleasanter
Restart = always
RestartSec = 10
KillSignal=SIGINT
SyslogIdentifier=dotnet-pleasanter
User = root
Group = root
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false

[Install]
WantedBy = multi-user.target

サービスとして登録・起動

$ sudo systemctl daemon-reload
$ sudo systemctl enable pleasanter
$ sudo systemctl start pleasanter

Nginx(Webサーバ)をインストール

$ sudo apt install nginx-extras
$ sudo systemctl start nginx
$ sudo systemctl enable nginx
$ sudo addgroup ユーザー名 www-data

リバースプロキシの設定

/etc/nginx/conf.d/pleasanter.conf を以下の内容で作成します。

server {
    listen  80;
    server_name   192.168.0.200;
    location / {
       proxy_pass         http://localhost:5000;
       proxy_http_version 1.1;
       proxy_set_header   Upgrade $http_upgrade;
       proxy_set_header   Connection keep-alive;
       proxy_set_header   Host $host;
       proxy_cache_bypass $http_upgrade;
       proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header   X-Forwarded-Proto $scheme;
    }
}

$ sudo systemctl restart nginx

ここまでできたら、下記にアクセス。
http://192.168.0.200/

参考

Pleasanter with PostgreSQLをRHEL8/CentOS8にインストールする
https://pleasanter.net/fs/publishes/1490231/edit

Ubuntu 20.04 に .NET Core SDK 3.1 をインストールする
https://qiita.com/tabizou/items/d9af326ede9d35d03c68

Ubuntu 20.04 に Posgtgres12 をインストール後 C# + Npgsql でアクセスしてみる
https://qiita.com/tabizou/items/47f395d7ab3030dd1915

How To Install PostgreSQL on Ubuntu 20.04 [Quickstart]
https://www.digitalocean.com/community/tutorials/how-to-install-postgresql-on-ubuntu-20-04-quickstart

PostgreSQL 12 のインストール,データベース作成,テーブル定義(Ubuntu 上)
https://www.kkaneko.jp/tools/postgresinstall/postgreslinux.html

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

俺的Linuxサーバーの建て方

毎度サーバーの建て方を忘れて一から調べ直すのもアホなのでまとめたいと思う。
Linuxをサーバーとして構築するに当たってCLI環境でインストールする。セキュリティ設定は入れないので参考にする方は各々入れるように。

1.サーバーをインストール

Ubuntuを使っていく。次のURLへアクセスしISOを落としておく。
https://jp.ubuntu.com/download 

黒背景の画面

  1. 言語は「English」を選択
  2. キーボードレイアウトは「Japanese」を選択
  3. ネットワークを設定
  4. 静的の場合は「eth0」→「edit Ipv4」→「manual」を設定
  5. プロキシは必要ならば設定
  6. ミラーアドレスはそのまま
  7. ディスク領域は全体を使用
  8. 要約はそのままDone
  9. 確認ダイアログはContinue
  10. 「ユーザー名」「サーバー名」「パスワード」を設定する
  11. SSHは入れない(後で入れるけど・・・)
  12. 機能は追加しない
  13. インストールが終わったら再起動(インストールメディアは抜いておく)

2.サーバーにログインする

1.10で作成したユーザーでログインし、以下のコードを実行する。

$ export LANG=C
$ sudo apt update
$ sudo apt install ssh

SSHを開けたのでリモートPCからログイン。

SSHクライアントはTeraTermを使用。
https://ja.osdn.net/projects/ttssh2/

コメント 2020-08-18 134938.png

「ホスト名」は1.4で設定したアドレスを入れる。分からなければサーバーで「ip a」を実行する。

コメント 2020-08-18 135049.png
「ユーザ名」と「パスフレーズ」は1.10で入れた「ユーザー名」と「パスワード」を入れる。
入れたら「OK」を押す。

ログインできたら次のコマンド入れて、日本語化する。
sudoを使うとパスワードを求められるのでログイン時に使ったパスワードを入力。

$ sudo apt-get install language-pack-ja-base language-pack-ja
$ sudo update-locale LANG=ja_JP.UTF-8 LANGUAGE=ja_JP.UTF-8
$ source /etc/default/locale

参考にしたサイト
https://shell-mag.com/portal-linuxserver/
https://symfoware.blog.fc2.com/blog-entry-2447.html

おしまい
Windows ServerのServer Coreインストールも作ろうかな。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

configure で c compiler cannot create executablesとエラーがでて困った時の対処法

はじめに

Ubuntuで

c compiler cannot create executables

というエラーが生じたときの(あくまで私の場合の)原因を書き残しておく

状況

configureする際に、

# ./configure --prefix=/usr/local/openmpi-4.0.4 CC=gcc CFLAGS=-03

としたところ上のようなエラーが生じた。

たいていは、
# apt install build-essential
でgcc(やg++,make)を一括してインストールしてしまえば解決するのだが、私の場合しっかりと最新版になっていた。

対処法

./configure --prefix=/usr/local/openmpi-4.0.4 CC=gcc CFLAGS=-03

./configure --prefix=/usr/local/openmpi-4.0.4 CC=gcc CFLAGS=-O3

と数字の「0」から大文字のオー「O」へ変更する。

この記事上では違いがはっきりしているが、ubuntuのCUI上では違いが分かりずらかった。

参考にしたページのリンクは下記のURL

https://askubuntu.com/questions/647583/how-to-fix-configure-error-c-compiler-cannot-create-executables

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker-composeのenv_fileと.envファイルの違い

docker-composeにおいて、今まで混同していた

  • docker-compose.yml中のenv_fileで読み込むファイル
  • .envという名前のファイル

の違いについて、他の人が同じ過ちをしないように書き留めておきます。

LinuxとWindowsでは環境変数の扱いが微妙に異なるので、Windowsに慣れている人やdocker for windowsを使っている人が引っかかりやすいと思います。

基本的にこの質問と解答と同じ内容ですが、少し情報を足しておきます。

docker-compose cannot understand my env_file | stack overflow

docker-composeと環境変数

公式リファレンス
Dockerドキュメント | compose中の環境変数
に沿って、知識を整理しながら解説します。

docker-compose.yml中で使うホストの環境変数

docker-compose.yml中ではホスト側のシェルの環境変数が使えます。

例えば、

docker-compose.yml
web:
  image: "webapp:${TAG}"

と書いておいて、host側で環境変数TAGが設定されていればその値が挿入されます。
例えばTAGv1.5という値が設定されていれば、docker-compose buildで作られるimage名はwebapp:v1.5となります。

設定した環境変数にどのような値が挿入されるかは、docker-compose configコマンドで確認できます。

$ echo $TAG
# Windowsの場合は echo %TAG%で確認
v1.5

$ docker-compose config

version: '3'
services:
  web:
    image: 'webapp:v1.5'

.envファイル

ただ、いつもホストに使いたい環境変数が設定されているとは限らないです。
その場合の回避策として、docker-compose.ymlで使う環境変数のデフォルト値を.envというファイルで設定できます。
例えば.envファイルに

.env
TAG=v1.5

のように設定されていれば、image名は上と同様webapp:v1.5となります。

.envファイルはdocker-composeコマンドを実行したときのディレクトリにある必要があります(ワーキングディレクトリ)
他の場所では認識しません。
(Declare default environment variables in file参照)

この.envファイルによる設定は、ホストに使いたい環境変数がない場合の回避策なので、
もちろんホストに同名の環境変数が設定されていれば、そちらが優先されます。

$ export TAG=v2.0
# Windowsの場合は set TAG=v2.0で環境変数を設定
$ docker-compose config

version: '3'
services:
  web:
    image: 'webapp:v2.0'

立ち上げたコンテナ中の環境変数

上の話とは別にdocker-compose.yml中のenvironmentの項目を使うことで、docker-compose rundocker-compose upで立ち上げたコンテナに環境変数を設定できます。

docker-compose.yml
web:
  environment:
    - DEBUG=1

とすると、立ち上がったコンテナ中では

$ echo $DEBUG
1

と環境変数が設定されています。

docker-compose.yml中のenv_fileの項目

このコンテナ中の環境変数を別ファイルに書いておくこともできます。例えばweb-variables.envというファイルに

web-variables.env
DEBUG=1
FOO=bar

と書いておき、

web-variables.env
web:
  env_file:
    - web-variables.env

と、docker-compose.yml中のenv_fileの項目で読み込むファイルを指定しておけば、
コンテナ中では

$ echo $DEBUG
1
$ echo $FOO
bar

と環境変数が設定されています。

以上から、

  • env_fileで読み込むファイル
  • 先程述べた.envファイル

全く働きが別だということがわかると思います。

まとめ

  • docker-compose.yml中の$...は基本的にホストの環境変数であって、お手軽に使える変数ではない
  • env_file.envファイルは全く別

この問題にはまったきっかけ

最後に、検索することで、できるだけこの問題で引っかかている人が解決できるようにするために、
この問題にはまったきっかけを記しておきます。

docker-compose.yml中の環境変数を普通の変数のように使おうとしていた

docker-compose.yml中の$...に代入する値を場合によって使い分けて、
いろんな場合に対応させようとしたときにこのenv_fileと.envファイルに苦しみました。
本来ならば、-fオプションを使ったりして、docker-compose.ymlを分割すべきなのかもしれません。

docker-composeのプロキシ設定をしたかった

プロキシ下でdocker-composeする場合はdocker-composebuild中や、
立ち上がったコンテナでHTTP_PROXYなどのプロキシ用の環境変数を設定しなければなりません。

これを解決するためにdocker-composebuild>argsの項目やenvironment:の項を設定すればいいのですが、
ここでこのenv_fileと.envファイルに苦しみました。

これらを踏まえ、プロキシ下でのdocker-composeするための記事を作りました。

docker-composeでのプロキシ設定を一つのファイルにまとめる

VSCodeのRemote Containerで.envファイルを使おうとした

Advanced Container Configuration | VSCode
VSCodeのdockerを使ったリモートデバッグ機能(Remote Container)において、
devcontainer.jsonからdockerComposeFileの項でdocker-compose.ymlを指定し、リモートコンテナを立ち上げようとしました。
その際、プロキシを設定するために.envファイルを使おうとしましたが、
.envファイルをdocker-compose.ymlと同じフォルダにおいてもRemote Containerでは正しく設定できませんでした。

原因は上で述べた通り、
.envファイルはdocker-composeコマンドを実行したときのディレクトリにある必要がある
ということでした。

Remote Containerではdocker-composeをVSCodeのルートディレクトリで実行しているので、
ルートディレクトリに.envファイルはを置いたところ、正常に動作しました。
(Github Microsoft VSCode issue #222参照)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む