taski - сервис для любителей котиков.
Что умеет проект:
- Добавлять, просматривать, редактировать и удалять котиков.
- Добавлять новые и присваивать уже существующие достижения.
- Просматривать чужих котов и их достижения.
-
Клонируйте репозиторий на свой компьютер:
git clone https://github.com/klassnenkiy/taski-docker.git
cd taski_final
-
Создайте файл .env и заполните его своими данными. Перечень данных указан в корневой директории проекта в файле .env.example.
-
Замените username на ваш логин на DockerHub:
cd backend docker build -t tyulyagin/taski_backend . cd frontend docker build -t tyulyagin/taski_frontend . cd gateway docker build -t tyulyagin/taski_gateway .
-
Загрузите образы на DockerHub:
docker push tyulyagin/taski_backend docker push tyulyagin/taski_frontend docker push tyulyagin/taski_gateway
-
Подключитесь к удаленному серверу
ssh -i /home/ea703557/Загрузки/555/yc-ea703557 yc-user@158.160.28.33
key NRjeSf имя_пользователя@ip_адрес_сервера ```
-
Создайте на сервере директорию taski через терминал
mkdir taski
-
Установка docker compose на сервер:
sudo apt update sudo apt install curl curl -fSL https://get.docker.com -o get-docker.sh sudo sh ./get-docker.sh sudo apt-get install docker-compose-plugin
-
В директорию taski/ скопируйте файлы docker-compose.production.yml и .env:
scp -i path_to_SSH/SSH_name docker-compose.production.yml username@server_ip:/home/username/taski/docker-compose.production.yml * ath_to_SSH — путь к файлу с SSH-ключом; * SSH_name — имя файла с SSH-ключом (без расширения); * username — ваше имя пользователя на сервере; * server_ip — IP вашего сервера.g
scp -i /home/ea703557/Загрузки/555/yc-ea703557 docker-compose.production.yml yc-user@158.160.28.33:/home/yc-user/taski/docker-compose.production.yml
scp -i /home/ea703557/Загрузки/555/yc-ea703557 .env yc-user@158.160.28.33:/home/yc-user/taski/.env key NRjeSf
Добавьте в файл .env переменные и их значения:
P# Файл .env POSTGRES_USER=django_user POSTGRES_PASSWORD=mysecretpassword POSTGRES_DB=django
DB_HOST=db DB_PORT=5432
POSTGRES_USER — имя пользователя БД (необязательная переменная, значение по умолчанию — postgres); POSTGRES_PASSWORD — пароль пользователя БД (обязательная переменная для создания БД в контейнере); POSTGRES_DB — название базы данных (необязательная переменная, по умолчанию совпадает с POSTGRES_USER). Таким образом, можно передать в окружение только переменную POSTGRES_PASSWORD — и будет создана БД с названием postgres и пользователем postgres. При запуске контейнера имя файла с переменными окружения передают в параметр --env-file:
docker run --name db --env-file .env postgres:13.10 ```
docker run -d \
--name some-postgres \
-e POSTGRES_PASSWORD=mysecretpassword \
-e PGDATA=/var/lib/postgresql/data/pgdata \
-v /custom/mount:/var/lib/postgresql/data \
postgres
sudo docker run --name db
--env-file .env
-v pg_data:/var/lib/postgresql/data
postgres:13.10
-
Выполните миграции, соберите статические файлы бэкенда и скопируйте их в /backend_static/static/:
Далее выполняем последовательно sudo docker compose -f docker-compose.production.yml pull sudo docker compose -f docker-compose.production.yml down sudo docker compose -f docker-compose.production.yml up -d sudo docker compose -f docker-compose.production.yml exec backend python manage.py migrate sudo docker compose -f docker-compose.production.yml exec backend python manage.py collectstatic sudo docker compose -f docker-compose.production.yml exec backend cp -r /app/collect_static/. /static_backend/static/
-
На сервере в редакторе nano откройте конфиг Nginx:
sudo nano /etc/nginx/sites-enabled/default
-
Измените настройки location в секции server:
location / { proxy_set_header Host $http_host; proxy_pass http://127.0.0.1:9000; }
-
Проверьте работоспособность конфига Nginx:
sudo nginx -t
Если ответ в терминале такой, значит, ошибок нет:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
-
Перезапускаем Nginx
sudo service nginx reload
-
Файл workflow уже написан. Он находится в директории
taski/.github/workflows/main.yml
-
Для адаптации его на своем сервере добавьте секреты в GitHub Actions:
DOCKER_USERNAME # имя пользователя в DockerHub DOCKER_PASSWORD # пароль пользователя в DockerHub HOST # ip_address сервера USER # имя пользователя SSH_KEY # приватный ssh-ключ (cat ~/.ssh/id_rsa) SSH_PASSPHRASE # кодовая фраза (пароль) для ssh-ключа TELEGRAM_TO # id телеграм-аккаунта (можно узнать у @userinfobot, команда /start) TELEGRAM_TOKEN # токен бота (получить токен можно у @BotFather, /token, имя бота)
Настроить запуск проекта taski в контейнерах и CI/CD с помощью GitHub Actions
В корне репозитория создайте файл tests.yml со следующим содержимым:
repo_owner: ваш_логин_на_гитхабе
taski_domain: полная ссылка (https://доменное_имя) на ваш проект taski
taski_domain: полная ссылка (https://доменное_имя) на ваш проект Taski
dockerhub_username: ваш_логин_на_докерхабе
Скопируйте содержимое файла .github/workflows/main.yml
в файл taski_workflow.yml
в корневой директории проекта.
Для локального запуска тестов создайте виртуальное окружение, установите в него зависимости из backend/requirements.txt и запустите в корневой директории проекта pytest
.
- Проект Taski доступен по доменному имени, указанному в
tests.yml
. - Проект taski доступен по доменному имени, указанному в
tests.yml
. - Пуш в ветку main запускает тестирование и деплой taski, а после успешного деплоя вам приходит сообщение в телеграм.
- В корне проекта есть файл
taski_workflow.yml
.
sudo nano /etc/nginx/sites-enabled/default
:
server {
server_name 158.160.28.33 klassnenkiy.ddns.net;
server_tokens off;
location / {
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:8000;
}
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/klassnenkiy.ddns.net/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/klassnenkiy.ddns.net/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
server_name 158.160.28.33 klassnenkiy.ddns.net;
server_tokens off;
location / {
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:9000;
}
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/klassnenkiy.ddns.net/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/klassnenkiy.ddns.net/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = klassnenkiy.ddns.net) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name 158.160.28.33 klassnenkiy.ddns.net;
return 404; # managed by Certbot
}
server {
if ($host = klassnenkiy.ddns.net) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name 158.160.28.33 klassnenkiy.ddns.net;
return 404; # managed by Certbot
}
On your remote server in the root directory of the project you should also place the docker-compose.production.yml
:
version: '3'
volumes:
pg_data_production:
static_volume:
services:
db:
image: postgres:13.10
env_file: .env
volumes:
- pg_data_production:/var/lib/postgresql/data
backend:
image: tyulyagin/taski_backend # Docker Hub username / username on Docker image
env_file: .env
volumes:
- static_volume:/backend_static
frontend:
image: tyulyagin/taski_frontend # Download from Docker Hub
env_file: .env
command: cp -r /app/build/. /frontend_static/
volumes:
- static_volume:/frontend_static
gateway:
image: tyulyagin/taski_gateway # Download from с Docker Hub
env_file: .env
volumes:
- static_volume:/staticfiles/
ports:
- 8000:80