update repo

This commit is contained in:
jenkins 2025-06-20 10:40:14 +03:00 committed by Jenkins agent user
parent e6e6b3eb65
commit 3334b5174e
210 changed files with 16281 additions and 93 deletions

View File

@ -1,93 +1 @@
# cw-deploy # Cowork deloy
## Getting started
To make it easy for you to get started with GitLab, here's a list of recommended next steps.
Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)!
## Add your files
- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files
- [ ] [Add files using the command line](https://docs.gitlab.com/topics/git/add_files/#add-files-to-a-git-repository) or push an existing Git repository with the following command:
```
cd existing_repo
git remote add origin https://git.co-work.ru/devops/cw-deploy.git
git branch -M main
git push -uf origin main
```
## Integrate with your tools
- [ ] [Set up project integrations](https://git.co-work.ru/devops/cw-deploy/-/settings/integrations)
## Collaborate with your team
- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/)
- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html)
- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically)
- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/)
- [ ] [Set auto-merge](https://docs.gitlab.com/user/project/merge_requests/auto_merge/)
## Test and Deploy
Use the built-in continuous integration in GitLab.
- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/)
- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing (SAST)](https://docs.gitlab.com/ee/user/application_security/sast/)
- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html)
- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/)
- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html)
***
# Editing this README
When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thanks to [makeareadme.com](https://www.makeareadme.com/) for this template.
## Suggestions for a good README
Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information.
## Name
Choose a self-explaining name for your project.
## Description
Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors.
## Badges
On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge.
## Visuals
Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method.
## Installation
Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection.
## Usage
Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README.
## Support
Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc.
## Roadmap
If you have ideas for releases in the future, it is a good idea to list them in the README.
## Contributing
State if you are open to contributions and what your requirements are for accepting them.
For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self.
You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser.
## Authors and acknowledgment
Show your appreciation to those who have contributed to the project.
## License
For open source projects, say how it is licensed.
## Project status
If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers.

View File

@ -0,0 +1,24 @@
======================================================================
Playbook information
======================================================================
Плейбук по развертыванию COWORK в Docker
Поддерживаемые версии ОС: Ubuntu (20.04 - 26.04)
### DEPLOY COWORK ###
- Определяем инстанс в файле - vars/common.yml
- Определяем тип приложения и компоненты установки в файле - vars/\<instance\>/common.yml
- Добавляем хосты в соответствующие роли компонентов в inventory для конкретного инстанса- inventory/\<instance\>/hosts
- Заполняем все переменные для сервиса CA в каталоге инстанса - vars/\<instance\>/ca (Если выбрана установка данного компонента)
- Запускаем роль подготовки СА сервиса (Если выбрана установка данного компонента)
ansible-playbook -i inventory/\<instance\>/hosts main.yml --tags "ca"
- Копируем информацию о внутренних сертификатах в файл переменных - vars/\<instance\>/ssl_secret.yml
cat /opt/CA/RootCA.crt > в переменную rootca_int_crt
cat /opt/CA/service/wc.crt > в переменную wc_int_crt
cat /opt/CA/service/wc.key > в переменную wc_int_key
- Побавляем информацию о внешних сертификатах в файл переменных - vars/\<instance\>/ssl_secret.yml
Переменные: wc_ext_crt, wc_ext_key, rootca_int_crt
- Заполняем все переменные по устанавливаемым сервисам в каталоге - vars/\<instance\>/
- Запускаем основной плейбук развертывания
ansible-playbook -i inventory/\<instance\>/hosts main.yml
- Ждем успешного завершения и выполняем проверку работы сервисов

View File

@ -0,0 +1,5 @@
[defaults]
ansible_managed="Ansible managed"
host_key_checking=False
# inventory=inventory/cw-p01.local/hosts
# inventory=inventory/

View File

@ -0,0 +1,9 @@
---
# defaults vars
# ansible_python_interpreter: "/usr/libexec/platform-python"
ansible_ssh_pipelining: "true"
ansible_user: "gem-admin"
ansible_ssh_transfer_method: "piped"
ansible_ssh_common_args: "-o StrictHostKeyChecking=no"
ansible_port: 22

View File

@ -0,0 +1,5 @@
---
# handlers file

View File

@ -0,0 +1,21 @@
[docker-host]
[ca-host]
nubes-ldap ansible_host=192.168.2.7
[dns-host]
nubes-ldap ansible_host=192.168.2.7
[ldap-host]
nubes-ldap ansible_host=192.168.2.7
[iam-host]
nubes-iam ansible_host=192.168.2.8
[s3-host]
nubes-s3 ansible_host=192.168.2.6
[livekit-host]
[mon-host]
nubes-mon ansible_host=192.168.2.5

141
cw_docker_deploy/main.yml Normal file
View File

@ -0,0 +1,141 @@
---
- name: CA install
hosts: ca-host
serial: 1
any_errors_fatal: true
gather_facts: false
become: true
vars_files:
- defaults/main.yml
- vars/common.yml
- vars/{{ instance_name }}/common.yml
- vars/{{ instance_name }}/ca/ca_conf.yml
- vars/{{ instance_name }}/ca/ca_secret.yml
pre_tasks:
- { import_tasks: tasks/check_os_version.yml , tags: ["ca"] }
roles:
- { role: ca_service, tags: ["ca"], when: ansible_distribution == "Ubuntu" and ca_install == "yes" }
- name: DNS install
hosts: dns-host
serial: 1
any_errors_fatal: true
gather_facts: false
become: true
vars_files:
- defaults/main.yml
- vars/common.yml
- vars/{{ instance_name }}/common.yml
- vars/{{ instance_name }}/dns/dns_conf.yml
- vars/{{ instance_name }}/dns/dns_zone.yml
pre_tasks:
- { import_tasks: tasks/check_os_version.yml , tags: ["dns"] }
roles:
- { role: dns_service, tags: ["dns"], when: ansible_distribution == "Ubuntu" and dns_install == "yes" }
- name: Base prepate Linux server
hosts: all
any_errors_fatal: true
gather_facts: false
become: true
vars_files:
- defaults/main.yml
- vars/common.yml
- vars/{{ instance_name }}/common.yml
- vars/{{ instance_name }}/ssl_secret.yml
- vars/{{ instance_name }}/prep/prep_conf.yml
- vars/{{ instance_name }}/prep/prep_secret.yml
pre_tasks:
- { import_tasks: tasks/check_os_version.yml , tags: ["linux_prep"] }
roles:
- { role: ubuntu_prep, tags: ["linux_prep"], when: ansible_distribution == "Ubuntu" and prep_os == "yes" }
- name: LDAP install (Docker)
hosts: ldap-host
gather_facts: false
become: true
vars_files:
- defaults/main.yml
- vars/common.yml
- vars/{{ instance_name }}/common.yml
- vars/{{ instance_name }}/ssl_secret.yml
- vars/{{ instance_name }}/ldap/ldap_conf.yml
- vars/{{ instance_name }}/ldap/ldap_secret.yml
pre_tasks:
- { import_tasks: tasks/check_os_version.yml , tags: ["docker", "ldap"] }
roles:
- { role: docker_install, tags: ["docker"], when: ansible_distribution == "Ubuntu" and docker_install == "yes" and ldap_install == "yes"}
- { role: ldap_service, tags: ["ldap"], when: ansible_distribution == "Ubuntu" and ldap_install == "yes" }
- name: IAM install (Docker)
hosts: iam-host
gather_facts: false
become: true
vars_files:
- defaults/main.yml
- vars/common.yml
- vars/{{ instance_name }}/common.yml
- vars/{{ instance_name }}/ssl_secret.yml
- vars/{{ instance_name }}/iam/iam_conf.yml
- vars/{{ instance_name }}/iam/iam_secret.yml
pre_tasks:
- { import_tasks: tasks/check_os_version.yml , tags: ["docker", "iam", "iam_prep"] }
roles:
- { role: docker_install, tags: ["docker"], when: ansible_distribution == "Ubuntu" and docker_install == "yes" and iam_install == "yes"}
- { role: iam_service, tags: ["iam"], when: ansible_distribution == "Ubuntu" and iam_install == "yes" }
- { role: iam_prep, tags: ["iam_prep"], when: ansible_distribution == "Ubuntu" and iam_install == "yes" }
- name: S3 install
hosts: s3-host
gather_facts: false
become: true
vars_files:
- defaults/main.yml
- vars/common.yml
- vars/{{ instance_name }}/common.yml
- vars/{{ instance_name }}/ssl_secret.yml
- vars/{{ instance_name }}/s3/s3_conf.yml
- vars/{{ instance_name }}/s3/s3_secret.yml
pre_tasks:
- { import_tasks: tasks/check_os_version.yml , tags: ["s3", "s3_prep"] }
roles:
- { role: s3_service, tags: ["s3"], when: ansible_distribution == "Ubuntu" and s3_install == "yes" }
- { role: s3_prep, tags: ["s3_prep"], when: ansible_distribution == "Ubuntu" and s3_install == "yes" }
- name: Livekit install (Docker)
hosts: livekit-host
gather_facts: false
become: true
vars_files:
- defaults/main.yml
- vars/common.yml
- vars/{{ instance_name }}/common.yml
- vars/{{ instance_name }}/ssl_secret.yml
- vars/{{ instance_name }}/livekit/livekit_conf.yml
- vars/{{ instance_name }}/livekit/livekit_secret.yml
pre_tasks:
- { import_tasks: tasks/check_os_version.yml , tags: ["docker", "livekit"] }
roles:
- { role: docker_install, tags: ["docker"], when: ansible_distribution == "Ubuntu" and docker_install == "yes" and livekit_install == "yes"}
- { role: livekit_service, tags: ["livekit"], when: ansible_distribution == "Ubuntu" and livekit_install == "yes" }
- name: Backend install (Docker)
hosts: docker-host
gather_facts: false
become: true
vars_files:
- defaults/main.yml
- vars/common.yml
- vars/{{ instance_name }}/common.yml
- vars/{{ instance_name }}/ssl_secret.yml
- vars/{{ instance_name }}/back/back_conf.yml
- vars/{{ instance_name }}/back/back_secret.yml
- vars/{{ instance_name }}/iam/iam_secret.yml
- vars/{{ instance_name }}/livekit/livekit_secret.yml
- vars/{{ instance_name }}/s3/s3_secret.yml
pre_tasks:
- { import_tasks: tasks/check_os_version.yml , tags: ["docker", "back"] }
roles:
- { role: docker_install, tags: ["docker"], when: ansible_distribution == "Ubuntu" and docker_install == "yes" and back_install == "yes" }
- { role: back_service, tags: ["back"], when: ansible_distribution == "Ubuntu" and back_install == "yes" }

View File

@ -0,0 +1,4 @@
======================================================================
Role information
======================================================================
Установка back apps в docker

View File

@ -0,0 +1,20 @@
CREATE TABLE IF NOT EXISTS users (
id BIGINT NOT NULL,
user_name VARCHAR(255),
nick_name VARCHAR(255),
phone VARCHAR(255),
email VARCHAR(255),
title VARCHAR(255),
PRIMARY KEY (id)
);
CREATE TABLE IF NOT EXISTS users_chats (
id VARCHAR(50),
user_id BIGINT NOT NULL,
chat_id BIGINT NOT NULL,
PRIMARY KEY (id)
);
CREATE INDEX idx_users_chats_chat_id ON users_chats(chat_id);
CREATE EXTENSION IF NOT EXISTS pg_trgm;

View File

@ -0,0 +1,77 @@
{
"settings": {
"index": {
"number_of_shards": 3,
"number_of_replicas": 1,
"max_ngram_diff": 2
},
"analysis": {
"analyzer": {
"ngram_analyzer": {
"type": "custom",
"tokenizer": "ngram_tokenizer",
"filter": [
"lowercase"
]
},
"standard_search_analyzer_lowercase": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase"
]
}
},
"tokenizer": {
"ngram_tokenizer": {
"type": "ngram",
"min_gram": 3,
"max_gram": 5,
"token_chars": []
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
"filter": [
"lowercase"
]
}
}
}
},
"mappings": {
"properties": {
"id": {
"type": "long"
},
"name": {
"type": "keyword",
"normalizer": "lowercase_normalizer"
},
"name_ngram": {
"type": "text",
"analyzer": "ngram_analyzer",
"search_analyzer": "ngram_analyzer",
"index_options": "offsets",
"term_vector": "with_positions_offsets"
},
"description": {
"type": "text",
"analyzer": "standard",
"search_analyzer": "standard_search_analyzer_lowercase",
"index_options": "offsets",
"term_vector": "with_positions_offsets"
},
"_class": {
"type": "text",
"fields": {
"keyword": {
"ignore_above": 256.0,
"type": "keyword"
}
}
}
}
}
}

View File

@ -0,0 +1,66 @@
{
"settings": {
"index": {
"number_of_shards": "3",
"number_of_replicas": "1"
},
"analysis": {
"analyzer": {
"edge_ngram_index_analyzer": {
"tokenizer": "edge_ngram_index_tokenizer",
"filter": [
"lowercase",
"apostrophe",
"classic"
]
},
"message_search_analyzer": {
"tokenizer": "standard"
}
},
"tokenizer": {
"edge_ngram_index_tokenizer": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 20,
"token_chars": [
"letter",
"digit"
]
}
}
}
},
"mappings": {
"properties": {
"chatId": {
"type": "long"
},
"messageId": {
"type": "long"
},
"serverTime": {
"type": "long"
},
"_class": {
"type": "text",
"fields": {
"keyword": {
"ignore_above": 256.0,
"type": "keyword"
}
}
},
"id": {
"type": "keyword"
},
"text": {
"type": "text",
"analyzer": "edge_ngram_index_analyzer",
"search_analyzer": "message_search_analyzer",
"index_options": "offsets",
"term_vector": "with_positions_offsets"
}
}
}
}

View File

@ -0,0 +1,114 @@
{
"settings": {
"index": {
"number_of_shards": 3,
"number_of_replicas": 1,
"max_ngram_diff": 2
},
"analysis": {
"analyzer": {
"ngram_analyzer": {
"type": "custom",
"tokenizer": "ngram_tokenizer",
"filter": [
"lowercase"
]
},
"standard_search_analyzer_lowercase": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase"
]
}
},
"tokenizer": {
"ngram_tokenizer": {
"type": "ngram",
"min_gram": 3,
"max_gram": 5,
"token_chars": []
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
"filter": [
"lowercase"
]
}
}
}
},
"mappings": {
"properties": {
"id": {
"type": "long"
},
"username": {
"type": "keyword",
"normalizer": "lowercase_normalizer"
},
"username_ngram": {
"type": "text",
"analyzer": "ngram_analyzer",
"search_analyzer": "ngram_analyzer",
"index_options": "offsets",
"term_vector": "with_positions_offsets"
},
"nickname": {
"type": "keyword",
"normalizer": "lowercase_normalizer"
},
"nickname_ngram": {
"type": "text",
"analyzer": "ngram_analyzer",
"search_analyzer": "ngram_analyzer",
"index_options": "offsets",
"term_vector": "with_positions_offsets"
},
"phone": {
"type": "keyword",
"normalizer": "lowercase_normalizer"
},
"phone_ngram": {
"type": "text",
"analyzer": "ngram_analyzer",
"search_analyzer": "ngram_analyzer",
"index_options": "offsets",
"term_vector": "with_positions_offsets"
},
"email": {
"type": "keyword",
"normalizer": "lowercase_normalizer"
},
"email_ngram": {
"type": "text",
"analyzer": "ngram_analyzer",
"search_analyzer": "ngram_analyzer",
"index_options": "offsets",
"term_vector": "with_positions_offsets"
},
"job_title": {
"type": "keyword",
"normalizer": "lowercase_normalizer"
},
"job_title_ngram": {
"type": "text",
"analyzer": "ngram_analyzer",
"search_analyzer": "ngram_analyzer",
"index_options": "offsets",
"term_vector": "with_positions_offsets"
},
"_class": {
"type": "text",
"fields": {
"keyword": {
"ignore_above": 256.0,
"type": "keyword"
}
}
}
}
}
}

View File

@ -0,0 +1,4 @@
---
# handlers file

View File

@ -0,0 +1,54 @@
---
# Установка docker apps
- name: Install apps
block:
- name: Creates base directory
ansible.builtin.file:
path: /opt/docker/{{ item }}
state: directory
loop:
- app
- app/ca
- name: Copy RootCA cert
copy:
content: |
{{ rootca_int_crt }}
dest: "/opt/docker/app/ca/RootCA.crt"
mode: 0644
- name: Create compose config (apps)
template:
src: app/{{ item }}-app.yml.j2
dest: /opt/docker/app/{{ item }}-app.yml
loop: "{{ backend_apps }}"
- name: Allow ports (app)
community.general.ufw:
rule: allow
port: "{{ item }}"
proto: tcp
loop: "{{ backend_ports }}"
- name: Log into private registry
community.docker.docker_login:
registry_url: "{{ docker_registry }}"
username: "{{ reg_username }}"
password: "{{ reg_pass}}"
reauthorize: true
when: first_init == "no"
- name: Pull docker images
shell: |
cd /opt/docker/
docker compose pull {{ item }}
loop: "{{ backend_apps }}"
when: first_init == "no"
- name: Run docker compose config
shell: |
cd /opt/docker/
docker compose stop {{ item }}
docker compose up -d {{ item }}
loop: "{{ backend_apps }}"
when: first_init == "no"

View File

@ -0,0 +1,18 @@
---
# Установка docker apps
- name: Install Keycloak
block:
- name: Creates base docker directory
ansible.builtin.file:
path: /opt/docker
state: directory
- name: Creates base service directory
ansible.builtin.file:
path: /opt/docker/{{ item }}
state: directory
loop:
- infra
- app

View File

@ -0,0 +1,46 @@
---
# Установка docker apps
- name: Install Keycloak
block:
- name: Creates base docker directory
ansible.builtin.file:
path: /opt/docker
state: directory
- name: Create base compose config
template:
src: compose.yml.j2
dest: /opt/docker/compose.yml
register: compose_updated
- name: Log into private registry
community.docker.docker_login:
registry_url: "{{ docker_registry }}"
username: "{{ reg_username }}"
password: "{{ reg_pass}}"
reauthorize: true
when: private_registry == "yes"
# - name: Pull docker images
# shell: |
# cd /opt/docker/
# docker compose pull {{ item }}
# loop: "{{ backend_apps }}"
# when: first_init == "yes"
- name: Pull docker images
shell: |
cd /opt/docker/
docker compose pull
when: first_init == "yes"
- name: Run docker compose config
shell: |
cd /opt/docker/
docker compose stop
docker compose up -d
when: first_init == "yes"

View File

@ -0,0 +1,37 @@
---
# Установка docker apps
- name: Install cassandra
block:
- name: Creates base directory (cassandra)
ansible.builtin.file:
path: /opt/docker/infra/cassandra-init
state: directory
- name: Create compose config (cassandra)
template:
src: infra/cassandra.yml.j2
dest: /opt/docker/infra/cassandra-database.yml
- name: Create init script (cassandra)
template:
src: "infra/cassandra/{{ item }}.j2"
dest: "/opt/docker/infra/cassandra-init/{{ item }}"
mode: 0755
loop:
- "{{ instance_app }}.sql"
- init.sh
- name: Run docker compose config (cassandra)
shell: |
cd /opt/docker/
docker compose stop cassandra-database
docker compose up -d cassandra-database
when: first_init == "no"
- name: Allow ports (cassandra)
community.general.ufw:
rule: allow
port: "{{ item }}"
proto: tcp
loop:
- 9042

View File

@ -0,0 +1,60 @@
---
# Установка docker apps
- name: Install haproxy
block:
- name: Creates base directory
ansible.builtin.file:
path: /opt/docker/{{ item }}
state: directory
loop:
- infra/haproxy
- infra/haproxy/ssl
- infra/haproxy/conf
- name: Create yml config (haproxy)
template:
src: infra/haproxy.yml.j2
dest: /opt/docker/infra/haproxy.yml
register: yml_updated
- name: Create haproxy config
template:
src: infra/haproxy/haproxy.cfg.j2
dest: /opt/docker/infra/haproxy/conf/haproxy.cfg
register: cfg_updated
- name: Copy SSL PEM key
copy:
content: |
{{ wc_ext_key}}
{{ wc_ext_crt }}
{{ rootca_ext_crt }}
dest: "/opt/docker/infra/haproxy/ssl/cert.pem"
mode: 0644
register: cert_updated
- name: Pull docker images (haproxy)
shell: |
cd /opt/docker/
docker compose pull haproxy
when: first_init == "no"
- name: Run docker compose config (haproxy)
shell: |
cd /opt/docker/
docker compose stop haproxy
docker compose up -d haproxy
when: (yml_updated['changed'] or cfg_updated['changed'] or cert_updated['changed']) and first_init == "no"
- name: Allow ports (haproxy)
community.general.ufw:
rule: allow
port: "{{ item }}"
proto: tcp
loop:
- 8888
- 8443
- 9443
- 9444

View File

@ -0,0 +1,48 @@
---
# Установка docker apps
- name: Install kafka
block:
- name: Creates base directory
ansible.builtin.file:
path: /opt/docker/{{ item }}
state: directory
loop:
- infra/kafka-init
- name: Create yml config (kafka)
template:
src: infra/kafka.yml.j2
dest: /opt/docker/infra/kafka.yml
register: yml_updated
- name: Create kafka-init config
template:
src: infra/kafka-init/client.properties.j2
dest: /opt/docker/infra/kafka-init/client.properties
register: cfg_updated
- name: Pull docker images (kafka)
shell: |
cd /opt/docker/
docker compose pull kafka
when: first_init == "no"
- name: Run docker compose config (kafka)
shell: |
cd /opt/docker/
docker compose stop kafka
docker compose up -d kafka
when: (yml_updated['changed'] or cfg_updated['changed']) and first_init == "no"
- name: Allow ports (kafka)
community.general.ufw:
rule: allow
port: "{{ item }}"
proto: tcp
loop:
- 19092
- 19093
- 19094
- 8900

View File

@ -0,0 +1,46 @@
---
# Установка docker apps
- name: Install notifications
block:
- name: Creates base directory
ansible.builtin.file:
path: /opt/docker/{{ item }}
state: directory
loop:
- infra/notifications
- name: Copy init sql files
ansible.builtin.copy:
src: notifications/init.sql
dest: /opt/docker/infra/notifications/init.sql
mode: '0755'
- name: Create yml config (notifications)
template:
src: infra/notifications.yml.j2
dest: /opt/docker/infra/notifications.yml
register: yml_updated
- name: Pull docker images (notifications)
shell: |
cd /opt/docker/
docker compose pull notifications
when: first_init == "no"
- name: Run docker compose config (notifications)
shell: |
cd /opt/docker/
docker compose stop notifications
docker compose up -d notifications
when: yml_updated['changed'] and first_init == "no"
- name: Allow ports (notifications)
community.general.ufw:
rule: allow
port: "{{ item }}"
proto: tcp
loop:
- 5433

View File

@ -0,0 +1,50 @@
---
# Установка docker apps
- name: Install redis-sticker-service
block:
- name: Creates base directory
ansible.builtin.file:
path: /opt/docker/{{ item }}
state: directory
loop:
- infra/redis-sticker-service
- name: Create yml config (redis-sticker-service)
template:
src: infra/redis-sticker-service.yml.j2
dest: /opt/docker/infra/redis-sticker-service.yml
register: yml_updated
- name: Create redis-sticker-service config (redis-sticker-service)
template:
src: infra/redis-sticker-service/redis.conf.j2
dest: /opt/docker/infra/redis-sticker-service/redis.conf
register: cfg_updated
- name: Set Permissions (redis-sticker-service)
shell: |
chown -R 1001:root /opt/docker/infra/redis-sticker-service/
- name: Pull docker images (redis-sticker-service)
shell: |
cd /opt/docker/
docker compose pull redis-sticker-service
when: first_init == "no"
- name: Run docker compose config (redis-sticker-service)
shell: |
cd /opt/docker/
docker compose stop redis-sticker-service
docker compose up -d redis-sticker-service
when: cfg_updated['changed'] and yml_updated['changed'] and first_init == "no"
- name: Allow ports (redis-sticker-service)
community.general.ufw:
rule: allow
port: "{{ item }}"
proto: tcp
loop:
- 6381

View File

@ -0,0 +1,50 @@
---
# Установка docker apps
- name: Install redis-users
block:
- name: Creates base directory
ansible.builtin.file:
path: /opt/docker/{{ item }}
state: directory
loop:
- infra/redis-users
- name: Create yml config (redis-users)
template:
src: infra/redis-users.yml.j2
dest: /opt/docker/infra/redis-users.yml
register: yml_updated
- name: Create redis-users config (redis-users)
template:
src: infra/redis-users/redis.conf.j2
dest: /opt/docker/infra/redis-users/redis.conf
register: cfg_updated
- name: Set Permissions (redis-users)
shell: |
chown -R 1001:root /opt/docker/infra/redis-users/
- name: Pull docker images (redis-users)
shell: |
cd /opt/docker/
docker compose pull redis-users
when: first_init == "no"
- name: Run docker compose config (redis-users)
shell: |
cd /opt/docker/
docker compose stop redis-users
docker compose up -d redis-users
when: cfg_updated['changed'] and yml_updated['changed'] and first_init == "no"
- name: Allow ports (redis-users)
community.general.ufw:
rule: allow
port: "{{ item }}"
proto: tcp
loop:
- 6380

View File

@ -0,0 +1,40 @@
---
# Установка docker apps
- name: Install redis
block:
- name: Creates base directory
ansible.builtin.file:
path: /opt/docker/{{ item }}
state: directory
loop:
- infra/redis
- name: Create yml config (redis)
template:
src: infra/redis.yml.j2
dest: /opt/docker/infra/redis.yml
register: yml_updated
- name: Pull docker images (redis)
shell: |
cd /opt/docker/
docker compose pull redis
when: first_init == "no"
- name: Run docker compose config (redis)
shell: |
cd /opt/docker/
docker compose stop redis
docker compose up -d redis
when: yml_updated['changed'] and first_init == "no"
- name: Allow ports (redis)
community.general.ufw:
rule: allow
port: "{{ item }}"
proto: tcp
loop:
- 6379

View File

@ -0,0 +1,60 @@
---
# Установка docker apps
- name: Install search
block:
- name: Creates base directory
ansible.builtin.file:
path: /opt/docker/{{ item }}
state: directory
loop:
- infra/search
- name: Create yml config (search)
template:
src: infra/search.yml.j2
dest: /opt/docker/infra/search.yml
register: yml_updated
- name: Copy init files (search)
ansible.builtin.copy:
src: search/{{ item }}
dest: /opt/docker/infra/search/{{ item }}
mode: '0755'
loop:
- chat_v1_idx.json
- message_v1_idx.json
- user_v1_idx.json
- name: Create init script (search)
template:
src: "infra/search/{{ item }}.j2"
dest: "/opt/docker/infra/search/{{ item }}"
mode: 0755
loop:
- init.sh
- name: Pull docker images (search)
shell: |
cd /opt/docker/
docker compose pull search
when: first_init == "no"
- name: Run docker compose config (search)
shell: |
cd /opt/docker/
docker compose stop search
docker compose up -d search
when: yml_updated['changed'] and first_init == "no"
- name: Allow ports (search)
community.general.ufw:
rule: allow
port: "{{ item }}"
proto: tcp
loop:
- 5430
- 5601
- 9200

View File

@ -0,0 +1,36 @@
---
# Базовая настройка
- name: Base conf
include_tasks: docker_base.yml
- name: haproxy
include_tasks: infra/infra_haproxy.yml
- name: kafka
include_tasks: infra/infra_kafka.yml
- name: search
include_tasks: infra/infra_search.yml
- name: redis
include_tasks: infra/infra_redis.yml
- name: redis-users
include_tasks: infra/infra_redis-users.yml
- name: redis-sticker-service
include_tasks: infra/infra_redis-sticker-service.yml
- name: notifications
include_tasks: infra/infra_notifications.yml
- name: cassandra
include_tasks: infra/infra_cassandra.yml
- name: backend apps
include_tasks: app/backend_apps.yml
# Last run
- name: Compose
include_tasks: docker_compose.yml

View File

@ -0,0 +1,14 @@
services:
admin-app:
image: {{ docker_registry }}/admin-app:{{ backend_version }}
container_name: admin-app
restart: "always"
environment:
WORKSPACE_HOST: workspace-app
WORKSPACE_PORT: 9090
USER_HOST: user-app
USER_PORT: 9090
ports:
- "8102:9090"
networks:
- {{ instance_app }}

View File

@ -0,0 +1,18 @@
services:
android-sender-app:
image: {{ docker_registry }}/android-sender-app:{{ backend_version }}
container_name: android-app
restart: "always"
environment:
KAFKA_SERVER: kafka-0:9091,kafka-1:9091,kafka-2:9091
KAFKA_USER: admin
KAFKA_PASSWORD: Dfv28Hkm
REDIS_HOST: redis
REDIS_PORT: 6379
ANDROID_FIREBASE_CONFIG: gemteam-prod-firebase-adminsdk-qsjhx-a513f03975.json
networks:
- {{ instance_app }}
depends_on:
- kafka-0
- kafka-1
- kafka-2

View File

@ -0,0 +1,23 @@
services:
auth-app:
image: {{ docker_registry }}/auth-app:{{ backend_version }}
container_name: auth-app
restart: "always"
environment:
SECURITY_OAUTH2_CLIENT_ISSUER_URI: https://{{ iam_fqdn }}/realms
REALM: {{ iam_realm }}
SECURITY_ADMIN_REALM: master
CLIENT_ISSUER_IRI: https://{{ iam_fqdn }}/realms/{{ iam_realm }}
CLIENT_REALM: {{ iam_realm }}
CLIENT_ID: gem-auth-client
CLIENT_SECRET: {{ gem_auth_client_secret }}
ADMIN_REALM: master
ADMIN_CLIENT_ID: admin-cli
ADMIN_USERNAME: {{ iam_admin_username }}
ADMIN_PASSWORDE: {{ iam_admin_pass }}
ADMIN_URL: https://{{ iam_fqdn }}/admin/realms/{{ iam_realm }}
ports:
- "8082:9090"
networks:
- {{ instance_app }}

View File

@ -0,0 +1,25 @@
services:
auth-event-handler-app:
image: {{ docker_registry }}/auth-event-handler-app:{{ backend_version }}
container_name: auth-event-handler-app
restart: "always"
environment:
SECURITY_OAUTH2_CLIENT_ISSUER_URI: https://{{ iam_fqdn }}/realms
REALM: {{ iam_realm }}
SECURITY_ADMIN_REALM: master
CLIENT_ISSUER_IRI: https://{{ iam_fqdn }}/realms/{{ iam_realm }}
CLIENT_REALM: {{ iam_realm }}
CLIENT_ID: gem-auth-client
CLIENT_SECRET: {{ gem_auth_client_secret }}
ADMIN_REALM: master
ADMIN_CLIENT_ID: admin-cli
ADMIN_USERNAME: admin
ADMIN_PASSWORDE: {{ iam_admin_pass }}
ADMIN_URL: https://{{ iam_fqdn }}/admin/realms/{{ iam_realm }}
KAFKA: kafka-0:9091,kafka-1:9091,kafka-2:9091
KAFKA_USERNAME: admin
KAFKA_PASSWORD: Dfv28Hkm
ports:
- "8094:9090"
networks:
- {{ instance_app }}

View File

@ -0,0 +1,20 @@
services:
bff-admin-app:
image: {{ docker_registry }}/bff-admin-app:{{ backend_version }}
container_name: bff-admin-app
restart: always
environment:
SWAGGER_HOST: "localhost"
SWAGGER_PORT: 8080
WORKSPACE: "static://workspace-app"
WORKSPACE_PORT: 9090
USER_HOST: "static://user-app"
USER_PORT: 9090
ADMIN_HOST: "static://admin-app"
ADMIN_PORT: 9090
APP_NAME: bff-admin-app
ports:
- "8100:8080" # SpringBoot HTTP (Swagger and UI)
- "8101:9090" # gRPC server port
networks:
- {{ instance_app }}

View File

@ -0,0 +1,35 @@
services:
bff-app:
image: {{ docker_registry }}/bff-app:{{ backend_version }}
container_name: bff-app
restart: "always"
environment:
GRPC_CLIENT_AUTH_URL: http://auth-app:9090
GRPC_CLIENT_UPLOAD_URL: http://upload-app:9090
GRPC_CLIENT_USER_URL: http://user-app:9090
GRPC_CLIENT_CONFIG_URL: http://user-app:9090
GRPC_CLIENT_CHAT_URL: http://chat-app:9090
GRPC_CLIENT_MESSAGE_URL: http://message-app:9090
GRPC_CLIENT_REACTION_URL: http://message-app:9090
GRPC_CLIENT_WORKSPACE_URL: http://workspace-app:9090
GRPC_CLIENT_SEARCH_URL: http://search-app:9090
GRPC_CLIENT_GEM_CALL_URL: http://gem-call-app:9090
GRPC_CLIENT_NOTIFICATIONS_URL: http://notification-app:9090
GRPC_CLIENT_REALTIME_URL: http://realtime-app:9090
GRPC_CLIENT_STICKER_URL: http://sticker-app:9090
GRPC_CLIENT_DEEPLINK_URL: http://deeplink-app:9090
ports:
- "8081:8080"
networks:
- {{ instance_app }}
depends_on:
- auth-app
- user-app
- upload-app
- chat-app
- workspace-app
- search-app
- gem-call-app
- notification-app
- realtime-app
- sticker-app

View File

@ -0,0 +1,15 @@
services:
bff-vcs-app:
image: {{ docker_registry }}/bff-vcs-app:{{ backend_version }}
container_name: bff-vcs-app
restart: "always"
environment:
GRPC_CLIENT_CALL_URL: http://call-realtime-app:9090
GRPC_CLIENT_CALL_REALTIME_URL: http://call-realtime-app:9090
ports:
- "8079:8080"
networks:
- {{ instance_app }}
depends_on:
- call-app
- call-realtime-app

View File

@ -0,0 +1,28 @@
services:
big-chat-splitter-app:
image: {{ docker_registry }}/big-chat-splitter-app:{{ backend_version }}
container_name: big-chat-splitter-app
restart: "always"
environment:
KAFKA_SERVER: kafka-0:9091,kafka-1:9091,kafka-2:9091
KAFKA_USER: admin
KAFKA_PASSWORD: Dfv28Hkm
CHAT_SERVICE_HOST: chat-app
CHAT_SERVICE_PORT: 9090
USER_SERVICE_HOST: user-app
USER_SERVICE_PORT: 9090
CASSANDRA_DC: datacenter1
CASSANDRA_HOST: cassandra-database
CASSANDRA_USERNAME: cassandra
CASSANDRA_PASSWORD: cassandra
REDIS_HOST: redis
REDIS_PORT: 6379
APP_NOTIFICATION_LOCALE: en
networks:
- {{ instance_app }}
depends_on:
- cassandra-database
- kafka-0
- kafka-1
- kafka-2

View File

@ -0,0 +1,39 @@
include:
- call-event-handler-app.yml
- call-realtime-app.yml
- livekit-webhook-handler-app.yml
services:
call-app:
image: {{ docker_registry }}/call-app:{{ backend_version }}
container_name: call-app
restart: "always"
environment:
CASSANDRA_DATACENTER: datacenter1
CASSANDRA_CONTACTPOINT: cassandra-database
CASSANDRA_USERNAME: cassandra
CASSANDRA_PASSWORD: cassandra
KEYCLOAK_URL: https://{{ iam_fqdn }}/realms/{{ iam_realm }}
KAFKA: kafka-0:9091,kafka-1:9091,kafka-2:9091
KAFKA_USERNAME: admin
KAFKA_PASSWORD: Dfv28Hkm
LIVEKIT_API_KEY: APIXj3LbDJJPLHv
LIVEKIT_SECRET: eWWetAn7vlfgFQnXXHyyox8QceBYTnZcIMhDe4I16UeE
RECORDING_API_HOST: {{ livekit_url }}
RECORDING_BUCKET: livekit
RECORDING_ACCESS_KEY: {{ minio_root_user }}
RECORDING_SECRET: {{ minio_root_pass }}
RECORDING_ENDPOINT: https://{{ s3_endpoint }}
RECORDING_REGION: us-east-2
REDIS_HOST: redis
REDIS_PORT: 6379
REDIS_PASSWORD: ""
ports:
- "5099:5005"
- "8099:9090"
networks:
- {{ instance_app }}
depends_on:
- cassandra-database
- kafka-0
- kafka-1
- kafka-2

View File

@ -0,0 +1,31 @@
services:
call-event-handler-app:
image: {{ docker_registry }}/call-event-handler-app:{{ backend_version }}
container_name: call-event-handler-app
restart: "always"
environment:
CASSANDRA_DATACENTER: datacenter1
CASSANDRA_CONTACTPOINT: cassandra-database
CASSANDRA_USERNAME: cassandra
CASSANDRA_PASSWORD: cassandra
KAFKA: kafka-0:9091,kafka-1:9091,kafka-2:9091
KAFKA_USERNAME: admin
KAFKA_PASSWORD: Dfv28Hkm
LIVEKIT_API_KEY: APIXj3LbDJJPLHv
LIVEKIT_SECRET: eWWetAn7vlfgFQnXXHyyox8QceBYTnZcIMhDe4I16UeE
RECORDING_API_HOST: https://{{ s3_endpoint }}
REDIS_HOST: redis
REDIS_PORT: 6379
REDIS_PASSWORD: ""
ports:
- "5097:5005"
expose:
- "9090"
networks:
- {{ instance_app }}
depends_on:
- cassandra-database
- kafka-0
- kafka-1
- kafka-2

View File

@ -0,0 +1,32 @@
services:
call-realtime-app:
image: {{ docker_registry }}/call-realtime-app:{{ backend_version }}
container_name: call-realtime-app
restart: "always"
environment:
CASSANDRA_DATACENTER: datacenter1
CASSANDRA_CONTACTPOINT: cassandra-database
CASSANDRA_USERNAME: cassandra
CASSANDRA_PASSWORD: cassandra
KAFKA: kafka-0:9091,kafka-1:9091,kafka-2:9091
KAFKA_USERNAME: admin
KAFKA_PASSWORD: Dfv28Hkm
LIVEKIT_API_KEY: APIXj3LbDJJPLHv
LIVEKIT_SECRET: eWWetAn7vlfgFQnXXHyyox8QceBYTnZcIMhDe4I16UeE
REDIS_HOST: redis
REDIS_PORT: 6379
RECORDING_API_HOST: https://{{ s3_endpoint }}
RECORDING_BUCKET: livekit
RECORDING_ACCESS_KEY: {{ minio_root_user }}
RECORDING_SECRET: {{ minio_root_pass }}
ports:
- "5096:5005"
expose:
- "9090"
networks:
- {{ instance_app }}
depends_on:
- cassandra-database
- kafka-0
- kafka-1
- kafka-2

View File

@ -0,0 +1,37 @@
services:
chat-app:
image: {{ docker_registry }}/chat-app:{{ backend_version }}
container_name: chat-app
restart: "always"
environment:
CASSANDRA_DATACENTER: datacenter1
CASSANDRA_CONTACTPOINT: cassandra-database
CASSANDRA_USERNAME: cassandra
CASSANDRA_PASSWORD: cassandra
MESSAGE_HOST: message-app
MESSAGE_PORT: 9090
USER_HOST: user-app
USER_PORT: 9090
SEARCH_HOST: search-app
SEARCH_PORT: 9090
GEM_CALL_HOST: gem-call-app
GEM_CALL_PORT: 9090
DEEPLINK_HOST: deeplink-app
DEEPLINK_PORT: 9090
REDIS_HOST: redis
REDIS_PORT: 6379
KEYCLOAK_URL: https://{{ iam_fqdn }}/realms/{{ iam_realm }}
KAFKA: kafka-0:9091,kafka-1:9091,kafka-2:9091
KAFKA_USERNAME: admin
KAFKA_PASSWORD: Dfv28Hkm
ports:
- "8085:9090"
- "5085:5005"
networks:
- {{ instance_app }}
depends_on:
- cassandra-database
- kafka-0
- kafka-1
- kafka-2

View File

@ -0,0 +1,34 @@
services:
chat-event-handler-app:
image: {{ docker_registry }}/chat-event-handler-app:{{ backend_version }}
container_name: chat-event-handler-app
restart: "always"
environment:
CASSANDRA_DATACENTER: datacenter1
CASSANDRA_CONTACTPOINT: cassandra-database
CASSANDRA_USERNAME: cassandra
CASSANDRA_PASSWORD: cassandra
MESSAGE_HOST: message-app
MESSAGE_PORT: 9090
USER_HOST: user-app
USER_PORT: 9090
SEARCH_HOST: search-app
SEARCH_PORT: 9090
GEM_CALL_HOST: gem-call-app
GEM_CALL_PORT: 9090
DEEPLINK_HOST: deeplink-app
DEEPLINK_PORT: 9090
REDIS_HOST: redis
REDIS_PORT: 6379
KAFKA: kafka-0:9091,kafka-1:9091,kafka-2:9091
KAFKA_USERNAME: admin
KAFKA_PASSWORD: Dfv28Hkm
ports:
- "5086:5005"
networks:
- {{ instance_app }}
depends_on:
- cassandra-database
- kafka-0
- kafka-1
- kafka-2

View File

@ -0,0 +1,20 @@
services:
deeplink-app:
image: {{ docker_registry }}/deeplink-app:{{ backend_version }}
container_name: deeplink-app
restart: "always"
environment:
KEYCLOAK_URL: https://{{ iam_fqdn }}/realms/{{ iam_realm }}
DEEPLINK_DOMAIN: {{ deeplink_domain }}
DEEPLINK_WEBDOMAIN: {{ deeplink_webdomain }}
DEEPLINK_TENANT: {{ deeplink_tenant }}
BRANCHIO_DEFAULT_URL: https://{{ s3_endpoint }}/{{ instance_app }}/assets/{{ instance_app }}_logo.png
BRANCHIO_KEY: key_live_kDe9SARR4njgiXy7aEvUdjehDznl1Rbr
BRANCHIO_SECRET: secret_live_x1jrNQVtum7N1pxAsHEDfrQ8htXpORKD
BRANCHIO_APPID: 1412652775958925537
BRANCHIO_ACCESS: api_app_84c03af3781f4ebdb5a54a388869b3b8
BRANCHIO_URL: https://api2.branch.io/
ports:
- "8093:9090"
networks:
- {{ instance_app }}

View File

@ -0,0 +1,18 @@
services:
desktop-sender-app:
image: {{ docker_registry }}/desktop-sender-app:{{ backend_version }}
container_name: desktop-app
restart: "always"
environment:
KAFKA_SERVER: kafka-0:9091,kafka-1:9091,kafka-2:9091
KAFKA_USER: admin
KAFKA_PASSWORD: Dfv28Hkm
REDIS_HOST: redis
REDIS_PORT: 6379
networks:
- {{ instance_app }}
depends_on:
- kafka-0
- kafka-1
- kafka-2

View File

@ -0,0 +1,32 @@
services:
gem-call-app:
image: {{ docker_registry }}/gem-call-app:{{ backend_version }}
container_name: gem-call-app
restart: "always"
environment:
CALL_HOST: call-app
CALL_PORT: 9090
CALL_REALTIME_HOST: call-realtime-app
CALL_REALTIME_PORT: 9090
CHAT_HOST: chat-app
CHAT_PORT: 9090
USER_HOST: user-app
USER_PORT: 9090
DEEPLINK_HOST: deeplink-app
DEEPLINK_PORT: 9090
KEYCLOAK_URL: https://{{ iam_fqdn }}/realms/{{ iam_realm }}
KAFKA: kafka-0:9091,kafka-1:9091,kafka-2:9091
KAFKA_USERNAME: admin
KAFKA_PASSWORD: Dfv28Hkm
REDIS_HOST: redis
REDIS_PORT: 6379
REDIS_PASSWORD: ""
ports:
- "8089:9090"
- "5089:5005"
networks:
- {{ instance_app }}
depends_on:
- kafka-0
- kafka-1
- kafka-2

View File

@ -0,0 +1,26 @@
services:
gem-call-events-handler-app:
image: {{ docker_registry }}/gem-call-events-handler-app:{{ backend_version }}
container_name: gem-call-events-handler-app
restart: "always"
environment:
CASSANDRA_DATACENTER: datacenter1
CASSANDRA_CONTACTPOINT: cassandra-database
CASSANDRA_USERNAME: cassandra
CASSANDRA_PASSWORD: cassandra
KEYCLOAK_URL: https://{{ iam_fqdn }}/realms/{{ iam_realm }}
KAFKA: kafka-0:9091,kafka-1:9091,kafka-2:9091
KAFKA_USERNAME: admin
KAFKA_PASSWORD: Dfv28Hkm
REDIS_HOST: redis
REDIS_PORT: 6379
CHAT_HOST: chat-app
CHAT_PORT: 9090
networks:
- {{ instance_app }}
depends_on:
- redis
- cassandra-database
- kafka-0
- kafka-1
- kafka-2

View File

@ -0,0 +1,18 @@
services:
huawei-sender-app:
image: {{ docker_registry }}/huawei-sender-app:{{ backend_version }}
container_name: huawei-app
restart: "always"
environment:
KAFKA_SERVER: kafka-0:9091,kafka-1:9091,kafka-1:9091
KAFKA_USER: admin
KAFKA_PASSWORD: Dfv28Hkm
REDIS_HOST: redis
REDIS_PORT: 6379
networks:
- {{ instance_app }}
depends_on:
- kafka-0
- kafka-1
- kafka-2

View File

@ -0,0 +1,24 @@
services:
ios-sender-app:
image: {{ docker_registry }}/ios-sender-app:{{ backend_version }}
container_name: ios-app
restart: "always"
environment:
KAFKA_SERVER: kafka-0:9091,kafka-1:9091,kafka-2:9091
KAFKA_USER: admin
KAFKA_PASSWORD: Dfv28Hkm
REDIS_HOST: redis
REDIS_PORT: 6379
IOS_VOIP_FILE: voip_gemteam.p12
IOS_VOIP_PASSWORD: 53dhdfWPCwhxG
IOS_VOIP_TOPIC: com.gem.team.voip
IOS_MESSAGE_FILE: apns_gemteam.p12
IOS_MESSAGE_PASSWORD: kwsLnJ80D7wHa8p
IOS_MESSAGE_TOPIC: com.gem.team
networks:
- {{ instance_app }}
depends_on:
- kafka-0
- kafka-1
- kafka-2

View File

@ -0,0 +1,19 @@
services:
livekit-webhook-handler-app:
image: {{ docker_registry }}/livekit-webhook-handler-app:{{ backend_version }}
container_name: livekit-webhook-handler-app
restart: "always"
environment:
LIVEKIT_API_KEY: APIXj3LbDJJPLHv
LIVEKIT_SECRET: eWWetAn7vlfgFQnXXHyyox8QceBYTnZcIMhDe4I16UeE
KAFKA_SERVER: kafka-0:9091,kafka-1:9091,kafka-2:9091
KAFKA_USERNAME: admin
KAFKA_PASSWORD: Dfv28Hkm
ports:
- "5098:8080"
networks:
- {{ instance_app }}
depends_on:
- kafka-0
- kafka-1
- kafka-2

View File

@ -0,0 +1,41 @@
services:
message-app:
image: {{ docker_registry }}/message-app:{{ backend_version }}
container_name: message-app
restart: "always"
environment:
CHAT_HOST: chat-app
CHAT_PORT: 9090
USER_HOST: user-app
USER_PORT: 9090
UPLOAD_HOST: upload-app
UPLOAD_PORT: 9090
SEARCH_HOST: search-app
SEARCH_PORT: 9090
STICKER_HOST: sticker-app
STICKER_PORT: 9090
DEEPLINK_HOST: deeplink-app
DEEPLINK_PORT: 9090
CASSANDRA_DATACENTER: datacenter1
CASSANDRA_CONTACTPOINT: cassandra-database
CASSANDRA_USERNAME: cassandra
CASSANDRA_PASSWORD: cassandra
KEYSPACE: messages
KAFKA_SERVER: kafka-0:9091,kafka-1:9091,kafka-2:9091
KAFKA_USERNAME: admin
KAFKA_PASSWORD: Dfv28Hkm
KEYCLOAK_URL: https://{{ iam_fqdn }}/realms/{{ iam_realm }}
REALTIME_REDIS_HOST: redis
REALTIME_REDIS_PASSWORD: ""
REDIS_HOST: redis
REDIS_PORT: 6379
REDIS_PASSWORD: ""
ports:
- "8086:9090"
networks:
- {{ instance_app }}
depends_on:
- cassandra-database
- kafka-0
- kafka-1
- kafka-2

View File

@ -0,0 +1,30 @@
services:
message-call-event-handler-app:
image: {{ docker_registry }}/message-call-event-handler-app:{{ backend_version }}
container_name: message-call-event-handler-app
restart: "always"
environment:
CASSANDRA_DATACENTER: datacenter1
CASSANDRA_CONTACTPOINT: cassandra-database
CASSANDRA_USERNAME: cassandra
CASSANDRA_PASSWORD: cassandra
KEYSPACE: messages
KAFKA_SERVER: kafka-0:9091,kafka-1:9091,kafka-2:9091
KAFKA_USERNAME: admin
KAFKA_PASSWORD: Dfv28Hkm
USER_HOST: user-app
USER_PORT: 9090
CHAT_HOST: chat-app
CHAT_PORT: 9090
UPLOAD_HOST: upload-app
UPLOAD_PORT: 9090
REDIS_HOST: redis
REDIS_PORT: 6379
REDIS_PASSWORD: ""
networks:
- {{ instance_app }}
depends_on:
- cassandra-database
- kafka-0
- kafka-1
- kafka-2

View File

@ -0,0 +1,30 @@
services:
message-chat-event-handler-app:
image: {{ docker_registry }}/message-chat-event-handler-app:{{ backend_version }}
container_name: message-chat-event-handler-app
restart: "always"
environment:
CASSANDRA_DATACENTER: datacenter1
CASSANDRA_CONTACTPOINT: cassandra-database
CASSANDRA_USERNAME: cassandra
CASSANDRA_PASSWORD: cassandra
KEYSPACE: messages
KAFKA_SERVER: kafka-0:9091,kafka-1:9091,kafka-2:9091
KAFKA_USERNAME: admin
KAFKA_PASSWORD: Dfv28Hkm
USER_HOST: user-app
USER_PORT: 9090
CHAT_HOST: chat-app
CHAT_PORT: 9090
UPLOAD_HOST: upload-app
UPLOAD_PORT: 9090
REDIS_HOST: redis
REDIS_PORT: 6379
REDIS_PASSWORD: ""
networks:
- {{ instance_app }}
depends_on:
- cassandra-database
- kafka-0
- kafka-1
- kafka-2

View File

@ -0,0 +1,27 @@
services:
message-event-handler-app:
image: {{ docker_registry }}/message-event-handler-app:{{ backend_version }}
container_name: message-event-handler-app
restart: "always"
environment:
CASSANDRA_DATACENTER: datacenter1
CASSANDRA_CONTACTPOINT: cassandra-database
CASSANDRA_USERNAME: cassandra
CASSANDRA_PASSWORD: cassandra
KEYSPACE: messages
KAFKA_SERVER: kafka-0:9091,kafka-1:9091,kafka-2:9091
KAFKA_USERNAME: admin
KAFKA_PASSWORD: Dfv28Hkm
REALTIME_REDIS_HOST: redis
REALTIME_REDIS_PASSWORD: ""
REDIS_HOST: redis
REDIS_PORT: 6379
REDIS_PASSWORD: ""
networks:
- {{ instance_app }}
depends_on:
- cassandra-database
- kafka-0
- kafka-1
- kafka-2
- redis

View File

@ -0,0 +1,28 @@
services:
message-link-preview-handler-app:
image: {{ docker_registry }}/message-link-preview-handler-app:{{ backend_version }}
container_name: message-link-preview-handler-app
restart: "always"
environment:
UPLOAD_HOST: upload-app
UPLOAD_PORT: 9090
CASSANDRA_DATACENTER: datacenter1
CASSANDRA_CONTACTPOINT: cassandra-database
CASSANDRA_USERNAME: cassandra
CASSANDRA_PASSWORD: cassandra
KEYSPACE: messages
KAFKA_SERVER: kafka-0:9091,kafka-1:9091,kafka-2:9091
KAFKA_USERNAME: admin
KAFKA_PASSWORD: Dfv28Hkm
REALTIME_REDIS_HOST: redis
REALTIME_REDIS_PASSWORD: ""
REDIS_HOST: redis
REDIS_PORT: 6379
REDIS_PASSWORD: ""
networks:
- {{ instance_app }}
depends_on:
- cassandra-database
- kafka-0
- kafka-1
- kafka-2

View File

@ -0,0 +1,23 @@
services:
message-user-event-handler-app:
image: {{ docker_registry }}/message-user-event-handler-app:{{ backend_version }}
container_name: message-user-event-handler-app
restart: "always"
environment:
CASSANDRA_DATACENTER: datacenter1
CASSANDRA_CONTACTPOINT: cassandra-database
CASSANDRA_USERNAME: cassandra
CASSANDRA_PASSWORD: cassandra
KEYSPACE: messages
KAFKA_SERVER: kafka-0:9091,kafka-1:9091,kafka-2:9091
KAFKA_USERNAME: admin
KAFKA_PASSWORD: Dfv28Hkm
REDIS_HOST: redis
REDIS_PORT: 6379
REDIS_PASSWORD: ""
networks:
- {{ instance_app }}
depends_on:
- kafka-0
- kafka-1
- kafka-2

View File

@ -0,0 +1,28 @@
services:
notification-app:
image: {{ docker_registry }}/notification-app:{{ backend_version }}
container_name: notification-app
restart: "always"
environment:
CASSANDRA_DATACENTER: datacenter1
CASSANDRA_HOST: cassandra-database
CASSANDRA_USERNAME: cassandra
CASSANDRA_PASSWORD: cassandra
KEYSPACE: notifications
CASSANDRA_CONTACTPOINT: cassandra-database
CASSANDRA_PORT: 9042
KAFKA_SERVER: kafka-0:9091,kafka-1:9091,kafka-2:9091
KAFKA_USERNAME: admin
KAFKA_PASSWORD: Dfv28Hkm
REALTIME_REDIS_HOST: redis
REALTIME_REDIS_PASSWORD:
REDIS_HOST: redis
REDIS_PORT: 6379
REDIS_PASSWORD: ""
KEYCLOAK_URL: https://{{ iam_fqdn }}/realms/{{ iam_realm }}
ports:
- "8090:9090"
networks:
- {{ instance_app }}
depends_on:
- cassandra-database

View File

@ -0,0 +1,26 @@
services:
notification-event-handler-app:
image: {{ docker_registry }}/notification-event-handler-app:{{ backend_version }}
container_name: notification-event-handler-app
restart: "always"
environment:
CASSANDRA_DATACENTER: datacenter1
CASSANDRA_HOST: cassandra-database
CASSANDRA_USERNAME: cassandra
CASSANDRA_PASSWORD: cassandra
KEYSPACE: notifications
CASSANDRA_CONTACTPOINT: cassandra-database
CASSANDRA_PORT: 9042
KAFKA_SERVER: kafka-0:9091,kafka-1:9091,kafka-2:9091
KAFKA_USER: admin
KAFKA_PASSWORD: Dfv28Hkm
CHAT_SERVICE_HOST: chat-app
CHAT_SERVICE_PORT: 9090
USER_SERVICE_HOST: user-app
USER_SERVICE_PORT: 9090
networks:
- {{ instance_app }}
depends_on:
- kafka-0
- kafka-1
- kafka-2

View File

@ -0,0 +1,16 @@
services:
transformer-messages-app:
image: {{ docker_registry }}/transformer-messages-app:{{ backend_version }}
container_name: notification-messages-transformer-app
restart: "always"
environment:
KAFKA_SERVER: kafka-0:9091,kafka-1:9091,kafka-2:9091
KAFKA_USER: admin
KAFKA_PASSWORD: Dfv28Hkm
networks:
- {{ instance_app }}
depends_on:
- kafka-0
- kafka-1
- kafka-2

View File

@ -0,0 +1,43 @@
services:
realtime-app:
image: {{ docker_registry }}/realtime-app:{{ backend_version }}
container_name: realtime-app
restart: "always"
environment:
CASSANDRA_DATACENTER: datacenter1
CASSANDRA_CONTACTPOINT: cassandra-database
CASSANDRA_USERNAME: cassandra
CASSANDRA_PASSWORD: cassandra
KEYCLOAK_URL: https://{{ iam_fqdn }}/realms/{{ iam_realm }}
KAFKA: kafka-0:9091,kafka-1:9091,kafka-2:9091
KAFKA_USERNAME: admin
KAFKA_PASSWORD: Dfv28Hkm
REALTIME_REDIS_HOST: redis
REALTIME_REDIS_PASSWORD:
CHAT_HOST: chat-app
CHAT_PORT: 9090
GEM_CALL_HOST: gem-call-app
GEM_CALL_PORT: 9090
MESSAGE_HOST: message-app
MESSAGE_PORT: 9090
USER_HOST: user-app
USER_PORT: 9090
ports:
- "8091:9090"
- "5091:5005"
- "9999:9999"
networks:
- {{ instance_app }}
depends_on:
- cassandra-database
- kafka-0
- kafka-1
- kafka-2
deploy:
resources:
limits:
cpus: '4'
memory: 4064M
reservations:
cpus: '2'
memory: 2048M

View File

@ -0,0 +1,28 @@
services:
regular-chat-splitter-app:
image: {{ docker_registry }}/regular-chat-splitter-app:{{ backend_version }}
container_name: regular-chat-splitter-app
restart: "always"
environment:
KAFKA_SERVER: kafka-0:9091,kafka-1:9091,kafka-2:9091
KAFKA_USER: admin
KAFKA_PASSWORD: Dfv28Hkm
CHAT_SERVICE_HOST: chat-app
CHAT_SERVICE_PORT: 9090
USER_SERVICE_HOST: user-app
USER_SERVICE_PORT: 9090
CASSANDRA_DC: datacenter1
CASSANDRA_HOST: cassandra-database
CASSANDRA_USERNAME: cassandra
CASSANDRA_PASSWORD: cassandra
REDIS_HOST: redis
REDIS_PORT: 6379
APP_NOTIFICATION_LOCALE: en
networks:
- {{ instance_app }}
depends_on:
- cassandra-database
- kafka-0
- kafka-1
- kafka-2

View File

@ -0,0 +1,20 @@
services:
notification-repartitioner-app:
image: {{ docker_registry }}/notification-repartitioner-app:{{ backend_version }}
container_name: repartitioner-app
restart: "always"
environment:
KAFKA_SERVER: kafka-0:9091,kafka-1:9091,kafka-2:9091
KAFKA_USER: admin
KAFKA_PASSWORD: Dfv28Hkm
CHAT_SERVICE_HOST: chat-app
CHAT_SERVICE_PORT: 9090
USER_SERVICE_HOST: user-app
USER_SERVICE_PORT: 9090
networks:
- {{ instance_app }}
depends_on:
- kafka-0
- kafka-1
- kafka-2

View File

@ -0,0 +1,19 @@
services:
safari-sender-app:
image: {{ docker_registry }}/safari-sender-app:{{ backend_version }}
container_name: safari-app
restart: "always"
environment:
KAFKA_SERVER: kafka-0:9091,kafka-1:9091,kafka-2:9091
KAFKA_USER: admin
KAFKA_PASSWORD: Dfv28Hkm
REDIS_HOST: redis
REDIS_PORT: 6379
networks:
- {{ instance_app }}
depends_on:
- kafka-0
- kafka-1
- kafka-2

View File

@ -0,0 +1,26 @@
services:
search-app:
image: {{ docker_registry }}/search-app:{{ backend_version }}
container_name: search-app
restart: "always"
environment:
KEYCLOAK_URL: https://{{ iam_fqdn }}/realms/{{ iam_realm }}
CHAT_HOST: chat-app
CHAT_PORT: 9090
ELASTIC_HOST: elastic_search
ELASTIC_PORT: 9200
POSTGRES_URL: jdbc:postgresql://postgres_search:5432/search_db
POSTGRES_USERNAME: search_user
POSTGRES_PASSWORD: u63nwpSyRnJsVWNcg
KAFKA_SERVER: kafka-0:9091,kafka-1:9091,kafka-2:9091
KAFKA_USERNAME: admin
KAFKA_PASSWORD: Dfv28Hkm
ports:
- "8088:9090"
networks:
- {{ instance_app }}
depends_on:
- kafka-0
- kafka-1
- kafka-2

View File

@ -0,0 +1,21 @@
services:
search-event-handler-app:
image: {{ docker_registry }}/search-event-handler-app:{{ backend_version }}
container_name: search-event-handler-app
restart: "always"
environment:
KEYCLOAK_URL: https://{{ iam_fqdn }}/realms/{{ iam_realm }}
ELASTIC_HOST: elastic_search
ELASTIC_PORT: 9200
POSTGRES_URL: jdbc:postgresql://postgres_search:5432/search_db
POSTGRES_USERNAME: search_user
POSTGRES_PASSWORD: u63nwpSyRnJsVWNcg
KAFKA_SERVER: kafka-0:9091,kafka-1:9091,kafka-2:9091
KAFKA_USERNAME: admin
KAFKA_PASSWORD: Dfv28Hkm
networks:
- {{ instance_app }}
depends_on:
- kafka-0
- kafka-1
- kafka-2

View File

@ -0,0 +1,28 @@
services:
sticker-app:
image: {{ docker_registry }}/sticker-app:{{ backend_version }}
container_name: sticker-app
restart: "always"
environment:
CASSANDRA_DATACENTER: datacenter1
CASSANDRA_CONTACTPOINT: cassandra-database
CASSANDRA_USERNAME: cassandra
CASSANDRA_PASSWORD: cassandra
CASSANDRA_PORT: 9042
KEYSPACE: stickers
KAFKA_SERVER: kafka-0:9091,kafka-1:9091,kafka-2:9091
KAFKA_USERNAME: admin
KAFKA_PASSWORD: Dfv28Hkm
REDIS_HOST: redis-sticker-service
REDIS_PORT: 6379
KEYCLOAK_URL: https://{{ iam_fqdn }}/realms/{{ iam_realm }}
ports:
- "8092:9090"
networks:
- {{ instance_app }}
depends_on:
- cassandra-database
- kafka-0
- kafka-1
- kafka-2
- redis-sticker-service

View File

@ -0,0 +1,22 @@
services:
unregister-tokens-app:
image: {{ docker_registry }}/unregister-tokens-app:{{ backend_version }}
container_name: notification-unregister-tokens-app
restart: "always"
environment:
KAFKA_SERVER: kafka-0:9091,kafka-1:9091,kafka-2:9091
KAFKA_USER: admin
KAFKA_PASSWORD: Dfv28Hkm
CASSANDRA_DC: datacenter1
CASSANDRA_HOST: cassandra-database
CASSANDRA_USERNAME: cassandra
CASSANDRA_PASSWORD: cassandra
KEYSPACE: notifications
networks:
- {{ instance_app }}
depends_on:
- cassandra-database
- kafka-0
- kafka-1
- kafka-2

View File

@ -0,0 +1,15 @@
services:
upload-app:
image: {{ docker_registry }}/upload-app:{{ backend_version }}
container_name: upload-app
restart: "always"
environment:
S3_ENDPOINT: https://{{ s3_endpoint }}
S3_ACCESS_KEY: {{ minio_root_user }}
S3_SECRET_KEY: {{ minio_root_pass }}
KEYCLOAK_URL: https://{{ iam_fqdn }}/realms/{{ iam_realm }}
ports:
- "8083:9090"
networks:
- {{ instance_app }}

View File

@ -0,0 +1,30 @@
services:
user-app:
image: {{ docker_registry }}/user-app:{{ backend_version }}
container_name: user-app
restart: "always"
environment:
CASSANDRA_DATACENTER: datacenter1
CASSANDRA_CONTACTPOINT: cassandra-database
CASSANDRA_USERNAME: cassandra
CASSANDRA_PASSWORD: cassandra
KEYSPACE: users
KAFKA_SERVER: kafka-0:9091
KAFKA_USERNAME: admin
KAFKA_PASSWORD: Dfv28Hkm
REDIS_HOST: redis-users
REDIS_PORT: 6379
REDIS_PASSWORD: ""
KEYCLOAK_URL: https://{{ iam_fqdn }}/realms/{{ iam_realm }}
ports:
- "8084:9090"
volumes:
- ./ca/RootCA.crt:/app/resources/RootCA.crt:ro
networks:
- {{ instance_app }}
depends_on:
- cassandra-database
- kafka-0
- kafka-1
- kafka-2

View File

@ -0,0 +1,28 @@
services:
voip-splitter-app:
image: {{ docker_registry }}/voip-splitter-app:{{ backend_version }}
container_name: voip-splitter-app
restart: "always"
environment:
KAFKA_SERVER: kafka-0:9091,kafka-1:9091,kafka-2:9091
KAFKA_USER: admin
KAFKA_PASSWORD: Dfv28Hkm
CHAT_SERVICE_HOST: chat-app
CHAT_SERVICE_PORT: 9090
USER_SERVICE_HOST: user-app
USER_SERVICE_PORT: 9090
CASSANDRA_DC: datacenter1
CASSANDRA_HOST: cassandra-database
CASSANDRA_USERNAME: cassandra
CASSANDRA_PASSWORD: cassandra
REDIS_HOST: redis
REDIS_PORT: 6379
APP_NOTIFICATION_LOCALE: en
networks:
- {{ instance_app }}
depends_on:
- cassandra-database
- kafka-0
- kafka-1
- kafka-2

View File

@ -0,0 +1,18 @@
services:
web-sender-app:
image: {{ docker_registry }}/web-sender-app:{{ backend_version }}
container_name: web-app
restart: "always"
environment:
KAFKA_SERVER: kafka-0:9091,kafka-2:9091,kafka-2:9091
KAFKA_USER: admin
KAFKA_PASSWORD: Dfv28Hkm
REDIS_HOST: redis
REDIS_PORT: 6379
networks:
- {{ instance_app }}
depends_on:
- kafka-0
- kafka-1
- kafka-2

View File

@ -0,0 +1,17 @@
services:
workspace-app:
image: {{ docker_registry }}/workspace-app:{{ backend_version }}
container_name: workspace-app
restart: "always"
environment:
CASSANDRA_DATACENTER: datacenter1
CASSANDRA_CONTACTPOINT: cassandra-database
CASSANDRA_USERNAME: cassandra
CASSANDRA_PASSWORD: cassandra
KEYCLOAK_URL: https://{{ iam_fqdn }}/realms/{{ iam_realm }}
ports:
- "8087:9090"
networks:
- {{ instance_app }}
depends_on:
- cassandra-database

View File

@ -0,0 +1,19 @@
services:
workspace-event-handler-app:
image: {{ docker_registry }}/workspace-event-handler-app:{{ backend_version }}
container_name: workspace-event-handler-app
restart: "always"
environment:
CASSANDRA_DATACENTER: datacenter1
CASSANDRA_CONTACTPOINT: cassandra-database
CASSANDRA_USERNAME: cassandra
CASSANDRA_PASSWORD: cassandra
KAFKA: kafka-0:9091,kafka-1:9091,kafka-2:9091
KAFKA_USERNAME: admin
KAFKA_PASSWORD: Dfv28Hkm
ports:
- "8095:9090"
networks:
- {{ instance_app }}
depends_on:
- cassandra-database

View File

@ -0,0 +1,27 @@
#version: '3.8'
services:
{{ service_name }}:
image: {{ docker_registry }}/{{ service_name }}:{{ service_version }}
container_name: {{ service_name }}
restart: "always"
environment:
{% for key, value in environment_variables.items() %}
{{ key }}: {{ value }}
{% endfor %}
ports:
{% for port in exposed_ports %}
- "{{ port.host }}:{{ port.container }}"
{% endfor %}
networks:
- {{ network_name }}
depends_on:
{% for dependency in dependencies %}
- {{ dependency }}
{% endfor %}
networks:
{{ network_name }}:
driver: bridge
#include:
#{% for file in include_files %}
# - {{ file }}
#{% endfor %}

View File

@ -0,0 +1,53 @@
include:
- infra/haproxy.yml
- infra/kafka.yml
- infra/search.yml
- infra/redis.yml
- infra/redis-users.yml
- infra/redis-sticker-service.yml
- infra/notifications.yml
- infra/cassandra-{{ cassandra_db }}.yml
- app/voip-splitter-app.yml
- app/regular-chat-splitter-app.yml
- app/big-chat-splitter-app.yml
- app/repartitioner-app.yml
- app/notification-app.yml
- app/android-app.yml
- app/ios-app.yml
- app/huawei-app.yml
- app/web-sender-app.yml
- app/safari-app.yml
- app/desktop-app.yml
- app/bff-app.yml
- app/auth-app.yml
- app/chat-app.yml
- app/chat-event-handler-app.yml
- app/user-app.yml
- app/upload-app.yml
- app/workspace-app.yml
- app/workspace-event-handler-app.yml
- app/search-app.yml
- app/search-event-handler-app.yml
- app/message-app.yml
- app/message-event-handler-app.yml
- app/message-link-preview-handler-app.yml
- app/call-app.yml
- app/gem-call-app.yml
- app/notification-messages-transformer-app.yml
- app/realtime-app.yml
- app/gem-call-events-handler-app.yml
- app/unregister-tokens-app.yml
- app/sticker-app.yml
- app/deeplink-app.yml
- app/auth-event-handler-app.yml
- app/message-call-event-handler-app.yml
- app/message-chat-event-handler-app.yml
- app/notification-event-handler-app.yml
- app/message-user-event-handler-app.yml
- app/admin-app.yml
- app/bff-admin-app.yml
- app/bff-vcs-app.yml
networks:
{{ instance_app }}:
driver: bridge

View File

@ -0,0 +1,38 @@
services:
cassandra-database:
# image: bitnami/cassandra:latest
image: cassandra:latest
container_name: cassandra-database
restart: always
ports:
- "9042:9042" # native protocol clients
volumes:
- cassandra-database-data:/var/lib/cassandra:rw
environment:
- CASSANDRA_CLUSTER_NAME=datacenter1
- CASSANDRA_AUTHENTICATOR=PasswordAuthenticator
healthcheck:
test: ["CMD-SHELL", "nodetool status"]
interval: 2m
start_period: 2m
timeout: 10s
retries: 3
networks:
- {{ instance_app }}
cassandra-init:
image: cassandra:latest
container_name: cassandra-init
depends_on:
- cassandra-database
restart: "no"
entrypoint: ["/init.sh"]
volumes:
- ./cassandra-init/init.sh:/init.sh
- ./cassandra-init/gemteam.sql:/docker-entrypoint-initdb.d/gemteam.sql
networks:
- {{ instance_app }}
volumes:
cassandra-database-data:

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,9 @@
#!/usr/bin/env bash
until printf "" 2>>/dev/null >>/dev/tcp/cassandra-database/9042; do
sleep 10;
echo "Waiting for cassandra...";
done
echo "Prepare cassandra-database"
cqlsh cassandra-database -u cassandra -p cassandra -f /docker-entrypoint-initdb.d/{{ instance_app }}.sql

View File

@ -0,0 +1,19 @@
services:
haproxy:
image: haproxy:2.3
container_name: haproxy
restart: "always"
ports:
- "8443:8443"
- "8888:8888"
- "9443:9443"
- "9444:9444"
volumes:
- ./haproxy/conf/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
- ./haproxy/ssl:/usr/local/etc/ssl:ro
depends_on:
- bff-app
- bff-admin-app
- bff-vcs-app
networks:
- {{ instance_app }}

View File

@ -0,0 +1,64 @@
defaults
mode http
timeout connect 0s
timeout client 0s
timeout server 0s
default-server init-addr last,libc,none
frontend stats
bind :8888
stats enable
stats hide-version
stats realm Haproxy\ Statistics
stats uri /stats
stats refresh 10s
stats auth admin:Pa$$w0rd!1
frontend bff_api
mode http
bind :8443 ssl crt /usr/local/etc/ssl/cert.pem
http-response set-header Cache-Control no-cache
option http-keep-alive
option forwardfor
default_backend bff_api
backend bff_api
mode http
http-reuse safe
option http-keep-alive
option forwardfor
default-server inter 5s fall 3 rise 3
server bff-app bff-app:8080 check
frontend bff_admin
mode http
bind :9443 ssl crt /usr/local/etc/ssl/cert.pem
http-response set-header Cache-Control no-cache
option http-keep-alive
option forwardfor
default_backend bff_admin
backend bff_admin
mode http
http-reuse safe
option http-keep-alive
option forwardfor
http-response set-header Content-Security-Policy upgrade-insecure-requests
default-server inter 5s fall 3 rise 3
server bff-admin bff-admin-app:8080 check
frontend bff_vcs
mode http
bind :9444 ssl crt /usr/local/etc/ssl/cert.pem
http-response set-header Cache-Control no-cache
option http-keep-alive
option forwardfor
default_backend bff_vcs
backend bff_vcs
mode http
http-reuse safe
option http-keep-alive
option forwardfor
default-server inter 5s fall 3 rise 3
server bff-vcs bff-vcs-app:8080 check

View File

@ -0,0 +1,5 @@
security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \
username="admin" \
password="Dfv28Hkm";

View File

@ -0,0 +1,274 @@
services:
kafka-0:
image: docker.io/bitnami/kafka:3.7
container_name: kafka-0
restart: "always"
ports:
- "19092:19092"
environment:
# KRaft settings
- KAFKA_CFG_NODE_ID=0
- KAFKA_CFG_PROCESS_ROLES=controller,broker
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka-0:9093,1@kafka-1:9093,2@kafka-2:9093 # {id}@{host}:{port} - node_id@host:port
- KAFKA_KRAFT_CLUSTER_ID=abcdefghijklmnopqrstuv
- KAFKA_CFG_SUPER_USERS=User:admin
# Listeners
- KAFKA_CFG_LISTENERS=INTERNAL://:9091,CONTROLLER://:9093,EXTERNAL://0.0.0.0:19092
- KAFKA_CFG_ADVERTISED_LISTENERS=INTERNAL://:9091,EXTERNAL://{{ ansible_default_ipv4.address }}:19092
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=INTERNAL:SASL_PLAINTEXT,CONTROLLER:SASL_PLAINTEXT,EXTERNAL:SASL_PLAINTEXT
# BROKER SETTINGS
- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=INTERNAL
- KAFKA_INTER_BROKER_USER=admin
- KAFKA_INTER_BROKER_PASSWORD=Dfv28Hkm
- KAFKA_CFG_SASL_MECHANISM_INTER_BROKER_PROTOCOL=PLAIN
# CONTROLLER SETTINGS
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_CFG_SASL_MECHANISM_CONTROLLER_PROTOCOL=PLAIN
- KAFKA_CONTROLLER_USER=admin
- KAFKA_CONTROLLER_PASSWORD=Dfv28Hkm
# CLIENT SETTINGS
- KAFKA_CLIENT_LISTENER_NAME=EXTERNAL
- KAFKA_CLIENT_USERS=admin
- KAFKA_CLIENT_PASSWORDS=Dfv28Hkm
# ACL
- KAFKA_CFG_AUTHORIZER_CLASS_NAME=org.apache.kafka.metadata.authorizer.StandardAuthorizer
- KAFKA_CFG_ALLOW_EVERYONE_IF_NO_ACL_FOUND=false
# SASL
- KAFKA_CFG_SASL_ENABLED_MECHANISMS=PLAIN
# Clustering
- KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=3
- KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=3
- KAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISR=2
# - KAFKA_CFG_DEFAULT_REPLICATION_FACTOR=3
# - KAFKA_CFG_NUM_PARTITIONS=3
- KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true
- BITNAMI_DEBUG=yes
networks:
- {{ instance_app }}
healthcheck:
test: "bash -c 'printf \"\" > /dev/tcp/127.0.0.1/9091; exit $$?;'"
interval: 5s
timeout: 10s
retries: 3
start_period: 30s
kafka-1:
image: docker.io/bitnami/kafka:3.7
container_name: kafka-1
restart: "always"
ports:
- "19093:19093"
environment:
# KRaft settings
- KAFKA_CFG_NODE_ID=1
- KAFKA_CFG_PROCESS_ROLES=controller,broker
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka-0:9093,1@kafka-1:9093,2@kafka-2:9093
- KAFKA_KRAFT_CLUSTER_ID=abcdefghijklmnopqrstuv
- KAFKA_CFG_SUPER_USERS=User:admin
# Listeners
- KAFKA_CFG_LISTENERS=INTERNAL://:9091,CONTROLLER://:9093,EXTERNAL://0.0.0.0:19093
- KAFKA_CFG_ADVERTISED_LISTENERS=INTERNAL://:9091,EXTERNAL://{{ ansible_default_ipv4.address }}:19093
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=INTERNAL:SASL_PLAINTEXT,CONTROLLER:SASL_PLAINTEXT,EXTERNAL:SASL_PLAINTEXT
# BROKER SETTINGS
- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=INTERNAL
- KAFKA_INTER_BROKER_USER=admin
- KAFKA_INTER_BROKER_PASSWORD=Dfv28Hkm
- KAFKA_CFG_SASL_MECHANISM_INTER_BROKER_PROTOCOL=PLAIN
# CONTROLLER SETTINGS
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_CFG_SASL_MECHANISM_CONTROLLER_PROTOCOL=PLAIN
- KAFKA_CONTROLLER_USER=admin
- KAFKA_CONTROLLER_PASSWORD=Dfv28Hkm
# CLIENT SETTINGS
- KAFKA_CLIENT_LISTENER_NAME=EXTERNAL
- KAFKA_CLIENT_USERS=admin
- KAFKA_CLIENT_PASSWORDS=Dfv28Hkm
# ACL
- KAFKA_CFG_AUTHORIZER_CLASS_NAME=org.apache.kafka.metadata.authorizer.StandardAuthorizer
- KAFKA_CFG_ALLOW_EVERYONE_IF_NO_ACL_FOUND=true
# SASL
- KAFKA_CFG_SASL_ENABLED_MECHANISMS=PLAIN
# Clustering
- KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=3
- KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=3
- KAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISR=2
# - KAFKA_CFG_DEFAULT_REPLICATION_FACTOR=3
# - KAFKA_CFG_NUM_PARTITIONS=3
- KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true
- BITNAMI_DEBUG=yes
networks:
- {{ instance_app }}
healthcheck:
test: "bash -c 'printf \"\" > /dev/tcp/127.0.0.1/9091; exit $$?;'"
interval: 5s
timeout: 10s
retries: 3
start_period: 30s
kafka-2:
image: docker.io/bitnami/kafka:3.7
container_name: kafka-2
restart: "always"
ports:
- "19094:19094"
environment:
# KRaft settings
- KAFKA_CFG_NODE_ID=2
- KAFKA_CFG_PROCESS_ROLES=controller,broker
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka-0:9093,1@kafka-1:9093,2@kafka-2:9093
- KAFKA_KRAFT_CLUSTER_ID=abcdefghijklmnopqrstuv
- KAFKA_CFG_SUPER_USERS=User:admin
# Listeners
- KAFKA_CFG_LISTENERS=INTERNAL://:9091,CONTROLLER://:9093,EXTERNAL://0.0.0.0:19094
- KAFKA_CFG_ADVERTISED_LISTENERS=INTERNAL://:9091,EXTERNAL://{{ ansible_default_ipv4.address }}:19094
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=INTERNAL:SASL_PLAINTEXT,CONTROLLER:SASL_PLAINTEXT,EXTERNAL:SASL_PLAINTEXT
# BROKER SETTINGS
- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=INTERNAL
- KAFKA_INTER_BROKER_USER=admin
- KAFKA_INTER_BROKER_PASSWORD=Dfv28Hkm
- KAFKA_CFG_SASL_MECHANISM_INTER_BROKER_PROTOCOL=PLAIN
# CONTROLLER SETTINGS
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_CFG_SASL_MECHANISM_CONTROLLER_PROTOCOL=PLAIN
- KAFKA_CONTROLLER_USER=admin
- KAFKA_CONTROLLER_PASSWORD=Dfv28Hkm
# CLIENT SETTINGS
- KAFKA_CLIENT_LISTENER_NAME=EXTERNAL
- KAFKA_CLIENT_USERS=admin
- KAFKA_CLIENT_PASSWORDS=Dfv28Hkm
# ACL
- KAFKA_CFG_AUTHORIZER_CLASS_NAME=org.apache.kafka.metadata.authorizer.StandardAuthorizer
- KAFKA_CFG_ALLOW_EVERYONE_IF_NO_ACL_FOUND=true
# SASL
- KAFKA_CFG_SASL_ENABLED_MECHANISMS=PLAIN
# Clustering
- KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=3
- KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=3
- KAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISR=2
# - KAFKA_CFG_DEFAULT_REPLICATION_FACTOR=3
# - KAFKA_CFG_NUM_PARTITIONS=3
- KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true
- BITNAMI_DEBUG=yes
networks:
- {{ instance_app }}
healthcheck:
test: "bash -c 'printf \"\" > /dev/tcp/127.0.0.1/9091; exit $$?;'"
interval: 5s
timeout: 10s
retries: 3
start_period: 30s
kafka-ui:
container_name: kafka-ui
image: provectuslabs/kafka-ui:latest
restart: "always"
ports:
- "8900:8080"
networks:
- {{ instance_app }}
environment:
# CLUSTER SETTINGS
- KAFKA_CLUSTERS_0_NAME=dev-cluster
- KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=kafka-0:9091,kafka-1:9091,kafka-2:9091
- KAFKA_CLUSTERS_0_PROPERTIES_SECURITY_PROTOCOL=SASL_PLAINTEXT
- KAFKA_CLUSTERS_0_PROPERTIES_SASL_MECHANISM=PLAIN
- KAFKA_CLUSTERS_0_PROPERTIES_PROTOCOL=SASL
- KAFKA_CLUSTERS_0_PROPERTIES_SASL_JAAS_CONFIG=org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="Dfv28Hkm";
- DYNAMIC_CONFIG_ENABLED=true
- AUTH_TYPE="LOGIN_FORM"
- SPRING_SECURITY_USER_NAME=admin
- SPRING_SECURITY_USER_PASSWORD=LO8MADJIWhtnrU536Zmx
depends_on:
- kafka-0
- kafka-1
- kafka-2
healthcheck:
test: wget --no-verbose --tries=1 --spider localhost:8080 || exit 1
interval: 5s
timeout: 10s
retries: 3
start_period: 30s
kafka-init:
image: 'confluentinc/cp-kafka'
container_name: kafka-init
restart: "on-failure"
depends_on:
- kafka-0
- kafka-1
- kafka-2
volumes:
- ./kafka-init/client.properties:/bitnami/kafka/client.properties
entrypoint: [ '/bin/sh', '-c' ]
command: |
"
sleep 20
kafka-topics --bootstrap-server kafka-0:9091,kafka-1:9091,kafka-2:9091 --command-config /bitnami/kafka/client.properties --create --if-not-exists --topic test --replication-factor 3 --partitions 6
kafka-topics --bootstrap-server kafka-0:9091,kafka-1:9091,kafka-2:9091 --command-config /bitnami/kafka/client.properties --create --if-not-exists --topic notifications --replication-factor 3 --partitions 6
kafka-topics --bootstrap-server kafka-0:9091,kafka-1:9091,kafka-2:9091 --command-config /bitnami/kafka/client.properties --create --if-not-exists --topic user-events.v1 --replication-factor 3 --partitions 6
kafka-topics --bootstrap-server kafka-0:9091,kafka-1:9091,kafka-2:9091 --command-config /bitnami/kafka/client.properties --create --if-not-exists --topic chat-events.v1 --replication-factor 3 --partitions 6
kafka-topics --bootstrap-server kafka-0:9091,kafka-1:9091,kafka-2:9091 --command-config /bitnami/kafka/client.properties --create --if-not-exists --topic message-events.v1 --replication-factor 3 --partitions 6
kafka-topics --bootstrap-server kafka-0:9091,kafka-1:9091,kafka-2:9091 --command-config /bitnami/kafka/client.properties --create --if-not-exists --topic android-pushes --replication-factor 3 --partitions 6
kafka-topics --bootstrap-server kafka-0:9092,kafka-1:9094,kafka-2:9091 --command-config /bitnami/kafka/client.properties --create --if-not-exists --topic ios-pushes --replication-factor 3 --partitions 6
kafka-topics --bootstrap-server kafka-0:9091,kafka-1:9091,kafka-2:9091 --command-config /bitnami/kafka/client.properties --create --if-not-exists --topic huawei-pushes --replication-factor 3 --partitions 6
kafka-topics --bootstrap-server kafka-0:9091,kafka-1:9091,kafka-2:9091 --command-config /bitnami/kafka/client.properties --create --if-not-exists --topic ios-pushes --replication-factor 3 --partitions 6
kafka-topics --bootstrap-server kafka-0:9091,kafka-1:9091,kafka-2:9091 --command-config /bitnami/kafka/client.properties --create --if-not-exists --topic desktop-pushes --replication-factor 3 --partitions 6
kafka-topics --bootstrap-server kafka-0:9091,kafka-1:9091,kafka-2:9091 --command-config /bitnami/kafka/client.properties --create --if-not-exists --topic safari-pushes --replication-factor 3 --partitions 6
kafka-topics --bootstrap-server kafka-0:9091,kafka-1:9091,kafka-2:9091 --command-config /bitnami/kafka/client.properties --create --if-not-exists --topic web-pushes --replication-factor 3 --partitions 6
kafka-topics --bootstrap-server kafka-0:9091,kafka-1:9091,kafka-2:9091 --command-config /bitnami/kafka/client.properties --create --if-not-exists --topic big-groups-topic --replication-factor 3 --partitions 6
kafka-topics --bootstrap-server kafka-0:9091,kafka-1:9091,kafka-2:9091 --command-config /bitnami/kafka/client.properties --create --if-not-exists --topic voip --replication-factor 3 --partitions 6
kafka-topics --bootstrap-server kafka-0:9091,kafka-1:9091,kafka-2:9091 --command-config /bitnami/kafka/client.properties --create --if-not-exists --topic regular-groups-topic --replication-factor 3 --partitions 6
kafka-topics --bootstrap-server kafka-0:9091,kafka-1:9091,kafka-2:9091 --command-config /bitnami/kafka/client.properties --create --if-not-exists --topic search-chat-events.v1.dlt --replication-factor 3 --partitions 6
kafka-topics --bootstrap-server kafka-0:9091,kafka-1:9091,kafka-2:9091 --command-config /bitnami/kafka/client.properties --create --if-not-exists --topic search-user-events.v1.dlt --replication-factor 3 --partitions 6
kafka-topics --bootstrap-server kafka-0:9091,kafka-1:9091,kafka-2:9091 --command-config /bitnami/kafka/client.properties --create --if-not-exists --topic search-message-events.v1.dlt --replication-factor 3 --partitions 6
kafka-topics --bootstrap-server kafka-0:9091,kafka-1:9091,kafka-2:9091 --command-config /bitnami/kafka/client.properties --create --if-not-exists --topic message-events.v1.dlt --replication-factor 3 --partitions 6
kafka-topics --bootstrap-server kafka-0:9091,kafka-1:9091,kafka-2:9091 --command-config /bitnami/kafka/client.properties --create --if-not-exists --topic notification-unregister-tokens --replication-factor 3 --partitions 6
kafka-topics --bootstrap-server kafka-0:9091,kafka-1:9091,kafka-2:9091 --command-config /bitnami/kafka/client.properties --create --if-not-exists --topic user-sticker-events.v1 --replication-factor 3 --partitions 6
kafka-topics --bootstrap-server kafka-0:9091,kafka-1:9091,kafka-2:9091 --command-config /bitnami/kafka/client.properties --create --if-not-exists --topic user-sticker-events.v1.dlt --replication-factor 3 --partitions 6
kafka-topics --bootstrap-server kafka-0:9091,kafka-1:9091,kafka-2:9091 --command-config /bitnami/kafka/client.properties --create --if-not-exists --topic external-call-events.v1.dlt --replication-factor 3 --partitions 6
kafka-topics --bootstrap-server kafka-0:9091,kafka-1:9091,kafka-2:9091 --command-config /bitnami/kafka/client.properties --create --if-not-exists --topic gem-call-lifecycle-events.v1.dlt --replication-factor 3 --partitions 6
kafka-topics --bootstrap-server kafka-0:9091,kafka-1:9091,kafka-2:9091 --command-config /bitnami/kafka/client.properties --create --if-not-exists --topic external-call-events.v1 --replication-factor 3 --partitions 6
kafka-topics --bootstrap-server kafka-0:9091,kafka-1:9091,kafka-2:9091 --command-config /bitnami/kafka/client.properties --create --if-not-exists --topic gem-call-lifecycle-events.v1 --replication-factor 3 --partitions 6
kafka-topics --bootstrap-server kafka-0:9091,kafka-1:9091,kafka-2:9091 --command-config /bitnami/kafka/client.properties --create --if-not-exists --topic realtime-events.v1 --replication-factor 3 --partitions 6
kafka-topics --bootstrap-server kafka-0:9091,kafka-1:9091,kafka-2:9091 --command-config /bitnami/kafka/client.properties --create --if-not-exists --topic realtime-events.v1.dlt --replication-factor 3 --partitions 6
kafka-topics --bootstrap-server kafka-0:9091,kafka-1:9091,kafka-2:9091 --command-config /bitnami/kafka/client.properties --create --if-not-exists --topic livekit-events.v1 --replication-factor 3 --partitions 6
kafka-topics --bootstrap-server kafka-0:9091,kafka-1:9091,kafka-2:9091 --command-config /bitnami/kafka/client.properties --create --if-not-exists --topic livekit-events.v1.dlt --replication-factor 3 --partitions 6
kafka-topics --bootstrap-server kafka-0:9091,kafka-1:9091,kafka-2:9091 --command-config /bitnami/kafka/client.properties --create --if-not-exists --topic call-events.v1 --replication-factor 3 --partitions 6
kafka-topics --bootstrap-server kafka-0:9091,kafka-1:9091,kafka-2:9091 --command-config /bitnami/kafka/client.properties --create --if-not-exists --topic call-events.v1.dlt --replication-factor 3 --partitions 6
"
networks:
- {{ instance_app }}

View File

@ -0,0 +1,24 @@
services:
postgres_notifications:
image: postgres:latest
container_name: postgres_notifications
environment:
POSTGRES_USER: notifications_user
POSTGRES_PASSWORD: fcQMXldedw7xsZ08Ydip
POSTGRES_DB: notifications_db
PGDATA: /var/lib/postgresql/data/pgdata
ports:
- "5433:5432"
volumes:
- ./notifications/pgdata:/var/lib/postgresql/data/pgdata
- ./notifications/init.sql:/docker-entrypoint-initdb.d/init.sql
healthcheck:
test: [ "CMD-SHELL", "pg_isready -U search_user -d search_db" ]
interval: 30s
timeout: 10s
retries: 5
restart: unless-stopped
tty: true
stdin_open: true
networks:
- {{ instance_app }}

View File

@ -0,0 +1,16 @@
services:
redis-sticker-service:
image: 'bitnami/redis:latest'
container_name: redis-sticker-service
hostname: redis-sticker-service
restart: "always"
environment:
# ALLOW_EMPTY_PASSWORD is recommended only for development.
ALLOW_EMPTY_PASSWORD: "yes"
REDIS_DISABLE_COMMANDS: "FLUSHDB,FLUSHALL"
volumes:
- ./redis-sticker-service/redis.conf:/opt/bitnami/redis/etc/redis.conf
networks:
- {{ instance_app }}
ports:
- '6381:6379'

View File

@ -0,0 +1,16 @@
services:
redis-users:
image: 'bitnami/redis:latest'
container_name: redis-users
hostname: redis-users
restart: "always"
environment:
# ALLOW_EMPTY_PASSWORD is recommended only for development.
ALLOW_EMPTY_PASSWORD: "yes"
REDIS_DISABLE_COMMANDS: "FLUSHDB,FLUSHALL"
volumes:
- ./redis-users/redis.conf:/opt/bitnami/redis/etc/redis.conf
networks:
- {{ instance_app }}
ports:
- '6380:6379'

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,14 @@
services:
redis:
image: 'bitnami/redis:latest'
container_name: redis
hostname: redis
restart: "always"
environment:
# ALLOW_EMPTY_PASSWORD is recommended only for development.
ALLOW_EMPTY_PASSWORD: "yes"
REDIS_DISABLE_COMMANDS: "FLUSHDB,FLUSHALL"
networks:
- {{ instance_app }}
ports:
- '6379:6379'

View File

@ -0,0 +1,78 @@
services:
postgres_search:
image: postgres:15
container_name: postgres_search
environment:
POSTGRES_USER: search_user
POSTGRES_PASSWORD: u63nwpSyRnJsVWNcg
POSTGRES_DB: search_db
PGDATA: /var/lib/postgresql/data/pgdata
ports:
- "5430:5432"
volumes:
- ./search/pgdata:/var/lib/postgresql/data/pgdata
healthcheck:
test: [ "CMD-SHELL", "pg_isready -U search_user -d search_db" ]
interval: 30s
timeout: 10s
retries: 5
restart: unless-stopped
tty: true
stdin_open: true
networks:
- {{ instance_app }}
elastic_search:
container_name: elastic_search
image: elasticsearch:8.16.0
restart: "always"
environment:
- network.host=0.0.0.0
- discovery.type=single-node
- cluster.name=docker-cluster
- node.name=node1
- xpack.license.self_generated.type=basic
- xpack.security.enabled=false
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
#- "ELASTIC_USERNAME=elastic"
#- "ELASTIC_PASSWORD=Pa$$w0rd2!"
ports:
- 9200:9200
networks:
- {{ instance_app }}
ulimits:
memlock:
soft: -1
hard: -1
nofile:
soft: 65536
hard: 65536
elastic-init:
image: elasticsearch:8.16.0
container_name: elastic-init
restart: "no"
entrypoint: ["/init.sh"]
volumes:
- ./search/chat_v1_idx.json:/chat_v1_idx.json
- ./search/user_v1_idx.json:/user_v1_idx.json
- ./search/message_v1_idx.json:/message_v1_idx.json
- ./search/init.sh:/init.sh
networks:
- {{ instance_app }}
depends_on:
- elastic_search
kibana_search:
container_name: kibana_search
image: kibana:8.16.0
restart: "always"
environment:
ELASTICSEARCH_HOSTS: http://elastic_search:9200
SERVER_HOSTS: 0.0.0.0
ports:
- "5601:5601"
networks:
- {{ instance_app }}
depends_on:
- elastic_search

View File

@ -0,0 +1,6 @@
#!/usr/bin/env bash
sleep 30
cd /
curl -XPOST 'http://elastic_search:9200/chat/_doc/1' -H 'Content-Type: application/json' -d @'chat_v1_idx.json'
curl -XPOST 'http://elastic_search:9200/user/_doc/1' -H 'Content-Type: application/json' -d @'user_v1_idx.json'
curl -XPOST 'http://elastic_search:9200/message/_doc/1' -H 'Content-Type: application/json' -d @'message_v1_idx.json'

View File

@ -0,0 +1,85 @@
---
# vars file
# Cassandra DataBases
cassandra_db: "database"
# Backend apps
backend_apps:
- auth
- user
- upload
- chat
- chat-event-handler
- workspace
- search
- search-event-handler
- gem-call
- notification
- realtime
- sticker
- bff
- message
- message-event-handler
- message-link-preview-handler
- call
- call-event-handler
- call-realtime
- livekit-webhook-handler
- deeplink
- voip-splitter
- web-sender
- safari
- repartitioner
- regular-chat-splitter
- unregister-tokens
- notification-messages-transformer
- ios
- huawei
- gem-call-events-handler
- desktop
- big-chat-splitter
- android
- auth-event-handler
- workspace-event-handler
- message-call-event-handler
- message-chat-event-handler
- notification-event-handler
- message-user-event-handler
- admin
- bff-admin
- bff-vcs
# Backent ports
backend_ports:
- 8082 # auth
- 8084 # user
- 8083 # upload
- 8085 # chat
- 5085 # chat
- 8087 # workspace
- 8088 # search
- 8089 # gem-call
- 5089 # gem-call
- 8090 # notification
- 8091 # realtime
- 5091 # realtime
- 9999 # realtime
- 8092 # sticker
- 8081 # bff
- 8086 # message
- 5099 # call-app
- 8099 # call-app
- 5097 # call-event-handler
- 5096 # call-realtime
- 5098 # livekit-webhook-handler
- 8093 # deeplink
- 8094 # auth-event-handler
- 8095 # workspace-event-handler
- 8096 #message-call-event-handler-app
- 8097 #message-chat-event-handler-app
- 8098 #notification-event-handler
- 5086 #chat-event-handler
- 8102 # admin
- 8100 # bff-admin
- 8101 # bff-admin
- 8079 # bff-vcs

View File

@ -0,0 +1,4 @@
======================================================================
Role information
======================================================================
Установка CA (Центра сертификации)

View File

@ -0,0 +1,4 @@
---
# handlers file

View File

@ -0,0 +1,73 @@
---
# Настройка CA
- name: Configure CA
block:
- name: Creates base directory
ansible.builtin.file:
path: "/opt/{{ item }}"
state: directory
loop:
- CA
- CA/service
- name: Install additional packages
apt:
name: '{{ item }}'
state: present
update_cache: yes
loop:
- python3
- python3-pip
- perl
- python3-lxml
- packagekit
- unzip
- python3-pexpect
# - name: Install pip packages
# pip:
# name: '{{ item }}'
# executable: pip3
# state: latest
# loop:
# - pexpect
- name: Check CA private key
stat:
path: /opt/CA/RootCA.key
register: ca_key_result
- name: Create CA private key
expect:
command: /bin/bash -c 'openssl genpkey -algorithm RSA -out /opt/CA/RootCA.key -aes-128-cbc'
responses:
Enter PEM pass *: "{{ ca_password }}"
Verifying *: "{{ ca_password }}"
timeout: 300
when: ca_key_result.stat.exists == false
- name: Check CA certificate
stat:
path: /opt/CA/RootCA.crt
register: ca_crt_result
- name: Create CA certificate
expect:
command: "/bin/bash -c 'openssl req -x509 -new -key /opt/CA/RootCA.key -sha256 -days {{ ca_lifeday }} -out /opt/CA/RootCA.crt'"
responses:
Enter pass *: "{{ ca_password }}"
Country *: "{{ ca_country }}"
State *: "{{ ca_state }}"
Locality *: "{{ ca_locality }}"
Organization *: "{{ ca_organization }}"
Organizational *: "{{ ca_organization }}"
Common *: "{{ ca_domain }}"
Email *: "admin@{{ ca_domain }}"
timeout: 300
when: ca_crt_result.stat.exists == false
- name: Create certificate template
template:
src: template.cnf.j2
dest: /opt/CA/template.cnf
register: template_updated

View File

@ -0,0 +1,45 @@
---
- name: Create wildcard service certificate
block:
- name: Check private KEY
stat:
path: /opt/CA/service/{{ crt_services }}.key
register: key_result
- name: Create wildcard service KEY
shell: |
openssl genpkey -algorithm RSA -out /opt/CA/service/{{ crt_services }}.key
when: key_result.stat.exists == false
- name: Check CSR
stat:
path: /opt/CA/service/{{ crt_services }}.csr
register: csr_result
- name: Create wildcard service CSR
expect:
command: "/bin/bash -c 'openssl req -new -key /opt/CA/service/{{ crt_services }}.key -config /opt/CA/template.cnf -reqexts req_ext -out /opt/CA/service/{{ crt_services }}.csr'"
responses:
Country *: "{{ ca_country }}"
State *: "{{ ca_state }}"
Locality *: "{{ ca_locality }}"
Organization *: "{{ ca_organization }}"
Organizational *: "{{ ca_organization }}"
Common *: "{{ ca_domain }}"
Email *: "admin@{{ ca_domain }}"
timeout: 300
when: csr_result.stat.exists == false
- name: Check public CRT
stat:
path: /opt/CA/service/{{ crt_services }}.crt
register: crt_result
- name: Create wildcard service CRT
expect:
command: "/bin/bash -c 'openssl x509 -req -days 730 -CA /opt/CA/RootCA.crt -CAkey /opt/CA/RootCA.key -extfile /opt/CA/template.cnf -extensions req_ext -in /opt/CA/service/{{ crt_services }}.csr -out /opt/CA/service/{{ crt_services }}.crt'"
responses:
Enter pass *: "{{ ca_password }}"
when: crt_result.stat.exists == false

View File

@ -0,0 +1,8 @@
---
# Настройка CA
- name: Configure CA
include_tasks: configure_ca.yml
- name: Create service certificate
include_tasks: create_cert.yml

View File

@ -0,0 +1,22 @@
[ req ]
default_bits = 2048
distinguished_name = req_distinguished_name
req_extensions = req_ext
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = {{ ca_country }}
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = {{ ca_state }}
localityName = Locality Name (eg, city)
localityName_default = {{ ca_locality }}
organizationName = Organization Name (eg, company)
organizationName_default = {{ ca_organization }}
commonName = Common Name (eg, YOUR name or FQDN)
commonName_max = 64
commonName_default = *.{{ ca_domain }}
[ req_ext ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = *.{{ ca_domain }}

View File

@ -0,0 +1,3 @@
---
# vars file
crt_services: "wc" # Имя файла wildcard сертификата

View File

@ -0,0 +1,4 @@
======================================================================
Role information
======================================================================
Установка Bind

View File

@ -0,0 +1,4 @@
---
# handlers file

View File

@ -0,0 +1,124 @@
---
# Настройка Bind
- name: Configure Bind
block:
- name: Change bind options config
template:
src: named.conf.options.j2
dest: /etc/bind/named.conf.options
mode: 0644
owner: root
group: bind
register: named_options_updated
- name: Change bind local config
template:
src: named.conf.local.j2
dest: /etc/bind/named.conf.local
mode: 0644
owner: root
group: bind
register: named_local_updated
- name: Creates master zone directory
ansible.builtin.file:
path: /var/cache/bind/master
state: directory
- name: Create dns local zone config
template:
src: dns_zone_local.j2
dest: "/var/cache/bind/master/{{ dns_zone }}"
mode: 0644
owner: root
group: bind
register: named_zone_updated
- name: Check and update zone config
shell: |
named-checkzone {{ dns_zone }} /var/cache/bind/master/{{ dns_zone }}
when: named_zone_updated['changed']
- name: Update DNS zone
shell: |
rndc reload
when: named_zone_updated['changed']
- name: Check Bind config
shell: "named-checkconf /etc/bind/named.conf"
when: named_options_updated['changed'] or named_local_updated['changed']
- name: Reload Bind service
service:
name: bind9
state: reloaded
when: named_options_updated['changed'] or named_local_updated['changed'] or named_zone_updated['changed']
- name: Configure ufw
block:
- name: Install ufw packages
apt:
name: '{{ item }}'
state: present
update_cache: yes
loop:
- ufw
when: "'ufw' not in ansible_facts.packages"
- name: Enable ufw service
systemd:
name: ufw.service
state: started
enabled: yes
- name: Default allow outgoing traffic
community.general.ufw:
default: allow
direction: outgoing
- name: Default deny incoming traffic
community.general.ufw:
default: deny
direction: incoming
- name: Allow ssh traffic
community.general.ufw:
rule: allow
port: 22
proto: tcp
- name: Allow DNS traffic TCP
community.general.ufw:
rule: allow
port: 53
proto: tcp
- name: Allow DNS traffic UDP
community.general.ufw:
rule: allow
port: 53
proto: udp
- name: Enable UFW
community.general.ufw:
state: enabled
policy: deny
# - name: Enable and start Docker service
# service:
# name: docker
# state: started
# enabled: yes
# - name: Restart Docker service
# service:
# name: docker
# state: restarted
# when: docker_updated['changed']
# - name: Add users to a docker group
# ansible.builtin.user:
# name: "{{ item }}"
# groups: docker
# loop: "{{ docker_users_list }}"
# when: docker_users_list is defined

View File

@ -0,0 +1,24 @@
---
# Установка Bind
- name: "Check packages is installed"
package_facts:
manager: "auto"
- name: "Install packages"
block:
- name: Install packages
apt:
name: '{{ item }}'
state: present
update_cache: yes
loop:
- bind9
- dnsutils
- python3
- python3-pip
- perl
- python3-lxml
- packagekit
- unzip
- python3-pexpect
when: "'bind9' not in ansible_facts.packages or 'dnsutils' not in ansible_facts.packages"

View File

@ -0,0 +1,9 @@
---
# Установка Bind
- name: Install Bind
include_tasks: install_bind.yml
# Настройка Bind
- name: Configure Bind
include_tasks: configure_bind.yml

Some files were not shown because too many files have changed in this diff Show More