chasqui
    • 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

      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.
      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
    • Engagement control
    • 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 Versions and GitHub Sync Note Insights Sharing URL Create Help
Create Create new note Create a note from template
Menu
Options
Engagement control 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

    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.
    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
    Subscribed
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    Subscribe
    --- title: Instalación Servicios Abya Yala (change me!) --- # Instalación de Servicios Web utilizando herramientas "Red Abya Yala" La siguiente guía aborda los pasos necesarios para que con pocos recursos y utilizando las herramientas disponibles en [Red Abya Yala](https://abyaya.la), podamos montar una plataforma web autónoma y segura en Internet. Te recomendamos revisar los requerimientos mínimos en esta guía antes llenar nuestro [formulario de inscripción](https://). ## Nota importante sobre los comandos Los "comandos" son líneas de código que se escriben en el programa "Terminal" de una computadora con el sistema operativo Linux. Para usar un comando, abrimos el programa "Terminal" y veremos una ventana con fondo negro (a veces blanco) donde podemos escribir un comando por línea. Funciona un poco distinto a un editor de texto, con lo que podemos sorprendernos. Por ejemplo, presionar Enter para escribir un salto de línea "envía" el comando, independientemente de donde esté el cursor en la línea. Si usamos las flechas arriba y abajo, podemos revisar comandos anteriores y modificarlos para volver a enviarlos. Es importante tomar nota del resultado de cada comando, porque nos informan de qué cosas sucedieron como resultado, aunque algunos comandos no dan ningún resultado. La mayoría de los comandos que damos de ejemplo en esta guía pueden copiarse y pegarse. Nos gustaría que hagan el intento de escribirlos, para que puedan familiarizarse con su "sintaxis", es decir la forma en que se generan oraciones que tienen sentido para la computadora que interpreta nuestros comandos. :::warning Algunos comandos necesitan adaptación, marcamos las palabras que necesitan modificacion con <font color="#f00">MAYÚSCULA Y EN COLOR ROJO</font>. También lean las indicaciones en los <span style="color: darkblue;"> **#comentarios**, para que no se pierdan nada. ::: ## Requerimientos mínimos Para poder llevar a cabo nuestro objetivo, requeriremos de los siguientes materiales. :::info Una **Computadora** (física o [virtual](https://)) para alojar los servicios, nuestro servidor como tal. - Procesador 2 Ghz 2GB RAM - Sistema Operativo [Ubuntu Server](https://) Una red con **Acceso a Internet** - De preferencia [conexión simétrica](https://) - De preferencia conexión de [fibra óptica](https://) **Acceso a Suministro Eléctrico Estable** - Lo ideal es que un servidor funcione las 24 horas, por ello es importante contar con un suministro eléctrico constante. Utilizar energía solar no es una mala idea. - Un [regulador de voltaje](https://) o [no-break](https://) es altamente recomendable para evitar picos de energía y con ello daños al equipo. **Espacio Físico adecuado** - En tu servidor estará almacenada toda tu información por lo que es importante que lo coloques en un lugar seguro y dónde no sufra[ riesgos de pérdida](https://). - Es importante que el ambiente esté lo más fresco y seco posible, para evitar el [polvo y la humedad](https://) en nuestros equipos. **Computadora Personal** (Terminal de trabajo) - Con acceso a Internet - Sistema Operativo GNU/Linux con SSH de preferencia (si usas Windows, revisa esta [información](https://)) ::: ## Preparando el Servidor Necesitaremos una computadora que utilizaremos como nuestro **servidor**, ya sea física o virtual debe contar con acceso a internet. En ella instalaremos un Sistema Operativo [Ubuntu Server](https://). Una vez acabada la instalación del SO ingresaremos con la usuaria sudo que hemos creado durante la instalación - Lo primero será averiguar que dirección IP tiene asignada la computadora. Anotemos esa información en algún lado ya que nos será útil posteriormente. ```bash hostname -I ``` - Para poder conectarnos remotamente, sin necesidad de teclado y monitor en el servidor, comprobamos que tengamos instalado SSH con ```bash sudo systemctl status ssh ``` Si no tienes instalado ssh puedes hacerlo con el siguiente comando: ``` sudo apt install openssh-server ``` Con estos pasos ya hemos averiguado la ip de nuestro servidor. Ella nos servirá para que nos conectemos remotamente y hagamos todas las instalaciones de los servicios que queremos poner en línea. También nos hemos asegurado que SSH está instalado en la máquina. Ya podemos ubicar el **servidor** en su sitio físico que hemos escogido, recordando que sea un espacio con las condiciones necesarias (electricidad, internet, clima). No es necesario que tenga monitor y teclado conectados a partir de ahora! Aunque siempre viene bien para poder resolver problemas sin acceso a la red. ## Preparando la Terminal de Trabajo Ahora nos cambiamos de equipo y comenzaremos a trabajar en la **Terminal de Trabajo**, que es la computadora personal que utilizaremos para controlar remotamente nuestro servidor. Como dijimos anteriormente en indudablemente mejor contar para esta labor con un sistema operativo GNU/Linux en esta computadora. ### Intercambiar llaves SSH Si bien Abra será nuestra herramienta principal para comunicarnos y controlar el servidor, utiliza **SSH** para la comunicación remota. Por ello haremos algunas modificaciones en SSH (programa que viene pre instalado en Ubuntu Server) para utilizar una comunicación más segura a través de **llaves de cifrado**. - Comenzamos generando nuestro par de Llaves de Cifrado con ```bash ssh-keygen -t ed25519 ``` Aceptamos todas las opciones dando click en `ENTER` - Ahora podemos revisar las llaves SSH que tenemos en nuestra computadora escribiendo ``` ls .ssh ``` Ahí veremos el archivo `id_ed25519` (tu llave privada que no compartes) y el `id_ed25519.pub` (la llave pública que compartes con los demás). - Procedemos a copiar nuestra llave pública en el servidor remoto, donde `USUARIA` es el nombre de usuaria que elegimos durante la instalación e `IP_DEL_SERVIDOR` la dirección IP que vimos antes con `hostname -I` <pre style="color: black; background-color: #f5f5f5; padding: 10px;"> ssh-copy-id <span style="color: red;">USUARIA</span>@<span style="color: red;">IP_DEL_SERVIDOR</span> </pre> Nos pedirá la contraseña sudo de la usuaria del servidor - Ahora podemos logearemos remotamente a nuestro servidor con el siguiente comando, comprobemos que funcione <pre style="color: black; background-color: #f5f5f5; padding: 10px;"> ssh <span style="color: red;">USUARIA</span>@<span style="color: red;">IP_DEL_SERVIDOR</span> </pre> Si todo funciona, hemos intercambiado correctamente entre ambas computadoras sus **llaves de cifrado** por lo que podrán comunicarse de forma más segura. Continuemos con la guía. ## Instalación de la red Común Red Común un tipo de red especial que usan todas las computadoras ("nodos") de la Red Abya Yala. Permite la comunicación de forma segura y que las plataformas web instaladas en los nodos sean visibles al Internet, **sin tener que configurar el enrutador de nuestra conexión o aunque nuestro proveedor de internet (ISP) no nos permita la apertura de puertos**. Técnicamente se conoce como una VPN, pero es un tipo distinto al que quizás conozcamos. Dentro de la red Común, cada nodo tiene una dirección IP dentro del rango `10.13.12.0/24` es decir que las direcciones van desde el `10.13.12.1` hasta el `10.13.12.255` (255 nodos!). Esto es un rango de direcciones IP **privado** es decir que no son accesibles a computadoras fuera de la red común. Es necesario para poder ser parte de red Común, pasar por un proceso de aprobación. Una vez que crees tus nodos, ponte en contacto con nosotres para que revisemos tu aplicación y te demos acceso a la red. Sin esto, los servicios públicos no funcionarán! ### Instalación VPN Los pasos que vienen a continuación deben ser ejecutados en el **servidor** como también en la **terminal de trabajo**. En esta sección descargaremos la VPN y nos daremos de alta en ella, por ello es importante que este proceso lo hagamos en ambos equipos, así nos aseguramos la comunicación entre ellos. En esta guía te encontrarás algunos comandos que requieren modificaciones, adaptándose a las necesidades de cada nodo. Cuando en algún comando veamos `PALABRAS EN MAYÚSCULAS`, quiere decir que esa sección del comando debe ser ajustada a tus necesidades. Por ejemplo cuando aparezca algo como `NOMBRE_DEL_NODO`, ahí debes colocar el nombre escogido para tu nodo. Es importante que a la hora de elegir el nombre del nodo, escogas uno distinto para el servidor y para la terminal de trabajo, es decir **dos nombres distintos**! Como sugerencia, el nombre del nodo servidor puede ser el nombre de la organización (por ejemplo `sutty`) y el nombre de la terminal, el mismo nombre con un indicador de terminal (por ejemplo `suttyterminal`). <pre style="color: black; background-color: #f5f5f5; padding: 10px;"> <span style="color: darkblue;"># Solo para instalar la red comun en el servidor, ignoramos este comando en la terminal de trabajo</span> <span style="color: grey;">1 |</span> ssh <span style="color: red;">USUARIA</span>@<span style="color: red;">IP_DEL_SERVIDOR</span> <span style="color: darkblue;"># Instalar los programas necesarios</span> <span style="color: grey;">2 |</span> sudo apt install git rsync tinc dhcpcd5 -y <span style="color: darkblue;"># Descargar el gestor de la red común</span> <span style="color: grey;">3 |</span> git clone https://git.coopcloud.tech/escuela-comun/rap <span style="color: darkblue;"># Ingresar a la carpeta creada</span> <span style="color: grey;">4 |</span> cd rap <span style="color: darkblue;"># Crear el nodo, el nombre del nodo puede ser cualquier palabra, para el nombre del servidor, podemos usar el nombre de nuestra organización, para el de la terminal de trabajo, el mismo nombre más terminal</span> <span style="color: grey;">5 |</span> NETWORK=comun ./rap init <span style="color: red;">NOMBRE_DEL_NODO</span> <span style="color: darkblue;"># Veremos una lista de cosas sucediendo y una confirmación de que todo salió bien</span> </pre> :::success Recibiremos automáticamente la información de tu nodo, pero ahora debes contactarnos completando el siguiente [formulario de aplicación](https://nube.yanapak.abyaya.la/apps/forms/s/AzP9QbY8JKGTHKsWNcofxr5s) para que podamos darte de alta en la VPN Común. Nos contactaremos con ustedes a la brevedad. ::: Al darse de alta, podrás conocer tu número IP de la red Común con el siguiente comando: ``` ip a show comun ``` y veremos algo así: <pre style="color: black; background-color: #f5f5f5; padding: 10px;"> comun: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 1000 link/ether 5b:16:a8:4b:2p:7b brd ff:ff:ff:ff:ff:ff inet <span style="color: blue;">10.13.12.254</span>/24 brd 10.13.12.255 scope global noprefixroute comun valid_lft forever preferred_lft forever inet6 fe60::1c23:5623:1f4:2c68/64 scope link valid_lft forever preferred_lft forever inet6 fe40::3c94:b5ff:fe7f:2b5a/64 scope link valid_lft forever preferred_lft forever </pre> Nuestra IP válida dentro de la VPN Común será una similar a la que está destacada ## Instalación de Herramientas Abya Yala Dejamos nuestro servidor a un lado y de ahora en adelante trabajaremos todo desde nuestra **terminal de trabajo**. En ella instalaremos un set de aplicaciones (Herramientas Abya Yala) que nos permitirán comunicarnos con el servidor, instalar y controlar todas las aplicaciones necesarias para desplegar los servicios en ella. La idea es manejar remotamente todo lo correspondiente al servidor para que éste pueda estar en un lugar seguro y nosotras trabajar desde un lugar cómodo. ### Instalar Abra Iniciamos instalando Abra en nuestra computadora personal, a través de ella daremos todas las instrucciones remotas a nuestro servidor - En la terminal escribimos (este comando se puede copiar y pegar) ``` curl https://install.abra.coopcloud.tech | bash ``` - Al finalizar la instalación de Abra nos pide que hagamos una modificación para poder ejercutarlo con la palabra `abra`. Para ello debemos ingresar en la terminal la línea que nos entrega el mismo mensaje (este comando se puede copiar y pegar) ```nash= echo 'export PATH=$HOME/.local/bin:$PATH' >> $HOME/.bashrc source ~/.bashrc ``` - Ahora comprobemos que se instaló Abra correctamente escribiendo en la terminal ``` abra ``` - Ahora instalaremos complementos para que Abra tenga funciones adicionales (estos comandos se pueden copiar y pegar línea por línea) ```nash= abra autocomplete bash sudo mkdir -p /etc/bash_completion.d/ sudo cp $HOME/.abra/autocompletion/bash /etc/bash_completion.d/abra echo "source /etc/bash_completion.d/abra" >> ~/.bashrc source ~/.bashrc ``` - Y finalmente comprobaremos que el complemento este en funcionamiento, escribiendo nuevamente <pre style="color: black; background-color: #f5f5f5; padding: 10px;"> <span style="color: grey;">1 |</span> abra <span style="color: darkblue;"># presionar tecla TAB dos veces # si aparece esto es porque el autocompletado funcionó y podemos escribir una parte del texto y autocompletarla presionando tab por cada palabra</span> app autocomplete catalogue recipe server upgrade </pre> Ahora podemos conocer fácilmente qué comandos se pueden ejecutar en Abra. ### Instalar Docker Una vez dentro del servidor de manera remota *a través de SSH con llaves de cifrado*, procederemos a instalar Docker. Este programa es la herramienta de virtualización que estamos usando para los despliege de los servicios. - Por SSH en el servidor remoto escribimos <pre style="color: black; background-color: #f5f5f5; padding: 10px;"> <span style="color: grey;">1 |</span> ssh <span style="color: red;">USUARIA</span>@<span style="color: red;">IP_DEL_SERVIDOR</span> <span style="color: grey;">2 |</span> wget -O- https://get.docker.com | bash </pre> Nos pedirá nuestra contraseña sudo - Una vez finalizada la instalación damos acceso a nuestra usuaria al grupo Docker ``` sudo usermod -aG docker $USER ``` Después de esto cerramos la conexión y abriremos una nueva para que los cambios sobre la usuaria se afecten. - Para ello cerramos la sesión actual ``` exit ``` - y volvemos a acceder remotamente con <pre style="color: black; background-color: #f5f5f5; padding: 10px;"> ssh <span style="color: red;">USUARIA</span>@<span style="color: red;">IP_DEL_SERVIDOR</span> </pre> Con esto hemos iniciado una nueva sesión. - Una vez dentro iniciamos docker swarm ```bash= docker swarm init docker network create -d overlay proxy ``` Con esto ya hemos dejado Docker intalado y preparado en el servidor remoto. Ya podemos volver a nuestra estación de trabajo local - cerramos sesión con ``` exit ``` ### Agregar nodo con Abra En este momento, el **servidor** y la **terminal de trabajo** tienen una dirección IP de la **red Común** pero no hay una relación entre las dos, así que las vincularemos. Primero necesitaremos conocer cuál es el número IP común del servidor, para logeados remotamente en el servido, escribimos: ``` ip a show comun ``` Anotamos la dirección ip que será `10.13.12.X` y terminamos la sesión remota: ``` exit ``` Ahora, en la terminal de trabajo, agregamos los registros necesarios para asociar un dominio al número IP del servidor: <pre style="color: black; background-color: #f5f5f5; padding: 10px;"> <span style="color: grey;">1 | </span>echo "<span style="color: red;">IP_COMUN_SERVIDOR NOMBRE_DEL_NODO</span>.comun" | sudo tee -a /etc/hosts <span style="color: grey;">2 | </span>echo -e "Host<span style="color: red;"> NOMBRE_DEL_NODO</span>.comun\n User <span style="color: red;">USUARIA_DEL_SERVIDOR</span>" >> ~/.ssh/config </pre> Con este paso, podemos contactar al servidor por su nombre, además de por su IP. Y `abra` también Probemos esta función ingresando remotament al servidor con: <pre style="color: black; background-color: #f5f5f5; padding: 10px;"> ssh <span style="color: red;">NOMBRE_DEL_NODO</span>.comun </pre> Si logramos ingresar al servidor quiere decir que está todo bien, podemos salir de ella ``` exit ``` Una vez de vuelta a nuestra computadora personal, procederemos a agregar el nodo (servidor) que tenemos a disposición al listado de servidores manejados por Abra. - Para ello <pre style="color: black; background-color: #f5f5f5; padding: 10px;"> abra server add <span style="color: red;">NOMBRE_DEL_NODO</span>.comun </pre> - Comprobemos que se agregó a la lista con ``` abra server ls ``` y deberíamos ver algo como lo siguiente ``` +-----------------+------------------+---------+------+ | NAME | HOST | USER | PORT | +-----------------+------------------+---------+------+ | NOMBRE_DEL_NODO | NOMBRE_DEL_NODO | usuaria | 22 | +-----------------+------------------+---------+------+ ``` Con estos pasos ya tenemos dado de alta nuestro nodo en el listado de servidores que vamos a manejar con Abra. ### Instalar Traefik Ahora que el servidor está agregado en abra, pasemos a instalar en él **Traefik**. Este programa controlará todo lo que tenga que ver con el tráfico de red de nuestro nodo. En nuestra **terminal de trabajo** escribimos ``` abra app new traefik ``` Nos va a realizar preguntas (en inglés), las líneas que empiezan con `?` son la pregunta y con `>` nuestra respuesta. <pre style="color: black; background-color: #f5f5f5; padding: 10px;"> ? Select app server: > <span style="color: red;">NOMBRE_DEL_NODO</span> ? Specify app domain > traefik.<span style="color: red;">NOMBRE_DEL_NODO</span>.abyaya.la </pre> Ahora configuramos Traefik <pre style="color: black; background-color: #f5f5f5; padding: 10px;"> EDITOR=nano abra app config traefik.<span style="color: red;">NOMBRE_DEL_NODO</span>.abyaya.la </pre> - se abrirá un editor de texto `nano` donde configuramos lo siguiente buscando las líneas que empiezan con `#` (numeral) para denotar comentarios y las "descomentamos" eliminandolo Por ejemplo: <pre style="color: black; background-color: #f5f5f5; padding: 10px;"> <span style="color: darkblue;">#esto es un comentario</span> esto ya no es un comentario </pre> Buscamos las líneas que dicen `LETS_ENCRYPT_ENV=production` y las cambiamos por el texto de la primera línea del ejemplo a continuación, luego eliminamos el `#` al principio de las líneas siguientes. La información debería quedar así: <pre style="color: black; background-color: #f5f5f5; padding: 10px;"> LETS_ENCRYPT_ENV=<span style="color: red;">staging</span> WILDCARDS_ENABLED=1 SECRET_WILDCARD_CERT_VERSION=v1 SECRET_WILDCARD_KEY_VERSION=v1 COMPOSE_FILE="$COMPOSE_FILE:compose.wildcard.yml" </pre> Guardamos presionando `Ctrl` + `O`, `ENTER` y salimos presionando `Ctrl` + `X`, `ENTER` Ahora procederemos a activar los **certificados SSL** en Traefik, éstos permitirán que toda la comunicación efectuada entre la plataforma y sus usuarias este encriptada. #### Certificados internos Para poder asegurar la conectividad entre nuestro nodo y el servidor proxy de Abya Yala, necesitamos emitir certificados SSL/TLS internos. En la terminal de trabajo: <pre style="color: black; background-color: #f5f5f5; padding: 10px;"> <span style="color: darkblue;"># Instalar las dependencias</span> <span style="color: grey;">1 | </span>sudo apt install --no-install-recommends gnutls-bin make git <span style="color: darkblue;"># Descargar el emisor de certificados internos</span> <span style="color: grey;">2 | </span>git clone https://git.coopcloud.tech/escuela-comun/certificados.git ~/certificados <span style="color: darkblue;"> Ingresar al directorio</span> <span style="color: grey;">3 | </span>cd ~/certificados <span style="color: darkblue;"># Generar un certificado y asignárselo a Traefik</span> <span style="color: grey;">4 |</span>make coopcloud domain=<span style="color: red;">NOMBRE_DEL_NODO</span>.abyaya.la </pre> Recibiremos una información de confirmación y podemos seguir con la instalación de Traefik. Si ya has desplegado un nodo antes con esa misma terminal, en vez de descargar el respositorio nuevamente, ingresa a la carpeta `/sutty.local` y ejecuta ``` git pull ``` Con ello actualizarás el repositorio y podrás pasar directo al último comando: <pre style="color: black; background-color: #f5f5f5; padding: 10px;"> make coopcloud domain=<span style="color: red;">NOMBRE_DEL_NODO</span>.abyaya.la </pre> #### Despliegue de Traefik Ya que tenemos todo listos y los certificados SSL asignados, procedemos a desplegar Traefik en el servidor. <pre style="color: black; background-color: #f5f5f5; padding: 10px;"> abra app deploy -D traefik.<span style="color: red;">NOMBRE_DEL_NODO</span>.abyaya.la </pre> Al finalizar, el servicio de traefik que controlará las comunicaciones de nuestros servicios debería estar disponible en la dirección web: <https://traefik.NOMBRE_DEL_NODO.abyaya.la> :::warning Atención: Este paso solo va a funcionar cuando seas parte de VPN Común! ::: Finalizando estos pasos hemos instalado y configurado todas las herramientas necesarias, *tanto en nuestra computadora personal como en el servidor*, que nos permitirán de ahora en adelante, desplegar fácilmente cualquiera de las recetas disponible en nuestro [repositorio de recetas](https://). --- ---

    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

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    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