Это руководство проведет вас через выбор лучшего способа развертывания Baserow на AWS, какие предварительные условия вам потребуется настроить, а также предоставит конкретные инструкции по установке. Это руководство предназначено для тех, кто уже имеет опыт и знания по развертыванию приложений на AWS.
Baserow можно развернуть на AWS следующими способами:
Все эти методы развертывания будут хранить данные и состояние Baserow в RDS и S3, что делает переход между ними (например, миграцию на использование EKS позже) простым.
Мы рассмотрим это более подробно позже в руководстве, но для быстрого обзора вот что потребуется для любого развертывания Baserow на AWS:
Образ baserow/baserow:1.33.4
запускает все различные службы Baserow внутри контейнера для удобства использования.
Этот образ предназначен для развертывания на одном сервере или простых развертываний на горизонтально масштабируемых платформах контейнеров, таких как AWS Fargate или Google Cloud Run.
baserow/baserow:1.33.4
.baserow/baserow:1.33.4
, по умолчанию у вас будет:
Мы пропустим настройку VPC, групп безопасности, пользователей IAM, менеджера секретов и специфику ELB, чтобы сделать это руководство более универсальным.
Сначала Baserow нужен бакет S3. Baserow будет использовать этот бакет для хранения файлов, загруженных пользователями в таблицы, и экспорта таблиц для последующего скачивания пользователями.
Baserow затем будет генерировать предварительно подписанные URL-адреса S3 для просмотра и скачивания файлов из этого бакета. В результате эти предварительно подписанные URL-адреса должны быть доступны из браузера пользователя, поэтому в зависимости от вашей конфигурации вероятно, что бакет должен разрешать публичные GET/ACL.
Рекомендуется создать отдельного пользователя IAM, с которым будут настроены учетные данные Baserow, чтобы он мог загружать и удалять файлы из бакета. Вот пример политики S3 для этого пользователя, чтобы предоставить минимально необходимые операции:
policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObjectAcl",
"s3:GetObject",
"s3:DeleteObject",
"s3:PutObjectAcl"
],
"Principal": {
"AWS": "arn:aws:iam::xyz:user/YOUR_USER"
},
"Resource": [
"arn:aws:s3:::YOUR_BUCKET_NAME/*",
"arn:aws:s3:::YOUR_BUCKET_NAME"
]
}]
}
Этот бакет также в текущей версии Baserow потребует правил CORS для корректной работы кнопки загрузки файлов в инструмент. Пример правила приведен ниже:
cors_rule {
allowed_headers = ["*"]
allowed_methods = ["GET", "HEAD", "OPTIONS"]
allowed_origins = ["REPLACE_WITH_YOUR_BASEROW_PUBLIC_URL"]
expose_headers = ["ETag", "Content-Length", "Content-Type"]
max_age_seconds = 3000
}
Наконец, вот публичные параметры доступа, которые мы использовали, чтобы обеспечить возможность GET и скачивания файлов S3 из браузера пользователя:
block_public_acls = false
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
Baserow хранит все свои данные, кроме файлов, в базе данных PostgreSQL. В AWS рекомендуется использовать кластер RDS Postgres. Позже вам потребуется настроить Baserow для доступа к этому кластеру.
Baserow активно использует PostgreSQL, поэтому для больших развертываний потребуется масштабирование RDS кластера.
Не следует использовать RDS Proxy перед экземпляром RDS. Это связано с тем, что прокси завершает транзакцию после выполнения оператора определения языка (DDL). Baserow несовместим с этим, так как он выполняет изменения схемы, и если что-то пойдет не так после миграции схемы, транзакция не будет откатываться, что приводит к несоответствию данных. Дополнительная информация: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-proxy.howitworks.html#rds-proxy-transactions
Baserow использует Redis как кэш, для реального времени совместной работы через WebSocket и обработки асинхронных фоновых задач.
Рекомендуется создать Elasticache Redis в режиме без кластера с включенным TLS и режимом AUTH, где можно указать токен пароля AUTH для подключения Baserow к серверу Redis.
Обычно сервер Redis не является узким местом в развертываниях Baserow при их масштабировании.
Теперь создайте группу целевых объектов на порту 80 и ALB для маршрутизации трафика к контейнерам Baserow.
При настройке проверки состояния ALB для контейнера baserow/baserow:1.33.4
, который вы будете развертывать дальше, выберите порт 80
и URL проверки состояния /api/_health/
. Рекомендуется длительный период ожидания в 900 секунд для учета первоначальных миграций при запуске первого контейнера.
Теперь мы готовы запустить наши контейнеры baserow/baserow:1.33.4
. См. ниже полное определение задачи и переменные окружения. Рекомендуется запускать контейнеры с 2vCPU и 4 ГБ ОЗУ каждая. Вкратце вам нужно будет:
baserow/baserow:1.33.4
.80
по протоколу TCP, так как этот образ HTTP-сервер слушает по умолчанию.Полный список всех доступных переменных окружения можно найти здесь.
Переменная окружения | Описание |
---|---|
DISABLE_VOLUME_CHECK=true |
Должна быть установлена в true. Необходима для отключения проверки, предназначенной для помощи непрофессиональным пользователям, которые не настраивают внешний Postgres и S3. Поскольку мы настраиваем внешние службы, нам не нужны подключенные тома в контейнере. |
BASEROW_PUBLIC_URL |
Публичный URL или IP-адрес, который будет использоваться для доступа к Baserow в браузере пользователя. Всегда должен начинаться с http:// https:// даже если доступ осуществляется через IP-адрес. |
DATABASE_HOST |
Имя хоста базы данных Postgres, которую Baserow будет использовать для хранения данных. |
DATABASE_USER |
Имя пользователя базы данных, которое Baserow будет использовать для подключения к базе данных по адресу DATABASE_HOST . |
DATABASE_PORT |
Порт, который Baserow будет использовать при попытке подключения к базе данных Postgres по адресу DATABASE_HOST . |
DATABASE_NAME |
Имя базы данных, которую Baserow будет использовать для хранения данных. |
DATABASE_PASSWORD |
Пароль пользователя DATABASE_USER на сервере Postgres по адресу DATABASE_HOST . Альтернативно можно предоставить DATABASE_PASSWORD_FILE и указать путь к файлу секрета, внедренного в файловую систему контейнера. |
REDIS_URL |
Стандартная строка подключения Redis в формате: redis://[redisuser]:[password]@[redishost]:[redisport]/0?ssl_cert_reqs=required . |
AWS_STORAGE_BUCKET_NAME |
Имя вашего бакета AWS storage. |
AWS_ACCESS_KEY_ID |
Ключ доступа вашего учетной записи IAM S3 AWS. При установке значения отличного от пустого строки переключит Baserow на использование совместимого с S3 бакета для хранения файлов, загруженных пользователем. |
AWS_SECRET_ACCESS_KEY |
Секретный ключ доступа вашей учетной записи IAM S3 AWS. Также можно предоставить AWS_SECRET_ACCESS_KEY_FILE . |
DOWNLOAD_FILE_VIA_XHR |
Должна быть установлена в 1 , чтобы работать с AWS S3 в настоящее время для принудительной загрузки ссылок на файлы через XHR запрос для обхода Content-Disposition: inline . Если ваши файлы хранятся под другим источником, также необходимо добавить заголовки CORS к вашему бакету S3. |
BASEROW_EXTRA_ALLOWED_HOSTS |
Необязательный список хостов через запятую, которые будут добавлены в параметр ALLOWED_HOSTS Django-бэкенда Baserow. Добавьте IP-адрес вашего ALB здесь, чтобы проверки состояния, которые он отправляет, были разрешены, или альтернативно настройте менее безопасное значение * , чтобы запустить все и ограничить хосты позже после того, как все заработает. |
BASEROW_JWT_SIGNING_KEY |
Должна быть установлена так, чтобы все контейнеры имели одинаковый ключ подписи. Ключ подписи используется для подписи содержимого генерируемых токенов. Для подписи HMAC это должна быть случайная строка с количеством бит данных не менее требуемого протоколом подписи. Подробнее см. здесь. Также поддерживается BASEROW_JWT_SIGNING_KEY_FILE . |
SECRET_KEY |
Должна быть установлена так, чтобы все контейнеры имели одинаковый секретный ключ. Секретный ключ, используемый Django для криптографической подписи таких вещей, как генерация безопасных ссылок для сброса пароля и управление сессиями. Подробнее см. здесь. Также поддерживается SECRET_KEY_FILE . |
EMAIL_SMTP_* |
Есть несколько переменных окружения, связанных с SMTP, документированных в нашем руководстве по переменным окружения здесь, которые также нужно будет установить, чтобы Baserow мог отправлять приглашения и ссылки для сброса пароля по электронной почте. |
Вот полное определение задачи с использованием ECS и Fargate.
container_definitions = <<DEFINITION
[
{
"name": "baserow_task",
"image": "baserow/baserow:1.33.4",
"logConfiguration": { #логирование не обязательно
"logDriver": "awslogs",
"options": {
"awslogs-region" : "YOUR_REGION_NAME",
"awslogs-group" : "/ecs/baserow_log",
"awslogs-stream-prefix" : "baserow",
"awslogs-create-group": "true"
}
},
"environment": [
{
"name": "DISABLE_VOLUME_CHECK",
"value": "yes"
},
{
"name": "BASEROW_PUBLIC_URL",
"value": "<YOUR_PUBLIC_URL>"
},
{
"name": "DATABASE_HOST",
"value": "<YOUR_POSTGRES_DB_HOST>"
},
{
"name": "DATABASE_USER",
"value": "postgres"
},
{
"name": "DATABASE_PORT",
"value": "<PORT_NUMBER>"
},
{
"name": "DATABASE_NAME",
"value": "<YOUR_POSTGRES_DB_NAME>"
},
{
"name": "DATABASE_PASSWORD",
"value": "<YOUR_POSTGRES_DB_PASSWORD>"
},
{
"name": "REDIS_URL",
"value": "rediss://default:password@YOUR_REDIS_PRIMARY_ENDPOINT:6379/0?ssl_cert_reqs=required"
},
{
"name": "AWS_STORAGE_BUCKET_NAME",
"value": "<YOUR_BUCKET_NAME>"
},
{
"name": "AWS_ACCESS_KEY_ID",
"value": "<YOUR_AWS_ACCESS_KEY_ID>"
},
{
"name": "AWS_SECRET_ACCESS_KEY",
"value": "<YOUR_AWS_SECRET_ACCESS_KEY>"
},
{
"name": "DOWNLOAD_FILE_VIA_XHR",
"value": "1"
},
{
"name": "BASEROW_EXTRA_ALLOWED_HOSTS",
"value": "<YOUR_ALLOWED_HOSTS>"
},
{
"name": "BASEROW_JWT_SIGNING_KEY",
"value": "<YOUR_SIGNING_KEY>"
},
{
"name": "SECRET_KEY",
"value": "<YOUR_SECRET_KEY>"
}
],
"essential": true,
"portMappings": [
{
"containerPort": 80,
"hostPort": 80
}
],
"memory": 8192,
"cpu": 4096
}
]
DEFINITION
requires_compatibilities = ["FARGATE"]
network_mode = "awsvpc"
memory = 8192
cpu = 4096
Кроме запуска большего количества задач baserow/baserow
и масштабирования сервера RDS Postgres, образ baserow/baserow
имеет следующие переменные окружения масштабирования, которые могут помочь уменьшить использование ресурсов на контейнер или распределить больше ресурсов на определенные службы внутри контейнера.
BASEROW_AMOUNT_OF_GUNICORN_WORKERS
управляет количеством рабочих процессов REST API (те процессы, которые выполняют большую часть работы API) на контейнер. По умолчанию установлено значение 3. Каждый дополнительный рабочий процесс обычно занимает около 100-200 МБ ОЗУ.BASEROW_AMOUNT_OF_WORKERS
управляет количеством рабочих процессов Celery для выполнения фоновых задач, таких как реальное время совместной работы, очистка задач и другие медленные задачи, такие как большие экспорт/импорт файлов. Если вы масштабируете много этих контейнеров, вероятно, вам понадобится только один из этих фоновых рабочих процессов на контейнер, так как они будут объединяться вместе и собирать фоновые задачи, отправленные из любого другого контейнера через Redis.BASEROW_RUN_MINIMAL=yes
И BASEROW_AMOUNT_OF_WORKERS=1
.
Теперь у вас должно быть полностью работающее кластерное развертывание Baserow. Первый пользователь, который зарегистрируется, станет первым администратором системы со статусом «staff». Этот пользователь затем сможет настроить параметры инструмента Baserow, активировать лицензии предприятия и продвигать других пользователей до статуса «staff».
Образы baserow/backend:1.33.4
и baserow/web-frontend:1.33.4
позволяют запускать различные службы Baserow как отдельные контейнеры.
Эти образы используются сообщественным Helm-чартом, различными примерами конфигурации docker-compose.yml и являются лучшим выбором для производственных сред, где вам требуется полный контроль и гибкость управления Baserow.
Следуйте шагам 1, 2 и 3 из руководства Вариант 1 выше, так как нам потребуется точно такой же бакет S3, RDS и Redis.
Сначала вам нужно создать три отдельные группы целевых объектов с типом целевого объекта IP:
backend-asgi
на порту 8000
/HTTP
с проверкой состояния по URL /api/_health/
для нашего сервиса WebSocket.backend-wsgi
на порту 8000
/HTTP
с проверкой состояния по URL /api/_health/
для нашего сервиса API бэкенда.web-frontend
на порту 3000
/HTTP
с проверкой состояния по URL /_health/
для нашего фронтенд-сервиса.Завершающий слеш в конечных точках проверки состояния обязателен!
Теперь создайте ALB с прослушивателем HTTP порта 80, маршрутизирующим трафик к группе web-frontend
. Затем перейдите к этому прослушивателю и настройте его с тремя разными правилами маршрутизации к каждой из отдельных групп.
web-frontend
./ws/*
, перенаправляющее запросы в группу backend-asgi
./api/*
, перенаправляющее запросы в группу backend-wsgi
.Позже служба фронтенда Baserow должна сможет общаться со службой backend-wsgi
через балансировщик нагрузки. Вы можете использовать этот же балансировщик нагрузки как для внешних запросов, так и для этих межсервисных запросов при необходимости; однако убедитесь, что вы правильно настроили группы безопасности для обеспечения связи между задачами ECS и ALB.
Теперь давайте развернем каждую из отдельных служб Baserow на Fargate/ECS. Создайте новый кластер для Baserow и затем продолжайте создавать следующие определения задач.
Если вы знакомы с K8S, то этот пример конфигурации дает обзор служб.
Альтернативно этот docker-compose
также можно использовать в качестве справочника
Эта служба является нашей службой HTTP REST API. При создании определения задачи вам следует:
baserow/backend:1.33.4
gunicorn-wsgi --timeout 60
.Рекомендуется установить таймаут каждого HTTP API запроса в 60 секунд в команде выше, так как значение по умолчанию в 30 секунд может быть слишком коротким для очень больших таблиц Baserow.
8000
/TCP
с протоколом приложения HTTP.BASEROW_PUBLIC_URL
| Публичный URL или IP-адрес, который будет использоваться для доступа к Baserow в браузере пользователя. Всегда должен начинаться с http://
или https://
, даже если доступ осуществляется через IP-адрес. |
| DATABASE_HOST
| Имя хоста PostgreSQL-базы данных, которую Baserow будет использовать для хранения данных. |
| DATABASE_USER
| Имя пользователя базы данных, которое Baserow будет использовать для подключения к базе данных на DATABASE_HOST
. |
| DATABASE_PORT
| Порт, который Baserow будет использовать при попытке подключения к PostgreSQL-базе данных на DATABASE_HOST
. |
| DATABASE_NAME
| Имя базы данных, которую Baserow будет использовать для хранения данных. |
| DATABASE_PASSWORD
| Пароль пользователя DATABASE_USER
на сервере PostgreSQL на DATABASE_HOST
. Альтернативно, можно предоставить DATABASE_PASSWORD_FILE
и указать путь к файлу с секретом, встроенному в файловую систему контейнера. |
| REDIS_URL
| Стандартная строка подключения Redis в формате: redis://[redisuser]:[password]@[redishost]:[redisport]/0?ssl_cert_reqs=required
. |
| AWS_STORAGE_BUCKET_NAME
| Имя вашего бакета хранения AWS. |
| AWS_ACCESS_KEY_ID
| Ключ доступа для вашей учетной записи IAM S3 AWS. При установке значения, отличного от пустого, Baserow переключится на использование совместимого с S3 бакета для хранения файлов, загруженных пользователем. |
| AWS_SECRET_ACCESS_KEY
| Секретный ключ доступа для вашей учетной записи IAM S3 AWS. Можно также предоставить AWS_SECRET_ACCESS_KEY_FILE
. |
| BASEROW_EXTRA_ALLOWED_HOSTS
| Необязательный список хостов, разделенных запятыми, которые будут добавлены в настройку ALLOWED_HOSTS Django-бэкенда Baserow. Добавьте сюда IP-адрес вашего ALB, чтобы проверки состояния, которые он отправляет, проходили, или альтернативно настройте менее безопасное значение *
, чтобы запустить все и ограничить хосты позже, когда все будет работать. |
| BASEROW_JWT_SIGNING_KEY
| Должна быть установлена, чтобы все контейнеры использовали один и тот же ключ подписи. Ключ подписи используется для подписи содержимого генерируемых токенов. Для подписи HMAC это должно быть случайная строка с количеством битов данных, не меньшим, чем требуется протоколом подписи. Подробнее см. здесь. Также поддерживается BASEROW_JWT_SIGNING_KEY_FILE
. |
| SECRET_KEY
| Должна быть установлена, чтобы все контейнеры использовали один и тот же секретный ключ. Секретный ключ, используемый Django для криптографической подписи, такой как генерация безопасных ссылок для сброса пароля и управление сессиями. Подробнее см. здесь. Также поддерживается SECRET_KEY_FILE
. |
| EMAIL_SMTP_*
| Существует несколько переменных окружения, связанных с SMTP, документированных в нашем руководстве по переменным окружения здесь, которые также должны быть установлены, чтобы Baserow мог отправлять приглашения и письма для сброса пароля. |Возможно использовать только сервис ASGI без создания отдельных сервисов ASGI и WSGI, и затем маршрутизировать все HTTP и WebSocket-запросы в единый сервис ASGI. Однако, производительность сервиса ASGI при обработке обычных HTTP-запросов ниже, чем у сервиса в режиме WSGI. Также возможность масштабирования их отдельно полезна, так как часто требуется только несколько сервисов ASGI для обработки нагрузки от WebSocket.
Этот сервис является нашим API-сервисом WebSocket, и при настройке определения задачи вам следует:
baserow/backend:1.33.4
.gunicorn
в качестве команды.8000
/TCP
.Этот сервис используется для выполнения асинхронных задач высокого приоритета, таких как реальное сотрудничество и отправка электронной почты.
baserow/backend:1.33.4
с командой celery-worker
.celery-worker
в качестве команды.Этот сервис используется для выполнения асинхронных задач низкого приоритета, таких как пакетные процессы и выполнение потенциально медленных операций для пользователей, например, экспорт и импорт таблиц.
baserow/backend:1.33.4
.celery-exportworker
в качестве команды.Этот сервис является планировщиком задач CRON, который может иметь несколько реплик.
baserow/backend:1.33.4
.celery-beat
в качестве команды.Наконец, этот сервис используется для серверной-side рендеринга и фронтенд-сервиса Baserow.
baserow/web-frontend:1.33.4
, без параметров.3000
.BASEROW_PUBLIC_URL
:
Публичный URL или IP-адрес, который будет использоваться для доступа к Baserow в браузере пользователя. Всегда должен начинаться с http://
или https://
, даже если доступ осуществляется через IP-адрес.PRIVATE_BACKEND_URL
: Web-frontend контейнер должен иметь возможность отправлять HTTP-запросы к контейнеру backend-wsgi
, который выполняет REST API.
http://
или https://
.BASEROW_EXTRA_ALLOWED_HOSTS=*
для контейнеров backend-wsgi
и backend-asgi
, убедитесь, что значение этого параметра добавлено в переменную окружения BASEROW_EXTRA_ALLOWED_HOSTS
этих сервисов, чтобы они разрешали соединения от web-frontend.DOWNLOAD_FILE_VIA_XHR
: Должно быть установлено значение 1
, чтобы работать с AWS S3 текущего использования, заставляя ссылки на скачивание файлов проходить через XHR запросы, чтобы обойти заголовок Content-Disposition: inline
. Если ваши файлы хранятся в другом источнике, также необходимо добавить заголовки CORS в S3 бакет.Теперь вернитесь и создайте ECS сервисы для только что созданных определений задач. Помните о том, чтобы при подключении установить период ожидания проверки состояния равным 900 секундам.
Или вы можете создать один ECS сервис для всех задач Baserow, но вам нужно будет использовать API/CLI для подключения нескольких групп целевых объектов к этому одному ECS сервису, так как это невозможно сделать через AWS UI сейчас. Вам также может потребоваться убедиться, что
backend-asgi
иbackend-wsgi
экспонируются на разных портах, чтобы группы целевых объектов могли правильно маршрутизировать запросы к каждому сервису. Установите разные значения переменной окруженияBASEROW_BACKEND_PORT
на этих сервисах, чтобы они привязывались к разным портам внутри контейнера.
backend-wsgi
, подключенный к группе целевых объектов backend-wsgi
backend-asgi
, подключенный к группе целевых объектов backend-asgi
web-frontend
, подключенный к группе целевых объектов web-frontend
celery-worker
celery-exportworker
celery-beat
В большинстве случаев масштабирование ваших задач backend-wsgi
и RDS Postgres будет первым выбором для обработки большего количества запросов. Если ваше реальное сотрудничество замедляется, можно масштабировать службы backend-asgi
и celery-worker
. Наконец, если вам приходится долго ждать начала выполнения заданий (они будут застревать на 0% в интерфейсе Baserow), можно добавить больше служб celery-exportworker
.
Есть также следующие переменные окружения для изменения количества запускаемых рабочих процессов внутри каждого контейнера для вертикального масштабирования каждого контейнера:
BASEROW_AMOUNT_OF_GUNICORN_WORKERS
контролирует количество рабочих процессов REST API в каждом контейнере gunicorn-wsgi
или gunicorn
(компонент, выполняющий большую часть работы API). По умолчанию значение равно 3. Каждый дополнительный рабочий процесс обычно занимает около 100-200 МБ ОЗУ.BASEROW_AMOUNT_OF_WORKERS
контролирует количество рабочих процессов Celery runner в контейнерах celery-worker
и celery-exportworker
.Теперь у вас должно быть полностью работающее кластерное развертывание Baserow. Этот метод развертывания более сложный, если вам нужна помощь, пожалуйста, создайте тему на нашем сообщественном форуме.
Первый зарегистрированный пользователь станет первым администратором экземпляра «staff». Этот пользователь сможет настроить внутренние параметры Baserow, активировать лицензии предприятия и повышать других пользователей до статуса «staff».
Обновление развертывания Baserow на ECS/Fargate можно выполнить следующими шагами:
baserow/baserow
или baserow/backend-wsgi/asgi
автоматически применит необходимые миграции базы данных и обновления.CROSSSLOT Keys in request don't hash to the same slot
Если вы видите эту ошибку в логах, это означает, что вы используете Redis в режиме кластера. Библиотеки, используемые Baserow, не поддерживают Redis в режиме кластера, поэтому вам нужно настроить новый Redis без режима кластера для его корректной работы. Redis без режима кластера все еще может быть масштабируемым и многорегиональным развертыванием; кроме того, Baserow обычно не вызывает Redis как бутылочное горло запросов.
Первое развертывание или первая миграция после обновления могут занять некоторое время, поэтому вам может потребоваться увеличить период ожидания.
Во-вторых, убедитесь, что ELB может подключиться к контейнерам. Обратите внимание, что у контейнеров есть свои внутренние скрипты проверки состояния, которые также вызывают эндпоинты проверки состояния. Поэтому наличие ответа 200 от проверок состояния в логах не означает, что это были ответы от ELB.
На вашем S3 бакете неправильно настроены CORS-правила. Проверьте пример конфигурации CORS выше или обратитесь за поддержкой.
Убедитесь, что вы добавили параметр ?ssl_cert_reqs=required
в конце вашей переменной окружения REDIS_URL
.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )