サーバー環境構築
概要
このページでは、nizika_ai_service を Ubuntu 26.04 LTS 上で稼働させるための環境構築手順を記載する。
本リポジトリは単独では完結せず、主に以下と連携する。
nizika_ainizika_nico- MySQL
- OpenAI API
本番環境では systemd により常駐させる。
今回の構成例:
OS: Ubuntu 26.04 LTS
Python: 3.14
MySQL: 8.4 系
/opt/nizika-ai-service
/opt/nizika-nico
1. セキュリティ方針
サーバー侵害後の復旧や、新しいサーバーへの移行では、旧ホストから以下をそのままコピーしない。
- API key
- DB password
- systemd unit
- cron
- hook
- SSH private key
- Python cache
- 信頼できない実行ファイル
- 秘密情報入り設定ファイル
ソースコードは信頼できる Gitea の最新 main から取得する。
DB password、OpenAI API key 等は新規発行する。
アプリケーションから MySQL の root user は使用しない。
2. service user
専用 user を作成する。
useradd --system \
--home /var/lib/nizika-ai \
--create-home \
--shell /usr/sbin/nologin \
nizika-ai
確認:
id nizika-ai
3. repository
Gitea から最新 main を取得し、
/opt/nizika-ai-service
へ配置する。
nizika_nico は、
/opt/nizika-nico
へ配置する。
旧サーバーの working tree をそのままコピーするのではなく、信頼できる Git repository から再取得する。
4. Python package
この環境では venv を使用せず、system Python を使用する。
pip install 前に必ず:
umask 022
export HOME=/root
を実行する。
umask 077 のまま pip install すると、
/usr/local/lib/python3.14/dist-packages
配下が root のみ読み取り可能になり、service user から Python package が正常に import できなくなることがある。
必要 package:
python3 -m pip install \
--break-system-packages \
'eloquent==0.5' \
'mysqlclient==2.2.8' \
'openai==1.43.0' \
'httpx[http2]==0.27.2' \
'requests==2.32.5' \
simplejson
OpenAI / HTTPX
この環境では:
openai==1.43.0
httpx==0.27.2
を使用する。
OpenAI 1.43.0 は HTTPX 0.28 系と互換性問題があるため、HTTPX は 0.27.2 に固定する。
5. Python package の権限確認
service user から import できない場合:
find /usr/local/lib/python3.14/dist-packages \
-type d ! -perm -005 -o -type f ! -perm -004 \
-print \
| head -100
過去に誤った umask で package が配置されていた場合:
chmod -R a+rX \
/usr/local/lib/python3.14/dist-packages
6. MySQL
nizika_ai DB 用に専用 user を作成する。
例:
CREATE USER 'nizika_ai_app'@'localhost'
IDENTIFIED BY 'NEW_RANDOM_PASSWORD';
GRANT ALL PRIVILEGES
ON nizika_ai.*
TO 'nizika_ai_app'@'localhost';
nizika_nico DB についても別 user を使用する。
例:
CREATE USER 'nizika_nico_app'@'localhost'
IDENTIFIED BY 'ANOTHER_NEW_RANDOM_PASSWORD';
GRANT ALL PRIVILEGES
ON nizika_nico.*
TO 'nizika_nico_app'@'localhost';
DB は信頼できる dump から復元する。
確認:
mysql -u nizika_ai_app -p \
-e 'USE nizika_ai; SHOW TABLES;'
mysql -u nizika_nico_app -p \
-e 'USE nizika_nico; SHOW TABLES;'
7. environment variable
秘密情報は Git repository や systemd unit に直接書かない。
以下を作成する。
/etc/nizika-ai-service.env
内容:
NIZIKA_AI_MYSQL_USER=...
NIZIKA_AI_MYSQL_PASS=...
NIZIKA_NICO_MYSQL_USER=...
NIZIKA_NICO_MYSQL_PASS=...
NIZIKA_NICO_DIR=/opt/nizika-nico
OPENAI_API_KEY=...
OPENAI_ORGANISATION=...
権限:
chown root:root /etc/nizika-ai-service.env
chmod 600 /etc/nizika-ai-service.env
8. OpenAI credential
OpenAI credential は source code に直書きしない。
例:
import os
OPENAI_ORGANISATION: str = os.environ['OPENAI_ORGANISATION']
OPENAI_API_KEY: str = os.environ['OPENAI_API_KEY']
DB credential も environment variable から取得する。
9. foreground test
systemd 化する前に foreground で起動確認する。
cd /opt/nizika-ai-service
set -a
. /etc/nizika-ai-service.env
set +a
runuser -u nizika-ai \
--preserve-environment \
-- \
python3 /opt/nizika-ai-service/main.py
正常に起動することを確認する。
10. systemd
以下を作成する。
/etc/systemd/system/nizika-ai-service.service
内容:
[Unit]
Description=Nizika AI Service
After=network-online.target mysql.service
Wants=network-online.target mysql.service
[Service]
Type=simple
User=nizika-ai
Group=nizika-ai
WorkingDirectory=/opt/nizika-ai-service
EnvironmentFile=/etc/nizika-ai-service.env
ExecStart=/usr/bin/python3 /opt/nizika-ai-service/main.py
Restart=always
RestartSec=2
[Install]
WantedBy=multi-user.target
反映:
systemctl daemon-reload
systemctl enable \
nizika-ai-service.service
systemctl start \
nizika-ai-service.service
確認:
systemctl --no-pager --full status \
nizika-ai-service.service
ログ:
journalctl \
-u nizika-ai-service.service \
-n 100 \
--no-pager
11. reboot 後の自動起動
確認:
systemctl is-enabled \
nizika-ai-service.service
期待:
enabled
再起動後:
systemctl is-active \
nizika-ai-service.service
期待:
active
12. 関連リポジトリ
nizika_ai
AI 関連の共通 code を提供する。
DB credential と OpenAI credential は environment variable 経由で利用する。
nizika_nico
ニコニコ関連の共通処理や DB を利用する。
パス:
/opt/nizika-nico
environment variable:
NIZIKA_NICO_DIR=/opt/nizika-nico
nizika_ai_service から nizika_nico 内の script が子プロセスとして起動される場合がある。