Emmy  Monahan

Emmy Monahan

1660165140

How to Deploy A Django Application To DigitalOcean's App Platform

DigitalOcean's App Platform is a Platform-as-a-Service (PaaS) offering, which (much like Heroku) allows you to deploy an application from a git repository. This article looks at how to deploy a Django application to DigitalOcean's App Platform.

Source: https://testdriven.io

#django #digitalocean 

How to Deploy A Django Application To DigitalOcean's App Platform
Duyen Hoang

Duyen Hoang

1660161480

Cách Triển Khai ứng Dụng Django Cho Nền Tảng Ứng Dụng Của DigitalOcean

Nền tảng ứng dụng của DigitalOcean là dịch vụ cung cấp Nền tảng như một dịch vụ (PaaS), (giống như Heroku) cho phép bạn triển khai ứng dụng từ kho lưu trữ git.

Bài viết này xem xét cách triển khai ứng dụng Django cho Nền tảng ứng dụng của DigitalOcean.

Tại sao sử dụng Nền tảng ứng dụng của DigitalOcean?

Mục tiêu của Nền tảng ứng dụng của DigitalOcean là đơn giản hóa việc triển khai để bạn có thể tập trung vào phát triển ứng dụng thay vì quản lý cơ sở hạ tầng. Nó hoàn hảo cho ứng dụng Django hàng ngày, chạy hàng ngày của bạn với Postgres (hoặc MySQL) để bền bỉ và Redis cho nhà môi giới tin nhắn Celery của bạn. Điều đó nói rằng, nếu ứng dụng của bạn yêu cầu bạn có quyền truy cập vào cơ sở hạ tầng bên dưới, có thể bạn sẽ muốn tránh xa Nền tảng ứng dụng và sử dụng giải pháp Cơ sở hạ tầng như một dịch vụ (IaaS) như DigitalOcean Droplet để thay thế.

Tích cực:

  1. Triển khai bất biến
  2. Không có thời gian chết triển khai
  3. Được xây dựng trong triển khai liên tục
  4. Cloudflare CDN theo mặc định
  5. Chia tỷ lệ dọc và ngang (chưa có quy mô tự động )
  6. Hỗ trợ Docker

Phủ định:

  1. Tài liệu cần hoạt động (nó đã trở nên tốt hơn rất nhiều kể từ khi bài viết này được xuất bản ban đầu)
  2. So với Heroku, nó có ít tiện ích mở rộng (như dịch vụ ghi nhật ký và giám sát)

Đúng, nó đắt hơn giải pháp IaaS, nhưng nếu ứng dụng của bạn không có các yêu cầu cơ sở hạ tầng phức tạp thì bạn sẽ tiết kiệm thời gian và tiền bạc vì bạn sẽ không cần thuê một kỹ sư hoạt động.

Thiết lập dự án

Chúng tôi sẽ triển khai một ứng dụng Django cơ bản. Nếu bạn muốn làm theo, bạn có thể sử dụng ứng dụng demo được tạo trước hoặc ứng dụng của riêng bạn.

Ứng dụng Demo

Vui lòng sao chép ứng dụng demo từ chi nhánh v1 của đại diện digitalocean-app-platform-django :

$ git clone https://github.com/testdrivenio/digitalocean-app-platform-django --branch v1
$ cd digitalocean-app-platform-django
$ git checkout -b main

Đảm bảo tạo repo GitHub mới và đẩy mã lên nhánh chính.

Ứng dụng của bạn

Nếu bạn có ứng dụng Django của riêng mình mà bạn muốn triển khai, vì lợi ích đơn giản, hãy cập nhật cấu hình sau trong tệp settings.py của bạn :

SECRET_KEY = 'please-change-me'
DEBUG = True
ALLOWED_HOSTS = ['*']

Sau lần triển khai đầu tiên, chúng tôi sẽ xem xét cách thay đổi từng điều này để ứng dụng của bạn an toàn hơn.

Ngoài ra, hãy thêm cấu hình nội dung tĩnh sau:

STATIC_URL = '/static/'
STATIC_ROOT = Path(BASE_DIR).joinpath('staticfiles')
STATICFILES_DIRS = (Path(BASE_DIR).joinpath('static'),)

DigitalOcean

Hãy thiết lập DigitalOcean để làm việc với ứng dụng của chúng tôi.

Trước tiên, bạn cần đăng ký tài khoản DigitalOcean (nếu bạn chưa có). Tiếp theo, từ bảng điều khiển DigitalOcean , nhấp vào liên kết cho "Ứng dụng" trong thanh bên, nhấp vào "Tạo ứng dụng, sau đó liên kết tài khoản GitHub của bạn. so với tất cả các đại diện:

Cho phép GitHub

Sau khi hoàn tất, hãy chọn repo, kiểm tra "Autodeploy" để triển khai liên tục và nhấp vào "Next":

Chọn GitHub Repo

Trên trang cấu hình ứng dụng, DigitalOcean hẳn đã phát hiện ra rằng ứng dụng dựa trên Python (dựa trên sự hiện diện của tệp tin request.txt ).

Về cơ bản, DigitalOcean sử dụng Cloud Native Buildpacks để chạy ứng dụng của bạn.

Thay đổi lệnh chạy thành gunicorn hello_django.wsgi:application --bind 0.0.0.0:8080 --worker-tmp-dir /dev/shmvà nhấp vào "Tiếp theo":

Định cấu hình ứng dụng

Đặt tên cho ứng dụng của bạn và chọn khu vực. Vui lòng gắn bó với các giá trị mặc định - tên repo và New York, tương ứng.

Nhấn tiếp".

Tên và khu vực

Bám sát kế hoạch "Cơ bản" và khởi chạy ứng dụng.

Trên màn hình tiếp theo, nhấp vào nút "Chuyển đến Bản ghi tạo" để xem nhật ký triển khai trực tiếp:

Nhật ký triển khai

Sẽ mất vài phút để xây dựng và triển khai. Sau khi hoàn tất, hãy nhấp vào liên kết "Ứng dụng trực tiếp" trong thông báo giật gân để mở ứng dụng đang chạy của bạn trong tab trình duyệt mới:

Hoàn tất triển khai

Bạn nên thấy:

{
  "hello": "world!"
}

Cơ sở dữ liệu

Tiếp theo, thay vì sử dụng SQLite, hãy cấu hình Postgres.

Từ trang tổng quan của ứng dụng, nhấp vào menu thả xuống "Tác vụ" và chọn "Tạo / Đính kèm cơ sở dữ liệu". Gắn bó với "Cơ sở dữ liệu Dev" mặc định có tên "db". Nhấp vào "Tạo và Đính kèm".

Điều này sẽ tự động định cấu hình một DATABASE_URLbiến môi trường và triển khai lại ứng dụng. Quá trình này sẽ mất khoảng mười phút vì cơ sở dữ liệu cần được cấu hình. Sau khi triển khai xong, bạn có thể xem biến môi trường từ bảng điều khiển của mình:

Thêm cơ sở dữ liệu

Thêm biến sau vào tệp cài đặt để đọc biến môi trường:

DATABASE_URL = os.getenv('DATABASE_URL', None)

Tiếp theo, cập nhật cấu hình cơ sở dữ liệu như vậy để sử dụng DATABASE_URLnếu nó tồn tại và cấu hình Postgres:

if not DATABASE_URL:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': BASE_DIR / 'db.sqlite3',
        }
    }
else:
    db_info = urlparse(DATABASE_URL)
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': 'db',
            'USER': db_info.username,
            'PASSWORD': db_info.password,
            'HOST': db_info.hostname,
            'PORT': db_info.port,
            'OPTIONS': {'sslmode': 'require'},
        }
    }

Thêm các mục nhập thích hợp lên đầu:

import os
from urllib.parse import urlparse

Thêm psycopg2 vào các yêu cầu:

psycopg2-binary==2.9.3

Đảm bảo rằng nó hoạt động cục bộ. Cam kết và đẩy mã của bạn lên GitHub để kích hoạt một triển khai mới.

Cuối cùng, sau khi quá trình triển khai hoàn tất, hãy quay lại "Bảng điều khiển" để áp dụng di chuyển của bạn (qua python manage.py migrate) và tạo một siêu người dùng (qua python manage.py createsuperuser):

Áp dụng di chuyển và tạo siêu người dùng

Bạn cũng có thể xác minh rằng cấu hình Postgres đang được sử dụng:

Xác minh Postgres

$ python manage.py shell

>>> from django.conf import settings
>>> settings.DATABASES

Các biến môi trường

Tiếp tục, hãy làm cứng ứng dụng một chút bằng cách định cấu hình các cài đặt sau thông qua các biến môi trường:

  1. SECRET_KEY
  2. DEBUG
  3. ALLOWED_HOSTS

Cập nhật các biến sau trong settings.py :

SECRET_KEY = os.getenv('SECRET_KEY', 'please-change-me')
DEBUG = os.getenv('DEBUG', 'False') == 'True'
ALLOWED_HOSTS = os.getenv('ALLOWED_HOSTS', '127.0.0.1,localhost').split(',')

Cam kết lại mã của bạn và đẩy nó lên GitHub để kích hoạt một triển khai mới khác.

Sau khi triển khai hoàn tất, hãy nhấp vào menu thả xuống "Tác vụ" và sau đó nhấp vào "Quản lý Env Vars". Sau đó, thêm các biến sau vào phần "Biến môi trường cấp ứng dụng":

  1. SECRET_KEY - 52@y%9$#3#)9cff)jdcl&0-@4(u!y)dw@l2!e2s8!(jrrta_u+
  2. DEBUG-False
  3. ALLOWED_HOSTS-digitalocean-app-platform-django-3bmno.ondigitalocean.app

Đảm bảo tạo khóa bí mật mới và thay thế digitalocean-app-platform-django-3bmno.ondigitalocean.appbằng miền của bạn.

Thêm các biến môi trường

Sau khi cập nhật, ứng dụng sẽ tự động triển khai lại.

Tệp tĩnh

Chúng tôi sẽ sử dụng WhiteNoise để quản lý nội dung tĩnh.

Thêm nó vào tệp tin request.txt :

whitenoise==5.3.0

Cập nhật MIDDLEWAREdanh sách trong settings.py :

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware',  # new
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

Sau đó, để kích hoạt tính năng nén và hỗ trợ bộ nhớ đệm, hãy thêm:

STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

Làm. Đẩy lên GitHub. Sau khi triển khai hoàn tất, hãy đảm bảo nội dung tĩnh hoạt động trên trang quản trị.

Rau cần tây

Mặc dù chúng tôi sẽ không giới thiệu cách thiết lập Celery trong bài đăng này, DigitalOcean giúp bạn dễ dàng định cấu hình Redis , sau đó có thể được sử dụng làm môi giới tin nhắn và phụ trợ kết quả của bạn. Sau đó, bạn có thể thiết lập Celery worker như một thành phần "Worker" thông qua "Actions" -> "Create Resources":

Thành phần công nhân

Quy trình phát triển

Khi bật tính năng tự động triển khai, bất kỳ lúc nào các thay đổi đối với nhánh chính được thêm vào kiểm soát nguồn trên GitHub, ứng dụng sẽ tự động triển khai lại. Với chế độ zero-downtime được bật theo mặc định, người dùng cuối sẽ không gặp phải bất kỳ thời gian chết nào khi quá trình đăng lại xảy ra.

Tốt nhất là sử dụng một số hương vị của quy trình làm việc nhánh tính năng để bạn có thể đăng ký mã vào GitHub trên một nhánh khác với nhánh chính để bạn có thể kiểm tra ứng dụng của mình trước khi các thay đổi có hiệu lực.

Thí dụ:

  1. Tạo một chi nhánh mới
  2. Thực hiện các thay đổi đối với mã
  3. Cam kết và đẩy mã của bạn lên GitHub để kích hoạt xây dựng CI thông qua GitHub Actions
  4. Mở PR cho chi nhánh chính
  5. Hợp nhất khi quá trình xây dựng CI hoàn tất để cập nhật quá trình sản xuất

Sự kết luận

Bài đăng này đã xem nhanh cách chạy ứng dụng Django trên Nền tảng ứng dụng của DigitalOcean.

Nói chung, App Platform là một giải pháp PaaS mạnh mẽ mà bạn chắc chắn nên đánh giá cho các ứng dụng Django của mình cùng với các giải pháp khác như:

  1. Heroku
  2. PythonAnywhere
  3. AWS Elastic Beanstalk
  4. Công cụ ứng dụng của Google
  5. Kết xuất

Nhược điểm lớn ở thời điểm này đối với App Platform là nó thiếu một số tính năng và tiện ích mở rộng mà một số giải pháp PaaS khác cung cấp. Điều đó nói rằng, theo bài đăng này có một số tính năng mới trong công việc như công việc đã lên lịch, xem trước triển khai, tích hợp VPC và khôi phục triển khai.

Nếu bạn quyết định sử dụng Nền tảng ứng dụng, hãy đảm bảo:

  1. Xem lại cách tận dụng tỷ lệ theo chiều dọc và chiều ngang
  2. Định cấu hình kiểm tra tình trạng dựa trên HTTP
  3. Thiết lập Cơ sở dữ liệu được quản lý cấp sản xuất cũng như Redis

Đảm bảo xóa ứng dụng Django của bạn cùng với cơ sở dữ liệu để bạn không phải chịu bất kỳ khoản phí bổ sung nào.

Bạn có thể tìm thấy mã cuối cùng trong repo digitalocean-app-platform-django .

Nguồn:  https://testdriven.io

#django #digitalocean 

Cách Triển Khai ứng Dụng Django Cho Nền Tảng Ứng Dụng Của DigitalOcean

Как развернуть приложение Django на платформе приложений DigitalOcean

Платформа приложений DigitalOcean — это предложение «Платформа как услуга» (PaaS), которое (как и Heroku) позволяет вам развертывать приложение из репозитория git.

В этой статье рассматривается, как развернуть приложение Django на платформе приложений DigitalOcean.

Зачем использовать платформу приложений DigitalOcean?

Цель платформы приложений DigitalOcean — упростить развертывание, чтобы вы могли сосредоточиться на разработке приложений, а не на управлении инфраструктурой. Он идеально подходит для вашего повседневного заурядного приложения Django с Postgres (или MySQL) для сохраняемости и Redis для вашего брокера сообщений Celery. Тем не менее, если ваше приложение требует от вас доступа к базовой инфраструктуре, вы, вероятно, захотите отказаться от платформы приложений и вместо этого использовать решение «инфраструктура как услуга» (IaaS), такое как дроплет DigitalOcean .

Положительные стороны:

  1. Неизменяемые развертывания
  2. Развертывание с нулевым временем простоя
  3. Встроенная система непрерывного развертывания
  4. Cloudflare CDN по умолчанию
  5. Вертикальное и горизонтальное масштабирование (автоматического масштабирования пока нет )
  6. Поддерживает Докер

Минусы:

  1. Над документацией нужно поработать (она стала намного лучше с тех пор, как эта статья была первоначально опубликована)
  2. По сравнению с Heroku, у него мало расширений (таких как службы ведения журналов и мониторинга).

Да, это дороже, чем решение IaaS, но если ваше приложение не предъявляет сложных требований к инфраструктуре, вы сэкономите время и деньги, поскольку вам не нужно будет нанимать инженера по эксплуатации.

Настройка проекта

Мы будем развертывать базовое приложение Django. Если вы хотите продолжить, вы можете использовать либо предварительно созданное демонстрационное приложение, либо собственное приложение.

Демонстрационное приложение

Не стесняйтесь клонировать демонстрационное приложение из ветки v1 репозитория digitalocean-app-platform-django :

$ git clone https://github.com/testdrivenio/digitalocean-app-platform-django --branch v1
$ cd digitalocean-app-platform-django
$ git checkout -b main

Обязательно создайте новый репозиторий GitHub и отправьте код в основную ветку.

Ваше приложение

Если у вас есть собственное приложение Django, которое вы хотите развернуть, для простоты обновите следующую конфигурацию в файле settings.py :

SECRET_KEY = 'please-change-me'
DEBUG = True
ALLOWED_HOSTS = ['*']

После первоначального развертывания мы рассмотрим, как изменить каждый из них, чтобы ваше приложение стало более безопасным.

Кроме того, добавьте следующую конфигурацию статического актива:

STATIC_URL = '/static/'
STATIC_ROOT = Path(BASE_DIR).joinpath('staticfiles')
STATICFILES_DIRS = (Path(BASE_DIR).joinpath('static'),)

DigitalOcean

Давайте настроим DigitalOcean для работы с нашим приложением.

Во-первых, вам нужно зарегистрировать учетную запись DigitalOcean (если у вас ее еще нет). Затем на панели инструментов DigitalOcean нажмите ссылку «Приложения» на боковой панели, нажмите «Создать приложение», а затем свяжите свою учетную запись GitHub. Вероятно, вы захотите предоставить доступ только к одному репо, созданному ранее в этой статье, а не чем для всех репозиториев:

Авторизовать GitHub

После этого выберите репозиторий, установите флажок «Авторазвертывание» для непрерывного развертывания и нажмите «Далее»:

Выберите репозиторий GitHub

На странице конфигурации приложения DigitalOcean уже должен был определить, что приложение основано на Python (на основании наличия файла requirements.txt ).

Под капотом DigitalOcean использует Cloud Native Buildpacks для запуска вашего приложения.

Измените команду запуска на gunicorn hello_django.wsgi:application --bind 0.0.0.0:8080 --worker-tmp-dir /dev/shmи нажмите «Далее»:

Настроить приложение

Дайте вашему приложению имя и выберите регион. Не стесняйтесь придерживаться значений по умолчанию — имя репо и Нью-Йорк соответственно.

Нажмите "Далее".

Название и регион

Придерживайтесь плана «Базовый» и запустите приложение.

На следующем экране нажмите кнопку «Перейти к журналам сборки», чтобы просмотреть журналы динамического развертывания:

Журналы развертывания

Сборка и развертывание должны занять несколько минут. После завершения щелкните ссылку «Live App» во всплывающем сообщении, чтобы открыть запущенное приложение в новой вкладке браузера:

Развертывание завершено

Тебе следует увидеть:

{
  "hello": "world!"
}

База данных

Далее, вместо использования SQLite, давайте настроим Postgres.

На панели инструментов вашего приложения щелкните раскрывающийся список «Действия» и выберите «Создать/присоединить базу данных». Придерживайтесь стандартной «базы данных разработчиков» с именем «db». Нажмите «Создать и прикрепить».

Это автоматически настроит DATABASE_URLпеременную среды и повторно развернет приложение. Это займет около десяти минут, так как необходимо настроить базу данных. После завершения развертывания вы можете просмотреть переменную среды в консоли:

Добавить базу данных

Добавьте следующую переменную в файл настроек, чтобы прочитать переменную среды:

DATABASE_URL = os.getenv('DATABASE_URL', None)

Затем обновите конфигурацию базы данных, чтобы использовать ее, DATABASE_URLесли она существует, и настройте Postgres:

if not DATABASE_URL:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': BASE_DIR / 'db.sqlite3',
        }
    }
else:
    db_info = urlparse(DATABASE_URL)
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': 'db',
            'USER': db_info.username,
            'PASSWORD': db_info.password,
            'HOST': db_info.hostname,
            'PORT': db_info.port,
            'OPTIONS': {'sslmode': 'require'},
        }
    }

Добавьте соответствующий импорт вверху:

import os
from urllib.parse import urlparse

Добавьте psycopg2 в требования:

psycopg2-binary==2.9.3

Убедитесь, что он работает локально. Зафиксируйте и отправьте свой код на GitHub, чтобы запустить новое развертывание.

Наконец, после завершения развертывания вернитесь в «Консоль», чтобы применить ваши миграции (через python manage.py migrate) и создать суперпользователя (через python manage.py createsuperuser):

Применение миграции и создание суперпользователя

Вы также можете убедиться, что используется конфигурация Postgres:

Проверить Постгрес

$ python manage.py shell

>>> from django.conf import settings
>>> settings.DATABASES

Переменные среды

Двигаясь дальше, давайте немного укрепим приложение, настроив следующие параметры с помощью переменных среды:

  1. SECRET_KEY
  2. DEBUG
  3. ALLOWED_HOSTS

Обновите следующие переменные в settings.py :

SECRET_KEY = os.getenv('SECRET_KEY', 'please-change-me')
DEBUG = os.getenv('DEBUG', 'False') == 'True'
ALLOWED_HOSTS = os.getenv('ALLOWED_HOSTS', '127.0.0.1,localhost').split(',')

Снова зафиксируйте свой код и отправьте его на GitHub, чтобы запустить еще одно новое развертывание.

После завершения развертывания щелкните раскрывающийся список «Действия», а затем нажмите «Управление Env Vars». Затем добавьте следующие переменные в раздел «Переменные среды уровня приложения»:

  1. SECRET_KEY-52@y%9$#3#)9cff)jdcl&0-@4(u!y)dw@l2!e2s8!(jrrta_u+
  2. DEBUG-False
  3. ALLOWED_HOSTS-digitalocean-app-platform-django-3bmno.ondigitalocean.app

Обязательно сгенерируйте новый секретный ключ и замените его digitalocean-app-platform-django-3bmno.ondigitalocean.appсвоим доменом.

Добавьте переменные среды

После обновления приложение будет автоматически повторно развернуто.

Статические файлы

Мы будем использовать WhiteNoise для управления статическими активами.

Добавьте его в файл requirements.txt :

whitenoise==5.3.0

Обновите MIDDLEWAREсписок в settings.py :

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware',  # new
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

Затем, чтобы включить поддержку сжатия и кэширования, добавьте:

STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

Совершить. Отправьте на GitHub. После завершения развертывания убедитесь, что статические ресурсы работают на странице администрирования.

Сельдерей

Хотя в этом посте мы не будем демонстрировать, как настроить Celery , DigitalOcean упрощает настройку Redis , который затем можно использовать в качестве брокера сообщений и серверной части результатов. Затем вы можете настроить работника Celery как компонент «Рабочий» через «Действия» -> «Создать ресурсы»:

Рабочий компонент

Рабочий процесс разработки

При включенном авторазвертывании каждый раз, когда изменения в основной ветке добавляются в систему управления версиями на GitHub, приложение будет повторно развертываться автоматически. Если по умолчанию включено нулевое время простоя, конечные пользователи не будут сталкиваться с простоями при повторном развертывании.

Лучше всего использовать какой -то вариант рабочего процесса с функциональной веткой , чтобы вы могли возвращать код в GitHub в другой ветке, отличной от основной, чтобы вы могли протестировать свое приложение до того, как изменения вступят в силу в рабочей среде.

Пример:

  1. Создать новую ветку
  2. Внесите изменения в код
  3. Зафиксируйте и отправьте свой код на GitHub, чтобы запустить сборку CI с помощью GitHub Actions .
  4. Откройте PR против основной ветки
  5. Слияние после завершения сборки CI для обновления производства

Вывод

В этом посте кратко рассматривается, как запустить приложение Django на платформе приложений DigitalOcean.

В целом App Platform — это мощное решение PaaS, которое вам обязательно стоит оценить для своих приложений Django вместе с другими решениями, такими как:

  1. Героку
  2. PythonAnywhere
  3. AWS Elastic Beanstalk
  4. Сервер приложений Google
  5. Оказывать

На данный момент основным недостатком App Platform является отсутствие некоторых функций и расширений, которые предоставляют некоторые другие решения PaaS. Тем не менее, согласно этому сообщению , в разработке находится ряд новых функций, таких как запланированные задания, предварительные версии развертывания, интеграция VPC и откаты развертывания.

Если вы решите использовать App Platform, убедитесь, что:

  1. Узнайте, как использовать вертикальное и горизонтальное масштабирование.
  2. Настройка проверки работоспособности на основе HTTP
  3. Настройте управляемую базу данных производственного уровня , а также Redis

Обязательно удалите свое приложение Django вместе с базой данных, чтобы не нести никаких дополнительных расходов.

Вы можете найти окончательный код в репозитории digitalocean-app-platform-django .

Источник:  https://testdriven.io

#django #digitalocean 

Как развернуть приложение Django на платформе приложений DigitalOcean

如何將 Django 應用程序部署到 DigitalOcean 的應用程序平台

DigitalOcean 的應用平台是一種平台即服務 (PaaS) 產品,它(很像 Heroku)允許您從 git 存儲庫部署應用程序。

本文著眼於如何將 Django 應用程序部署到 DigitalOcean 的應用平台。

為什麼使用 DigitalOcean 的應用平台?

DigitalOcean 的應用平台的目標是簡化部署,以便您可以專注於應用程序開發而不是管理基礎設施。它非常適合您日常使用的普通 Django 應用程序,使用 Postgres(或 MySQL)實現持久性,Redis 用於 Celery 消息代理。也就是說,如果您的應用程序確實需要您訪問底層基礎設施,您可能希望遠離應用程序平台,而使用像 DigitalOcean Droplet這樣的基礎設施即服務 (IaaS) 解決方案。

正面:

  1. 不可變部署
  2. 零停機部署
  3. 內置持續部署
  4. 默認情況下 Cloudflare CDN
  5. 垂直和水平縮放(還沒有自動縮放
  6. 支持碼頭工人

負面:

  1. 文檔需要工作(自從這篇文章最初發表以來,它變得更好了)
  2. 與 Heroku 相比,它的擴展很少(例如日誌記錄和監控服務)

是的,它比 IaaS 解決方案更昂貴,但如果您的應用程序沒有復雜的基礎架構要求,那麼您將節省時間和金錢,因為您不需要聘請運維工程師。

項目設置

我們將部署一個基本的 Django 應用程序。如果您想跟隨,您可以使用預先創建的演示應用程序或您自己的應用程序。

演示應用

隨意從digitalocean-app-platform-django 存儲庫的v1分支克隆演示應用程序:

$ git clone https://github.com/testdrivenio/digitalocean-app-platform-django --branch v1
$ cd digitalocean-app-platform-django
$ git checkout -b main

確保創建一個新的 GitHub 存儲庫並將代碼推送到主分支。

你的應用

如果您有自己想要部署的 Django 應用程序,為簡單起見,請在settings.py文件中更新以下配置:

SECRET_KEY = 'please-change-me'
DEBUG = True
ALLOWED_HOSTS = ['*']

在初始部署之後,我們將研究如何更改其中的每一項,以使您的應用更加安全。

此外,添加以下靜態資產配置:

STATIC_URL = '/static/'
STATIC_ROOT = Path(BASE_DIR).joinpath('staticfiles')
STATICFILES_DIRS = (Path(BASE_DIR).joinpath('static'),)

數字海洋

讓我們設置 DigitalOcean 以使用我們的應用程序。

首先,您需要註冊一個DigitalOcean帳戶(如果您還沒有)。接下來,從DigitalOcean 儀表板,單擊側欄中的“應用程序”鏈接,單擊“創建應用程序”,然後鏈接您的 GitHub 帳戶。您可能只想授予對本文前面創建的單個存儲庫的訪問權限,而不是比所有回購:

授權 GitHub

完成後,選擇 repo,選中“Autodeploy”以進行持續部署,然後單擊“Next”:

選擇 GitHub 存儲庫

在應用程序配置頁面上,DigitalOcean 應該已經檢測到該應用程序是基於 Python 的(基於requirements.txt文件的存在)。

在後台,DigitalOcean 使用Cloud Native Buildpacks來運行您的應用程序。

將運行命令更改為gunicorn hello_django.wsgi:application --bind 0.0.0.0:8080 --worker-tmp-dir /dev/shm並單擊“下一步”:

配置應用

為您的應用命名並選擇區域。請隨意使用默認值——分別為 repo 名稱和 New York。

點擊下一步”。

名稱和地區

堅持“基本”計劃並啟動應用程序。

在下一個屏幕上,單擊“Go to Build Logs”按鈕查看實時部署日誌:

部署日誌

構建和部署應該需要幾分鐘。完成後,單擊啟動消息中的“Live App”鏈接,在新的瀏覽器選項卡中打開正在運行的應用程序:

部署完成

你應該看到:

{
  "hello": "world!"
}

數據庫

接下來,讓我們配置 Postgres,而不是使用 SQLite。

在應用程序的儀表板中,單擊“操作”下拉菜單並選擇“創建/附加數據庫”。堅持使用名為“db”的默認“開發數據庫”。單擊“創建和附加”。

這將自動配置DATABASE_URL環境變量並重新部署應用程序。這大約需要十分鐘,因為需要配置數據庫。部署完成後,您可以從控制台查看環境變量:

添加數據庫

將以下變量添加到設置文件以讀取環境變量:

DATABASE_URL = os.getenv('DATABASE_URL', None)

接下來,像這樣更新數據庫配置以使用DATABASE_URLif 它存在並配置 Postgres:

if not DATABASE_URL:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': BASE_DIR / 'db.sqlite3',
        }
    }
else:
    db_info = urlparse(DATABASE_URL)
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': 'db',
            'USER': db_info.username,
            'PASSWORD': db_info.password,
            'HOST': db_info.hostname,
            'PORT': db_info.port,
            'OPTIONS': {'sslmode': 'require'},
        }
    }

將適當的導入添加到頂部:

import os
from urllib.parse import urlparse

將 psycopg2 添加到要求中:

psycopg2-binary==2.9.3

確保它在本地工作。提交代碼並將其推送到 GitHub 以觸發新的部署。

最後,部署完成後,跳回“控制台”以應用您的遷移(通過python manage.py migrate)並創建一個超級用戶(通過python manage.py createsuperuser):

應用遷移並創建超級用戶

您還可以驗證是否正在使用 Postgres 配置:

驗證 Postgres

$ python manage.py shell

>>> from django.conf import settings
>>> settings.DATABASES

環境變量

繼續,讓我們通過環境變量配置以下設置來強化應用程序:

  1. SECRET_KEY
  2. DEBUG
  3. ALLOWED_HOSTS

更新settings.py中的以下變量:

SECRET_KEY = os.getenv('SECRET_KEY', 'please-change-me')
DEBUG = os.getenv('DEBUG', 'False') == 'True'
ALLOWED_HOSTS = os.getenv('ALLOWED_HOSTS', '127.0.0.1,localhost').split(',')

再次提交您的代碼並將其推送到 GitHub 以觸發另一個新部署。

部署完成後,單擊“Actions”下拉菜單,然後單擊“Manage Env Vars”。然後,在“App-Level Environment Variables”部分添加以下變量:

  1. SECRET_KEY-52@y%9$#3#)9cff)jdcl&0-@4(u!y)dw@l2!e2s8!(jrrta_u+
  2. DEBUG-False
  3. ALLOWED_HOSTS-digitalocean-app-platform-django-3bmno.ondigitalocean.app

請務必生成新的密鑰並替換digitalocean-app-platform-django-3bmno.ondigitalocean.app為您的域。

添加環境變量

更新後,應用程序將自動重新部署。

靜態文件

我們將使用WhiteNoise來管理靜態資產。

將其添加到requirements.txt文件中:

whitenoise==5.3.0

更新settings.pyMIDDLEWARE中的列表:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware',  # new
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

然後,要啟用壓縮和緩存支持,請添加:

STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

犯罪。推送到 GitHub。部署完成後,確保靜態資產在管理頁面上正常工作。

芹菜

雖然我們不會在這篇文章中演示如何設置Celery,但 DigitalOcean 可以輕鬆配置Redis,然後可以將其用作消息代理和結果後端。然後,您可以通過“Actions”->“Create Resources”將 Celery worker 設置為“Worker”組件:

工人組件

開發工作流程

啟用自動部署後,只要將主分支的更改添加到 GitHub 上的源代碼控制,應用程序就會自動重新部署。默認情況下啟用零停機時間,最終用戶在重新部署時不會遇到任何停機時間。

最好使用一些功能分支工作流程,以便您可以在與主分支不同的分支上將代碼簽入 GitHub,以便您可以在更改投入生產之前測試您的應用程序。

例子:

  1. 創建一個新分支
  2. 更改代碼
  3. 提交代碼並將其推送到 GitHub 以通過GitHub Actions觸發 CI 構建
  4. 針對主分支打開 PR
  5. CI 構建完成後合併以更新生產

結論

這篇文章快速瀏覽瞭如何在 DigitalOcean 的應用平台上運行 Django 應用程序。

一般來說,App Platform 是一個強大的 PaaS 解決方案,您絕對應該為您的 Django 應用程序以及其他解決方案進行評估,例如:

  1. Heroku
  2. PythonAnywhere
  3. AWS Elastic Beanstalk
  4. 谷歌應用引擎
  5. 使成為

App Platform 在這一點上的主要缺點是它缺少一些其他 PaaS 解決方案提供的一些功能和擴展。也就是說,根據這篇文章,有許多新功能正在開發中,例如計劃作業、部署預覽、VPC 集成和部署回滾。

如果您決定使用 App Platform,請務必:

  1. 查看如何利用垂直和水平縮放
  2. 配置基於 HTTP 的健康檢查
  3. 設置生產級託管數據庫以及Redis

確保刪除您的 Django 應用程序以及數據庫,這樣您就不會產生任何額外費用。

您可以在digitalocean-app-platform-django 存儲庫中找到最終代碼。

來源:  https ://testdriven.io

#django #digitalocean 

如何將 Django 應用程序部署到 DigitalOcean 的應用程序平台
Eladio  Rau

Eladio Rau

1660138740

Exécuter Django Sur La Plate-forme D'applications De DigitalOcean

La plate-forme d' applications de DigitalOcean est une offre de plate-forme en tant que service (PaaS), qui (un peu comme Heroku) vous permet de déployer une application à partir d'un référentiel git.

Cet article explique comment déployer une application Django sur la plateforme d'applications de DigitalOcean.

Pourquoi utiliser la plateforme d'applications de DigitalOcean ?

L'objectif de la plate-forme d'applications de DigitalOcean est de simplifier le déploiement afin que vous puissiez vous concentrer sur le développement d'applications au lieu de gérer l'infrastructure. Il est parfait pour votre application Django quotidienne et courante avec Postgres (ou MySQL) pour la persistance et Redis pour votre courtier de messages Celery. Cela dit, si votre application nécessite que vous ayez accès à l'infrastructure sous-jacente, vous voudrez probablement vous éloigner de la plate-forme d'application et utiliser à la place une solution d'infrastructure en tant que service (IaaS) telle qu'une gouttelette DigitalOcean .

Points positifs :

  1. Déploiements immuables
  2. Déploiements sans temps d'arrêt
  3. Déploiement continu intégré
  4. CDN Cloudflare par défaut
  5. Mise à l'échelle verticale et horizontale (pas encore de mise à l'échelle automatique )
  6. Prend en charge Docker

Négatifs :

  1. La documentation a besoin de travail (elle s'est beaucoup améliorée depuis la publication initiale de cet article)
  2. Comparé à Heroku, il a peu d'extensions (comme les services de journalisation et de surveillance)

Oui, c'est plus cher qu'une solution IaaS, mais si votre application n'a pas d'exigences d'infrastructure complexes, vous économiserez du temps et de l'argent puisque vous n'aurez pas besoin d'embaucher un ingénieur opérationnel.

Configuration du projet

Nous allons déployer une application Django de base. Si vous souhaitez suivre, vous pouvez utiliser une application de démonstration pré-créée ou votre propre application.

Application de démonstration

N'hésitez pas à cloner l'application de démonstration à partir de la branche v1 du dépôt digitalocean-app-platform-django :

$ git clone https://github.com/testdrivenio/digitalocean-app-platform-django --branch v1
$ cd digitalocean-app-platform-django
$ git checkout -b main

Assurez-vous de créer un nouveau dépôt GitHub et poussez le code jusqu'à la branche principale.

Votre application

Si vous avez votre propre application Django que vous souhaitez déployer, par souci de simplicité, mettez à jour la configuration suivante dans votre fichier settings.py :

SECRET_KEY = 'please-change-me'
DEBUG = True
ALLOWED_HOSTS = ['*']

Après le déploiement initial, nous verrons comment modifier chacun d'entre eux afin que votre application soit plus sécurisée.

Ajoutez également la configuration d'élément statique suivante :

STATIC_URL = '/static/'
STATIC_ROOT = Path(BASE_DIR).joinpath('staticfiles')
STATICFILES_DIRS = (Path(BASE_DIR).joinpath('static'),)

DigitalOcean

Configurons DigitalOcean pour qu'il fonctionne avec notre application.

Tout d'abord, vous devrez vous inscrire pour un compte DigitalOcean (si vous n'en avez pas déjà un). Ensuite, depuis le tableau de bord DigitalOcean , cliquez sur le lien "Applications" dans la barre latérale, cliquez sur "Créer une application, puis liez votre compte GitHub. Vous voudrez probablement accorder l'accès uniquement au dépôt unique créé plus tôt dans cet article plutôt que pour tous les repos :

Autoriser GitHub

Une fois cela fait, sélectionnez le dépôt, gardez "Autodeploy" coché pour un déploiement continu, et cliquez sur "Suivant":

Sélectionnez le référentiel GitHub

Sur la page de configuration de l'application, DigitalOcean devrait déjà avoir détecté que l'application est basée sur Python (sur la base de la présence du fichier requirements.txt ).

Sous le capot, DigitalOcean utilise des Buildpacks Cloud Native pour exécuter votre application.

Changez la commande d'exécution en gunicorn hello_django.wsgi:application --bind 0.0.0.0:8080 --worker-tmp-dir /dev/shmet cliquez sur "Suivant":

Configurer l'application

Donnez un nom à votre application et sélectionnez la région. N'hésitez pas à vous en tenir aux valeurs par défaut - nom du dépôt et New York, respectivement.

Cliquez sur Suivant".

Nom et région

Restez avec le plan "Basic" et lancez l'application.

Sur l'écran suivant, cliquez sur le bouton "Aller aux journaux de compilation" pour afficher les journaux de déploiement en direct :

Journaux de déploiement

La création et le déploiement devraient prendre quelques minutes. Une fois terminé, cliquez sur le lien "Live App" dans le message de démarrage pour ouvrir votre application en cours d'exécution dans un nouvel onglet de navigateur :

Déploiement terminé

Tu devrais voir:

{
  "hello": "world!"
}

Base de données

Ensuite, plutôt que d'utiliser SQLite, configurons Postgres.

Dans le tableau de bord de votre application, cliquez sur le menu déroulant "Actions" et sélectionnez "Créer/Joindre une base de données". Restez avec la "base de données de développement" par défaut nommée "db". Cliquez sur "Créer et joindre".

Cela configurera automatiquement une DATABASE_URLvariable d'environnement et redéploiera l'application. Cela prendra environ dix minutes car la base de données doit être configurée. Une fois le déploiement effectué, vous pouvez visualiser la variable d'environnement depuis votre console :

Ajouter une base de données

Ajoutez la variable suivante au fichier de paramètres pour lire la variable d'environnement :

DATABASE_URL = os.getenv('DATABASE_URL', None)

Ensuite, mettez à jour la configuration de la base de données comme suit pour utiliser le DATABASE_URLs'il existe et configurez Postgres :

if not DATABASE_URL:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': BASE_DIR / 'db.sqlite3',
        }
    }
else:
    db_info = urlparse(DATABASE_URL)
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': 'db',
            'USER': db_info.username,
            'PASSWORD': db_info.password,
            'HOST': db_info.hostname,
            'PORT': db_info.port,
            'OPTIONS': {'sslmode': 'require'},
        }
    }

Ajoutez les importations appropriées en haut :

import os
from urllib.parse import urlparse

Ajoutez psycopg2 aux exigences :

psycopg2-binary==2.9.3

Assurez-vous que cela fonctionne localement. Validez et transférez votre code vers GitHub pour déclencher un nouveau déploiement.

Enfin, une fois le déploiement terminé, revenez dans "Console" pour appliquer vos migrations (via python manage.py migrate) et créer un superutilisateur (via python manage.py createsuperuser):

Appliquer les migrations et créer un superutilisateur

Vous pouvez également vérifier que la configuration Postgres est utilisée :

Vérifier Postgres

$ python manage.py shell

>>> from django.conf import settings
>>> settings.DATABASES

Variables d'environnement

Continuons, durcissons un peu l'application en configurant les paramètres suivants via des variables d'environnement :

  1. SECRET_KEY
  2. DEBUG
  3. ALLOWED_HOSTS

Mettez à jour les variables suivantes dans settings.py :

SECRET_KEY = os.getenv('SECRET_KEY', 'please-change-me')
DEBUG = os.getenv('DEBUG', 'False') == 'True'
ALLOWED_HOSTS = os.getenv('ALLOWED_HOSTS', '127.0.0.1,localhost').split(',')

Validez à nouveau votre code et poussez-le vers GitHub pour déclencher un autre nouveau déploiement.

Une fois le déploiement terminé, cliquez sur le menu déroulant "Actions", puis cliquez sur "Gérer les variables d'environnement". Ajoutez ensuite les variables suivantes dans la section "Variables d'environnement au niveau de l'application" :

  1. SECRET_KEY-52@y%9$#3#)9cff)jdcl&0-@4(u!y)dw@l2!e2s8!(jrrta_u+
  2. DEBUG-False
  3. ALLOWED_HOSTS-digitalocean-app-platform-django-3bmno.ondigitalocean.app

Assurez-vous de générer une nouvelle clé secrète et de la remplacer digitalocean-app-platform-django-3bmno.ondigitalocean.apppar votre domaine.

Ajouter des variables d'environnement

Après la mise à jour, l'application se redéploie automatiquement.

Fichiers statiques

Nous utiliserons WhiteNoise pour gérer les ressources statiques.

Ajoutez-le au fichier requirements.txt :

whitenoise==5.3.0

Mettez à jour la MIDDLEWAREliste dans settings.py :

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware',  # new
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

Ensuite, pour activer la prise en charge de la compression et de la mise en cache, ajoutez :

STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

Commettre. Poussez vers GitHub. Une fois le déploiement terminé, assurez-vous que les actifs statiques fonctionnent sur la page d'administration.

Céleri

Bien que nous ne démontrions pas comment configurer Celery dans cet article, DigitalOcean facilite la configuration de Redis , qui peut ensuite être utilisé comme courtier de messages et backend de résultats. Vous pouvez ensuite configurer le worker Celery en tant que composant "Worker" via "Actions" -> "Create Resources":

Composant travailleur

Flux de travail de développement

Lorsque le déploiement automatique est activé, chaque fois que des modifications de la branche principale sont ajoutées au contrôle de code source sur GitHub, l'application se redéploie automatiquement. Avec le temps d'arrêt zéro activé par défaut, les utilisateurs finaux ne subiront aucun temps d'arrêt lors des redéploiements.

Il est préférable d'utiliser une partie du flux de travail de la branche de fonctionnalités afin de pouvoir archiver le code dans GitHub sur une branche différente de la branche principale afin de pouvoir tester votre application avant que les modifications ne soient mises en production.

Exemple:

  1. Créer une nouvelle branche
  2. Apporter des modifications au code
  3. Validez et envoyez votre code à GitHub pour déclencher une génération de CI via GitHub Actions
  4. Ouvrir un PR contre la branche principale
  5. Fusionner une fois la construction CI terminée pour mettre à jour la production

Conclusion

Cet article a jeté un coup d'œil sur la façon d'exécuter une application Django sur la plate-forme d'applications de DigitalOcean.

En général, App Platform est une solution PaaS puissante que vous devez absolument évaluer pour vos applications Django avec d'autres solutions comme :

  1. Heroku
  2. PythonAnywhere
  3. AWS Elastic Beanstalk
  4. Google App Engine
  5. Rendre

À ce stade, le principal inconvénient d'App Platform est qu'il lui manque certaines des fonctionnalités et extensions fournies par certaines des autres solutions PaaS. Cela dit, selon cet article , un certain nombre de nouvelles fonctionnalités sont en cours, telles que les tâches planifiées, les aperçus de déploiement, l'intégration VPC et les restaurations de déploiement.

Si vous décidez d'utiliser App Platform, assurez-vous de :

  1. Découvrez comment tirer parti de la mise à l'échelle verticale et horizontale
  2. Configurer une vérification de l'état basée sur HTTP
  3. Configurer une base de données gérée de niveau production ainsi que Redis

Assurez-vous de supprimer votre application Django avec la base de données afin de ne pas encourir de frais supplémentaires.

Vous pouvez trouver le code final dans le référentiel digitalocean-app-platform-django .

Source :  https://testdrive.io

#django #digitalocean 

Exécuter Django Sur La Plate-forme D'applications De DigitalOcean
Lilly  Wilson

Lilly Wilson

1660134780

Ejecución De Django En La Plataforma De Aplicaciones De DigitalOcean

La plataforma de aplicaciones de DigitalOcean es una oferta de plataforma como servicio (PaaS), que (al igual que Heroku) le permite implementar una aplicación desde un repositorio git.

Este artículo analiza cómo implementar una aplicación Django en la plataforma de aplicaciones de DigitalOcean.

¿Por qué utilizar la plataforma de aplicaciones de DigitalOcean?

El objetivo de la plataforma de aplicaciones de DigitalOcean es simplificar la implementación para que pueda concentrarse en el desarrollo de aplicaciones en lugar de administrar la infraestructura. Es perfecto para su aplicación Django común y corriente de todos los días con Postgres (o MySQL) para la persistencia y Redis para su intermediario de mensajes Celery. Dicho esto, si su aplicación requiere que tenga acceso a la infraestructura subyacente, probablemente querrá alejarse de App Platform y usar una solución de Infraestructura como servicio (IaaS) como DigitalOcean Droplet .

Positivos:

  1. Despliegues inmutables
  2. Despliegues sin tiempo de inactividad
  3. Despliegue continuo incorporado
  4. CDN de Cloudflare por defecto
  5. Escalado vertical y horizontal (sin escalado automático todavía )
  6. Soporta ventana acoplable

Negativos:

  1. La documentación necesita trabajo (ha mejorado mucho desde que este artículo se publicó originalmente)
  2. Comparado con Heroku, tiene pocas extensiones (como servicios de registro y monitoreo)

Sí, es más costoso que una solución IaaS, pero si su aplicación no tiene requisitos de infraestructura complejos, ahorrará tiempo y dinero, ya que no necesitará contratar a un ingeniero de operaciones.

Configuración del proyecto

Implementaremos una aplicación Django básica. Si desea seguir adelante, puede usar una aplicación de demostración creada previamente o su propia aplicación.

Aplicación de demostración

Siéntete libre de clonar la aplicación de demostración desde la rama v1 del repositorio digitalocean-app-platform-django :

$ git clone https://github.com/testdrivenio/digitalocean-app-platform-django --branch v1
$ cd digitalocean-app-platform-django
$ git checkout -b main

Asegúrese de crear un nuevo repositorio de GitHub y envíe el código a la rama principal.

Tu aplicación

Si tiene su propia aplicación Django que le gustaría implementar, para simplificar, actualice la siguiente configuración en su archivo settings.py :

SECRET_KEY = 'please-change-me'
DEBUG = True
ALLOWED_HOSTS = ['*']

Después de la implementación inicial, veremos cómo cambiar cada uno de estos para que su aplicación sea más segura.

Además, agregue la siguiente configuración de activos estáticos:

STATIC_URL = '/static/'
STATIC_ROOT = Path(BASE_DIR).joinpath('staticfiles')
STATICFILES_DIRS = (Path(BASE_DIR).joinpath('static'),)

océano digital

Configuremos DigitalOcean para que funcione con nuestra aplicación.

Primero, deberá registrarse para obtener una cuenta de DigitalOcean (si aún no tiene una). A continuación, desde el panel de control de DigitalOcean , haga clic en el enlace "Aplicaciones" en la barra lateral, haga clic en "Crear aplicación" y luego vincule su cuenta de GitHub. Probablemente desee otorgar acceso solo al único repositorio creado anteriormente en este artículo. que para todos los repos:

Autorizar GitHub

Una vez hecho esto, seleccione el repositorio, mantenga "Autodeploy" marcado para la implementación continua y haga clic en "Siguiente":

Seleccionar repositorio de GitHub

En la página de configuración de la aplicación, DigitalOcean ya debería haber detectado que la aplicación está basada en Python (según la presencia del archivo requirements.txt ).

Debajo del capó, DigitalOcean usa Cloud Native Buildpacks para ejecutar su aplicación.

Cambie el comando de ejecución a gunicorn hello_django.wsgi:application --bind 0.0.0.0:8080 --worker-tmp-dir /dev/shmy haga clic en "Siguiente":

Configurar aplicación

Asigne un nombre a su aplicación y seleccione la región. Siéntase libre de seguir con los valores predeterminados: nombre del repositorio y Nueva York, respectivamente.

Haga clic en Siguiente".

Nombre y Región

Siga con el plan "Básico" e inicie la aplicación.

En la siguiente pantalla, haga clic en el botón "Ir a los registros de compilación" para ver los registros de implementación en vivo:

Registros de implementación

Debería tomar unos minutos construirlo e implementarlo. Una vez completada, haga clic en el enlace "Aplicación en vivo" en el mensaje de bienvenida para abrir su aplicación en ejecución en una nueva pestaña del navegador:

Implementación completa

Debería ver:

{
  "hello": "world!"
}

Base de datos

A continuación, en lugar de usar SQLite, configuremos Postgres.

Desde el panel de su aplicación, haga clic en el menú desplegable "Acciones" y seleccione "Crear/Adjuntar base de datos". Siga con la "Base de datos de desarrollo" predeterminada denominada "db". Haga clic en "Crear y adjuntar".

Esto configurará automáticamente una DATABASE_URLvariable de entorno y volverá a implementar la aplicación. Esto tomará alrededor de diez minutos ya que la base de datos necesita ser configurada. Una vez que se realiza la implementación, puede ver la variable de entorno desde su consola:

Agregar base de datos

Agregue la siguiente variable al archivo de configuración para leer la variable de entorno:

DATABASE_URL = os.getenv('DATABASE_URL', None)

A continuación, actualice la configuración de la base de datos para usar DATABASE_URLsi existe y configure Postgres:

if not DATABASE_URL:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': BASE_DIR / 'db.sqlite3',
        }
    }
else:
    db_info = urlparse(DATABASE_URL)
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': 'db',
            'USER': db_info.username,
            'PASSWORD': db_info.password,
            'HOST': db_info.hostname,
            'PORT': db_info.port,
            'OPTIONS': {'sslmode': 'require'},
        }
    }

Agregue las importaciones apropiadas en la parte superior:

import os
from urllib.parse import urlparse

Agregue psycopg2 a los requisitos:

psycopg2-binary==2.9.3

Asegúrate de que funcione localmente. Confirme y suba su código a GitHub para activar una nueva implementación.

Finalmente, después de que se complete la implementación, regrese a "Consola" para aplicar sus migraciones (a través de python manage.py migrate) y cree un superusuario (a través de python manage.py createsuperuser):

Aplicar Migraciones y Crear Superusuario

También puede verificar que se esté utilizando la configuración de Postgres:

Verificar PostgreSQL

$ python manage.py shell

>>> from django.conf import settings
>>> settings.DATABASES

Variables de entorno

Continuando, endurezcamos un poco la aplicación configurando las siguientes configuraciones a través de variables de entorno:

  1. SECRET_KEY
  2. DEBUG
  3. ALLOWED_HOSTS

Actualice las siguientes variables en settings.py :

SECRET_KEY = os.getenv('SECRET_KEY', 'please-change-me')
DEBUG = os.getenv('DEBUG', 'False') == 'True'
ALLOWED_HOSTS = os.getenv('ALLOWED_HOSTS', '127.0.0.1,localhost').split(',')

Vuelva a confirmar su código y llévelo a GitHub para activar otra implementación nueva.

Una vez completada la implementación, haga clic en el menú desplegable "Acciones" y luego haga clic en "Administrar Env Vars". Luego, agregue las siguientes variables en la sección "Variables de entorno de nivel de aplicación":

  1. SECRET_KEY-52@y%9$#3#)9cff)jdcl&0-@4(u!y)dw@l2!e2s8!(jrrta_u+
  2. DEBUG-False
  3. ALLOWED_HOSTS-digitalocean-app-platform-django-3bmno.ondigitalocean.app

Asegúrese de generar una nueva clave secreta y reemplazarla digitalocean-app-platform-django-3bmno.ondigitalocean.appcon su dominio.

Agregar variables de entorno

Después de la actualización, la aplicación se volverá a implementar automáticamente.

Archivos estáticos

Usaremos WhiteNoise para administrar activos estáticos.

Agréguelo al archivo requirements.txt :

whitenoise==5.3.0

Actualice la MIDDLEWARElista en settings.py :

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware',  # new
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

Luego, para habilitar la compatibilidad con la compresión y el almacenamiento en caché, agregue:

STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

Comprometerse. Empuje a GitHub. Una vez que se complete la implementación, asegúrese de que los activos estáticos funcionen en la página de administración.

Apio

Aunque no haremos una demostración de cómo configurar Celery en esta publicación, DigitalOcean facilita la configuración de Redis , que luego se puede usar como agente de mensajes y backend de resultados. Luego puede configurar el trabajador Celery como un componente "Trabajador" a través de "Acciones" -> "Crear recursos":

Componente trabajador

Flujo de trabajo de desarrollo

Con la implementación automática habilitada, cada vez que se agreguen cambios a la rama principal al control de código fuente en GitHub, la aplicación se volverá a implementar automáticamente. Con el tiempo de inactividad cero habilitado de forma predeterminada, los usuarios finales no experimentarán ningún tiempo de inactividad cuando se produzcan redespliegues.

Lo mejor es usar un poco del flujo de trabajo de la rama de características para que pueda registrar el código en GitHub en una rama diferente a la principal para que pueda probar su aplicación antes de que los cambios entren en producción.

Ejemplo:

  1. Crear una nueva sucursal
  2. Hacer cambios en el código
  3. Confirme y envíe su código a GitHub para activar una compilación de CI a través de GitHub Actions
  4. Abrir un PR contra la sucursal principal
  5. Combinar una vez que se complete la compilación de CI para actualizar la producción

Conclusión

Esta publicación analizó rápidamente cómo ejecutar una aplicación Django en la plataforma de aplicaciones de DigitalOcean.

En general, App Platform es una poderosa solución PaaS que definitivamente debería evaluar para sus aplicaciones Django junto con otras soluciones como:

  1. Heroku
  2. Python en cualquier lugar
  3. Beanstalk elástico de AWS
  4. Motor de aplicaciones de Google
  5. Prestar

La principal desventaja en este punto de App Platform es que carece de algunas de las características y extensiones que brindan algunas de las otras soluciones PaaS. Dicho esto, según esta publicación , hay una serie de características nuevas en proceso, como trabajos programados, vistas previas de implementación, integración de VPC y reversiones de implementación.

Si decide utilizar App Platform, asegúrese de:

  1. Revise cómo aprovechar la escala vertical y horizontal
  2. Configurar una comprobación de estado basada en HTTP
  3. Configure una base de datos administrada de nivel de producción , así como Redis

Asegúrese de eliminar su aplicación Django junto con la base de datos para no incurrir en cargos adicionales.

Puede encontrar el código final en el repositorio digitalocean-app-platform-django .

Fuente:  https://testdriven.io

#django #digitalocean 

Ejecución De Django En La Plataforma De Aplicaciones De DigitalOcean

Executando O Django Na Plataforma De Aplicativos Da DigitalOcean

A plataforma de aplicativos da DigitalOcean é uma oferta de plataforma como serviço (PaaS), que (muito parecido com o Heroku) permite que você implante um aplicativo de um repositório git.

Este artigo analisa como implantar um aplicativo Django na plataforma de aplicativos da DigitalOcean.

Por que usar a plataforma de aplicativos da DigitalOcean?

O objetivo da plataforma de aplicativos da DigitalOcean é simplificar a implantação para que você possa se concentrar no desenvolvimento de aplicativos em vez de gerenciar a infraestrutura. É perfeito para o seu aplicativo Django comum e cotidiano com Postgres (ou MySQL) para persistência e Redis para seu corretor de mensagens Celery. Dito isso, se seu aplicativo exigir que você tenha acesso à infraestrutura subjacente, você provavelmente desejará se afastar da App Platform e usar uma solução de infraestrutura como serviço (IaaS) como um Droplet da DigitalOcean .

Pontos positivos:

  1. Implantações imutáveis
  2. Implantações de tempo de inatividade zero
  3. Construído em implantação contínua
  4. CDN da Cloudflare por padrão
  5. Escala vertical e horizontal (sem escala automática ainda )
  6. Suporta Docker

Negativos:

  1. A documentação precisa de trabalho (está ficando muito melhor desde que este artigo foi publicado originalmente)
  2. Comparado ao Heroku, possui poucas extensões (como serviços de registro e monitoramento)

Sim, é mais caro do que uma solução IaaS, mas se seu aplicativo não tiver requisitos complexos de infraestrutura, você economizará tempo e dinheiro, pois não precisará contratar um engenheiro de operações.

Configuração do projeto

Estaremos implantando um aplicativo básico do Django. Se você quiser acompanhar, pode usar um aplicativo de demonstração pré-criado ou seu próprio aplicativo.

Aplicativo de demonstração

Sinta-se à vontade para clonar o aplicativo de demonstração da ramificação v1 do repositório digitalocean-app-platform-django :

$ git clone https://github.com/testdrivenio/digitalocean-app-platform-django --branch v1
$ cd digitalocean-app-platform-django
$ git checkout -b main

Certifique-se de criar um novo repositório GitHub e enviar o código para o branch principal.

Seu aplicativo

Se você tiver seu próprio aplicativo Django que gostaria de implantar, para simplificar, atualize a seguinte configuração em seu arquivo settings.py :

SECRET_KEY = 'please-change-me'
DEBUG = True
ALLOWED_HOSTS = ['*']

Após a implantação inicial, veremos como alterar cada um deles para que seu aplicativo fique mais seguro.

Além disso, adicione a seguinte configuração de recurso estático:

STATIC_URL = '/static/'
STATIC_ROOT = Path(BASE_DIR).joinpath('staticfiles')
STATICFILES_DIRS = (Path(BASE_DIR).joinpath('static'),)

DigitalOcean

Vamos configurar o DigitalOcean para trabalhar com nosso aplicativo.

Primeiro, você precisará se inscrever em uma conta da DigitalOcean (se ainda não tiver uma). Em seguida, no painel da DigitalOcean , clique no link "Aplicativos" na barra lateral, clique em "Criar aplicativo e vincule sua conta do GitHub. Você provavelmente desejará conceder acesso apenas ao repositório único criado anteriormente neste artigo, em vez de do que para todos os repositórios:

Autorizar GitHub

Uma vez feito, selecione o repositório, mantenha "Autodeploy" marcado para implantação contínua e clique em "Next":

Selecione o repositório do GitHub

Na página de configuração do aplicativo, a DigitalOcean já deve ter detectado que o aplicativo é baseado em Python (com base na presença do arquivo requirements.txt ).

Nos bastidores, a DigitalOcean usa Cloud Native Buildpacks para executar seu aplicativo.

Altere o comando de execução para gunicorn hello_django.wsgi:application --bind 0.0.0.0:8080 --worker-tmp-dir /dev/shme clique em "Avançar":

Configurar aplicativo

Dê um nome ao seu aplicativo e selecione a região. Fique à vontade para manter os padrões -- nome do repositório e Nova York, respectivamente.

Clique em "Avançar".

Nome e região

Fique com o plano "Básico" e inicie o aplicativo.

Na próxima tela, clique no botão "Ir para Build Logs" para visualizar os logs de implantação ao vivo:

Registros de implantação

Deve levar alguns minutos para compilar e implantar. Depois de concluído, clique no link "Aplicativo ao vivo" na mensagem inicial para abrir o aplicativo em execução em uma nova guia do navegador:

Implantação concluída

Você deveria ver:

{
  "hello": "world!"
}

Base de dados

Em seguida, em vez de usar o SQLite, vamos configurar o Postgres.

No painel do seu aplicativo, clique no menu suspenso "Ações" e selecione "Criar/Anexar banco de dados". Fique com o "Dev Database" padrão chamado "db". Clique em "Criar e Anexar".

Isso configurará automaticamente uma DATABASE_URLvariável de ambiente e reimplantará o aplicativo. Isso levará cerca de dez minutos, pois o banco de dados precisa ser configurado. Depois que a implantação for concluída, você poderá visualizar a variável de ambiente do seu console:

Adicionar banco de dados

Adicione a seguinte variável ao arquivo de configurações para ler a variável de ambiente:

DATABASE_URL = os.getenv('DATABASE_URL', None)

Em seguida, atualize a configuração do banco de dados assim para usar o DATABASE_URLse existir e configure o Postgres:

if not DATABASE_URL:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': BASE_DIR / 'db.sqlite3',
        }
    }
else:
    db_info = urlparse(DATABASE_URL)
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': 'db',
            'USER': db_info.username,
            'PASSWORD': db_info.password,
            'HOST': db_info.hostname,
            'PORT': db_info.port,
            'OPTIONS': {'sslmode': 'require'},
        }
    }

Adicione as importações apropriadas ao topo:

import os
from urllib.parse import urlparse

Adicione psycopg2 aos requisitos:

psycopg2-binary==2.9.3

Certifique-se de que funciona localmente. Confirme e envie seu código para o GitHub para acionar uma nova implantação.

Por fim, após a conclusão da implantação, volte ao "Console" para aplicar suas migrações (via python manage.py migrate) e crie um superusuário (via python manage.py createsuperuser):

Aplicar migrações e criar superusuário

Você também pode verificar se a configuração do Postgres está sendo usada:

Verificar Postgres

$ python manage.py shell

>>> from django.conf import settings
>>> settings.DATABASES

variáveis ​​ambientais

Seguindo em frente, vamos fortalecer um pouco o aplicativo definindo as seguintes configurações por meio de variáveis ​​de ambiente:

  1. SECRET_KEY
  2. DEBUG
  3. ALLOWED_HOSTS

Atualize as seguintes variáveis ​​em settings.py :

SECRET_KEY = os.getenv('SECRET_KEY', 'please-change-me')
DEBUG = os.getenv('DEBUG', 'False') == 'True'
ALLOWED_HOSTS = os.getenv('ALLOWED_HOSTS', '127.0.0.1,localhost').split(',')

Confirme seu código novamente e envie-o para o GitHub para acionar outra nova implantação.

Após a conclusão da implantação, clique no menu suspenso "Ações" e clique em "Gerenciar Vars Env". Em seguida, adicione as seguintes variáveis ​​na seção "Variáveis ​​de ambiente no nível do aplicativo":

  1. SECRET_KEY-52@y%9$#3#)9cff)jdcl&0-@4(u!y)dw@l2!e2s8!(jrrta_u+
  2. DEBUG-False
  3. ALLOWED_HOSTS-digitalocean-app-platform-django-3bmno.ondigitalocean.app

Certifique-se de gerar uma nova chave secreta e substituí -la digitalocean-app-platform-django-3bmno.ondigitalocean.apppelo seu domínio.

Adicionar variáveis ​​de ambiente

Após a atualização, o aplicativo será reimplantado automaticamente.

Arquivos estáticos

Usaremos o WhiteNoise para gerenciar ativos estáticos.

Adicione-o ao arquivo requirements.txt :

whitenoise==5.3.0

Atualize a MIDDLEWARElista em settings.py :

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware',  # new
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

Em seguida, para habilitar o suporte à compactação e armazenamento em cache, adicione:

STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

Comprometer-se. Envie para o GitHub. Depois que a implantação for concluída, verifique se os ativos estáticos funcionam na página de administração.

Salsão

Embora não demonstremos como configurar o Celery neste post, a DigitalOcean facilita a configuração do Redis , que pode ser usado como seu agente de mensagens e back-end de resultados. Você pode configurar o trabalhador Celery como um componente "Trabalhador" por meio de "Ações" -> "Criar recursos":

Componente do trabalhador

Fluxo de trabalho de desenvolvimento

Com o autodeploy ativado, sempre que as alterações no branch principal forem adicionadas ao controle de origem no GitHub, o aplicativo será reimplantado automaticamente. Com o tempo de inatividade zero ativado por padrão, os usuários finais não terão nenhum tempo de inatividade quando ocorrerem reimplantações.

É melhor usar algum tipo de fluxo de trabalho de ramificação de recurso para que você possa fazer check-in do código no GitHub em uma ramificação diferente da principal para que você possa testar seu aplicativo antes que as alterações entrem em produção.

Exemplo:

  1. Criar um novo ramo
  2. Fazer alterações no código
  3. Confirme e envie seu código para o GitHub para acionar uma compilação de CI por meio do GitHub Actions
  4. Abra um PR contra o branch principal
  5. Mescle assim que a compilação de CI for concluída para atualizar a produção

Conclusão

Este post deu uma olhada rápida em como executar um aplicativo Django na plataforma de aplicativos da DigitalOcean.

Em geral, App Platform é uma solução PaaS poderosa que você definitivamente deve avaliar para seus aplicativos Django junto com outras soluções como:

  1. Heroku
  2. PythonAnywhere
  3. AWS Elastic Beanstalk
  4. Google App Engine
  5. Renderizar

A principal desvantagem neste momento da App Platform é que ela não possui alguns dos recursos e extensões que algumas das outras soluções de PaaS fornecem. Dito isso, de acordo com esta postagem , há vários novos recursos em andamento, como trabalhos agendados, visualizações de implantação, integração de VPC e reversões de implantação.

Se você decidir usar a App Platform, certifique-se de:

  1. Revise como aproveitar o dimensionamento vertical e horizontal
  2. Configurar uma verificação de integridade baseada em HTTP
  3. Configure um banco de dados gerenciado de nível de produção , bem como o Redis

Certifique-se de excluir seu aplicativo Django junto com o banco de dados para não incorrer em cobranças adicionais.

Você pode encontrar o código final no repositório digitalocean-app-platform-django .

Fonte:  https://testdrive.io

#django #digitalocean 

Executando O Django Na Plataforma De Aplicativos Da DigitalOcean
Rupert  Beatty

Rupert Beatty

1659294960

Laravel-DigitalOcean: A DigitalOcean API Bridge for Laravel

Laravel DigitalOcean

Laravel DigitalOcean was created by, and is maintained by Graham Campbell, and is a DigitalOcean PHP API Client bridge for Laravel. It utilises my Laravel Manager package. Feel free to check out the change log, releases, security policy, license, code of conduct, and contribution guidelines.   

Installation

This version requires PHP 7.4-8.1 and supports Laravel 8-9.

DigitalOceanL5.1L5.2L5.3L5.4L5.5L5.6L5.7L5.8L6L7L8L9
2.2
3.2
4.0
5.4
6.0
7.3
8.4
9.0

To get the latest version, simply require the project using Composer:

$ composer require "graham-campbell/digitalocean:^9.0"

Once installed, if you are not using automatic package discovery, then you need to register the GrahamCampbell\DigitalOcean\DigitalOceanServiceProvider service provider in your config/app.php.

You can also optionally alias our facade:

        'DigitalOcean' => GrahamCampbell\DigitalOcean\Facades\DigitalOcean::class,

Configuration

Laravel DigitalOcean requires connection configuration.

To get started, you'll need to publish all vendor assets:

$ php artisan vendor:publish

This will create a config/digitalocean.php file in your app that you can modify to set your configuration. Also, make sure you check for changes to the original config file in this package between releases.

There are two config options:

Default Connection Name

This option ('default') is where you may specify which of the connections below you wish to use as your default connection for all work. Of course, you may use many connections at once using the manager class. The default value for this setting is 'main'.

DigitalOcean Connections

This option ('connections') is where each of the connections are setup for your application. Example configuration has been included, but you may add as many connections as you would like. Note that the 2 supported authentication methods are: "none" and "token".

Usage

DigitalOceanManager

This is the class of most interest. It is bound to the ioc container as 'digitalocean' and can be accessed using the Facades\DigitalOcean facade. This class implements the ManagerInterface by extending AbstractManager. The interface and abstract class are both part of my Laravel Manager package, so you may want to go and checkout the docs for how to use the manager class over at that repo. Note that the connection class returned will always be an instance of DigitalOceanV2\Client.

Facades\DigitalOcean

This facade will dynamically pass static method calls to the 'digitalocean' object in the ioc container which by default is the DigitalOceanManager class.

DigitalOceanServiceProvider

This class contains no public methods of interest. This class should be added to the providers array in config/app.php. This class will setup ioc bindings.

Real Examples

Here you can see an example of just how simple this package is to use. Out of the box, the default adapter is main. After you enter your authentication details in the config file, it will just work:

use GrahamCampbell\DigitalOcean\Facades\DigitalOcean;
// you can alias this in config/app.php if you like

DigitalOcean::droplet()->powerOn(12345);
// we're done here - how easy was that, it just works!

DigitalOcean::size()->getAll();
// this example is simple, and there are far more methods available

The digitalocean manager will behave like it is a DigitalOceanV2\Client class. If you want to call specific connections, you can do with the connection method:

use GrahamCampbell\DigitalOcean\Facades\DigitalOcean;

// select the your_connection_name connection, then get going
DigitalOcean::connection('your_connection_name')->droplet()->getById(12345);

With that in mind, note that:

use GrahamCampbell\DigitalOcean\Facades\DigitalOcean;

// writing this:
DigitalOcean::connection('main')->region()->getAll();

// is identical to writing this:
DigitalOcean::region()->getAll();

// and is also identical to writing this:
DigitalOcean::connection()->region()->getAll();

// this is because the main connection is configured to be the default
DigitalOcean::getDefaultConnection(); // this will return main

// we can change the default connection
DigitalOcean::setDefaultConnection('alternative'); // the default is now alternative

If you prefer to use dependency injection over facades like me, then you can easily inject the manager like so:

use GrahamCampbell\DigitalOcean\DigitalOceanManager;
use Illuminate\Support\Facades\App; // you probably have this aliased already

class Foo
{
    protected $digitalocean;

    public function __construct(DigitalOceanManager $digitalocean)
    {
        $this->digitalocean = $digitalocean;
    }

    public function bar()
    {
        $this->digitalocean->region()->getAll();
    }
}

App::make('Foo')->bar();

For more information on how to use the DigitalOceanV2\Client class we are calling behind the scenes here, check out the docs at https://github.com/DigitalOceanPHP/Client/tree/4.4.0#examples, and the manager class at https://github.com/GrahamCampbell/Laravel-Manager#usage.

Further Information

There are other classes in this package that are not documented here. This is because they are not intended for public use and are used internally by this package.

Security

If you discover a security vulnerability within this package, please send an email to security@tidelift.com. All security vulnerabilities will be promptly addressed. You may view our full security policy here.

For Enterprise

Available as part of the Tidelift Subscription

The maintainers of graham-campbell/digitalocean and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. Learn more.

Author: GrahamCampbell
Source Code: https://github.com/GrahamCampbell/Laravel-DigitalOcean 
License: MIT license

#laravel #digitalocean #hacktoberfest 

Laravel-DigitalOcean: A DigitalOcean API Bridge for Laravel
Hoang  Kim

Hoang Kim

1658237460

Cách Cung Cấp Máy ảo Trên DigitalOcean Với Terraform?

Terraform hiện là công cụ phổ biến nhất để xây dựng và quản lý cơ sở hạ tầng một cách có tổ chức. Mặc dù rất hấp dẫn để chuyển sang giao diện người dùng DigitalOcean và tạo bất kỳ thứ gì bạn cần, nhưng bạn đang làm rất kém hiệu quả.

Tại sao lại là DigitalOcean? Nền tảng của họ dễ sử dụng hơn nhiều so với nhà cung cấp đám mây lớn nhưng vẫn là tất cả những gì bạn cần để bắt đầu dự án của mình.

Sử dụng Terraform sẽ làm cho dự án của bạn dễ bảo trì hơn và thậm chí giúp bạn tiết kiệm tiền 💸 vì bạn có thể phá hủy và tạo lại mọi thứ chỉ bằng một nút bấm.

Trong bài viết này, chúng ta sẽ xem xét cấp phép VM trên DigitalOcean bằng cách sử dụng các tập lệnh địa hình.

Cung cấp giọt với Terraform

Bạn sẽ bắt đầu với những điều cơ bản và tạo một dự án mới. Đó là những tệp mà mọi dự án địa hình cần:

  • backend.tf : Xác định nơi bạn muốn định dạng trạng thái.
  • version.tf : Liệt kê tất cả các phiên bản của nhà cung cấp mà bạn đang sử dụng trong dự án của mình
  • main.tf : Đây là lần bắt đầu tập lệnh / cấu hình địa hình thực tế của bạn
  • variable.tf : đây là nơi bạn sẽ xác định các biến bạn cần
  • env.tfvars : đây là các biến thực tế cho môi trường của bạn

chúng ta hãy bắt đầu với từng tệp này.

backend.tf

Tôi sẽ sử dụng Terraform Cloud làm chương trình phụ trợ của tiểu bang của tôi vì nó là một tùy chọn miễn phí và có giao diện người dùng tuyệt vời để quản lý các kế hoạch địa hình của bạn và áp dụng trong một giao diện được thiết kế riêng. Đây là định nghĩa phụ trợ từ xa:

terraform {
  backend "remote" {
    hostname = "app.terraform.io"
    organization = "nokwebspace"    workspaces {
      name = "infra-bootstrap-tools-digitalocean"
    }
  }
}

Tạo không gian làm việc rất dễ dàng. Bạn chỉ cần một kho lưu trữ git và một vài cú nhấp chuột vào giao diện người dùng.

https://i.imgur.com/lKXnvsc.mp4

Bây giờ bạn cần đăng nhập vào Terraform Cloud của mình bằng khóa API

terraform login

Đây là cách tìm mã thông báo của bạn:

versions.tf

Tệp này được sử dụng để cho Terraform biết phiên bản của nhà cung cấp mà bạn muốn sử dụng. Cấu hình được cung cấp bởi tài liệu của nhà cung cấp . Bạn sẽ cần tạo khóa API để nhà cung cấp có thể hoạt động trên tài khoản của bạn. Bạn có thể tìm thấy hướng dẫn trong tài liệu của họ ở đây .

terraform {
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "2.17.1"
    }
  }
}provider "digitalocean" {
  # Configuration options
  # We use the env variable DIGITALOCEAN_ACCESS_TOKEN
}

Bạn cần thêm mã thông báo DigitalOcean vào Terraform Cloud. Nếu bạn chọn không sử dụng Terraform Cloud, đừng quên xuất mã thông báo sang bảng điều khiển của bạn.

export DIGITALOCEAN_ACCESS_TOKEN=

Dưới đây là cách bạn có thể thêm biến vào Terraform Cloud. Tôi đã sử dụng một tập hợp biến vì bạn có thể sử dụng lại biến trong nhiều không gian làm việc, điều này rất tiện dụng.

main.tf

Bây giờ bạn sẽ bắt đầu viết một số mã Terraform. Mục tiêu của bạn là tạo ra một hoặc nhiều giọt cho dự án của bạn. Trên đầu giọt, chúng tôi cần tìm nạp tham chiếu đến khóa SSH được đăng ký trong DigitalOcean .

Thêm vào đó, bạn có thể muốn giữ mọi thứ có tổ chức, vì vậy hãy tạo một dự án và thêm mọi giọt đã tạo vào dự án đó. Đây là mã:

variables.tf

Chúng tôi đang sử dụng các biến đó để làm cho các tập lệnh Terraform có thể định cấu hình. Ví dụ, chúng tôi muốn xác định số lượng phiên bản chúng tôi cần.

variable "worker_count" {
  type = number
  default = 1
}

Bạn đặt một giá trị mặc định, vì vậy bạn không thực sự cần chuyển các tệp biến cho ví dụ này.

Tất cả đã xong, bạn có thể đi

Chạy kế hoạch 👶

terraform plan

Nếu mọi thứ có vẻ ổn, hãy nộp đơn đi 😄

terraform apply

Phải làm gì tiếp theo?

Tạo VM giống như các bước sơ sinh của kỹ thuật đám mây, có rất nhiều cơ hội sau đó.

Liên kết: https://faun.pub/how-to-provision-vms-on-digitalocean-with-terraform-898515a0dbbc

#digitalocean #terraform

Cách Cung Cấp Máy ảo Trên DigitalOcean Với Terraform?

Как подготовить виртуальные машины в DigitalOcean с помощью Terraform?

Terraform в настоящее время является самым популярным инструментом для организованного создания инфраструктуры и управления ею. Хотя заманчиво перейти к пользовательскому интерфейсу DigitalOcean и создать все, что вам нужно, вы очень неэффективны.

Почему именно DigitalOcean? Их платформа намного проще в использовании, чем у крупного облачного провайдера, но это все, что вам нужно для запуска вашего проекта.

Использование Terraform сделает ваш проект более удобным в сопровождении и даже сэкономит ваши деньги 💸, поскольку вы можете уничтожить и воссоздать все одним нажатием кнопки.

В этой статье мы рассмотрим подготовку виртуальной машины в DigitalOcean с помощью сценариев terraform.

Предоставление дроплета с помощью Terraform

Вы начнете с основ и создадите новый проект. Это файлы, которые нужны каждому проекту terraform:

  • backend.tf : определите, где вы хотите терраформировать состояние.
  • version.tf : перечислите все версии провайдера, которые вы используете в своем проекте.
  • main.tf : это ваш фактический сценарий терраформирования / запуск конфигурации.
  • Variables.tf : здесь вы собираетесь определить нужные вам переменные.
  • env.tfvars : это фактические переменные для вашей среды.

давайте начнем с каждого из этих файлов по одному.

бэкенд.tf

Я буду использовать Terraform Cloud в качестве серверной части своего штата, потому что это бесплатная опция и у нее потрясающий пользовательский интерфейс для управления вашими планами терраформирования и применения в индивидуальном интерфейсе. Вот определение удаленного бэкэнда:

terraform {
  backend "remote" {
    hostname = "app.terraform.io"
    organization = "nokwebspace"    workspaces {
      name = "infra-bootstrap-tools-digitalocean"
    }
  }
}

Создать рабочее пространство очень просто. Вам нужен только репозиторий git и несколько кликов пользовательского интерфейса.

https://i.imgur.com/lKXnvsc.mp4

Теперь вам нужно войти в свое облако Terraform Cloud с помощью ключа API.

terraform login

Вот как найти токен:

версии.tf

Этот файл используется, чтобы сообщить Terraform, какую версию провайдера вы хотите использовать. Конфигурация предоставлена ​​документацией провайдера . Вам нужно будет сгенерировать ключ API, чтобы провайдер мог действовать в вашей учетной записи. Вы можете найти инструкцию в их документе здесь .

terraform {
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "2.17.1"
    }
  }
}provider "digitalocean" {
  # Configuration options
  # We use the env variable DIGITALOCEAN_ACCESS_TOKEN
}

Вам необходимо добавить токен DigitalOcean в Terraform Cloud. Если вы решите не использовать Terraform Cloud, не забудьте экспортировать токен на консоль.

export DIGITALOCEAN_ACCESS_TOKEN=

Ниже описано, как добавить переменную в Terraform Cloud. Я использовал набор переменных, так как вы можете повторно использовать переменную в нескольких рабочих областях, что очень удобно.

main.tf

Теперь вы собираетесь начать писать код Terraform. Ваша цель — создать одну или несколько капель для вашего проекта. Помимо дроплета, нам нужно получить ссылку на SSH-ключ, зарегистрированный в DigitalOcean .

Кроме того, вы, вероятно, хотите, чтобы все было организовано, поэтому давайте создадим проект и добавим каждую созданную каплю в этот проект. Вот код:

переменные.tf

Мы используем эти переменные, чтобы сделать сценарии Terraform настраиваемыми. Например, мы хотим определить, сколько экземпляров нам нужно.

variable "worker_count" {
  type = number
  default = 1
}

Вы устанавливаете значение по умолчанию, поэтому вам не нужно передавать файлы переменных для этого примера.

Все готово, можно идти

Выполнить план 👶

terraform plan

Если все выглядит хорошо, идите и подавайте заявку 😄

terraform apply

Что делать дальше?

Создание виртуальной машины похоже на первые шаги облачной инженерии, после которых открывается так много возможностей.

Ссылка: https://faun.pub/how-to-provision-vms-on-digitalocean-with-terraform-898515a0dbbc

#digitalocean #terraform

Как подготовить виртуальные машины в DigitalOcean с помощью Terraform?
田辺  亮介

田辺 亮介

1658215740

如何使用 Terraform 在 DigitalOcean 上配置 VM?

Terraform現在是最流行的以有組織的方式構建和管理基礎設施的工具。雖然很想跳到DigitalOcean UI 並創建您需要的任何內容,但您的效率非常低下。

為什麼選擇 DigitalOcean?他們的平台比大型雲提供商更易於使用,但仍然是您開始項目所需的全部。

使用 Terraform 將使您的項目更易於維護,甚至可以為您節省資金💸,因為您可以通過單擊按鈕來銷毀和重新創建所有內容。

在本文中,我們將使用 terraform 腳本在 DigitalOcean 上配置 VM。

使用 Terraform 配置液滴

您將從基礎開始並創建一個新項目。這些是每個 terraform 項目需要的文件:

  • backend.tf:定義你想在哪裡改變狀態。
  • version.tf:列出您在項目中使用的所有提供者的版本
  • main.tf:這是您實際的 terraform 腳本/配置開始
  • variables.tf:這是你要定義你需要的變量的地方
  • env.tfvars:這些是您的環境的實際變量

讓我們從一個開始處理這些文件中的每一個。

後端.tf

我將使用 Terraform Cloud 作為我所在州的後端,因為它是一個免費選項,並且具有令人驚嘆的 UI 來管理您的 terraform 計劃並在量身定制的界面中應用。這是遠程後端定義:

terraform {
  backend "remote" {
    hostname = "app.terraform.io"
    organization = "nokwebspace"    workspaces {
      name = "infra-bootstrap-tools-digitalocean"
    }
  }
}

創建工作區非常容易。您只需要一個 git 存儲庫和幾次 UI 點擊。

https://i.imgur.com/lKXnvsc.mp4

現在您需要使用 API 密鑰登錄到 Terraform Cloud

terraform login

以下是如何找到您的令牌:

版本.tf

該文件用於告訴 Terraform 您要使用哪個版本的提供程序。配置由提供者的文檔提供。您需要為提供商生成 API 密鑰才能對您的帳戶進行操作。你可以在這裡找到他們的文檔中的說明。

terraform {
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "2.17.1"
    }
  }
}provider "digitalocean" {
  # Configuration options
  # We use the env variable DIGITALOCEAN_ACCESS_TOKEN
}

您需要將 DigitalOcean 令牌添加到 Terraform Cloud。如果您選擇不使用 Terraform Cloud,請不要忘記將令牌導出到您的控制台。

export DIGITALOCEAN_ACCESS_TOKEN=

以下是將變量添加到 Terraform Cloud 的方法。我使用了一個變量集,因為您可以在多個工作區中重複使用該變量,這非常方便。

主文件

現在您將開始編寫一些 Terraform 代碼。您的目標是為您的項目創建一個或多個液滴。在 droplet 之上,我們需要獲取對在 DigitalOcean 中註冊的 SSH 密鑰的引用。

另外,您可能希望保持一切井井有條,所以讓我們創建一個項目並將每個創建的 Droplet 添加到該項目中。這是代碼:

變量.tf

我們正在使用這些變量來使 Terraform 腳本可配置。例如,我們想定義我們需要多少個實例。

variable "worker_count" {
  type = number
  default = 1
}

您設置了一個默認值,因此您實際上不需要為此示例傳遞變量文件。

一切就緒,你可以走了

執行計劃👶

terraform plan

如果一切看起來都很好去申請😄

terraform apply

接下來做什麼?

創建虛擬機就像雲工程的嬰兒步驟,之後有很多機會。

鏈接:https ://faun.pub/how-to-provision-vms-on-digitalocean-with-terraform-898515a0dbbc

#digitalocean #terraform

如何使用 Terraform 在 DigitalOcean 上配置 VM?
Thierry  Perret

Thierry Perret

1658204885

Comment Provisionner Des VM Sur DigitalOcean Avec Terraform ?

Terraform est désormais l'outil le plus populaire pour créer et gérer une infrastructure de manière organisée. Bien qu'il soit tentant de passer à l'interface utilisateur DigitalOcean et de créer tout ce dont vous avez besoin, vous êtes très inefficace.

Pourquoi DigitalOcean quand même ? Leur plate-forme est beaucoup plus simple à utiliser que le grand fournisseur de cloud, mais reste tout ce dont vous avez besoin pour démarrer votre projet.

L'utilisation de Terraform rendra votre projet beaucoup plus facile à maintenir et vous fera même économiser de l'argent 💸 car vous pouvez tout détruire et tout recréer d'un simple clic.

Dans cet article, nous allons passer en revue le provisionnement de VM sur DigitalOcean à l'aide de scripts terraform.

Provisionner le droplet avec Terraform

Vous commencerez par les bases et créerez un nouveau projet. Ce sont les fichiers dont chaque projet terraform a besoin :

  • backend.tf : Définissez où vous voulez terraformer l'état.
  • version.tf : répertorie toutes les versions du fournisseur que vous utilisez dans votre projet
  • main.tf : il s'agit de votre script/configuration terraform réel.
  • variables.tf : c'est ici que vous allez définir les variables dont vous avez besoin
  • env.tfvars : ce sont les variables réelles de votre environnement

Commençons par chacun de ces fichiers un par un.

backend.tf

J'utiliserai Terraform Cloud comme backend de mon état car il s'agit d'une option gratuite et dispose d'une interface utilisateur incroyable pour gérer vos plans de terraform et les appliquer dans une interface sur mesure. Voici la définition du backend distant :

terraform {
  backend "remote" {
    hostname = "app.terraform.io"
    organization = "nokwebspace"    workspaces {
      name = "infra-bootstrap-tools-digitalocean"
    }
  }
}

Créer un espace de travail est très simple. Vous n'avez besoin que d'un référentiel git et de quelques clics sur l'interface utilisateur.

https://i.imgur.com/lKXnvsc.mp4

Vous devez maintenant vous connecter à votre Terraform Cloud à l'aide d'une clé API

terraform login

Voici comment trouver votre jeton :

versions.tf

Ce fichier est utilisé pour indiquer à Terraform quelle version du fournisseur vous souhaitez utiliser. La configuration est fournie par la documentation du fournisseur . Vous devrez générer une clé API pour que le fournisseur puisse agir sur votre compte. Vous pouvez trouver les instructions dans leur doc ici .

terraform {
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "2.17.1"
    }
  }
}provider "digitalocean" {
  # Configuration options
  # We use the env variable DIGITALOCEAN_ACCESS_TOKEN
}

Vous devez ajouter le jeton DigitalOcean à Terraform Cloud. Si vous choisissez de ne pas utiliser Terraform Cloud, n'oubliez pas d'exporter le jeton vers votre console.

export DIGITALOCEAN_ACCESS_TOKEN=

Vous trouverez ci-dessous comment ajouter la variable à Terraform Cloud. J'ai utilisé un jeu de variables car vous pouvez réutiliser la variable dans plusieurs espaces de travail, ce qui est très pratique.

main.tf

Vous allez maintenant commencer à écrire du code Terraform. Votre objectif est de créer une ou plusieurs gouttelettes pour votre projet. En plus de la gouttelette, nous devons récupérer une référence à une clé SSH enregistrée dans DigitalOcean .

De plus, vous voulez probablement que tout reste organisé, alors créons un projet et ajoutons chaque droplet créé à ce projet. Voici le code :

variables.tf

Nous utilisons ces variables pour rendre les scripts Terraform configurables. Par exemple, nous voulons définir le nombre d'instances dont nous avons besoin.

variable "worker_count" {
  type = number
  default = 1
}

Vous définissez une valeur par défaut, vous n'avez donc pas vraiment besoin de transmettre des fichiers variables pour cet exemple.

Tout est fait, vous êtes prêt à partir

Exécutez le plan 👶

terraform plan

Si tout semble bon, allez postuler 😄

terraform apply

Que faire ensuite?

La création de VM est comme les premières étapes de l'ingénierie cloud, il y a tellement d'opportunités après cela.

Lien : https://faun.pub/how-to-provision-vms-on-digitalocean-with-terraform-898515a0dbbc

#digitalocean #terraform

Comment Provisionner Des VM Sur DigitalOcean Avec Terraform ?
Waylon  Bruen

Waylon Bruen

1654706580

Go-furnace: Go Hosting Solution for AWS, Google Could & Digital Ocean

Furnace

Intro

Brief Explanation

Here is a very short description of what Furnace does in a handy IKEA manual format.

 Furnace1

Furnace2

In More Depth

AWS Cloud Formation, Google Cloud Platform, or DigitalOcean hosting with Go. This project utilizes the power of AWS CloudFormation and CodeDeploy, or DeploymentManager and Git support in GCP in order to simply deploy an application into a robust, self-healing, redundant environment. The environment is configurable through the CloudFormation Template or GCPs jinja files. A sample can be found in the templates folder.

The application to be deployed is handled via GitHub, or S3.

A sample application is provider under the furnace-codedeploy-app folder.

Furnace vs Terraform

Furnace does not try to compete with Terraform. It aims for a different market. The main differences between Terraform and Furnace are the following:

Binary size

On the rare occasions when disk space matters, Furnace provides individual binaries. The size of the aws binary ATM is 15MB. Terraform is at 100MB.

Configuration

Configuration for Terraform can be pretty huge. In contrast Furnace's configuration is lightweight because frankly, it doesn't have much. All the configuration you will have to write will be for CloudFormation and GCP. However complicated they can be is out of Furnace's reach.

Vendor Lock

True that Terraform provides provider agnostic settings and behavior. But, you'll be vendor locked to Terraform. Moving away from the massive configuration that the user has to build up to use it can never be moved away from again. Or only through a lot of work.

In contrast, Furance is a light wrapper around services that provide what Terraform is providing per provider. What does this mean? It means Furnace is using CloudFormation for AWS and DeploymentManager for GCP which are services built by AWS and GCP. Not by Furnace. If you don't want to use Furnace any longer, you'd still have your deployment configuration which works just fine without it. Resources are all grouped together. Deleting them is as simple as calling an end-point, clicking a button or hitting enter.

Installing Binaries

Go Install

To install all generated binaries at once, run:

# Download / Clone the latest version
# cd into go-furnace
make install-all

This will install all dependencies and both binaries to $GOPATH/bin folder.

Make commands

You can also build the commands which will be output into the cmd sub-folder.

# Simply run make from the root folder
make

Building for different environment

Convenient targets are provided for linux and windows binaries.

make linux
make windows

These are only available from the package folders respectively.

Clean

In case make install is used, a clean-up target is also provided.

make clean-all

AWS

Google Cloud

DigitalOcean

Plugins

A highly customizable plugin system is provided for Furnace via HashiCorp's Go-Plugins.

Writing a plugin is as easy as implementing an interface. Furnace uses GRPC to talk to the plugins locally. The interface to implement is provided by a proto file located here: Protocol Description.

A single configuration value is provided for plugins in the yaml file which is the location of plugins:

  plugins:
    plugin_path: "./plugins"

If this is not provided, the default value is ./plugins which is next to the binary.

Plugins are available for the following events:

Pre creating a stack (stackname parameter is provided) These plugins have the chance to stop the process before it starts. Here the user would typically try and do a preliminary check like permissions or resources are available. If not, abort the creation process before it begins.

Post creating a stack (stackname parameter is provided) This is typically a place where a post notification could be executed, like a slack notifier that a stack's creation is done. Or an application health-check which looks up the deployed URL parameter and checks if the application is responding.

Pre deleting a stack (stackname parameter is provided) These plugins also have the option to abort a delete before it begins. A typical use-case would be to check if the resources associated to the stack are still being used or not.

Post deleting a stack (stackname parameter is provided) This is a place to send out a notification that a stack has been successfully or unsuccessfully deleted. Or another application could be to see if all the resources where cleaned up properly. Or to perform any more cleanup which the CloudFormation could not do.

The following repository contains the SDK that the plugins provide for a Go based plugin system:

SDK for Go based plugins.

Multiple languages

Since it's GRPC the language in which the plugin is provided is whatever the plugin's writer chooses and is supported by Furnace.

Currently three main languages are supported to write plugins in:

  • Python
  • Ruby
  • Go

Slack Plugin in Go

package main

import (
    "log"

    fplugins "github.com/go-furnace/go-furnace/furnace-aws/plugins"
    "github.com/go-furnace/sdk"
    "github.com/hashicorp/go-plugin"
)

// SlackPreCreate is an actual implementation of the furnace PreCreate plugin
// interface.
type SlackPreCreate struct{}

// Execute is the entry point to this plugin.
func (SlackPreCreate) Execute(stackname string) bool {
    api := slack.New("YOUR_TOKEN_HERE")
    params := slack.PostMessageParameters{}
    channelID, timestamp, err := api.PostMessage("#general", fmt.Sprintf("Stack with name '%s' is Done.", stackname), params)
    if err != nil {
        fmt.Printf("%s\n", err)
        return
    }
    fmt.Printf("Message successfully sent to channel %s at %s", channelID, timestamp)
    return true
}

func main() {
    plugin.Serve(&plugin.ServeConfig{
        HandshakeConfig: fplugins.Handshake,
        Plugins: map[string]plugin.Plugin{
            "slack-furnace-precreate": &sdk.PreCreateGRPCPlugin{Impl: &SlackPreCreate{}},
        },

        // A non-nil value here enables gRPC serving for this plugin...
        GRPCServer: plugin.DefaultGRPCServer,
    })
}

Sample plugin in Python

For this to work the author has to implement the proto file. A sample repository can be found here: Example for a Python Plugin.

For brevity here is the full Python source:

from concurrent import futures
import sys
import time

import grpc

import furnace_pb2
import furnace_pb2_grpc

from grpc_health.v1.health import HealthServicer
from grpc_health.v1 import health_pb2, health_pb2_grpc

class PreCreatePluginServicer(furnace_pb2_grpc.PreCreateServicer):
    """Implementation of PreCreatePlugin service."""

    def Execute(self, request, context):
        result = furnace_pb2.Proceed()
        result.failed = True

        return result

def serve():
    # We need to build a health service to work with go-plugin
    health = HealthServicer()
    health.set("plugin", health_pb2.HealthCheckResponse.ServingStatus.Value('SERVING'))

    # Start the server.
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    furnace_pb2_grpc.add_PreCreateServicer_to_server(PreCreatePluginServicer(), server)
    health_pb2_grpc.add_HealthServicer_to_server(health, server)
    server.add_insecure_port('127.0.0.1:1234')
    server.start()

    # Output information
    print("1|1|tcp|127.0.0.1:1234|grpc")
    sys.stdout.flush()

    try:
        while True:
            time.sleep(60 * 60 * 24)
    except KeyboardInterrupt:
        server.stop(0)

if __name__ == '__main__':
    serve()

The serve method here is a go-plugin requirement. To read up on it, please check-out go-plugin by HashiCorp.

Usage

After a plugin has been written simply build ( in case of Go ) or copy ( in case of Python ) it to the right location.

Furnace autodiscovers these files based on their name and loads them in order. Once that happens it will run them together at the correct event.

The following filenames should be used for the following events:

  • PreCreate: *-furnace-precreate*
  • PostCreate: *-furnace-postcreate*
  • PreDelete: *-furnace-predelete*
  • PostDelete: *-furnace-postdelete*

Separate binaries

In order to try and minimize the binary size of furnace, it has separate binaries for each service it provides.

You can find furnace-aws under aws and furnace-gcp under gcp. This way, if you plan on using only aws you don't need to worry about dependencies for Google, and vica-versa.

Contributions

Contributions are very welcomed, ideas, questions, remarks, please don't hesitate to submit a ticket. On what to do, please take a look at the ROADMAP.md file or under the Issues tab.

Pre-Binaries

Are now available under release artifacts and are automatically built by CircleCI whenever a new tag is created.

Author: Go-furnace
Source Code: https://github.com/go-furnace/go-furnace 
License: MIT license

#go #golang #aws #digitalocean 

Go-furnace: Go Hosting Solution for AWS, Google Could & Digital Ocean
Joshua Yates

Joshua Yates

1653447954

DigitalOcean Functions: A Powerful Serverless Computing Solution

Introducing DigitalOcean Functions, DigitalOcean’s newest serverless offering! Use lightweight code to enhance your AppPlatform applications with Functions-as-a-Service or deploy them independently. This video will explore how to get started quickly building your own and integrating them into your applications.

00:00 Intro
00:15 Add a DigitalOcean Function to AppPlatform
02:30 Add a Managed Database
03:49 Using the Functions Tab
05:27 Using the DigitalOcean CLI with Functions
06:15 Outro

#digitalocean #serverless #javascript

DigitalOcean Functions: A Powerful Serverless Computing Solution

Flask App for Deploying DigitalOcean Droplet using Pulumi

Droplet Deployer

Simple Flask app which deploys a droplet onto Digital ocean.

Behind the scenes there's Pulumi being used.

Background

I have been Terraform user for a while and it is a industry-wide recognized standard tool for deployment of IaC.

Pulumi is written to overcome the hurdle of learning a custom language, allowing developers and DevOps to use standard programming languages such as Python, Go, JavaScript, TypeScript, and C#, to deploy their stacks. I can see merits of using Pulumi where a new team is completely unfamiliar with Terraform but has existing software development skills. This is not to say that HCL is a difficult language to learn. People with existing software engineering and development skills can quickly pickup Terraform and they will also be well supported by communities as it is an extremely popular tool, if not the tool of choice.

If you are interested in learning more around how Pulumi differs from Terraform, there's a comparision on Pulumi's website.

I wanted to write this app to be able to understand Pulumi better so I'm ready for when oppurtunity arise for the use of Pulumi :).

Getting started

There are a few steps to get stack setup.

Export a config passphrase for encrypting your secrets.

export PULUMI_CONFIG_PASSPHRASE=password

Export your Digitalocean Token.

export DIGITALOCEAN_TOKEN="<YOUR_DO_TOKEN>"

Install pulumi engine using curl. For more info, see here.

curl -fsSL https://get.pulumi.com | sh

Create a local state backend. Only good for testing or development use.

pulumi login --local

Install pulumi digitalocean plugin.

pulumi plugin install resource digitalocean v4.8.0

Setup your venv.

python3 -m venv venv

Install requirements under your venv.

venv/bin/python3 -m pip install -r requirements.txt

And final step is to run the flask application using flask run command.

FLASK_RUN_PORT=1337 FLASK_ENV=development FLASK_APP=app venv/bin/flask run

Listing Droplets

Hitting the root of the webserver or /list would list all the pulumi stacks containing droplets managed by the tool.

curl 127.0.0.1:1337

# or

curl 127.0.0.1:1337/list

Creating Droplet

Provide the name of droplet you want to create. This will also be set as Pulumi stack name.

Using curl hit /add endpoint.

curl -H 'Content-Type: application/json' -d '{"name": "test"}' 127.0.0.1:1337/add

Delete a single Droplet

Provide the name of droplet you want to delete. This also deletes Pulumi stack.

Using curl hit /delete endpoint with HTTP method DELETE providing instance name as below.

curl -X DELETE -H 'Content-Type: application/json' -d '{"name": "test"}' 127.0.0.1:1337/delete

Delete ALL Droplets

The tool also provides ability to delete all droplets and the complete stack managed via this Pulumi setup.

curl -X DELETE 127.0.0.1:1337/deleteAll

Acknowledgement

Inspired by similar, feature rich and much better project https://github.com/komalali/self-service-platyform/.

Download Details:
Author: ahmedsajid
Source Code: https://github.com/ahmedsajid/droplet-deployer
License: MIT License

#python #flask #pulumi #digitalocean 

Flask App for Deploying DigitalOcean Droplet using Pulumi