Ubuntu

Ubuntu 22.04 DockerでAlfresco

Alfresco 6.1.2 コミュニティエディションを使わせていただいているのだが、2022年4月頃からファイルの保存ができなくなっていた。
原因を探ったけれども、ログから何も分からない。



広告


元々は色々と同居するから節約で、と、Dockerではなく直接手作業でインストールすることを選んだのだけれども、こんな日が来るとは。
アップグレードが大変じゃん…今度はDockerで行こう。

こんなに長い道のりになるとは思わなかった。

Alfrescoのインストール

本番環境に適用する前に、テスト環境で手順を実行する。

サーバーのインストール

仮想PCは、VMware Playerで作成する。
alfresco.hogeserver.hogeddns.jp で名前解決ができるよう、ローカルのDNSを設定してある。

Alfresco.vmx

firmware = "efi"
efi.legacyBoot.enabled = "FALSE"
uefi.secureBoot.enabled = "FALSE"
ulm.disableMitigations="TRUE"

Ubuntu 22.04 Serverをインストールする。

  • テストなので、IPアドレスは固定していない。
  • IPv6も無効にしていない。
$ sudo timedatectl set-timezone Asia/Tokyo
$ sudo apt update; sudo apt -y dist-upgrade; sudo apt -y autoremove
$ sudo reboot

Dockerのインストール

過去に整理した手順でインストールする。

Dockerのインストール。

$ sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
$ echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io
$ docker -v
Docker version 20.10.16, build aa7e414

Docker Composeのインストール。バージョンは2に上がっているようだけれど、今回は1.29.2を利用する。

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose --version
docker-compose version 1.29.2, build 5becea4c

※本日の最新は1.29.2。公式の手順書は最新バージョンに追従するようになっているようなので、そこからコピーしてくるのが良いだろう。

Alfrescoのインストール

コミュニティエディションのインストール方法がこちらに書かれている。
Alfresco Content Service Community / Install using Docker Compose

ウチのデータはみんなMariaDBに管理してもらっている。どうすればいいか…と探していたところ、とても勉強になる記事を発見。
GitHub / keensoft / docker-alfresco

この記事を作戦に組み入れ、提供されているcommunity-docker-compose.ymlを以下のように変更する。

  • Tomcat(alfresco-content-repository-community)のイメージに、MariaDB Connector/Jを追加した新イメージを作る。
  • Tomcatのデーターベース接続設定を、MariaDBに変更する。
  • PostgresをMariaDBに置き換える。

volumeの準備

これは必要とは言えないのだけれども、ログが簡単に見られるようもしておきたい。
ディレクトリのアクセス権が上手く設定できていないと、volume指定したら出力ができなくなるので、先に作っておく。

後から見つけたのだけれども、volume指定についてはこんな記事があった。
Alfresco hub / CONTENT INTEGRITY ERROR
Github / Alfresco / alfresco-docker-installer
インストールの手順書には書かれていないけれども、volume指定は必須のようだ。

$ sudo mkdir -p /var/lib/alfresco/alfresco/logs && \
  sudo chown 0:1000 /var/lib/alfresco/alfresco/logs && \
  sudo chmod 775 /var/lib/alfresco/alfresco/logs
$ sudo mkdir /var/lib/alfresco/alfresco/alf_data && \
  sudo chown 0:1000 /var/lib/alfresco/alfresco/alf_data && \
  sudo chmod 775 /var/lib/alfresco/alfresco/alf_data

$ sudo mkdir -p /var/lib/alfresco/mariadb/logs && \
  sudo chown 999:4 /var/lib/alfresco/mariadb/logs && \
  sudo chmod 2755 /var/lib/alfresco/mariadb/logs
※データーのディレクトリは、権限を自分で書き換えてくれている。

$ sudo mkdir -p /var/lib/alfresco/share/logs && \
  sudo chown 0:0 /var/lib/alfresco/share/logs && \
  sudo chmod 775 /var/lib/alfresco/share/logs
※本当はchmod770だけれども、取り扱いやすくしたい。

$ sudo mkdir -p /var/lib/alfresco/solr6/data && \
  sudo chown 33007:33007 /var/lib/alfresco/solr6/data &&
  sudo chmod 755 /var/lib/alfresco/solr6/data
$ sudo mkdir -p /var/lib/alfresco/solr6/logs && \
  sudo chown 33007:33007 /var/lib/alfresco/solr6/logs && \
  sudo chmod 775 /var/lib/alfresco/solr6/logs
※ログを永続化しようとしたが、ロギング設定ファイルがなくて、上手くいかない。

$ sudo mkdir -p /var/lib/alfresco/nginx/ssl

※所有者とアクセス権は、とりあえず起動できるようにしてから、コンテナに入って確認したもの。

SSL証明書を配置する。ホームラボで利用しているワイルドカード証明書があるので、それを置いた。

  • /var/lib/alfresco/nginx/ssl/cert.crt
  • /var/lib/alfresco/nginx/ssl/cert.key

alfrescoのイメージへのファイル追加準備

MariaDBでデーターを扱えるようにするため、alfrescoのイメージにコネクタを追加する。
また、LDAPSの認証で利用するため、ホームラボで使用している自己署名したCA証明書を登録する。

作業ディレクトリを~/workとして…

$ mkdir ~/work
$ cd ~/work

Tomcat(alfresco-content-repository-community)を作成するためのディレクトリを作る。

$ mkdir -p alfresco/lib
$ mkdir alfresco/anchors

まず、コネクタをこちらからダウンロードしてくる。分かりづらい感じだったけれども、ダウンロードからJava 8+を選択してくれば良かった。
この日は、2.7.5GAと3.0.5GAが選択できたのだけれど、2.7.5GAをダウンロードしてきている。
MariaDB / About MariaDB Connector/J
これを展開し、mariadb-java-client-2.7.5.jarを~/work/alfresco/libにコピーする

続いて、自己署名したCA証明書(hogeserver-ca.crt)を~/work/alfresco/anchorsにコピーする。
LDAPを利用する等、自己署名したCA証明書が必要ない場合は不要。

alfresco-content-repository-community:7.3.0-A2をベースとして、コネクタを配置し、証明書を登録したイメージを作るだけのDockerfileを作る。
~/work/alfresco/Dockerfile ※新規作成

FROM alfresco/alfresco-content-repository-community:7.3.0-A2
COPY ./lib /usr/local/tomcat/lib
COPY ./anchors /usr/share/pki/ca-trust-source/anchors
USER root
RUN update-ca-trust

※下3行は、自己署名したCA証明書が必要ない場合は不要。

shareのイメージへのファイル追加準備

コミュニティー版では、管理画面からユーザー検索ができない不具合が発生するので、これに対策する。
Github / Alfresco / acs-community-packaging / Can't list users in admin tools #367

shareを作成するためのディレクトリを作る。

$ mkdir -p share/extension

~/work/share/Dockerfile ※新規作成

FROM alfresco/alfresco-share:7.3.0-A2
COPY ./extension /usr/local/tomcat/shared/classes/alfresco/web-extension/

~/work/share/extension/share-config-custom-dev.xml ※新規作成

<?xml version='1.0' encoding='UTF-8'?>
<alfresco-config>
   <config evaluator="string-compare" condition="Users" replace="true">
      <users>
         <username-min-length>2</username-min-length>
         <password-min-length>3</password-min-length>
         <!-- fix/workaround for https://github.com/Alfresco/acs-community-packaging/issues/367 -->
         <show-authorization-status>false</show-authorization-status>
      </users>
      <enable-external-users-panel>false</enable-external-users-panel>
   </config>
</alfresco-config>

transformのイメージへのファイル追加準備

※2022/06/17追記

日本語フォントが入っていないため、プレビューに豆腐が表示される。
そこで、フォントファイルを追加する。
Qiita / Alfrescoのファイルプレビュー機能で日本語が文字化けする問題の対処法

ディレクトリを作る。

$ mkdir transform

~/work/transform/Dockerfile ※新規作成

FROM alfresco/alfresco-transform-core-aio:2.6.0
USER root
RUN yum install -y ipa-gothic-fonts ipa-pgothic-fonts

これで、形はともかく日本語フォントがインストールされる。

docker-compose.ymlの作成

準備ができたので、community-docker-compose.ymlをダウンロードし、それをベースにdocker-compose.ymlを作成する。

docker-compose.ymlに設定する環境変数について、ここに記載されていた。
Github / Alfresco / acs-deployment / Alfresco Content Services Docker Compose Deployment
Github / Alfresco / acs-deployment / Alfresco Content Services Property Reference(リンク切れ)

それぞれのイメージはタグ指定されていたが、こちらを調べて安定してそうなバージョンのタグを書いたら良いと思う。
https://hub.docker.com/u/alfresco

ymlファイルの中に、image: quay.io/alfresco/alfresco-content-app:2.10.0が含まれていたが、このquay.io/というのは、コミュニティー版では使えない。
ymlファイルの中にquay.io/の記述があると、このようなエラーが表示される。

Pulling content-app (quay.io/alfresco/alfresco-content-app:2.10.0)...
ERROR: unauthorized: access to the requested resource is not authorized

※ymlファイルの中のquay.io/を削除すれば、この問題は解消される。

~/work/docker-compose.yml

version: "2"

services:
  alfresco:
#   image: alfresco/alfresco-content-repository-community:7.3.0-A2 ※Dockerfileでこれを指定している。
    image: alfresco-custom:latest
    build: ./alfresco
    container_name: alfresco
    restart: always
    volumes:
      - /var/lib/alfresco/alfresco/alf_data:/usr/local/tomcat/alf_data
      - /var/lib/alfresco/alfresco/logs:/usr/local/tomcat/logs
    mem_limit: 1900m
    environment:
      JAVA_TOOL_OPTIONS: "
        -Dencryption.keystore.type=JCEKS
        -Dencryption.cipherAlgorithm=DESede/CBC/PKCS5Padding
        -Dencryption.keyAlgorithm=DESede
        -Dencryption.keystore.location=/usr/local/tomcat/shared/classes/alfresco/extension/keystore/keystore
        -Dmetadata-keystore.password=mp6yc0UD9e
        -Dmetadata-keystore.aliases=metadata
        -Dmetadata-keystore.metadata.password=oKIWzVdEdA
        -Dmetadata-keystore.metadata.algorithm=DESede
        "
      JAVA_OPTS: "
        -Ddb.driver=org.mariadb.jdbc.Driver
        -Ddb.url=jdbc:mariadb://mariadb:3306/alfresco?useUnicode=yes'&'characterEncoding=UTF-8
        -Ddb.username=alfresco
        -Ddb.password=alfresco
        -Ddb.pool.max=275
        -Dsolr.host=solr6
        -Dsolr.port=8983
        -Dsolr.http.connection.timeout=1000
        -Dsolr.secureComms=secret
        -Dsolr.sharedSecret=secret
        -Dsolr.base.url=/solr
        -Dindex.subsystem.name=solr6
        -Dshare.host=alfresco.hogeserver.hogeddns.jp
        -Dshare.port=443
        -Dshare.protocol=https
        -Dalfresco.host=localhost
        -Dalfresco.port=8080
        -Daos.baseUrlOverwrite=https://alfresco.hogeserver.hogeddns.jp/alfresco/aos
        -Dmessaging.broker.url=\"failover:(nio://activemq:61616)?timeout=3000&jms.useCompression=true\"
        -Ddeployment.method=DOCKER_COMPOSE
        -DlocalTransform.core-aio.url=http://transform-core-aio:8090/
        -Dcsrf.filter.enabled=false
        -XX:MinRAMPercentage=50 -XX:MaxRAMPercentage=80
        "

  transform-core-aio:
#   image: alfresco/alfresco-transform-core-aio:2.6.0 ※Dockerfileでこれを指定している。
    image: transform:latest
    build: ./transform
    container_name: transform
    restart: always
    mem_limit: 1536m
    environment:
      JAVA_OPTS: "
        -XX:MinRAMPercentage=50 -XX:MaxRAMPercentage=80
        -Dserver.tomcat.threads.max=2 ※デフォルトでは4スレッドで動作し、最大12スレッドになっていた。
        -Dserver.tomcat.threads.min=1

        -Dlogging.level.org.alfresco.transform.router.TransformerDebug=ERROR
      "
    ports:
      - "8090:8090"

  share:
#   image: alfresco/alfresco-share:7.3.0-A2 ※Dockerfileでこれを指定している。
    image: share-custom:latest
    build: ./share
    container_name: share
    restart: always
    volumes:
      - /var/lib/alfresco/share/logs:/usr/local/tomcat/logs
    mem_limit: 1g
    environment:
      REPO_HOST: "alfresco"
      REPO_PORT: "8080"
      USE_SSL: "true"
      JAVA_OPTS: "
        -XX:MinRAMPercentage=50
        -XX:MaxRAMPercentage=80
        -Dalfresco.host=localhost
        -Dalfresco.port=8080
        -Dalfresco.context=alfresco
        -Dalfresco.protocol=http
        "

#  postgres:
#    image: postgres:13.3
#    mem_limit: 512m
#    environment:
#      - POSTGRES_PASSWORD=alfresco
#      - POSTGRES_USER=alfresco
#      - POSTGRES_DB=alfresco
#    command: postgres -c max_connections=300 -c log_min_messages=LOG
#    ports:
#      - "5432:5432"

  mariadb:
    image: mariadb:10.8.3
    container_name: mariadb
    restart: always
    volumes:
      - /var/lib/alfresco/mariadb/data:/var/lib/mysql
      - /var/lib/alfresco/mariadb/logs:/var/log/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=alfresco
      - MYSQL_DATABASE=alfresco
      - MYSQL_USER=alfresco
      - MYSQL_PASSWORD=alfresco
    command: [mysqld, --max-connections=275, --character-set-server=utf8, --collation-server=utf8_bin, --wait_timeout=28800]
    ports:
      - "3306:3306"

  solr6:
    image: alfresco/alfresco-search-services:2.0.3
    container_name: solr6
    restart: always
    volumes:
      - /var/lib/alfresco/solr6/data:/opt/alfresco-search-services/data
    mem_limit: 2g
    environment:
      # Solr needs to know how to register itself with Alfresco
      SOLR_ALFRESCO_HOST: "alfresco"
      SOLR_ALFRESCO_PORT: "8080"
      # Alfresco needs to know how to call solr
      SOLR_SOLR_HOST: "solr6"
      SOLR_SOLR_PORT: "8983"
      # Create the default alfresco and archive cores
      SOLR_CREATE_ALFRESCO_DEFAULTS: "alfresco,archive"
      # HTTPS or SECRET
      ALFRESCO_SECURE_COMMS: "secret"
      # SHARED SECRET VALUE
      JAVA_TOOL_OPTIONS: "
          -Dalfresco.secureComms.secret=secret
      "
    ports:
      - "8083:8983" # Browser port

  activemq:
    image: alfresco/alfresco-activemq:5.16.4-jre11-centos7
    container_name: activemq
    restart: always
    mem_limit: 1g
    ports:
      - "8161:8161" # Web Console
      - "5672:5672" # AMQP
      - "61616:61616" # OpenWire
      - "61613:61613" # STOMP

  content-app:
    image: alfresco/alfresco-content-app:2.10.0
    container_name: content
    restart: always
    mem_limit: 128m
    environment:
      APP_BASE_SHARE_URL: "http://localhost:8080/aca/#/preview/s"

  proxy:
    image: alfresco/alfresco-acs-nginx:3.4.2
    container_name: nginx
    restart: always
    volumes:
      - /var/lib/alfresco/nginx/ssl:/etc/nginx/ssl
    mem_limit: 128m
    environment:
      DISABLE_PROMETHEUS: "true"
      DISABLE_SYNCSERVICE: "true"
      DISABLE_ADW: "true"
      DISABLE_CONTROL_CENTER: "true"
      ENABLE_CONTENT_APP: "true"
      USE_SSL: "true"
      DOMAIN: "alfresco.hogeserver.hogeddns.jp"
    depends_on:
      - alfresco
      - content-app
    ports:
#     - "8080:8080"
      - "443:443"
    links:
      - content-app
      - alfresco
      - share

※その日のバージョンをよく見て、変更点(赤文字)を参考に必要箇所を書き換える。

Alfrescoの実行と追加設定

準備ができたので、コンテナを起動する。

$ sudo docker-compose up --build

※-buildで、Dockerfileで定義したものを構築し、起動する。

SSLを使用する場合、USE_SSL="true"を設定してくのだが、これを設定すると、コンテナ起動時に設定を書き換える。
この処理は、初回起動時に動作して欲しいが、2回目以降は動いてはいけないのだけれども、それを永続的な形で処理させる方法を思いつかなかったので、コンテナを作ったら、その都度修正することにした

他のターミナルを開いて、shareの中に入る。

$ sudo docker exec -it share /bin/sh

一度動いて設定ファイルが修正されている訳なので、この書き換え処理を止めてしまう。
/usr/local/tomcat/shared/classes/alfresco/substituter.sh

#if [[ $USE_SSL == "true" ]]; then
#sed -ie 's_port="8080"_port="8080" scheme="https"_' /usr/local/tomcat/conf/server.xml
#fi
…

アクセステスト

ブラウザで

  • https://alfresco.hogeserver.hogeddns.jp/alfresco
  • https://alfresco.hogeserver.hogeddns.jp/share ※user:admin / password:admin

にアクセスしてみる。

alfrescoにアクセスできない時には、何か設定に漏れがある(何度も色々と試したが、結局設定漏れがあるとアウト)。
よくよく見直して、コンテナやvolumeを削除し、改めてやり直す。

$ sudo docker container ls -a ※コンテナを一覧表示
$ sudo docker container rm nginx content solr6 transform share mariadb alfresco activemq

$ sudo rm -r /var/lib/alfresco/* ※的な感じで、できあがっているデーターを消す

旧環境から新環境への移行

旧環境のLDAP連携を新環境にも入れ、データーを旧環境から持ってくる。

LDAP連携の認証

ホームラボではSamba AD DCが稼働しており、今まで使っていたAlfresco 6.1は、LDAPS認証ができるようにしてある。
同じ設定を入れていく。

6/12に構築してデーターを復元したが、6/13にユーザーが全員消える問題が発生。
各ユーザーがShareでログインしたら、ユーザーが自動で作られて復旧できたので良かったが、ちょっとびっくりした。
同期が上手くいっていない可能性があり、継続確認中。

以前入れた設定を少し手直しして、ymlに入れてみる。
~/work/docker-compose.yml

version: "2"

services:
  alfresco:
    …
    environment:
      …
      JAVA_OPTS: "
        -Ddb.driver=org.mariadb.jdbc.Driver
        …
        -XX:MinRAMPercentage=50 -XX:MaxRAMPercentage=80
        -Dldap.authentication.active=true
        -Dldap.authentication.allowGuestLogin=false
        -Dldap.authentication.userNameFormat=%s@hogeserver.hogeddns.jp
        -Dldap.authentication.java.naming.provider.url=ldaps://addc.hogeserver.hogeddns.jp
        -Dldap.authentication.defaultAdministratorUserNames=ssoauth
        -Dldap.synchronization.active=true
        -Dldap.synchronization.java.naming.security.authentication=simple
        -Dldap.synchronization.java.naming.security.principal=ssoauth@hogeserver.hogeddns.jp
        -Dldap.synchronization.java.naming.security.credentials=<ssoauth君のパスワード>
        -Dldap.synchronization.userSearchBase=\"cn=users,dc=hogeserver,dc=hogeddns,dc=jp\"
        -Dldap.synchronization.personQuery=\"(&(objectclass=user)(userAccountControl:1.2.840.113556.1.4.803:=512))\"
        -Dldap.synchronization.personDifferentialQuery=\"(&(objectclass=user)(userAccountControl:1.2.840.113556.1.4.803:=512)(!(whenChanged<={0})))\"
        -Dldap.synchronization.groupSearchBase=\"cn=users,dc=hogeserver,dc=hogeddns,dc=jp\"
        -Dldap.synchronization.groupQuery=\"(&(objectclass=group)(!(isCriticalSystemObject=true)))\"
        -Dldap.synchronization.groupDifferentialQuery=\"(&(objectclass=group)(!(isCriticalSystemObject=true))(!(whenChanged<={0})))\"
        -Dldap.synchronization.modifyTimestampAttributeName=whenChanged
        -Dldap.synchronization.timestampFormat=\"yyyyMMddHHmmss'.0Z'\"
        "
…

設定変更できたら、すべてのコンテナを一旦止めて、改めて起動して、環境変数を反映させる。

$ sudo docker-compose up

起動すると、グループが同期され、ユーザーはログイン時に作られるようになっていた。
ただ…動いてはいるけれども、例外発生しているときもあるみたいなので、もう少し見直しが必要っぽい。

現在稼働中のシステムはファイル登録ができなくなっていたので、早速共有ファイルに適当なファイルをアップロードしてみたが、問題なくアップロードができた。

コンテンツの復元

現在稼働中のシステムはファイルが登録できなくなっているので、バックアップは4月から変化していない。
リストアするという観点では、安心。

すべてのコンテナを停止する。コンソールで起動したままならば、[CTRL]+[C]で停止。
非同期で起動したなら、以下のコマンドで止める。

$ sudo docker-compose stop

バックアップデーターを持ってくる

ホームラボはサーバーリソースもネットワークも貧弱なので、ゆっくりバックアップを作って、ゆっくりNASに保管している
ここからファイルを持ってくる。

$ sudo apt install cifs-utils unzip
$ mkdir backup
$ sudo mount -o username=$BK_USER,password=$BK_PASS,vers=2.0 //linkstation/backup ./backup
$ sudo cp backup/backup-file-name.zip ./
$ sudo umount ./backup

※$BK_USER, $BK_PASSに、NASのユーザーパスワードをセットしている。

コンテンツを復元

構築中の環境にあるコンテンツを削除し、展開したバックアップデーターを配置。

$ unzip backup-file-name.zip
$ sudo rm -r /var/lib/alfresco/alfresco/alf_data/
$ sudo mv usr/share/alfresco/alf_data /var/lib/alfresco/alfresco/
$ sudo chown root:1000 /var/lib/alfresco/alfresco/alf_data
$ sudo chown root:root -R /var/lib/alfresco/alfresco/alf_data/*
$ sudo chmod 750 -R /var/lib/alfresco/alfresco/alf_data/*

※前回構築当時とパーミッションが違う?削除前に確認したものを設定してみている。

データーベースを復元

先程のバックアップの中にダンプファイルもあるので、それを取り込む。
MariaDBを起動し、IPアドレスを確認する。

$ sudo docker start mariadb
$ sudo docker inspect mariadb
…
            "Networks": {
                "work_default": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": [
                        "c1289f3e07ff",
                        "mariadb"
                    ],
                    "NetworkID": "81da8d0a16565889f11839c46eea631f2f9314bfbe862b4e79c6d5245a7ce55b",
                    "EndpointID": "435566ec36cc2573803e4e8e3cc7a604ac113e41ba16323e347756260a34c2ba",
                    "Gateway": "172.21.0.1",
                    "IPAddress": "172.21.0.2",
                    "IPPrefixLen": 16,
…

MariaDBのクライアントをインストールして、接続テスト。

$ sudo apt install mariadb-client
$ mysql -h 172.21.0.2 -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 10.8.3-MariaDB-1:10.8.3+maria~jammy mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> quit
Bye

データーを復元する。

$ mysql -h 172.21.0.2 -u alfresco -palfresco -D alfresco < root/work/backup/alfresco.dmp
ERROR 1064 (42000) at line 2320: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'Process 97361 detected

エラーが出た行を確認したところ、dmpの結果表示がされていただけだった。
データーはインポートできている。

MariaDBを止める。

$ sudo docker stop mariadb

Solr6のデーター復元

これは…ウチの場合はたいした量じゃないので、作り直しがベストだろうと考えた。
現在の検索データーをクリアして、箱を用意しておけば、作り直してくれる。

$ sudo rm -r /var/lib/alfresco/solr6 && \
  sudo mkdir -p /var/lib/alfresco/solr6/data && \
  sudo chown 33007:33007 /var/lib/alfresco/solr6/data &&
  sudo chmod 755 /var/lib/alfresco/solr6/data

インデックスが大きい場合には復元を真面目に考えた方が良いのだろうけれど、稼働中にガンガン作ってくれるから、まぁいいかーと。

動作確認

改めて、Alfrescoを起動。

$ sudo docker-compose up

これで問題なく動作し始めた。

CSRF対応

もともと1つの環境(hogeserver.hogeddns.jp)で動かしていたサービスを、複数の環境(hogeserver.hogeddns.jp & alfresco.hogeserver.hogeddns.jp)に分割した訳なのだが、アクセスURLを変更するとユーザーへの影響がある。
そこで、ApacheのProxy設定を内部→新環境に宛先変更。

そうなると、CSRFのチェックでエラーが発生する。

そこで、CSRFを無視する設定を入れる。
Alfresco Hub / ACS - Forum / Fresh install of alfresco: CSRF problem

~/work/docker-compose.yml

version: "2"

services:
  alfresco:
…
    environment:
…
      JAVA_OPTS: "
…
        -Dldap.synchronization.timestampFormat=\"yyyyMMddHHmmss'.0Z'\"
        -Dcsrf.filter.enabled=true
        -Dcsrf.filter.origin=\"https://hogeserver.hogeddns.jp\"
        -Dcsrf.filter.referer=\"https://hogeserver.hogeddns.jp/.*\"
        "
…
  share:

    …
    environment:
      …
      CSRF_FILTER_REFERER: "https://hogeserver.hogeddns.jp/.*"
      CSRF_FILTER_ORIGIN: "https://hogeserver.hogeddns.jp"

ざっくりいうと、Alfrescoの方に入れた変更は、ケータイアプリや文書登録用のスクリプトに影響する。
Shareの方に入れた変更は、そちらに影響する。

本番への移行

本番環境の構築

せっかくDockerで環境を作ったけれども、手順の確認もしようと思ったので、本番環境で同じ手順を実施してみた。

ファイアウォールはとりあえずこの程度にして、他に必要になったら解放。

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       192.168.10.0/24
443/tcp                    ALLOW       192.168.10.0/24

※IPアドレスはマスクしており、とりあえず、ローカルだけからSSHとHTTPSでアクセスできるようにしてみた。

この後、手順を確認しながら本番環境を構築した。

スマホアプリの変更

構築できたので、スマホアプリでアクセスしてみたら…2022/12/1からサポートが終了、と表示された。
そこで、新しいアプリをインストールした。

旧: Alfresco Content Services
新: Alfresco Mobile Workspace

まず、旧アプリでは、新環境にアクセスができなかった。
何かエラーが出ていたけれども、新アプリがあるからいいや…と、気にしないことにした。

新アプリでは、接続先として

hogeserver.hogeddns.jp ※https://の入力がいらなかった。入力しても問題はない。

を入力して接続すれば、ユーザーIDとパスワードを聞かれ、ログインできればアカウント情報を保存してくれた。

至極快適に動作するように見えたが、一部のディレクトリで中身が見えない問題が発生した。
次節に続く。

データーエラーの解消

どうも、既存のデーターは壊れていたようだ。
新バージョンで文書を開けてみると、タグが読めないケースがいくつかあった。

この場合…

  • PCのブラウザでShareを使ってアクセスする分には、すべてのファイルが見える。
    ドキュメントを開いたときに、タグが読めないエラーが発生する。
    ファイルのダウンロードは可能。
  • 新スマホアプリでは、エラーが発生する文書があると、中身が全部見えなくなる(場合がある)。

となった。

問題を回避するため、既存のサイトは「凍結」と名前を付け、新しいサイトを作ってファイルを登録し直した。
本当は履歴が取れていることが魅力な訳だけれども、見えないんじゃしょうがない。

文書登録スクリプトの手直し

ホームラボにはBrotherの複合機があり、スキャンした画像をサーバーに保管している
そして、サーバーで動作するスクリプトがPDFをAlfrescoに自動登録している

このスクリプトが、同じサーバーにAlfrescoがある前提で、localhostに向けて処理を仕様としていたので修正。
あわせて、作り直したサイトに登録先を変更した。

以上で、本番運用を再開できた。

課題

色々と課題は残っている。

  • alfrescoコンテナが、時々例外を送出している。
  • 過去データーの「タグが見えない」問題が何故発生しているのかが分からない。
  • WordやExcelのプレビューPDFで、日本語コードが豆腐になっている。
    • 日本語を表示できるフォントをインストールして解決。※2022/06/17
  • Transformコンテナがコード137で終了することがある。
    • デフォルト設定で12スレッドがサムネイル変換していたが、そこで落ちていた(真の原因は不明)。
    • 1スレッドで待ち受け、最大2スレッドで動作するようにして問題を回避。※2022/06/18
  • デジタル一眼で撮影した画像のサムネイルが表示できない。(6/13)
    • Transformコンテナが落ちていたのが原因。↑項目の対策で回避。※2022/06/18
  • Solrの管理画面にアクセスできていない(ブラウザにアドオンを入れて、ヘッダーを追加するらしいが…)
  • PDF tool kitが動かない(もう、開発は止まっていそうだけれども)。
  • そもそも、アドオンのインストール方法が見えていない。
  • スマホアプリから共有フォルダにアクセスできなくなった(6/13)
    • PCのShareで共有フォルダをお気に入りに追加し、スマホアプリでお気に入りを表示させたら見えた。
    • Nginxのログを見ていると、お気に入りからだと
      /alfresco/api/-default-/public/alfresco/versions/1/nodes/fc320646-12e0…
      にアクセスしており、Sharedにアクセスすると
      /alfresco/api/-default-/public/alfresco/versions/1/shared-links?…
      にアクセスしていた。違う場所になってしまっているようだ。
    • まっさら環境に戻してみたけれども変わらない。何か設定が漏れているのだろう。
  • 色々なコンテナがINFOレベルのログを出力している。(6/18) ※解決できず
    • 調べてみたけれども、docker-compose.ymlには設定項目がないようだった。これ?と思う値を設定してみても、結果は変わらなかった。

有識者に色々と聞いてみたいところ。

やったこと

コンテナに入る

ログ出力ができないとコンテナが落ちる。
データーの整合性チェックを行っているとかで、volume指定を外しても、二度と起動しないケースもあった(勘違いかもしれないけれど…とにかくコンテナが起動してこない)。

ログ出力ができないのは権限だよね…ということで、volume指定を止めて起動し直し、中に入ってアクセス権を確認。
何度も何度も繰り返したけれども、コマンドそのものをいつも忘れてしまうのでメモ。

$ sudo docker exec -it alfresco /bin/sh --login
$ sudo docker exec -it transform /bin/sh --login
$ sudo docker exec -it share /bin/sh --login
$ sudo docker exec -it solr6 /bin/sh --login
$ sudo docker exec -it nginx /bin/sh --login
$ sudo docker exec -it mariadb /bin/bash --login

※bashはなかった。

/bin/shのパラメーターとして--login(-lでもOK)を付けると、ログインシェルとして起動されたように振る舞ってくれる。
たとえば、alfrescoコンテナでは ll が使えたりする。

とにかくリセット

alfrescoコンテナが起動してこない、shareが起動してこない…等々、トラブル多数。
手に負えないときは、一旦リセットしてやり直し。

  • コンテナをすべて削除する。
    sudo docker container rm alfresco share mariadb …
  • ボリュームを削除する。
    本編で書いた手順で削除・作り直し。
  • 自動で作られる不要なボリュームを削除する。
    sudo docker volume prune
  • docker-compose.ymlからvolume指定をすべて外す。

今回も、まずは起動する状態に戻して、そこから何が問題なのかを探っていく、という作業の繰り返しだった。

2回目以降でShareが起動しない

その後に、SSLの設定をはじめたら、shareが2回目から起動しない。
2回目以降に発生する問題だと気付くのに、だいぶ時間が掛かったけれども…

share                 | 11-Jun-2022 07:11:44.972 WARNING [main] org.apache.catalina.startup.Catalina.parseServerXml Unable to load server configuration from [/usr/local/tomcat/conf/server.xml]
share                 |         org.xml.sax.SAXParseException; systemId: file:/usr/local/tomcat/conf/server.xml; lineNumber: 69; columnNumber: 57; Attribute "scheme" was already specified for element "Connector".
share                 |                 at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1243)
…
share exited with code 1

shareをinspectして、最初に起動するスクリプトを確認してみたところ、SSLを使う場合に以下の書き換えが行われたいた。
既に設定が修正されているかどうかをみていない…

そこで、起動1回目にshareに入って以下の編集してみたところ、問題が解消した。

/usr/local/tomcat/shared/classes/alfresco/substituter.sh

#if [[ $USE_SSL == "true" ]]; then
#sed -ie 's_port="8080"_port="8080" scheme="https"_' /usr/local/tomcat/conf/server.xml
#fi
…

いつ変更されるか分からないスクリプトだし、修正方法が思いつかない。
面倒ではあるけれども、コンテナを作ったらこの処理を実行することにした。

ユーザーが検索できない問題の解消

adminで入ったが、管理ツールでユーザーが検索できない。
Alfresco Hub / ACS - Forum / Cannot list users

ここに書かれている設定で修正ができるように見えたが、変更しても効果がない…

share: webapps/share/WEB-INF/classes/alfresco/share-config.xml

<show-authorization-status>true</show-authorization-status>
を
<show-authorization-status>false</show-authorization-status>

もう少し探してみたところ、ファイルを追加する方法を教えてくれていたので、これを使って問題を解消した。
手順は本編に記載したもの。

自動起動の設定

サーバーの電源を入れたときや、再起動したときに、Alfrescoが自動で立ち上がってきて欲しい。

$ sudo docker update --restart=always nginx content solr6 transform share mariadb alfresco activemq

ただし、これだとdocker-compose upすると、フラグが外れてしまう。
そのため、docker-compose.ymlの中で指定するようにした。

6.1のインストールは失敗

古いバージョンなこともあって、既にアーカイブされているけれども…
GitHub / AlfrescoArchive / acs-community-deployment

ここから、docker-compose.ymlを持ってきて読んでみたところ、データーベースがPostgreSQLだ。
ウチはMariaDB 10.1…。

探してみると、変更方法を教えてくれている方が!
GitHub / keensoft / docker-alfresco

…
services:
    alfresco:
        image: alfresco/alfresco-content-repository-community:6.1.2-ga
        mem_limit: 1500m
        build: ./alfresco
        depends_on:
            - db
        environment:
            JAVA_OPTS : "
                -Ddb.driver=org.mariadb.jdbc.Driver
                -Ddb.username=alfresco
                -Ddb.password=alfresco
                -Ddb.url=jdbc:mariadb://db:3306/alfresco?useUnicode=true\&characterEncoding=UTF-8
                -Dsolr.host=solr6
                -Dsolr.port=8983
                -Dsolr.secureComms=none
                -Dsolr.base.url=/solr
                -Dindex.subsystem.name=solr6
                -Dshare.host=localhost
                -Dalfresco.port=8082
                -Daos.baseUrlOverwrite=http://localhost:8082/alfresco/aos
                -Dmessaging.broker.url=\"failover:(nio://activemq:61616)?timeout=3000&jms.useCompression=true\"
                -Ddeployment.method=DOCKER_COMPOSE
                -Dcsrf.filter.enabled=false
                -Xms1g -Xmx1g
                "
        ports:
            - 8082:8080 #Browser port
…
    db:
      image: mariadb:latest
      container_name: mariadb:10.2.44
      volumes:
        - ./volumes/data/mariadb_data:/var/lib/mysql
        - ./volumes/logs/mariadb:/var/log/mysql
      environment:
        - MYSQL_ROOT_PASSWORD=alfresco
        - MYSQL_DATABASE=alfresco
        - MYSQL_USER=alfresco
        - MYSQL_PASSWORD=alfresco
      networks:
        - internal
      command: [mysqld, --character-set-server=utf8, --collation-server=utf8_bin, --wait_timeout=28800]

#    postgres:
#        image: postgres:10.1
#        mem_limit: 1500m
#        environment:
#            - POSTGRES_PASSWORD=alfresco
#            - POSTGRES_USER=alfresco
#            - POSTGRES_DB=alfresco
#        command: postgres -c max_connections=300 -c log_min_messages=LOG
#        ports:
#            - 5432:5432
…

MariaDB Connector/J をダウンロードしてくるように書かれている。
現在の最新は3のようだけれども、2をダウンロードしておく。

Alfrescoの起動。

$ sudo docker-compose up -d
ERROR: build path /home/rohhie/work/alfresco either does not exist, is not accessible, or is not a valid URL.

だが、なんと…もう、古すぎるらしく、ものがなかった。

MariaDBの最適化

MariaDBを使っていて、最適化は一度も行っていない状態。

$ sudo mysql
MariaDB [(none)]> select table_schema, table_name, data_free, table_rows from information_schema.tables;

※これでdata_freeが多いテーブルを最適化してみる。
MariaDB [(none)]> optimize table zabbix.trends;

最適化中は、テーブルがロックされるとのこと。

これで、全テーブルいけるようだ。

$ mysqlcheck -o --all-databases

実行中にこんなメッセージが表示される。

kopanoserver.outgoingqueue
note     : Table does not support optimize, doing recreate + analyze instead
status   : OK

これは、最適化をサポートしていないので、テーブルを作り直しているとのことで、結果としては最適化された状態になるようだった。

さいごに

示された手順書には、最低限の起動方法が書かれているけれども、例えばHTTPSを使えるようにするだけでも情報を探すのが大変だった。
以前に書いた記事に今でもごアクセスいただいている背景には、そういう事情もありそう。

今回、ようやくDockerで環境構築ができるようになったので、今後は最新版への追従も楽になるかなー。

広告

コメントはこちらから お気軽にどうぞ ~ 投稿に関するご意見・感想・他