LinuxServer?

なぜ pukiwiki から wiki.js へ移行しようと思ったか 1

  1. コメントの受け付けしたい
  2. スパムがやだ
  3. 過去にストーカー被害にあったこともあり、特定のユーザーを拒否できる仕組みを実装したい
  4. ユーザーが、ユーザー自身を登録できる wiki が良いなぁ。。。 -> wiki.js となりました。

なぜ pukiwiki から wiki.js へ移行しようと思ったか 2

  • 自分、 markdown 言語が大好きだから。
  • 正直、書いてると落ち着きます。。。

公式リンク(top)

Editor - Markdown

Editor - MarkDown(日本語)

前提

環境

他に検討したもの

  • Growi -> mongodbにおいて CPUは avx に対応したものが必要らしく、
    うちのサーバのCPUでは対応してませんでした。。。(2009年製のホストがいるので。。。)
    まぁしようがないですね(^^;)
  • wikiを比較する際は、以下のサイトを参考にしました。

構築

構築コマンド

  • [(参考サイト) wiki.js(lxc) Proxmox VE Helper-Scripts](https://community-scripts.github.io/ProxmoxVE/scripts?id=wikijs)
  • どれかのホストで以下のコマンドを実行
  • インストール時、色々聞かれるようにカスタムインストールを選択した方が良いと思います。
    sudo su -
    bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/wikijs.sh)"

MariaDBへ切り替え

なぜ?

  • 以下に「メディア資産管理」の項目を書くのですが、作ったフォルダを消せないらしく、
    データベースを直にいじるので、使い慣れている MariaDB(MySQL) にしました。

参考サイト

MariaDB のインストールと自動起動設定,起動

sudo apt install mariadb-server
sudo apt start mariadb
sudo apt enable mariadb

初期設定

sudo mysql_secure_installation
  • 概要
  1. Unix_Socket 認証に切り替えるか否か
    [no] でも root のみ デフォルトで Unix_Socket 認証は有効
    Switch to unix_socket authentication [Y/n] n
  2. MariaDB root パスワードを設定するか否か MariaDBへ root パスワードでもログインできるようになる。
    不要と言えば不要なんだけど、自分はバックアップの設定もあるのでYesにした。
    Change the root password? [Y/n] y~
  3. 匿名ユーザーは削除する
    Remove anonymous users? [Y/n] y
  4. root のリモートログインは無効とする
    Disallow root login remotely? [Y/n] y
  5. テストデータベースは削除する
    Remove test database and access to it? [Y/n] y
  6. 特権情報をリロードする
    Reload privilege tables now? [Y/n] y
  7. インストール完了

(MariaDB) wiki.js用ユーザーの作成とデータベースの作成

  1. root ユーザーでログイン
    mysql
  2. データベースの作成
    create database wikijs;
  3. 権限の設定とパスワードの設定
    grant all privileges on wikijs.* to wikijs@'localhost' identified by 'password'; 
  4. 権限の更新
    flush privileges; 
  5. MariaDBから出る。
    exit

wiki.js の変更

  • できるだけ元の設定は残しておいた方が良いかもです。
    行頭に「#」を付けるとコメント・アウトになります。
    sudo vi /opt/wikijs/config.yml
db:
type: mariadb

# PostgreSQL / MySQL / MariaDB / MS SQL Server only:
host: localhost
port: 3306
user: wikijs
pass: password
db: wikijs
ssl: false

backup

こちらを参照(mysql):/310-Linux/313-LinuxServer/mysql

設定変更

config.yml の場所,Path

  • ``/opt/wikijs/config.yml``
  • システム情報で確認できます。
    • ![wikijs-0+png](/310-linux/313-linuxserver/wikijs/wikijs-0+png)

SSL(TLS)化

  1. key と crt は適当なディレクトリへ保存
    (自分はLet's Encryptは使ってません。有償の証明書を持ってるため)
  • 中間証明書は要らないのかな?この辺、良くわかってないです。でも動いてるから良いのかな?
  • ssl の port は 3443 にしています。
    sudo vi /opt/wikijs/config.yml
# ---------------------------------------------------------------------
# SSL/TLS Settings
# ---------------------------------------------------------------------
# Consider using a reverse proxy (e.g. nginx) if you require more
# advanced options than those provided below.

ssl:
#enabled: false
enabled: true
port: 3443

# Provider to use, possible values: custom, letsencrypt
provider: custom
#provider: letsencrypt

# ++++++ For custom only ++++++
# Certificate format, either 'pem' or 'pfx':
format: pem
# Using PEM format:
# key
key: /etc/pki/tls/certs/server.key
# 証明書
cert: /etc/pki/tls/certs/server.crt
# Using PFX format:
#pfx: path/to/cert.pfx
# Passphrase when using encrypted PEM / PFX keys (default: null):
passphrase: null
# Diffie Hellman parameters, with key length being greater or equal
# to 1024 bits (default: null):
dhparam: null

# ++++++ For letsencrypt only ++++++
domain: wikijp.tar3.net
subscriberEmail: hogehoge@unyaunya.net

dataPAth: の変更

  • なんか容量食うと嫌なので普通にファイルサーバのPathを指定しました。
    dataPath: /mnt/hogehoge/data/unya/wikijs
  • config.yml の変更は以上です。大したことないですね(^^)

faviconの変更

  1. favicon.ico
    • path
      • /opt/wikijs/assets/favicon.ico
    • 画像解像度
      • 48 x 48
  2. favicons ディレクトリ
    • path
      • /opt/wikijs/assets/favicons/
        ファイル名解像度
        android-chrome-192x192.png192 x 192
        android-chrome-256x256.png256 x 256
        apple-touch-icon.png180 x 180
        favicon-16x16.png16 x 16
        favicon-32x32.png32 x 32
        mstile-150x150.png150 x 150
        {.dense}

Web画面からの設定変更

全般設定

  • サイトのURL
  • サイトのタイトル
  • ロゴURL

言語

  • 日本語

ナビゲーション

  • サイトツリー

グループ

  • registerdUsers を追加。どなたかが新規にアカウントを作った時用

アナリティクス

  • google analytics を設定
    • Tracking ID の確認方法
    • Google Analytics -> 左側「データの収集と修正」 -> 「データストリーム」
      • 対象のアカウントをクリック
      • 「測定ID」が Tracking ID です。

セキュリティ

  • アップロード
    • 最大アップロードサイズ
      104857600
    • 1回あたりの最大ファイル数
      50

記事の作成関連

markdown

User's manual(公式)

書式の設定方法(参考サイト)

  • 参考サイト1: Wiki hina.dev
    • 太字
    • イタリック
    • 取り消し線
    • 見出し
    • 下付き文字
    • 上付き文字
    • ブロック引用
    • 順序つきリスト
    • 順序無しリスト
    • タスクリスト
    • インラインコード
    • コードブロック
    • 水平線
    • 画像
    • リンク
    • キーボードキー

designet(参考サイト)

ブロッククォート(箇条書きと組み合わせない場合、使用可能です)
> スタイルなし eee

> .is-info aaa
{.is-info}

> .is-succsess bbb
{.is-success}

> .is-warning ccc
{.is-warning}

> .is-danger ddd
{.is-danger}
> スタイルなし eee

> .is-info aaa
{.is-info}

> .is-succsess bbb
{.is-success}

> .is-warning ccc
{.is-warning}

> .is-danger ddd
{.is-danger}
脚注
This sentence[^1] needs a few footnotes.[^2]

[^1]: A string of syntactic words.
[^2]: A useful example sentence.
This sentence[^1] needs a few footnotes.[^2]
[^1]: A string of syntactic words.
[^2]: A useful example sentence.
キーボード,<kbd></kbd>
<kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>o</kbd>
tabset
### タブ {.tabset}
#### タブ aaa
タブの記事
#### タブ bbb
タブの記事2
### タブ {.tabset}
#### タブ aaa
タブの記事
#### タブ bbb
タブの記事2

メディア資産(画像など)の管理

  • 以下のような感じの所ですね。 ![wikijs-gazo-kanri-0+png](/930-other/wikijs-gazo-kanri-0+png)

    **注意** データベースをいじることは非常に大きなリスクです(データを壊してしまう可能性があります)。 以下の内容におけるトラブルに関し、当方では一切の責任は負いかねますのでご注意下さい。 また作業前には必ずデータベースのバックアップを取る事をおすすめします。 [バックアップはこちらを参照(mysql)](/310-Linux/313-LinuxServer/mysql#mysql-server-backup) {.is-warning}

前提条件

  • データベースはMariaDBです。
  • /opt/wikijs/config.yml の dataPath
    /mnt/hoge/munya/wikijs

関連情報は3つ

  1. データベース(MariaDB)
    1. assets
    2. assetFolders
  2. dataPath
    1. /mnt/hoge/munya/wikijs/imagedirectorya/imagedirectoryb/testimage.png

table の desc 情報

  1. assets
    FieldTypeNullKeyDefaultExtra
    ----------------------------------------------------------------------------------------
    idint(10) unsignedNOPRINULLauto_increment
    filenamevarchar(255)NONULL
    hashvarchar(255)NONULL
    extvarchar(255)NONULL
    kindenum('binary','image')NObinary
    mimevarchar(255)NOapplication/octet-stream
    fileSizeint(10) unsignedYESNULL
    metadatalongtextYESNULL
    createdAtvarchar(255)NONULL
    updatedAtvarchar(255)NONULL
    folderIdint(10) unsignedYESMULNULL
    authorIdint(10) unsignedYESMULNULL
    {.dense}
  2. assetFolders
    FieldTypeNullKeyDefaultExtra
    ----------------------------------------------------------------
    idint(10) unsignedNOPRINULLauto_increment
    namevarchar(255)NONULL
    slugvarchar(255)NONULL
    parentIdint(10) unsignedYESMULNULL
    {.dense}

概要

  1. assets が画像情報の格納先です。
    • folderID で assetFolders へ正規化されています。
      ここで紐づけられたフォルダに画像が入っている必要があります。
  2. assetFolders は、親フォルダ名を持ってるだけで一般的な基準情報ですね。
    • フォルダ名はここで決まります。

場面ごとの変更方法(MariaDBでの変更方法)

  • さて、実際どのように情報を変えていくかを記載していきます。
  • wikiの画像参照リンクの変更も必要です。

共通

  • MariaDBへのログインとデータベースの変更
    (wikijsのMariaDBのあるサーバで実行)
    sudo mysql
use wikijs
  • assets と assetFolders のデータを確認
    SELECT * FROM assets;
    SELECT * FROM assetFolders;

メディア資産で表示されるフォルダ名の変更

  • id は上記の「SELECT * FROM assetFolders;」で表示された対象の「id」を指定

    WHERE 句を入れないと全部のフォルダー名が一律に変わってしまいます! このミスは慣れた頃に起きるのと、結構データベースに精通した(10年選手)でもたまにやらかします。 データベースのバックアップは重要です。 {.is-warning}

    UPDATE assetFolders SET name='imagedirectoryc', slug='imagedirectoryc' WHERE id=2;

メディア資産で表示されるフォルダ名の削除

  • 消す前に以下はやりましょう~。(要は以下の「[メディア資産で...移動](/310-Linux/313-LinuxServer/wiki#%E3%83%A1%E3%83%87%E3%82%A3%E3%82%A2%E8%B3%87%E7%94%A3%E3%81%A7%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%82%8B%E7%94%BB%E5%83%8F%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E7%A7%BB%E5%8B%95)」を参照)
    1. データベース情報の変更
    2. サーバの物理Pathから別のフォルダへ画像を移動(mv コマンド)
    3. フォルダ内にある画像のリンク元の変更(``![test.png](.....test.png)``)
    • id は消すフォルダのid(SELECT * FROM assetFolders のid)
      DELETE FROM assetFolders WHERE id=2;

メディア資産で表示される画像ファイルのフォルダ移動

  1. 正直、これは画像を再アップロードした方が早いかもしんないw
  2. WHERE の後ろのIDは、対象の画像ファイルのid
    folderIdは上記「SELECT * FROM assetFolders;」の結果から変更したい(ターゲット)フォルダーIDを入力
    update assets SET folderId=35 WHERE id>=24 and id<=36;
  3. Linuxサーバ上のファイルを移動
    • 例) imagedirectory<span style='color:red;'>**b**</span> -> imagedirectory<span style='color:red;'>**c**</span>
      mv /mnt/hoge/munya/wikijs/imagedirectorya/imagedirectoryb/testimage.png /mnt/hoge/munya/wikijs/imagedirectorya/imagedirectoryc/testimage.png
  4. イメージリンクを変更
    • 前(例) imagedirectory<span style='color:red;'>**b**</span> -> imagedirectory<span style='color:red;'>**c**</span>
      ![testimage.png](/imagedirectorya/imagedirectoryb/testimage.png)
    • 後(例)
      ![testimage.png](/imagedirectorya/imagedirectoryc/testimage.png)

Microsoft Visual Studio Code(vscode)を使用

おすすめ拡張機能

  1. Markdown Preview Enhanced
  2. Markdown All in One

使い方(Markdown Preview Enhanced)

使い方(Markdown All in One)

  • 特に特別な事は無いんですが、<kbd>Shift</kbd> + <kbd>Enter</kbd>の挙動がちょっといまいちなので、以下の通り変更しました。
  • 変更前
    • <kbd>Shift</kbd> + <kbd>Enter</kbd>で改行できない時がある。
  • 変更後
    • 基本的に<kbd>Shift</kbd> + <kbd>Enter</kbd>で改行できるようにしました
  • 変更方法
    • 「ファイル」 -> 「ユーザー設定」->「キーボードショートカット」
    • 「markdown.extension.onShiftEnterKey」で検索
    • 右クリック「When 式を変更」
    • 以下としました
      editorTextFocus && !editorHasMultipleSelections && !editorReadonly && editorLangId =~ /^markdown$|^rmd$|^quarto$/ || editorTextFocus && !editorHasMultipleSelections && !editorReadonly && !markdown.extension.editor.cursor.inFencedCodeBlock && !markdown.extension.editor.cursor.inMathEnv && !suggestWidgetVisible && editorLangId =~ /^markdown$|^rmd$|^quarto$/
    • 残したのは以下
      • エディターにフォーカス
      • 複数選択してない
      • エディターは読み取り専用ではない
      • エディターの言語は markdown である
      • マルチプルセレクションではない(すみません、これ良く分かってないですw)
      • markdown拡張機能のエディターカーソルがCodeBlockでない場合![wikijs-vscode-seikihyougen-0+png](/310-linux/310-linux/313-linuxserver/wikijs/wikijs-vscode-seikihyougen-0+png)
        (なのですが、CodeBlock内でも<kbd>Shift</kbd> + <kbd>Enter</kbd>効くようになってます)
      • カーソルが MathEnv でないとき
      • あとは等々

vscode 共通機能の設定についてはこちら

  • [vscode:設定](/510-program/vscode/vscode#%E8%A8%AD%E5%AE%9A)

(vscode) 目次の作成方法

  • wiki.jsは左側のサマリが見出し2までしか表示できないです。
    	個人的にはこれがかなりネックだったのですが、目次を作る事によってちょっとは緩和できるかも。。。
  1. 目次を作成したい個所にカーソルを移動
  2. vscode上で<kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>p</kbd> を押す。
  3. ``TOC``で検索。
  4. ``Markdown All in One; 目次(TOC)の作成``を選択
  5. 目次が挿入される。

Log (ログ) の出力,確認

rsyslog のインストール

sudo apt install rsyslog

daemonの実行と再起動時の自動実行設定

``` sudo systemctl start rsyslog sudo systemctl enable rsyslog ```

log の確認

``` cat /var/log/syslog ```

  • こんな感じの結果が出力されます。

    2025-06-05T20:55:5+783155+09:00 wikijs node[638]: 2025-06-05T11:55:49.084Z [JOB] #033[32minfo#033[39m: Using database driver mysql2 for mariadb [ OK ]

    2025-06-05T20:56:03.162381+09:00 wikijs node[638]: 2025-06-05T11:56:03.161Z [JOB] #033[32minfo#033[39m: Rendering page ID 1: [ COMPLETED ]

    2025-06-05T20:56:03.180948+09:00 wikijs node[158]: 2025-06-05T11:56:03.180Z [MASTER] #033[32minfo#033[39m: (STORAGE/DISK) Updating file [ja] home...

新規ユーザーや新規コメントの確認

  • 結局、上記のログでは新規ユーザーや新規コメントが確認できなかったので、
    	MariaDBから直に出力することにしました。
  • ユーザーが増えたかどうか
    	```
    	SELECT id,email,name,timezone,createdAt,updatedAt,lastLoginAt FROM users
    	```
  • コメントがあったかどうか
    	```
    	SELECT * FROM comments
    	```

elasticsearchの導入

  • 普通にインストールしただけでは中身の検索ができないんですね。。。(T_T)

install

  1. レポジトリの追加
    	```
    	sudo wget https://artifacts.elastic.co/GPG-KEY-elasticsearch -O /etc/apt/keyrings/GPG-KEY-elasticsearch.key
    	sudo su -
    	echo "deb [signed-by=/etc/apt/keyrings/GPG-KEY-elasticsearch.key] https://artifacts.elastic.co/packages/8.x/apt stable main" | tee /etc/apt/sources.list.d/elastic-8.x.list 
    	```
  2. install
    	```
    	sudo apt update
    	sudo apt install apt-transport-https
    	sudo apt -y install elasticsearch
    	```
    	- 以下に表示されているパスワードをメモする
    		```
    		The generated password for the elastic built-in superuser is :
    		```
    	- アナライザ トークナイザ、「analysis-kuromoji」のインストール
    		```
    		sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-kuromoji
    		```

設定

メモリ関連の設定

``` sudo vim /etc/elasticsearch/jvm.options ```

  • 以下を追加(値は各自のサーバ状況に合わせて下さい)
    	```
    	################################################################
    	## IMPORTANT: JVM heap size
    	################################################################
    	##
    	## The heap size is automatically configured by Elasticsearch
    	## based on the available memory in your system and the roles
    	## each node is configured to fulfill. If specifying heap is
    	## required, it should be done through a file in jvm.options.d,
    	## which should be named with .options suffix, and the min and
    	## max should be set to the same value. For example, to set the
    	## heap to 4 GB, create a new file in the jvm.options.d
    	## directory containing these lines:
    	##
    	## -Xms4g
    	## -Xmx4g
    	##
    	## See https://www.elastic.co/guide/en/elasticsearch/reference/8.17/heap-size.html
    	## for more information
    	##
    	################################################################
	-Xms512m
	-Xmx512m
	```
  • sslの無効化
    	- このファイル、どういうわけだかとても壊れやすいです。。。
    	なので最初にバックアップを取ります。
    	というか、NextCloudの方とも合わせて、ymlファイルが壊れていて動かないのか、
    	設定が間違えているのか区別が付かず、検証がちゃんと行えてません。
    	なんかわからんけど動かない、なんかわからんけど動いた、って時が多すぎ。。。
    	```
    	sudo cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.bak
    	```
    	
    	```
    	sudo vim /etc/elasticsearch/elasticsearch.yml
    	```
	```
	# ======================== Elasticsearch Configuration =========================
	#
	# NOTE: Elasticsearch comes with reasonable defaults for most settings.
	#       Before you set out to tweak and tune the configuration, make sure you
	#       understand what are you trying to accomplish and the consequences.
	#
	# The primary way of configuring a node is via this file. This template lists
	# the most important settings you may want to configure for a production cluster.
	#
	# Please consult the documentation for further information on configuration options:
	# https://www.elastic.co/guide/en/elasticsearch/reference/index.html
	#
	# ---------------------------------- Cluster -----------------------------------
	#
	# Use a descriptive name for your cluster:
	#
	#cluster.name: my-application
	 cluster.name: wikijs
	#
	# ------------------------------------ Node ------------------------------------
	#
	# Use a descriptive name for the node:
	#
	#node.name: node-1
	#
	# Add custom attributes to the node:
	#
	#node.attr.rack: r1
	#
	# ----------------------------------- Paths ------------------------------------
	#
	# Path to directory where to store the data (separate multiple locations by comma):
	#
	path.data: /var/lib/elasticsearch
	#
	# Path to log files:
	#
	path.logs: /var/log/elasticsearch
	#
	# ----------------------------------- Memory -----------------------------------
	#
	# Lock the memory on startup:
	#
	#bootstrap.memory_lock: true
	#
	# Make sure that the heap size is set to about half the memory available
	# on the system and that the owner of the process is allowed to use this
	# limit.
	#
	# Elasticsearch performs poorly when the system is swapping the memory.
	#
	# ---------------------------------- Network -----------------------------------
	#
	# By default Elasticsearch is only accessible on localhost. Set a different
	# address here to expose this node on the network:
	#
	#network.host: 192.168.0.1
	#
	# By default Elasticsearch listens for HTTP traffic on the first free port it
	# finds starting at 9200. Set a specific HTTP port here:
	#
	#http.port: 9200
	#
	# For more information, consult the network module documentation.
	#
	# --------------------------------- Discovery ----------------------------------
	#
	# Pass an initial list of hosts to perform discovery when this node is started:
	# The default list of hosts is ["127.0.0.1", "[::1]"]
	#
	#discovery.seed_hosts: ["host1", "host2"]
	#
	# Bootstrap the cluster using an initial set of master-eligible nodes:
	#
	#cluster.initial_master_nodes: ["node-1", "node-2"]
	#
	# For more information, consult the discovery and cluster formation module documentation.
	#
	# ---------------------------------- Various -----------------------------------
	#
	# Allow wildcard deletion of indices:
	#
	#action.destructive_requires_name: false
	#----------------------- BEGIN SECURITY AUTO CONFIGURATION -----------------------
	#
	# The following settings, TLS certificates, and keys have been automatically
	# generated to configure Elasticsearch security features on 07-06-2025 05:58:45
	#
	# --------------------------------------------------------------------------------
	# Enable security features
	xpack.security.enabled: false
	xpack.security.enrollment.enabled: false
	# Enable encryption for HTTP API client connections, such as Kibana, Logstash, and Agents
	xpack.security.http.ssl:
	enabled: false
	keystore.path: certs/http.p12
	# Enable encryption and mutual authentication between cluster nodes
	xpack.security.transport.ssl:
	enabled: false
	verification_mode: certificate
	keystore.path: certs/transport.p12
	truststore.path: certs/transport.p12
	# Create a new cluster with the current node only
	# Additional nodes can still join the cluster later
	cluster.initial_master_nodes: ["serverName"]
	# Allow HTTP API connections from anywhere
	# Connections are encrypted and require user authentication
	http.host: 0.0.0.0
	# Allow other nodes to join the cluster from anywhere
	# Connections are encrypted and mutually authenticated
	#transport.host: 0.0.0.0
	#----------------------- END SECURITY AUTO CONFIGURATION -------------------------
	```

elasticsearchデーモンの起動と自動起動設定

``` sudo systemctl restart elasticsearch sudo systemctl enable elasticsearch ```

動作確認

  • なんかしら帰ってきます。ブラウザでも確認可能
    	```
    	curl http://localhost:9200
    	```

wiki.js側の設定

  • index(wikijs)は手動で作成せずとも wiki.js が自動で作ります。
    	~~analysis-kuromoji だと自動で作らないのですが、それは wiki.js がバグっているためと思われます。~~
     インストールは「analysis-kuromoji」なのですが、設定はただの「kuromoji」で動く事がわかりました。。。
    	ここまで長かった。。。	
  • simple でも一応、日本語の検索もできました。。。
  • ![wikijs-elasticsearch-0+png](/310-linux/313-linuxserver/wikijs/wikijs-elasticsearch-0+png)

動作確認して完了です。

  • ![wikijs-elasticsearch-02.png](/310-linux/313-linuxserver/wikijs/wikijs-elasticsearch-02.png)

refresh_interval の時間を変更する。

  1. 1秒から20秒へ
  2. index名の確認
    	```bash
    	curl --noproxy '*' http://localhost:9200/_cat/indices?v
    	```
    	- 結果例(index の下にあるのがindex名です)(例では wikijs)
    		```
    		health status index  uuid                   pri rep docs.count docs.deleted store.size pri.store.size dataset.size
    		yellow open   wikijs abcdefgabcdefg2JgCrqg   1   1         69            3      2.8mb          2.8mb        2.8mb
    		```
  3. 1秒から20秒へ
    	```bash
    	curl --noproxy '*' -X PUT "http://localhost:9200/wikijs/_settings" \
    	  -H "Content-Type: application/json" \
    	  -d '{ "index": { "refresh_interval": "20s" } }'
    	```
    	- 変更確認
    		```bash
    		curl --noproxy '*' -X GET "http://localhost:9200/wikijs/_settings?pretty"
    		```

pukiwikiからの移行(置換概要)

最初に

  • "- + # * の右側に半角スペースを作っておきます。"

* -> #(数の多い方からやっていきます)

  1. 回目
    	- 正規表現(<kbd>Alt</kbd> + <kbd>r</kbd>) : オフ
    	- 置換元(スペースを入れないとurlも変わってしまうかも。。。)
    		```
    		***** 
    		```
    	- 置換先(スペースを入れないとurlも変わってしまうかも。。。)
    		```
    		##### 
    		```
    	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)
  2. 回目
    	- 正規表現(<kbd>Alt</kbd> + <kbd>r</kbd>) : オフ
    	- 置換元(スペースを入れないとurlも変わってしまうかも。。。)
    		```
    		**** 
    		```
    	- 置換先(スペースを入れないとurlも変わってしまうかも。。。)
    		```
    		#### 
    		```
    	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)
  3. 回目
    	- 正規表現(<kbd>Alt</kbd> + <kbd>r</kbd>) : オフ
    	- 置換元(スペースを入れないとurlも変わってしまうかも。。。)
    		```
    		*** 
    		```
    	- 置換先(スペースを入れないとurlも変わってしまうかも。。。)
    		```
    		### 
    		```
    	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)
  4. 回目
    	- 正規表現(<kbd>Alt</kbd> + <kbd>r</kbd>) : オフ
    	- 置換元(スペースを入れないとurlも変わってしまうかも。。。)
    		```
    		** 
    		```
    	- 置換先(スペースを入れないとurlも変わってしまうかも。。。)
    		```
    		## 
    		```
    	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)
  5. 回目
    	- 正規表現(<kbd>Alt</kbd> + <kbd>r</kbd>) : オフ
    	- 置換元(スペースを入れないとurlも変わってしまうかも。。。)
    		```
    		* 
    		```
    	- 置換先(スペースを入れないとurlも変わってしまうかも。。。)
    		```
    		# 
    		```
    	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)

+ -> +

  • 正規表現(<kbd>Alt</kbd> + <kbd>r</kbd>) : オン
  1. 回目
    	- 置換元(スペースを入れないとurlも変わってしまうかも。。。)
    		```
    		\+\+\+\+\+ 
    		```
    	- 置換先(スペースを入れないとurlも変わってしまうかも。。。)
    		```
    		\t\t\t\t+ 
    		```
    	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)
  2. 回目
    	- 置換元(スペースを入れないとurlも変わってしまうかも。。。)
    		```
    		\+\+\+\+ 
    		```
    	- 置換先(スペースを入れないとurlも変わってしまうかも。。。)
    		```
    		\t\t\t+ 
    		```
    	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)
  3. 回目
    	- 置換元(スペースを入れないとurlも変わってしまうかも。。。)
    		```
    		\+\+\+ 
    		```
    	- 置換先(スペースを入れないとurlも変わってしまうかも。。。)
    		```
    		\t\t+ 
    		```
    	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)
  4. 回目
    	- 置換元(スペースを入れないとurlも変わってしまうかも。。。)
    		```
    		\+\+ 
    		```
    	- 置換先(スペースを入れないとurlも変わってしまうかも。。。)
    		```
    		\t+ 
    		```
    	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)
  5. 回目
    	- 置換元(スペースを入れないとurlも変わってしまうかも。。。)
    		```
    		\+ 
    		```
    	- 置換先(スペースを入れないとurlも変わってしまうかも。。。)
    		```
    		+ 
    		```
    	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)

「----」 -> Tab へ

  • 正規表現(<kbd>Alt</kbd> + <kbd>r</kbd>) : オン
  1. 回目
    	- 置換元(スペースを入れないとurlも変わってしまうかも。。。)
    		```
    		----- 
    		```
    	- 置換先(スペースを入れないとurlも変わってしまうかも。。。)
    		```
    		\t\t\t\t- 
    		```
    	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)
  2. 回目
    	- 置換元(スペースを入れないとurlも変わってしまうかも。。。)
    		```
    		---- 
    		```
    	- 置換先(スペースを入れないとurlも変わってしまうかも。。。)
    		```
    		\t\t\t- 
    		```
    	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)
  3. 回目
    	- 置換元(スペースを入れないとurlも変わってしまうかも。。。)
    		```
    		--- 
    		```
    	- 置換先(スペースを入れないとurlも変わってしまうかも。。。)
    		```
    		\t\t- 
    		```
    	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)
  4. 回目
    	- 置換元(スペースを入れないとurlも変わってしまうかも。。。)
    		```
    		-- 
    		```
    	- 置換先(スペースを入れないとurlも変わってしまうかも。。。)
    		```
    		\t- 
    		```
    	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)
  5. 回目
    	- 置換元(スペースを入れないとurlも変わってしまうかも。。。)
    		```
    		- 
    		```
    	- 置換先(スペースを入れないとurlも変わってしまうかも。。。)
    		```
    		- 
    		```
    	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)

ハッシュタグの消去

  • 正規表現(<kbd>Alt</kbd> + <kbd>r</kbd>) : オン
  • 置換元(行頭スペース必要)
    	```
    		\[.........\]
    	```
  • 置換先(無)
    	```
    	
    	```
  • 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)

リンクの変更

  • 正規表現(<kbd>Alt</kbd> + <kbd>r</kbd>) : オフ
  1. 最初
    	- 置換元
    		```
    		[[
    		```
    	- 置換先
    		```
    		[
    		```
    	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)
  2. 中間
    	- 置換元
    		```
    		:http
    		```
    	- 置換先
    		```
    		](http
    		```
    	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)
  3. 末尾
    	- 置換元
    		```
    		]]
    		```
    	- 置換先
    		```
    		)
    		```
    	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)

改行

  1. チルダ
    	- 正規表現(<kbd>Alt</kbd> + <kbd>r</kbd>) : オン
    	- 置換元
    		```
    		~\n
    		```
    	- 置換先
    		```
    		\n\t
    		```
    	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)

  2. 	- 正規表現(<kbd>Alt</kbd> + <kbd>r</kbd>) : オフ
    	- 置換元
    		```
    		&br;
    		```
    	- 置換先
    		```
    		<br>
    		```
    	- 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)

-- -> tabへ

  • 正規表現(<kbd>Alt</kbd> + <kbd>r</kbd>) : オン
  • 置換元(スペースを入れないと結果が変わってしまうかも。。。)
    	```
    	-- 
    	```
  • 置換先(スペースを入れないと結果が変わってしまうかも。。。)
    	```
    	\t- 
    	```
  • 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)

template

  • 正規表現(<kbd>Alt</kbd> + <kbd>r</kbd>) :
  • 置換元(スペースを入れないと結果が変わってしまうかも。。。)
    	```
	```
  • 置換先(スペースを入れないと結果が変わってしまうかも。。。)
    	```
	```
  • 全部まとめて変換(<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd>)

あまりにも面倒なので python でプログラムを組みましたw

  1. 最初に
    	+ 実行は自己責任でお願いします。
    	+ とりあえず動けば良いや、的なやっつけプログラムです。
    	+ python、始めて組んだんですが、まぁ他の言語と大差ないかなぁ。。。
    		なんでこんなに世間で話題になってるのか、いまいちわからなかったです。。。
    	+ 4時間位で作ったので、まだバグはありそうw
    	+ python の基本的な使い方は[こちら](/510-program/python/python)から
  2. 機能
    	+ Listの後ろに半角スペースが無ければ追加
    	+ Tabの処理
    	+ \+ を + へ
    	+ \* を # へ
    	+ リンクを変更
    		- 例
    			- 変更前
    				```
    				[[Link:https://dummy.hoge.net]]
    				```
    			- 変更後
    				```
    				[Link](https://dummy.hoge.net)
    				```
    	+ 表を変換
    	+ #の下はタブ無しへ
  3. 更新履歴
    	|日時|更新内容|
    	|-|-|
    	|2025/6/15 13:23|# or * 後のTab処理が反映されなかったのを修正|
    	|2025/6/15 8:32|``&imgr(./image/keyboard/Mechanical-Jiku-12_2.JPG,50%);``の形式からwiki.jsの画像リンクへ変更<br> -> ``![keyboardHHKJPLite2Black.jpg](%ImgFilePath%/keyboardhhkjplite2black.jpg)``|
    	|2025/6/14 10:20 |# と表組みに対応|
    	|2025/6/9 10:20 |間違えて ' と指定した個所を ` へ修正|
    	{.dense}
  4. その他
    	+ 以下2点が同時に発生する時、行頭のタブが一つ足りなくなる不具合があります。
    		ただ、自分にはちょっと無理かもしれない。。。
    		+ リストのインデントが増えたり減ったりする時(例) 「\t\t+」 -> 「\t+」)
    		+ `` ``` ``を閉じる際
    ``` import re import os

class CheckTabSharpClass:

   def __init__(self) -> None:
       self.tabCharacter = ""
       self.sharpAsteriskFlag = False
       self.tableFlag = False
   def check( \
                      self \
                     ,line\
                       ):
       afterReplaceCharacter=""
       beforeReplaceCharacter=""
       if line and line[0] in {"+", "-"}:
           beforeReplaceCharacter = line[0]
           if line and line[0] == "+":
               afterReplaceCharacter = "+"
           else:
               afterReplaceCharacter = line[0]
           beforeReplaceOrderList = ""
           orderCount=0
           newListLine=""
           self.tabCharacter = ""
           for characterOrder in line:
               if characterOrder==" ":
                   break
               else:
                   if orderCount==0:
                       beforeReplaceOrderList = characterOrder
                       newListLine = characterOrder.replace(beforeReplaceCharacter,afterReplaceCharacter)
                   else:
                       beforeReplaceOrderList += characterOrder
                       newListLine = "\t" + newListLine
                       self.tabCharacter += "\t"
               orderCount += 1
           line = line.replace(beforeReplaceOrderList,newListLine)
       if line and line[0]=="|":
           self.tableFlag=True
       else:
           self.tableFlag=False
       if line and line[0]=="*":
           line = line.replace("*","#")
           self.tabCharacter=""
           self.sharpAsteriskFlag=True
       elif self.tableFlag==False:
           self.sharpAsteriskFlag=False
       return line

def checkAddSpace(line):

   headerSpace=""
   spaceFlag= False
   beforeReplace=""
   for character in line:
       if character==" ":
           spaceFlag = True
           headerSpace += character
           break
       elif character.startswith('*') \
               or character.startswith('+') \
               or character.startswith('-') \
                   :
           pass
       else:
           beforeReplace = headerSpace
           headerSpace = headerSpace + " "
           break
       headerSpace += character
   if spaceFlag == False:
       line= line.replace(beforeReplace,headerSpace)
   return line

class CreateTabTextClass:

   def __init__(self) -> None:
       self.codeFlag=False
       self.codeHeadTab=""
       self.tableFlag=False
   def CreateTabText( \
                      self \
                     ,eachLine \
                     ,checkTabSharpClass \
                       ):
       tabCharacter=""
       returnEachLine=""
       returnEachLine=eachLine
       if checkTabSharpClass.sharpAsteriskFlag==False \
               and checkTabSharpClass.tableFlag==False:
           tabCharacter="\t"
       self.codeHeadTab=""
       if eachLine.startswith(" "):
           if self.codeFlag == False:
               self.codeHeadTab = tabCharacter + checkTabSharpClass.tabCharacter + "```\n"
           
           returnEachLine = self.codeHeadTab + tabCharacter + checkTabSharpClass.tabCharacter + eachLine[1:]
           self.codeFlag=True
       elif eachLine.startswith(' ')==False \
               and self.codeFlag==True :
           returnEachLine = self.codeHeadTab + tabCharacter + checkTabSharpClass.tabCharacter + "```\n" + eachLine
           self.codeFlag=False
       
       if eachLine.replace("\t","").startswith("|"):
           tableSeparate="|"
           
           if self.tableFlag==False:
               for pipeCount in range(1, eachLine.count("|")):
                   tableSeparate+="-|"
               returnEachLine= tabCharacter + checkTabSharpClass.tabCharacter + eachLine \
                                    + tabCharacter + checkTabSharpClass.tabCharacter + tableSeparate + "\n"
               self.tableFlag=True
           else:
               returnEachLine= tabCharacter + checkTabSharpClass.tabCharacter + eachLine
       elif self.tableFlag==True \
               and eachLine.replace("\t","").startswith("|")==False \
                   :
           self.tableFlag=False
       return returnEachLine

class ConvertImgrClass:

   def convert(self, argEachLine):
       eachLine=argEachLine
       afterSplitComma=[]
       afterSplitSlash=[]
       imgFileName=""
       afterSplitComma=eachLine.split(",")
       afterSplitSlash=afterSplitComma[0].split("/")
       imgFileName=afterSplitSlash[-1].lower()
       eachLine="!["+imgFileName+"](%ImgFilePath%/"+imgFileName+")\n"
       return eachLine

class TransFormLineClass:

   def transform_line( \
                        self \
                      , inputLines \
                       ):
       
       try:
           checkTabSharpClass = CheckTabSharpClass()
           createTabTextClass = CreateTabTextClass()
           convertImgrClass = ConvertImgrClass()
           eachLine=""
           outputText=""
           for line in inputLines:
               eachLine=line
               if \
                   eachLine.startswith('*') \
                       or eachLine.startswith('+') \
                       or eachLine.startswith('-') \
                       or eachLine.startswith('|') \
                           :
                   #Spaceが無い場合に追加
                   if eachLine.startswith('|')==False:
                       eachLine = checkAddSpace(eachLine)
                   #Tabと * の処理
                   eachLine = checkTabSharpClass.check(eachLine)
                   eachLine=re.sub(r" \[.........\]", "", eachLine)
                   eachLine=re.sub(r"\[.........\]", "", eachLine)
               eachLine=createTabTextClass.CreateTabText( \
                                                       eachLine \
                                                       , checkTabSharpClass \
                                                           )
               if "&imgr" in eachLine:
                   eachLine=convertImgrClass.convert(eachLine)
               eachLine=eachLine.replace("~","")
               eachLine=eachLine.replace("[[","[")
               eachLine=eachLine.replace(":http","](http")
               eachLine=eachLine.replace("]]",")")
               eachLine=eachLine.replace("''","**")
               eachLine=eachLine.replace("&br;","<br>")
               eachLine=eachLine.replace("|h","|")
               outputText+=eachLine
           
           del createTabTextClass
           del checkTabSharpClass
           del convertImgrClass
           return outputText
       
       except:
           import traceback
           traceback.print_exc()

ファイル単位で処理する場合

inputFileName="input.pukiwiki" outputFileName="output.wikijs" with open('pukiwikiWikijsSource\\'+inputFileName, 'r', encoding='utf-8') as infile, \

    open('pukiwikiWikijsSource\\'+outputFileName, 'w', encoding='utf-8') as outfile:
   transFormLineClass = TransFormLineClass()
   inputLines=[]
   for line in infile:
       inputLines.append(line)
   outputText=""
   outputText=transFormLineClass.transform_line(inputLines)
   if outputText is not None and isinstance(outputText, str):
       outfile.write(outputText)
   del transFormLineClass

```

  1. PlantUML,シーケンス図
    	+ 
    		```
    		@startuml sequence
    		title pukiwiki -> wiki.js 変換プログラム
		participant main
		participant TransFormLineClass
		participant CheckTabSharpClass
		participant CreateTabTextClass
		Activate main
		note right main
			inputFileName="input.pukiwiki"
			outputFileName="output.wikijs"
			open input.pukiwiki
			open output.wikijs
		end note
		loop foreach line in input file
			note right main
				inputLines.append(line)
			end note
		end
		note right main
			outputText=transFormLineClass.transform_line(inputLines)
		end note
		main -> TransFormLineClass:  transform_line(self, inputLines)
		Activate TransFormLineClass
			note right TransFormLineClass
				checkTabSharpClass = CheckTabSharpClass()
				createTabTextClass = CreateTabTextClass()
				eachLine=""
				outputText=""
			end note
			TransFormLineClass -> CheckTabSharpClass
			activate CheckTabSharpClass
			TransFormLineClass -> CreateTabTextClass
			activate CreateTabTextClass
			loop foreach line in inputLines
				note right TransFormLineClass
					eachLine = line
				end note
				
				alt eachLine.startswith('*') or eachLine.startswith('+') or eachLine.startswith('-') or eachLine.startswith('|') 
					alt eachLine.startswith('|')==False
						TransFormLineClass -> main: checkAddSpace
						note right TransFormLineClass
							+ # - のあとに半角スペースが無ければ挿入
						end note
						activate main
						main --> TransFormLineClass: eachLine
						deactivate main
					end
					TransFormLineClass -> CheckTabSharpClass: check(eachLine)
					note right  CheckTabSharpClass
						afterReplaceCharacter=""
						beforeReplaceCharacter=""
					end note
					alt line and line[0] in {"+", "-"}
						note right CheckTabSharpClass 
							+ を + へ変更
							beforeReplaceOrderList = ""
							orderCount=0
							newListLine=""
						end note
						loop characterOrder in line
							alt characterOrder==" "
								note right CheckTabSharpClass 
									何文字目かの文字(foreach)が、半角スペース(もう終わりなら)
									break
								end note
							else
								alt orderCount==0
									note right CheckTabSharpClass 
										文字が - か + で、かつ最初の文字の時
										beforeReplaceOrderList = characterOrder
										newListLine = characterOrder.replace(beforeReplaceCharacter,afterReplaceCharacter)
									end note
								else
									note right CheckTabSharpClass 
										文字が - か + で、かつ2文字目以降(タブの追加)
										beforeReplaceOrderList += characterOrder
										newListLine = "\ t" + newListLine
										self.tabCharacter += "\ t"
									end note
								end
							end
							note right CheckTabSharpClass 
								orderCount += 1
							end note
						end
						note right CheckTabSharpClass 
							line = line.replace(beforeReplaceOrderList,newListLine)
						end note
					end
					alt line and line[0]=="|" 
						note right CheckTabSharpClass 
							self.tableFlag=True
						end note
					else
						note right CheckTabSharpClass 
							self.tableFlag=False
						end note
					end
					alt line and line[0]=="*"
						note right CheckTabSharpClass 
								line = line.replace("*","#")
								self.tabCharacter=""
								self.sharpAsteriskFlag=True
						end note
					else self.tableFlag==False
						note right CheckTabSharpClass 
							self.sharpAsteriskFlag=False
						end note
					end
					CheckTabSharpClass --> TransFormLineClass: eachLine=line
					note right TransFormLineClass
						ハッシュタグの消去
					end note
				end
				TransFormLineClass -> CreateTabTextClass:createTabText(eachLine, checkTabSharpClass)
				note right CreateTabTextClass
					tabCharacter=""
					returnEachLine=""
					returnEachLine=eachLine
				end note
				alt checkTabSharpClass.sharpAsteriskFlag==False
					note right CreateTabTextClass
						tabCharacter="\ t"
					end note
				end
				alt checkTabSharpClass.tableFlag==False
					note right CreateTabTextClass
						tabCharacter="\ t"
					end note
				end
				alt self.eachLine.startswith(" "):
					alt self.codeFlag == False
						note right CreateTabTextClass
							self.codeHeadTab = tabCharacter + "```\n"
						end note
					end
					note right CreateTabTextClass
						returnEachLine = self.codeHeadTab + tabCharacter + "" + eachLine[1:]
						self.codeFlag=True
					end note
				else self.eachLine.startswith(' ')==False and self.codeFlag==True
					note right CreateTabTextClass
						returnEachLine = tabCharacter + "```\n" + eachLine
						self.codeFlag=False
					end note
				end
				alt eachLine.replace("\ t","").startswith("|")
					note right CreateTabTextClass
						tableSeparate="|"
					end note
					alt eachLine.replace("\t","").startswith("|")
						note right CreateTabTextClass
							tableSeparate="|"
						end note
						loop pipeCount in range(1, eachLine.count("|"))
							note right CreateTabTextClass
								tableSeparate+="-|"
							end note
						end
						note right CreateTabTextClass
							returnEachLine= tabCharacter + checkTabSharpClass.tabCharacter + eachLine \ 
												+ tabCharacter + checkTabSharpClass.tabCharacter + tableSeparate + "\n"
							self.tableFlag=True
						end note
					else
						note right CreateTabTextClass
							returnEachLine= tabCharacter + checkTabSharpClass.tabCharacter + eachLine
						end note
					end
				else self.tableFlag==True and eachLine.replace("\t","").startswith("|")==False 
					note right CreateTabTextClass
						self.tableFlag=False
					end note
				end
				CreateTabTextClass --> TransFormLineClass:returnEachLine
				note right TransFormLineClass
					eachLine=eachLine.replace("~","")
					eachLine=eachLine.replace("[[","[")
					eachLine=eachLine.replace(":http","](http")
					eachLine=eachLine.replace("]]",")")
					eachLine=eachLine.replace("''","**")
					outputText+=eachLine
				end note
			end
			TransFormLineClass --> main: outputText                        
			deActivate CreateTabTextClass
			deActivate CheckTabSharpClass
		deActivate TransFormLineClass
		note right main
			outfile.write(outputText)
		end note
		@enduml
		```
	+ ![plantuml-0+png](/310-linux/313-linuxserver/wikijs/plantuml-0+png)

その他

Visual Editor と Markdown 比較と感想

Visual Editorの長所

  • 細かいテーブルレイアウトが可能

Markdownの長所

vs codeでの編集が可能。

(おまけ) なぜか vim をインストール後、かつsshの状態で、マウス右クリックしても貼り付けできない

  • とりあえず、<kbd>Shift</kbd> + <kbd>Insert</kbd>で緊急対応はできます。
  • あとはバックスペースが効かないとか。。。一応、以下にまとめてました。
    	- [vi,vim(wiki.js)](https://wikijs.tar3.net:3443/ja/310-Linux/311-LinuxCommon/vi,vim)

コメントをフルオープンにした場合、どれくらいスパムが来るのか検証

  • 2025/6/20 7:15~
  • そのうち結果を書きます
    	- 2025/6/30(18:00):今のところスパムは無いです。このままいけるか??

upgrade

  1. Stop the running Wiki.js instance
    systemctl stop wikijs
  2. Make a backup of your config.yml file.
    cp wiki/config.yml ~/config.yml.bak
  3. Change folder name
    mv wikijs wikijsBak
  4. create directory
    mkdir wikijs
    cd wikijs
  5. Download the latest version of Wiki.js.
    wget https://github.com/Requarks/wiki/releases/latest/download/wiki-js.tar.gz
  6. Extract the package
    tar xzfv wiki-js.tar.gz
  7. If created the link of data directory
    rm -fr data
    ln -s /mnt/target/directory data
  8. Restore your config.yml back to its original location.
    cp ~/config.yml.bak ./config.yml
  9. start wiki.js
    systemctl start wikijs
  10. If no problem, delete the backup folder.
    rm -fr ../wikijsBak

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2025-08-21 (木) 12:41:16 (291d)