Build a Local n8n Telegram Relay

Build a local form that sends text and JPEGs to Telegram with backup alerts.

Introduction

30 Second Summary

Publishing an update often begins with copying text between tools. Finding the matching image creates another manual step.

In this project, you will build a local intake relay using n8n, Docker Compose, and Telegram. The finished relay delivers browser form text plus one JPEG to a private Telegram group.

What You'll Build

A single browser submission appears in your private Telegram group as a text message followed by its photo.

By the end of this project, you'll have:

  • A working intake relay that turns required text plus one JPEG into a Telegram message followed by its photo.
  • A tested failure alert that shows the workflow name, failed node, and error details in Telegram.
  • A recoverable local backup you can use to protect your workflows, credentials, uploaded files, and encryption settings.
  • Secret Mission: Add a Priority field that sends an extra Telegram alert only for urgent submissions.

Are there any prerequisites?

You need Docker Desktop plus WSL2 installed on Windows. You also need Telegram and Docker accounts, access to PowerShell, Windows Notepad, and Microsoft Edge, plus one small JPEG.

Before We Start

Before any hands-on setup begins, take a moment to commit to a local intake relay that receives form text plus one JPEG. Telegram provides the first simple destination for that content.

Run a Persistent Local n8n Instance

A disposable container could run your relay. Deleting that container would erase your automation and saved credentials.

You will use Docker Compose to pin n8n to 2.46.6. A named persistent volume keeps the database. It also keeps uploaded binary data. An environment file supplies the encryption key. It also enables disk-backed binary storage.

In this step, get ready to:
  • Create the local deployment configuration.
  • Launch the pinned n8n service with persistent storage.
  • Confirm the local editor loads.
Create the persistent configuration

The compose.yaml file is a YAML blueprint for the local service. The .env file keeps configuration values separate from that blueprint.

  • Press the Windows key to open search.
  • Type Docker Desktop.
  • Press Enter.
  • Wait until Docker Desktop indicates that its engine is ready.

Docker is ready to create the local container and volume.

  • Press Windows+E to open File Explorer.
  • Select Documents in the navigation pane.
  • Select New.
  • Select Folder.
  • Type n8n-local-publisher.
  • Press Enter.

You should see the new n8n-local-publisher folder inside Documents.

  • Press the Windows key to open search.
  • Type Windows Notepad.
  • Press Enter.
  • Paste the following deployment blueprint into the blank document:
services:
  n8n:
    image: n8nio/n8n:2.46.6
    ports:
      - "127.0.0.1:5678:5678"
    env_file:
      - .env
    volumes:
      - n8n_data:/home/node/.n8n
    restart: unless-stopped

volumes:
  n8n_data:
    name: n8n_data

What Does compose.yaml Configure?

  • The image value pins the service to n8nio/n8n:2.46.6.
  • The port mapping exposes the editor through the Windows loopback address.
  • The env_file setting loads configuration from .env.
  • The volume mapping stores n8n data outside the disposable container.
  • The restart policy starts the service again unless you deliberately stop it.
  • Select File in Windows Notepad.
  • Select Save As.
  • Browse to Documents\n8n-local-publisher.
  • Enter compose.yaml in the file name field.
  • Choose the all-files option in the file type menu.
  • Select Save.
  • Return to the n8n-local-publisher folder in File Explorer.

You should see compose.yaml listed in the folder.

Does the File Have a Text Extension?

Check that the file is named compose.yaml. A file named compose.yaml.txt cannot act as the Compose configuration.

Help me fix the Compose filename in Windows Notepad.

  • Create a new blank tab in Windows Notepad.
  • Paste the following environment configuration into the blank tab:
N8N_ENCRYPTION_KEY=replace-with-your-own-random-string
N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
N8N_DEFAULT_BINARY_DATA_MODE=filesystem

What Does .env Configure?

  • N8N_ENCRYPTION_KEY supplies the key that encrypts saved credentials.
  • N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true enables the documented settings-file permission behavior.
  • N8N_DEFAULT_BINARY_DATA_MODE=filesystem stores uploaded binary data on disk.
  • Select File in Windows Notepad.
  • Select Save As.
  • Browse to Documents\n8n-local-publisher.
  • Enter .env in the file name field.
  • Choose the all-files option in the file type menu.
  • Select Save.

The encryption key is the only sensitive value in these files. Keep .env private because the key protects your saved credentials.

  • Replace replace-with-your-own-random-string with a unique random secret that you create.
  • Save .env.
  • Return to the n8n-local-publisher folder in File Explorer.

You should now see compose.yaml plus .env in the folder.

Can't See .env?

Confirm that Windows Notepad saved the file as .env. Remove any added .txt extension.

Help me check my n8n configuration files.

✔️ Awesome, I've got everything!

Your two configuration files are ready. Your local .env now contains the unique secret you created.

ⓧ I'd like to double check the full code

The references below show the supplied configuration. Your local .env must contain your unique secret in place of the encryption-key placeholder.

compose.yaml

services:
  n8n:
    image: n8nio/n8n:2.46.6
    ports:
      - "127.0.0.1:5678:5678"
    env_file:
      - .env
    volumes:
      - n8n_data:/home/node/.n8n
    restart: unless-stopped

volumes:
  n8n_data:
    name: n8n_data

.env

N8N_ENCRYPTION_KEY=replace-with-your-own-random-string
N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
N8N_DEFAULT_BINARY_DATA_MODE=filesystem
Start the n8n service

Docker Compose reads both configuration files from the same folder. It uses them to create the pinned container and the named Docker volume.

  • Return to the File Explorer window showing n8n-local-publisher.
  • Select the File Explorer address bar.
  • Type PowerShell.
  • Press Enter.

PowerShell opens with n8n-local-publisher as its current folder.

The first launch downloads the pinned image, so the terminal may stay busy for a few minutes. That activity is expected.

  • Create the volume and start the n8n service by running this command:
docker compose up -d

What Does This Command Do?

The command starts the services from compose.yaml in detached mode. PowerShell returns to its prompt while n8n keeps running.

Compose pulls n8nio/n8n:2.46.6 when needed. It also creates the n8n_data volume for persistent state.

PowerShell should return to its prompt after the service starts. Your container can now keep running in the background.

Service Didn't Start?

Confirm that Docker Desktop is still running. Check that PowerShell is open inside the folder containing both configuration files.

Check the indentation in compose.yaml against the full-code reference. YAML uses indentation to group each setting.

Help me troubleshoot why docker compose up did not start n8n.

Verify the local n8n editor

The local editor proves that the container is accepting browser requests. Owner setup creates the account you use to manage this n8n instance.

  • Press the Windows key to open search.
  • Type Microsoft Edge.
  • Press Enter.
  • Enter http://localhost:5678 in the address bar.
  • Press Enter.

You should see the n8n owner setup page or the workflow editor.

  • Complete the owner setup form if n8n prompts you.
  • Sign in if n8n asks for your local owner credentials.

That is the local editor working. Your browser can now reach the loopback-only n8n service.

Before you check the container status, what do you expect PowerShell to report for the n8n service?

  • Switch back to the PowerShell window from earlier.
  • Confirm the service status by running this command:
docker compose ps

What Should You See?

The n8n service appears with a running status. The ports information shows port 5678 bound to 127.0.0.1.

This confirms that Compose started the service. The loaded editor confirms that n8n is responding through the local port.

Editor or Service Missing?

Confirm that Docker Desktop is running. Keep PowerShell inside Documents\n8n-local-publisher when you run the Compose commands.

Check that compose.yaml maps port 5678 to the loopback address. Confirm that no filename has an added .txt extension.

Help me diagnose why my local n8n editor is not loading.

Your persistent n8n foundation is live. The service now has pinned code, disk-backed binary storage, encrypted credentials, and a named data volume.

Your local n8n instance now keeps its state across container restarts. Next, you will build the intake form and send its submitted text to Telegram.

Send Form Text to Telegram

Your local n8n editor is running with persistent storage. The next goal is to move a real form submission into a private Telegram group.

You will intentionally wire the form's text path first. A test submission with text plus one JPEG reveals how JSON fields and binary data travel through the workflow.

In this step, get ready to:
  • Create a private Telegram test group with a bot.
  • Build an intake form that accepts required text plus one JPEG.
  • Send the submitted text to the group during a test execution.
Create the Telegram destination

A Telegram bot sends messages using a private token. The group's numeric Chat ID tells the bot where each message belongs.

  • Open Telegram using the app or browser you normally use.
  • Create a Telegram account through its sign-up flow if you do not already have one.
  • Sign in to your Telegram account.
  • Create a private test group for this project.
  • Search for @BotFather.
  • Open the chat whose username matches @BotFather.

Keep the Bot Token Private

The token controls your bot. Anyone who gets it can act as the bot.

  • Keep the token out of screenshots.
  • Send /newbot to BotFather.
  • Complete BotFather's prompts for the new bot.
  • Copy the generated token to a private temporary location.
  • Add the new bot to your private test group.

Telegram Web includes the group's identifier in the browser address. n8n expects the digits after g with a leading -.

  • Switch to Telegram Web in your browser.
  • Open your private test group.
  • Read the group address in the browser address bar.
  • Copy the digits that appear after g.
  • Place - before the copied digits.
  • Record the finished Chat ID here: your Telegram group Chat ID.

Good progress. Your private group now has a bot destination that n8n can target.

Build the intake workflow

The n8n Form Trigger turns a browser form into workflow input. Each Field Name becomes the identifier used by later nodes.

  • Return to the local n8n editor in Microsoft Edge.
  • Create a new workflow for the intake relay.
  • Add n8n Form Trigger as the first node.

The workflow canvas now starts with the form trigger that receives each submission.

  • Add a text form element.
  • Enter Content Text in Field Label.

The first form element now has the label your submitter sees.

  • Enter content_text in Field Name.
  • Turn on Required Field.

Why Does the Field Name Matter?

The label is visible on the form. The field name becomes the key that carries the submitted value through the workflow.

Later nodes can read the text from content_text.

  • Add a second form element.
  • Enter Image in Field Label.

The form configuration now includes a separate element for the uploaded image.

  • Enter image in Field Name.
  • Set Element Type to File.

The second element now accepts a file instead of typed text.

  • Set the accepted file types to .jpg,.jpeg.
  • Leave multiple files disabled.

The file element now accepts one JPEG per submission.

  • Turn on Required Field for the image element.

How Does the Form Store Each Value?

  • The text field appears in the workflow data as content_text.
  • The uploaded file appears separately in the binary field named image.

The bot token becomes an n8n credential. n8n encrypts the saved token using the custom encryption key from your local configuration.

  • Add a Telegram node directly after the Form Trigger.
  • Create a new Telegram credential from the node's credential selector.

The credential form now provides the field where n8n stores the bot token.

  • Paste the bot token into Access Token.
  • Save the Telegram credential.

The Telegram node now shows the saved credential as its active connection.

Credential Not Accepted?

  • Copy the token from the BotFather chat again.
  • Remove any spaces before the token in Access Token.
  • Confirm that the complete token was pasted.

Ask for help if the credential still fails: help me troubleshoot my n8n Telegram credential without sharing my bot token.

Test the text relay

The Telegram node needs a message operation plus a destination. Its Text field controls the content sent to the group.

  • Set Resource to Message.
  • Set Operation to Send Message.

The node now displays the destination and message fields required by this operation.

  • Select the Telegram credential you just saved.
  • Enter your Telegram group Chat ID in Chat ID.

The node now targets your private test group.

  • Map content_text from the form input into Text.

Before you test, what do you expect the group to receive from a submission that includes both field types?

  • Select Execute Workflow.
  • Open the Form Trigger's Test URL.
  • Enter Testing my local n8n relay. in Content Text.
  • Attach one small JPEG in Image.
  • Submit the form.

In Telegram, you will see Testing my local n8n relay. as a text message. The JPEG does not appear.

Your first end-to-end relay works. The missing photo exposes the exact boundary that the next step addresses.

  • Return to the workflow editor.
  • Select the Form Trigger output from the completed execution.
  • Inspect the binary field named image.

You will see the uploaded file's metadata under image. This proves the form received the JPEG even though Telegram received only the mapped text.

Why Did the JPEG Stay Behind?

The Send Message node received only content_text through its Text mapping. That operation sends a text message.

The JPEG remains available in the binary field named image. Sending it requires an explicit binary file mapping.

No Text Message or Binary Image?

  • Confirm that the bot is a member of the private test group.
  • Verify that your Telegram group Chat ID includes its leading -.
  • Recheck that the file element's Field Name is image.

Ask for targeted help: help me debug my n8n form-to-Telegram test without exposing my bot token.

Your intake relay now delivers form text to Telegram while preserving the uploaded JPEG in the workflow. Next, you will map that binary field into a photo message.

Relay the Uploaded JPEG

Your intake workflow already sends form text to Telegram. That result proved the text path works.

The previous test also exposed the missing half. n8n kept the JPEG under the binary field image. The message node had no file mapping.

Form text travels as JSON data. Uploaded files travel as binary data, so they need an explicit field mapping.

You'll connect a photo node after the text node. The same form submission will then reach Telegram as a message followed by its JPEG.

In this step, get ready to:
  • Confirm the uploaded JPEG is stored under the binary field image.
  • Configure a second Telegram node to send the binary file as a photo.
  • Verify one submission produces a text message followed by a JPEG photo.
Inspect the uploaded binary field

The previous test contains evidence that the form captured the JPEG. Checking that output confirms the field name needed by the photo node.

  • Switch back to the intake workflow in the local n8n editor.
  • Select the n8n Form Trigger node from the previous test execution.
  • Inspect the file output for a binary field named image.

You should see image with the JPEG file metadata. This proves the form captured the upload before the Telegram text node left it unsent.

Add the Telegram photo node

The Telegram photo operation needs the binary field name that carries the upload. Setting Input Binary Field to image connects that operation to the JPEG captured by the form.

  • Return to the intake workflow canvas.
  • Add a second Telegram node from the output connector on the existing text message node.

You should now see a three-node path from the form to the text message node to the new Telegram node.

  • Select Message for Resource.
  • Select Send Photo for Operation.

You should now see the photo-specific settings in the node panel.

  • Use the Telegram credential from earlier for this node.
  • Turn on Binary File.

The Input Binary Field setting now appears.

  • Enter image in Input Binary Field.

The photo node now points to the exact binary field produced by the form.

Can't Find the Binary Field Setting?

  • Confirm that Resource is set to Message.
  • Confirm that Operation is set to Send Photo.
  • Turn on Binary File to reveal Input Binary Field.

Help me find the binary photo settings in my Telegram node.

Test the complete relay

One test now exercises both paths from the same form submission. Before you submit it, which Telegram item do you expect to arrive first?

  • Select Execute Workflow.

The workflow should wait for a submission from the form test link.

  • Open the Test URL for the n8n Form Trigger.
  • Enter JPEG relay test in Content Text.
  • Upload the same JPEG in Image.
  • Submit the form.

You should see all three workflow nodes finish successfully.

  • Select the n8n Form Trigger node in the completed execution.

You should still see the JPEG metadata under the binary field image.

  • Switch back to the private Telegram test group.

You should see JPEG relay test followed by the uploaded JPEG photo. The arrival order confirms the photo node runs after the text node.

Text Arrived Without the Photo?

  • Confirm that Binary File remains enabled in the photo node.
  • Verify that Input Binary Field contains image with matching lowercase letters.
  • Verify that the photo node is connected after the text message node.

Help me troubleshoot why my Telegram text arrives without the JPEG.

You have the complete relay now. One form submission reaches Telegram as readable text followed by its JPEG.

Your intake workflow now handles both JSON text and binary images. Next, you'll build a separate alert path that reports failed production runs to Telegram.

Send Workflow Failures to Telegram

Your n8n intake workflow now sends submitted text to Telegram. It also relays the uploaded JPEG.

An unattended publisher needs a visible signal when a production execution fails. A silent failure could leave a submission stuck with no clue about the cause.

You will build a separate error workflow for those failures. Its Telegram alert gives you three details: the workflow name, the failed node, and the error message.

In this step, get ready to:
  • Build a Telegram Error Handler workflow that maps the important failure details.
  • Link the error handler to failed production executions from the intake workflow.
  • Prove the alert with a controlled production failure before restoring the working relay.
Create the Telegram error workflow

An Error Trigger starts when a linked workflow fails in production. A dedicated handler turns that failure data into one reusable alert path.

  • Select Personal in the n8n left menu.
  • Select Create workflow in the upper-right corner.

You should see a blank workflow canvas in your personal space.

  • Select the workflow name in the canvas header.
  • Replace the current name with Telegram Error Handler.

The canvas header should now show Telegram Error Handler.

  • Select an empty area of the canvas to save the name.
  • Select Add first step.
  • Enter Error Trigger in the nodes panel search.

The nodes panel should filter down to the production failure trigger.

  • Select Error Trigger from the results.

You should see the Error Trigger on the canvas. This node receives the failure payload from the intake workflow.

  • Select the Add node connector on the Error Trigger.
  • Enter Telegram in the nodes panel search.

The nodes panel should now show the Telegram integration.

  • Select Telegram from the results.
  • Set Resource to Message.
  • Set Operation to Send Message.

The node should now show the fields needed to send a Telegram text message.

  • Select your existing Telegram credential.
  • Enter the same private group Chat ID from the intake workflow in Chat ID.

The error node now points to the same private test group as the working relay.

  • Use the input mapping panel to insert workflow.name into Text.
  • Press Enter in Text to start a new line.

The first line now identifies which workflow failed.

  • Use the input mapping panel to insert execution.lastNodeExecuted on the second line.
  • Press Enter to start a third line.

The second line now identifies the node that ran immediately before the failure.

  • Use the input mapping panel to insert execution.error.message on the third line.
  • Return to the workflow canvas.

You should see the Error Trigger connected to the Telegram message node.

What Do These Fields Tell You?

  • The workflow.name field identifies the automation that failed.
  • The execution.lastNodeExecuted field identifies where the execution stopped.
  • The execution.error.message field provides the reported cause.
Link the error workflow

The handler becomes useful when the intake workflow points to it. Saving failed production executions preserves the failure details that the handler needs.

  • Return to the intake workflow from earlier.
  • Select Options on the workflow canvas.
  • Select Settings.

The workflow settings should show controls for error handling and execution data.

  • Select Telegram Error Handler under Error workflow.
  • Enable saving for failed production executions if it is currently disabled.

The intake workflow now routes saved production failures to Telegram Error Handler.

Prove the alert with a production failure

The Error Trigger receives production failures. Manual workflow errors bypass this alert path.

Why Use the Production URL?

A submission through the Production URL runs the published workflow version. This gives the Error Trigger a real production failure to process.

  • Find the connection immediately after the Form Trigger on the intake workflow canvas.
  • Select the Add node connector on that connection.
  • Enter Stop And Error in the nodes panel search.

The nodes panel should show the deliberate failure node.

  • Select Stop And Error from the results.
  • Set Error Type to Error Message.
  • Enter ALERT_TEST in Error Message.

The temporary node should now sit immediately after the Form Trigger. It stops the production execution before the normal Telegram nodes run.

  • Select Publish in the canvas header.
  • Select Publish in the confirmation dialog.

The published intake version now contains the temporary failure node.

  • Open the Form Trigger.
  • Open its Production URL in Microsoft Edge.

You should see the published intake form with its text and image fields.

  • Enter Failure alert test in Content Text.
  • Attach the same JPEG test image to Image.

Before you submit the form, which workflow details do you expect the failure alert to reveal?

  • Submit the production form.

Telegram should receive an alert that names your intake workflow. The alert should also show Stop And Error and ALERT_TEST.

The normal text and photo stay unsent because the temporary stop ends the execution first. That controlled failure proves your safety net works.

No Telegram Failure Alert?

  • Confirm that you submitted through the Production URL.
  • Confirm that Telegram Error Handler is selected under Error workflow.
  • Confirm that failed production executions are being saved.

Ask for help with the settings that connect the production failure to the handler: help me troubleshoot why my n8n Error Trigger did not send a Telegram alert.

Deleting the temporary node is safe because its only purpose was this test. The next publish restores the working relay.

  • Switch back to the intake workflow in the n8n editor.
  • Delete Stop And Error using its Delete node canvas control.
  • Connect the Form Trigger output to the existing text Telegram node.

The canvas should show the Form Trigger feeding the text Telegram node. The photo Telegram node should remain after it.

The Stop And Error node should be gone from the canvas.

  • Select Publish in the canvas header.
  • Select Publish in the confirmation dialog.

The published version now uses the working text-and-photo path. Your error workflow remains linked for future production failures.

Your intake relay now reports failures without disrupting its normal delivery path. Next, you will export the n8n_data volume and preserve the deployment files needed for recovery.

Export a Recoverable Backup

Your intake relay now sends text plus photos to the private Telegram group. Its error workflow also reports failed production runs.

Your local n8n state lives inside the persistent volume. That state includes the SQLite database, credentials, encryption material, and filesystem binary data.

A recoverable backup needs that persistent volume plus the deployment configuration. You will store all three backup pieces in one private folder.

In this step, get ready to:
  • Export the n8n_data volume through Docker Desktop.
  • Preserve the Docker Compose files that define the deployment.
  • Confirm the restarted service still contains your workflows and Telegram credential.
Export the n8n volume

A volume export captures the managed data stored in n8n_data. Docker Desktop briefly stops services using the volume during this process.

Signing in enables Docker Desktop to complete the local export. Your n8n data remains on your computer throughout the process.

  • Switch back to Docker Desktop from earlier.
  • Sign in to Docker Desktop if the account area shows that you are signed out.
  • Select Volumes in the left sidebar.
  • Select the n8n_data volume.
  • Open the Exports tab.
  • Select Quick export.

The export destination determines where your recovery copy lives. Use a private local folder that you can find again.

  • Select Local file.
  • Choose your private backup folder as the destination.
  • Enter your backup file name for the export.

Docker Desktop temporarily stops the n8n service while it captures the volume. It restarts the service after the export finishes.

  • Select Save to start the export.

The export log should record a successful completion. Docker Desktop then restarts the n8n service.

That is the data layer protected. Your database, workflows, credentials, and uploaded binary data now have a local recovery copy.

Export not completing?

Confirm that Docker Desktop is signed in. Check that n8n_data is the selected volume.

A folder permission issue can also prevent Docker Desktop from writing the backup file. Choose another private local folder if the export cannot save.

Help me troubleshoot the Docker Desktop volume export.

Copy the deployment configuration

The volume contains the n8n application state. The existing compose.yaml and .env files preserve the configuration needed to run that state.

This is the sensitive part of the backup. The .env file contains N8N_ENCRYPTION_KEY, which is required to decrypt restored credentials.

  • Press Windows key+E to open File Explorer.
  • Navigate to Documents\n8n-local-publisher.
  • Select compose.yaml.
  • Hold Ctrl while selecting .env.
  • Press Ctrl+C to copy both selected files.
  • Navigate to your private backup folder.
  • Press Ctrl+V to paste the files.
  • Confirm the folder lists your backup file name, compose.yaml, and .env.

Your private backup folder now holds the volume data plus the two files needed to reproduce the deployment. The encryption key stays beside the data it protects.

Missing a backup file?

Return to Documents\n8n-local-publisher if either configuration file is missing. Select both files before copying them again.

Confirm that you pasted into your private backup folder instead of the original project folder.

Help me find the missing backup file.

✔️ Awesome, I've got everything!

Your private backup folder contains the volume export, compose.yaml, and the secret .env copy.

ⓧ I'd like to double check the full code

Compare the copied configuration files with these complete references.

compose.yaml

services:
  n8n:
    image: n8nio/n8n:2.46.6
    ports:
      - "127.0.0.1:5678:5678"
    env_file:
      - .env
    volumes:
      - n8n_data:/home/node/.n8n
    restart: unless-stopped

volumes:
  n8n_data:
    name: n8n_data

This file pins the n8n image, publishes the editor on loopback, loads the environment file, and mounts the persistent volume.

.env

N8N_ENCRYPTION_KEY=replace-with-your-own-random-string
N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
N8N_DEFAULT_BINARY_DATA_MODE=filesystem

This reference shows the source placeholder for N8N_ENCRYPTION_KEY. Your existing file keeps the unique value you created before the first launch.

Verify the live service after export

A backup is useful when the source instance remains healthy after capture. The final check confirms that Docker Desktop restarted the service without changing its stored state.

Before you refresh the editor, do you expect the workflows and credential to remain available after the volume export?

  • Return to the Microsoft Edge tab from earlier at http://localhost:5678.
  • Refresh the page.

You should see the n8n editor load successfully. This confirms that the service restarted after the export.

  • Confirm the working intake workflow remains in the workflow list.
  • Confirm Telegram Error Handler remains in the workflow list.
  • Confirm the Telegram credential remains in the credential list.
  • Return to the Exports view for n8n_data in Docker Desktop.
  • Confirm the export log records a successful local export.

You should see both workflows plus the Telegram credential in n8n. You should also see the completed export in Docker Desktop.

You now have a recoverable local backup without disrupting the relay. The volume export protects the instance data while the copied configuration preserves the settings needed to run it.

Secret mission

Flag Urgent Submissions

Add a required priority choice that preserves the normal text-and-photo relay. Only urgent submissions trigger an extra Telegram alert.

Clean Up Your Resources

Clean Up Your Resources

Decide whether to keep your local resources running, pause them for later, or delete them entirely. The project created no paid cloud resources, so its local n8n service has no incremental usage cost.

Docker Desktop Licensing

Docker Desktop licensing depends on the organization using it. This project assumed you already had a properly licensed installation.

Resources you used:

  • Local Docker Compose service n8n with the persistent volume n8n_data.
  • Local Documents\n8n-local-publisher folder containing compose.yaml plus the secret .env file.
  • Private backup folder containing the Docker volume export plus copies of compose.yaml and .env.

Keep everything running

No action needed. Choose this if you plan to continue building the local intake relay.

  • Keep Docker Desktop running so the local n8n editor remains available.
  • Keep the Documents\n8n-local-publisher folder private because .env contains your encryption key.
  • Keep the private backup folder in a secure location.
  • Remember that the existing backup restores the base relay. It predates the Priority branch from the Secret Mission.

Pause - I'll come back to this later

Stop the local service to free up system resources while preserving your workflows, credentials, and uploaded binary data.

  • Open PowerShell in the Documents\n8n-local-publisher folder.
  • Stop the n8n service while preserving its data by running this command:
docker compose stop

What Does This Command Do?

This command stops n8n without removing its container or the n8n_data volume. Your local automation remains ready for the next time you start it.

  • Return to Docker Desktop.
  • Confirm that the n8n container is stopped.
  • Confirm that the n8n_data volume remains listed.

Your relay is safely paused. Its workflows and credentials remain stored in the named volume.

Service Still Running?

  • Confirm that PowerShell is using the Documents\n8n-local-publisher folder.
  • Confirm that Docker Desktop is running.
  • Ask for help diagnosing the stop command.

Delete - I don't want to use this again

Deleting n8n_data is permanent, so take a moment before continuing. Your existing backup is a temporary recovery point for the base relay because it predates the Priority branch.

  • Confirm that your existing private backup folder contains the volume export plus copies of compose.yaml and .env.
  • Open PowerShell in the Documents\n8n-local-publisher folder.
  • Remove the Compose service plus the n8n_data volume by running this command:
docker compose down --volumes

What Does This Command Remove?

This command removes the Compose container, its network, and the named volume. Volume deletion has no undo.

  • Return to Docker Desktop.
  • Confirm that the n8n container is no longer listed.
  • Confirm that the n8n_data volume is no longer listed.

Cleanup Command Failed?

  • Confirm that PowerShell is using the folder containing compose.yaml.
  • Confirm that Docker Desktop is running before retrying the command.
  • Ask for help diagnosing the cleanup command.
  • Delete the Documents\n8n-local-publisher folder with your Windows file manager.
  • Delete the volume export from your existing private backup folder with your Windows file manager.
  • Delete the copied compose.yaml file from your existing private backup folder with your Windows file manager.
  • Delete the secret .env file from your existing private backup folder with your Windows file manager.
  • Confirm that both locations no longer contain the project files.

That clears the local service, persistent data, configuration, and backup files. Your local n8n project is now removed.

What Remains Outside n8n?

Your Telegram bot and private test group remain in Telegram. The n8n Telegram credential was removed with the deleted n8n_data volume.

The downloaded container image can remain in Docker Desktop after this cleanup.

Nice Work!

Nice Work!

You did it! Your local n8n intake relay now delivers form text plus one JPEG to Telegram.

You've learned how to:

  • Built a local intake relay for required text plus one JPEG. Moved the text as JSON. Mapped the JPEG from the binary data field image.
  • Built a reusable production error workflow. Its Telegram alert includes workflow.name. It also includes execution.lastNodeExecuted. It includes execution.error.message too.
  • Exported the n8n persistent volume through Docker Desktop. Kept compose.yaml beside the volume export. Kept the secret .env there too.
  • Completed the optional Secret Mission with conditional branching. Only urgent submissions send the extra Telegram alert.

Ready to quiz yourself?