<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>http://transitive.info/</id>
  <title>transitive.info</title>
  <updated>2026-02-13T15:00:00Z</updated>
  <link rel="alternate" href="http://transitive.info/"/>
  <link rel="self" href="http://transitive.info/atom.xml"/>
  <author>
    <name>transitive.info</name>
    <uri>http://transitive.info</uri>
  </author>
  <entry>
    <id>tag:transitive.info,2026-02-14:/2026/02/14/ubuntu-network-manager-usb-tethering/</id>
    <title type="html">USB テザリングのスマートフォンを接続したときの NetworkManager の自動設定</title>
    <published>2026-02-13T15:00:00Z</published>
    <updated>2026-02-13T15:00:00Z</updated>
    <link rel="alternate" href="http://transitive.info/2026/02/14/ubuntu-network-manager-usb-tethering/"/>
    <content type="html">
&lt;h1 id="usb--networkmanager-"&gt;USB テザリングのスマートフォンを接続したときの NetworkManager の自動設定&lt;/h1&gt;

&lt;p&gt;Ubuntu 25.10 で、USB テザリングのスマートフォンを接続したときは、その接続を優先して使うようにした。
スマートフォンを接続時に毎回、インターフェイス名が変わるので、USB 接続の設定を行った。
どの接続を優先するかは NetworkManager で設定を行った。&lt;/p&gt;

&lt;h2 id="section"&gt;インターフェイスの確認&lt;/h2&gt;

&lt;p&gt;インターフェイス名は&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;nmcli device status
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;で確認する。たとえば、eth1 なら&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;udevadm info -q property -p /sys/class/net/eth1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;で詳細を表示する。&lt;/p&gt;

&lt;h2 id="usb-"&gt;USB 接続の設定&lt;/h2&gt;

&lt;p&gt;USB で接続したときに、インターフェイス名を固定するようにする。
/etc/udev/rules.d/99-usb-tethering.rules のファイルを作り、
確認した ID_SERIAL を使って設定を書く。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;SUBSYSTEM=="net", ACTION=="add", ENV{ID_SERIAL}=="****", NAME="usb-tethering0"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;このようにすると、usb-tethering0 というインターフェイス名になる。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;udevadm control --reload
udevadm trigger
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;を root で実行する。&lt;/p&gt;

&lt;h2 id="networkmanager-"&gt;NetworkManager の設定&lt;/h2&gt;

&lt;p&gt;普段、使用している接続の優先度 100 より小さくなる、99 を優先度に設定する。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;nmcli con add type ethernet ifname usb-tethering0 con-name usb-tethering-connection0
nmcli con modify usb-tethering-connection0 connection.autoconnect yes
nmcli con modify usb-tethering-connection0 connection.autoconnect-priority 99
nmcli con modify usb-tethering-connection0 ipv4.route-metric 99
nmcli con modify usb-tethering-connection0 ipv4.method auto
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="networkmanager--1"&gt;NetworkManager の接続名の変更&lt;/h2&gt;

&lt;p&gt;NetworkManager の接続名を usb-tethering-connection0 とした。
自動で設定される有線 LAN の接続名が日本語で使いにくい。
変更するには&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;nmcli con modify "有線接続 1" connection.id "wired-connection1"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;などとする。&lt;/p&gt;

&lt;h2 id="section-1"&gt;参考&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://blog.apar.jp/linux/17541/"&gt;https://blog.apar.jp/linux/17541/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <id>tag:transitive.info,2026-02-12:/2026/02/12/ubuntu-qemu-kvm-guest-windows/</id>
    <title type="html">QEMU KVM に Windows 11 をインストールする</title>
    <published>2026-02-11T15:00:00Z</published>
    <updated>2026-02-11T15:00:00Z</updated>
    <link rel="alternate" href="http://transitive.info/2026/02/12/ubuntu-qemu-kvm-guest-windows/"/>
    <content type="html">
&lt;h1 id="qemu-kvm--windows-11-"&gt;QEMU KVM に Windows 11 をインストールする&lt;/h1&gt;

&lt;p&gt;Ubuntu 25.10 で QEMU KVM を利用し、ゲスト OS として Windows 11 をインストールして設定した。&lt;/p&gt;

&lt;h2 id="windows-11-"&gt;パッケージのインストールと Windows 11 のインストール&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;apt install qemu-kvm libvirt-daemon-system libvirt-clients ovmf swtpm virt-manager virt-viewer virtiofsd
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;asdf を使用している環境度上は virt-manager を実行するのに環境変数の設定が必要だった。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ASDF_PYTHON_VERSION=system virt-manager
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;virt-manager の「新しい仮想マシンの作成」で、Microsoft のページからダウンロードした
Win11_25H2_Japanese_x64.iso を使って Windows 11 をインストールする。&lt;/p&gt;

&lt;h2 id="section"&gt;画面サイズの自動調節とファイル共有&lt;/h2&gt;

&lt;p&gt;ゲストの Windows の画面サイズを自動で調節するように設定する。
ホストの Ubuntu のディレクトリにアクセスする設定を行う.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/"&gt;https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/&lt;/a&gt;
から virtio-win-0.1.285.iso をダウンロードし、Windows のドライブに設定する。
virtio-win-guest-tools.exe を実行してインストールする。&lt;/p&gt;

&lt;p&gt;virt-manager で「メモリー」にある「共有メモリを有効にする」にチェックを入れる。
「ハードウェアを追加」で「ファイルシステム」でホストのディレクトリを選び、追加する。
virt-manager から virtiofs を使ったファイルシステムを追加する。
Windows の画面サイズを Ubuntu のウィンドウに自動で合わせるためには、「ビデオ Virtio」をQXLにする。&lt;/p&gt;

&lt;p&gt;Windows で WinFsp をインストールする。
&lt;a href="https://winfsp.dev/"&gt;https://winfsp.dev/&lt;/a&gt; から winfsp-2.1.25156.exe をダウンロードし、実行する。&lt;/p&gt;

&lt;p&gt;管理者の PowerShell で次を実行する。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sc.exe create VirtioFsSvc binpath="C:\Program Files\Virtio-Win\VioFS\virtiofs.exe" start=auto depend="WinFsp.Launcher/VirtioFsDrv" DisplayName="Virtio FS Service"
sc.exe start VirtioFsSvc
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;再起動すると無効になる。自動で起動するには、さらに&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sc.exe config VirtioFsSvc start= auto
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;を実行する。&lt;/p&gt;

&lt;h2 id="section-1"&gt;ディスクのファイルの圧縮&lt;/h2&gt;

&lt;p&gt;virt-manager で仮想マシンのインストール時にディスクのファイルを作ると
容量と同じサイズのファイルが作成されていた。
インストールの前にあらかじめディスクを作るには、root で適当なディレクトリで&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;qemu-img create -f qcow2 win.qcow2 256G
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;を実行する。すでに作成したファイルを縮小するには&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;qemu-img convert -O qcow2 win.qcow2 win_compact.qcow2
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;として、できたファイルで置きかえる。&lt;/p&gt;

&lt;h2 id="windows-"&gt;Windows の設定&lt;/h2&gt;

&lt;p&gt;ゲストの暗号化や復元ポイントは、ホストでの暗号化や仮想マシンのバックアップで対応するので不要。
デバイスの暗号化 (Windows Pro だと BitLocker) を無効にし、復元ポイントは削除しておく。&lt;/p&gt;

&lt;p&gt;インストール後の状態のバックアップを取るためにディスクのサイズを小さくしたいので
Windows Update のファイルなどを削除するために「ディスクのクリーンアップ」を実行しておく。&lt;/p&gt;

&lt;h2 id="xml-"&gt;仮想マシンの設定の XML の編集&lt;/h2&gt;

&lt;p&gt;仮想マシンの設定の XML を直接、編集するには&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;virsh -c qemu:///session edit VMNAME
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;とする。&lt;/p&gt;

&lt;h2 id="section-2"&gt;参考&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://qiita.com/rxg03350/items/e76a6a858f6b9ac267b3"&gt;https://qiita.com/rxg03350/items/e76a6a858f6b9ac267b3&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://www.hitachi.co.jp/Prod/comp/linux/doc/serial/no3.html"&gt;https://www.hitachi.co.jp/Prod/comp/linux/doc/serial/no3.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <id>tag:transitive.info,2026-01-12:/2026/01/12/devpi-pypi-cache-server/</id>
    <title type="html">PyPI のキャッシュサーバの devpi を使う</title>
    <published>2026-01-11T15:00:00Z</published>
    <updated>2026-01-11T15:00:00Z</updated>
    <link rel="alternate" href="http://transitive.info/2026/01/12/devpi-pypi-cache-server/"/>
    <content type="html">
&lt;h1 id="pypi--devpi-"&gt;PyPI のキャッシュサーバの devpi を使う&lt;/h1&gt;

&lt;h2 id="devpi-"&gt;パッケージのインストールと devpi ユーザの作成&lt;/h2&gt;

&lt;p&gt;devpi ユーザを作り、ホームディレクトリ /home/devpi にサーバの設定やキャッシュを保存する。
root で作業する。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;apt install -y python3-venv
useradd --system --create-home --home-dir /home/devpi --shell /usr/sbin/nologin devpi
mkdir -p ~devpi/{server,venv}
chown -R devpi:devpi ~devpi
sudo -u devpi python3 -m venv ~devpi/venv
sudo -u devpi ~devpi/venv/bin/pip install -U pip
sudo -u devpi ~devpi/venv/bin/pip install devpi-server devpi-web
sudo -u devpi ~devpi/venv/bin/devpi-init --serverdir ~devpi/server
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="section"&gt;サービスの登録&lt;/h2&gt;

&lt;p&gt;次のような /etc/systemd/system/devpi.service を作る。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[Unit]
Description=devpi (PyPI caching proxy)
After=network-online.target
Wants=network-online.target

[Service]
User=devpi
Group=devpi
WorkingDirectory=/home/devpi
ExecStart=/home/devpi/venv/bin/devpi-server --serverdir /home/devpi/server --host 0.0.0.0 --port 3141 --restrict-modify=root
Restart=on-failure

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;実行して、動作を確認する。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;systemctl daemon-reload
systemctl enable --now devpi
systemctl status devpi --no-pager
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="section-1"&gt;キャッシュサーバを使う方法&lt;/h2&gt;

&lt;p&gt;キャッシュサーバを使う一般ユーザで pip の設定をする。
ここでは、localhost のポート 3141 で動作しているとする。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;python -m pip config --user set global.index-url http://localhost:3141/root/pypi/+simple/
python -m pip config --user set global.trusted-host localhost
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;を実行すると ~/.config/pip/pip.conf に設定が加えられる。&lt;/p&gt;

&lt;p&gt;uv pip でも上の設定を読み込むが、オプションを設定することもできる。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;uv pip install --default-index http://devpi.local:3141/root/pypi/+simple/ --allow-insecure-host localhsot numpy
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;環境変数を設定する方法もある。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;export UV_DEFAULT_INDEX=http://localhost:3141/root/pypi/+simple/
export UV_INSECURE_HOST=localhost
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;デフォルトのリポジトリを参照している uv.lock を変えずに実行するには –frozen を使って&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;uv run --frozen COMMAND
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;のようにする。一時的にデフォルトのリポジトリを使うには –default-index で指定すれば良い。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;uv sync --default-index https://pypi.org/simple
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="section-2"&gt;参考&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://zenn.dev/takemikami/articles/20220708-devpipythonpackage"&gt;https://zenn.dev/takemikami/articles/20220708-devpipythonpackage&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://qiita.com/kitsuyui/items/8a1c464af539ef268ce6"&gt;https://qiita.com/kitsuyui/items/8a1c464af539ef268ce6&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <id>tag:transitive.info,2025-12-25:/2025/12/25/conoha-vps-ubuntu-dovecot-postfix/</id>
    <title type="html">ConoHa VPS の Ubuntu 24.04 で Dovecot と Postfix を設定する</title>
    <published>2025-12-24T15:00:00Z</published>
    <updated>2025-12-24T15:00:00Z</updated>
    <link rel="alternate" href="http://transitive.info/2025/12/25/conoha-vps-ubuntu-dovecot-postfix/"/>
    <content type="html">
&lt;h1 id="conoha-vps--ubuntu-2404--dovecot--postfix-"&gt;ConoHa VPS の Ubuntu 24.04 で Dovecot と Postfix を設定する&lt;/h1&gt;

&lt;p&gt;ConoHa VPS Ubuntu 24.04 で Dovecot と Postfix の設定を行った。&lt;/p&gt;

&lt;h2 id="dovecot"&gt;Dovecot&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;apt install dovecot-imapd
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;~/Maildir を使うように /etc/dovecot/conf.d/10-mail.conf の mail_location の行を次のように編集する。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;mail_location = maildir:~/Maildir
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;/etc/dovecot/conf.d/10-auth.conf を編集して、次のようにする。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;disable_plaintext_auth = yes
auth_mechanisms = plain login
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;/etc/dovecot/conf.d/10-mail.conf では標準で&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;mail_privileged_group = mail
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;となっていたので&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;usermod -aG mail [USERNAME]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;で使用するユーザを mail グループに登録する。
証明書の設定を行う。すでに、Let’s Encrypt で証明書を取得してあるので、それを利用する。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;certbot certificates
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;でファイルのパスを確認し /etc/dovecot/conf.d/10-ssl.conf に&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ssl_cert = &amp;lt;/etc/letsencrypt/live/example.com/fullchain.pem
ssl_key = &amp;lt;/etc/letsencrypt/live/example.com/privkey.pem
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;などと書く。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;systemctl restart dovecot.service
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;で設定を読み込んだら、動作を確認する。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;systemctl status dovecot.service
ss -lntp
openssl s_client -connect example.com:993 -servername example.com -showcerts 
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ポートを明ける。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ufw allow 993
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ConoHa VPS のポートの設定も確認しておく。&lt;/p&gt;

&lt;h2 id="postfix"&gt;Postfix&lt;/h2&gt;

&lt;p&gt;/etc/postfix/master.cf に以下を加える。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;/etc/postfix/main.cf を次のように編集する。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;smtpd_tls_cert_file = /etc/letsencrypt/live/example.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/example.com/privkey.pem
smtpd_tls_security_level = may
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;/etc/dovecot/conf.d/10-master.conf の service auth を次のようにする。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;service auth {
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ポートを開ける。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ufw allow 587
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;最後に dovecot と postfix を再起動する。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;postfix check
systemctl restart dovecot
systemctl restart postfix
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  <entry>
    <id>tag:transitive.info,2025-10-31:/2025/10/31/install-docker-mattermost/</id>
    <title type="html">Mattermost Omnibus のサーバを移転して Docker の Mattermost にする</title>
    <published>2025-10-30T15:00:00Z</published>
    <updated>2025-10-30T15:00:00Z</updated>
    <link rel="alternate" href="http://transitive.info/2025/10/31/install-docker-mattermost/"/>
    <content type="html">
&lt;h1 id="mattermost-omnibus--docker--mattermost-"&gt;Mattermost Omnibus のサーバを移転して Docker の Mattermost にする&lt;/h1&gt;

&lt;p&gt;Ubuntu 20.04 で動かしていた Mattermost をサーバ移転の機会に、
Mattermost v11 には対応しない Mattermost Omnibus から、Docker の Mattermost に変えた。&lt;/p&gt;

&lt;h2 id="ubuntu-2004--mattermost-omnibus-"&gt;Ubuntu 20.04 での Mattermost Omnibus のデータベースとデータのバックアップの作成&lt;/h2&gt;

&lt;p&gt;Mattermost Omnibus のデータベースのバックアップをバイナリファイルとテキストファイルで作っておく。
データベースのパスワードは /etc/mattermost/mmomni.yml に書いてあるので、あらかじめ確認しておく。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;systemctl stop mattermost.service
cd /tmp
sudo -u mattermost pg_dump -h 127.0.0.1 -p 5432 -U mmuser -d mattermost -Fc -f mattermost_pg.dump
sudo -u mattermost pg_dump -h 127.0.0.1 -p 5432 -U mmuser -d mattermost &amp;gt; mattermost_pg.sql
mv mattermost_pg_dump.dump ~
cd
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;/var/opt/mattermost/data と /etc を圧縮ファイルにしておく。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;tar cvJf mattermost_data.tar.xz /var/opt/mattermost/data/
tar cvJf ubuntu_etc.tar.xz /etc
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ここで作成したファイルを新しいサーバに送っておく。&lt;/p&gt;

&lt;h2 id="docker--docker-composeyml"&gt;Docker のインストールと docker-compose.yml&lt;/h2&gt;

&lt;p&gt;以下は、新しいサーバの Ubuntu 24.04 の作業になる。&lt;/p&gt;

&lt;p&gt;まず、Docker をインストールする。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;apt install docker.io docker-compose-v2
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;次のような docker-compose.yml を用意する。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;version: "3.9"

services:
  db:
    image: postgres:15
    restart: always
    environment:
      POSTGRES_USER: mmuser
      POSTGRES_PASSWORD: [PASSWORD]
      POSTGRES_DB: mattermost
    volumes:
      - /var/opt/mattermost/db:/var/lib/postgresql/data

  app:
    image: mattermost/mattermost-team-edition:10.5
    restart: always
    depends_on:
      - db
    ports:
      - "8065:8065"
    environment:
      MM_SQLSETTINGS_DRIVERNAME: postgres
      MM_SQLSETTINGS_DATASOURCE: postgres://mmuser:[PASSWORD]:5432/mattermost?sslmode=disable
      MM_SERVICESETTINGS_SITEURL: https://example.com
      MM_LOGSETTINGS_ENABLECONSOLE: "true"
      MM_LOGSETTINGS_CONSOLELEVEL: "INFO"
    volumes:
      - /var/opt/mattermost/data:/mattermost/data
      - /var/opt/mattermost/config:/mattermost/config
      - /var/log/mattermost:/mattermost/logs
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;/var/opt/mattermost にデータベース、データ、設定のディレクトリが作成され、
ログは /var/log/mattermost に保存されるようにしている。
このページでは PostgreSQL のパスワードは [PASSWORD]、サイト URL は example.com としてあるので、
これらは実際には置き換える必要がある。&lt;/p&gt;

&lt;h2 id="nginx--lets-encrypt"&gt;nginx &amp;amp; Let’s Encrypt&lt;/h2&gt;

&lt;p&gt;ウェブサーバと SSL の証明書を準備する。nginx と certbot をインストールし、ポートを開け、
certbot で ACME アカウントを作る。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;apt install nginx certbot python3-certbot-nginx
ufw allow "Nginx FUll"
certbot register --agree-tos --email admin@example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;certbot を webroot で実行できて、http のアクセスを https に転送する、次のような nginx の設定ファイルを作る。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;server{
        listen 80;
        listen [::]:80;
        server_name example.com;

        location ^~ /.well-known/acme-challenge/ {
                 default_type "text/plain";
                 root /var/www/html;
        }

        location / {
                 return 301 https://$host$request_uri;
        }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;このファイルは /etc/nginx/sites-available にをおき、/etc/nginx/sites-enabled にシンボリックリンクを張る。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;systemctl restart nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;などとして設定を反映させる。&lt;/p&gt;

&lt;p&gt;Mattermost には https によるアクセスで対応する。以下の nginx の設定を /etc/nginx/sites-available におく。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name example.com;

        ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

        location / {
                proxy_pass    http://localhost:8065/;
                proxy_redirect http:// https://;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-Host $host;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_read_timeout 90s;
                proxy_send_timeout 90s;
                client_max_body_size 100M;
        }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;この設定は証明書を取得していないとエラーになるので、
まだ、/etc/nginx/sites-enabled にシンボリックは張らない。&lt;/p&gt;

&lt;p&gt;次のコマンドで証明書を取得する。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;certbot certonly --webroot -w /var/www/html -d example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="postfix"&gt;postfix&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;apt install postfix
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;maildrop は 24.04 になかったので、25.04 の maildrop_3.1.8-2_amd64.deb を取得して dpkg でインストールした。&lt;/p&gt;

&lt;p&gt;postfix の設定を行って、postfix を再起動する。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;systemctl restart postfix
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="docker--mattermost-"&gt;Docker の Mattermost の実行&lt;/h2&gt;

&lt;p&gt;/var/opt/mattermost などのコンテナがアクセスするディレクトリを用意する。
コンテナ内の mattermost ユーザの UID は 2000 なので、所有者を変更しておく。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;mkdir -p /var/opt/mattermost/config
mkdir /var/log/mattermost
mv PATH_TO_BACKUP/var/opt/mattermost/data/ /var/opt/mattermost
chown -R 2000:2000 /var/opt/mattermost
chown -R 2000:2000 /var/log/mattermost
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;/var/opt/mattermost/config/config.json を&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{
  "SqlSettings": {
    "DriverName": "postgres",
    "DataSource": "postgres://mmuser:[PASSWORD]@db:5432/mattermost?sslmode=disable"
  },
  "ServiceSettings": {
    "SiteURL": "https://example.com"
  },
  "FileSettings": {
    "Directory": "/mattermost/data"
  },
  "LogSettings": {
    "EnableConsole": false,
    "EnableFile": true,
    "FileLocation": "/mattermost/logs/mattermost.log",
    "ConsoleLevel": "INFO",
    "FileLevel": "INFO"
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;のようにした。所有者を変えておく。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;chown -R 2000:2000 /var/opt/mattermost/config
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;データベースを復元する。docker-compose.yml があるディレクトリで&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;docker compose up -d db
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;でデータベースのコンテナを実行する。
データベースのディレクトリは docker-compose.yml に指定した /var/opt/mattermost/db になる。
すべて消して作り直す場合は、このディレクトリを削除するか、次のコマンドを実行する。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;docker exec -it mattermost-db-1 psql -U mmuser -d mattermost -c "DROP SCHEMA public CASCADE; CREATE SCHEMA public AUTHORIZATION mmuser;"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;データベースを読み込む。カレントディレクトリに mattermost_pg.dump を置き、&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;docker run --rm --network container:mattermost-db-1 -e PGPASSWORD='[PASSWORD]' -v "$PWD:/backup" postgres:15 pg_restore -h 127.0.0.1 -p 5432 -U mmuser -d mattermost -v /backup/mattermost_pg.dump
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;を実行する。設定などに問題がなければ&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;で mattermost が動く。&lt;/p&gt;

&lt;p&gt;管理権限を持つアカウント名を調べるには&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;docker exec -it mattermost-db-1 psql -U mmuser -d mattermost -c "SELECT username, roles FROM users WHERE roles LIKE '%system_admin%';"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;とすると良い。&lt;/p&gt;
</content>
  </entry>
</feed>


