Install Pleasanter on AlmaLinux Using the Installer
## Overview
This procedure is for building a Pleasanter operating environment using the "Installer". You can also install it using the previous procedure of manually placing modules and setting parameters. Please refer to the following for manual installation procedures.
[Install Pleasanter on AlmaLinux](getting-started-pleasanter-almalinux)
|Target|Body|
|---|---|
|OS|AlmaLinux 9.2|
|DB|PostgreSQL 16 or MySQL 8.4|
|Web server|nginx 1.20.1|
|Platform|.NET 8.0|
|Pleasanter|Pleasanter 1.4|
## Notes
1. MySQL can be used from version 1.4.9.0 onwards. Pleasanter versions earlier than version 1.4.9.0 do not support MySQL.
2. If you want to separate the web server and DB server in MySQL, please refer to "[Configure the Web Server and DB Server to Use MySQL Separately](mysql-create-user-by-sql)".
## Limitations
Installation using the "Installer" is for version 1.4.0.0 and later. If you are installing version 1.3.50.2 or earlier, please refer to the manual installation procedure.
[Install Pleasanter on AlmaLinux](getting-started-pleasanter-almalinux)
## Prerequisites
1. We will not describe how to set up the OS. We assume that the OS has already been set up.
1. For details on the operating environment and specifications, please check here.
[FAQ: I want to know the operating environment and recommended specifications for Pleasanter](faq-recommended-specifications)
1. Please decide in advance which user will start Pleasanter. The **<User who will execute Pleasanter>** described in the procedure refers to this user.
1. This procedure explains the case where .NET is installed in /usr/local/bin. If you install .NET in a different directory because you need multiple versions of .NET in the same environment, change the directory specified in ExecStart when running CodeDefiner or creating a script for the Pleasanter service to match the installation destination.
## Procedure
The construction procedure is as follows.
1. Set up .NET
1. Set up Database:
Perform the following setup for either PostgresSQL or MySQL. <br/>
*The following may not match the order of configuration.
1. Install DB
1. Set up DB administrator user
1. Set DB log output
1. Enable DB service and automatic startup
1. Set for allowing external access to DB
1. Install the installer
1. Set up Pleasanter
1. Run installer
1. Check Pleasanter startup
1. Create script for Pleasanter service
1. Register as service and start service
1. Set up Reverse proxy (nginx)
1. Change SELinux settings
1. Install nginx
1. Reverse proxy settings
1. Allow access to Http(80)
1. Check Pleasanter operation
## 1. Set Up .NET
Run the following command to install .NET.
```
sudo wget https://dot.net/v1/dotnet-install.sh -O dotnet-install.sh
sudo chmod +x ./dotnet-install.sh
sudo ./dotnet-install.sh -c 8.0 -i /usr/local/bin
dotnet --version
```
For details, please refer to the official page below **Installation by script**.
https://learn.microsoft.com/en-us/dotnet/core/install/linux-scripted-manual#scripted-install
In addition, there are cases where an error occurs regarding a specific file when executing the dotnet command. In that case, please refer to the following page.
https://learn.microsoft.com/en-us/dotnet/core/install/linux-package-mixup?pivots=os-linux-redhat
## 2. Set Up the Database
Refer to either "Setting up PostgreSQL" or "Setting up MySQL" below to set up the database.
### 1. Set up PostgreSQL
The setup procedure for PostgreSQL is as follows.
<details>
<summary> (Click here to open/close the details) </summary>
#### 1. Install PostgreSQL
Run the following command to install PostgreSQL.
```
sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo dnf install -y postgresql16-server postgresql16-contrib
```
#### 2. Initialize the PostgreSQL database
Run the following command to initialize the database. * -A: Specify authentication method, -W: Option to display password prompt
After execution, a password prompt will be displayed, so enter your password. The password set here will be used in step 3.2, so be sure to write it down so you don't forget it.
```
sudo su - postgres -c '/usr/pgsql-16/bin/initdb -E UTF8 -A scram-sha-256 -W'
```
##### 3. Set PostgreSQL log output
Open /var/lib/pgsql/16/data/postgresql.conf and edit the following settings.
```
log_destination = 'stderr'
logging_collector = on
log_line_prefix = '[%t]%u %d %p[%l]'
```
#### 4. Restart the PostgreSQL service and make it a service
Execute the following command to restart the PostgreSQL service and enable automatic service startup.
```
sudo systemctl restart postgresql-16
sudo systemctl enable postgresql-16
```
#### 5. Settings to allow external access to the database
1. Uncomment the following two lines in /var/lib/pgsql/16/data/postgresql.conf and set them as follows.
```
# - Connection Settings -
listen_addresses = '*' # what IP address(es) to listen on;
port = 5432 # (change requires restart)
```
2. Add the following lines to /var/lib/pgsql/16/data/pg_hba.conf. In the Address field, specify the range of IP addresses to allow access.
```
# TYPE DATABASE USER ADDRESS METHOD
host all all 192.168.1.0/24 scram-sha-256
```
3. After the settings, run the following command to restart the PostgreSQL service.
```
sudo systemctl restart postgresql-16
```
</details>
### 2. Set up MySQL
The steps to set up MySQL are as follows.
<details>
<summary> (Click here to open/close the details) </summary>
#### 1. Install MySQL
1. Run the following command to install the MySQL package and server.
```
sudo dnf install -y https://dev.mysql.com/get/mysql84-community-release-el9-1.noarch.rpm
sudo dnf install mysql-community-server
```
The URL specified in the command is the same as the URL specified in the official repository below.
https://dev.mysql.com/downloads/repo/yum/
2. Execute the command to display the status of the service.
```
systemctl status mysqld.service
```
3. Confirm that the service is stopped by displaying the message "Active: inactive (dead)" as shown below.
```
○ mysqld.service - MySQL Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; preset: disabled)
Active: inactive (dead)
Docs: man:mysqld(8)
http://dev.mysql.com/doc/refman/en/using-systemd.html
```
#### 2. Enable automatic startup of MySQL service
1. Run the following command to start the MySQL service.
```
sudo systemctl start mysqld
```
2. Run the following command to enable automatic startup of MySQL service.
```
sudo systemctl enable mysqld
```
#### 3. Set MySQL user
1. Add the following setting under [mysqld] in /etc/my.cnf.
```
[mysqld]
skip-grant-tables
```
The path of the configuration file may differ depending on the OS or MySQL version.
2. Run the following command to restart the MySQL service.
```
sudo systemctl restart mysqld
```
3. Run the following command to log in to MySQL with the root account (without password).
```
mysql -u root
```
4. Run the following SQL to set the password for the MySQL root account.
```
flush privileges;
alter user 'root'@'localhost' identified by '<New password for MySQL root account※>';
```
*The default settings for MySQL installed in this procedure require a password that is 8 characters or more, and contains uppercase letters, lowercase letters, numbers, and special characters.
5. Run the following command to log out of the root account from MySQL.
```
quit;
```
6. Delete the description added under [mysqld] in /etc/my.cnf. Do not delete [mysqld].
```
skip-grant-tables
```
7. Execute the following command to restart the MySQL service.
```
sudo systemctl restart mysqld
```
8. Execute the following command to confirm that you can log in to MySQL with the root account.
```
mysql -u root -p<Enter the password for the MySQL root account without a space between -p>
```
9. Execute the following command to log out of the root account from MySQL.
```
quit;
```
#### 4. Set MySQL log output
**Error log output is enabled by default in MySQL. If you do not want to change the default output destination, the following steps do not need to be performed.**
1. Check the path of the log file listed in log-error under [mysqld] in /etc/my.cnf.
The path of the configuration file may differ depending on the OS or MySQL version.
```
[mysqld]
log-error=/var/log/mysqld.log
```
2. If you want to change the output destination of the error log, edit the my.cnf file and then run the following command to restart the MySQL service.
```
sudo systemctl restart mysql
```
#### 5. Settings for Allowing External Access to the Database
Follow the steps in the manual below to add a MySQL user:
・[Configure the Web Server and DB Server to Use MySQL Separately](mysql-create-user-by-sql)
If the web server and the database server are not separated, this step is unnecessary.
</details>
## 3. Install the Installer
Run the following command to install the installer.
```
dotnet tool install -g Implem.PleasanterSetup
echo 'export PATH="$PATH:~/.dotnet/tools"' >> ~/.bashrc
echo 'export DOTNET_ROOT=/usr/local/bin' >> ~/.bashrc
echo 'export PATH=$PATH:$DOTNET_ROOT' >> ~/.bashrc
source ~/.bashrc
```
### If you are not connected to a network environment, install it using the following procedure.
<details>
<summary>(Click here to open/close the details) </summary>
1. Open the Nuget Gallery for Implem.PleasanterSetup from [here](https://www.nuget.org/packages/Implem.PleasanterSetup/) and download the .nupkg file from “Download package”.

1. Run the command below to create a folder of your choice to place the .nupkg file.
*This procedure explains how to create /dotnet-tools.
```
sudo mkdir /dotnet-tools
```
1. Place the .nupkg file downloaded in 3.1 in /dotnet-tools.
1. Run the following command to install the installer.
```
dotnet tool install -g --add-source /dotnet-tools Implem.PleasanterSetup
echo 'export PATH="$PATH:~/.dotnet/tools"' >> ~/.bashrc
echo 'export DOTNET_ROOT=/usr/local/bin' >> ~/.bashrc
echo 'export PATH=$PATH:$DOTNET_ROOT' >> ~/.bashrc
source ~/.bashrc
```
</details>
## 4. Pleasanter Setup
### 1. Run the Installer
By using the installer, the latest version resources are automatically downloaded and the values of Service.json and Rds.json are automatically set based on the values entered.
#### The procedure when using PostgreSQL is as follows.
<details>
<summary> (Click here to open/close the details) </summary>
1. Run the following command to run the installer.
```
pleasanter-setup
```
**If you are not connected to a network environment, please follow the steps below**
<details>
<summary> (Click here to open/close the details) </summary>
1. Download the latest version of Pleasanter from the [Download Center](https://pleasanter.org/dlcenter) and place it in "/web/".
1. Execute the following command.
**/web/** Make sure that the configuration under the directory is as follows.
/web/Pleasanter_1.4.x.x.zip
```
pleasanter-setup -r /web/Pleasanter_1.4.x.x.zip
```
</details>
2. Enter the directory where you want to install Pleasanter.
If you want to install it in "/web/pleasanter", leave it blank and press Enter.

3. Enter **<User who will execute Pleasanter>**.

4. Enter the service name.
If you are using "Implem.Pleasanter", leave it blank and press the Enter key.

5. Enter the number corresponding to the DBMS you are using.
Here, enter "2" and press the Enter key.

6. Enter the port number to be used.
If it is the default port number of the DBMS, leave it blank and press the Enter key.

7. Enter the value to be set for Server in the connection string.
If it is "localhost", leave it blank and press the Enter key.

8. Enter the value to be set for UID in SaConnectionString.
If it is "postgres", leave it blank and press the Enter key.

9. Enter the value to be set for PWD in SaConnectionString.
*The password will be displayed in a masked state.

10. Enter the value to be set for PWD in OwnerConnectionString.
*The password will be displayed in a masked state.

11. Enter the value to be set for PWD in UserConnectionString.
*The password will be displayed in a masked state.

12. Enter the "Default language".
Enter the number of the corresponding language.

13. Enter the time zone for "Default time zone".
Enter the number of the corresponding time zone.
*If you entered "3", enter the time zone available in the OS you are using.

14. The summary screen will be displayed.
If the entered values are correct, enter **y** after "Shall I install Pleasanter with this content? Please enter 'y(yes)' or 'n(no)'. : " and press Enter.
*The password is masked.

15. When "Type "y" (yes) if the license is correct, otherwise type "n" (no)" is displayed, enter **y** and execute.
```
<SUCCESS> Starter.ConfigureDatabase: Database configuration has been completed.
<SUCCESS> Starter.Main: All of the processes have been completed.
Setup is complete.
```
16. When setup is complete, a web browser will launch and display the [Enterprise Edition trial information page](https://pleasanter.org/pleasanter-extensions-trial/?utm_source=installer&utm_medium=app&utm_campaign=extension-trial&utm_content=route01).

</details>
#### The procedure when using MySQL is as follows.
<details>
<summary> (Click here to open/close the details) </summary>
1. Execute the following command to run the installer.
```
pleasanter-setup
```
**If you are not connected to a network environment, please follow the steps below**
<details>
<summary> (Click here to open/close details) </summary>
1. Download the latest version of Pleasanter from the [Download Center](https://pleasanter.org/dlcenter) and place it in "/web/".
1. Execute the following command.
**/web/** Make sure that the configuration under the directory is as follows.
/web/Pleasanter_1.4.x.x.zip
```
pleasanter-setup -r /web/Pleasanter_1.4.x.x.zip
```
</details>
2. Enter the directory where you want to install Pleasanter.
If you want to install it in "/web/pleasanter", leave it blank and press Enter.

3. Enter **<User who will execute Pleasanter>**.

4. Enter the service name.
If you want to install it in "Implem.Pleasanter", leave it blank and press Enter.

5. Enter the number that corresponds to the DBMS you want to use.
Here, enter "3" and press Enter.

6. Enter the port number to be used.
If you want to use the default port number for the DBMS, leave it blank and press Enter.

7. Enter the value to be set in Server in the connection string.
If you want to use "localhost", leave it blank and press Enter.

8. Enter the value to be set in UID of SaConnectionString.
If you want to use "root", leave it blank and press Enter.

9. Enter the value to be set for PWD in SaConnectionString.
*The password will be displayed in a masked state.

10. Enter the value to be set for PWD in OwnerConnectionString.
*The password will be displayed in a masked state.

11. Enter the value to be set for PWD in UserConnectionString.
*The password will be displayed in a masked state.

12. Enter the "Default language".
Enter the number of the corresponding language.

13. Enter the "Default time zone".
Enter the number of the corresponding time zone.
*If you entered "3", enter a time zone that can be used with the OS you are using.

14. The summary screen will be displayed.
If the entered values are correct, enter **y** after "Shall I install Pleasanter with this content? Please enter ‘y(yes)' or 'n(no)'. : " and press Enter to execute.
*Password is masked.

15. When "Type "y" (yes) if the license is correct, otherwise type "n" (no)" is displayed, enter **y** and execute.
```
<SUCCESS> Starter.ConfigureDatabase: Database configuration has been completed.
<SUCCESS> Starter.Main: All of the processes have been completed.
Setup is complete.
```
16. When setup is complete, a web browser will launch and display the [Enterprise Edition trial information page](https://pleasanter.org/pleasanter-extensions-trial/?utm_source=installer&utm_medium=app&utm_campaign=extension-trial&utm_content=route01).

</details>
### 2. Check that Pleasanter is running
1. Run the following command to start Pleasanter with a predefined user.
```
cd /web/pleasanter/Implem.Pleasanter
sudo -u <User who will execute Pleasanter> /usr/local/bin/dotnet Implem.Pleasanter.dll
```
2. While Pleasanter is running, run the following command in another terminal to check that Pleasanter is running. Exit with "Ctrl+C".
* Execute command
```
curl -v http://localhost:5000/
```
* Execution result
```
* Trying ::1:5000...
* Connected to localhost (::1) port 5000 (#0)
> GET / HTTP/1.1
> Host: localhost:5000
> User-Agent: curl/7.76.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 302 Found
< Content-Length: 0
< Date: Tue, 25 Jul 2023 11:33:38 GMT
< Server: Kestrel
< Location: http://localhost:5000/users/login?ReturnUrl=%2F
< X-Frame-Options: SAMEORIGIN
< X-XSS-Protection: 1; mode=block
< X-Content-Type-Options: nosniff
<
* Connection #0 to host localhost left intact
```
### 3. Create a script for the Pleasanter service
Create /etc/systemd/system/pleasanter.service with the following content. For **User** below, specify the user who will start Pleasanter.
```
[Unit]
Description = Pleasanter
Documentation =
Wants=network.target
After=network.target
[Service]
ExecStart = /usr/local/bin/dotnet Implem.Pleasanter.dll
WorkingDirectory = /web/pleasanter/Implem.Pleasanter
Restart = always
RestartSec = 10
KillSignal=SIGINT
SyslogIdentifier=dotnet-pleasanter
User = <User who launch Pleasanter>
Group = root
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy = multi-user.target
```
### 4. Register as a service and start the service
Execute the following command to enable the Pleasanter service start and automatic service start.
```
sudo systemctl daemon-reload
sudo systemctl enable pleasanter
sudo systemctl start pleasanter
```
## 5. Set Up a Reverse Proxy (nginx)
Set up the reverse proxy so that it can be accessed through Port 80, the same as a normal web server.
### 1. Change SELinux settings
Execute the following command.
```
getenforce
```
#### a. If "Command 'getenforce' not found," "Permissive," or "Disabled" is displayed
Proceed to "2. Install nginx."
#### b. If "Enforcing" is displayed
Execute the following command.
```
sudo setsebool -P httpd_can_network_connect on
```
*Changing the above boolean value of SELinux will allow all network connections by scripts and modules on the server in question.
### 2. Install nginx
Execute the following command to install nginx.
```
sudo dnf install -y nginx
sudo systemctl enable nginx
```
### 3. Reverse proxy settings
1. Create /etc/nginx/conf.d/pleasanter.conf with the following contents. In the server_name line, specify the hostname or IP address of the server you want to access.
```
server {
listen 80;
server_name 192.168.1.100;
client_max_body_size 100M;
location / {
proxy_pass http://localhost:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
```
2. After creating the file, run the following command to restart the service.
```
sudo systemctl restart nginx
```
### 3. Permission to access Http(80)
Execute the following command to set permission to access Http (port:80) to allow clients to access the web service.
```
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --reload
```
## 6. Check the operation of Pleasanter
1. After starting Pleasanter, enter "Login ID: Administrator" and "Initial password: pleasanter" on the Pleasanter login screen and click the "Login" button.

2. After logging in, you will be asked to change the "Administrator" user password, so enter a password of your choice and click the "Change" button.

### If redirection is not correct
Check that your nginx settings are correct. Small differences such as the presence or absence of / in the description may affect operation.
### If the Pleasanter screen does not open
If the above steps were completed without any errors, but a page such as "Welcome to nginx!" (not an error message) is displayed when you access the page in a browser, the security settings of the browser may be preventing you from transitioning to the Pleasanter login screen.
Please check the security settings of your browser.
## Supported Versions
|Supported versions|Body|
|:--|:--|
|1.4.9.0 and later|Supports MySQL|
|1.4.10.0 and later|Fixed the issue where Owner and User connections were rejected due to MySQL's access control function<br>*Added a link to "[Configure the Web Server and DB Server to Use MySQL Separately](mysql-create-user-by-sql)" in the notes|
## Related Information
[FAQ: I want to install Pleasanter 1.3.43.0 or earlier in a Linux environment with PostgreSQL version 14 or earlier.](faq-postgresql-14-intall-pleasanter-for-linux)