-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathindex.html
More file actions
68 lines (62 loc) · 48 KB
/
index.html
File metadata and controls
68 lines (62 loc) · 48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<!doctype html>
<html lang="en" dir="ltr" class="blog-wrapper blog-list-page plugin-blog plugin-id-default" data-has-hydrated="false">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v3.9.2">
<title data-rh="true">Blog | Vue & Node admin panel framework</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://adminforth.dev/img/og.jpg"><meta data-rh="true" name="twitter:image" content="https://adminforth.dev/img/og.jpg"><meta data-rh="true" property="og:url" content="https://adminforth.dev/blog/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" property="og:title" content="Blog | Vue & Node admin panel framework"><meta data-rh="true" name="description" content="Blog"><meta data-rh="true" property="og:description" content="Blog"><meta data-rh="true" name="docusaurus_tag" content="blog_posts_list"><meta data-rh="true" name="docsearch:docusaurus_tag" content="blog_posts_list"><link data-rh="true" rel="icon" href="/img/favicon.png"><link data-rh="true" rel="canonical" href="https://adminforth.dev/blog/"><link data-rh="true" rel="alternate" href="https://adminforth.dev/blog/" hreflang="en"><link data-rh="true" rel="alternate" href="https://adminforth.dev/blog/" hreflang="x-default"><link data-rh="true" rel="preconnect" href="https://VSIPOF54AV-dsn.algolia.net" crossorigin="anonymous"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"Blog","@id":"https://adminforth.dev/blog","mainEntityOfPage":"https://adminforth.dev/blog","headline":"Blog","description":"Blog","blogPost":[{"@type":"BlogPosting","@id":"https://adminforth.dev/blog/k3s-ec2-deployment","mainEntityOfPage":"https://adminforth.dev/blog/k3s-ec2-deployment","url":"https://adminforth.dev/blog/k3s-ec2-deployment","headline":"IaC Simplified: K3s on EC2 Deployments with Terraform, Helm, Ansible & Amazon ECR","name":"IaC Simplified: K3s on EC2 Deployments with Terraform, Helm, Ansible & Amazon ECR","description":"The ultimate step-by-step guide to cost-effective, build-time-efficient, and easy managable EC2 deployments using K3s, Terraform, Helm, Ansible, and a Amazon ECR registry.","datePublished":"2025-11-04T00:00:00.000Z","author":{"@type":"Person","name":"Kyrylo Doropii","description":"DevOps Engineer of AdminForth","url":"https://github.com/kirilldorr","image":"https://avatars.githubusercontent.com/u/181721742?s=96&v=4"},"keywords":[]},{"@type":"BlogPosting","@id":"https://adminforth.dev/blog/context7-setup-vscode","mainEntityOfPage":"https://adminforth.dev/blog/context7-setup-vscode","url":"https://adminforth.dev/blog/context7-setup-vscode","headline":"How to set up Context7 MCP in Visual Studio Code","name":"How to set up Context7 MCP in Visual Studio Code","description":"Context7 MCP installation guide","datePublished":"2025-10-21T00:00:00.000Z","author":{"@type":"Person","name":"Yaroslav Pechorkin","description":"Developer of AdminForth","url":"https://github.com/yaroslav8765","image":"https://avatars.githubusercontent.com/u/189334989?v=4"},"keywords":[]},{"@type":"BlogPosting","@id":"https://adminforth.dev/blog/dynamic-strings-translation","mainEntityOfPage":"https://adminforth.dev/blog/dynamic-strings-translation","url":"https://adminforth.dev/blog/dynamic-strings-translation","headline":"How to translate dynamic strings in AdminForth API","name":"How to translate dynamic strings in AdminForth API","description":"Simple example of how to translate dynamic strings from database in AdminForth API","datePublished":"2025-04-10T00:00:00.000Z","author":{"@type":"Person","name":"Ivan Borshchov","description":"Maintainer of AdminForth","url":"https://github.com/ivictbor","image":"https://avatars.githubusercontent.com/u/1838656?v=4"},"keywords":[]},{"@type":"BlogPosting","@id":"https://adminforth.dev/blog/keycloak-setup-example","mainEntityOfPage":"https://adminforth.dev/blog/keycloak-setup-example","url":"https://adminforth.dev/blog/keycloak-setup-example","headline":"Setup AdminForth Authorization via Keycloak","name":"Setup AdminForth Authorization via Keycloak","description":"The ultimate guide to setting up AdminForth authorization via Keycloak","datePublished":"2025-03-25T00:00:00.000Z","author":{"@type":"Person","name":"Maksym Pipkun","description":"Developer of AdminForth","url":"https://github.com/NoOne7135","image":"https://avatars.githubusercontent.com/u/120279695?v=4"},"keywords":[]},{"@type":"BlogPosting","@id":"https://adminforth.dev/blog/compose-aws-ec2-ecr-terraform-github-actions","mainEntityOfPage":"https://adminforth.dev/blog/compose-aws-ec2-ecr-terraform-github-actions","url":"https://adminforth.dev/blog/compose-aws-ec2-ecr-terraform-github-actions","headline":"IaaC Simplified: Amazon EC2 Deployments with GitHub Actions, Terraform, Docker & Amazon ECR","name":"IaaC Simplified: Amazon EC2 Deployments with GitHub Actions, Terraform, Docker & Amazon ECR","description":"The ultimate step-by-step guide to cost-effective, build-time-efficient, and easy managable EC2 deployments using GitHub Actions, Terraform, Docker, and a Amazon ECR registry.","datePublished":"2025-02-19T00:00:00.000Z","author":{"@type":"Person","name":"Ivan Borshchov","description":"Maintainer of AdminForth","url":"https://github.com/ivictbor","image":"https://avatars.githubusercontent.com/u/1838656?v=4"},"image":{"@type":"ImageObject","@id":"https://adminforth.dev/ogs/ga-tf-ecr.jpg","url":"https://adminforth.dev/ogs/ga-tf-ecr.jpg","contentUrl":"https://adminforth.dev/ogs/ga-tf-ecr.jpg","caption":"title image for the blog post: IaaC Simplified: Amazon EC2 Deployments with GitHub Actions, Terraform, Docker & Amazon ECR"},"keywords":[]},{"@type":"BlogPosting","@id":"https://adminforth.dev/blog/compose-ec2-deployment-github-actions-registry","mainEntityOfPage":"https://adminforth.dev/blog/compose-ec2-deployment-github-actions-registry","url":"https://adminforth.dev/blog/compose-ec2-deployment-github-actions-registry","headline":"Amazon EC2 Deployments with GitHub Actions, Terraform, Docker & Self-hosted Registry","name":"Amazon EC2 Deployments with GitHub Actions, Terraform, Docker & Self-hosted Registry","description":"The ultimate step-by-step guide to cost-effective, build-time-efficient, and easy managable EC2 deployments using GitHub Actions, Terraform, Docker, and a self-hosted registry.","datePublished":"2025-02-19T00:00:00.000Z","author":{"@type":"Person","name":"Ivan Borshchov","description":"Maintainer of AdminForth","url":"https://github.com/ivictbor","image":"https://avatars.githubusercontent.com/u/1838656?v=4"},"image":{"@type":"ImageObject","@id":"https://adminforth.dev/ogs/ga-tf-aws.jpg","url":"https://adminforth.dev/ogs/ga-tf-aws.jpg","contentUrl":"https://adminforth.dev/ogs/ga-tf-aws.jpg","caption":"title image for the blog post: Amazon EC2 Deployments with GitHub Actions, Terraform, Docker & Self-hosted Registry"},"keywords":[]},{"@type":"BlogPosting","@id":"https://adminforth.dev/blog/how-i-opensourced-my-secret-tokens","mainEntityOfPage":"https://adminforth.dev/blog/how-i-opensourced-my-secret-tokens","url":"https://adminforth.dev/blog/how-i-opensourced-my-secret-tokens","headline":"How I Open-Sourced My Secret Access Tokens from GitHub, Slack, and NPM — and Who Actually Cares","name":"How I Open-Sourced My Secret Access Tokens from GitHub, Slack, and NPM — and Who Actually Cares","description":"Our framework has a CI pipeline that runs npm run build, publishes the package to NPM (npm publish), and creates a new release on GitHub. It also sends a notification about the release to a Slack webhook for our team.","datePublished":"2025-01-24T00:00:00.000Z","author":{"@type":"Person","name":"Ivan Borshchov","description":"Maintainer of AdminForth","url":"https://github.com/ivictbor","image":"https://avatars.githubusercontent.com/u/1838656?v=4"},"keywords":[]},{"@type":"BlogPosting","@id":"https://adminforth.dev/blog/why-manual-release-notes-and-versions-are-a-chaos-and-how-to-fix-it","mainEntityOfPage":"https://adminforth.dev/blog/why-manual-release-notes-and-versions-are-a-chaos-and-how-to-fix-it","url":"https://adminforth.dev/blog/why-manual-release-notes-and-versions-are-a-chaos-and-how-to-fix-it","headline":"Why manual Release Notes and Versions are a chaos and how to fix it","name":"Why manual Release Notes and Versions are a chaos and how to fix it","description":"Learn what profits you can get from automatic versioning and learn how simply you can configure it!","datePublished":"2025-01-19T00:00:00.000Z","author":{"@type":"Person","name":"Ivan Borshchov","description":"Maintainer of AdminForth","url":"https://github.com/ivictbor","image":"https://avatars.githubusercontent.com/u/1838656?v=4"},"image":{"@type":"ImageObject","@id":"https://adminforth.dev/ogs/autover.jpg","url":"https://adminforth.dev/ogs/autover.jpg","contentUrl":"https://adminforth.dev/ogs/autover.jpg","caption":"title image for the blog post: Why manual Release Notes and Versions are a chaos and how to fix it"},"keywords":[]},{"@type":"BlogPosting","@id":"https://adminforth.dev/blog/backup-database-to-aws-glacier","mainEntityOfPage":"https://adminforth.dev/blog/backup-database-to-aws-glacier","url":"https://adminforth.dev/blog/backup-database-to-aws-glacier","headline":"Backup database to AWS Glacier","name":"Backup database to AWS Glacier","description":"Every reliable system requires a backup strategy.","datePublished":"2024-12-11T00:00:00.000Z","author":{"@type":"Person","name":"Ivan Borshchov","description":"Maintainer of AdminForth","url":"https://github.com/ivictbor","image":"https://avatars.githubusercontent.com/u/1838656?v=4"},"keywords":[]},{"@type":"BlogPosting","@id":"https://adminforth.dev/blog/compose-ec2-deployment-github-actions","mainEntityOfPage":"https://adminforth.dev/blog/compose-ec2-deployment-github-actions","url":"https://adminforth.dev/blog/compose-ec2-deployment-github-actions","headline":"Deploy AdminForth to EC2 with terraform on CI","name":"Deploy AdminForth to EC2 with terraform on CI","description":"Here is more advanced snippet to deploy AdminForth to Terraform.","datePublished":"2024-11-14T00:00:00.000Z","author":{"@type":"Person","name":"Ivan Borshchov","description":"Maintainer of AdminForth","url":"https://github.com/ivictbor","image":"https://avatars.githubusercontent.com/u/1838656?v=4"},"keywords":[]}]}</script><link rel="alternate" type="application/rss+xml" href="/blog/rss.xml" title="Vue & Node admin panel framework RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Vue & Node admin panel framework Atom Feed">
<link rel="preconnect" href="https://www.google-analytics.com">
<link rel="preconnect" href="https://www.googletagmanager.com">
<script async src="https://www.googletagmanager.com/gtag/js?id=G-7K99Q2BH04"></script>
<script>function gtag(){dataLayer.push(arguments)}window.dataLayer=window.dataLayer||[],gtag("js",new Date),gtag("config","G-7K99Q2BH04",{anonymize_ip:!0})</script>
<link rel="search" type="application/opensearchdescription+xml" title="Vue & Node admin panel framework" href="/opensearch.xml">
<script src="/scripts/adminforth.js"></script>
<script src="/scripts/tluma-config.js"></script>
<script src="https://tluma.ai/widget.js" async></script><link rel="stylesheet" href="/assets/css/styles.d8c5f305.css">
<script src="/assets/js/runtime~main.2d69638b.js" defer="defer"></script>
<script src="/assets/js/main.afdf9d5b.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<svg style="display: none;"><defs>
<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
</defs></svg>
<script>!function(){var t=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",t||"light"),document.documentElement.setAttribute("data-theme-choice",t||"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><div class="navbar__logo"><img src="/img/logo.svg" alt="AdminForth Logo" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="/img/logo.svg" alt="AdminForth Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU"></div><b class="navbar__title text--truncate">AdminForth</b></a><a class="navbar__item navbar__link" href="/docs/tutorial/gettingStarted/">Tutorial</a><a class="navbar__item navbar__link" href="/docs/api/">API</a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/blog/">Blog</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><div class="navbarSearchContainer_Bca1"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search (Command+K)"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 20 20" aria-hidden="true"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"></span></button></div><a href="https://demo.adminforth.dev/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Live Demo<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://github.com/devforth/adminforth" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="container margin-vert--lg"><div class="row"><aside class="col col--3"><nav class="sidebar_re4s thin-scrollbar" aria-label="Blog recent posts navigation"><div class="sidebarItemTitle_pO2u margin-bottom--md">Recent posts</div><div role="group"><h3 class="yearGroupHeading_rMGB">2025</h3><ul class="sidebarItemList_Yudw clean-list"><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/k3s-ec2-deployment/">IaC Simplified: K3s on EC2 Deployments with Terraform, Helm, Ansible & Amazon ECR</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/context7-setup-vscode/">How to set up Context7 MCP in Visual Studio Code</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/dynamic-strings-translation/">How to translate dynamic strings in AdminForth API</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/keycloak-setup-example/">Setup AdminForth Authorization via Keycloak</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/compose-aws-ec2-ecr-terraform-github-actions/">IaaC Simplified: Amazon EC2 Deployments with GitHub Actions, Terraform, Docker & Amazon ECR</a></li></ul></div></nav></aside><main class="col col--7"><article class="margin-bottom--xl"><header><h2 class="title_f1Hy"><a href="/blog/k3s-ec2-deployment/">IaC Simplified: K3s on EC2 Deployments with Terraform, Helm, Ansible & Amazon ECR</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2025-11-04T00:00:00.000Z">November 4, 2025</time> · <!-- -->13 min read</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--12 authorCol_Hf19"><div class="avatar margin-bottom--sm"><a href="https://github.com/kirilldorr" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo authorImage_XqGP" src="https://avatars.githubusercontent.com/u/181721742?s=96&v=4" alt="Kyrylo Doropii"></a><div class="avatar__intro authorDetails_lV9A"><div class="avatar__name"><a href="https://github.com/kirilldorr" target="_blank" rel="noopener noreferrer"><span class="authorName_yefp" translate="no">Kyrylo Doropii</span></a></div><small class="authorTitle_nd0D" title="DevOps Engineer of AdminForth">DevOps Engineer of AdminForth</small><div class="authorSocials_rSDt"></div></div></div></div></div></header><div class="markdown"><p>This guide shows how to deploy own Docker apps (with AdminForth as example) to Amazon EC2 instance with K3s and Terraform involving pushing images into Amazon ECR.</p>
<p>Needed resources:</p>
<ul>
<li class="">AWS account where we will auto-spawn EC2 instance. We will use <code>t3a.small</code> instance (2 vCPUs, 2GB RAM) which costs <code>~14$</code> per month in <code>us-west-2</code> region (cheapest region). Also it will take <code>$2</code> per month for EBS gp2 storage (20GB) for EC2 instance.</li>
<li class="">Also AWS ECR will charge for <code>$0.09</code> per GB of data egress traffic (from EC2 to the internet) - this needed to load docker build cache.</li>
</ul>
<p>The setup shape:</p>
<ul>
<li class="">Build is done using IaaC approach with HashiCorp Terraform, so almoast no manual actions are needed from you. Every resource including EC2 server instance is described in code which is commited to repo.</li>
<li class="">Docker images and build cache are stored on Amazon ECR</li>
<li class="">Total build time for average commit to AdminForth app (with Vite rebuilds) is around 3 minutes.</li>
</ul></div><footer class="row docusaurus-mt-lg"><div class="col col--9"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a rel="tag" title="Amazon Web Services (AWS) is a cloud computing platform that provides a wide range of services for building and deploying applications." class="tag_zVej tagRegular_sFm0" href="/blog/tags/aws/">AWS</a></li><li class="tag_QGVx"><a rel="tag" title="Terraform is an open-source infrastructure as code software tool created by HashiCorp that enables users to define and provision data center infrastructure using a declarative configuration language." class="tag_zVej tagRegular_sFm0" href="/blog/tags/terraform/">Terraform</a></li><li class="tag_QGVx"><a rel="tag" title="The package manager for Kubernetes" class="tag_zVej tagRegular_sFm0" href="/blog/tags/helm/">Helm</a></li><li class="tag_QGVx"><a rel="tag" title="k3s is a lightweight version of k8s (kubernetes) that is also used for container orchestration but uses fewer resources." class="tag_zVej tagRegular_sFm0" href="/blog/tags/k3s/">k3s</a></li><li class="tag_QGVx"><a rel="tag" title="Ansible is an open-source automation tool used for configuration management, application deployment, and task automation." class="tag_zVej tagRegular_sFm0" href="/blog/tags/ansible/">Ansible</a></li></ul></div><div class="col text--right col--3"><a aria-label="Read more about IaC Simplified: K3s on EC2 Deployments with Terraform, Helm, Ansible & Amazon ECR" href="/blog/k3s-ec2-deployment/"><b>Read more</b></a></div></footer></article><article class="margin-bottom--xl"><header><h2 class="title_f1Hy"><a href="/blog/context7-setup-vscode/">How to set up Context7 MCP in Visual Studio Code</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2025-10-21T00:00:00.000Z">October 21, 2025</time> · <!-- -->2 min read</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--12 authorCol_Hf19"><div class="avatar margin-bottom--sm"><a href="https://github.com/yaroslav8765" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo authorImage_XqGP" src="https://avatars.githubusercontent.com/u/189334989?v=4" alt="Yaroslav Pechorkin"></a><div class="avatar__intro authorDetails_lV9A"><div class="avatar__name"><a href="https://github.com/yaroslav8765" target="_blank" rel="noopener noreferrer"><span class="authorName_yefp" translate="no">Yaroslav Pechorkin</span></a></div><small class="authorTitle_nd0D" title="Developer of AdminForth">Developer of AdminForth</small><div class="authorSocials_rSDt"></div></div></div></div></div></header><div class="markdown"><p>This guide shows how you can set up Context7 MCP in your Visual Studio Code IDE (VS Code)</p></div><footer class="row docusaurus-mt-lg"><div class="col col--9"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a rel="tag" title="Context7 provides MCP-powered library and API documentation access for coding assistants." class="tag_zVej tagRegular_sFm0" href="/blog/tags/context7/">Context7</a></li><li class="tag_QGVx"><a rel="tag" title="Model Context Protocol is a standard way for tools and assistants to connect to external capabilities and data sources." class="tag_zVej tagRegular_sFm0" href="/blog/tags/mcp/">MCP</a></li></ul></div><div class="col text--right col--3"><a aria-label="Read more about How to set up Context7 MCP in Visual Studio Code" href="/blog/context7-setup-vscode/"><b>Read more</b></a></div></footer></article><article class="margin-bottom--xl"><header><h2 class="title_f1Hy"><a href="/blog/dynamic-strings-translation/">How to translate dynamic strings in AdminForth API</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2025-04-10T00:00:00.000Z">April 10, 2025</time> · <!-- -->6 min read</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--12 authorCol_Hf19"><div class="avatar margin-bottom--sm"><a href="https://github.com/ivictbor" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo authorImage_XqGP" src="https://avatars.githubusercontent.com/u/1838656?v=4" alt="Ivan Borshchov"></a><div class="avatar__intro authorDetails_lV9A"><div class="avatar__name"><a href="https://github.com/ivictbor" target="_blank" rel="noopener noreferrer"><span class="authorName_yefp" translate="no">Ivan Borshchov</span></a></div><small class="authorTitle_nd0D" title="Maintainer of AdminForth">Maintainer of AdminForth</small><div class="authorSocials_rSDt"></div></div></div></div></div></header><div class="markdown"><p>When you are using <a href="https://adminforth.dev/docs/tutorial/Plugins/i18n/#translating-external-application" target="_blank" rel="noopener noreferrer" class="">AdminForth i18n plugin for external Apps translation</a> you might face a case when you need to translate some data stored in your database which potentially can be changed in future.</p></div><footer class="row docusaurus-mt-lg"><div class="col col--9"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a rel="tag" title="Keycloak is an open-source identity and access management solution for modern applications and services." class="tag_zVej tagRegular_sFm0" href="/blog/tags/keycloak/">Keycloak</a></li><li class="tag_QGVx"><a rel="tag" title="Authentication is the process of verifying the identity of a user or system. Authentication is a critical component of security in software applications and systems." class="tag_zVej tagRegular_sFm0" href="/blog/tags/auth/">Auth</a></li></ul></div><div class="col text--right col--3"><a aria-label="Read more about How to translate dynamic strings in AdminForth API" href="/blog/dynamic-strings-translation/"><b>Read more</b></a></div></footer></article><article class="margin-bottom--xl"><header><h2 class="title_f1Hy"><a href="/blog/keycloak-setup-example/">Setup AdminForth Authorization via Keycloak</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2025-03-25T00:00:00.000Z">March 25, 2025</time> · <!-- -->3 min read</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--12 authorCol_Hf19"><div class="avatar margin-bottom--sm"><a href="https://github.com/NoOne7135" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo authorImage_XqGP" src="https://avatars.githubusercontent.com/u/120279695?v=4" alt="Maksym Pipkun"></a><div class="avatar__intro authorDetails_lV9A"><div class="avatar__name"><a href="https://github.com/NoOne7135" target="_blank" rel="noopener noreferrer"><span class="authorName_yefp" translate="no">Maksym Pipkun</span></a></div><small class="authorTitle_nd0D" title="Developer of AdminForth">Developer of AdminForth</small><div class="authorSocials_rSDt"></div></div></div></div></div></header><div class="markdown"><p>Keycloak is an open-source identity and access management solution that provides authentication and authorization services. It can be used to secure applications and services by managing user identities, roles, and permissions.</p>
<p>In this guide, we will walk you through the process of setting up AdminForth authorization via Keycloak. Most important we will show you how to set up Keycloak in a Docker container and configure it to work with AdminForth.</p></div><footer class="row docusaurus-mt-lg"><div class="col col--9"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a rel="tag" title="Keycloak is an open-source identity and access management solution for modern applications and services." class="tag_zVej tagRegular_sFm0" href="/blog/tags/keycloak/">Keycloak</a></li><li class="tag_QGVx"><a rel="tag" title="Authentication is the process of verifying the identity of a user or system. Authentication is a critical component of security in software applications and systems." class="tag_zVej tagRegular_sFm0" href="/blog/tags/auth/">Auth</a></li></ul></div><div class="col text--right col--3"><a aria-label="Read more about Setup AdminForth Authorization via Keycloak" href="/blog/keycloak-setup-example/"><b>Read more</b></a></div></footer></article><article class="margin-bottom--xl"><header><h2 class="title_f1Hy"><a href="/blog/compose-aws-ec2-ecr-terraform-github-actions/">IaaC Simplified: Amazon EC2 Deployments with GitHub Actions, Terraform, Docker & Amazon ECR</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2025-02-19T00:00:00.000Z">February 19, 2025</time> · <!-- -->20 min read</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--12 authorCol_Hf19"><div class="avatar margin-bottom--sm"><a href="https://github.com/ivictbor" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo authorImage_XqGP" src="https://avatars.githubusercontent.com/u/1838656?v=4" alt="Ivan Borshchov"></a><div class="avatar__intro authorDetails_lV9A"><div class="avatar__name"><a href="https://github.com/ivictbor" target="_blank" rel="noopener noreferrer"><span class="authorName_yefp" translate="no">Ivan Borshchov</span></a></div><small class="authorTitle_nd0D" title="Maintainer of AdminForth">Maintainer of AdminForth</small><div class="authorSocials_rSDt"></div></div></div></div></div></header><div class="markdown"><p><img decoding="async" loading="lazy" alt="alt text" src="/assets/images/ga-tf-ecr-87ced7681bcc3685f507cc9252bc0ffe.jpg" width="1200" height="630" class="img_ev3q"></p>
<p>This guide shows how to deploy own Docker apps (with AdminForth as example) to Amazon EC2 instance with Docker and Terraform involving pushing images into Amazon ECR.</p>
<p>Needed resources:</p>
<ul>
<li class="">GitHub actions Free plan which includes 2000 minutes per month (1000 of 2-minute builds per month - more then enough for many projects, if you are not running tests). Extra builds would cost <code>0.008$</code> per minute.</li>
<li class="">AWS account where we will auto-spawn EC2 instance. We will use <code>t3a.small</code> instance (2 vCPUs, 2GB RAM) which costs <code>~14$</code> per month in <code>us-east-1</code> region (cheapest region). Also it will take <code>$2</code> per month for EBS gp2 storage (20GB) for EC2 instance.</li>
<li class="">Also AWS ECR will charge for <code>$0.09</code> per GB of data egress traffic (from EC2 to the internet) - this needed to load docker build cache.</li>
</ul>
<p>The setup shape:</p>
<ul>
<li class="">Build is done using IaaC approach with HashiCorp Terraform, so almoast no manual actions are needed from you. Every resource including EC2 server instance is described in code which is commited to repo.</li>
<li class="">Docker build process is done on GitHub actions server, so EC2 server is not overloaded with builds</li>
<li class="">Changes in infrastructure including changing server type, adding S3 Bucket, changing size of sever disk is also can be done by commiting code to repo.</li>
<li class="">Docker images and build cache are stored on Amazon ECR</li>
<li class="">Total build time for average commit to AdminForth app (with Vite rebuilds) is around 2 minutes.</li>
</ul></div><footer class="row docusaurus-mt-lg"><div class="col col--9"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a rel="tag" title="Amazon Web Services (AWS) is a cloud computing platform that provides a wide range of services for building and deploying applications." class="tag_zVej tagRegular_sFm0" href="/blog/tags/aws/">AWS</a></li><li class="tag_QGVx"><a rel="tag" title="Terraform is an open-source infrastructure as code software tool created by HashiCorp that enables users to define and provision data center infrastructure using a declarative configuration language." class="tag_zVej tagRegular_sFm0" href="/blog/tags/terraform/">Terraform</a></li><li class="tag_QGVx"><a rel="tag" title="GitHub Actions is a continuous integration and continuous deployment (CI/CD) service provided by GitHub that allows you to automate your software development workflows." class="tag_zVej tagRegular_sFm0" href="/blog/tags/github-actions/">GitHub Actions</a></li></ul></div><div class="col text--right col--3"><a aria-label="Read more about IaaC Simplified: Amazon EC2 Deployments with GitHub Actions, Terraform, Docker & Amazon ECR" href="/blog/compose-aws-ec2-ecr-terraform-github-actions/"><b>Read more</b></a></div></footer></article><article class="margin-bottom--xl"><header><h2 class="title_f1Hy"><a href="/blog/compose-ec2-deployment-github-actions-registry/">Amazon EC2 Deployments with GitHub Actions, Terraform, Docker & Self-hosted Registry</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2025-02-19T00:00:00.000Z">February 19, 2025</time> · <!-- -->16 min read</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--12 authorCol_Hf19"><div class="avatar margin-bottom--sm"><a href="https://github.com/ivictbor" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo authorImage_XqGP" src="https://avatars.githubusercontent.com/u/1838656?v=4" alt="Ivan Borshchov"></a><div class="avatar__intro authorDetails_lV9A"><div class="avatar__name"><a href="https://github.com/ivictbor" target="_blank" rel="noopener noreferrer"><span class="authorName_yefp" translate="no">Ivan Borshchov</span></a></div><small class="authorTitle_nd0D" title="Maintainer of AdminForth">Maintainer of AdminForth</small><div class="authorSocials_rSDt"></div></div></div></div></div></header><div class="markdown"><p><img decoding="async" loading="lazy" alt="alt text" src="/assets/images/ga-tf-aws-fd1b40a236f46c0ffc8c09ef37abaf38.jpg" width="1200" height="630" class="img_ev3q"></p>
<p>This guide is a hackers extended addition of <a class="" href="/blog/compose-aws-ec2-ecr-terraform-github-actions/">Deploying AdminForth to EC2 with Amazon ECR</a>. The key difference in this post that we will not use Amazon ECR but self-host registry on EC2 itself. Automatically from terraform. And will see whether we will win something in terms of build time.</p></div><footer class="row docusaurus-mt-lg"><div class="col col--9"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a rel="tag" title="Amazon Web Services (AWS) is a cloud computing platform that provides a wide range of services for building and deploying applications." class="tag_zVej tagRegular_sFm0" href="/blog/tags/aws/">AWS</a></li><li class="tag_QGVx"><a rel="tag" title="Terraform is an open-source infrastructure as code software tool created by HashiCorp that enables users to define and provision data center infrastructure using a declarative configuration language." class="tag_zVej tagRegular_sFm0" href="/blog/tags/terraform/">Terraform</a></li><li class="tag_QGVx"><a rel="tag" title="GitHub Actions is a continuous integration and continuous deployment (CI/CD) service provided by GitHub that allows you to automate your software development workflows." class="tag_zVej tagRegular_sFm0" href="/blog/tags/github-actions/">GitHub Actions</a></li></ul></div><div class="col text--right col--3"><a aria-label="Read more about Amazon EC2 Deployments with GitHub Actions, Terraform, Docker & Self-hosted Registry" href="/blog/compose-ec2-deployment-github-actions-registry/"><b>Read more</b></a></div></footer></article><article class="margin-bottom--xl"><header><h2 class="title_f1Hy"><a href="/blog/how-i-opensourced-my-secret-tokens/">How I Open-Sourced My Secret Access Tokens from GitHub, Slack, and NPM — and Who Actually Cares</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2025-01-24T00:00:00.000Z">January 24, 2025</time> · <!-- -->5 min read</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--12 authorCol_Hf19"><div class="avatar margin-bottom--sm"><a href="https://github.com/ivictbor" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo authorImage_XqGP" src="https://avatars.githubusercontent.com/u/1838656?v=4" alt="Ivan Borshchov"></a><div class="avatar__intro authorDetails_lV9A"><div class="avatar__name"><a href="https://github.com/ivictbor" target="_blank" rel="noopener noreferrer"><span class="authorName_yefp" translate="no">Ivan Borshchov</span></a></div><small class="authorTitle_nd0D" title="Maintainer of AdminForth">Maintainer of AdminForth</small><div class="authorSocials_rSDt"></div></div></div></div></div></header><div class="markdown"><p>Our framework has a CI pipeline that runs <code>npm run build</code>, publishes the package to NPM (<code>npm publish</code>), and creates a new release on GitHub. It also sends a notification about the release to a Slack webhook for our team.</p>
<p>Secrets for these services were stored in our CI’s built-in Vault (we are running a self-hosted Woodpecker CI).</p>
<p>Recently, while moving plugins to separate repositories, I decided to try <a href="https://infisical.com/" target="_blank" rel="noopener noreferrer" class="">Infisical</a> for centralized secrets management instead of the internal CI Vault. Infisical provides a self-hosted open-source solution, has a well-organized UI, and offers better access control than our CI Vault. It was important to me that I could reuse secrets across different repositories without copying them every time I created a new plugin.</p>
<p>Here’s what I did:</p></div><footer class="row docusaurus-mt-lg"><div class="col text--right"><a aria-label="Read more about How I Open-Sourced My Secret Access Tokens from GitHub, Slack, and NPM — and Who Actually Cares" href="/blog/how-i-opensourced-my-secret-tokens/"><b>Read more</b></a></div></footer></article><article class="margin-bottom--xl"><header><h2 class="title_f1Hy"><a href="/blog/why-manual-release-notes-and-versions-are-a-chaos-and-how-to-fix-it/">Why manual Release Notes and Versions are a chaos and how to fix it</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2025-01-19T00:00:00.000Z">January 19, 2025</time> · <!-- -->14 min read</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--12 authorCol_Hf19"><div class="avatar margin-bottom--sm"><a href="https://github.com/ivictbor" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo authorImage_XqGP" src="https://avatars.githubusercontent.com/u/1838656?v=4" alt="Ivan Borshchov"></a><div class="avatar__intro authorDetails_lV9A"><div class="avatar__name"><a href="https://github.com/ivictbor" target="_blank" rel="noopener noreferrer"><span class="authorName_yefp" translate="no">Ivan Borshchov</span></a></div><small class="authorTitle_nd0D" title="Maintainer of AdminForth">Maintainer of AdminForth</small><div class="authorSocials_rSDt"></div></div></div></div></div></header><div class="markdown"><p>I have a feeling that after first ~600 versions of Adminforth we faced all possible issues with manual versioning and release notes.</p>
<p>Manual versioning and CHANGELOG.md is unreliable as human beings are. It is pretty easy to forget it with relevant information, forget to include some changes, forget to push it to GitHub, push it at wrong time, and many more things.</p>
<p>That is why we decided to move the idea of generating versions, and GitHub releases from git commit messages using great tool called <a href="https://semantic-release.gitbook.io/semantic-release/usage/configuration" target="_blank" rel="noopener noreferrer" class="">semantic-release</a>.</p>
<p>In this post I will explain why we did a transition from manual releases to automatic, what profits we got from it, and also will show you simple example how to do it in your project!</p></div><footer class="row docusaurus-mt-lg"><div class="col col--9"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a rel="tag" title="Git is a distributed version control system that allows multiple developers to collaborate on a project." class="tag_zVej tagRegular_sFm0" href="/blog/tags/git/">Git</a></li><li class="tag_QGVx"><a rel="tag" title="Versioning is the process of assigning unique identifiers to different versions of a software application or project." class="tag_zVej tagRegular_sFm0" href="/blog/tags/versioning/">Versioning</a></li><li class="tag_QGVx"><a rel="tag" title="NPM is a package manager for the JavaScript programming language that allows developers to share and reuse code." class="tag_zVej tagRegular_sFm0" href="/blog/tags/npm/">NPM</a></li></ul></div><div class="col text--right col--3"><a aria-label="Read more about Why manual Release Notes and Versions are a chaos and how to fix it" href="/blog/why-manual-release-notes-and-versions-are-a-chaos-and-how-to-fix-it/"><b>Read more</b></a></div></footer></article><article class="margin-bottom--xl"><header><h2 class="title_f1Hy"><a href="/blog/backup-database-to-aws-glacier/">Backup database to AWS Glacier</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2024-12-11T00:00:00.000Z">December 11, 2024</time> · <!-- -->2 min read</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--12 authorCol_Hf19"><div class="avatar margin-bottom--sm"><a href="https://github.com/ivictbor" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo authorImage_XqGP" src="https://avatars.githubusercontent.com/u/1838656?v=4" alt="Ivan Borshchov"></a><div class="avatar__intro authorDetails_lV9A"><div class="avatar__name"><a href="https://github.com/ivictbor" target="_blank" rel="noopener noreferrer"><span class="authorName_yefp" translate="no">Ivan Borshchov</span></a></div><small class="authorTitle_nd0D" title="Maintainer of AdminForth">Maintainer of AdminForth</small><div class="authorSocials_rSDt"></div></div></div></div></div></header><div class="markdown"><p>Every reliable system requires a backup strategy.</p>
<p>If you have no own backup infrastructure, here can suggest a small docker container that will help you to backup your database to AWS Glacier.</p></div><footer class="row docusaurus-mt-lg"><div class="col col--9"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a rel="tag" title="Amazon Web Services (AWS) is a cloud computing platform that provides a wide range of services for building and deploying applications." class="tag_zVej tagRegular_sFm0" href="/blog/tags/aws/">AWS</a></li><li class="tag_QGVx"><a rel="tag" title="Terraform is an open-source infrastructure as code software tool created by HashiCorp that enables users to define and provision data center infrastructure using a declarative configuration language." class="tag_zVej tagRegular_sFm0" href="/blog/tags/terraform/">Terraform</a></li></ul></div><div class="col text--right col--3"><a aria-label="Read more about Backup database to AWS Glacier" href="/blog/backup-database-to-aws-glacier/"><b>Read more</b></a></div></footer></article><article class="margin-bottom--xl"><header><h2 class="title_f1Hy"><a href="/blog/compose-ec2-deployment-github-actions/">Deploy AdminForth to EC2 with terraform on CI</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2024-11-14T00:00:00.000Z">November 14, 2024</time> · <!-- -->7 min read</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--12 authorCol_Hf19"><div class="avatar margin-bottom--sm"><a href="https://github.com/ivictbor" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo authorImage_XqGP" src="https://avatars.githubusercontent.com/u/1838656?v=4" alt="Ivan Borshchov"></a><div class="avatar__intro authorDetails_lV9A"><div class="avatar__name"><a href="https://github.com/ivictbor" target="_blank" rel="noopener noreferrer"><span class="authorName_yefp" translate="no">Ivan Borshchov</span></a></div><small class="authorTitle_nd0D" title="Maintainer of AdminForth">Maintainer of AdminForth</small><div class="authorSocials_rSDt"></div></div></div></div></div></header><div class="markdown"><p>Here is more advanced snippet to deploy AdminForth to Terraform.</p>
<p>Here Terraform state will be stored in the cloud, so you can run this deployment from any machine including stateless CI/CD.</p>
<p>We will use GitHub Actions as CI/CD, but you can use any other CI/CD, for example self-hosted free WoodpeckerCI.</p></div><footer class="row docusaurus-mt-lg"><div class="col col--9"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a rel="tag" title="Amazon Web Services (AWS) is a cloud computing platform that provides a wide range of services for building and deploying applications." class="tag_zVej tagRegular_sFm0" href="/blog/tags/aws/">AWS</a></li><li class="tag_QGVx"><a rel="tag" title="Terraform is an open-source infrastructure as code software tool created by HashiCorp that enables users to define and provision data center infrastructure using a declarative configuration language." class="tag_zVej tagRegular_sFm0" href="/blog/tags/terraform/">Terraform</a></li><li class="tag_QGVx"><a rel="tag" title="GitHub Actions is a continuous integration and continuous deployment (CI/CD) service provided by GitHub that allows you to automate your software development workflows." class="tag_zVej tagRegular_sFm0" href="/blog/tags/github-actions/">GitHub Actions</a></li></ul></div><div class="col text--right col--3"><a aria-label="Read more about Deploy AdminForth to EC2 with terraform on CI" href="/blog/compose-ec2-deployment-github-actions/"><b>Read more</b></a></div></footer></article><nav class="pagination-nav" aria-label="Blog list page navigation"><a class="pagination-nav__link pagination-nav__link--next" href="/blog/page/2/"><div class="pagination-nav__label">Older entries</div></a></nav></main></div></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/docs/tutorial/gettingStarted/">Tutorial</a></li><li class="footer__item"><a href="https://demo.adminforth.dev/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Live Demo</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/api/">API</a></li><li class="footer__item"><a class="footer__link-item" href="/blog/archive/">Blog Archive</a></li><li class="footer__item"><a class="footer__link-item" href="/search/">Find anything</a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://devforth.io" target="_blank" rel="noopener noreferrer" class="footer__link-item">DevForth.io<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://devforth.io/contact" target="_blank" rel="noopener noreferrer" class="footer__link-item">We can develop admin panel for your project<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://github.com/devforth/adminforth" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2026 Devforth sp. z o.o.</div></div></div></footer></div>
</body>
</html>