Mike Pryadko
    • Create new note
    • Create a note from template
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Write
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note No publishing access yet

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.

      Your account was recently created. Publishing will be available soon, allowing you to share notes on your public page and in search results.

      Your team account was recently created. Publishing will be available soon, allowing you to share notes on your public page and in search results.

      Explore these features while you wait
      Complete general settings
      Bookmark and like published notes
      Write a few more notes
      Complete general settings
      Write a few more notes
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights New
    • Engagement control
    • Make a copy
    • Transfer ownership
    • Delete this note
    • Save as template
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Note Insights Versions and GitHub Sync Sharing URL Create Help
Create Create new note Create a note from template
Menu
Options
Engagement control Make a copy Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Write
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note No publishing access yet

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.

    Your account was recently created. Publishing will be available soon, allowing you to share notes on your public page and in search results.

    Your team account was recently created. Publishing will be available soon, allowing you to share notes on your public page and in search results.

    Explore these features while you wait
    Complete general settings
    Bookmark and like published notes
    Write a few more notes
    Complete general settings
    Write a few more notes
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       Owned this note    Owned this note      
    Published Linked with GitHub
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    # AWS (Amazon Web Services) - краткое руководство ## Идеология и архитектура AWS это "облачная" платформа, уровень абстракции над "обычными" устройствами вроде сервера, файлового хранилища, роутера, фаервола, а так же это набор дополнительных средств, (отчасти) облегчающих жизнь системному администратору и DevOps'у. AWS имеет датацентры в разных частях света и именует их "регионы" (Regions), в каждом регионе есть несколько "зон доступности" (AZ, Availability Zones) - это несоклько независитмых датацентров, расположенных рядом и выполняющих функции дублирования друг друга на случай отказа (но можно использовать их ресурсы и незавиисмо). Это дублирование не скрыто от пользователя: например, при создании [EC2](#EC2-(Elastic-Compute-Cloud))-экземпляра требуется явно указать в какой из имеющихся в данном регионе зон достпуности он будет размещён (есть опция "выбрать автоматически" -- AWS сам выберет зону исходя и наименьшей загруженности). Между зонами доступности связь проста, а вот между регионами или стороними (по отношению к AWS) системами - строится с помощью специальных сервисов. Для управления ресурсами AWS есть два инструмента: 1. [Веб-сайт ("консоль")](aws.amazon.com/console/) 2. [Утилита командной строки ("CLI")](aws.amazon.com/cli/) Наличие **CLI** позволяет автоматизировать действия на AWS с помощью скриптов и стороннего ПО, например [GitLab CI\CD](docs.gitlab.com/ee/ci/) или [Jenkins](https://ru.wikipedia.org/wiki/Jenkins_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D0%B5%D1%81%D0%BF%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5)). ## AWS Console Это отправная точка раюоты с AWS через веб-интрфейс. Выглядит так: ![](https://i.imgur.com/YZDk6Zt.png) В левом верхнем углу кнопка Services ("Сервисы") вызывает меню сервисов: ![](https://i.imgur.com/kRSbhxU.png) Сервисы сгруппированы по категориям, но можно эт угруппировку и отключить: переключатель в правом верхнем углу: ![](https://i.imgur.com/RYly8ss.png) Сервисы, к которым чаще всего обращаетесь - перечислены в колонке слева: ![](https://i.imgur.com/0PuB0Gk.png) Выбрав конкретный сервис, попадаем на сраницу работы с ним. Каждый сервис имеет свою ==Dashboard== -- она содержит статистику по использованию ресурсов сервиса и ссылки для быстрого перехода в конкретным опциям/параметрам. Пример для сервиса [VPC](#VPC-(Virtual-Private-Cloud)): ![](https://i.imgur.com/uK9B3UT.png) На странице каждого сервиса, слева, расположен список всех "подсервисов". Далее в этом руководстве для их именования будет использован формат ==Сервис.Подсервис==, пример: `VPC.Subnets`. ## Сервисы На AWS система строится из "сервисов". Они бывают разные: для построения сетевой инфраструктуры, для CI/CD, разного рода вспомогательные. Сервисы являются сложными структурами и содержат "подсервисы" (официального названия для этого типа элементов нет). ### Сеть и доставка контента #### VPC (Virtual Private Cloud) Основой сетевой инфраструктуры является VPC. Оно группирует, в частности, вичислительные инстансы, pаздаёт IP-адреса (т.е. выполняет функции DHCP-сервера), параметры DNS. При создании VPC задаётся лишь часть параметров - остальные можно посмотреть/изменить после, с помощью **Консоли**: ![](https://i.imgur.com/9washfz.png) * Имя * Диапазон IP-адресов (маска должна быть в диапазоне ==16-28==), принадлежащих этому облаку (VPC это своего рода VPN, только исключительно между **Зонами Доступности** одного **Региона**). * DNS hostnames - включает раздачу имён машинам, имеющим публичные IP-адреса. При запросе из внешнего мира эти имена будут резолвиться в публичные адреса, а изнутри VPC - в приватные. * DNS resolution - "включает" внутренний DNS Амазона (_наверное_) * [Таблица маршрутизации](#VPC.Route_Table) * [Network ACL](#VPC.Network_ACLs) ```mermaid graph LR subgraph vpc1["VPC A"] vpc("Route Table, ACLs<br>& Security Groups") subgraph zoneA["Availability Zone A"] subgraph subnetA1["Subnet 1"] machine1("Machine #1") machine2("Machine #2") machine1 --> machine2 machine2 --> machine1 end subgraph subnetA2["Subnet 2"] machine3("Machine #3") machine4("Machine #4") machine3 --> machine4 machine4 --> machine3 end end subgraph zoneB["Availability Zone B"] subgraph subnetB1["Subnet 1"] machine5("Machine #5") machine6("Machine #6") machine5 --> machine6 machine6 --> machine5 end subgraph subnetB2["Subnet 2"] machine7("Machine #7") machine8("Machine #8") machine7 --> machine8 machine8 --> machine7 end end end machine1 --> vpc machine2 --> vpc machine3 --> vpc machine4 --> vpc machine5 --> vpc machine6 --> vpc machine7 --> vpc machine8 --> vpc ``` ##### VPC.Subnets В каждой зоне доступности создаётся "подсеть" (subnet). У подсети четыре параметра: * Имя * VPC, которой она принадлежит * Зона доступности, в которой она расположена * Диапазон IP-адресов (должен быть внутри диапазона выбранного ==VPC==, маска в пределах ==16-28==), подсеть может быть такого же размера как и само VPC. ##### VPC.Route_Table Фактически, VPC служит ==маршрутизатором== ("роутером") для входящих в него подсетей. Внутри подсети экземпляры EC2 могут свободно обмениваться информацией, а для выхода за пределы нужна, как минимум, маршрутизация. Настраивается гибко, с указанием в качестве "цели" различных VPC-подсервисов. ##### VPC.Network_ACLs ==Access Control List== это набор правил для фаервола, состоит из двух таблиц: одна для входящего трафика, а вторая для исходящего. Фильтрует на основе IP-адресов, типов протоколов (на выбор даются более дюжины) и номеров портов. Работает по принципу "_запрещено всё, что не разрешено_": всегда есть неудаляемое и неизменяемое правило с низшим приоритетом, которое запрещает весь трафик. Поверх этого правила накладываются пользовательские, разрешающие тот или иной трафик. ##### VPC.Security_Groups Ссылка на [EC2.Security_Groups](#EC2.Security_Groups). ##### VPC.Internet_Gateways По-умолчанию машины изолированы от интернета (в обе стороны). Есть несколько способов это исправить. Первый и "простейший" это Internet Gateways - он просто позволяет указывать себя в таблице маршрутизации в качестве "назначения", позволяя таким образом маршрутизировать трафик за пределы VPC. Но работает он только если у машины (экземпляра EC2) есть IPv6-адрес, или белый IPv4-адрес, или [Elastic IP](#VPC.Elastic_IPs). ##### VPC.Egress_Only_Internet_Gateways Этот шлюз нужен исключительно для машин, у который IPv6-адреса. Он даёт им выход в интернет, но режет все входящие запросы (так что, фактически, это комбинация `VPC.Internet_Gateways` и `VPC.Network_ACLs`). ##### VPC.NAT_Gateways Это "классический" способ дать машинам выход в интернет (для **исходящих** запросов). При создании этого шлюза ему нужно указать к какой подсети он будет принадлежать и каким [Elastic IP](#VPC.Elastic_IPs) он будет представлен в интернете. Этот подсервис примерним только для IPv4-трафика (IPv6 как раз создавался чтобы убрать потребность в трансляции адресов). ##### VPC.Transit_Gateways Этот шлюз позволяет соедить VPC с другой VPC или с VPN или ещё с чем-то. ##### VPC.Elastic_IPs Это публичный ("белый") IPv4 адрес, который можно динамически привязывать к разным объектам: экземпляру EC2, NAT Gateway, балансировщику нагрузки и т.д. ##### VPC.Peering_Connections Своего рода VPN. Позволяет наладить связь между отдельными VPC, в том числе приназлежащзие разным аккаунтам и даже разным **Регионам**. Без неё все VPC изолированы друг от друга. ### Вычисления #### EC2 (Elastic Compute Cloud) EC2 это VPS/VDS (virtual private server/virtual dedicated server), вычислительный узел, имеющий сетевой интерфейс и ПЗУ (в котором хранится ОС и разные пользовательские файлы). Амазон предоставляет разнообразные "машины", отличающеся производительностью (количество ядер CPU, объём ОЗУ, скорость сетевых интерфейсов), а так же их физическим расположением (можно выбрать виртуалки на одной хостовой машине, можно выбрать в одной стойке/кластере - тема требует отдельного изучения). Аренда машин бывает трёх типов: ==on-demand==, ==reserved== и ==spot==. Первый вариант это "обычная" аренда: выбрал параметры, нажал Launch и всё, ресурсы в твоём распоряжении и никуда не денутся, пока ты сам их не терминируешь. Второй вариант это, насколько я понял, некая форма "твоего обещания амазону" что ты будешь в будущем исопльзолвать вот такие вот машины, за это он на них тебе сделает скидку, потому что эта информация позволит ему более эффективно выделять ресурсы остальным пользоывателям. Т.е. ты сначала "резервируешь" некие машины, а потом такие же создаёшь on-demand и получаешь небольшую скидку. А третий вариант это использование "временно свободных" ресурсов AWS. Они выдаются лишь на время, причём неизвестное. Когда эти ресурсы понадобятся AWS'у он уведомит конкретный запущенный экземпляр (нужно самому постоянно опрашивать http://169.254.169.254/latest/meta-data/spot/termination-time) и через две минуты терминирует машину, после чего в другом (свободном) месте запустит такую же, только ничего не знающую о своих "предыдущих жизнях". Этот вариант может быть "_до 90% дешевле чем on-demand_" и отлично подходит для временных задач вроде сборки проекта или периодической обработки большого объёма данных. Ещё возможен режим когда ты устанавливаешь максимальную цену за машину и когда она первышает этот порог - Амазон останавливает или вообще терминирует твой инстанс. Настроек куча, нюансов ещё больше. Для каждой запускаемой машины есть возможность выполнить некий скрипт при её первом запуске. Это называется **User data** и представляет собой скрипт для Bash или любого другого интерпретатора, присутствующего в системе на момент первого запуска. Этот скрипт запускается с правами супер-пользователя. Пример: ![](https://i.imgur.com/nQO2jQW.png) Этот скрипт не хранится непосредственно на инстансе, а подсовывается ему средствами встроенной Амазонвоской утилиты. Вся информация об экземпляре может быть им получена запросом на http://169.254.169.254/latest/meta-data/ - в том числе и этот самый скрипт: http://169.254.169.254/latest/user-data Экземпляр EC2 ("EC2 Instance") создаётся на основе "образа" виртуальной машины - есть набор готовых (разнообразные дистрибутивы Линукса, в том числе от самого амазона, даже Виндовс есть), а можно загрузить свой собственный образ от QEMU. Так же, можно создать образ на основе уже имеющихся машин (а можно и просто делать их "снапшоты", т.е. бэкапы). ##### EC2.Instances Здесь отображается список созданных/запущенных экземпляров EC2. Отсюда же осуществляется управление ими: создание, перезапуск, остановка, удаление, изменение некоторых настроек. ##### EC2.Launch_Templates Шаблон для создания экземпляра EC2. Избавляет от необходимости каждый раз вручную указывать все параматры (например, имя образа ОС, выделяемые ресурсы), имеет "версионность". ##### EC2.Volumes Позволяет управлять жёсткими дисками экземпляров. Можно создавать дополнительные и подключать их к уже работающим экземпляроам EC2. Можно создать том сразу сраскатанным на него образом (например, бэкапом чего-то). Можно включить опцию шифрования данных. ##### EC2.Snapshots Это бэкапы [томов](#EC2.Volumes). Из них можно создавать новые тома, а можно преобразовать в AMI (начальный образ для запуска экземпляра EC2). ##### EC2.Security_Groups Это фаервол, по-сути такой же как и [VPC.Network_ACLs](#VPC.Network_ACLs). В чём разница - тема для диссертации. ##### EC2.Elastic_IPs Просто ссылка на [VPC.Elastic_IPs](#VPC.Elastic_IPs). ##### EC2.Key_Pairs Каждый экземпляр EC2 на Амазоне по умолчанию имеет SSH-сервер и дефолтного пользователя, которому добавлен один какой-то SSH-ключ, чтобы вы могли попасть на эту машину и провести необходимые действия "изнутри". Все ключи "хранятся" тут и из можно добавлять/удалять. А так же, при создании экземпляра EC2 можно вместо выбора уже имеющихся ключей прям там (в окне "создавания") создать новый ключ, приватную чатсь которого вам тут же будет предложено сказать (ссылка одноразовая и живёт всего пару минут). ![](https://i.imgur.com/5FTSvMv.png) ##### EC2.Network_Interfaces Показывет списолв всех сетевых интерфейсов, которые есть у всех экземпляров EC2. Можно добавить новый и затем "присоединить" его к одному из экземпляров, **НО**: все сетевый интерфейсы одного экземпляра EC2 должна принадлежать одной и той же подсети! (Так что я не понимаю, зачем машине более одного интерфейса:confused:) ##### EC2.Placement_Groups "Группы размещения" позволяют задать особенности выделедния конкретных аппаратных ресурсов в датацентрах, например, выделять виртуалки на одном хосте, или на хостах в одной стойке, ну и так далее. ##### EC2.Load_Balancers Наверное, самый интересный подраздел. :smirk: Амазон имеет собственный "подсервис" для балансировки сетевых запросов к EC2 (и не только). Эти балансировщики есть трёх видов: ![](https://i.imgur.com/TydtxAb.png) 1. **Classic Load Balancer** - самый старый и не рекомендуемый к использованию. 2. **Network Load Balancer** - балансер уровня TCP/UDP. Сам может обсжуливать ==TLS== (таким образом снижая нагрузку на EC2) 3. **Application Load Balancer** - работает на уровне HTTP(S), тоже умеет в ==TLS==. Имеет дополнительные "фишки" вроде маршрутизации в зависимости от HTTP-маршрутов, заголовков. Позволет реализовывать "заглушки" (например, перенаправлять HTTP на HTTPS). Дешевле чем сетевой балансер. Балансеры могут работать в двух режимах: ==internal== ("внутренний") и ==internet-facing== (принимает запросы из интернета). Один балансер может обслуживать по одной подсети из нескольких зон доступности внутри только одного VPC (т.е. VPC только одно, зон доступнготси сколько угодно, в каждой из них толдько одна подсеть). Сертификаты для балансеров могут храниться в двух местах: IAM (учётная запись пользователя) и ACM (AWS Certificate Manager). Самоподписанный сертификат можно загрузить только в IAM (в ACM он вроде как тоже загружается, но при этом балансер его в упор не видит). Так же, при использовании TLS нужно указать что-то типо режима: ![](https://i.imgur.com/Qm41Hzt.png) Балансеру тоже назначается ["группа защиты"](#EC2.Security_Groups). Главный параметр балансера это ["целевая группа"](#EC2.Target_Groups) ##### EC2.Target_Groups Задаёт логическую группировку экземпляров EC2, которые принимают участие в балансировке. В параметрах целевой группые задаются параметры проверки "живости" каждой из машин - протокол, порт, таймаут, количество повторов. "Цели" указываются либо по IP-адресу, либо как экземпляры EC2 (выбираешь их из списка). ![](https://i.imgur.com/IcheMO8.png) ![](https://i.imgur.com/u5JO4sO.png) На вкладке **Monitoring** можно посмотреть статистику "живости", разных запросов и т.п. ##### EC2.Auto_Scaling_Groups ![](https://i.imgur.com/kTslCNA.png) Амазон имеет собственный подсервис для реализации горизонтального масщтабирования EC2. Работает это незамысловато: создаёшь группу масштабирования, указываешь сколько и каких нод в ней должно быть, указываешь условия для добавления/удаления нод (нагрузка на процессор/сеть/т.п.), указываешь [Launch Configuration](#EC2.Launch_Configuration) или [Launch Template](#EC2.Launch_Templates) (второе предпочтительнее) и далее _оно_ живёт само, стараясь блюсти гармонию между обслуживанием клиентов и потраченными деньгами. :relieved: (без всяких докеров/куберов и прочей нечисти) При таком подходе только одно неудобство: [CI](https://ru.wikipedia.org/wiki/%D0%9D%D0%B5%D0%BF%D1%80%D0%B5%D1%80%D1%8B%D0%B2%D0%BD%D0%B0%D1%8F_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D1%8F) - экземпляры EC2 запускаются на основе [шаблона](#EC2.Launch_Templates), в котором указан конкретный образ, так что при необходимости "обновить ПО" нужно сначала создать новый образ (AMI), затем создать новый шаблон запуска (можно на основе существующего) и затем отредактировать группу автомасштабирования, указав в ней новый шаблон автозапуска - после этого вновь запускаемые экземпляры будут иметь "новую" конфигурацию, однако уже запущенные останутся неизменными. Чтобы обновить все машины, нужно (как мне посоветовали в тех.поддержке) принудительно создавать события "добавить машину"/"удалить машину" (да, эти события можно генерить вручную, как бы эмулируя реальные события), таким образом поочерёдно старые экземпляры будут заменены новыми. :neutral_face: костыль, но иначе никак - разве что юзать [k8s](ru.wikipedia.org/wiki/Kubernetes) (ну или через SSH на каждой машине "ручками" обновлять нужные файлы, или же вообще использовать докер по SSH заставить его пересоздать контейнеры, используя новые версии образов). Группа автомасштабирования может распространяться сразу на несколько подсетей (в том числе в разных регионах). ##### EC2.Launch_Configuration Это как шаблон, только изначально было заточено под группы автомасштабирования. Сейчас рекомендуется именно шаблоны - ка кболее универсальное и, вроде как, удобное средство. ### Хранилища #### EBS (Elastic Block Store) ESB это, фактически, жёстий диск, который подключается к экземпляру EC2 и только к нему. Бывают двух типов: HDD и SSD (HDD удельно дешевле, но медленнее). Собственно, вот [оно](#EC2.Volumes). #### EFS (Elastic File System) EFS это NAS (сетевое хранилище данных), доступ к которому осуществляется с экземпляров EC2 посредством NFS (Network File System, версия 4). Доступ возможен только с Линукс-машин. Размер не ограничен. Оплата почасовая за каждый хранимый гигабайт. #### S3 (Simple Storage Service) S3 это NAS с HTTP(s)-интерфейсом. Посредством REST можно как скачивать файлы, так и загружать. Гибкая настройка правил доступа. Умеет хранить историю изменения файлов (по-умолчанию эта функция отключена).

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password
    or
    Sign in via Facebook Sign in via X(Twitter) Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    By signing in, you agree to our terms of service.

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully