1
0
mirror of https://github.com/agibalovsa/-1C_DevOps.git synced 2025-10-08 23:22:16 +02:00

Выполнены задачи:

- Исправлены отступы и ссылки в файле документации.
This commit is contained in:
agibalovsa
2025-10-08 19:05:52 +04:00
committed by Agibalov Sergey
parent 991337ea08
commit 05324dfa3c

View File

@@ -6,14 +6,16 @@
<p><b>Автор</b>: Агибалов Сергей</p> <p><b>Автор</b>: Агибалов Сергей</p>
<p><b>Дата</b>: 08.10.2025</p> <p><b>Дата</b>: 08.10.2025</p>
</div> </div>
<div><a href="https://yoomoney.ru/to/4100119287125731" style="Font-family: segoe script; Font-size: 20px; text-decoration: none; color: #000000; Font-weight: bold"><img src=".\organization_of_work_with_sonarqube\samurai.webp" width="80" height="80">Donate</a></div> <div><a href="https://yoomoney.ru/to/4100119287125731" style="Font-family: segoe script; Font-size: 20px; text-decoration: none; color: #000000; Font-weight: bold"><img src="./organization_of_work_with_sonarqube/samurai.webp" width="80" height="80">Donate</a></div>
</div> </div>
---- ----
## Подготовка среды исполнения Sonarqube ## Подготовка среды исполнения Sonarqube
Для разворачивания Sonarqube подойдет как виртуальная машина, так и LXC контейнер в рамках которых будет функционировать docker-контейнер. Для создания docker-контейнера необходимо развернуть **Docker engine**. Для разворачивания Sonarqube подойдет как виртуальная машина, так и LXC контейнер в рамках которых будет функционировать docker-контейнер. Для создания docker-контейнера необходимо развернуть **Docker engine**.
> [!NOTE]
> См. статью [**Создание LXC контейнера Linux на основе шаблона Turnkey**]() (*будет добавлена позже...*) > См. статью [**Создание LXC контейнера Linux на основе шаблона Turnkey**]() (*будет добавлена позже...*)
На виртуальной машине или на хостовой машине контейнера **LXC** необходимо проверить следующие параметры: На виртуальной машине или на хостовой машине контейнера **LXC** необходимо проверить следующие параметры:
@@ -61,28 +63,28 @@ $> git clone https://github.com/agibalovsa/-1C_DevOps 1c_devops
## Создание образа контейнера Sonarqube ## Создание образа контейнера Sonarqube
В репозитории **dockerfile** для **Sonarqube** можно найти по пути [docker/sonarqube/build](..\\..\\..\\..\docker\sonarqube\build\dockerfile). В репозитории **dockerfile** для **Sonarqube** можно найти по пути [docker/sonarqube/build](..//..//..//../docker/sonarqube/build/dockerfile).
Для инициализации сборки необходимо запустить файл `docker/init.sh`. Для инициализации сборки необходимо запустить файл `docker/init.sh`.
Шаг.1. Откроется окно ввода названия проекта сборки Шаг.1. Откроется окно ввода названия проекта сборки
![BuildInit](.\organization_of_work_with_sonarqube\BuildInit.png) ![BuildInit](./organization_of_work_with_sonarqube/BuildInit.png)
Шаг.2. Необходимо выбрать тип проекта `build` Шаг.2. Необходимо выбрать тип проекта `build`
![BuildInit](.\organization_of_work_with_sonarqube\BuildInit2.png) ![BuildInit](./organization_of_work_with_sonarqube/BuildInit2.png)
Шаг.3. Необходимо выбрать приложение `sonarqube` Шаг.3. Необходимо выбрать приложение `sonarqube`
![BuildInit](.\organization_of_work_with_sonarqube\BuildInit3.png) ![BuildInit](./organization_of_work_with_sonarqube/BuildInit3.png)
В каталоге репозитория `docker/users/builds/sonarqube` сформируются: В каталоге репозитория `docker/users/builds/sonarqube` сформируются:
- `docker-build.sh` - Скрипт для сборки. - `docker-build.sh` - Скрипт для сборки.
- `.arg` - Файл с аргументами сборки (Аргументы сборки описаны в [здесь](..\\..\\..\\..\docker\sonarqube\README.md#создание-образа)). - `.arg` - Файл с аргументами сборки (Аргументы сборки описаны в [здесь](..//..//..//../docker/sonarqube/README.md#создание-образа)).
![BuildArg](.\organization_of_work_with_sonarqube\BuildArg.png) ![BuildArg](./organization_of_work_with_sonarqube/BuildArg.png)
Для сборки образа необходимо: Для сборки образа необходимо:
@@ -93,15 +95,16 @@ $> git clone https://github.com/agibalovsa/-1C_DevOps 1c_devops
### Инициализация compose ### Инициализация compose
Файлы **compose** для **Sonarqube** можно найти в репозитории по пути [docker/sonarqube/compose](..\\..\\..\\..\docker\sonarqube\compose). Здесь можно увидеть: Файлы **compose** для **Sonarqube** можно найти в репозитории по пути [docker/sonarqube/compose](..//..//..//../docker/sonarqube/compose). Здесь можно увидеть:
- `common-compose.yml` - файл с параметрами развертывания среды общими для **compose** и для **swarm**. - `common-compose.yml` - файл с параметрами развертывания среды общими для **compose** и для **swarm**.
- `docker-compose.yml` - файл с параметрами развертывания среды только для **compose**. - `docker-compose.yml` - файл с параметрами развертывания среды только для **compose**.
- `depends_on_postgres/depends_on_postgres-compose.yml` - файл приоритета запуска, в случае запуска **sonarqube** вместе с **postgres**.> - `depends_on_postgres/depends_on_postgres-compose.yml` - файл приоритета запуска, в случае запуска **sonarqube** вместе с **postgres**.>
> **Информация.** Файлы **compose** созданы согласно [документации **Sonarqube**](https://docs.sonarsource.com/sonarqube-server/latest/server-installation/from-docker-image/starting-sonarqube-container). > [!NOTE]
> Файлы **compose** созданы согласно [документации **Sonarqube**](https://docs.sonarsource.com/sonarqube-server/latest/server-installation/from-docker-image/starting-sonarqube-container).
Файлы **compose** для **Postgres** можно найти в репозитории по пути [docker/postgres/compose](..\\..\\..\\..\docker\postgres\compose). Файлы **compose** для **Postgres** можно найти в репозитории по пути [docker/postgres/compose](..//..//..//../docker/postgres/compose).
Для формирования скриптов запуска контейнера необходимо снова запустить `docker/init.sh`. Для формирования скриптов запуска контейнера необходимо снова запустить `docker/init.sh`.
@@ -109,24 +112,25 @@ $> git clone https://github.com/agibalovsa/-1C_DevOps 1c_devops
Шаг.2. Необходимо выбрать тип проекта `compose`. Шаг.2. Необходимо выбрать тип проекта `compose`.
![ComposeInit](.\organization_of_work_with_sonarqube\ComposeInit2.png) ![ComposeInit](./organization_of_work_with_sonarqube/ComposeInit2.png)
Шаг.3. Можно выбрать 1 или 2 приложения: `sonarqube` и `postgres`. Шаг.3. Можно выбрать 1 или 2 приложения: `sonarqube` и `postgres`.
![ComposeInit](.\organization_of_work_with_sonarqube\ComposeInit3.png) ![ComposeInit](./organization_of_work_with_sonarqube/ComposeInit3.png)
> **Информация.** Приложение **postgres** можно не выбирать, если оно уже установлено, и путь до него известен > [!NOTE]
> Приложение **postgres** можно не выбирать, если оно уже установлено, и путь до него известен
Шаг.4. В случае установки 2х приложений необходимо выбрать дополнительную настройку `depends_on_postgres` Шаг.4. В случае установки 2х приложений необходимо выбрать дополнительную настройку `depends_on_postgres`
![ComposeInit](.\organization_of_work_with_sonarqube\ComposeInit4.png) ![ComposeInit](./organization_of_work_with_sonarqube/ComposeInit4.png)
В каталоге репозитория `docker/users/compose/sonarqube` сформируются: В каталоге репозитория `docker/users/compose/sonarqube` сформируются:
- `docker-compose-up.sh` - Скрипт развертывания среды. - `docker-compose-up.sh` - Скрипт развертывания среды.
- `docker-compose-down.sh` - Скрипт свертывания среды. - `docker-compose-down.sh` - Скрипт свертывания среды.
- `docker-compose-logs.sh` - Скрипт просмотра логов среды. - `docker-compose-logs.sh` - Скрипт просмотра логов среды.
- `.env` - Файл с переменными среды (Переменные среды запуска описаны в [здесь](..\\..\\..\\..\docker\sonarqube\README.md#создание-контейнера)). - `.env` - Файл с переменными среды (Переменные среды запуска описаны в [здесь](..//..//..//../docker/sonarqube/README.md#создание-контейнера)).
### Переменные среды ### Переменные среды
@@ -176,7 +180,7 @@ ulimits:
- `port` - это порт, который был задан в файле `common-compose.yml`. - `port` - это порт, который был задан в файле `common-compose.yml`.
- `/sonarqube` - если задана переменная среды окружения `SONAR_WEB_CONTEXT` - `/sonarqube` - если задана переменная среды окружения `SONAR_WEB_CONTEXT`
![SonarqubeAuth](.\organization_of_work_with_sonarqube\SonarqubeAuth.png) ![SonarqubeAuth](./organization_of_work_with_sonarqube/SonarqubeAuth.png)
Первоначальные учетные данные **admin**/**admin**. Первоначальные учетные данные **admin**/**admin**.
@@ -186,7 +190,7 @@ ulimits:
На скриншоте показан бэкап **LXC**-контейнера в **Proxmox**. На скриншоте показан бэкап **LXC**-контейнера в **Proxmox**.
![ProxmoxLXCBackup](.\organization_of_work_with_sonarqube\ProxmoxLXCBackup.png) ![ProxmoxLXCBackup](./organization_of_work_with_sonarqube/ProxmoxLXCBackup.png)
После создания архива необходимо выполнить следующие шаги: После создания архива необходимо выполнить следующие шаги:
@@ -196,7 +200,7 @@ ulimits:
3. Необходимо проверить наименование переменных среды, и исправить **dockerfile**, файлы **compose** в случае необходимости 3. Необходимо проверить наименование переменных среды, и исправить **dockerfile**, файлы **compose** в случае необходимости
> **Например**. При переходе с 8.9 на 9.9 были переименования с `SONARQUBE_JDBC_URL` на `SONAR_JDBC_URL`. > При переходе с 8.9 на 9.9 были переименования с `SONARQUBE_JDBC_URL` на `SONAR_JDBC_URL`.
4. Изменить `.arg`, в котором указать: 4. Изменить `.arg`, в котором указать:
@@ -318,9 +322,9 @@ PING sonarqube (192.168.0.2) 56(84) bytes of data.
После проверки доменных имен необходимо указать параметр `Server base URL` в общих настройках **Sonarqube** После проверки доменных имен необходимо указать параметр `Server base URL` в общих настройках **Sonarqube**
![SonarqubeSettings](.\organization_of_work_with_sonarqube\SonarqubeSettings.png) ![SonarqubeSettings](./organization_of_work_with_sonarqube/SonarqubeSettings.png)
![SonarqubeServerBaseURL](.\organization_of_work_with_sonarqube\SonarqubeServerBaseURL.png) ![SonarqubeServerBaseURL](./organization_of_work_with_sonarqube/SonarqubeServerBaseURL.png)
По сути дела, он должен быть таким же, как путь в браузере. По сути дела, он должен быть таким же, как путь в браузере.
@@ -335,7 +339,7 @@ PING sonarqube (192.168.0.2) 56(84) bytes of data.
Первый токен для авторизации необходимо сделать для приложения **Gitlab**. Для этого необходимо зайти в панель `Admin` в `Applications`. Первый токен для авторизации необходимо сделать для приложения **Gitlab**. Для этого необходимо зайти в панель `Admin` в `Applications`.
![GitLabApplications](.\organization_of_work_with_sonarqube\GitLabApplications.png) ![GitLabApplications](./organization_of_work_with_sonarqube/GitLabApplications.png)
Далее необходимо создать новое приложение с помощью кнопки `New application`, задав следующие настройки Далее необходимо создать новое приложение с помощью кнопки `New application`, задав следующие настройки
@@ -348,7 +352,7 @@ PING sonarqube (192.168.0.2) 56(84) bytes of data.
После генерации токена необходимо скопировать `Application ID` и `Secret`. После генерации токена необходимо скопировать `Application ID` и `Secret`.
![GitLabApplication](.\organization_of_work_with_sonarqube\GitLabApplication.png) ![GitLabApplication](./organization_of_work_with_sonarqube/GitLabApplication.png)
#### Доступ к проектам **Gitlab** #### Доступ к проектам **Gitlab**
@@ -356,7 +360,7 @@ PING sonarqube (192.168.0.2) 56(84) bytes of data.
Для этого, необходимо авторизоваться под этим системным пользователем и зайти в настройки профайла и далее в раздел `AccessTokens`. Для этого, необходимо авторизоваться под этим системным пользователем и зайти в настройки профайла и далее в раздел `AccessTokens`.
![GitLabAccessTokens](.\organization_of_work_with_sonarqube\GitLabAccessTokens.png) ![GitLabAccessTokens](./organization_of_work_with_sonarqube/GitLabAccessTokens.png)
Далее необходимо создать новый токен с помощью кнопки `Create personal access token`, задав следующие настройки Далее необходимо создать новый токен с помощью кнопки `Create personal access token`, задав следующие настройки
@@ -366,7 +370,7 @@ PING sonarqube (192.168.0.2) 56(84) bytes of data.
После генерации токена, его необходимо скопировать сразу же, иначе, позже он не будет больше доступен. После генерации токена, его необходимо скопировать сразу же, иначе, позже он не будет больше доступен.
![GitLabNewAccessToken](.\organization_of_work_with_sonarqube\GitLabNewAccessToken.png) ![GitLabNewAccessToken](./organization_of_work_with_sonarqube/GitLabNewAccessToken.png)
## Настройка интеграции с ALM в Sonarqube ## Настройка интеграции с ALM в Sonarqube
@@ -374,7 +378,7 @@ PING sonarqube (192.168.0.2) 56(84) bytes of data.
1. Настройка конфигурации интеграции. 1. Настройка конфигурации интеграции.
![SonarqubeIntALM](.\organization_of_work_with_sonarqube\SonarqubeIntALM.png) ![SonarqubeIntALM](./organization_of_work_with_sonarqube/SonarqubeIntALM.png)
1. Необходимо нажать кнопку `Создать конфигурацию`. 1. Необходимо нажать кнопку `Создать конфигурацию`.
2. Ввести имя конфигурации, например, *Gitlab*. 2. Ввести имя конфигурации, например, *Gitlab*.
@@ -384,7 +388,7 @@ PING sonarqube (192.168.0.2) 56(84) bytes of data.
2. Аутентификация **GitLab**. 2. Аутентификация **GitLab**.
![SonarqubeGitlabAuth](.\organization_of_work_with_sonarqube\SonarqubeGitlabAuth.png) ![SonarqubeGitlabAuth](./organization_of_work_with_sonarqube/SonarqubeGitlabAuth.png)
1. Необходимо задать путь к сервису **Gitlab**, который будет состоять из доменного имени. Например, <https://hostname/gitlab>. 1. Необходимо задать путь к сервису **Gitlab**, который будет состоять из доменного имени. Например, <https://hostname/gitlab>.
2. Необходимо заполнить `Application ID` сгенерированным раннее значением. 2. Необходимо заполнить `Application ID` сгенерированным раннее значением.
@@ -424,7 +428,7 @@ PING sonarqube (192.168.0.2) 56(84) bytes of data.
2. Выйдет окно ввода токена доступа 2. Выйдет окно ввода токена доступа
![CreateProjectToken](.\organization_of_work_with_sonarqube\CreateProjectToken.png) ![CreateProjectToken](./organization_of_work_with_sonarqube/CreateProjectToken.png)
3. В этот раз нужно сгенерировать теперь токен доступа также как в разделе [Доступ к проектам **Gitlab**](#доступ-к-проектам-gitlab), но только для текущего пользователя (а не системного) 3. В этот раз нужно сгенерировать теперь токен доступа также как в разделе [Доступ к проектам **Gitlab**](#доступ-к-проектам-gitlab), но только для текущего пользователя (а не системного)
@@ -432,19 +436,20 @@ PING sonarqube (192.168.0.2) 56(84) bytes of data.
4. После ввода персонального токена выйдет список проектов из **Gitlab**, необходимо выбрать нужный. 4. После ввода персонального токена выйдет список проектов из **Gitlab**, необходимо выбрать нужный.
> **Внимание.** Проверьте, что в **Gitlab** необходимые проекты доступны и текущему и системному пользователям. > [!WARNING]
> Проверьте, что в **Gitlab** необходимые проекты доступны и текущему и системному пользователям.
![SonarqubeImport](.\organization_of_work_with_sonarqube\SonarqubeImport.png) ![SonarqubeImport](./organization_of_work_with_sonarqube/SonarqubeImport.png)
5. При нажатии на кнопку `Импорт`, необходимо указать настройку соответствия чистому коду. Можно спокойно указывать `Использовать глобальную настройку`. 5. При нажатии на кнопку `Импорт`, необходимо указать настройку соответствия чистому коду. Можно спокойно указывать `Использовать глобальную настройку`.
6. На следующем шаге необходимо указать метод анализа **Gitlab CI**. 6. На следующем шаге необходимо указать метод анализа **Gitlab CI**.
![SonarqubeMethodALM](.\organization_of_work_with_sonarqube\SonarqubeMethodALM.png) ![SonarqubeMethodALM](./organization_of_work_with_sonarqube/SonarqubeMethodALM.png)
7. После чего откроется окно задания настроек интеграции с **Gitlab** 7. После чего откроется окно задания настроек интеграции с **Gitlab**
![SonarqubeALMSetting](.\organization_of_work_with_sonarqube\SonarqubeALMSetting.png) ![SonarqubeALMSetting](./organization_of_work_with_sonarqube/SonarqubeALMSetting.png)
1. Сгенерировать токен доступа `SONAR_TOKEN` к **Sonarqube** из **Gitlab-runner**: 1. Сгенерировать токен доступа `SONAR_TOKEN` к **Sonarqube** из **Gitlab-runner**:
@@ -452,7 +457,7 @@ PING sonarqube (192.168.0.2) 56(84) bytes of data.
- Можно сгенерировать общий для нескольких проектов из настроек учетной записи пользователя с администраторскими правами. - Можно сгенерировать общий для нескольких проектов из настроек учетной записи пользователя с администраторскими правами.
![SonarqubeToken](.\organization_of_work_with_sonarqube\SonarqubeToken.png) ![SonarqubeToken](./organization_of_work_with_sonarqube/SonarqubeToken.png)
2. Задать переменные в `SONAR_HOST_URL` и `SONAR_TOKEN` в **Gitlab**(см. ниже). 2. Задать переменные в `SONAR_HOST_URL` и `SONAR_TOKEN` в **Gitlab**(см. ниже).
@@ -485,7 +490,7 @@ PING sonarqube (192.168.0.2) 56(84) bytes of data.
- В настройках группы - В настройках группы
- В настройках проекта - В настройках проекта
![GitlabSettingCICD](.\organization_of_work_with_sonarqube\GitlabSettingCICD.png) ![GitlabSettingCICD](./organization_of_work_with_sonarqube/GitlabSettingCICD.png)
Параметры переменных Параметры переменных
@@ -498,7 +503,8 @@ PING sonarqube (192.168.0.2) 56(84) bytes of data.
- `Protected` - False - `Protected` - False
- `Masked` - True - `Masked` - True
> **Информация.** Если значение для `SONAR_TOKEN`было сгенерировано индивидуально для проекта, то его следует разместить в переменных CICD проекта, иначе значение следует разместить в в общих переменных CICD или в переменных группы. > [!IMPORTANT]
> Если значение для `SONAR_TOKEN`было сгенерировано индивидуально для проекта, то его следует разместить в переменных CICD проекта, иначе значение следует разместить в в общих переменных CICD или в переменных группы.
#### Настройка файла конфигурации проекта `sonar-project.properties` #### Настройка файла конфигурации проекта `sonar-project.properties`
@@ -516,22 +522,23 @@ PING sonarqube (192.168.0.2) 56(84) bytes of data.
- `sonar.login` - (не обязательно) - токен для авторизации в **Sonarqube**. - `sonar.login` - (не обязательно) - токен для авторизации в **Sonarqube**.
> Информация. Параметры `sonar.host.url` и `sonar.login` указываются если на сервере **Sonarqube** включено требование принудительной авторизации и/или запрет анонимного анализа проектов. > [!NOTE]
> Параметры `sonar.host.url` и `sonar.login` указываются если на сервере **Sonarqube** включено требование принудительной авторизации и/или запрет анонимного анализа проектов.
- `sonar.sourceEncoding` - кодировка файлов проекта. - `sonar.sourceEncoding` - кодировка файлов проекта.
- `sonar.sources` - пути к файлам проекта. - `sonar.sources` - пути к файлам проекта.
> **Обратите внимание**: > [!CAUTION]
> > - Все русскоязычные пути должны быть [преобразованы](https://unicode-table.com/ru/tools/decoder/) в юникод формат.
> - Все русскоязычные пути должны быть [преобразованы](https://unicode-table.com/ru/tools/decoder/) в юникод формат. > - Для проектов 1С, необходимо указать путь к файлам основной конфигурации, и пути к файлам каждого расширения отдельно.
> - Для проектов 1С, необходимо указать путь к файлам основной конфигурации, и пути к файлам каждого расширения отдельно.
- `sonar.inclusions` - те файлы, которые необходимо анализировать. - `sonar.inclusions` - те файлы, которые необходимо анализировать.
- `sonar.exclusions` - те файлы, которые необходимо пропускать при проверке. - `sonar.exclusions` - те файлы, которые необходимо пропускать при проверке.
> **Информация.** Для проектов 1С сюда можно прописать файлы регламентированной отчетности, что сократит время проверки типовых конфигураций в разы. > [!TIP]
> Для проектов 1С сюда можно прописать файлы регламентированной отчетности, что сократит время проверки типовых конфигураций в разы.
- `sonar.lang.patterns.xml` - определяет какие файлы относятся к **xml**. - `sonar.lang.patterns.xml` - определяет какие файлы относятся к **xml**.
@@ -630,7 +637,7 @@ sonarqube-check:
- Переходим `Admin` - `CI/CD` - Переходим `Admin` - `CI/CD`
![GitlabRunners](.\organization_of_work_with_sonarqube\GitlabRunners.png) ![GitlabRunners](./organization_of_work_with_sonarqube/GitlabRunners.png)
- Создаем новый **runner** - Создаем новый **runner**
@@ -640,11 +647,12 @@ sonarqube-check:
- После создания runner выходит информация о регистрации, запомним ее - После создания runner выходит информация о регистрации, запомним ее
![GitlabRunnerRegister](.\organization_of_work_with_sonarqube\GitlabRunnerRegister.png) ![GitlabRunnerRegister](./organization_of_work_with_sonarqube/GitlabRunnerRegister.png)
2. Настроить **runner** на машине исполнения 2. Настроить **runner** на машине исполнения
> **Информация.** Можно настроить на той же машине, где настроен sonarqube. > [!NOTE]
> Можно настроить на той же машине, где настроен sonarqube.
- **Runner** будет настроен через среду **compose** - **Runner** будет настроен через среду **compose**
@@ -728,7 +736,7 @@ sonarqube-check:
Также в кабинете **gitlab** настройках ранее зарегистрированного **runner** можно указать какие проекты он обслуживает. Также в кабинете **gitlab** настройках ранее зарегистрированного **runner** можно указать какие проекты он обслуживает.
![GitlabProjectEnableRunner](.\organization_of_work_with_sonarqube\GitlabProjectEnableRunner.png) ![GitlabProjectEnableRunner](./organization_of_work_with_sonarqube/GitlabProjectEnableRunner.png)
### Первый запуск проверки Sonarqube ### Первый запуск проверки Sonarqube
@@ -747,7 +755,7 @@ sonarqube-check:
<p><b>Почта</b>: agibalovsa@gmail.com</p> <p><b>Почта</b>: agibalovsa@gmail.com</p>
<p><b>Telegram</b>: @agibse</p> <p><b>Telegram</b>: @agibse</p>
</div> </div>
<div><a href="https://yoomoney.ru/to/4100119287125731" style="Font-family: segoe script; Font-size: 20px; text-decoration: none; color: #000000; Font-weight: bold"><img src=".\organization_of_work_with_sonarqube\samurai2.webp" width="80" height="80">Donate</a></div> <div><a href="https://yoomoney.ru/to/4100119287125731" style="Font-family: segoe script; Font-size: 20px; text-decoration: none; color: #000000; Font-weight: bold"><img src="./organization_of_work_with_sonarqube/samurai2.webp" width="80" height="80">Donate</a></div>
</div> </div>
---- ----