重い腰を上げて、ConoHa VPS v2.0からv3.0への移行を進めることにした。GMOさん的には、あんまり移行促進させる気はないように思われるが、v2.0は料金・性能的にも微妙なので、v3.0に移行することにした。この記事の更新の位置づけ。
半年程度をかけて5ノードをv2.0からv3.0へ移行を進めた。その際に、以下の悩みや課題が発生した。結果的にはv2.0のままノードを残すことを選択しても良かったかもしれない。
-
強烈な帯域制限:
v2.0ノードからv3.0ノードへ、5GB程度のデータを考えなしにscpでデータを移行させてしまったところ、v3.0ノードの全てが256kbpsに帯域制限されてしまった。解除されるまでに数日かかり、その間はひどいパケットロスにより、すべてのノードがほぼ利用不可能となってしまった。他のユーザに影響ある可能性があるとはいえ、移行直後の制限は相当に厳しく、他のノードまで巻き込む制限は強烈。現状ではネットワークを強化し、制限を見直したらしい。 -
v2.0との契約形態の違い:
v2.0では「基本は時間課金・前払いで一定期間分を支払うことで割安になる」(VPS割引きっぷ)という形態だった。さらにきっぷは自由にノード間で付け替えることが可能だった。一方でv3.0では「VPSは月額課金が基本で、時間課金はオプション的に用意されている」という形態に変わっている。この月額課金を一定期間分まとめて支払うことで割引が効く(まとめトク)ものの、VPSを削除すると他のノードへの付け替えは不可能で、契約も消滅する。さらに自動更新を設定していないと、契約満了時に時間課金へ移行することなくVPS自身が削除される。まとめトク契約満了時には、VPSノード建て直し、あるいは自宅サーバや他のVPSサービスへの乗り換えが必須になりそう。 -
契約変更やVPS追加の上限数:
まとめトクの自動更新を有効にし、VPSの自動削除を防止しておきたいが、自動更新時の契約変更に何故か上限数が存在する。前述の契約形態の違いで、とりあえず自動更新時には1ヶ月で様子見しておきたいものの、その設定が弾かれる。また同様に、VPSノード自身も契約上限数があり、クーポンでの前払いであっても作成不可能エラーが出る。そのため、ことあるごとに上限数解除をお願いしなければならない。
ConoHa VPSの契約
お好きなプランのUbuntu 24.04を選択して契約。
- Web管理画面からセキュリティグループをカスタム追加しておく
- SSH用のTCP 50000番台ポート
- HTTPS用のUDP 443番ポート
- イメージタイプはOS。ubuntu 24.04を選択。
ドメインの設定
ドメイン管理はCloudflareで保持。
- Cloudflare管理画面から、当該ドメイン名のアドレスを変える。
- ConoHaのサーバ管理画面で、逆引きホスト名として当該ドメイン名を入れておく。念のため。
セキュリティ周りの初期設定
ユーザ作成
管理画面からrootでシェルログインをしてユーザ作成、sudoersに追加、ssh鍵の設定、viで適当に新しいユーザの公開鍵をコピペして登録、まで一気にやってしまう。
# root
adduser <new user>
usermod -aG sudo <new user>
su <new user>
# new user
$ mkdir ~/.ssh
$ touch ~/.ssh/authorized_keys
$ vi ~/.ssh/authorized_keys
SSH
SSHのポート変更
# systemdのsocket設定をオーバーライドしてポート変更
$ sudo systemctl edit ssh.socket
+ [Socket]
+ ListenStream=
+ ListenStream=0.0.0.0:59978
+ ListenStream=[::]:59978
/etc/ssh/sshd_configをいじってRoot/Passwordログインを禁止、公開鍵ログインのみとする。
- PermitRootLogin yes
+ PermitRootLogin no
- PubkeyAuthentication no
+ PubkeyAuthentication yes #公開鍵ログイン
- PasswordAuthentication yes
+ PasswordAuthentication no
- # PermitEmptyPasswords no
+ PermitEmptyPasswords no
- # AllowAgentForwarding yes
+ AllowAgentForwarding yes
/etc/ssh/sshd_config.d/50-cloud-init.confにも同様の設定があるので、そちらも修正しておく。(このファイルのようにオーバーライド用の設定ファイルを作るべきではあるが。。。)
- PasswordAuthentication yes
+ PasswordAuthentication no
# ssh再起動
$ sudo /etc/init.d/ssh restart
iptablesの設定
ufwで楽をする。Port 80/443などはdockerが勝手に空けてくれるのでわざわざ空けなくてよろしい。
# ssh
$ sudo ufw allow <ssh port>/tcp
# デフォルトでは全部拒否
$ sudo ufw default deny
$ sudo ufw enable
確認。
$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
<ssh port>/tcp ALLOW IN Anywhere
<ssh port>/tcp (v6) ALLOW IN Anywhere (v6)
IPv6の設定は特に不要
ConoHa VPSには、サーバごとに1つのIPv4アドレス、17個のIPv6アドレスが振られている。数年前と違って、自動でIPv4アドレス・IPv6代表アドレスがサーバのeth0に割り当てられるようになっている。netplanをいじる必要はない。
NTPはもう入れない
もうNTPサーバを立てる必要もなさそう。Ubuntuではsystemd-timesyncdが動いているので勝手に時刻同期してくれるようだ。
こんな感じで同期している。
$ timedatectl status
Local time: Sun 2026-02-08 16:40:07 JST
Universal time: Sun 2026-02-08 07:40:07 UTC
RTC time: Sun 2026-02-08 07:40:07
Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
NTP service: n/a
RTC in local TZ: no
Docker
いつも通りサーバは全部Dockerで動かす。公式ドキュメントに従ってdockerを導入。
リポジトリの設定
# コンフリクトしたパッケージの削除
$ sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 docker-doc podman-docker containerd runc | cut -f1)
# Docker GPG Keyの追加
$ sudo apt update &&\
sudo apt install ca-certificates curl &&\
sudo install -m 0755 -d /etc/apt/keyrings &&\
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc &&\
sudo chmod a+r /etc/apt/keyrings/docker.asc
# APTソースの追加
$ sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOF
# パッケージリストの更新
$ sudo apt update
Docker Community Editionの導入
# Docker CEのインストール
$ sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 作った一般ユーザでDockerが利用できるようにしておく
$ sudo usermod -aG docker <new user>
# インストール確認 (再ログイン後に実行)
$ docker run hello-world
Docker Composeの導入は不要
docker本体に統合されたので、別途導入は不要。
IPv6対応
こちらの記事を参考にDockerのIPv6対応をしておく。
-
/etc/docker/daemon.jsonを作成・編集
{
"ipv6": true,
"ip6tables": true,
"userland-proxy": false,
"fixed-cidr-v6": "fd00:ace:cafe:beaf::/80"
}
- Docker再起動
$ sudo systemctl stop docker.socket &&\
sudo systemctl stop docker &&\
sudo systemctl start docker
- 確認
$ docker network inspect bridge | grep IPv6
"EnableIPv6": true,
$ ip addr show docker0 |grep inet6
inet6 fd00:ace:cafe:beaf::1/80 scope global nodad
inet6 fe80::53:9dff:fe88:b3be/64 scope link
/etc/sysctl.confは編集不要。勝手にnet.ipv6.conf.all.forwarding = 1 が立っている。
Logwatchでメールで監視ログを投げる
念のため。
$ sudo apt install logwatch
$ sudo cp /usr/share/logwatch/default.conf/logwatch.conf /etc/logwatch/conf/
/etc/logwatch/conf/logwatch.confを自分のアドレス宛に編集。
- MailTo = root
+ MailTo = xxx@example.com
Postfixのリレー設定の記事を使って、さくらのメールサーバをリレーサーバとし、postfixから自分のアドレスへログメールを送るようにする。
/etc/postfix/main.cfを編集。
+ mydomain = conoha.example.com
- myorigin = /etc/mailname
+ myorigin = $mydomain
- append_dot_mydomain = no
+ append_dot_mydomain = yes
- smtpd_tls_security_level=may
+ smtpd_tls_security_level=yes
+ # For sasl authentication
+ smtp_sasl_auth_enable = yes
+ smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
+ smtp_sasl_mechanism_filter = cram-md5, plain, login
+ smtp_sasl_tls_security_options = noanonymous, noplaintext
- mydestination = $myhostname, conoha, localhost.localdomain, , localhost
+ mydestination = $myhostname, localhost.localdomain, localhost.$mydomain, localhost.localdomain, localhost, $mydomain
- relayhost =
+ relayhost = [example.sakura.ne.jp]:587
- inet_interfaces = all
+ inet_interfaces = 127.0.0.1
/etc/postfix/sasl_passwdを作成。
example.sakura.ne.jp noreply@example.sakura.ne.jp:<password>
Postmapデータベースを作成し、postfixを再起動。
$ sudo postmap /etc/postfix/sasl_passwd
$ sudo systemctl restart postfix
最後に動作確認。
$ sudo /etc/cron.daily/00logwatch