Як розміщувати легкі програми безкоштовно

Коли ви шукаєте послуги веб-хостингу, існує безліч безкоштовних варіантів. Але є не так багато місць, де ви можете розміщувати веб-додатки з повним стеком, що включають API, CGI або серверні запити AJAX - особливо якщо ви хочете використовувати щось інше, ніж PHP.

Ця стаття - це простий, але змістовний посібник про те, як розпочати розміщення сценаріїв на хмарних серверах.

Коли використовувати платформу хмарних додатків

Платформи хмарних додатків добре працюють у сценаріях, коли для роботи на сервері потрібен трохи коду. Багато з цих платформ пропонують серію контейнерів додатків на базі Linux (які виглядають як віртуальні машини), де ви розгортаєте код, який ви розробили на своєму локальному комп'ютері за допомогою набору ключових слів командного рядка.

Heroku - це одна з таких служб, яку ви можете відносно легко розмістити на своєму коді (різними мовами). Він пропонує модель freemium, де вони дозволяють безкоштовно користуватися близько 500 годин обчислень (їх повна ціна вказана тут).

Після того, як ви написали свій код на локальному робочому столі, ви можете виконувати команди, які розгортають код у робочій області в Heroku. Потім код виконується залежно від тригера. Тригерами може бути запланована робота, веб-сервер, який запускається через запит веб-сторінки, або щось, що постійно працює та обробляє дані - що може стати досить дорогим.

Що справді приємно, це те, що вам не потрібно турбуватися про операційну систему (пам’ять, сховище, процесор, виправлення безпеки), оскільки це все управляється для вас - але в той же час це означає, що у вас є обмежена гнучкість, оскільки ви не можете розподіляти ресурси безпосередньо.

Кілька конкретних прикладів, коли Heroku може добре працювати для вас:

  • Хостинг власного веб-сайту, де ви хочете написати власний веб-сервер
  • Періодично видаляти дані з веб-сайту, а потім зберігати їх у базі даних для аналізу
  • Пропонуємо API-сервер для конкретного завдання. Такі речі, як пропонування даних про погоду, зберігання даних датчика Інтернету речей або виклик веб-служби для моделі машинного навчання
  • Служба баз даних (хоча така служба, як Firebase, можливо, краще підходить)

Архітектура Heroku

Heroku надає полегшену віртуальну машину (ВМ) для розгортання коду. Зверніть увагу, що за безкоштовною опцією ви можете розгорнути до 5 програм, які вважаються 5 легкими віртуальними машинами. Для вашої фактичної заявки вам надається окремий субдомен URL-адреси під Heroku. Тож назви ваших проектів повинні бути унікальними.

Ці робочі простори мають власний простір для таких компонентів, як: файли коду та ресурсів (не файли динамічних даних), бази даних (Postgres) та файли журналів.

На вашому локальному робочому столі Heroku використовує назву вашого каталогу для визначення вашого проекту, а також для того, щоб Heroku розумів ваш контекст. Таким чином, ви можете мати кілька проектів у різних каталогах, і коли ви запускаєте команди Heroku - просто переконайтеся, що ви робите це у правильній папці.

Одне ключове, про що вам потрібно пам’ятати (про що я знайшов важкий шлях через години налагодження - хотів би, щоб я приділив більше уваги документації), - це те, що все запускається з пам'яті. Немає постійного сховища. Я повторю це ще раз - ви не можете зберігати будь-які файли на файловому сервері! Для постійності Heroku пропонує базу даних SQL після переходу, куди ви можете додавати записи за необхідності.

Простий приклад - виявлення змін на веб-сайті

Ось покрокове керівництво, щоб отримати робочий приклад простої служби, яка надішле вам електронною поштою, якщо веб-сайт змінився - в основному клон www.changedetection.com. Буде кілька ключових компонентів цього:

  1. База даних, яка буде зберігати: (а) електронну адресу для повідомлення про змінений веб-сайт; (b) веб-сайт для відстеження; (c) остання "копія" веб-сайту
  2. Шматок коду, який перевірятиме даний веб-сайт із бази даних у # 1 (скрипт Python)
  3. Планувальник завдань, який буде запускати програму в №2 (еквівалент завдання cron)
  4. Веб-інтерфейс користувача, за допомогою якого ви можете додавати / видаляти веб-сайти для моніторингу в базі даних, згаданій у # 1
  5. Механізм розсилки електронних листів

Розуміння цих компонентів озброїть вас навичками робити вже багато справ. Я дізнався про всі ці речі з кількох джерел, тому це виступає як зведений допис.

Припущення

Наступний посібник робить такі припущення:

  • У вас є обліковий запис GitHub - якщо цього немає, створіть його тут. Вам також слід прочитати цей простий посібник.
  • У вас вже є акаунт Heroku - якщо ви не хочете, створіть його тут.
  • Ви використовуєте машину Windows - якщо ні, це нормально, інструкції досить схожі в інших середовищах
  • Ви вже встановили Python - якщо цього не зробите, перейдіть сюди, щоб встановити його
  • Ви вже можете програмувати на Python - якщо ні, то я б запропонував спочатку вивчити деякі основи. Деякі путівники тут.
  • Ви знаєте SQL - якщо цього не знаєте, будь ласка, йдіть сюди.

Огляд кроків

Я вважаю, що підхід "прогулянка, перш ніж ти зможеш побігти" допомагає у процесі навчання. Він також служить документацією для вас, як вирішити кожну частину більшого процесу. Таким чином, якщо щось зламається у вашій подальшій діяльності, у вас буде більше шансів з’ясувати, де все пішло не так.

Крок 1 : Розробіть веб-інтерфейс користувача - спочатку побудуйте Hello World

Крок 2 : Постійність - створіть базу даних

Крок 3 : Перевірте веб-сайти на наявність змін

Крок 4: Надішліть сповіщення електронною поштою про зміни

Крок 5 : Перелічіть результати на веб-сторінці

Крок 6: Розгортання

Крок 1: Розробіть веб-інтерфейс користувача - спочатку побудуйте Hello World

По-перше, давайте розглянемо просту програму, розгорнуту на Heroku, щоб розпочати роботу. Ця програма буде попередником веб-інтерфейсу користувача (елемент №4) у списку компонентів вище. Для того, щоб обслуговувати сторінку, ми могли б просто мати HTML-сторінку, але тоді нам потрібно було б мати веб-сервер для сервера цього файлу. Іншими словами, коли ви вводите URL-адресу веб-сайту, програмі потрібно буде інтерпретувати запит, а потім надати вміст файлу HTML. Ви можете створити свій власний міні-веб-сервер за допомогою бібліотеки Flask Python, що ми і зробимо.

  • Створіть папку, яка називається webchecker, і перейдіть до неї (ця назва каталогу не повинна збігатися з назвою програми Heroku)
  • Встановіть бібліотеку Flask. Введіть команду: npm Flask
  • Створіть таку програму Python і назвіть її showchecks.py:

Перш ніж розгортати Heroku, перевірте, чи працює він на вашому локальному ПК. Ви можете перевірити це, виконавши такі дії:

  • Запустіть програму: python webchecker.com
  • Відкрийте браузер на своєму локальному ПК та відкрийте сторінку: // localhost: 5000 / привіт

Далі, давайте розгорнемо це на Heroku. Перш ніж розпочати розгортання, потрібно додати ще кілька файлів, які допоможуть Heroku дізнатися більше про вашу програму.

По-перше, вимога.txt

По-друге, файл, який повідомляє Heroku, що запускати, коли робиться веб-запит:

Нарешті, виконувана версія Python для використання (за замовчуванням 2.7, але ми хочемо вказати останню версію Python):

Отже, у вас повинно бути чотири файли:

  1. showchecker.py, який є кодом
  2. requirements.txt для переліку нестандартних бібліотечних залежностей. Щоразу, коли у вас є нові бібліотеки, які не є частиною стандартної бібліотеки Python - тобто вам потрібно встановити їх за допомогою такого інструменту, як “pip” - додайте їх сюди. Ви можете знайти версію встановленої бібліотеки, наприклад Flask, виконавши команду: pip show Flaskу командному рядку
  3. Procfile, який є фактичним сценарієм Python, який запускається під час виклику веб-сайту - обов’язково оновіть його, якщо ви змінюєте файл Python
  4. runtime.txt, яка є фактичною версією python для використання

Ви можете розгорнути наступні кроки з командного рядка:

  1. heroku створити webchecker01 - buildpack heroku / python
  2. git add *. * *
  3. git статус
  4. git commit -m “усі файли”
  5. git push heroku майстер - -

Для команди №1 ( heroku create…) частина “webechecker01” - це унікальне ім’я, яке потрібно вказати для назви програми.

Для команди №3 ( git status) це покаже, які файли готові до розгортання. Переконайтесь, що всі файли є, якщо не додайте їх за допомогоюgit add me>.

Now you can check your website: .herokuapp.com/hello

Original text


Let’s also make sure we can see the logs since this is a great way to see what’s going on with your app server. On your PC and in the webchecker directory, run the command: heroku logs

You’ll see the last execution steps. If things aren’t working as expected, this is your first stop to find out more detail.

You can also go to the Heroku dashboard to see your consumption:

//dashboard.heroku.com

Step 2: Persistence — create a database

In order to make more useful programs, you’ll need to have a data store of sorts. This is where the Postgres database service comes into play. You first need to deploy the Heroku database service, then create your tables, and finally be able to connect to the database from your code locally (for testing).

To deploy a database service, first create it using the following command:

heroku addons:create heroku-postgresql:hobby-dev

Next, access the database from the command line and create your tables. The database is created on the Heroku cloud service and not locally. However, you can access it through the command line. To log on to the database via the console, run the command heroku pg:psql. Remember, you have to do it in your webchecker folder so that Heroku knows that it is the database for the webchecker site.

To see the list of tables type the command \d

To create a table, you need to use normal SQL statements. For our webchecker program, let’s create a table with the following columns:

  • ID — automatically generated ID for each entry (this will be the primary key). This is done by using the type “serial”
  • website — the website to monitor
  • emailaddress — the email address to send the notification that a change has occurred
  • lasthashcode — we won’t store a copy of the whole webpage, instead we will generate a hash based on the HTML of the page, and then compare this each time. This is more efficient storage-wise, but will not tell us what actually changed
  • lastchangedate — the date that the web changed last time. Hence we will get the database to default this with the current date

To create this table, enter the following command in the Heroku Postgres database console:

CREATE TABLE webcheckerdb (id serial, website varchar(250), emailaddress varchar(250), lasthashcode varchar(32), lastchangedate timestamp DEFAULT current_date );

(Make sure you include the semicolon at the end!)

Next, let’s insert a single record in the database to ensure we have something to work with prior to getting our web UI up and running (you can use your own email address so it works in the future):

INSERT into webcheckerdb values(DEFAULT, 'news.google.com', '[email protected]', '', DEFAULT);

(Make sure you include the semicolon at the end!)

You can quit with \q.

Step 3: Check websites for changes

First, let’s get a piece of code to at least check if a hardcoded site can be retrieved (following on the concept of walking before running).

Hence, first step is to see if we can retrieve a webpage, hash it, and then compare it to a hardcoded hash. Create a new Python file called checkwebsite.py. Code here:

Running this will output the following:

If you have any errors with missing libraries, you can add them via: pip install ry> from the command line.

Next, let’s connect to the database with the following code:

When you try to run this code, you are likely going to get an error of the form KeyError: ‘DATABASE_URL’. This is because your Python code is trying to locate the web address of the Postgres database hosted on Heroku. This is automatically updated to the environment variable DATABASE_URL in the Heroku server. However, on your local PC you will have to do this manually:

  1. heroku config
  2. set DATABASE_URL=

Step 4: Send an email notification on changes

Final step is to send an email. To do this, you’ll need to install an Addon that has the ability to send emails — you can find these via the Heroku marketplace: //elements.heroku.com/addons

In here, there is an Addon called SendGrid: //elements.heroku.com/addons/sendgrid

You can add SendGrid to your app in the command line by typing:

heroku addons:create sendgrid:starter

When you go to your dashboard you can see the new Addon in the Resources section:

Before using it, you’ll need to create an API key. Double click the SendGrid component above and go into Settings->API Key->Create Key (blue button on top right).

Once you create the key, copy it and go back to the command prompt and enter:

heroku config:set SENDGRID_API_KEY=ve>

This will only register it on the server, you need to add it locally to your desktop with:

set SENDGRID_API_KEY=in>

Once done, you can test your code in a new Python script called sendmail.py. Install the library via pip install sendgrid:

To confirm the email was sent and delivered, you can go back to the SendGrid dashboard and checking the Statistics Overview screen:

When checking your email, remember to check your spam.

Once it is working, there are only two lines of code you need to add to your main checkwebsite.py script. It is:

import sendmail #import the send email subroutine you wrote above
...
#call the subroutine after find the hashcode has changedsendmail.sendemail(webrecord['emailaddress'], 'Website changed', webrecord['website'] + ' changed')

The full code is here:

Step 5: List the output on the web page and schedule the job

The next step is to list the output on the webpage.

This involves querying the database, and then cycling through and showing the data on your screen. Hence, it takes the ‘Hello World’ code above, and makes the modification. I also created a different path for this, so to test this out you’ll need to go to the URL: //localhost:5000/list

And here’s the output:

Step 6: Deploy

The final step is to deploy everything to Heroku and then schedule the job so that it checks email.

You should have the following files:

  1. Procfile — the file which points to showchecker.py
  2. requirements.txt — the file which contains the library dependencies
  3. runtime.txt — the version of python
  4. showchecker.py — the python code which shows the database output on the web via .herokuapp.com/list
  5. checkwebsite.py — the python code that checks for any changes on the websites

For the requirements.txt, you will need to make amendments to add the latest libraries:

Deploy these all to Heroku:

  1. git add *.* *
  2. git commit -m “deployment”
  3. git push heroku master

Test each component:

  1. Go to .herokuapp.com/hello
  2. Go to .herokuapp.com/list

If there are any errors, then run heroku logs in the command line to see what is going on.

Next, run the checkwebsite.py directly on Heroku to make sure there are no issues. To do this, you can type:

heroku run python checkwebsite.py

Finally, you can now schedule your job. Again, you need to include an Addon to do this.

heroku addons:create scheduler:standard

And you should be able to see the scheduler in your resources page:

You can simply use the command line to run the program, in our case it is: python checkwebsite.py (this is the same as what we tested above with the heroku run command).

Summary

And that’s it… the first time it is a little complex, but hopefully the above incremental steps will help you understand what’s going on under the hood. There are a lot more resources on Heroku as well as a wealth of information on Stack Overflow. These resources should make a lot more sense after going through the above.

Good Luck!

Thanks for reading! If you like what you read, hit the❤ button below so that others may find this (you can also find me on Twitter )