TP-Link Tapo P110Mセットアップ

※設定がうまくいかない場合10秒以上電源長押し

・iPhone HOMEアプリの場合(Matter)

iPhoneのBluetoothを有効化。

iPhoneを2.4GHzのWiFiに接続する。

Tapoをコンセントにさす。

HOMEアプリ>追加>コンセント
QRコードを読んで追加する。

※HOMEに追加した時点で、TapoがWiFiに接続できている。
iPhone経由でWiFiの情報が伝わっている。

・TP-Link Tapoアプリ

iPhoneのBluetoothを有効化。

TP-Link Tapoアプリをインストール。

TP-Link IDを作成。

アプリを起動するとデバイスを自動で見つける。

名前をつけ、ファームウェアのアップデート。

HOMEアプリのセットアップをしておくとWiFiの設定は不要でつながる。

セットアップ完了後は、同じWiFiにいなくても操作可能。

 

 

Obsidian Copilot導入

Perplexityをメインで利用していたが、スレッドをコンテキストとして再利用できていなかった。最近スレッドをコンテキストとして再利用したいなと思うことが多かったので、Obsidian+Copilot環境を導入した。

Obsidian+Copilotでは簡単にスレッドをノート(ファイル)として保存(Save Chat as Note)できて、そのファイルをコンテキストとして渡せる。ファイル名は自動で付くけど、GPT5だと文字化けするので現状はGPT4.1を利用している。

保存したノートをサイドバーに日付順で表示する。

baseを作成。

filterで、スレッドを保存したフォルダを指定。

Add Formulaで、ファイル名から日付を取得する。

ヘッダを強調表示

hタグでの違いが分かりづらかったため。

設定>外観>CSSスニペット
cssファイルを作成。

 

Next.js Hello World

インストール

VSCode、Node.js
をダウンロード&インストール。

Node.jsのネイティブモジュールのビルドに必要なツールのチェックはオフでOK。

ターミナルで、
npx create-next-app@latest testapp

OK to proceed = yes
Would you like to use TypeScript = No
Which linter would you like to use = ESLint
Would you like to use Tailwind CSS = Yes
Would you like code inside a src directory = Yes
Would you like to use App Router = Yes
Would you like to use App Turbopack = Yes
Would you like to customize the import alias (@/* by default) = No

インストールが完了する。

cd testapp
npm run dev

http://localhost:3000
にアクセスする。

編集

src/app配下にページごとにフォルダ作成し、そのページごとのフォルダの中にpage.jsを置く。

・layout.js
ページ全体の共通レイアウトや共通処理を定義

・page.js
layout.jsで定義されたレイアウトの中に表示される

RustDesk VPSインストール

※hbbrがリレーサーバー、hbbsがシグナルサーバー

ufw

※ from xxx は省略可能
(ufw allow to any port 21116 proto tcp)
※ proto xxx は省略可能(tcp/udpが適用)
(ufw allow to any port 21116)
※ to any portを省略する場合、proto toも省略する省略記法(カンマ区切不可)
(ufw allow 21116/udp)

ufw allow to any port 21114,21115,21116,21117,21118,21119 proto tcp
ufw allow to any port 21116 proto udp

※以下が必要
21114(TCP)
21115(TCP)
21116(TCP/UDP)
21117(TCP)
21118(TCP)
21119(TCP)

コマンド

ufw status numbered
ufw delete 1
ufw reload

Docker

mkdir rustdesk
cd rustdesk
vim docker-compose.yml

docker compose up -d

クライアント

https://github.com/rustdesk/rustdesk/releases

設定>ネットワーク>認証サーバー/中継サーバーにIPアドレスを入れる
Keyの調べ方。
cd data
cat id_ed25519.pub

ChatGPT/Gemini API

・GeminiAPI

https://console.cloud.google.com/
にアクセスし、プロジェクト作成

APIとサービス>ライブラリ
geminiと検索し、Gemini APIを有効化する

認証情報>認証情報を作成>APIキー
表示されたAPIキーを保存する

・ChatGPT

https://auth.openai.com/log-in

Billing>Payment methods>Add payment method
からクレジットカード登録

Billing>Add to credit balance
からチャージ

Manage Projects>API Keys
からシークレットキー取得

https://platform.openai.com/settings/organization/usage
から料金確認

GPT5のAPI利用ではVerify Organizationが必要
General>Verify Organization>Start ID Check
QRコードでスマホを開いて運転免許撮影+顔写真撮影といった流れ。

 

 

XserverVPS+Ubuntu+Docker Samba-DC

Samba DC

今回は検証目的で、通常はVPSで直接Dockerを公開するような運用はNGで、VMを経由する。

●●●=利用環境のグローバルIPアドレス

・ufw

ufw allow from ●●● to any port 9922,3306,53,88,135,139,389,445,464,636,3268,3269,49152:49252 proto tcp
ufw allow from ●●● to any port 53,88,123,137:138,389,464 proto udp

・フォルダ作成

cd /home
mkdir samba
cd samba
mkdir data
mkdir config

chmod 700 data
chmod 700 config

Docker

vim docker-compose.yml

・もし再実行で既にコンテナがあるようだったら

docker ps -a
docker compose down
※カレントディレクトリにdocker-compose.ymlがある状態で実行

・通常終了しない場合
docker ps -a
docker rm -f コンテナID

・バインドボリューム削除
rm -rf ./data/* && rm -rf ./config/*

※再起動の場合
docker restart samba-dc

※一時停止の場合
docker pause samba-dc
docker unpause samba-dc

・起動

docker compose up -d
※カレントディレクトリにdocker-compose.ymlがある状態で実行
※dはバックグランド実行

・停止
※もし自動で再起動を繰り返している場合止める
docker stop samba-dc

・初回のみエラー

53ポートが使用中とのことでエラー。

lsof -i :53

vim /etc/systemd/resolved.conf
DNSStubListener
>no
に変更する。
systemctl restart systemd-resolved

SambaRPCポート変更

※直接変更する方法
docker exec -it samba-dc vi /etc/samba/smb.conf

rpc server dynamic port range = 49152-49172

rpc server dynamic port range = 49152-49252
に変更。

docker exec -it samba-dc supervisorctl restart samba

※ポートが多すぎるコンテナ生成で失敗する。(タイムアウトしてしまう)
ポートが少なすぎるとADの同期で問題が発生する。

エラー確認

journalctl -u docker
docker logs -f samba-dc
docker exec -it samba-dc tail -f /var/log/samba/log.smbd
docker exec -it samba-dc tail -f /var/log/ntp

NTP変更

docker logs samba-dc | grep ntp
でntp系のエラー確認

・ntpサーバー確認
docker exec -it samba-dc ntpq -p
現在のntpサーバー(*)を確認しping
docker exec -it samba-dc sntp xxx.xxx.xxx.xxx

/etc/ntp.conf or /etc/ntpd.conf
使用されている方の調べ方(ps aux | grep ntpd)
を編集する。

docker exec -it samba-dc vi /etc/ntpd.conf

server ntp.nict.jp iburst prefer
を追加し、
ntpsigndsocket /usr/local/samba/var/lib/ntp_signd/

ntpsigndsocket /var/lib/samba/ntp_signd/
に変更する

docker exec -it samba-dc supervisorctl restart ntpd

・ntp.drift作成

docker exec -it samba-dc mkdir -p /var/lib/ntp
docker exec -it samba-dc touch /var/lib/ntp/ntp.drift
docker exec -it samba-dc chown ntp:ntp /var/lib/ntp
docker exec -it samba-dc chown ntp:ntp /var/lib/ntp/ntp.drift
docker exec -it samba-dc chmod 755 /var/lib/ntp
docker exec -it samba-dc chmod 664 /var/lib/ntp/ntp.drift

docker exec -it samba-dc supervisorctl restart ntpd

・一応確認

アクセス権限
cd /var/lib/ && ls -la
chown ntp:ntp /var/lib/ntp
chmod 755 /var/lib/ntp
になっていればOK。

ntpユーザがいるかどうか
id ntp

・usersharesフォルダ作成
docker exec -it samba-dc mkdir -p /var/lib/samba/usershares

SambaTool(DNS逆引き)

VPSアドレス[AAA.BBB.CCC.DDD]
から
samba-dc.xxx.local
を取得する方法

docker exec -it samba-dc samba-tool dns zonecreate localhost CCC.BBB.AAA.in-addr.arpa –username=administrator –password=xxx

docker exec -it samba-dc samba-tool dns add localhost CCC.BBB.AAA.in-addr.arpa DDD PTR samba-dc.xxx.local –username=administrator –password=xxx

docker exec -it samba-dc supervisorctl restart samba

Windowクライアント設定

Win11でNASにアクセスできなくなる対策と同じ設定。
(安全でないゲスト ログオン等)

ncpa.cpl
利用しているNICのDNSをVPSのIPアドレスにする。

sysdm.cpl
コンピュータ名タブ>変更
ドメインを選択しドメイン名を入力する。

ユーザーはadministrator
パスワードはdocker-compose
で指定したパスワードを入力する。

再起動したらログイン画面で
ドメイン名\administrator
のように入力しログインできる。初回ログイン時はかなり時間がかかる。

※アカウントもADに参加しないと以下コマンドは使えないが、このタイミングでローカルorMSアカウントを入力して、端末だけAD参加という状態も可能。

・Windows RSAT 有効化(ユーザー参加必須)

システム>オプション機能>機能表示>使用可能な機能を表示する
RSAT: ActiveDirectoryDomainServices およびライトウェイトディレクトリサービスツール
をチェックし追加すると、
Active Directory サイトとサービス
Active Directory ドメインと信頼関係
Active Directory ユーザーとコンピュータ
Active Directory 管理センター(Samba-DCでは利用不可)
が有効化される。

RSAT: グループポリシー管理ツール
をチェックし追加すると、
gpmc.msc
が有効化される。

・DNSが問題ないか確認する。

nslookup ドメイン
これでVPSのIPアドレスが返ってくればOK。

nslookup VPSのIPアドレス
これでドメイン名が返ってくればOK。

・接続状況(信頼関係)確認※管理者

nltest /sc_verify:ドメイン名
nltest /dsgetdc:ドメイン名

・時刻関係※管理者

w32tm /config /syncfromflags:domhier /update
※DCから取得に変更

w32tm /query /status
ソースを確認

w32tm /resync
同期実行

・gpupdate・

※コンピュータのみ更新場合
gpupdate /target:computer /force

エラーが発生した場合
eventvwr>アプリケーションとサービスログ>Microsoft>Windows>GroupPolicy
で確認する。

・\\xxx.local\sysvolアクセス時、このファイルは他のコンピュータから取得したものです。とついてしまう場合。

Win+R>inetcpl.cpl>セキュリティ>信頼済みサイト

\\xxx.local
を登録する。

・ドメインコントローラーへのポートテスト
Test-NetConnection “xxx.local” -Port 389

・接続テスト(ユーザダイアログ表示させる)

Test-ComputerSecureChannel -Repair -Verbose -Credential (Get-Credential)
※ドメイン\ユーザー名で入力する

・端末パスワードの更新
Reset-ComputerMachinePassword -Credential (Get-Credential)
※Smaba-DC内では、ユーザーと、端末、それぞれパスワードが存在するが端末のパスワードは自動で管理されユーザーが意識する必要はない。

※接続がうまくいかない場合sysdm.cplから一度抜けて再度登録すると直ることが多い。

・Win11ユーザープロファイルの削除

テストしているとプロファイルが多くできてしまう。
sysdm.cpl>詳細設定>ユーザープロファイル>設定
ここで不要なプロファイルを削除できる。

メモ:コンテナエントリポイントを調べて
スクリプトを追加する方法

※この方法だとinit.sh後の処理ができないので不採用。

・エントリポイントのスクリプトを調べる
docker exec -it samba-dc bash
cat /proc/1/cmdline

・作成

vim setup.sh

#!/bin/sh
sed -i ‘s|xxx|xxx|’ /etc/samba/smb.conf
sed -i ‘s|xxx|xxx|’ /etc/ntpd.conf

docker-composeで呼び出す。

volumes:
– ./setup.sh:/setup.sh
command: sh -c “/setup.sh && exec /init.sh”

メモ:シンボリックリンク

バインドしているexternalに保存
上記と同じように、エントリスクリプト内でcpできないエラーになる。

#!/bin/sh
ln -sf /etc/samba/external/smb.conf /etc/samba/smb.conf
ln -sf /etc/samba/external/ntpd.conf /etc/ntpd.conf

※lnコマンド
ln -sf [実体] [リンク]

ls -laの見え方
ntpd.conf(リンク) -> /etc/samba/external/my_ntpd.conf(実体)

メモ:Docker Network

docker network ls

・基本
xxx bridge bridge local
xxx host host local
xxx none null local

・削除方法
docker network rm samba_default

・種類
bridge
host:portsの設定は意味ない
macvlan:VPSだと難しい

メモ:SambaTool(DNSレコード)

・DBチェック
docker exec -it samba-dc samba-tool dbcheck –cross-ncs –fix –username=administrator –password=xxx

・ADに登録されている端末取得
docker exec -it samba-dc samba-tool computer list
docker exec -it samba-dc samba-tool computer show xxx

・ADに登録されているユーザー/PCリスト取得
docker exec -it samba-dc samba-tool user list
docker exec -it samba-dc samba-tool computer list

・PC追加

docker exec -it samba-dc samba-tool computer create PCNAME –user=administrator –password=xxx

・ゾーン一覧取得
docker exec -it samba-dc samba-tool dns zonelist localhost –username=administrator –password=xxx

xxx.localと_msdcs.xxxlocalが返ってくる。

・xxx.localのレコード一覧取得
docker exec -it samba-dc samba-tool dns query localhost xxx.local @ ALL –username=administrator –password=xxx

・_msdcs.xxx.localのレコード一覧取得
docker exec -it samba-dc samba-tool dns query localhost _msdcs.xxx.local @ ALL –username=administrator –password=xxx

・下位レコード取得
docker exec -it samba-dc samba-tool dns query localhost _msdcs.xxx.local gc ALL –username=administrator –password=xxx

・Aレコード削除
docker exec samba-dc samba-tool dns delete localhost xxx.local samba-dc A 172.19.0.2 -UAdministrator%xxx

・Aレコード登録
docker exec samba-dc samba-tool dns add localhost xxx.local samba-dc A サーバーIPアドレス -UAdministrator%xxx

メモ:アクセス制御リスト(ACL)

docker exec -it samba-dc samba-tool ntacl sysvolreset –username=administrator –password=xxx

docker exec -it samba-dc samba-tool ntacl sysvolcheck –username=administrator –password=xxx

docker exec -it samba-dc supervisorctl restart samba

・ACL権限関連リセット

samba-tool ntacl sysvolreset
samba-tool ntacl sysvolcheck

GoogleWorkspace SPF/DKIM/DMARC

●SPF
ドメイン所有者がドメインからメールを送信することを許可するIPアドレスを
DNSのSPFレコードとして登録する。

タイプ:TXT
ホスト名:@
値:v=spf1 include:_spf.google.com ~all

●DKIM
送信サーバーが秘密鍵の電子署名を付与、
受信サーバーは送信元ドメインのDNSに公開鍵を問い合わせて署名を検証する。

管理コンソール>アプリ>Google Workspace>Gmail>メールの認証(DKIM)
新しいレコードを生成

タイプ:TXT
ホスト名:google._domainkey
値:v=DKIM1; k=rsa; p=●●●

●DMARC
ドメイン所有者がDMARCレコードをDNSに設定し、
認証に失敗したメールの扱いをポリシーとして指定する。

タイプ:TXT
ホスト名:_dmarc
値:v=DMARC1; p=none; rua=mailto:●●●

VPSで稼働しているサービス整理(XserverVPS)

安価なプランのIndigoVPSで色々なOSS運用していたが、1つにまとめることにした。今回はXserverVPS。すでにOSSは稼働状態なので、新しい環境と並行稼働してから切り替えることにした。

ssh

sudo vim /etc/ssh/sshd_config
Port
>9922

PasswordAuthentication
ChallengeResponseAuthentication
GSSAPIAuthentication
>no

sudo service ssh restart

ufw

※Xserverにもパケットフィルタがあるので要設定。

sudo vim /etc/default/ufw
>IPV6=no

sudo ufw allow from ●●●.●●●.●●●.●●● to any port 9922 proto tcp

sudo ufw enable
sudo ufw status

・メモ

削除
sudo ufw status numbered
sudo ufw delete [番号]

Docker

sudo apt update
sudo apt install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg –dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
“deb [arch=$(dpkg –print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo “$VERSION_CODENAME”) stable” | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

MySQL

このMySQLは外部接続用で単独で使用。
今までは直接インストールしていたが今回はDocker。

sudo mkdir project_management
cd project_management

sudo mkdir data
sudo chown -R 999:999 ./data
sudo chmod 700 ./data

sudo mkdir conf.d
sudo chown -R 999:999 ./conf.d
sudo chmod 700 ./conf.d

sudo vim docker-compose.yml

sudo docker compose up d

cd conf.d
sudo touch external.cnf
sudo chown 999:999 external.cnf
sudo chmod 644 external.cnf

sudo vim external.cnf
[mysqld]
bind-address = 0.0.0.0
require_secure_transport = ON

sudo docker restart production_management

sudo ufw allow from ●●●.●●●.●●●.●●● to any port 3306 proto tcp
※Xserverのパケットフィルタも要設定。

dataフォルダの
client-cert.pem
client-key.pem
ca.pem
をダウンロード。

・pfx作成

pass=$(head /dev/urandom | tr -dc a-km-np-z1-9 | head -c 13);openssl pkcs12 -export -inkey client-key.pem -in client-cert.pem -out client.pfx -passout pass:${pass};echo $pass;

メモ

コンテナ一覧
sudo docker ps

コンテナに入る
docker exec -it production_management bash

コンテナ再起動
sudo docker restart production_management

コンテナ削除
sudo docker rm -f production_management

MySQL設定ファイル
/etc/my.cnf

MySQL Workbench

Standard TCP/IPを選択。

・Parametersタブ
Hostname:IPアドレス
Port:3306
Username:DBユーザー
パスワード:DBパスワード

・SSLタブ
Use SSL:Require and Verify CA
SSL Key File:client-key.pem
SSL CERT File:client-cert.pem
SSL CA File:ca.pem
ダウンロードしたファイルを選択。登録後ファイルの移動はできない。

これでVPS上のDockerのMySQLに外部から接続することが可能。

MySQLバックアップ

cd /home/project_management
sudo mkdir backup
sudo chmod 700 backup

sudo vim backup.sh

weekday=date +%w
f=/home/project_management/backup/dump_${weekday}.sql
docker exec production_management mysqldump –single-transaction -u root -p●●● project_management > $f

sudo chmod 700 backup.sh

・cron

cd /etc/cron.d
sudo vim /etc/cron.d/mysql_backup

0 2 * * * root /home/project_management/backup.sh

sudo chmod 600 mysql_backup

sudo systemctl status cron

VLAN メモ

ステップ

入ってきたフレームは、フレーム本体、どのポートから来たのか、VIDを持っており、スイッチ内部で以下の処理される。

● 1. Ingress Rules(入力)

・1-1 Acceptable Types
・1-2 PVID
・1-3 Ingress Filtering(memberのみ利用して判断)

● 2. Forwarding Process(転送)

・2-1 MACテーブル
・2-2 MemberSet

● 3. Egress Rules(出口)

・3-1 MemberSet(2で絞られた結果という意味)
・3-2 UntaggedSet

MemberSet / UntaggedSet

これらはVLANごとのデータセット。(VLANデータセット)

Port

Member

Untagged

のような構造になっている。

・MemberSet
そのVLANのフレームを通すポート

・UntaggeedSet
そのVLANフレームをタグ無しで出すポートの集合

※分かりづらいのでVID、Portの複合キーのテーブルと考える。

VID

Port

Member

Untagged

Acceptable Types / PVID / Ingress Filtering

これらはポートをキーとしたデータセット。(PORTデータセット)

Port

Acceptable Types

PVID

Ingress Filtering

こちらも実態は表だが、ポートをキーとしている表なので、ポートに属しているイメージでOK

・Acceptable Types

タグなしタグあり、どちらを受け入れるかのパラメータ
admit all / tagged only / untagged and priority-tagged onlyなど

・PVID

VIDがついてないフレームの場合、VLAN番号をフレームに書き込む。

・Ingress Filtering

これがONなら、ここで初めてVLANデータセットのmember列のみ使う。
フレームが持っている、入ったきたポート、VIDがの値が、VLANデータセット上でのmemberの値でどうなっているか判断し、falseなら捨てる。

アクセス / トランクポート

アクセス / トランクポートはパラメータのプリセットと理解する。

・アクセス

IN/OUTにタグなし、VLAN指定は1つだけ。

・トランク

IN/OUTにタグあり、VLAN指定は複数指定できる。
(原則タグあり、ネイティブVLANだけタグなし)

・ネイティブVLAN

トランクポートに指示するもの。
自身が持つVLAN番号をフレームに書き込む(デフォルトではVLAN1)
※ネイティブVLAN=トランクポートにおけるPVIDの呼び名

パラメータプリセット

アクセス/トランクのプリセット定義

アクセス(port1.1) トランク(port1.2)
member=true の数 1つ(VLAN10のみ) 複数(VLAN1,10,20)
untagged=true の数 1つ(VLAN10) 1つ(VLAN1=ネイティブ)
Acceptable Types untagged only admit all
PVID 10(=そのアクセスVLAN) 1(=ネイティブVLAN)
Ingress Filtering 有効 有効

ポートキーの表(1枚だけ存在)

ポート Acceptable Types PVID Ingress Filtering
port1.1 untagged only 10 有効
port1.2 admit all 1 有効

VLANキーの表(VLANの数だけ存在)

VLAN 1

ポート member untagged
port1.1 false false
port1.2 true true

VLAN 10

ポート member untagged
port1.1 true true
port1.2 true false

VLAN 20

ポート member untagged
port1.1 false false
port1.2 true false