1. はじめに
古いPCに、FAISS と Dify を使用したRAG環境を構築します。NVIDIA GeForce などのグラフィックボードを搭載していないため、FAISS は最高性能ではありませんが、個人で使用するには十分です。LLM は、クラウドの OpenAI を使用します。
以前に書いた Docker Desktop、Dify のインストールの記事はこちら。
以前に書いた FAISS のインストールの記事はこちら。今回は NVIDIA ドライバをインストールしません。
RAG を実行するためのアプリケーションは他にもありますが、問い合わせ(テキスト)と登録した文書(テキスト)の、より正確なマッチングを行うために、単にコサイン類似度を計算したいので、FAISS を使用します。
文書の埋め込み(embedding)には、クラウドの OpenAI text-embedding-3-large を使用します。NVIDIA GeForce グラフィックボードを搭載した別のPCで、Alibaba qwen3-embedding-8b のようなローカルの embedding を使用することも可能です。
2. Xubuntu インストール
PC電源投入時、
起動メニュー F12キー
BIOS F2キー
デスクトップの使い易さのために Xubuntu を使用しています。日本語入力をセットアップしますが、画面は英語のままにしています。
xubuntu-26.04.1-desktop-amd64.iso
Rufus を使って起動 USB メモリを作成(DVD からだとアクセスが頻発して正常に動作しなかった)
PCの電源を入れて F12キーを押して USB から立ち上げる
デスクトップに表示される Install Xubuntu 26.04.1 LTS アイコンをダブルクリックして、PCへのインストールを開始
Language: English
Keyboard: Japanese
Connect to the internet: Connect to a Wi-Fi network ※ 先にメニューバーから接続しておく
An update is available for the installer: Update now ※ インストーラーを再開
Interactive installation
Xubuntu Desktop
Erase disk and install Xubuntu
Select drive: sda - 500GB SSD-PSTA/D BUFFALO
No encryption
Your name: webmaster
Your computer's name: noble34
Your username: webmaster
Password: ******
Confirm password: ******
Select your timezone: Asia/Tokyo
インストールが終わったら、USB メモリを外して起動
OS アップデート
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
再起動
SSH インストール
sudo apt update
sudo apt install openssh-server
外部から SSH で接続
ssh -l webmaster 192.168.1.41
password: ******
Xfce メニュー
メニューから Panel Profiles、Xfce 4.16、Apply Configuration ボタン押下
Application -> Settings -> Xfce Screensaver
60 minutes
Application -> Settings -> Language Support
追加のインストールのためにパスワードを入力
Install / Japanese、Password
但し、画面表示は英語のままで使用する
再起動
ログイン後、バー右上、右クリック、Preference -> Input Method -> Add
Japanese -> Mozc
Preference -> General -> Keyboard Shortcuts
<Super>space から <Control>space に変更、Apply ボタン
バー右上、左クリックで Input Mode を Direct input から Hiragana に変更
固定IP
Wifi 接続の場合は、メニューバー右上でマウス右クリック、Edit Connections から設定する
Address: 192.168.1.34
Netmask: 255.255.255.0
Gateway: 192.168.1.1
DNS: 999.999.99.99, 888.888.888.88 ※プロバイダから入手
再起動
よく使うコマンド
pwd
ls -alF
ip addr show
nano .env(矢印キーでカーソル移動、保存Ctrl+S、終了Ctrl+X)
sudo reboot
sudo shutdown -h now
画面キャプチャ PrtSc、範囲指定 Shift+PrtSc、アクティブウィンドウのみ Ctrl+PrtSc ※ Alt が機能しないため Settings - Keyboard - Application Shortcuts で Ctrl に変更
3. Docker Desktop
下記リンクの手順に従って、Ubuntu に Docker Desktop をインストールします。
https://docs.docker.com/engine/install/ubuntu/
1.Docker の APT レポジトリの設定
# Add Docker's official GPG key
# Add the repository to Apt sources
2.Docker パッケージのインストール
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
3.hello-world イメージの実行
sudo docker run hello-world
https://docs.docker.com/desktop/setup/install/linux/ubuntu/
sudo apt install gnome-terminal
docker-desktop-amd64.deb をダウンロード
sudo apt-get update
sudo apt install ./docker-desktop-amd64.deb
再起動
メニューから Development > Docker Desktop で起動。または systemctl --user start docker-desktop で起動
ユーザー登録は行わず、skip、skip で Docker Containers の画面が表示される
Docker Desktop のコンテナーのメモリ制限を、2GB(デフォルト)から4GBに変更する
Docker Desktop の自動起動
Docker Engine は、Xubuntu 標準のものと、Dify のためにインストールした Docker Desktop のものがあります。次のコマンドでどちらを使用しているか確認できます。
docker context ls
webmaster@noble01:~$ docker context ls
NAME DESCRIPTION DOCKER ENDPOINT ERROR
default Current DOCKER_HOST based configuration unix:///var/run/docker.sock
desktop-linux * Docker Desktop unix:///home/webmaster/.docker/desktop/docker.sock
Docker Desktop は、ユーザーがログインした後でないと起動できません。GUI で以下を設定します。
Settings、Session and Startup、Application Autostart
Add
Name: Docker Desktop
Comment: Docker Desktop 起動
Command: /opt/docker-desktop/bin/docker-desktop
Docker Desktop を起動すると、Dify のコンテナが自動的に起動します。
4. Dify
https://docs.dify.ai/getting-started/install-self-hosted/docker-compose
mkdir Repos
cd Repos
git clone --branch 1.18.0 https://github.com/langgenius/dify.git
cd dify/docker
cp .env.example .env
openssl rand -base64 32
表示されたキーを .env の DIFY_AGENT_LOCAL_SANDBOX_AUTH_TOKEN に記入する
nano .env
docker compose up -d
インストールが完了すると、Docker Desktop で実行中になる
ブラウザで http://192.168.1.34/install または http://localhost/install を表示
管理者アカウントの設定
Email address
Username
Password
ブラウザで http://192.168.1.34/signin または http://localhost/signin を表示
Email と Password でログイン
LLMモデルの設定
連携 - モデルプロバイダーをインストール
OpenAI
API Key:********
デフォルトのモデルは gpt-5.4-mini
従来との互換性のために gpt-4.1 を選択
HTTPS 化(手順はこちら)
ドメインを取得し、ホスト名を登録する
ルーターの80と443のポートフォワードを、このPCにする
自分のドメインでこのPCの http://localhost/ が表示されることを確認する
docker/.env の編集。.env に、説明にある赤字の項目を設定する
コマンドの実行(Docker Desktop が立ち上がっていること)
cd dify/docker
docker compose --profile certbot up --force-recreate -d
コンテナが作成された後に、
docker compose exec -it certbot /bin/sh /update-cert.sh
docker/.env の(再)編集。.env に以下を設定する
NGINX_HTTPS_ENABLED=true
コマンドの実行
docker compose --profile certbot up -d --no-deps --force-recreate nginx
外部から https://your_domain.com で見れることを確認する
SSL 証明書の更新
docker compose exec -it certbot /bin/sh /update-cert.sh
docker compose exec nginx nginx -s reload
5. FAISS
Anaconda
https://www.anaconda.com/download
ホームページでメールを登録すると、ダウンロードリンクが届きます
Linux、現在 Python 3.14.4
Anaconda3-2026.07-1-Linux-x86_64.sh
をダウンロード。home ディレクトリにファイルを移動
bash ~/Anaconda3-2026.07-1-Linux-x86_64.sh
./anaconda3/bin/conda init
次のターミナルの起動から、conda 環境(base)になります
FAISS 用に、Python のバージョンを 3.12 にします
conda create -n faiss python=3.12 -y
conda activate faiss
echo 'conda activate faiss' >> ~/.bashrc
解除は conda deactivate
ベクトルデータベース(faiss)のインストール
事前準備
sudo apt install unzip
faiss-cpu インストール
conda install -c pytorch -c conda-forge faiss-cpu=1.15.1
※ バージョンは FAISS のウェブページに表示されているもの
動作確認のために、faiss のページにある DOWNLOAD ZIP からプログラムコード一式をダウンロードします
unzip faiss-main.zip
cd faiss-main/tutorial/python
(faiss) webmaster@noble34:~/faiss-main/tutorial/python$ ls -1
1-Flat.py
10-FaissCuvsExample.ipynb
11-SVS.py
2-IVFFlat.py
3-IVFPQ.py
4-GPU.py
5-Multiple-GPUs.py
6-HNSW.py
7-PQFastScan.py
8-PQFastScanRefine.py
9-RefineComparison.py
python 1-Flat.py
True
100000
[[ 0 393 363 78]
[ 1 555 277 364]
[ 2 304 101 13]
[ 3 173 18 182]
[ 4 288 370 531]]
[[7.6293945e-06 7.1751785e+00 7.2076302e+00 7.2511673e+00]
[0.0000000e+00 6.3235664e+00 6.6845779e+00 6.7999382e+00]
[3.8146973e-06 5.7964020e+00 6.3917236e+00 7.2815170e+00]
[3.8146973e-06 7.2779007e+00 7.5279808e+00 7.6628418e+00]
[0.0000000e+00 6.7638016e+00 7.2951088e+00 7.3688126e+00]]
[[ 381 207 210 477]
[ 526 911 142 72]
[ 838 527 1290 425]
[ 196 184 164 359]
[ 526 377 120 425]]
[[ 9900 10500 9309 9831]
[11055 10895 10812 11321]
[11353 11103 10164 9787]
[10571 10664 10632 9638]
[ 9628 9554 10036 9582]]
python 2-IVFFlat.py
[[ 9900 9309 9810 10048]
[11055 10895 10812 11321]
[11353 10164 9787 10719]
[10571 10664 10632 10203]
[ 9628 9554 9582 10304]]
[[ 9900 10500 9309 9831]
[11055 10895 10812 11321]
[11353 11103 10164 9787]
[10571 10664 10632 9638]
[ 9628 9554 10036 9582]]
python 3-IVFPQ.py
[[ 0 78 424 608]
[ 1 555 1063 380]
[ 2 179 304 33]
[ 3 265 527 139]
[ 4 288 531 827]]
[[1.5948839 6.2905183 6.3059173 6.5697308]
[1.282814 5.9320083 5.9512424 6.5773916]
[1.698801 6.1244454 6.2004113 6.401427 ]
[1.82021 6.721145 6.8056335 6.995647 ]
[1.4857421 5.8346977 6.303232 6.400938 ]]
[[ 8746 9380 10914 9842]
[10913 11373 9014 10507]
[10719 11291 10600 11353]
[11578 9671 10709 10664]
[ 9229 9878 9905 9459]]
PostgreSQL インストール
sudo apt update
sudo apt install postgresql postgresql-contrib
psql --version
sudo -i -u postgres
psql
postgres=#
CREATE USER admin WITH PASSWORD 'mypassword' SUPERUSER;
CREATE USER webmaster WITH PASSWORD 'mypassword';
CREATE DATABASE webmaster OWNER webmaster;
\q
で抜ける
exit
で postgres ユーザーを抜ける
psql -U webmaster -d webmaster -h localhost
CREATE TABLE knowledge_documents (
id UUID PRIMARY KEY,
knowledge_id TEXT NOT NULL,
content TEXT NOT NULL,
title TEXT NOT NULL,
metadata JSONB,
created_at TIMESTAMP DEFAULT now()
);
\q
で抜ける
\d knowledge_documents (テーブル一覧)
\l (データベース一覧)
\c (現在接続しているデータベース)
SELECT * FROM knowledge_documents;
TRUNCATE TABLE knowledge_documents;
faiss_service の作成
次のように作成します。
| 項目 | ツール |
|---|---|
| 文書データベース | PostgreSQL |
| ベクトルデータベース・検索 | faiss-cpu |
| 埋め込み(Embeddings) | OpenAI API(text-embedding-3-small) ナレッジIDを指定して切り替え可能 |
| ウェブサーバー | Python Flask |
# 一旦、通常の Ubuntu 環境に戻す
conda deactivate
sudo apt update
sudo apt install -y build-essential libpq-dev python3-dev
# conda 環境で実行
conda activate faiss
pip install flask psycopg2 openai flasgger ollama
mkdir faiss_service
cd faiss_service
nano faiss_service.py
[faiss_service.py を他のPCからコピーして入手]
LangChain を使用したチャンク分割(upload_files_chunk)は行わないこととし、upload_files_chunk の部分を削除します。また、LangChain の API_KEY も設定しません。
faiss_gpu から faiss_cpu への変更
# 変更前
res = faiss.StandardGpuResources() # use a single GPU
gpu_index = faiss.index_cpu_to_gpu(res, 0, index)
index = faiss.index_gpu_to_cpu(gpu_indexes[knowledge_id])
# 変更後
#res = faiss.StandardGpuResources() # コメントアウトまたは削除
gpu_index = index # 3か所
index = gpu_indexes[knowledge_id] # 1か所
export PSQL_DB_PASSWORD="..."
export OPENAI_API_KEY="..."
python faiss_service.py
ウェブページを表示
http://192.168.1.34:8000/apidocs/
コンテンツエディター
登録済みのコンテンツ(テキスト)を確認・編集するためのウェブページを作成します。[保存して更新]ボタンを押下すると、faiss_service の delete と add を呼び出します(Faiss を使用しているため、登録済みの内容は変更ではなく、再登録します)。
pip install requests
mkdir content_editor
cd content_editor
nano app.py
[app.py を他のPCからコピーして入手]
mkdir templates
nano templates/index.html
nano templates/edit.html
[index.html と edit.html を他のPCからコピーして入手]
[ 実行 ]
export PSQL_DB_PASSWORD="******"
python app.py
[ 表示 ]
http://localhost:5000/
または、
http://192.168.1.34:5000/
(他のPCからIPアドレスを指定)
Ubuntu 起動時に Python プログラムを実行する
参考ページ1:
https://udemy.benesse.co.jp/development/system/shellscript.html
cd ~
nano py_app_service.sh
export PSQL_DB_PASSWORD="..."
export OPENAI_API_KEY="..."
/home/webmaster/anaconda3/envs/faiss/bin/python /home/webmaster/faiss_service/faiss_service.py &
/home/webmaster/anaconda3/envs/faiss/bin/python /home/webmaster/content_editor/app.py &
wait
chmod 744 py_app_service.sh
bash py_app_service.sh
参考ページ2:
https://note.com/ipa713/n/ndf1b4941362d
cd /etc/systemd/system
sudo nano run_python.service
[Unit]
Description=python run
After=network.target
[Service]
Type=simple
User=webmaster
WorkingDirectory=/home/webmaster/faiss_service
ExecStart=/bin/bash /home/webmaster/py_app_service.sh
Restart=on-failure
KillMode=control-group
[Install]
WantedBy=multi-user.target
※ データファイルを読み込むため、ワーキングディレクトリを faiss_service に設定する
sudo systemctl daemon-reload
sudo systemctl enable run_python.service
sudo systemctl start run_python.service
sudo systemctl status run_python.service
sudo systemctl stop run_python.service
多数のファイルを一度に登録する
faiss_service の画面では、最大20個のファイルを手動で指定し、登録できるようにしています。実際は、別に Python プログラムを作成し、テキストファイル(input.txt)に記述したファイル一覧をもとに、一括登録できるようにしています。input.txt の1行目には、すべてのファイルに共通するナレッジIDを記入し、2行目以降には登録するファイル名を記述します。プログラムは faiss_service.py の upload_files をもとに作成しいますが、ここでは内容を割愛します。
ファイル一覧の作成:
ls *.txt > input.txt
nano input.txt
1行目にナレッジIDを記入
2行目以降はファイル名
python upload_files.py
Dify と FAISS を接続
Dify で外部ナレッジベースの設定を行って、faiss_service に接続します。
ナレッジ
「外部ナレッジベースと連携 →」
外部ナレッジベース連携APIを追加
API Key は未使用なので ABCdef など
外部ナレッジベース名: ローカルRAG
外部ナレッジベースID: AAA-BBB-CCC
「連携 →」ボタン押下
事前準備(以前からの修正)
従来は Dify 1.13.0 を使用していましたが、1.18.0 に変更したところ、以下の対応が必要でした。
SSRF プロキシ対応
cd dify/docker
nano .env
変更前:
SSRF_PROXY_ALLOW_PRIVATE_IPS=
変更後:
SSRF_PROXY_ALLOW_PRIVATE_IPS=192.168.1.34
設定の反映
docker compose up -d --force-recreate ssrf_proxy
確認
docker exec docker-ssrf_proxy-1 \
cat /etc/squid/dify_allow_private.conf
faiss_service.py、retrieval のレスポンスにおける score の型変換
変更前:
records.append({
"score": score
変更後:
records.append({
"score": float(score)
6. その他
□ ファイアウォール
sudo ufw enable
sudo ufw allow 'Nginx Full'
sudo ufw allow OpenSSH
sudo ufw reload
sudo ufw status
sudo ufw status numbered
sudo ufw delete 3
□ ブルートフォース攻撃対策
sudo apt update
sudo apt install fail2ban
sudo nano /etc/fail2ban/jail.d/sshd.local
[sshd]
enabled = true
backend = systemd
port = ssh
filter = sshd
maxretry = 5
findtime = 600
bantime = 86400
10分間に5回以上SSH認証に失敗したIPアドレスを、24時間遮断する設定になる
sudo systemctl enable --now fail2ban
sudo systemctl restart fail2ban
sudo systemctl status fail2ban
以上、
