カテゴリー
その他 社内SE

“curl : リモート名を解決できませんでした。”が出た

WindowsでCURLが使えると知り、早速dos窓で「curl –version」とコマンドを打ったところ、”curl : リモート名を解決できませんでした。・・・”のエラーが出た。

curlが認識できなく、curl.exeなら認識できるらしい。「curl.exe –version」とコマンドを打ったところ素直にバージョンが表示された。

環境依存かもしれないが参考まで。

カテゴリー
OS 社内SE

Windows 7のシステムドライブをパーティションだけコピーしてHDDを入れ替えた話

家で2つほどサーバ的なものを建てている。1つはUbuntu22だが、1つはWindows 7である。Windows 7なんかやめたいのだが、録画サーバとして設置してあり、諸事情で10にもできずそのままになっている。もうほとんど録画もしていないが、稀に録画することがあり、手仕舞いできない。

そんなWin7の録画サーバの調子が悪い。HDDが古くディスクエラーが頻発しているので、SSDに乗り換えることにした。

Win7の現在のHDDの構成は300GBでCドライブに80GBを充てていて、これをWindowsの「バックアップと復元」で新しい128GBのSSDに載せ替えるつもりだったが、「ディスク容量不足」でどうしてもできない。Cドライブだけではなく、HDD全容量以上のディスクが必要らしい。あれやこれややってみたがうまく行かない。

仕方ないので、Ubuntu 22をUSBから起動(インストールディスクから「try ubuntu」)して対応した。手順としては、SSD側でfdiskでパーティション作成、HDDからSSDにパーティション単位でddコピー、SSDでWindows7起動確認後、ついでにgpartedで容量を80GBから128GBまで拡張した。

以下、備忘録として手順を示す。HDDは/dev/sda、SDDは/dev/sdbとする。

下準備

# ルートで作業
sudo su -
# なんとインストールできる!次回起動しても有効!
apt install ntfs-3g

手順1:/dev/sdaの現在のパーティション容量確認コマンド

#このコマンドの結果出てくる、/dev/sda1と/dev/sda2をコピーすることになる。
#そのため、コピー先に同じパーティション容量の/dev/sdb1と/dev/sdb2を作成する必要があるため、ここで/dev/sda1と/dev/sda2の容量を控えておく。
fdisk -l /dev/sda
# あまり覚えていないが以下のような感じで出てくる。
# 2048から9602のパーティションと96043から999999のパーティションを/dev/sdbに作成する。
/dev/sda1   *      2048      96042  123456   7  NTFS
/dev/sda2          96043     999999   123456    7  NTFS

手順2:/dev/sdbにパーティション作成。(NTFSではなく、sdb1はFAT32 (LBA))で作成する。)最後のwコマンドをするまで、実際には書き込まれないので安心して作業する。

fdisk /dev/sdb

コマンド (m でヘルプ): n 
コマンドアクション
    e   拡張
    p   基本領域 (1-4)
p # 基本pらしい

領域番号 (1-4): 1 #sda1のコピー先なので1

最初 シリンダ (1-652, default 1): 2048 # 上で控えた開始
終点 シリンダ または +サイズ または +サイズM または +サイズK (1-652, default 652): 96042 # 上で控えた終了

# 2つ目を作成
コマンド (m でヘルプ): n
コマンドアクション
    e   拡張
    p   基本領域 (1-4)
p

領域番号 (1-4): 2 #sda2のコピー先なので2

# 上で控えた開始と終了の位置
最初 シリンダ (1-652, default 1): 96043
終点 シリンダ または +サイズ または +サイズM または +サイズK (1-652, default 652): 9999999

コマンド (m でヘルプ): t
選択した領域 1
16進数コード (L コマンドでコードリスト表示): c # FAT32 (LBA)

コマンド (m でヘルプ): t
選択した領域 2
16進数コード (L コマンドでコードリスト表示): 7 # NTFS

# 起動パーティション指定
コマンド (m でヘルプ): a
Partition number (1-4): 1

# 現在の状況確認
コマンド (m でヘルプ): p
# なんか色々出る。

# 書き込み
コマンド (m でヘルプ): w

手順3:パーティションコピー bsオプションは値を上げればコピーが早くなるわけではないらしい。32Mとか64Mあたりでやる。

# sda1はすぐ終わる
dd bs=32M if=/dev/sda1 of=/dev/sdb1
# こっちは長い・・・
dd bs=32M if=/dev/sda2 of=/dev/sdb2

これでSSDから起動してみて起動できればOKである。NGだった場合は、fdisk -l /dev/sdbをよく見てみる。MBRの調整などは基本不要である。コピーが失敗していないか、ファイルシステムが違わないか、起動(boot)パーティションが指定されているかを確認する。

このあとはやらなくても良い(起動しなくなるリスク有り)のだが、gpartedを起動してパーティションサイズを拡張した。gpartedは必ずsudoコマンドで起動すること。

sudo gparted

GUIなので説明は割愛。対象のディスクを選んで、リサイズを選択してからドラッグしてリサイズする。

ローカルネットの中だけのサーバだが、そのうちセキュリティの問題でsambaが他のデバイスから繋がらなくなりそう。そうなったら破棄するか何かで対応しよう。。。

カテゴリー
その他 社内SE

iPhone SE から Pixel 6a に乗り換えた話

Pixel 6aがgoogle storeで42,900円まで下がっていたので購入し、今まで使っていたiPhone SE 2から乗り換えた。

乗り換えてまだ1週間程度だが、概ね快適である。iPhoneの廉価版からPixelの廉価版へ乗り換えた貧乏人だが、5万前後の端末なら、iPhoneより圧倒的にPixelを勧めたい。迷っている人の参考に、個人的な主観で良い点、悪い点を以下に少しまとめたい。

Pixel 6aの良いところ (iPhone SE2比較)

  • 写真がきれい。とても自然な写真が取れる。SE2を使っていたときは全く気が付かなかったが、Pixelを使ってからはSE2の写真の不自然感が気になるようになった。家族写真を撮ることが多いので、その時のその瞬間の本当に自然の姿をとれるほうが個人的には良く、買い替えて良かったと最初に思った点である。
  • 画面が大きい。pixel 6aとiPhone SE 2を並べておくと大きさはあまり変わらないが、pixelはホームボタンがない分、画面を広く使えるので、表示できる情報量が多い。スクロールしている時間が減るし、減ってみるとちょこちょこスクロールするのがストレスだったと気が付いた。もっと大画面ならもっと楽なのかもしれない。
  • 電池が長持ち。Androidの中ではPixelのバッテリー持ちはそんなに良くないらしいが、使っていたiPhone SE 2に比べたら雲泥の差で良い。私の使い方でPixelは余裕で2日は電池が持つが、SE2は夕方には電池が無くなりそうになっていた。SE2は最初から充電が1日終わりには必要だったので、バッテリーのへたり具合を勘案してもPixelのほうが良い。
  • アプリの量が多い。アプリをだいぶ断捨離して移行したが、私が必要なiOSのアプリはAndroidにもあり困ることはなかった。また「Androidしかないアプリ」や「Android版のほうが良いアプリ」も多かった。例えば、NextCloudのアプリはAndroid版のほうがかなり機能性が高いし、iOSでは有料なのにAndroidでは無料となっているVoIPアプリもあった。
  • 置きっぱなしのスマホに「OK、グーグル」と話すと答えてくれる。今日もカップラーメンにお湯を入れたときに「OK、グーグル、タイマー3分」と言ったら3分後に教えてくれて便利であった。Siriでもできたのかもしれないが、使っていなかったので気が付かなかった。
  • AI系が便利そう(推定)。まだほとんど使っていないが、少し「OK、グーグル、XXXXを英語に翻訳して」で日ー>英の翻訳をやってみたところ、すぐに翻訳してくれ、会議で英単語に困った際に使えそうであった。その他、自動文字起こしやら消しゴムマジックやらも、使いこなせれば便利に使えそうである。

Pixel 6aの悪いところ (iPhone SE2比較)

  • 指紋認証の精度が悪い。iPhoneに慣れていると泣きたくなるレベルである。フィルムガラスを張った後で、登録できる4種類の指紋を全部同じ指でやってやっとなんとか使えるかどうかという感じである。
    特に家事をやって手荒れがひどくなると全く認識しなくなる。左手の人差し指の手荒れが少ないので、4つ登録できる指の一つを左手の人差し指にした。ちなみにアプリの生体認証は手荒れしてても瞬時に認証してくれるので、ロック解除時のみ指紋チェックが厳しくなっているのだと思われる。
  • マナーモードの物理ボタンがない。何かの際に「カチリ」とマナーモードに切り替えられるのは便利だった。Pixelでマナーモードにするには、ロック解除して、音量ボタン押して、マナーモード選択と手順が多い。

今のところこんなところであろうか。移行は大変だったが、いつも使っている10~20のアプリだけなら、1時間ぐらいで移行が終わり、後は必要なときに都度入れている。移行でLINEの過去のやり取りが消え多少痛かったが、そもそも読み返すこともないし、すぐに諦めがついた。

もう数ヶ月使ったところでさらに良い点/悪い点を追記してみたい。

カテゴリー
プログラム 社内SE

NextCloudに外部からファイルをアップし内部リンクを取得する方法

別システムからバッチなどでファイルを作成、そのファイルをNextCloudにアップし、NextCloudの内部リンクを取得したいケースがあった。参考までに方法を示す。

CURLでNextCloudのAPIコマンドをたたき、アップしてFileIDを取得する。

PHPのプログラムで書くと以下の感じとなる。

/**
 * ローカルのファイルをNextCloudにアップロードし、内部リンクを取得する。
 *
 * @param string $upFileFullPath アップしたいファイルのフルパス
 * @param string $dstFolder NextClodu上のアップしたいフォルダー(ファイル名は$upFileFullPathのファイル名を使用)
 * @param string $nextCloudURL NextCloudのURL
 * @param string $userName NextCloudのログインユーザー
 * @param string $password NextCloudのログインユーザーのパスワード(アプリパスワード)
 * @return string|bool ファイルアップ後の内部リンクを返す。falseの場合はエラー
 */
function upFileAndGetInternalLink($upFileFullPath, $dstFolder, $nextCloudURL, $userName, $password){

	if (!is_file($upFileFullPath)){ return false; }
	$fileName = basename($upFileFullPath);
	if (substr($nextCloudURL, -1) != '/'){ $nextCloudURL .= '/'; }
	if (substr($dstFolder, -1) != '/'){ $dstFolder .= '/'; }

	$apiOfTheUpFile = $nextCloudURL . 'remote.php/dav/files/' . $dstFolder . $fileName;

	//libxml_use_internal_errors(true);

	$cmd = "curl -T '" . $upFileFullPath . "' -u '" . $userName . ":" . $password . "' '" . $apiOfTheUpFile . "'";
	echo $cmd;
	$ret = exec($cmd, $aryOutput, $resultCode);
	if ($ret === false || $resultCode != 0){ return false; }

	$cmd = "curl -u '" . $userName . ":" . $password . "' '" . $apiOfTheUpFile . "' -X PROPFIND --data '<?xml version=\"1.0\" encoding=\"UTF-8\"?>
		<d:propfind xmlns:d=\"DAV:\">
		<d:prop xmlns:oc=\"http://owncloud.org/ns\">
				<oc:fileid />
		</d:prop>
		</d:propfind>'";

	$ret = exec($cmd, $aryOutput, $resultCode);
	if ($ret === false || $resultCode != 0){ return false; }

	$ret = str_replace(':','',$ret);
	$xml = simplexml_load_string($ret);
	$fileId = (string)$xml->dresponse->dpropstat->dprop->ocfileid;

	return $nextCloudURL . "index.php/f/" . $fileId;

}

使用する感じは以下。

$upFileFullPath = '/td/dl/hogehoge.xlsx'; 
$nextCloudURL = 'https://yourNextCloud.com/'; 
$dstFolder = '/yourName/All/'; // NextCloudの"data"フォルダ以下を指定。ユーザ名が最初のフォルダ階層になるはず。
$userName = 'YourName';
$password = 'xH6Jk-Hkdje-OPalkd-J4PCn-mqxMW';

echo upFileAndGetInternalLink($upFileFullPath, $dstFolder, $nextCloudURL, $userName, $password);
カテゴリー
その他 社内SE

Collabora Onlineで接続エラー “Failed to add session to XXXX” を解決

Collabora Onlineをアップデートしたら、NextCloudで”ドキュメントの読み込みに失敗 NextCloud Officeが読み込めませんでした – しばらく後でもう一度試してください”というエラーが表示され、Office系のファイルが開けなくなった。

エラーの内容としては以下の感じである。

WRN  Waking up dead poll thread [HttpSynReqPoll], started: false, fin
ished: false| net/Socket.hpp:725
ERR  #30: Read failed, have 0 buffered bytes (EPIPE: Broken pipe)
ERR  #30: Socket write returned -1 (EPIPE: Broken pipe)
ERR  loading document exception: WOPI::CheckFileInfo failed:
ERR  Failed to add session to [https://hogehoge.com:443/index.
php/apps/richdocuments/wopi/files/52797_ocic20zydkap] with URI [https://hogehoge.com/index.php/apps/richdocuments/wopi/files/52797_ocic20zydkap?access_token=dcy91ZZq9mSvxv1XsGrW2ucmp8CmFcu4&access_tok
en_ttl=0]: WOPI::CheckFileInfo failed:

この「Failed to add session to」はCollaboraがNextCloudに接続できないときに出力されるエラーで、例えば上なら、「hogehoge.com」の名前解決が出来ていないケースが多く、/etc/hostsやらDNSやらで名前解決すれば動くことが多い。だが、今回はアップデート前は動いていたため、名前解決のエラーではない。

結論から言うとIPv6を無効にすると無事動作した。

諸事情で、このサーバの設定では、ポートをLISTENするプログラムは徹底してIPv4のみ有効として設定した。Collaboraも設定ファイルのnet.protにIPv4を設定しIPv4のみ有効とした。

通常のサーバならIPv6も有効にするところだが、本サーバはさくらの専用サーバで、さくらの専用サーバはIPv6の提供をやめてしまっており、IPv4でしか接続できない。なのでIPv6をLISTENするソケットは可能な限り削除した。

1日いろいろ設定をいじりまわって、Collaboraを別サーバで動かすことまで考えて、最後のあがきでIPv6を無効にしたところするっと動作した。理由はわからないが、CollaboraがIPv6でNextCloudに接続しようとしていて、接続エラーとなっていたと思われる。

同じような人がいるかもしれないので、ご参考まで。

Ubuntu 22でIPv6を仮で無効にするには以下のコマンド。

sysctl -w net.ipv6.conf.all.disable_ipv6=1
sysctl -w net.ipv6.conf.default.disable_ipv6=1
sysctl -w net.ipv6.conf.lo.disable_ipv6=1

これで動くようになればIPv6が原因である。原因がIPv6であれば以下のコマンドで恒久的にIPv6を無効にする。(ubuntu 20以下だと以下のコマンドはバグで動作しないので注意。)

vi /etc/sysctl.d/60-custom.conf
---
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
--

sysctl -p
systemctl restart procps

カテゴリー
OS 社内SE

Ubuntu www-dataにSSHでログインする方法

Ubuntu serverではwww-dataというユーザがいて、WEB系のプログラムを動作させるときのデフォルトユーザとなっている。

このwww-dataにSSHでログインしようとしたら手間取ったため、以下に方法を示す。

# rootで作業
sudo su -

# www-dataをログインユーザにする。
mkdir -p /home/www-data
chown www-data:www-data /home/www-data
chmod 755 /home/www-data
usermod -s /bin/bash www-data
passwd www-data
# 適当なパスワードを指定


su - www-data

# sshの認証鍵を作成
cd .ssh
ssh-keygen -t rsa
chmod 600 ./*
chmod 744 ~/.ssh
# sshの設定に合わせて・・
mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys

exit

# sshの設定を変更(必要であれば)
vi /etc/ssh/sshd_config
---
# AllowUsersを設定してなければ不要
AllowUsers www-data
---

これでwww-dataのid_rsaを使ってSSHでログインできるようになる。ホームディレクトリの権限が755じゃないとSSHで”Permission denied (publickey)”となりはじかれるので注意。(ここがわからず時間がかかってしまった。。)

カテゴリー
プログラム 社内SE

NextCloudで日本語(Shift-JIS)のテキストファイルを開く(簡単 1ファイル修正)

NextCloudをそのまま使うと日本語ファイルが文字化けすることがある。Windowsで昔作ったテキストファイルの文字コードがSJISになっているためである。

ググるとTEXTアプリのソースを2箇所修正する方法が出てくるのだが、最近のNextCloudのTEXTアプリは自前でエンコード変換するプログラムがあり、それを修正するほうが簡単で本筋である。(エンコード変換のプログラムで日本語の優先順が低いため、SJISのファイルがうまく変換されていないのである。)

修正ファイルは以下のファイルとなる。

(NextCloudインストールフォルダ)/apps/text/lib/Service/EncodingService.php

このファイルの上部のエンコード一覧(変数名:COMMON_ENCODINGS)の配列の先頭にSJISを加える。(NextCloud 24.0.5では29行目)

// コメントが元のソース 'UTF-8'の前に、'SJIS-win', 'SJIS', を追加
// public const COMMON_ENCODINGS = [ 'UTF-8', 'GB2312', 'GBK', 'BIG-5', 'SJIS-win', 'EUC-JP', 'Windows-1252', 'ISO-8859-15', 'ISO-8859-1', 'ASCII'];
public const COMMON_ENCODINGS = [ 'SJIS-win', 'SJIS', 'UTF-8', 'GB2312', 'GBK', 'BIG-5', 'SJIS-win', 'EUC-JP', 'Windows-1252', 'ISO-8859-15', 'ISO-8859-1', 'ASCII'];

これでSJISのファイルが文字化けせずに表示されるようになる。(中国語のGB2312テキストファイルが今度は文字化けするかもしれないが、そこは考えない。考えるならブラウザの表示言語でエンコードの優先度を変更するなどで実用上は賄えそう。)

カテゴリー
その他 社内SE

NextCloud & collabora onlineをopenLiteSpeedで動かす

PHPを高速で動作させるopenLiteSpeedでNextCloudとcollabora onlineの設定を行った。NextCloudが重いと悩んでいる方は軽くなるので、お試しあれ。

(2022年9月現在の最新パッケージでの構築方法だが、古い環境でも構築方法はほぼ変わらないので参考になるかと思う。)

構築環境

  • OS Ubuntu 22.04
  • NextCloud 24.04
  • OpenLiteSpeed 1.7 + PHP 8.1
  • Collabora Online 22
  • SSL LetsEncrypt

要点

  • Collabora Onlineは設定のnum_prespawn_childrenを増やして軽快に。proxyはipv4のみとするので、net.protoをipv4のみに変更
  • NextCloudの.htaccessは、occ maintenance:update:htaccess で環境に合わせたものを生成しなおす。そのrewrite部分をOpenLiteSpeedのrewrite機能に設定する。(生成した.htaccessは使わない。)
  • Collabora OnlineはOpenLiteSpeedでReverse Proxy設定

前提

  • OSの環境構築はできている。
  • mariaDBを使用する。(インストールは終わっている)
  • 本稿の設定方法では、以下のサイトを作成する。
    NextCloud https://nc.you.com/
    Collabora Online https://lool.you.com/

    参考にする場合、自前のドメインに読み替えのこと。また、NextCloudをサブフォルダーに配置する場合などは適宜読み替えのこと。

初期設定

DB設定 使用するDB環境にNextCloud用のDBを作成しておく。

CREATE DATABASE nc;
CREATE USER 'nextcloud'@'127.0.0.1' IDENTIFIED BY 'yourPassWord';
GRANT ALL ON nc.* TO 'nc'@'127.0.0.1';

FLUSH PRIVILEGES;

rootユーザに変更(以下は基本rootで設定)

sudo su -

hostsを変更

vi /etc/hosts
---
127.0.0.1 localhost nc.you.com lool.you.com
127.0.1.1 nc.you.com lool.you.com
---

Redis インストール

apt install redis-server -y

vi /etc/redis/redis.conf
---
supervised systemd
maxmemory 16mb
maxmemory-policy volatile-lfu
unixsocket /var/run/redis/redis-server.sock
unixsocketperm 777
timeout 60
---

usermod -a -G redis www-data

systemctl enable redis-server
systemctl restart redis.service
systemctl status redis-server

その他インストール

# 入っていない場合に備えて
apt install -y cron vim build-essential
systemctl start cron
systemctl enable cron

OpenLiteSpeed Port 80 + LetsEncrypt

OpenLiteSpeed + php 8.1 インストール

wget -O - https://repo.litespeed.sh > enable_lst_debian_repo.sh
bash enable_lst_debian_repo.sh

apt update
apt install openlitespeed -y

systemctl status lshttpd
systemctl enable lshttpd
systemctl start lshttpd

# 公開フォルダ作成
mkdir /var/www/{nextcloud,80}
chown -R www-data:www-data /var/www/

# vertual hostの設定保存先
mkdir -p /usr/local/lsws/conf/vhosts/{nextcloud,httpPort,loolProxy}
chown www-data:www-data /usr/local/lsws/conf/vhosts/{nextcloud,httpPort,loolProxy}

# vertual hostのrootフォルダー
mkdir -p /usr/local/lsws/vhosts/{nextcloud,httpPort,loolProxy}
chown www-data:www-data /usr/local/lsws/vhosts/{nextcloud,httpPort,loolProxy}

# PHP 8.1 
apt install -y lsphp81 lsphp81-curl lsphp81-dev lsphp81-mysql lsphp81-redis lsphp81-apcu lsphp81-intl lsphp81-imagick

# php-imagickの警告削除のため。
apt install -y libmagickcore-6.q16-6-extra

# 設定ファイル 変更部分のみ
vi /usr/local/lsws/conf/httpd_config.conf
---
serverName                        nc.you.com
#user                             nobody
#group                            nogroup
user                             www-data
group                            www-data
#indexFiles                       index.html, index.php
indexFiles                       index.html, index.php, index.htm
#path                    lsphp73/bin/lsphp
path                    lsphp81/bin/lsphp
---

# 実行ユーザを変更した場合、必ず再インストール
apt -y install --reinstall openlitespeed

# 管理画面へのパスワード設定
/usr/local/lsws/admin/misc/admpass.sh

User name [admin]: your Name

Password: yourPassword
Retype password: yourPassword

# ramディスク作成
mkdir /tmp/ram
mount -t tmpfs -o size=8m /dev/shm /tmp/ram

vi /etc/fstab
---
tmpfs /tmp/ram tmpfs defaults,noatime,size=8m 0 0
---

# php設定 変更部分のみ
vi /usr/local/lsws/lsphp81/etc/php/8.1/litespeed/php.ini
---
memory_limit = 512M
upload_max_filesize = 64M
max_file_uploads = 100
post_max_size = 40M
output_buffering = Off

date.timezone = "Asia/Tokyo"

[Pdo_mysql]
# 環境に合わせて
pdo_mysql.default_socket = /var/run/mysqld/mysqld.sock

[opcache]
opcache.enable=1
opcache.enable_cli=1
opcache.interned_strings_buffer=32
opcache.max_accelerated_files=1000
opcache.memory_consumption=128
opcache.save_comments=1
opcache.revalidate_freq=1

opcache.jit=on
opcache.jit_buffer_size=128M

apc.enabled=1
apc.enable_cli = 1
apc.shm_size=64M
apc.ttl=3600
apc.gc_ttl=3600
---

# デフォルトユーザnobodyで作られるので一旦削除
rm -rf /tmp/lshttpd

# openLiteSpeed adminパネルの設定
vi /usr/local/lsws/admin/conf/admin_config.conf
---
# 以下の個所を以下のように修正
listener adminListener {
  address               *:7080
  secure                0
  keyFile                 /etc/letsencrypt/live/nc.you.com/privkey.pem
  certFile                /etc/letsencrypt/live/nc.you.com/fullchain.pem
  clientVerify          0
}
---

systemctl restart lshttpd

# www-dataでphpを簡単に扱えるように.bashrcのaliasを追加
su - www-data
vi ~/.bash_profile
---
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi
---

vi ~/.bashrc
---
alias lsphp='/usr/local/lsws/lsphp81/bin/php -c /usr/local/lsws/lsphp81/etc/php/8.1/litespeed/php.ini'
---
source ~/.bashrc
exit

# rootユーザも
vi ~/.bashrc
---
# 以下1行を追加
alias lsphp='/usr/local/lsws/lsphp81/bin/php -c /usr/local/lsws/lsphp81/etc/php/8.1/litespeed/php.ini'
---
source ~/.bashrc

http://nc.you.com:7080/にアクセスし、port80が動くようにする。
ファイルから設定する場合は以下。

vi /usr/local/lsws/conf/httpd_config.conf
---
# 追加する。
virtualhost httpPort {
  vhRoot                  $SERVER_ROOT/vhosts/$VH_NAME/
  configFile              $SERVER_ROOT/conf/vhosts/$VH_NAME/vhconf.conf
  allowSymbolLink         1
  enableScript            0
  restrained              1
}
# 修正する。
listener Default {
  address                 *:80
  secure                  0
  map                     httpPort nc.you.com, lool.you.com
}
---

# 新規作成
vi /usr/local/lsws/conf/vhosts/httpPort/vhconf.conf
---
docRoot                   /var/www/80/

errorlog $SERVER_ROOT/logs/$VH_NAME_error.log {
  useServer               0
  logLevel                ERROR
  rollingSize             10k
  keepDays                90
}

accesslog $SERVER_ROOT/logs/$VH_NAME_access.log {
  useServer               0
  logFormat               %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"
  rollingSize             10k
  keepDays                90
}
---
chown lsadm:www-data /usr/local/lsws/conf/vhosts/httpPort/vhconf.conf

LetsEncrypt (メールアドレス部分は変更のこと)

apt install certbot -y

# メールアドレスは自分のものに変更のこと
certbot certonly --non-interactive --agree-tos -m yourmail@mail.com --webroot -w /var/www/80/ -d nc.you.com -d lool.you.com

vi /etc/cron.d/certbot
---
# 変更
#0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew --deploy-hook "systemctl restart lshttpd"
---

openlitespeed Admin設定

https://nc.you.com:7080/にアクセス可能なように変更。

vi /usr/local/lsws/admin/conf/admin_config.conf
---
listener adminListener {
  address               *:7080
  # この行から下3行を変更
  secure                1
  keyFile                 /etc/letsencrypt/live/nc.you.com/privkey.pem
  certFile                /etc/letsencrypt/live/nc.you.com/fullchain.pem
  clientVerify          0
}
---

https://nc.you.com:7080/にアクセスし、以下を変更

[一般タブ] 統計出力ディレクトリ => /tmp/ram/
[一般タブ] 自動インデックス => いいえ
[ログタブ] ログレベル => WARNING
[外部アプリケーション] LiteSpeed SAPI を以下のように編集
 最大接続数 => 200
 環境の「PHP_LSAPI_CHILDREN」の値を200に変更

ファイルから変更する場合は以下

vi /usr/local/lsws/conf/httpd_config.conf
---
# 上部のグローバルなエリア(user/groupの設定)のあたりに追加
statDir                   /tmp/ram/

# 真ん中ぐらい・・
indexFiles                index.html, index.phpi, index.htm
autoIndex                 0

# このセクションの以下3行をなければ追加、あれば修正
extprocessor lsphp {
  maxConns                200
  env                     PHP_LSAPI_CHILDREN=200
  env                     LSAPI_AVOID_FORK=200M
}
---

NextCloudインストール

ソースをダウンロードし配置。

mkdir ~/src/
cd ~/src/

# 環境は最新のものを選んで。以下は24.0.4のケース
wget https://download.nextcloud.com/server/releases/nextcloud-24.0.4.tar.bz2
tar xf nextcloud-24.0.4.tar.bz2
cp -r ./nextcloud/. /var/www/nextcloud/

mkdir /var/www/nextcloud/{data,.well-known}
mkdir /var/www/nextcloud/.well-known/{carddav,caldav,webfinger,nodeinfo}

chown -R www-data:www-data /var/www/nextcloud/

NextCloud configファイル設定(追加/修正箇所のみ。最後の2行は.htaccessの更新用)

vi /var/www/nextcloud/config/config.php
---
# 修正箇所のみ
$CONFIG = array (
  'memcache.local' => '\\OC\\Memcache\\APCu',
  'memcache.distributed' => '\\OC\\Memcache\\Redis',
  'redis' =>
  array (
    'host' => '/var/run/redis/redis-server.sock',
    'port' => 0,
    'timeout' => 0.0,
  ),
  'memcache.locking' => '\\OC\\Memcache\\Redis',
  'overwrite.cli.url' => 'https://nc.you.com/',
  'htaccess.RewriteBase' => '/',
---

.htaccessを以下のコマンドで更新

su - www-data
lsphp /var/www/nextcloud/occ maintenance:update:htaccess
exit

生成された、/var/www/nextcloud/.htaccess ファイルを開き、何か所かある<IfModule mod_rewrite.c>のセクションを下のOpenLiteSpeedのvirtual hostのrewrite => rulesに追加。(下の設定ファイルを参考のほど。最初2行:RewriteRule ^/data/.*$ – [F,L]とRewriteRule ^/config/.*$ – [F,L]の下に追加する。RewriteEngine onやmod_envのセクションが内部に含まれる場合はその箇所はコピーしないこと。またRewriteRuleの先頭が^のものは^/に変更すること。.htaccessに限り、Apacheと記述ルールが若干違う。)

OpenLiteSpeedにvirtual hostを設定

vi /usr/local/lsws/conf/httpd_config.conf
---
# お尻のほうに以下を追加
virtualhost nextcloud {
  vhRoot                  $SERVER_ROOT/vhosts/$VH_NAME/
  configFile              $SERVER_ROOT/conf/vhosts/$VH_NAME/vhconf.conf
  allowSymbolLink         1
  enableScript            1
  restrained              1
}

listener nextcloud {
  address                 *:443
  secure                  1
  keyFile                 /etc/letsencrypt/live/nc.you.com/privkey.pem
  certFile                /etc/letsencrypt/live/nc.you.com/fullchain.pem
  map                     nextcloud nc.you.com
}
---

vi /usr/local/lsws/conf/vhosts/nextcloud/vhconf.conf
---
docRoot                   /var/www/nextcloud/
enableGzip                1

errorlog $SERVER_ROOT/logs/nextcloud_error.log {
  useServer               0
  logLevel                ERROR
  rollingSize             10M
  keepDays                30
}

accesslog $SERVER_ROOT/logs/nextcloud_access.log {
  useServer               0
  logFormat               %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"
  rollingSize             10M
  keepDays                30
}

index  {
  useServer               0
}
errorpage 403 {
  url                     /
}

errorpage 404 {
  url                     /
}
context / {
  allowBrowse             1
  extraHeaders            Strict-Transport-Security "max-age=15552000; includeSubDomains;preload"

  rewrite  {

  }
  addDefaultCharset       off

  phpIniOverride  {

  }
}
rewrite  {
  enable                  1
  autoLoadHtaccess        0
  rules                   <<<END_rules
RewriteRule ^/data/.*$ - [F,L]
RewriteRule ^/config/.*$ - [F,L]

RewriteCond %{HTTP_USER_AGENT} DavClnt
RewriteRule ^$ /remote.php/webdav/ [L,R=302]
RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteRule ^/\.well-known/carddav /remote.php/dav/ [R=301,L]
RewriteRule ^/\.well-known/caldav /remote.php/dav/ [R=301,L]
RewriteRule ^/remote/(.*) remote.php [QSA,L]
RewriteRule ^/(?:build|tests|config|lib|3rdparty|templates)/.* - [R=404,L]
RewriteRule ^/\.well-known/(?!acme-challenge|pki-validation) /index.php [QSA,L]
RewriteRule ^/(?:\.(?!well-known)|autotest|occ|issue|indie|db_|console).* - [R=404,L]

RewriteRule ^/core/js/oc.js$ index.php [PT,E=PATH_INFO:$1]
RewriteRule ^/core/preview.png$ index.php [PT,E=PATH_INFO:$1]
RewriteCond %{REQUEST_FILENAME} !\.(css|js|svg|gif|png|html|ttf|woff2?|ico|jpg|jpeg|map|webm|mp4|mp3|ogg|wav|wasm|tflite)$
RewriteCond %{REQUEST_FILENAME} !/core/ajax/update\.php
RewriteCond %{REQUEST_FILENAME} !/core/img/(favicon\.ico|manifest\.json)$
RewriteCond %{REQUEST_FILENAME} !/(cron|public|remote|status)\.php
RewriteCond %{REQUEST_FILENAME} !/ocs/v(1|2)\.php
RewriteCond %{REQUEST_FILENAME} !/robots\.txt
RewriteCond %{REQUEST_FILENAME} !/(ocm-provider|ocs-provider|updater)/
RewriteCond %{REQUEST_URI} !^/\.well-known/(acme-challenge|pki-validation)/.*
RewriteCond %{REQUEST_FILENAME} !/richdocumentscode(_arm64)?/proxy.php$
RewriteRule . index.php [PT,E=PATH_INFO:$1]
  END_rules
}
---

# check the config files
/usr/local/lsws/bin/openlitespeed -t

systemctl restart lshttpd

Collabola Onlineインストール

インストール

cd /usr/share/keyrings
sudo wget https://collaboraoffice.com/downloads/gpg/collaboraonline-release-keyring.gpg

# ファイル作成
vi /etc/apt/sources.list.d/collaboraonline.sources
---
Types: deb
URIs: https://www.collaboraoffice.com/repos/CollaboraOnline/CODE-ubuntu2204
Suites: ./
Signed-By: /usr/share/keyrings/collaboraonline-release-keyring.gpg
---

# インストール
apt update
apt install coolwsd code-brand -y

# 設定
loolconfig set ssl.enable false
loolconfig set ssl.termination true
loolconfig set storage.wopi.host nc.you.com
loolconfig set server_name lool.you.com

# adminパスワードを設定
loolconfig set-admin-password

# 設定ファイル修正
vi /etc/coolwsd/coolwsd.xml
---
# 修正は3か所
# net.protoをipv4のみに変更
# num_prespawn_childrenを10に変更
# allowed_languagesをen_USのみに変更
---

systemctl enable coolwsd
systemctl start coolwsd

# 動作しているか確認
systemctl status coolwsd

OpenLiteSpeedにvirtual hostを設定 (Reverse Proxyを設定 WebSocketも)

vi /usr/local/lsws/conf/httpd_config.conf
---
# お尻のほうに以下を追加
virtualhost loolProxy {
  vhRoot                  $SERVER_ROOT/vhosts/$VH_NAME/
  configFile              $SERVER_ROOT/conf/vhosts/$VH_NAME/vhconf.conf
  allowSymbolLink         1
  enableScript            1
  restrained              1
}

# 以下の箇所は修正(最後の1行を追加)
listener nextcloud {
  address                 *:443
  secure                  1
  keyFile                 /etc/letsencrypt/live/nc.you.com/privkey.pem
  certFile                /etc/letsencrypt/live/nc.you.com/fullchain.pem
  map                     nextcloud nc.you.com
  map                     loolProxy lool.you.com  
}
---

vi /usr/local/lsws/conf/vhosts/loolProxy/vhconf.conf
---
docRoot                   /var/www/80

errorlog $SERVER_ROOT/logs/$VH_NAME_error.log {
  useServer               0
  logLevel                ERROR
  rollingSize             10M
  keepDays                30
}

accesslog $SERVER_ROOT/logs/$VH_NAME_access.log {
  useServer               0
  logFormat               %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"
  rollingSize             10M
  keepDays                30
}

extprocessor lool {
  type                    proxy
  address                 127.0.0.1:9980
  maxConns                100
  pcKeepAliveTimeout      60
  initTimeout             60
  retryTimeout            0
  respBuffer              0
}

context / {
  type                    proxy
  handler                 lool
  addDefaultCharset       off
}

websocket / {
  address                 127.0.0.1:9980
}
---

最後に

これでNextCloudとCollabora onlineが動作するはずである。

https://nc.you.com/にアクセスし、初期設定を行った後、管理者の[オフィス]設定から、[自前のサーバを使用する]をチェックし、「https://lool.you.com/」を設定すればExcelなどのオフィスファイルがブラウザで開けるようになる。

NextCloudの初期設定では、推奨アプリを入れるか聞かれるが、推奨アプリは入れず、後から、Nextcloud officeアプリだけ入れることをお勧めする。要らないアプリを要れないことでNextCloudは軽くなる。

その他、NextCloudが重たくなる設定ポイントがいくつあるが、[共有]設定のクラウド共有関係はすべてチェックを外すと履歴関係は軽くなる。あとはDBが同じサーバにあるなら、configのdbhostを「127.0.0.1:/var/run/mysqld/mysqld.sock」でソケットに直接アクセスさせるなども有効。

セキュリティが気になるなら、ufwとfail2banで不正なログインがあったらアクセス禁止にする対策をする。

記載はしなかったが、

カテゴリー
プログラム 社内SE

Outlookのフォルダ構成ごとメールを取り出す方法

Outlookのメールだけならドラッグ&ドロップすれば、Windowsのフォルダへコピー可能だが、フォルダ毎ドラッグしてもWindowsのファイルシステムへコピーすることはできない。

これを実現するにはマクロでコピーするしかない。こんなこと通常やる必要は全くないのだが、ボケた上役の命令でやる機会があったので一応記録を残しておく。

Outlookでマクロを有効にための事前準備は以下。

  • [ファイル]-[オプション]-[トラストセンター]で[トラストセンターの設定]を開く
  • [マクロの設定]で[全てのマクロに対して警告を表示する]以下を選択する。
  • Outlookを再起動する。
  • [Alt]+[F11]でVBAの画面を開く
  • VBA画面で[ツール]-[参照設定]で開く画面から[Microsoft Scripting Runtime]を探し、チェックし[OK]をクリックする。
  • VBA画面で[挿入]-[標準モジュール]をクリックする。

ここまでで、左側のパネルでModule1という箇所が選択され、右側のパネルにVBAのプログラムが書けるようになるので、以下のプログラムをコピペする。

Dim objFSO As Scripting.FileSystemObject

Sub ExportOutlookFolders()
    Dim objFolder As Outlook.Folder
    Dim strFolderPath As String
    strFolderPath = SelectAnExportFolder()
    If strFolderPath = "" Then
        MsgBox "出力するフォルダを選択してください。", vbInformation + vbOKOnly, "フォルダ選択"
    Else
        Set objFSO = New Scripting.FileSystemObject
        Set objFolder = Outlook.Application.ActiveExplorer.CurrentFolder
        ExportAnOutlookFolder objFolder, strFolderPath
    End If
    Set objFolder = Nothing
    Set objFSO = Nothing
End Sub

Sub ExportAnOutlookFolder(ByVal OutlookFolder As Outlook.Folder, strFolderPath As String)
    Dim objSubFld As Outlook.Folder
    Dim objItem As Object
    Dim strPath As String
    Dim strFilePath As String
    Dim strSubject As String
    Dim strFilename As String
    Dim strRecievedTime As String
    Dim nCount As Long
    On Error Resume Next
    strPath = strFolderPath & "\" & ReplaceInvalidCharacters(OutlookFolder.Name)
    If Dir(strPath, 16) = Empty Then MkDir strPath

    nCount = 0

    For Each objItem In OutlookFolder.Items
        strSubject = ReplaceInvalidCharacters(objItem.Subject)
        If strSubject = "" Then
            strSubject = "notitle"
        End If
        strRecievedTime = Format(objItem.ReceivedTime, "yyyymmddhhnnss")
        strFilename = strRecievedTime & "_" & strSubject & ".msg"
        strFilePath = strPath & "\" & strFilename
        If objFSO.FileExists(strFilePath) Then
            nCount = nCount + 1
            strFilename = strRecievedTime & "_" & strSubject & " (" & nCount & ").msg"
            strFilePath = strPath & "\" & strFilename
        End If
        objItem.SaveAs strFilePath, olMSG
        
        DoEvents
    Next

    For Each objSubFld In OutlookFolder.Folders
        ExportAnOutlookFolder objSubFld, strPath
    Next
    Set OutlookFolder = Nothing
    Set objItem = Nothing
End Sub

Function SelectAnExportFolder() As String
    Dim objSelFolder As Object
    Dim objShell As Object
    Set objShell = CreateObject("Shell.Application")
    Set objSelFolder = objShell.BrowseForFolder(0, "Select a folder", 0, 0)
    If Not TypeName(objSelFolder) = "Nothing" Then
        SelectAnExportFolder = objSelFolder.self.Path
    End If
    Set objSelFolder = Nothing
    Set objShell = Nothing
End Function

Function ReplaceInvalidCharacters(Str As String) As String
    Dim objRegEx As Object
    Set objRegEx = CreateObject("vbscript.regexp")
    objRegEx.Global = True
    objRegEx.IgnoreCase = False
    objRegEx.Pattern = "\||\/|\<|\>|""|:|\*|\\|\?"
    ReplaceInvalidCharacters = objRegEx.Replace(Str, "_")
    Set objRegEx = Nothing
End Function

ここまでが終わったら、

  • Outlookの画面に戻り、コピーしたいフォルダを選択する
  • VBAの画面に戻り、一番上の「ExportOutlookFolders」という関数にカーソルを合わせる。(下図のように上部に[General]と[ExportOutlookFolders]が選択されたらOK。)
  • その後、下図の左上、赤丸内の緑の再生ボタンをクリックすると、Windows側の出力先のフォルダ選択画面が表示されるので、選択するとフォルダ構成毎、Windows側にコピーされる。
マクロ実行方法

プログラムとしては、「今Outlookで選択されているフォルダを、指定のフォルダに出力する」という処理を行っている。出力されるファイル名は「メールの受け取り時刻+件名」になる。

カテゴリー
その他 社内SE

collabora onlineの高速化

NextCloudのインストール時にcollabora onlineのインストールも行ったのだが、デフォルトの設定では遅く、設定を修正しパフォーマンスを上げた。

以下その記録。

前提

collabora online自体は、proxyの背後で、フロントから127.0.0.1:9980に接続。SSLは以下の設定でオフ。(proxyがSSL処理)

loolconfig set ssl.enable false
loolconfig set ssl.termination true
loolconfig set storage.wopi.host your.nextcloud.domain

公式のガイドもproxy前提のようなので、proxyで設定している。

設定

要点としては、設定XMLの以下3箇所を修正する。

  • allowed_languagesでサポート言語をen_USのみに変更
  • net.protoでipv6を使用せず、ipv4のみとする。(proxyなのでipv6はアクセスなし)
  • 初期起動数(num_prespawn_children)を増やす。(最重要 正直ここだけで良いはず。)

以下のXMLファイルを直接編集する。

vi /etc/coolwsd/coolwsd.xml

XMLファイルの修正点は以下。(修正箇所のみ抜粋)

<!-- 1箇所目 元は以下 -->
<!-- allowed_languages default="de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru" desc="List of supported languages of Writing Aids (spell checker, grammar checker, thesaurus, hyphenation) on this instance. Allowing too many has negative effect on startup performance.">de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru</allowed_languages -->
<allowed_languages default="en_US" desc="List of supported languages of Writing Aids (spell checker, grammar checker, thesaurus, hyphenation) on this instance. Allowing too many has negative effect on startup performance.">en_US</allowed_languages>

<!-- 2箇所目 元は以下 -->
<!--proto default="all" desc="Protocol to use IPv4, IPv6 or all for both" type="string">all</proto-->
<proto default="all" desc="Protocol to use IPv4, IPv6 or all for both" type="string">IPv4</proto>

<!-- 3箇所目 元は以下 10人ぐらいしか同時接続しないとみて、1から10に変更-->
<!-- num_prespawn_children default="1" desc="Number of child processes to keep started in advance and waiting for new clients." type="uint">1</num_prespawn_children-->
<num_prespawn_children default="1" desc="Number of child processes to keep started in advance and waiting for new clients." type="uint">10</num_prespawn_children>