在EC2上完成单服务器部署的【Folio LSP】教程(完整版)
2020年第3季度的支持
开场白
-
- この記事では、Folioのチュートリアルのうち、Single Server DeploymentをEC2で実行する場合の紹介をします。
-
- ここでは、Complete版をデプロイします。
-
- Edge modulesは対象外としています。
Core版と比較すると以下が違ってきますが、この記事に沿って作っていけば大丈夫です。
cloneしてくるリポジトリとそれに伴うパスの変更
必要なRAMの容量
runbookのスクリプトの種類(core版ではなくcomlete版を使う)
如果路径错误,请根据需要适时更改。
- 元ネタ https://github.com/folio-org/folio-install/tree/master/runbooks/single-server#folio-deployment-single-server
如果你先看一下下面的内容,可能会更容易理解。
-
- Vagrant/VirtualBoxでSingle Server Deploymentチュートリアルを実行する(https://qiita.com/ayungn/items/f84e55893b7817af15a7)
- チュートリアルで出てくるCURLオプション(https://qiita.com/ayungn/items/f713f3a142f093a63e0e)
解释:在本书中,作者用一个小标题“凡例”进行了一些说明和规定。
参考信息:
与核心版或虚拟机版不同的步骤以及易于出错的地方。
问答
-
- 元ネタの中にmainbar/sidebarとありますが、mainbar/sidebarとは何ですか?
sidebarを実行すると「最新スナップショット」をもとにしたビルドができます。mainbarは四半期に一度のリリースをもとにビルドします。
plartform-core/platform-completeとは何ですか?
platform-coreは基本機能、platform-comleteは全機能をビルドします。バックエンドモジュールの数でいうとplatform-coreは25、platform-completeは55です。この記事では、platform-coreのビルドについて説明します。
大致的流程 (Dà zhì de
-
- 准备EC2
-
- 在EC2中配置环境(包括Okapi、Postgre、Java、Docker引擎等)
-
- 创建Folio的租户(diku)
-
- 构建Stripes
-
- 通过Okapi拉取租户使用的模块的Docker镜像
- 准备示例记录
准备EC2。
请您自行承担课金等责任,并进行执行。
启动实例
选择
选择实例类型为t2.2xlarge(8个虚拟核心,32GiB内存)。
需要比core版更大的实例。
点击”确认和创建”
按下「启动」
因为要从本地连接到EC2上SSH,所以需要获取密钥对。
点击“创建实例”。
确认实例
确认公共IP和私有IP。
安全组链接在这里。
停止实例后,公共IP会更改,所以请注意。您可以使用弹性IP进行固定,但请注意计费方式。重新启动的情况下,公共IP应该不会更改。
设置安全组
我打开端口。
点击“添加规则”
描述以下规则(这个描述有点过于开放。之后会进行编辑)。
点击“保存规则”。
使用SSH协议连接到EC2
使用在实例设置时获取的密钥和公共IP,在您喜欢的方式下进行连接。
在Win 10的PowerShell中,您可以使用以下方法进行连接。
ssh -i <保存した秘密鍵へのパス> ubuntu@<パブリックIP>
Linux主机的构建
将此教程所需的脚本等克隆到合适的目录中的存储库。
git clone https://github.com/folio-org/folio-install
cd folio-install
git checkout q3-2020
cd runbooks/single-server
请将 folio-install/runbooks/single-server/scripts/nginx-stripes-complete.conf 复制为 nginx-stripes.conf。
cp ~/folio-install/runbooks/single-server/scripts/nginx-stripes-complete.conf ~/folio-install/runbooks/single-server/scripts/nginx-stripes.conf
安装和配置必要的软件包。
运行环境要求:Java 11、nginx(Engine X)、PostgreSQL 10、Docker。
①更新 apt cache
sudo apt-get update
安装Java8和nginx,并将Java11设置为系统默认版本。
sudo apt-get -y install openjdk-11-jdk nginx
sudo update-java-alternatives --jre-headless --jre --set java-1.11.0-openjdk-amd64
【20201207】从Java 8升级至Java 11。
导入PostgreSQL的密钥,添加PostgreSQL的apt存储库,并安装PostgreSQL。
[20201207] 删除以下内容:
sudo add-apt-repository “deb http://security.ubuntu.com/ubuntu xenial-security main”
sudo apt-get update
sudo apt-get install libicu55
wget –quiet -O – https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add –
sudo add-apt-repository “deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main”
sudo apt-get update
sudo apt-get -y install postgresql-10 postgresql-client-10 postgresql-contrib-10 libpq-dev
以下是一种可能的中文翻译:
[20201207] 删除以下内容:
sudo add-apt-repository “deb http://security.ubuntu.com/ubuntu xenial-security main”
sudo apt-get更新
sudo apt-get安装libicu55
wget –quiet -O – https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add –
sudo add-apt-repository “deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main”
sudo apt-get更新
sudo apt-get -y安装postgresql-10 postgresql-client-10 postgresql-contrib-10 libpq-dev
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo add-apt-repository "deb http://apt.postgresql.org/pub/repos/apt/ focal-pgdg main"
sudo apt-get update
sudo apt-get -y install postgresql-10 postgresql-client-10 postgresql-contrib-10 libpq-dev
④进行PostgreSQL的配置,以便能够从Docker进行连接。
-
- /etc/postgresql/10/main/postgresql.confの「Connection Settings」にlisten_addresses = ‘*’を追記
-
- /etc/postgresql/10/main/postgresql.confの「max_connections」を増やす(例:500)[20201203追記]
-
- /etc/postgresql/10/main/pg_hba.confにhost all all 0.0.0.0/0 md5を追記
- PostgreSQLをsudo systemctl restart postgresqlでリスタート
sudo vim /etc/postgresql/10/main/postgresql.conf
sudo vim /etc/postgresql/10/main/pg_hba.conf
sudo systemctl restart postgresql
⑤导入Docker的密钥并添加Docker apt存储库,安装Docker引擎。
sudo apt-get -y install apt-transport-https ca-certificates gnupg-agent software-properties-common
wget --quiet -O - https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get -y install docker-ce docker-ce-cli containerd.io
⑥Docker引擎的配置.
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo cp ~/folio-install/runbooks/single-server/scripts/docker-opts.conf /etc/systemd/system/docker.service.d
sudo systemctl daemon-reload
sudo systemctl restart docker
⑦安装Docker Compose
sudo curl -L \
"https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" \
-o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
【20201207】从版本1.26.2到1.27.4
安装构建要求:git、curl、NodeJS、npm、Yarn、libjson-perl、libwww-perl和libuuid-tiny-perl。
从Ubuntu的apt软件源中进行安装
sudo apt-get -y install git curl nodejs npm libjson-perl libwww-perl libuuid-tiny-perl
②从npm安装n。
※ “n”是一个用于管理node的命令。
sudo npm install n -g
导入Yarn的密钥,添加Yarn的apt注册表,并安装Yarn。
wget --quiet -O - https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
sudo add-apt-repository "deb https://dl.yarnpkg.com/debian/ stable main"
sudo apt-get update
sudo apt-get -y install yarn
安装Apache Kafka和Apache ZooKeeper
※以上所述的是mod-subpub所需的。
Apache Kafka(http://kafka.apache.org/) 是什么?
这是一个分布式流媒体平台,具有“Pull型”和“高吞吐量”等特点,可用于构建流媒体数据管道。它是一个在分布式环境中的消息传递系统,可以以“高吞吐量”和“低延迟”快速地获取和传送大规模数据。
Apache ZooKeeper是什么?
Apache ZooKeeper 是一种为大型分布式系统提供集中管理配置信息和命名服务的软件。
修改 ~/folio-install/runbooks/single-server/scripts/docker-compose-kafka-zk.yml。
修正前的 KAFKA_ADVERTISED_LISTENERS:INTERNAL://10.0.2.15:9092,LOCAL://localhost:29092
修正后的 KAFKA_ADVERTISED_LISTENERS:INTERNAL://<私有IP地址>:9092,LOCAL://localhost:29092
请将<私有IP地址>替换为EC2实例的实际私有IP地址。
sudo mkdir /opt/kafka-zk
sudo cp ~/folio-install/runbooks/single-server/scripts/docker-compose-kafka-zk.yml /opt/kafka-zk/docker-compose.yml
cd /opt/kafka-zk
sudo docker-compose up -d
cd -
创建数据库和角色
以超级用户登录到PostgreSQL
sudo su -c psql postgres postgres
创建Okapi服务、租户的数据库和角色。
CREATE ROLE okapi WITH PASSWORD 'okapi25' LOGIN CREATEDB;
CREATE DATABASE okapi WITH OWNER okapi;
CREATE ROLE folio WITH PASSWORD 'folio123' LOGIN SUPERUSER;
CREATE DATABASE folio WITH OWNER folio;
退出psql。
Okapi的安装和配置
wget --quiet -O - https://repository.folio.org/packages/debian/folio-apt-archive-key.asc | sudo apt-key add -
sudo add-apt-repository "deb https://repository.folio.org/packages/ubuntu focal/"
sudo apt-get update
sudo apt-get -y install okapi=4.7.2-1
sudo apt-mark hold okapi
[20200607 将Okapi版本从4.3.3-1更改为4.7.2-1]
[20201203 将Okapi版本从3.1.2-1更改为4.3.3-1]
[20201207 将Ubuntu xenial更改为focal]
①编辑/etc/folio/okapi/okapi.conf中的以下内容
-
- role=”dev”
-
- port_end=”9230″
-
- host=””
-
- storage=”postgres”
-
- okapiurl=”http://:9130″
- ~postgres_host””~ [20201209追記→削除]
请在<私有IP地址>中输入EC2实例的私有IP地址。
②Okapi重新启动
sudo systemctl daemon-reload
sudo systemctl restart okapi
从中央注册表中拉取模块描述符。
curl -w '\n' -D - -X POST -H "Content-type: application/json" -d '{"urls":["https://folio-registry.dev.folio.org"]}' http://localhost:9130/_/proxy/pull/modules
从提供的URL中获取模块描述符,但这个模块描述符不是租户(在这里是diku)特有的,而是共享的。请参考:https://github.com/folio-org/okapi/blob/master/doc/guide.md#module-descriptor-sharing
有关_/proxy/pull/modules的详细信息,请参阅Okapi核心API文档:https://s3.amazonaws.com/foliodocs/api/okapi/okapi.html
ModuleDescriptor指南:https://dev.folio.org/guides/module-descriptor/
※Registry中有以下描述。
作为持续集成过程的一部分,每个ModuleDescriptor.json都会发布到FOLIO注册表,网址为https://folio-registry.aws.indexdata.com/。
创建Folio租户
将租户初始化信息发布到Okapi中。
curl -w '\n' -D - -X POST -H "Content-type: application/json" -d '{"id" : "diku","name" : "Datalogisk Institut","description" : "Danish Library Technology Institute"}' http://localhost:9130/_/proxy/tenants
Okapi 知道现在有一个名为 “diku” 的租户存在了。
启用Okapi的内部模块以供租户使用。
curl -w '\n' -D - -X POST -H "Content-type: application/json" -d '{"id":"okapi"}' http://localhost:9130/_/proxy/tenants/diku/modules
构建FolioStripes平台的最新版本
您可以通过 n <版本> 命令来更新指定节点的版本。
在这里我们将更新为 lts 版本。
sudo n lts
cd ~
git clone https://github.com/folio-org/platform-complete
cd platform-complete
git checkout q3-2020
yarn install
yarn 是 Node.js 的包管理工具。
.npmrc 文件中包含了 @folio:registry=https://repository.folio.org/repository/npm-folio/ 的配置。
请按照以下方式修改 ~/platform-complete/stripes.config.js文件。
修正前:okapi: {‘url’:’http://localhost:9130′, ‘tenant’:’diku’},
修正后:okapi: {‘url’:’http://<你的公共IP地址>:9130′, ‘tenant’:’diku’},
请在处输入EC2实例的公共IP地址。
当停止EC2实例时,公共IP地址会发生变化。
如果发生此情况,您需要修改上述内容并重新构建以下内容。
NODE_ENV=production yarn build output
cd ..
構成一个网络服务器来提供Stripes webpack。
配置Nginx服务器。
将 folio-install/runbooks/single-server/scripts/nginx-stripes.conf 文件中的 #Set path 部分按照以下方式修改:
修改前:/home/vagrant/platform-complete/output;
修改后:/home/ubuntu/platform-complete/output;
将服务器名称设为公共IPv4 DNS名称。 [20201209补充]
sudo cp folio-install/runbooks/single-server/scripts/nginx-stripes.conf /etc/nginx/sites-available/stripes
sudo ln -s /etc/nginx/sites-available/stripes /etc/nginx/sites-enabled/stripes
sudo rm /etc/nginx/sites-enabled/default
sudo systemctl restart nginx
部署相应的Folio后端来部署并激活租户。
请将部署的模块使用的数据库信息发布到Okapi上。请将替换为EC2实例的私有IP地址。
curl -w '\n' -D - -X POST -H "Content-Type: application/json" -d "{\"name\":\"DB_HOST\",\"value\":\"<PRIVATE IP ADDRESS>\"}" http://localhost:9130/_/env
curl -w '\n' -D - -X POST -H "Content-Type: application/json" -d "{\"name\":\"DB_PORT\",\"value\":\"5432\"}" http://localhost:9130/_/env
curl -w '\n' -D - -X POST -H "Content-Type: application/json" -d "{\"name\":\"DB_DATABASE\",\"value\":\"folio\"}" http://localhost:9130/_/env
curl -w '\n' -D - -X POST -H "Content-Type: application/json" -d "{\"name\":\"DB_USERNAME\",\"value\":\"folio\"}" http://localhost:9130/_/env
curl -w '\n' -D - -X POST -H "Content-Type: application/json" -d "{\"name\":\"DB_PASSWORD\",\"value\":\"folio123\"}" http://localhost:9130/_/env
追加20201209
curl -w '\n' -D - -X POST -H "Content-Type: application/json" -d "{\"name\":\"KAFKA_HOST\",\"value\":\"<PRIVATE IP ADDRESS>\"}" http://localhost:9130/_/env
curl -w '\n' -D - -X POST -H "Content-Type: application/json" -d "{\"name\":\"OKAPI_URL\",\"value\":\"http://<PRIVATE IP ADDRESS>:9130\"}" http://localhost:9130/_/env
发表并激活后端模块列表。设置租户参数,并加载示例数据和参考数据。
※ 请根据工作目录更改platform-complete。这是在PWD为home/ubuntu的情况下。
curl -w '\n' -D - -X POST -H "Content-type: application/json" \
-d @platform-complete/okapi-install.json \
http://localhost:9130/_/proxy/tenants/diku/install?deploy=true\&preRelease=false\&tenantParameters=loadSample%3Dtrue%2CloadReference%3Dtrue
请注意:由于需要从Docker Hub拉取Docker镜像,这会花费一些时间。
查看进度→在/var/log/folio/okapi/okapi.log查看Okapi日志或者使用sudo docker ps | grep -v “^CONTAINER” | wc -l命令。
如果没有剩余空间,请先尝试重新启动。如果仍然不行,可以考虑添加卷或采取其他相应措施。
将Stripes模块的列表发布并启用。
请根据工作目录调整platform-complete。此示例假设PWD为home/ubuntu。
curl -w '\n' -D - -X POST -H "Content-type: application/json" \
-d @platform-complete/stripes-install.json \
http://localhost:9130/_/proxy/tenants/diku/install?preRelease=false
创建Folio的超级用户并加载权限。
perl folio-install/runbooks/single-server/scripts/bootstrap-superuser.pl --tenant diku --user diku_admin --password admin --okapi http://localhost:9130
如果显示为“完成!”就可以了。
加载样本数据
加载MODS记录
加载用于库存的示例数据。 示例数据可在https://github.com/folio-org/folio-install/tree/master/runbooks/single-server/sample-data/mod-inventory找到。
curl -w '\n' -D - -X POST -H "Content-type: application/json" -H "Accept: application/json" -H "X-Okapi-Tenant: diku" -d '{"username":"diku_admin","password":"admin"}' http://localhost:9130/authn/login
将返回的token值放入下列的中。
根据目录修改※./folio-install/runbooks/single-server。这是当PWD为home/ubuntu时的情况。
for i in ./folio-install/runbooks/single-server/sample-data/mod-inventory/*.xml; do curl -w '\n' -D - -X POST -H "Content-type: multipart/form-data" -H "X-Okapi-Tenant: diku" -H "X-Okapi-Token: <okapi token>" -F upload=@${i} http://localhost:9130/inventory/ingest/mods; done
使用diku_admin账号在admin页面上登录
附录 (fù lù)
如果要在Certbot上配置SSL,请参考https://certbot.eff.org/lets-encrypt/ubuntufocal-nginx。
修改nginx-stripes.conf文件。
server {
listen 80;
server_name ドメイン名;
charset utf-8;
# Serve index.html for any request not found
location / {
# Set path
root /home/ubuntu/platform-complete/output;
include mime.types;
types {
text/plain lock;
}
try_files $uri /index.html;
}
}
#General HTTP to HTTPS
server {
listen 80;
listen [::]:80;
server_name ドメイン名;
location / {
return 302 https://$host$request_uri;
}
}
server {
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/ドメイン名/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ドメイン名/privkey.pem;
server_name ドメイン名 default_server;
#ssl on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
location / {
# Set path
root /home/ubuntu/platform-complete/output;
include mime.types;
types {
text/plain lock;
}
try_files $uri /index.html;
}
location /okapi {
rewrite ^/okapi/(.*) /$1 break;
proxy_pass http://localhost:9130;
}
stripes.config.js将被设定为以下内容
okapi: { 'url':'https://ドメイン名/okapi', 'tenant':'diku' },
如果改写,请不要忘记构建。
NODE_ENV=production yarn build output