ProHoster > Blog > yönetim > Flask+Angular projesi için Github Eylemlerinde CI/CD
Flask+Angular projesi için Github Eylemlerinde CI/CD
Bu yazımda Plesk Control Panel ve Github Actions kullanarak CI/CD kurma deneyimimi paylaşacağım. Bugün karmaşık olmayan adı "Helloworld" olan basit bir projeyi nasıl konuşlandıracağımızı öğreneceğiz. Flask Python çerçevesinde, Celery çalışanları ve bir Angular 8 ön ucu ile yazılmıştır.
Yazımızın ilk bölümünde projemize ve bölümlerine bakacağız. İkincisinde Plesk'i nasıl kuracağımızı ve gerekli uzantıları ve bileşenleri (DB, RabbitMQ, Redis, Docker vb.) kurmayı öğreneceğiz.
Üçüncü bölümde, projemizi dev ve prod ortamındaki bir sunucuya dağıtmak için bir boru hattını nasıl kuracağımızı nihayet anlayacağız. Ardından siteyi sunucuda başlatacağız.
Ve evet, kendimi tanıtmayı unuttum. Benim adım Oleg Borzov, Domclick'te ipotek yöneticileri için CRM ekibinde eksiksiz bir geliştiriciyim.
proje Genel bakış
İlk olarak, iki proje deposuna - arka uç ve ön - bakalım ve kodun üzerinden geçelim.
Arka uç: Şişe + Kereviz
Arka kısım için, Python geliştiricileri arasında oldukça popüler olan bir demet aldım: Flask çerçevesi (API için) ve Kereviz (görev kuyruğu için). ORM olarak SQLAchemy kullanılmaktadır. Alembik, göçler için kullanılır. Tanıtıcılarda JSON doğrulaması için - Marshmallow.
В depolar yapının ayrıntılı bir açıklamasını ve projeyi çalıştırmak için talimatları içeren bir Readme.md dosyası vardır.
ön ile depo Beck'inkinden çok daha basit. ön üç sayfadan oluşur:
E-posta göndermek için bir form ve bir çıkış düğmesi içeren ana sayfa.
Giriş sayfası.
Kayıt sayfası.
Ana sayfa münzevi görünüyor:
Kökte iki dosya var Dockerfile и docker-compose.yml, tanıdık klasörün yanı sıra .ci-cd arka depodakinden biraz daha az komut dosyasıyla (testleri çalıştırmak için kaldırılan komut dosyaları).
Plesk'te bir proje başlatmak
Plesk'i kurarak ve sitemiz için bir abonelik oluşturarak başlayalım.
Uzantıları yükleme
Plesk'te dört uzantıya ihtiyacımız var:
Docker Plesk admin panelinde container'ların durumunu yönetmek ve görsel olarak görüntülemek için;
Let's Encrypt ücretsiz TLS sertifikaları oluşturmak (ve otomatik olarak yenilemek);
Firewall gelen trafiğin filtrelenmesini yapılandırmak için.
Bunları Plesk yönetici panelinin Uzantılar bölümünden kurabilirsiniz:
Uzantıların ayrıntılı ayarlarını dikkate almayacağız, demo amaçlarımız için varsayılan ayarlar yeterli olacaktır.
Bir abonelik ve site oluşturun
Ardından, helloworld.ru web sitemiz için bir abonelik oluşturmamız ve buraya dev.helloworld.ru alt alan adını eklememiz gerekiyor.
Helloworld.ru etki alanı için bir abonelik oluşturun ve sistem kullanıcısı için oturum açma parolasını belirtin:
Sayfanın altındaki kutuyu işaretleyin Let's Encrypt ile alan adının güvenliğini sağlayınsite için HTTPS kurmak istiyorsak:
Ardından, bu abonelikte bir dev.helloworld.ru alt etki alanı oluşturun (bunun için ücretsiz bir TLS sertifikası da verebilirsiniz):
Sunucu Bileşenlerini Yükleme
ile bir sunucumuz var. İşletim Sistemi Debian Uzatma 9.12 ve yüklü kontrol paneli Plesk Obsidyen 18.0.27.
Projemiz için kurmamız ve yapılandırmamız gerekiyor:
PostgreSQL (bizim durumumuzda dev ve prod ortamları için iki veritabanına sahip bir sunucu olacaktır).
RabbitMQ (ortamlar için farklı sankonlarla aynı, aynı örnek).
İki Redis örneği (geliştirme ve üretim ortamları için).
Docker Kayıt Defteri (yerleşik Docker görüntülerinin yerel olarak depolanması için).
Docker kayıt defteri için kullanıcı arabirimi.
PostgreSQL
Plesk zaten PostgreSQL DBMS ile geliyor, ancak en son sürümle gelmiyor (Plesk Obsidian'ı yazarken поддерживал Postgres sürümleri 8.4–10.8). Uygulamamız için en son sürümü istiyoruz (bu yazının yazıldığı sırada 12.3), bu yüzden onu manuel olarak kuracağız.
İnternette Postgres'i Debian'a kurmak için birçok ayrıntılı talimat var (örnek), bu yüzden onları ayrıntılı olarak açıklamayacağım, sadece komutları vereceğim:
PostgreSQL'in oldukça vasat varsayılan ayarlara sahip olduğu düşünüldüğünde, yapılandırmayı düzeltmek gerekir. Bu bize yardımcı olacak hesap makinesi: sunucunuzun parametrelerinde sürmeniz ve dosyadaki ayarları değiştirmeniz gerekir /etc/postgresql/12/main/postgresql.confsunulanlara. Burada, bu tür hesap makinelerinin sihirli bir değnek olmadığına ve donanım, uygulama ve sorgu karmaşıklığına bağlı olarak tabanın daha hassas bir şekilde ayarlanması gerektiğine dikkat edilmelidir. Ama bu başlamak için yeterli.
Hesap makinesi tarafından önerilen ayarlara ek olarak, postgresql.confvarsayılan bağlantı noktası 5432'den diğerine (bizim örneğimizde - 53983).
Yapılandırma dosyasını değiştirdikten sonra, postgresql-server'ı şu komutla yeniden başlatın:
service postgresql restart
PostgreSQL'i kurduk ve yapılandırdık. Şimdi dev- ve prod-ortamları için bir veritabanı oluşturalım ve kullanıcılara veritabanını yönetme hakları verelim:
$ su - postgres
postgres:~$ create database hw_dev_db_name;
CREATE DATABASE
postgres:~$ create user hw_dev_db_user with password 'hw_dev_db_password';
CREATE ROLE
postgres:~$ grant ALL privileges ON database hw_dev_db_name to hw_dev_db_user;
GRANT
postgres:~$ create database hw_prod_db_name;
CREATE DATABASE
postgres:~$ create user hw_prod_db_user with password 'hw_prod_db_password';
CREATE ROLE
postgres:~$ grant ALL privileges ON database hw_prod_db_name to hw_prod_db_user;
GRANT
RabbitMQ
Şimdi Celery için bir mesaj aracısı olan RabbitMQ'nun kurulumuna geçelim. Debian'a yüklemek oldukça basittir:
Şimdi uygulamamızın son bileşeni olan Redis'i yükleyip yapılandıralım. Kereviz görevlerinin sonuçlarını depolamak için bir arka uç olarak kullanılacaktır.
Uzantıyı kullanarak dev ve prod ortamları için Redis ile iki Docker kapsayıcısı oluşturacağız Docker Plesk için.
Plesk'e gidiyoruz, Uzantılar bölümüne gidiyoruz, Docker uzantısını arıyoruz ve kuruyoruz (ücretsiz bir sürüme ihtiyacımız var):
Yüklü uzantıya gidin, görseli arama yoluyla bulun redis bitnami ve en son sürümü yükleyin:
İndirilen kaba giriyoruz ve yapılandırmayı ayarlıyoruz: bağlantı noktasını, ayrılan maksimum RAM boyutunu, ortam değişkenlerinde parolayı belirtin ve birimi bağlayın:
Üretim kabı için 2-3 adımlarını gerçekleştiriyoruz, ayarlarda yalnızca parametreleri değiştiriyoruz: bağlantı noktası, şifre, RAM boyutu ve sunucudaki birim klasörüne giden yol:
Docker Kayıt Defteri
Temel hizmetlere ek olarak, kendi Docker görüntü deponuzu sunucuya koymak güzel olurdu. Neyse ki, sunucu alanı artık oldukça ucuz (kesinlikle bir DockerHub aboneliğinden daha ucuz) ve özel bir havuz kurma süreci çok basit.
Aboneliğimizde Plesk'te iki alt alan oluşturalım: docker.helloworld.ru ve docker-ui.helloworld.ru ve bunlar için Let's Encrypt sertifikalarını yapılandıralım.
Dosyayı docker.helloworld.ru alt etki alanı klasörüne ekleyin docker-compose.yml bunun gibi içerikle:
Ve Nginx'i kapsayıcılarımıza yönlendirmemiz gerekiyor. Bu, Plesk aracılığıyla yapılabilir.
docker.helloworld.ru ve docker-ui.helloworld.ru alt alan adları için aşağıdaki adımların gerçekleştirilmesi gerekir:
Bölümünde Geliştirme Araçları sitemize git Docker Proxy Kuralları:
Ve gelen trafiği kapsayıcımıza yönlendirmek için bir kural ekleyin:
Yerel makineden kapsayıcımıza giriş yapıp yapamayacağımızı kontrol ediyoruz:
$ docker login docker.helloworld.ru -u hw_docker_admin -p hw_docker_password
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Login Succeeded
Docker-ui.helloworld.ru alt alan adının işleyişini de kontrol edelim:
Depolara göz at'a tıkladığınızda, tarayıcı, havuz için kullanıcı adını ve parolayı girmeniz gereken bir yetkilendirme penceresi görüntüler. Bundan sonra, depo listesinin bulunduğu bir sayfaya aktarılacağız (şimdilik sizin için boş olacak):
Plesk Firewall'da port açma
Bileşenleri kurduktan ve yapılandırdıktan sonra, bileşenlere Docker kapsayıcılarından ve harici ağdan erişilebilmesi için portları açmamız gerekiyor.
Daha önce kurduğumuz Plesk için Güvenlik Duvarı uzantısını kullanarak bunu nasıl yapacağımızı görelim.
Biz geçmek Araçlar ve Ayarlar > Ayarlar > Güvenlik Duvarı:
Biz geçmek Plesk Güvenlik Duvarı Kurallarını Değiştir > Özel Kural Ekle ve Docker alt ağı için aşağıdaki TCP bağlantı noktalarını açın (172.0.0.0 / 8):
TavşanMQ: 1883, 4369, 5671-5672, 25672, 61613-61614
Redis: 32785, 32786
Ayrıca PostgreSQL portlarını ve RabbitMQ yönetim panellerini dış dünyaya açacak bir kural ekleyeceğiz:
Değişiklikleri Uygula düğmesini kullanarak kuralları uygulayın:
Github Eylemlerinde CI/CD kurulumu
En ilginç kısma geçelim - sürekli bir entegrasyon hattı kurmak ve projemizi sunucuya teslim etmek.
Bu boru hattı iki bölümden oluşacaktır:
Github tarafında bir görüntü oluşturmak ve testleri çalıştırmak (arka uç için);
sunucuda geçişleri çalıştırma (arka uç için) ve kapsayıcıları dağıtma.
Plesk'e dağıtın
Önce ikinci noktayı ele alalım (çünkü birincisi buna bağlıdır).
Dağıtım sürecini Plesk için Git uzantısını kullanarak yapılandıracağız.
Bir Arka Uç deposu için Prod ortamına sahip bir örneği ele alalım.
Helloworld web sitemizin aboneliğine gidiyoruz ve Git alt bölümüne gidiyoruz:
"Uzak Git deposu" alanına Github havuzumuza bir bağlantı ekleyin ve varsayılan klasörü değiştirin httpdocs diğerine (örn. /httpdocs/hw_back):
SSH Ortak anahtarını önceki adımdan kopyalayın ve ekleme Github ayarlarında.
2. adımdaki ekranda Tamam'ı tıklayın, ardından Plesk'teki depo sayfasına yönlendirileceğiz. Şimdi ana şubeye yapılan taahhütlerde güncellenecek depoyu yapılandırmamız gerekiyor. Bunu yapmak için şuraya gidin: Depo Ayarları ve değeri kaydedin Webhook URL (Github Actions'ı ayarlarken daha sonra ihtiyacımız olacak):
Önceki paragraftaki ekrandaki Eylemler alanına, dağıtımı başlatmak için komut dosyasını girin:
cd {REPOSITORY_ABSOLUTE_PATH}
.ci-cd/deploy.sh {ENV} {DOCKER_REGISTRY_HOST} {DOCKER_USER} {DOCKER_PASSWORD} {TG_BOT_TOKEN} {TG_CHAT_ID}
burada:
{REPOSITORY_ABSOLUTE_PATH} - sunucudaki arka uç deposunun prod klasörünün yolu; {ENV} - çevre (dev / prod), bizim durumumuzda prod; {DOCKER_REGISTRY_HOST} - liman işçisi depomuzun ana bilgisayarı {TG_BOT_TOKEN} — Telegram bot belirteci; {TG_CHAT_ID} — Bildirim göndermek için sohbetin/kanalın kimliği.
Örnek komut dosyası:
cd /var/www/vhosts/helloworld.ru/httpdocs/hw_back/
.ci-cd/deploy.sh dev docker.helloworld.ru docker_user docker_password 12345678:AAbcdEfghCH1vGbCasdfSAs0K5PALDsaw -1001234567890
Docker grubuna aboneliğimizden bir kullanıcı ekleyin (böylece kapsayıcıları yönetebilirler):
sudo usermod -aG docker helloworld_admin
Arka uç deposu ve ön uç için geliştirme ortamı aynı şekilde kurulur.
Github Eylemlerinde dağıtım boru hattı
Github Actions'ta CI/CD işlem hattımızın ilk bölümünü kurmaya geçelim.
DEPLOY_HOST — Plesk yönetici panelinin mevcut olduğu ana bilgisayar (örnek: merhabaworld.com: 8443 veya 123.4.56.78:8443);
DEPLOY_BACK_PROD_TOKEN - sunucudaki ürün deposuna dağıtım için bir belirteç (bunu Plesk'te Dağıtım s. 4'te aldık);
DEPLOY_BACK_DEV_TOKEN - sunucudaki dev deposuna dağıtım için belirteç.
Dağıtım süreci basittir ve üç ana adımdan oluşur:
görüntüyü havuzumuzda oluşturmak ve yayınlamak;
yeni oluşturulmuş bir görüntüyü temel alan bir kapsayıcıda testler çalıştırma;
dala (dev/master) bağlı olarak istenen ortama dağıtım.
Frontend
Ön havuz için konuşlandırma.yml dosyası Beck'inkinden biraz farklı. Test çalıştırma adımından yoksundur ve konuşlandırma için belirteçlerin adlarını değiştirir. Bu arada, ön deponun sırlarının ayrıca doldurulması gerekiyor.
Site kurulumu
Nginx aracılığıyla proxy trafiği
Eh, sona geldik. Geriye yalnızca Nginx aracılığıyla kapsayıcımıza gelen ve giden trafiğin proxy'sini yapılandırmak kalır. Docker Registry kurulumunun 5. adımında bu süreci zaten ele aldık. Dev ve prod ortamlarında arka ve ön kısımlar için aynısı tekrarlanmalıdır.
Ayarların ekran görüntülerini vereceğim.
Backend
Frontend
Önemli açıklama. İle başlayanların dışındaki tüm URL'ler, ön uç kapsayıcısına vekil olarak atanır. /api/ - arka kapsayıcıya vekalet edilecekler (böylece arka kapsayıcıda, tüm işleyiciler şununla başlamalıdır: /api/).
sonuçlar
Artık sitemiz helloworld.ru ve dev.helloworld.ru adreslerinde mevcut olmalıdır (sırasıyla prod- ve dev-environments).
Toplamda, Flask ve Angular'da basit bir uygulamanın nasıl hazırlanacağını ve bunu Plesk çalıştıran bir sunucuya dağıtmak için Github Actions'ta bir ardışık düzen kurmayı öğrendik.