diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000..b120338
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,18 @@
+# Выполнено ДЗ №
+
+ - [ ] Основное ДЗ
+ - [ ] Задание со *
+
+## В процессе сделано:
+ - Пункт 1
+ - Пункт 2
+
+## Как запустить проект:
+ - Например, запустить команду X в директории Y
+
+## Как проверить работоспособность:
+ - Например, перейти по ссылке http://localhost:8080
+
+## PR checklist
+ - [ ] Выставил label с номером домашнего задания
+ - [ ] Выставил label с темой домашнего задания
diff --git a/.github/auto_assign.yml b/.github/auto_assign.yml
new file mode 100644
index 0000000..db7e7d9
--- /dev/null
+++ b/.github/auto_assign.yml
@@ -0,0 +1,6 @@
+# Set to true to add assignees to pull requests
+addAssignees: true
+
+# A list of reviewers to be added to pull requests (GitHub user name)
+reviewers:
+ - mrgreyves
\ No newline at end of file
diff --git a/.github/workflows/auto-assign.yml b/.github/workflows/auto-assign.yml
new file mode 100644
index 0000000..d8d2296
--- /dev/null
+++ b/.github/workflows/auto-assign.yml
@@ -0,0 +1,8 @@
+name: 'Auto Assign'
+on: pull_request
+
+jobs:
+ add-reviews:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: kentaro-m/auto-assign-action@v1.1.2
\ No newline at end of file
diff --git a/.github/workflows/run-tests-2022-02.yml b/.github/workflows/run-tests-2022-02.yml
new file mode 100644
index 0000000..e264bf8
--- /dev/null
+++ b/.github/workflows/run-tests-2022-02.yml
@@ -0,0 +1,26 @@
+name: Run tests for OTUS homework
+
+on:
+ push:
+ branches-ignore: main
+ pull_request:
+ branches-ignore: main
+
+jobs:
+ test:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout this repo
+ uses: actions/checkout@v2
+ with:
+ ref: ${{ github.ref }}
+ - name: Checkout repo with tests
+ uses: actions/checkout@v2
+ with:
+ repository: "express42/otus-homeworks"
+ ref: 2022-02
+ path: "./otus-homeworks/"
+
+ - name: Run tests
+ run: curl https://raw.githubusercontent.com/express42/otus-homeworks/2022-02/run.sh | bash
\ No newline at end of file
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
new file mode 100644
index 0000000..6c8a3a9
--- /dev/null
+++ b/.pre-commit-config.yaml
@@ -0,0 +1,6 @@
+repos:
+- repo: https://github.com/pre-commit/pre-commit-hooks
+ rev: v2.3.0
+ hooks:
+ - id: end-of-file-fixer
+ - id: trailing-whitespace
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..815c08d
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2022 Otus-DevOps-2022-02
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/VPN/README.md b/VPN/README.md
new file mode 100644
index 0000000..80e5aa5
--- /dev/null
+++ b/VPN/README.md
@@ -0,0 +1,92 @@
+# **HOME-WORK-03 - CLOUD-BASTION**
+
+- Создаем инстансы ВМ и производим настройки по инструкции.
+
+---
+- Получена следующая адресация виртуальных серверов YC:
+```
+*BASTION*
+EXT-IP: 51.250.64.135
+INT-IP: 10.128.0.13
+```
+```
+*SOMEINTERNALHOST*
+EXT-IP: -
+INT-IP: 10.128.0.17
+```
+
+---
+# Спобосы подключения к SOMEINTERNALHOST в одну команду
+- Первый способ подключения к SOMEINTERNALHOST в одну команду:
+```
+ssh -A EXT-IP-BASTION -t ssh INT-IP-SOMEINTERNALHOST
+```
+IP адресация указана выше.
+В нашем случае (УЗ appuser) команда будет иметь вид:
+```
+ssh -A appuser@EXT-IP-BASTION -t ssh INT-IP-SOMEINTERNALHOST
+```
+
+---
+- Второй способ подключения к SOMEINTERNALHOST в одну команду:
+```
+ssh -J EXT-IP-BASTION INT-IP-SOMEINTERNALHOST
+```
+IP адресация указана выше.
+В нашем случае (УЗ appuser) команда будет иметь вид:
+```
+ssh -J appuser@EXT-IP-BASTION appuser@INT-IP-SOMEINTERNALHOST
+```
+
+---
+- Дополнительное задание - создание ALIAS SOMEINTERNALHOST:
+
+ALIAS можно сделать на любой тип подключения, указанный выше. Например:
+```
+alkolexx@ALKOLEXX-NOTE:~$ echo 'alias someinternalhost="ssh -A appuser@51.250.71.30 -t ssh 10.128.0.17"' >> /home/alkolexx/.bashrc
+alkolexx@ALKOLEXX-NOTE:~$ source /home/alkolexx/.bashrc
+```
+Теперь подключение к SOMEINTERNALHOST происходит следующим способом:
+```
+alkolexx@ALKOLEXX-NOTE:~$ someinternalhost
+```
+
+---
+# VPN SERVER - PRITUNL
+- Скрипт из инструкции оказался не рабочим на Xenial - отсутствуют пакеты для этой версии, выдавал ошибку.
+- Обновил BASTION до версии 20.04.
+- Скрипт установки VPN:
+```
+#!/bin/bash
+
+# ADD REPO
+sudo tee /etc/apt/sources.list.d/pritunl.list << EOF
+deb http://repo.pritunl.com/stable/apt focal main
+EOF
+
+sudo tee /etc/apt/sources.list.d/mongodb-org-5.0.list << EOF
+deb https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/5.0 multiverse
+EOF
+
+# ADD KEY
+curl https://raw.githubusercontent.com/pritunl/pgp/master/pritunl_repo_pub.asc | sudo apt-key add -
+curl https://www.mongodb.org/static/pgp/server-5.0.asc | sudo apt-key add -
+
+# UPDATE
+sudo apt update
+
+# DISABLE FIREWALL
+sudo ufw disable
+
+# INSTALL VPN
+sudo apt -y install pritunl mongodb-org
+sudo systemctl enable mongod pritunl
+sudo systemctl start mongod pritunl
+```
+- Устанавливаем VPN командой: `bash setupvpn.sh`
+- Действуем далее по инструкции и проверяем коннект к SOMEINTERNALHOST.
+- Данные для подключения (еще раз):
+```
+bastion_IP = 51.250.64.135
+someinternalhost_IP = 10.128.0.17
+```
diff --git a/VPN/cloud-bastion.ovpn b/VPN/cloud-bastion.ovpn
new file mode 100644
index 0000000..4a4760d
--- /dev/null
+++ b/VPN/cloud-bastion.ovpn
@@ -0,0 +1,207 @@
+#{
+# "version": 1,
+# "user": "test",
+# "organization": "OTUS",
+# "server": "OTUS",
+# "wg": false,
+# "user_id": "623c599656256102aa2de385",
+# "organization_id": "623c599556256102aa2de380",
+# "server_id": "623c5a3256256102aa2de440",
+# "server_public_key": [
+# "-----BEGIN RSA PUBLIC KEY-----",
+# "MIICCgKCAgEArt8GSuu/XtD0PSyAw8tNGK2YpFoPDEkaZgcPlDnXmeU9HfjodBan",
+# "jTac8liOQIDs9IPZMQuZJVzLSw4FXfZQ4ImceiSYwnaOANB+PDqfTuXEBPbjV8RK",
+# "hYbAnjp9dMPJDgYRmGLX0nh+w2xoGNTPwkbMDhEnGwpwxmVw7AHYP0rDxujh9Efp",
+# "txd+mzvo6wezLB33LMNcrTwEh3BbJCARHPVjERe586Fkzebee6nJqpGTw4HZYHGH",
+# "2t8iFQwzI857KR0B+ajgpCa+GA1HrS+x46s/+U7BwrScIJMZwVzLWDj0utmAc5Oy",
+# "CuapKL8uG7RH4pKgIZxztEuUXfIFftDWXQYUfYcDvls3/Wn1sfGAnW0od0xQ1C6A",
+# "QYn9cyB1CT7rOm/F9ZrmMpOAf/6z+uLDkOG2xVOOuU1qDhov52uSz67PCEjiJc/T",
+# "UzWaCHMtJ2YsTnOVaKrgZmeTd1aa3xHG4JG66EqhmD3cMBOPAEzUcZEyENxLfIOf",
+# "qJwhMWPBRWXxZsBTXgGAlmcoOZVW0oaGPH8kofm4uQSkbeNIU4mV88nANnIGREaf",
+# "zby7coKtVoIG9qd/zjqGEuxWRoZd+MVqlp3YUS+V6+z073xDXE0gZUALnqPitcfR",
+# "8uc64PWu4/XSXDlP2raF5zjtT1wM/vw5pwpac5Ug+skmnJdC7L+eonsCAwEAAQ==",
+# "-----END RSA PUBLIC KEY-----"
+# ],
+# "server_box_public_key": "zaHrLdDa4N7XFhDj8SgX+ZtQAsTaCbrsEY19C5F4xiw=",
+# "sync_hosts": [
+# "https://51.250.64.135"
+# ],
+# "sync_hash": "d04a5d999ecbeec4eec0422c38e31131",
+# "password_mode": "pin",
+# "push_auth": false,
+# "push_auth_ttl": 172800,
+# "disable_reconnect": false,
+# "token_ttl": 172800,
+# "token": false,
+# "sync_token": "SmkKFoPGUsMPM6dwm4P9jct2pP0eyx4n",
+# "sync_secret": "Coeo5a6REg1W2zM4kIiEDVVtcPzYYkEN"
+#}
+setenv UV_ID 567e8c1268794ba19cc58dd5b0b3d33b
+setenv UV_NAME summer-waves-5514
+client
+dev tun
+dev-type tun
+remote 51.250.64.135 10765 udp
+nobind
+persist-tun
+cipher AES-128-CBC
+auth SHA1
+verb 2
+mute 3
+push-peer-info
+ping 10
+ping-restart 60
+hand-window 70
+server-poll-timeout 4
+reneg-sec 2592000
+sndbuf 393216
+rcvbuf 393216
+remote-cert-tls server
+comp-lzo no
+auth-user-pass
+key-direction 1
+
+-----BEGIN CERTIFICATE-----
+MIIFcTCCA1mgAwIBAgIIdqF3aXMBfwUwDQYJKoZIhvcNAQELBQAwRjEhMB8GA1UE
+CgwYNjIzYzU5OTU1NjI1NjEwMmFhMmRlMzgwMSEwHwYDVQQDDBg2MjNjNTk5NTU2
+MjU2MTAyYWEyZGUzODEwHhcNMjIwMzI0MTE0NDIyWhcNNDIwMzE5MTE0NDIyWjBG
+MSEwHwYDVQQKDBg2MjNjNTk5NTU2MjU2MTAyYWEyZGUzODAxITAfBgNVBAMMGDYy
+M2M1OTk1NTYyNTYxMDJhYTJkZTM4MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
+AgoCggIBAMnyhCRmTrYUGc6up9lndvKOfDezNR3U408eybkPfKw2DUB9uwpNDO3D
+fgZHoqWWYh+ch7AsmfD07v4pqXSEF8WSbAzfGPE0WcVIksHchNFf0yrjkjCACu1v
+JQIodIsdpsKqEyEDWExBDxS5sqEE6hJuEHd610jBvzW7D14TRAJTFCCGJw4I0KmA
+s18gFImo9p7llC1cCJjooNjQIdNPbWaFmjvHvKC9xW/KcqciQi1pVFY920nlHIUd
+Vbd0R6BcC0iP6RdBvhdeRtNYdlqIg0fqxaEy9s/lDNL5UO361saE8pXoJIPyeCRg
+v7ifoEeIC+NSHkgcfv5of8FxkyOe7VjaO5pXQev8pgTvm0qA0o5/UuP8IEvlZqTy
+jRQpBpTZ0c1Rq1s1rx/qA4jHLviGtycCr5v52Ym/y6aRmI2hclmmmXr/pwwiv2hl
+XJ3O027Amj5mmVaWoinwdW8qNbso1JBc5g0xrJzwB+BGI4Mpob/ohR0eFMDAAqay
+mIaAPeWTGUnidaMiRTRylcw9r1O+aWUDmfJG+s12ZtXQvPr43NL24SUSGfCrF3GS
+x/iARBEs5MDzd98w/a1UJd0zN/VPe3FJ7z0n5Wp4vfOm0+Rjlu50O+y4FuGp7iSJ
+5sv5LtPKIdqzlA0pCPF5CdJeAoNssxdwoBVFujK/EKBPrDKkQLfFAgMBAAGjYzBh
+MA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQ6txsx
+r6x929KQVXN+22bjW+BRWDAfBgNVHSMEGDAWgBQ6txsxr6x929KQVXN+22bjW+BR
+WDANBgkqhkiG9w0BAQsFAAOCAgEAVEH+HMMfA1W3UEVzZaZDca85GOctZfA6HqZG
+/JLK4JFCRxtmBlJUOSji/z70xypE+sCfWmL0FVYD7Nn2apMywQ/lZZLaWKTNmorz
+ixgQHIGu4ZZeMPEqK2GHKCZleWtZGaUnVYKg2Abyfwa03qZBHgOQaPC7oMEdgWjw
+3otkUvPjgVEr9xCATgjjOUH0TuqtGk4S/MQy3VAVweHhhdzkK0+7CPuccx9NO5aJ
+iD/Bfk3BL6JWoDqEeoZTmgVsN3rxCAY4DR2lZtet7opkQHPEDjLHT83cQQQaiaWE
+OPahr015twq2YJqyy+26wY6rq8aUCufWvHVTV48TDepzlGPDCEhNtBZq8UklCEWl
+IlbRTdzg00OlrU2kfS1zGQ2jGWGJDBongsy7zZdFMbYGNKBIOg8ATYE86gP15SnY
+mzOWHcbqat0uqfmvtk92NDL7bwT+q9LGoa5pUph+fSP5moUG6frZc5yZ/+3jQHjo
+dxVy3BLXAdNpOfxnW0RCHZN73nq/swizYDDS+8iZW+LmNF0XJmg8P6Tlxeawh5CY
+YTNMk7gngZ17fUVmo53jk5mkqf7NLp7sAVhAfVpEuGRd0/aTc9w+adSLtWFQv2US
+U1sZFB3bSslF0NSyB9bKbmRMgvBHnIR5TaO2b/ed0jGId/bjogqcouXCuAMDu3Wf
+BxVHAeI=
+-----END CERTIFICATE-----
+
+
+#
+# 2048 bit OpenVPN static key
+#
+-----BEGIN OpenVPN Static key V1-----
+905fbf43cedea91a641ce88c61c10e67
+82d3df5ff3a7f52d64279c5de8811fe9
+13b5cacd46d08d4d1aee763fc39f7631
+de2c855f5155b791fc054c70ccfa7768
+2cf07f8827ab2667e0bc3adfacb95ac8
+3a8ab4de012d50c71572baa6aaf79109
+c9afc34e844e86d93f07638d1bd6df16
+f5f4b3d2a4319bd2d503da674639c47a
+5256fb932cdd330a382f252fdb8802f7
+323f2016676ddcf9c49a77ea550bb60b
+28dfec1fc4d790d833e89607ea881cd2
+895f25d60c7671df7852a1b9c47b5e79
+79d064ea5a34b04f43cb5d878ec38579
+2d7f2179111d5c182e3b23698c945f18
+9452eb0a99c9223b1cf7b63d1c672210
+db90732b302c20883d5caf77403b4f51
+-----END OpenVPN Static key V1-----
+
+
+-----BEGIN CERTIFICATE-----
+MIIFgDCCA2igAwIBAgIIDTNtEn4/DQwwDQYJKoZIhvcNAQELBQAwRjEhMB8GA1UE
+CgwYNjIzYzU5OTU1NjI1NjEwMmFhMmRlMzgwMSEwHwYDVQQDDBg2MjNjNTk5NTU2
+MjU2MTAyYWEyZGUzODEwHhcNMjIwMzI0MTE0NDIzWhcNNDIwMzE5MTE0NDIzWjBG
+MSEwHwYDVQQKDBg2MjNjNTk5NTU2MjU2MTAyYWEyZGUzODAxITAfBgNVBAMMGDYy
+M2M1OTk2NTYyNTYxMDJhYTJkZTM4NTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
+AgoCggIBANQwaN2FnS8EsZTPicd6MTO7BwaH4pfRIiAo0WjB91V8O4LAIkNuKuEI
+1tatVcZl2lRCoPy84KBvZf42lry37OZJxchZBVaErREnV9oVH9ROIKKrsfeQba6s
+aMt9Xwh2DkASxLXWJTtIzSwq9/i+2VQgpB+KY40InGtFXnJYysrPcQAoqE/3kmrJ
+RVjBjmMxmEyjn4+/R7HSJ6trRbgt0UnqDBt1OmqvD+1GrEUDRKeA6wACI8ouLii+
+XXkHAVFIUVZuOPdjVA6wU+dylo7z2Q1PmsX9yFUZwAYrOIuDTDENEz39VhngCM+j
+gI0Fk+WNxsi/vOgZyYxRpt1so9Zh+FJNAs1x+XS/HcHYNuyrjMneZ6AjVqEaGxeB
+KDYCLKaC919QXRQ/Gm66hnh5GQw6/mD/TiBGknvX+ZegO6yMxWhN0jo7nVRo1wSK
+h1SYQDOX4ckTFPPAfIYxCIPEoeZUENnAKrGVh2kexBHt8gJCk/lAfcXasKSkNegf
+Ch3ACU/FDOEFUJl2+DmkgSeaagqAY741rWTTnUnOOLEONFVVVHXDZuPb4i3opMu4
+6bfy76Z29sRkxU1R61BGiBL9/JAifpt6WYy9SImYk6CHVbAvA56yu7hMFXBGT+uT
+TRg3+bASQ67pzjFJ+mXRlnqu7006YaMMD8ts5PURfficI1/eCOZVAgMBAAGjcjBw
+MA4GA1UdDwEB/wQEAwIFoDAJBgNVHRMEAjAAMBMGA1UdJQQMMAoGCCsGAQUFBwMC
+MB0GA1UdDgQWBBQWNc+yU4GMUrKoLClt8jvebOpNdzAfBgNVHSMEGDAWgBQ6txsx
+r6x929KQVXN+22bjW+BRWDANBgkqhkiG9w0BAQsFAAOCAgEAC0fM227D032KCM/Y
+y8vW4DjrZQQaaiiSh2axsltM6c/OKL0WZeRR/sXrTcdMGkjBNtcgI+kAiXz/9gG+
+JWm4LsDJEsBeYKGIbP7Z7CDMcJUGUMrKVvfyFflEjmqa1dMbPdQ3LJs2R85PpwKr
+ZPPX42kO10Hmzz+5IqKIMQKAYqWQc1ty6jskuHhkFaBZTwmiuh9ANaNYum7sdGJh
+RZYdLfDm5eIs0jRFLC8tttNqulTm/nq9c0D12abcBHmwFqW+CnNWnlEExgYYqE11
++jW8wKfUYbbo5qbEXF3Vdc2rqAJUhGHHxwMOJIadh2A5Pp0UoTkQqdfVw6jZW/hT
+PExkRyWP5mcuf9f2s7ENCUEwmw7FmasmLM2B94LGfu/YULo8ITsJH745nTzuWgFx
+PGF3pr5Jnd+QXbIY/zbWfHz5XXy7MiFEPty35tUMfBWfBfJtaWg3JoLi+mpnnHrY
+E3qD7OlDiwkSrI+TIo2VPPXEnIHEFNKCM/nFUP7L3rf5qCC/V+GscSCXA5ITfGtJ
+inUoH5OC3hYUsqFb9p9uce/1vx9sGfMndMgyT6Ia1m4QNuGntGcadVGOaWoLaSc/
++6HlSfp+mY2rGeHHIgj21rrb+cGQ0bOl4C8dXAcHaP71tpr75D9ZoQ9rv+GSbxs+
+1rwxNryipsXgHKmREAlD80AQVNk=
+-----END CERTIFICATE-----
+
+
+-----BEGIN PRIVATE KEY-----
+MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQDUMGjdhZ0vBLGU
+z4nHejEzuwcGh+KX0SIgKNFowfdVfDuCwCJDbirhCNbWrVXGZdpUQqD8vOCgb2X+
+Npa8t+zmScXIWQVWhK0RJ1faFR/UTiCiq7H3kG2urGjLfV8Idg5AEsS11iU7SM0s
+Kvf4vtlUIKQfimONCJxrRV5yWMrKz3EAKKhP95JqyUVYwY5jMZhMo5+Pv0ex0ier
+a0W4LdFJ6gwbdTpqrw/tRqxFA0SngOsAAiPKLi4ovl15BwFRSFFWbjj3Y1QOsFPn
+cpaO89kNT5rF/chVGcAGKziLg0wxDRM9/VYZ4AjPo4CNBZPljcbIv7zoGcmMUabd
+bKPWYfhSTQLNcfl0vx3B2Dbsq4zJ3megI1ahGhsXgSg2AiymgvdfUF0UPxpuuoZ4
+eRkMOv5g/04gRpJ71/mXoDusjMVoTdI6O51UaNcEiodUmEAzl+HJExTzwHyGMQiD
+xKHmVBDZwCqxlYdpHsQR7fICQpP5QH3F2rCkpDXoHwodwAlPxQzhBVCZdvg5pIEn
+mmoKgGO+Na1k051JzjixDjRVVVR1w2bj2+It6KTLuOm38u+mdvbEZMVNUetQRogS
+/fyQIn6belmMvUiJmJOgh1WwLwOesru4TBVwRk/rk00YN/mwEkOu6c4xSfpl0ZZ6
+ru9NOmGjDA/LbOT1EX34nCNf3gjmVQIDAQABAoICAEQoJJb7QykGLfBp1YzQkBtY
+uQH9BejUEU0ZL2Kh40t/MzJletwD+Bv+lduxI7stnjqwiDuGg/Sks7M7X6HQxnSW
+P8SB67gFt/2pkIuJe4bbbZoy4mBt8P1JfgPXCn6SRTOJk8wAtEbdtKG6T5qD2xUt
+wuoqrp1vpabDSnoaUVFh3p85cA73q/1HF1JSIeV02cHMUQWAYIwawAlM1ME7Xl2K
+o0bymcgI4WnK6KzmRtgzDckb5tkbilImC6pDeMXeH9pOX1f/fNGXC+xtHzVd2Ftx
+NXrhcMb9FXQlz+zoSMH8vDCOPmjjUJE5qKIjp4T1zGNRS2GWXuoGlD3NlrbXE0bu
+E/tqE7q/MorkDEgHaSDjRJCDY+81oakaDFX9rHgLhBpqRce+qp+flT5hy5HUb3hF
+5TsLTPBOszIiR+MEvzqbj0IJtspPb6CBUh30NlsCexKgiiaBfjmTPnSp7PyXV3ig
+i9kZD71Qny1PtUQarHsU23VX1dkrNGZZADwoaWqq/QcG0/0jCFOMNXpSMNvwLcwC
+KZYSwQoYa9JDzqbUjXLbCYRN0dVzawZc3ht9m6yJn5F9FMKxaYxrTSXdlBhn00iR
+rZhTi1k9THekj8Jp6U6jgxAuXAmIDfG2CFfKWrFmwIb9o9Ot/oqaXklT3Xxe6I5H
+caTqdm3lhLJNC2tjVDmlAoIBAQD99Bu39W1dCH9RWT20eFfvKmB0vw7HOx7WgVbZ
+5dVvk3cn4n95AIwU5Mu8pcUSw41xlVPD7ad1uQfs5SAPcpt+u+iy8FXbR/BOwBHz
+OU7BLm/t93UMabskvF0UrnK9se0WqqxJSFFKGkiRHgNI+GEZ/psVlMZzr8LtmNfw
+vgPOt3WSseWhHNK+zDeoB1SCcyrxu+i0sLQI/ZNr7j/WdaFMF2ZWj8BEi7r6FQ1G
+ED+TNqRbvo32cj8sXTifYs4zGlmHfkO4o9/0AxIhKfl/Ro8AQ7UtCdMwpyzw9NtP
+yABJ+fkXyg6H+qe5fERre+gR54KkoJeihptiPLY5YfPUVG5/AoIBAQDV5iTH1C17
++F1JLv2W4ohtbYfFyip8mcT8dAOgvMHHB6egqb222+XB99j9RMqOWo7NqHFxVswx
+FFJkNOI3a1lCG2T94pAg/J0FOp2d3EFDij4wWskYorFYpLuIWNfZsWmaebzhaiBH
+NpxxBTnMWY0dxVI0TmJqMknzZwTjAx7dUoNYgpxzGsP7mJ7Dr3UA365yEx6AcP7G
+Sjk1Dq7hCtXe7es+sIbAEw+BnnYFmM5NfRSbtWfbc6UjokV8h3e64mwvH8zHvsM+
+848nGWZIRtBUI9Z/ZNPeWGyrcL6O+by0PENrnG9+2xHuywLuJ/t2atzAslanlYUp
+HM2SJnAN2CkrAoIBABXkv6cCX6VPoDpRKUKvxVT3IE2wUwPWEviHOgebCuWNnw4v
+NrIl2+3JM89Vs0HE3iLWrtwLVw6NHyPLNRJf3Qv2Az+5/IzlDNCdOm7vl9yLtlab
+qNmjG+E05AluaLH17uyvVh8TPv7WeT8ZiUr3Ltfg3Vnk857xniqBrMwydX2Sz24Q
+LC3RoFGWpY205BJC/4bLnmpFeZ/0zIrXhWVlyrwWoFoCFp9SNJJu0jAiInj8kvrd
+2LtQaiXW+5SyHfjF4sYNmqUGa75LrXpydfIFETsCm1IAsNZW80bqtSWRpoS6KkFk
+yA/tChyxm+xwSDeS7+5lce0vEaJMfaFA0paRmN0CggEATJM1u6xEFEuX6ek+s9Op
+j7NUlgSILU9HbDGEUvkATmZ5JlVeK6aRnF1Ee3czJL9avFl/M1olg7SIwoMEMV7m
+93mjMBj6DDUjaYnQf4EohCtrlBgMQhuMbfWbhXZ43+BZtAm9Ct3ZbGUqoHOEe5nb
+oTrQ8RTWuroCK3dIEpU9aXJuvzMTG0oLu3ip7dhUhNmPNBuQId9R9l8AF/SHut0M
+L+DxBOJhe0XXmUnHar2HrcoHpK7O3YuLJTSkt64vuOHyZPR3dVLfxxuethqruVhQ
+oK6rzbOk/caeMMoODlVtrwCcClxYtgtrYheflu8NYRlkqj+uMhSfNVawaZAFMY+f
+PQKCAQEA4ob0EGLYH0KVK1hdXUSAcrg/paPab1kgGPCmewb7n4rQv0csJz8DIhw1
+I9bIiBbdqQbQVBz4+V08fhs1K4YephCcvpR5T822g6CdVG2SZqefWpTMjute9Ain
+J4QTUJ10bE3+AWqD/UGWSE7dr0wo/2fIgXL/iD9QjJy5XPRD1N8p4Vk1CriUTWYE
+nuYzpaWuf0wkaxj8XIcu/F/slJn3oeRlAoY2y0ICPEmiE4Vug9aHdfsXYmzfqp/S
+3e9cmaAsOX+i1q+w9DYzGdLQOKcb6kut8eLhXx8PyIMAJI/KvazjDnjr+z4SuRLv
+0dschv56ivvhFGyMd+JOgeQPT0a09g==
+-----END PRIVATE KEY-----
+
diff --git a/VPN/setupvpn.sh b/VPN/setupvpn.sh
new file mode 100644
index 0000000..02453b8
--- /dev/null
+++ b/VPN/setupvpn.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+
+# ADD REPO
+sudo tee /etc/apt/sources.list.d/pritunl.list << EOF
+deb http://repo.pritunl.com/stable/apt focal main
+EOF
+
+sudo tee /etc/apt/sources.list.d/mongodb-org-5.0.list << EOF
+deb https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/5.0 multiverse
+EOF
+
+# ADD KEY
+curl https://raw.githubusercontent.com/pritunl/pgp/master/pritunl_repo_pub.asc | sudo apt-key add -
+curl https://www.mongodb.org/static/pgp/server-5.0.asc | sudo apt-key add -
+
+# UPDATE
+sudo apt update
+
+# DISABLE FIREWALL
+sudo ufw disable
+
+# INSTALL VPN
+sudo apt -y install pritunl mongodb-org
+sudo systemctl enable mongod pritunl
+sudo systemctl start mongod pritunl
diff --git a/config-scripts/deploy.sh b/config-scripts/deploy.sh
new file mode 100644
index 0000000..4690e7a
--- /dev/null
+++ b/config-scripts/deploy.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+sudo apt update
+sudo apt install -y git
+git clone -b monolith https://github.com/express42/reddit.git
+cd reddit && bundle install
+puma -d
+ps aux | grep puma
diff --git a/config-scripts/install_mongodb.sh b/config-scripts/install_mongodb.sh
new file mode 100644
index 0000000..4afea4a
--- /dev/null
+++ b/config-scripts/install_mongodb.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+
+wget -qO - https://www.mongodb.org/static/pgp/server-4.2.asc | sudo apt-key add -
+echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/4.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.2.list
+sudo apt update
+sudo apt install -y mongodb-org
+sudo systemctl start mongod
+sudo systemctl enable mongod
+sudo systemctl status mongod
diff --git a/config-scripts/install_ruby.sh b/config-scripts/install_ruby.sh
new file mode 100644
index 0000000..635c609
--- /dev/null
+++ b/config-scripts/install_ruby.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+
+sudo apt update
+sudo apt install -y ruby-full ruby-bundler build-essential
+ruby -v
+bundler -v
diff --git a/packer/key.json b/packer/key.json
new file mode 100644
index 0000000..3847715
--- /dev/null
+++ b/packer/key.json
@@ -0,0 +1,8 @@
+{
+ "id": "aje2vfoph3761dangvp0",
+ "service_account_id": "ajefjckprbtccr073no3",
+ "created_at": "2022-09-18T16:56:28.500265585Z",
+ "key_algorithm": "RSA_2048",
+ "public_key": "",
+ "private_key": ""
+}
\ No newline at end of file
diff --git a/packer/scripts/install_mongodb.sh b/packer/scripts/install_mongodb.sh
new file mode 100644
index 0000000..9e341cc
--- /dev/null
+++ b/packer/scripts/install_mongodb.sh
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+apt-get install -y apt-transport-https ca-certificates
+wget -qO - https://www.mongodb.org/static/pgp/server-4.2.asc | sudo apt-key add -
+echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/4.2 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-4.2.list
+apt-get update
+sudo rm /var/lib/apt/lists/lock
+sudo rm /var/cache/apt/archives/lock
+sudo rm /var/lib/dpkg/lock
+sudo rm /var/lib/dpkg/lock-frontend
+apt-get install -y mongodb-org
+systemctl start mongod
+systemctl enable mongod
diff --git a/packer/scripts/install_ruby.sh b/packer/scripts/install_ruby.sh
new file mode 100644
index 0000000..cca5dc5
--- /dev/null
+++ b/packer/scripts/install_ruby.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+apt-get update
+sudo rm /var/lib/apt/lists/lock
+sudo rm /var/cache/apt/archives/lock
+sudo rm /var/lib/dpkg/lock
+sudo rm /var/lib/dpkg/lock-frontend
+apt-get install -y ruby-full ruby-bundler build-essential
diff --git a/packer/ubuntu16.json b/packer/ubuntu16.json
new file mode 100644
index 0000000..0971c60
--- /dev/null
+++ b/packer/ubuntu16.json
@@ -0,0 +1,30 @@
+{
+ "builders": [
+ {
+ "type": "yandex",
+ "service_account_key_file": "{{ user `service_account_key_file` }}",
+ "folder_id": "{{ user `folder_id`}}",
+ "source_image_family": "{{ user `source_image_family` }}",
+ "image_name": "reddit-base-{{timestamp}}",
+ "image_family": "reddit-base",
+ "ssh_username": "{{ user `ssh_username` }}",
+ "platform_id": "{{ user `platform_id` }}",
+ "use_ipv4_nat": "true",
+ "disk_size_gb": "{{ user `disk_size_gb` }}",
+ "instance_cores": "{{ user `instance_cores` }}",
+ "instance_mem_gb": "{{ user `instance_mem_gb` }}"
+ }
+ ],
+ "provisioners": [
+ {
+ "type": "shell",
+ "script": "scripts/install_ruby.sh",
+ "execute_command": "sudo {{.Path}}"
+ },
+ {
+ "type": "shell",
+ "script": "scripts/install_mongodb.sh",
+ "execute_command": "sudo {{.Path}}"
+ }
+ ]
+}
diff --git a/packer/variables.json.example b/packer/variables.json.example
new file mode 100644
index 0000000..699f2aa
--- /dev/null
+++ b/packer/variables.json.example
@@ -0,0 +1,10 @@
+ {
+ "service_account_key_file": "key.json",
+ "folder_id": "dfgqs784jdhfop29k97dt",
+ "source_image_family": "ubuntu-1604-lts",
+ "platform_id": "standard-v1",
+ "ssh_username": "ubuntu",
+ "disk_size_gb": "11",
+ "instance_cores": "2",
+ "instance_mem_gb": "2"
+ }
diff --git a/play-travis/test.py b/play-travis/test.py
new file mode 100644
index 0000000..8381bad
--- /dev/null
+++ b/play-travis/test.py
@@ -0,0 +1,9 @@
+import unittest
+
+class NumbersTest(unittest.TestCase):
+
+ def test_equal(self):
+ self.assertEqual(1 + 1, 2)
+
+if __name__ == '__main__':
+ unittest.main()