[{"data":1,"prerenderedAt":4063},["ShallowReactive",2],{"layout-article-sidebar-en-k3s_argocd":3,"similar-articles-en-k3s_argocd":1226,"article-en-k3s_argocd":3191},{"id":4,"title":5,"body":6,"date":1212,"description":1213,"extension":1214,"image":1215,"meta":1216,"navigation":414,"path":1217,"seo":1218,"stem":1219,"tags":1220,"type":1223,"updatedAt":1224,"__hash__":1225},"articlesEn\u002Farticles\u002Fen\u002FK3s_ArgoCD.md","How to create a K3s cluster and install ArgoCD on a VPS?",{"type":7,"value":8,"toc":1197},"minimark",[9,13,18,21,24,27,32,35,48,51,108,119,129,133,144,147,184,187,190,212,215,255,258,265,268,271,293,296,320,323,334,337,343,347,351,354,358,361,372,375,379,383,386,390,393,438,450,455,462,467,609,612,628,632,646,649,657,661,698,708,712,715,780,784,789,1027,1030,1046,1050,1068,1071,1089,1100,1104,1154,1158,1165,1172,1175,1181,1184,1190,1193],[10,11,12],"p",{},"In this article, we will see how to create a K3s cluster and install ArgoCD on it to deploy our applications more easily.",[14,15,17],"h1",{"id":16},"what-is-k3s","What is K3s?",[10,19,20],{},"K3s is a lightweight Kubernetes distribution. It is a distribution of Kubernetes certified by the Cloud Native Computing Foundation (CNCF) with added functionalities for edge and IoT, but also perfect for small VPS.",[10,22,23],{},"Why don't we use K8s? Because K8s is too heavy for a VPS. For example, with an 8GB RAM and 4 vCPUs VPS, K8s can struggle to write logs correctly and crash. It's not optimized for small VPS.",[10,25,26],{},"K3s binary is just 478 MB, and we can reduce it more with UPX compression. It uses SQLite as a database by default instead of etcd. You can change the database with another one, but it is not recommended for simple setups. While K8S uses etcd and can use an external database, I prefer SQLite because it's just one file, lightweight, and easy to backup. We don't need an architecture like Netflix for just 2 or 3 apps...",[28,29,31],"h2",{"id":30},"how-k3s-works","How K3s works",[10,33,34],{},"K3s works like an enterprise: you have many people for lots of tasks, and if one person is absent, the work doesn't stop. You have:",[36,37,38,42,45],"ul",{},[39,40,41],"li",{},"the Boss (control plane)",[39,43,44],{},"the manager (K3s server)",[39,46,47],{},"the team (workers)",[10,49,50],{},"You have many services for your application, mainly:",[36,52,53,60,66,72,78,84,90,96,102],{},[39,54,55,59],{},[56,57,58],"strong",{},"Deployment",": used to deploy your application with one or more containers (uses images based on Docker or Podman).",[39,61,62,65],{},[56,63,64],{},"StatefulSet",": used to deploy your application when it needs to save its state\u002FID, typically for Databases (Mongo, Postgres, MariaDB...).",[39,67,68,71],{},[56,69,70],{},"DaemonSet",": used to deploy your application on all the nodes (workers) in the cluster. Great for monitoring or logging agents.",[39,73,74,77],{},[56,75,76],{},"PersistentVolume",": like a big bag where you can create storage for your data.",[39,79,80,83],{},[56,81,82],{},"PersistentVolumeClaim",": like asking for a bag, you define the size and properties you want, and the system gives you one.",[39,85,86,89],{},[56,87,88],{},"Service",": like a door to your cluster; you can expose your application inside the cluster or to the outside (ClusterIP, NodePort, LoadBalancer...).",[39,91,92,95],{},[56,93,94],{},"Ingress",": like your front door; you can expose your application to the outside with a domain name and a path. The front door sends the request to the service.",[39,97,98,101],{},[56,99,100],{},"Ingress Controller",": a service that manages the ingress (like Nginx, Traefik, HAProxy...).",[39,103,104,107],{},[56,105,106],{},"Namespace",": like a box in your room; you can put your applications in different boxes to stay organized. It's like a directory for your application. You can set security rules for each box.",[10,109,110,111,114,115,118],{},"You can create these many ",[56,112,113],{},"\"services\""," with a file called a ",[56,116,117],{},"\"manifest\"",". The manifest is just a YAML file that describes the desired state of your application.",[10,120,121,122,128],{},"You can run these services with the command ",[56,123,124,125],{},"kubectl apply -f ",[126,127],"manifest",{},". The system will create the services you described in the manifest file.",[14,130,132],{"id":131},"install-k3s","Install K3s",[10,134,135,136,139,140,143],{},"Now that you understand what K3S is, we can install it on our VPS and create a cluster with one node. I recommend using ",[56,137,138],{},"Ubuntu 22.04"," or ",[56,141,142],{},"Debian 12\u002F13"," for the VPS.",[10,145,146],{},"To install your first cluster, you can use the command:",[148,149,154],"pre",{"className":150,"code":151,"language":152,"meta":153,"style":153},"language-bash shiki shiki-themes material-theme-lighter github-light monokai","curl -sfL https:\u002F\u002Fget.k3s.io | sh -\n","bash","",[155,156,157],"code",{"__ignoreMap":153},[158,159,162,166,170,174,178,181],"span",{"class":160,"line":161},"line",1,[158,163,165],{"class":164},"ssU3Q","curl",[158,167,169],{"class":168},"sZ_HY"," -sfL",[158,171,173],{"class":172},"sqNgn"," https:\u002F\u002Fget.k3s.io",[158,175,177],{"class":176},"sBHfy"," |",[158,179,180],{"class":164}," sh",[158,182,183],{"class":172}," -\n",[10,185,186],{},"This command installs, creates, and configures everything you need for your cluster. It installs the control plane, the manager, and the team. You can add more nodes to add more resources to your cluster, or add more managers for high availability.",[10,188,189],{},"To be sure everything is ready, you can run this command after waiting about 30 seconds (to be sure everything is operational):",[148,191,193],{"className":150,"code":192,"language":152,"meta":153,"style":153},"sudo k3s kubectl get node\n",[155,194,195],{"__ignoreMap":153},[158,196,197,200,203,206,209],{"class":160,"line":161},[158,198,199],{"class":164},"sudo",[158,201,202],{"class":172}," k3s",[158,204,205],{"class":172}," kubectl",[158,207,208],{"class":172}," get",[158,210,211],{"class":172}," node\n",[10,213,214],{},"If all is ready, you will see something like this:",[148,216,218],{"className":150,"code":217,"language":152,"meta":153,"style":153},"NAME    STATUS   ROLES                  AGE   VERSION\nnode1   Ready    control-plane,master   30s   v1.27.3-k3s2\n",[155,219,220,237],{"__ignoreMap":153},[158,221,222,225,228,231,234],{"class":160,"line":161},[158,223,224],{"class":164},"NAME",[158,226,227],{"class":172},"    STATUS",[158,229,230],{"class":172},"   ROLES",[158,232,233],{"class":172},"                  AGE",[158,235,236],{"class":172},"   VERSION\n",[158,238,240,243,246,249,252],{"class":160,"line":239},2,[158,241,242],{"class":164},"node1",[158,244,245],{"class":172},"   Ready",[158,247,248],{"class":172},"    control-plane,master",[158,250,251],{"class":172},"   30s",[158,253,254],{"class":172},"   v1.27.3-k3s2\n",[10,256,257],{},"Congratulations, you have installed your first cluster with K3s!",[10,259,260,261,264],{},"For your information, K3s is delivered with an ingress controller called ",[56,262,263],{},"Traefik",".",[10,266,267],{},"Traefik is a Cloud Native router used in many projects. In our case, we use Traefik because it's strong, lightweight, and well-integrated with K3s.",[10,269,270],{},"If you want to use another ingress controller, you can install it with a command (Nginx for example):",[148,272,274],{"className":150,"code":273,"language":152,"meta":153,"style":153},"sudo k3s kubectl apply -f https:\u002F\u002Fraw.githubusercontent.com\u002Fkubernetes\u002Fingress-nginx\u002Fcontroller-v1.8.0\u002Fdeploy\u002Fstatic\u002Fprovider\u002Fcloud\u002Fdeploy.yaml\n",[155,275,276],{"__ignoreMap":153},[158,277,278,280,282,284,287,290],{"class":160,"line":161},[158,279,199],{"class":164},[158,281,202],{"class":172},[158,283,205],{"class":172},[158,285,286],{"class":172}," apply",[158,288,289],{"class":168}," -f",[158,291,292],{"class":172}," https:\u002F\u002Fraw.githubusercontent.com\u002Fkubernetes\u002Fingress-nginx\u002Fcontroller-v1.8.0\u002Fdeploy\u002Fstatic\u002Fprovider\u002Fcloud\u002Fdeploy.yaml\n",[10,294,295],{},"You can check if the ingress controller is installed with:",[148,297,299],{"className":150,"code":298,"language":152,"meta":153,"style":153},"sudo k3s kubectl get pod -n ingress-nginx\n",[155,300,301],{"__ignoreMap":153},[158,302,303,305,307,309,311,314,317],{"class":160,"line":161},[158,304,199],{"class":164},[158,306,202],{"class":172},[158,308,205],{"class":172},[158,310,208],{"class":172},[158,312,313],{"class":172}," pod",[158,315,316],{"class":168}," -n",[158,318,319],{"class":172}," ingress-nginx\n",[10,321,322],{},"For Kubernetes, there are other Ingress controllers:",[36,324,325,328,331],{},[39,326,327],{},"Kong",[39,329,330],{},"HAProxy",[39,332,333],{},"Istio",[10,335,336],{},"And many others.",[338,339,340],"warning",{},[10,341,342],{},"For serious projects, SaaS, or production, I recommend using an API gateway because in the long term, the Ingress resource is being succeeded by the Gateway API. You can use Kong, for example.",[14,344,346],{"id":345},"argocd","ArgoCD",[28,348,350],{"id":349},"what-is-argocd","What is ArgoCD?",[10,352,353],{},"ArgoCD is a declarative GitOps Continuous Delivery tool for Kubernetes. It is a CNCF project used to deploy and manage applications on Kubernetes clusters. It compares the desired state (in Git) with the current state in the cluster and takes action to reconcile the two.",[14,355,357],{"id":356},"how-it-works","How it works?",[10,359,360],{},"It's very simple: you have your repository in Git and ArgoCD will take the latest version and deploy it in your cluster. You can define the desired state in your repository and ArgoCD will take care of the rest.",[10,362,363,364,367,368,371],{},"It has a ",[56,365,366],{},"Web UI"," to see the state of your cluster and a ",[56,369,370],{},"CLI"," (Command Line Interface) to manage it from your terminal.",[10,373,374],{},"With these tools, you can manage your cluster, create projects, and rollback if you need to.",[14,376,378],{"id":377},"argocd-installation","ArgoCD Installation",[28,380,382],{"id":381},"for-https-you-need-a-domain-name","For HTTPS you need a domain name",[10,384,385],{},"If you want to use ArgoCD with HTTPS, you need a domain name pointing to your VPS IP.\nYou can use it with HTTP, but it's not recommended for production.",[28,387,389],{"id":388},"cluster-issuer","Cluster Issuer",[10,391,392],{},"To use HTTPS with ArgoCD, you need a ClusterIssuer to generate SSL certificates.",[148,394,396],{"className":150,"code":395,"language":152,"meta":153,"style":153},"kubectl apply -f https:\u002F\u002Fgithub.com\u002Fcert-manager\u002Fcert-manager\u002Freleases\u002Fdownload\u002Fv1.13.3\u002Fcert-manager.yaml\n\n# Wait until the 3 pods are running\nkubectl get pods -n cert-manager\n",[155,397,398,410,416,423],{"__ignoreMap":153},[158,399,400,403,405,407],{"class":160,"line":161},[158,401,402],{"class":164},"kubectl",[158,404,286],{"class":172},[158,406,289],{"class":168},[158,408,409],{"class":172}," https:\u002F\u002Fgithub.com\u002Fcert-manager\u002Fcert-manager\u002Freleases\u002Fdownload\u002Fv1.13.3\u002Fcert-manager.yaml\n",[158,411,412],{"class":160,"line":239},[158,413,415],{"emptyLinePlaceholder":414},true,"\n",[158,417,419],{"class":160,"line":418},3,[158,420,422],{"class":421},"skxtS","# Wait until the 3 pods are running\n",[158,424,426,428,430,433,435],{"class":160,"line":425},4,[158,427,402],{"class":164},[158,429,208],{"class":172},[158,431,432],{"class":172}," pods",[158,434,316],{"class":168},[158,436,437],{"class":172}," cert-manager\n",[338,439,440],{},[10,441,442,443,264],{},"If you use Traefik or Nginx, you need to configure it for use with ArgoCD. You can find more information in the ",[444,445,449],"a",{"href":446,"rel":447},"https:\u002F\u002Fargoproj.github.io\u002Fargo-cd\u002Foperator-manual\u002Fingress\u002F",[448],"nofollow","ArgoCD documentation",[451,452,454],"h3",{"id":453},"create-issuer-and-apply-it","Create issuer and apply it",[10,456,457,458,461],{},"Create a file named ",[155,459,460],{},"cluster-issuer.yaml"," and apply it. In our case, we use Let's Encrypt and Traefik as the ingress controller.",[338,463,464],{},[10,465,466],{},"Don't forget to change the email in the file.",[148,468,472],{"className":469,"code":470,"language":471,"meta":153,"style":153},"language-yaml shiki shiki-themes material-theme-lighter github-light monokai","apiVersion: cert-manager.io\u002Fv1\nkind: ClusterIssuer\nmetadata:\n  name: letsencrypt-prod\nspec:\n  acme:\n    server: https:\u002F\u002Facme-v02.api.letsencrypt.org\u002Fdirectory\n    email: your-email@email.fr\n    privateKeySecretRef:\n      name: letsencrypt-prod\n    solvers:\n      - http01:\n          ingress:\n            class: traefik\n","yaml",[155,473,474,487,497,505,515,523,531,542,553,561,571,579,590,598],{"__ignoreMap":153},[158,475,476,480,484],{"class":160,"line":161},[158,477,479],{"class":478},"s5svD","apiVersion",[158,481,483],{"class":482},"sWZ6u",":",[158,485,486],{"class":172}," cert-manager.io\u002Fv1\n",[158,488,489,492,494],{"class":160,"line":239},[158,490,491],{"class":478},"kind",[158,493,483],{"class":482},[158,495,496],{"class":172}," ClusterIssuer\n",[158,498,499,502],{"class":160,"line":418},[158,500,501],{"class":478},"metadata",[158,503,504],{"class":482},":\n",[158,506,507,510,512],{"class":160,"line":425},[158,508,509],{"class":478},"  name",[158,511,483],{"class":482},[158,513,514],{"class":172}," letsencrypt-prod\n",[158,516,518,521],{"class":160,"line":517},5,[158,519,520],{"class":478},"spec",[158,522,504],{"class":482},[158,524,526,529],{"class":160,"line":525},6,[158,527,528],{"class":478},"  acme",[158,530,504],{"class":482},[158,532,534,537,539],{"class":160,"line":533},7,[158,535,536],{"class":478},"    server",[158,538,483],{"class":482},[158,540,541],{"class":172}," https:\u002F\u002Facme-v02.api.letsencrypt.org\u002Fdirectory\n",[158,543,545,548,550],{"class":160,"line":544},8,[158,546,547],{"class":478},"    email",[158,549,483],{"class":482},[158,551,552],{"class":172}," your-email@email.fr\n",[158,554,556,559],{"class":160,"line":555},9,[158,557,558],{"class":478},"    privateKeySecretRef",[158,560,504],{"class":482},[158,562,564,567,569],{"class":160,"line":563},10,[158,565,566],{"class":478},"      name",[158,568,483],{"class":482},[158,570,514],{"class":172},[158,572,574,577],{"class":160,"line":573},11,[158,575,576],{"class":478},"    solvers",[158,578,504],{"class":482},[158,580,582,585,588],{"class":160,"line":581},12,[158,583,584],{"class":482},"      -",[158,586,587],{"class":478}," http01",[158,589,504],{"class":482},[158,591,593,596],{"class":160,"line":592},13,[158,594,595],{"class":478},"          ingress",[158,597,504],{"class":482},[158,599,601,604,606],{"class":160,"line":600},14,[158,602,603],{"class":478},"            class",[158,605,483],{"class":482},[158,607,608],{"class":172}," traefik\n",[10,610,611],{},"Apply the file:",[148,613,615],{"className":150,"code":614,"language":152,"meta":153,"style":153},"kubectl apply -f cluster-issuer.yaml\n",[155,616,617],{"__ignoreMap":153},[158,618,619,621,623,625],{"class":160,"line":161},[158,620,402],{"class":164},[158,622,286],{"class":172},[158,624,289],{"class":168},[158,626,627],{"class":172}," cluster-issuer.yaml\n",[451,629,631],{"id":630},"check-if-the-issuer-is-ready","Check if the issuer is ready",[148,633,635],{"className":150,"code":634,"language":152,"meta":153,"style":153},"kubectl get clusterissuer\n",[155,636,637],{"__ignoreMap":153},[158,638,639,641,643],{"class":160,"line":161},[158,640,402],{"class":164},[158,642,208],{"class":172},[158,644,645],{"class":172}," clusterissuer\n",[10,647,648],{},"If the issuer is ready, you will see:",[148,650,655],{"className":651,"code":653,"language":654},[652],"language-text","NAME               READY   AGE\nletsencrypt-prod   True    2m\n","text",[155,656,653],{"__ignoreMap":153},[451,658,660],{"id":659},"install-argocd","Install ArgoCD",[148,662,664],{"className":150,"code":663,"language":152,"meta":153,"style":153},"kubectl create namespace argocd\nkubectl apply --server-side -n argocd -f https:\u002F\u002Fraw.githubusercontent.com\u002Fargoproj\u002Fargo-cd\u002Fstable\u002Fmanifests\u002Finstall.yaml\n",[155,665,666,679],{"__ignoreMap":153},[158,667,668,670,673,676],{"class":160,"line":161},[158,669,402],{"class":164},[158,671,672],{"class":172}," create",[158,674,675],{"class":172}," namespace",[158,677,678],{"class":172}," argocd\n",[158,680,681,683,685,688,690,693,695],{"class":160,"line":239},[158,682,402],{"class":164},[158,684,286],{"class":172},[158,686,687],{"class":168}," --server-side",[158,689,316],{"class":168},[158,691,692],{"class":172}," argocd",[158,694,289],{"class":168},[158,696,697],{"class":172}," https:\u002F\u002Fraw.githubusercontent.com\u002Fargoproj\u002Fargo-cd\u002Fstable\u002Fmanifests\u002Finstall.yaml\n",[699,700,701],"tips",{},[10,702,703,704,707],{},"We use ",[56,705,706],{},"--server-side"," because the manifest file is too big and can cause issues when applying it normally.",[451,709,711],{"id":710},"patching-argocd-for-insecure-mode","Patching ArgoCD for Insecure mode",[10,713,714],{},"By default, ArgoCD uses HTTPS with its own self-signed certificate. We want to patch it to allow insecure HTTP communication internally so our Ingress (with our real certificate) can talk to it easily on port 80.",[148,716,718],{"className":150,"code":717,"language":152,"meta":153,"style":153},"kubectl patch configmap argocd-cmd-params-cm -n argocd --type merge -p '{\"data\": {\"server.insecure\": \"true\"}}'\n\nkubectl rollout restart deployment argocd-server -n argocd\n",[155,719,720,756,760],{"__ignoreMap":153},[158,721,722,724,727,730,733,735,737,740,743,746,750,753],{"class":160,"line":161},[158,723,402],{"class":164},[158,725,726],{"class":172}," patch",[158,728,729],{"class":172}," configmap",[158,731,732],{"class":172}," argocd-cmd-params-cm",[158,734,316],{"class":168},[158,736,692],{"class":172},[158,738,739],{"class":168}," --type",[158,741,742],{"class":172}," merge",[158,744,745],{"class":168}," -p",[158,747,749],{"class":748},"ssona"," '",[158,751,752],{"class":172},"{\"data\": {\"server.insecure\": \"true\"}}",[158,754,755],{"class":748},"'\n",[158,757,758],{"class":160,"line":239},[158,759,415],{"emptyLinePlaceholder":414},[158,761,762,764,767,770,773,776,778],{"class":160,"line":418},[158,763,402],{"class":164},[158,765,766],{"class":172}," rollout",[158,768,769],{"class":172}," restart",[158,771,772],{"class":172}," deployment",[158,774,775],{"class":172}," argocd-server",[158,777,316],{"class":168},[158,779,678],{"class":172},[451,781,783],{"id":782},"expose-argocd-with-traefik","Expose ArgoCD with Traefik",[10,785,457,786,483],{},[155,787,788],{},"argocd-server-ingress.yaml",[148,790,792],{"className":469,"code":791,"language":471,"meta":153,"style":153},"apiVersion: networking.k8s.io\u002Fv1\nkind: Ingress\nmetadata:\n  name: argocd-server-ingress\n  namespace: argocd\n  annotations:\n    cert-manager.io\u002Fcluster-issuer: letsencrypt-prod\n    traefik.ingress.kubernetes.io\u002Frouter.entrypoints: websecure\n    traefik.ingress.kubernetes.io\u002Frouter.tls: \"true\"\nspec:\n  rules:\n    - host: argocd.yourdomain.fr\n      http:\n        paths:\n          - path: \u002F\n            pathType: Prefix\n            backend:\n              service:\n                name: argocd-server\n                port:\n                  number: 80\n  tls:\n    - hosts:\n        - argocd.yourdomain.fr\n      secretName: argocd-server-tls\n",[155,793,794,803,812,818,827,836,843,852,862,878,884,891,904,911,918,932,943,951,959,970,978,990,998,1008,1016],{"__ignoreMap":153},[158,795,796,798,800],{"class":160,"line":161},[158,797,479],{"class":478},[158,799,483],{"class":482},[158,801,802],{"class":172}," networking.k8s.io\u002Fv1\n",[158,804,805,807,809],{"class":160,"line":239},[158,806,491],{"class":478},[158,808,483],{"class":482},[158,810,811],{"class":172}," Ingress\n",[158,813,814,816],{"class":160,"line":418},[158,815,501],{"class":478},[158,817,504],{"class":482},[158,819,820,822,824],{"class":160,"line":425},[158,821,509],{"class":478},[158,823,483],{"class":482},[158,825,826],{"class":172}," argocd-server-ingress\n",[158,828,829,832,834],{"class":160,"line":517},[158,830,831],{"class":478},"  namespace",[158,833,483],{"class":482},[158,835,678],{"class":172},[158,837,838,841],{"class":160,"line":525},[158,839,840],{"class":478},"  annotations",[158,842,504],{"class":482},[158,844,845,848,850],{"class":160,"line":533},[158,846,847],{"class":478},"    cert-manager.io\u002Fcluster-issuer",[158,849,483],{"class":482},[158,851,514],{"class":172},[158,853,854,857,859],{"class":160,"line":544},[158,855,856],{"class":478},"    traefik.ingress.kubernetes.io\u002Frouter.entrypoints",[158,858,483],{"class":482},[158,860,861],{"class":172}," websecure\n",[158,863,864,867,869,872,875],{"class":160,"line":555},[158,865,866],{"class":478},"    traefik.ingress.kubernetes.io\u002Frouter.tls",[158,868,483],{"class":482},[158,870,871],{"class":748}," \"",[158,873,874],{"class":172},"true",[158,876,877],{"class":748},"\"\n",[158,879,880,882],{"class":160,"line":563},[158,881,520],{"class":478},[158,883,504],{"class":482},[158,885,886,889],{"class":160,"line":573},[158,887,888],{"class":478},"  rules",[158,890,504],{"class":482},[158,892,893,896,899,901],{"class":160,"line":581},[158,894,895],{"class":482},"    -",[158,897,898],{"class":478}," host",[158,900,483],{"class":482},[158,902,903],{"class":172}," argocd.yourdomain.fr\n",[158,905,906,909],{"class":160,"line":592},[158,907,908],{"class":478},"      http",[158,910,504],{"class":482},[158,912,913,916],{"class":160,"line":600},[158,914,915],{"class":478},"        paths",[158,917,504],{"class":482},[158,919,921,924,927,929],{"class":160,"line":920},15,[158,922,923],{"class":482},"          -",[158,925,926],{"class":478}," path",[158,928,483],{"class":482},[158,930,931],{"class":172}," \u002F\n",[158,933,935,938,940],{"class":160,"line":934},16,[158,936,937],{"class":478},"            pathType",[158,939,483],{"class":482},[158,941,942],{"class":172}," Prefix\n",[158,944,946,949],{"class":160,"line":945},17,[158,947,948],{"class":478},"            backend",[158,950,504],{"class":482},[158,952,954,957],{"class":160,"line":953},18,[158,955,956],{"class":478},"              service",[158,958,504],{"class":482},[158,960,962,965,967],{"class":160,"line":961},19,[158,963,964],{"class":478},"                name",[158,966,483],{"class":482},[158,968,969],{"class":172}," argocd-server\n",[158,971,973,976],{"class":160,"line":972},20,[158,974,975],{"class":478},"                port",[158,977,504],{"class":482},[158,979,981,984,986],{"class":160,"line":980},21,[158,982,983],{"class":478},"                  number",[158,985,483],{"class":482},[158,987,989],{"class":988},"sYBsF"," 80\n",[158,991,993,996],{"class":160,"line":992},22,[158,994,995],{"class":478},"  tls",[158,997,504],{"class":482},[158,999,1001,1003,1006],{"class":160,"line":1000},23,[158,1002,895],{"class":482},[158,1004,1005],{"class":478}," hosts",[158,1007,504],{"class":482},[158,1009,1011,1014],{"class":160,"line":1010},24,[158,1012,1013],{"class":482},"        -",[158,1015,903],{"class":172},[158,1017,1019,1022,1024],{"class":160,"line":1018},25,[158,1020,1021],{"class":478},"      secretName",[158,1023,483],{"class":482},[158,1025,1026],{"class":172}," argocd-server-tls\n",[10,1028,1029],{},"Apply it:",[148,1031,1033],{"className":150,"code":1032,"language":152,"meta":153,"style":153},"kubectl apply -f argocd-server-ingress.yaml\n",[155,1034,1035],{"__ignoreMap":153},[158,1036,1037,1039,1041,1043],{"class":160,"line":161},[158,1038,402],{"class":164},[158,1040,286],{"class":172},[158,1042,289],{"class":168},[158,1044,1045],{"class":172}," argocd-server-ingress.yaml\n",[451,1047,1049],{"id":1048},"check-if-the-ingress-and-certificates-are-ready","Check if the ingress and certificates are ready",[148,1051,1053],{"className":150,"code":1052,"language":152,"meta":153,"style":153},"kubectl get ingress -n argocd\n",[155,1054,1055],{"__ignoreMap":153},[158,1056,1057,1059,1061,1064,1066],{"class":160,"line":161},[158,1058,402],{"class":164},[158,1060,208],{"class":172},[158,1062,1063],{"class":172}," ingress",[158,1065,316],{"class":168},[158,1067,678],{"class":172},[10,1069,1070],{},"You should see your host and the IP address. Then check the certificate:",[148,1072,1074],{"className":150,"code":1073,"language":152,"meta":153,"style":153},"kubectl get certificate -n argocd\n",[155,1075,1076],{"__ignoreMap":153},[158,1077,1078,1080,1082,1085,1087],{"class":160,"line":161},[158,1079,402],{"class":164},[158,1081,208],{"class":172},[158,1083,1084],{"class":172}," certificate",[158,1086,316],{"class":168},[158,1088,678],{"class":172},[10,1090,1091,1092,1095,1096,1099],{},"If ",[155,1093,1094],{},"READY"," is ",[155,1097,1098],{},"True",", you are good!",[451,1101,1103],{"id":1102},"get-the-initial-admin-password","Get the initial admin password",[148,1105,1107],{"className":150,"code":1106,"language":152,"meta":153,"style":153},"kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath=\"{.data.password}\" | base64 -d; echo\n",[155,1108,1109],{"__ignoreMap":153},[158,1110,1111,1113,1115,1117,1119,1122,1125,1128,1131,1134,1137,1139,1141,1144,1147,1150],{"class":160,"line":161},[158,1112,402],{"class":164},[158,1114,316],{"class":168},[158,1116,692],{"class":172},[158,1118,208],{"class":172},[158,1120,1121],{"class":172}," secret",[158,1123,1124],{"class":172}," argocd-initial-admin-secret",[158,1126,1127],{"class":168}," -o",[158,1129,1130],{"class":172}," jsonpath=",[158,1132,1133],{"class":748},"\"",[158,1135,1136],{"class":172},"{.data.password}",[158,1138,1133],{"class":748},[158,1140,177],{"class":176},[158,1142,1143],{"class":164}," base64",[158,1145,1146],{"class":168}," -d",[158,1148,1149],{"class":482},";",[158,1151,1153],{"class":1152},"sOhXc"," echo\n",[28,1155,1157],{"id":1156},"first-login-to-argocd","First login to ArgoCD",[10,1159,1160,1161,1164],{},"Go to ",[155,1162,1163],{},"https:\u002F\u002Fargocd.yourdomain.fr"," (replace with your domain).",[10,1166,1167],{},[1168,1169],"img",{"alt":1170,"src":1171},"argocd first login","\u002Farticles\u002Fk3s_argocd\u002Fargocd-home.png",[10,1173,1174],{},"Credentials:",[148,1176,1179],{"className":1177,"code":1178,"language":654},[652],"Username: admin\nPassword: [THE_PASSWORD_FROM_PREVIOUS_STEP]\n",[155,1180,1178],{"__ignoreMap":153},[10,1182,1183],{},"After connecting, you will see your empty dashboard:",[10,1185,1186],{},[1168,1187],{"alt":1188,"src":1189},"argocd dashboard","\u002Farticles\u002Fk3s_argocd\u002Fargocd-dashboard.png",[10,1191,1192],{},"Congrats! You have successfully installed ArgoCD on your K3s cluster. You can now start deploying your applications using GitOps!",[1194,1195,1196],"style",{},"html pre.shiki code .ssU3Q, html code.shiki .ssU3Q{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#A6E22E}html pre.shiki code .sZ_HY, html code.shiki .sZ_HY{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#AE81FF}html pre.shiki code .sqNgn, html code.shiki .sqNgn{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#E6DB74}html pre.shiki code .sBHfy, html code.shiki .sBHfy{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F92672}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .skxtS, html code.shiki .skxtS{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#88846F;--shiki-dark-font-style:inherit}html pre.shiki code .s5svD, html code.shiki .s5svD{--shiki-light:#E53935;--shiki-default:#22863A;--shiki-dark:#F92672}html pre.shiki code .sWZ6u, html code.shiki .sWZ6u{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#F8F8F2}html pre.shiki code .ssona, html code.shiki .ssona{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#E6DB74}html pre.shiki code .sYBsF, html code.shiki .sYBsF{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#AE81FF}html pre.shiki code .sOhXc, html code.shiki .sOhXc{--shiki-light:#6182B8;--shiki-default:#005CC5;--shiki-dark:#66D9EF}",{"title":153,"searchDepth":239,"depth":239,"links":1198},[1199,1200,1201,1202,1211],{"id":30,"depth":239,"text":31},{"id":349,"depth":239,"text":350},{"id":381,"depth":239,"text":382},{"id":388,"depth":239,"text":389,"children":1203},[1204,1205,1206,1207,1208,1209,1210],{"id":453,"depth":418,"text":454},{"id":630,"depth":418,"text":631},{"id":659,"depth":418,"text":660},{"id":710,"depth":418,"text":711},{"id":782,"depth":418,"text":783},{"id":1048,"depth":418,"text":1049},{"id":1102,"depth":418,"text":1103},{"id":1156,"depth":239,"text":1157},"2026-04-29","In this article, we see how to create a K3s cluster and install ArgoCD on a VPS to deploy our applications.","md","\u002Farticles\u002Fk3s_argocd\u002Fheader.png",{},"\u002Farticles\u002Fen\u002Fk3s_argocd",{"title":5,"description":1213},"articles\u002Fen\u002FK3s_ArgoCD",[1221,1222,345],"kubernetes","k3s","devops",null,"6xj_pwOo3a5CjqmvPLPuQJsIZu6v9gLYxjZiNGZGUvo",[1227,2099,2344],{"id":4,"title":5,"body":1228,"date":1212,"description":1213,"extension":1214,"image":1215,"meta":2096,"navigation":414,"path":1217,"seo":2097,"stem":1219,"tags":2098,"type":1223,"updatedAt":1224,"__hash__":1225},{"type":7,"value":1229,"toc":2081},[1230,1232,1234,1236,1238,1240,1242,1244,1252,1254,1292,1298,1304,1306,1312,1314,1332,1334,1336,1352,1354,1382,1384,1388,1390,1392,1410,1412,1432,1434,1442,1444,1448,1450,1452,1454,1456,1458,1464,1466,1468,1470,1472,1474,1476,1510,1517,1519,1523,1527,1631,1633,1647,1649,1661,1663,1668,1670,1700,1706,1708,1710,1760,1762,1766,1956,1958,1972,1974,1990,1992,2008,2014,2016,2054,2056,2060,2064,2066,2071,2073,2077,2079],[10,1231,12],{},[14,1233,17],{"id":16},[10,1235,20],{},[10,1237,23],{},[10,1239,26],{},[28,1241,31],{"id":30},[10,1243,34],{},[36,1245,1246,1248,1250],{},[39,1247,41],{},[39,1249,44],{},[39,1251,47],{},[10,1253,50],{},[36,1255,1256,1260,1264,1268,1272,1276,1280,1284,1288],{},[39,1257,1258,59],{},[56,1259,58],{},[39,1261,1262,65],{},[56,1263,64],{},[39,1265,1266,71],{},[56,1267,70],{},[39,1269,1270,77],{},[56,1271,76],{},[39,1273,1274,83],{},[56,1275,82],{},[39,1277,1278,89],{},[56,1279,88],{},[39,1281,1282,95],{},[56,1283,94],{},[39,1285,1286,101],{},[56,1287,100],{},[39,1289,1290,107],{},[56,1291,106],{},[10,1293,110,1294,114,1296,118],{},[56,1295,113],{},[56,1297,117],{},[10,1299,121,1300,128],{},[56,1301,124,1302],{},[126,1303],{},[14,1305,132],{"id":131},[10,1307,135,1308,139,1310,143],{},[56,1309,138],{},[56,1311,142],{},[10,1313,146],{},[148,1315,1316],{"className":150,"code":151,"language":152,"meta":153,"style":153},[155,1317,1318],{"__ignoreMap":153},[158,1319,1320,1322,1324,1326,1328,1330],{"class":160,"line":161},[158,1321,165],{"class":164},[158,1323,169],{"class":168},[158,1325,173],{"class":172},[158,1327,177],{"class":176},[158,1329,180],{"class":164},[158,1331,183],{"class":172},[10,1333,186],{},[10,1335,189],{},[148,1337,1338],{"className":150,"code":192,"language":152,"meta":153,"style":153},[155,1339,1340],{"__ignoreMap":153},[158,1341,1342,1344,1346,1348,1350],{"class":160,"line":161},[158,1343,199],{"class":164},[158,1345,202],{"class":172},[158,1347,205],{"class":172},[158,1349,208],{"class":172},[158,1351,211],{"class":172},[10,1353,214],{},[148,1355,1356],{"className":150,"code":217,"language":152,"meta":153,"style":153},[155,1357,1358,1370],{"__ignoreMap":153},[158,1359,1360,1362,1364,1366,1368],{"class":160,"line":161},[158,1361,224],{"class":164},[158,1363,227],{"class":172},[158,1365,230],{"class":172},[158,1367,233],{"class":172},[158,1369,236],{"class":172},[158,1371,1372,1374,1376,1378,1380],{"class":160,"line":239},[158,1373,242],{"class":164},[158,1375,245],{"class":172},[158,1377,248],{"class":172},[158,1379,251],{"class":172},[158,1381,254],{"class":172},[10,1383,257],{},[10,1385,260,1386,264],{},[56,1387,263],{},[10,1389,267],{},[10,1391,270],{},[148,1393,1394],{"className":150,"code":273,"language":152,"meta":153,"style":153},[155,1395,1396],{"__ignoreMap":153},[158,1397,1398,1400,1402,1404,1406,1408],{"class":160,"line":161},[158,1399,199],{"class":164},[158,1401,202],{"class":172},[158,1403,205],{"class":172},[158,1405,286],{"class":172},[158,1407,289],{"class":168},[158,1409,292],{"class":172},[10,1411,295],{},[148,1413,1414],{"className":150,"code":298,"language":152,"meta":153,"style":153},[155,1415,1416],{"__ignoreMap":153},[158,1417,1418,1420,1422,1424,1426,1428,1430],{"class":160,"line":161},[158,1419,199],{"class":164},[158,1421,202],{"class":172},[158,1423,205],{"class":172},[158,1425,208],{"class":172},[158,1427,313],{"class":172},[158,1429,316],{"class":168},[158,1431,319],{"class":172},[10,1433,322],{},[36,1435,1436,1438,1440],{},[39,1437,327],{},[39,1439,330],{},[39,1441,333],{},[10,1443,336],{},[338,1445,1446],{},[10,1447,342],{},[14,1449,346],{"id":345},[28,1451,350],{"id":349},[10,1453,353],{},[14,1455,357],{"id":356},[10,1457,360],{},[10,1459,363,1460,367,1462,371],{},[56,1461,366],{},[56,1463,370],{},[10,1465,374],{},[14,1467,378],{"id":377},[28,1469,382],{"id":381},[10,1471,385],{},[28,1473,389],{"id":388},[10,1475,392],{},[148,1477,1478],{"className":150,"code":395,"language":152,"meta":153,"style":153},[155,1479,1480,1490,1494,1498],{"__ignoreMap":153},[158,1481,1482,1484,1486,1488],{"class":160,"line":161},[158,1483,402],{"class":164},[158,1485,286],{"class":172},[158,1487,289],{"class":168},[158,1489,409],{"class":172},[158,1491,1492],{"class":160,"line":239},[158,1493,415],{"emptyLinePlaceholder":414},[158,1495,1496],{"class":160,"line":418},[158,1497,422],{"class":421},[158,1499,1500,1502,1504,1506,1508],{"class":160,"line":425},[158,1501,402],{"class":164},[158,1503,208],{"class":172},[158,1505,432],{"class":172},[158,1507,316],{"class":168},[158,1509,437],{"class":172},[338,1511,1512],{},[10,1513,442,1514,264],{},[444,1515,449],{"href":446,"rel":1516},[448],[451,1518,454],{"id":453},[10,1520,457,1521,461],{},[155,1522,460],{},[338,1524,1525],{},[10,1526,466],{},[148,1528,1529],{"className":469,"code":470,"language":471,"meta":153,"style":153},[155,1530,1531,1539,1547,1553,1561,1567,1573,1581,1589,1595,1603,1609,1617,1623],{"__ignoreMap":153},[158,1532,1533,1535,1537],{"class":160,"line":161},[158,1534,479],{"class":478},[158,1536,483],{"class":482},[158,1538,486],{"class":172},[158,1540,1541,1543,1545],{"class":160,"line":239},[158,1542,491],{"class":478},[158,1544,483],{"class":482},[158,1546,496],{"class":172},[158,1548,1549,1551],{"class":160,"line":418},[158,1550,501],{"class":478},[158,1552,504],{"class":482},[158,1554,1555,1557,1559],{"class":160,"line":425},[158,1556,509],{"class":478},[158,1558,483],{"class":482},[158,1560,514],{"class":172},[158,1562,1563,1565],{"class":160,"line":517},[158,1564,520],{"class":478},[158,1566,504],{"class":482},[158,1568,1569,1571],{"class":160,"line":525},[158,1570,528],{"class":478},[158,1572,504],{"class":482},[158,1574,1575,1577,1579],{"class":160,"line":533},[158,1576,536],{"class":478},[158,1578,483],{"class":482},[158,1580,541],{"class":172},[158,1582,1583,1585,1587],{"class":160,"line":544},[158,1584,547],{"class":478},[158,1586,483],{"class":482},[158,1588,552],{"class":172},[158,1590,1591,1593],{"class":160,"line":555},[158,1592,558],{"class":478},[158,1594,504],{"class":482},[158,1596,1597,1599,1601],{"class":160,"line":563},[158,1598,566],{"class":478},[158,1600,483],{"class":482},[158,1602,514],{"class":172},[158,1604,1605,1607],{"class":160,"line":573},[158,1606,576],{"class":478},[158,1608,504],{"class":482},[158,1610,1611,1613,1615],{"class":160,"line":581},[158,1612,584],{"class":482},[158,1614,587],{"class":478},[158,1616,504],{"class":482},[158,1618,1619,1621],{"class":160,"line":592},[158,1620,595],{"class":478},[158,1622,504],{"class":482},[158,1624,1625,1627,1629],{"class":160,"line":600},[158,1626,603],{"class":478},[158,1628,483],{"class":482},[158,1630,608],{"class":172},[10,1632,611],{},[148,1634,1635],{"className":150,"code":614,"language":152,"meta":153,"style":153},[155,1636,1637],{"__ignoreMap":153},[158,1638,1639,1641,1643,1645],{"class":160,"line":161},[158,1640,402],{"class":164},[158,1642,286],{"class":172},[158,1644,289],{"class":168},[158,1646,627],{"class":172},[451,1648,631],{"id":630},[148,1650,1651],{"className":150,"code":634,"language":152,"meta":153,"style":153},[155,1652,1653],{"__ignoreMap":153},[158,1654,1655,1657,1659],{"class":160,"line":161},[158,1656,402],{"class":164},[158,1658,208],{"class":172},[158,1660,645],{"class":172},[10,1662,648],{},[148,1664,1666],{"className":1665,"code":653,"language":654},[652],[155,1667,653],{"__ignoreMap":153},[451,1669,660],{"id":659},[148,1671,1672],{"className":150,"code":663,"language":152,"meta":153,"style":153},[155,1673,1674,1684],{"__ignoreMap":153},[158,1675,1676,1678,1680,1682],{"class":160,"line":161},[158,1677,402],{"class":164},[158,1679,672],{"class":172},[158,1681,675],{"class":172},[158,1683,678],{"class":172},[158,1685,1686,1688,1690,1692,1694,1696,1698],{"class":160,"line":239},[158,1687,402],{"class":164},[158,1689,286],{"class":172},[158,1691,687],{"class":168},[158,1693,316],{"class":168},[158,1695,692],{"class":172},[158,1697,289],{"class":168},[158,1699,697],{"class":172},[699,1701,1702],{},[10,1703,703,1704,707],{},[56,1705,706],{},[451,1707,711],{"id":710},[10,1709,714],{},[148,1711,1712],{"className":150,"code":717,"language":152,"meta":153,"style":153},[155,1713,1714,1740,1744],{"__ignoreMap":153},[158,1715,1716,1718,1720,1722,1724,1726,1728,1730,1732,1734,1736,1738],{"class":160,"line":161},[158,1717,402],{"class":164},[158,1719,726],{"class":172},[158,1721,729],{"class":172},[158,1723,732],{"class":172},[158,1725,316],{"class":168},[158,1727,692],{"class":172},[158,1729,739],{"class":168},[158,1731,742],{"class":172},[158,1733,745],{"class":168},[158,1735,749],{"class":748},[158,1737,752],{"class":172},[158,1739,755],{"class":748},[158,1741,1742],{"class":160,"line":239},[158,1743,415],{"emptyLinePlaceholder":414},[158,1745,1746,1748,1750,1752,1754,1756,1758],{"class":160,"line":418},[158,1747,402],{"class":164},[158,1749,766],{"class":172},[158,1751,769],{"class":172},[158,1753,772],{"class":172},[158,1755,775],{"class":172},[158,1757,316],{"class":168},[158,1759,678],{"class":172},[451,1761,783],{"id":782},[10,1763,457,1764,483],{},[155,1765,788],{},[148,1767,1768],{"className":469,"code":791,"language":471,"meta":153,"style":153},[155,1769,1770,1778,1786,1792,1800,1808,1814,1822,1830,1842,1848,1854,1864,1870,1876,1886,1894,1900,1906,1914,1920,1928,1934,1942,1948],{"__ignoreMap":153},[158,1771,1772,1774,1776],{"class":160,"line":161},[158,1773,479],{"class":478},[158,1775,483],{"class":482},[158,1777,802],{"class":172},[158,1779,1780,1782,1784],{"class":160,"line":239},[158,1781,491],{"class":478},[158,1783,483],{"class":482},[158,1785,811],{"class":172},[158,1787,1788,1790],{"class":160,"line":418},[158,1789,501],{"class":478},[158,1791,504],{"class":482},[158,1793,1794,1796,1798],{"class":160,"line":425},[158,1795,509],{"class":478},[158,1797,483],{"class":482},[158,1799,826],{"class":172},[158,1801,1802,1804,1806],{"class":160,"line":517},[158,1803,831],{"class":478},[158,1805,483],{"class":482},[158,1807,678],{"class":172},[158,1809,1810,1812],{"class":160,"line":525},[158,1811,840],{"class":478},[158,1813,504],{"class":482},[158,1815,1816,1818,1820],{"class":160,"line":533},[158,1817,847],{"class":478},[158,1819,483],{"class":482},[158,1821,514],{"class":172},[158,1823,1824,1826,1828],{"class":160,"line":544},[158,1825,856],{"class":478},[158,1827,483],{"class":482},[158,1829,861],{"class":172},[158,1831,1832,1834,1836,1838,1840],{"class":160,"line":555},[158,1833,866],{"class":478},[158,1835,483],{"class":482},[158,1837,871],{"class":748},[158,1839,874],{"class":172},[158,1841,877],{"class":748},[158,1843,1844,1846],{"class":160,"line":563},[158,1845,520],{"class":478},[158,1847,504],{"class":482},[158,1849,1850,1852],{"class":160,"line":573},[158,1851,888],{"class":478},[158,1853,504],{"class":482},[158,1855,1856,1858,1860,1862],{"class":160,"line":581},[158,1857,895],{"class":482},[158,1859,898],{"class":478},[158,1861,483],{"class":482},[158,1863,903],{"class":172},[158,1865,1866,1868],{"class":160,"line":592},[158,1867,908],{"class":478},[158,1869,504],{"class":482},[158,1871,1872,1874],{"class":160,"line":600},[158,1873,915],{"class":478},[158,1875,504],{"class":482},[158,1877,1878,1880,1882,1884],{"class":160,"line":920},[158,1879,923],{"class":482},[158,1881,926],{"class":478},[158,1883,483],{"class":482},[158,1885,931],{"class":172},[158,1887,1888,1890,1892],{"class":160,"line":934},[158,1889,937],{"class":478},[158,1891,483],{"class":482},[158,1893,942],{"class":172},[158,1895,1896,1898],{"class":160,"line":945},[158,1897,948],{"class":478},[158,1899,504],{"class":482},[158,1901,1902,1904],{"class":160,"line":953},[158,1903,956],{"class":478},[158,1905,504],{"class":482},[158,1907,1908,1910,1912],{"class":160,"line":961},[158,1909,964],{"class":478},[158,1911,483],{"class":482},[158,1913,969],{"class":172},[158,1915,1916,1918],{"class":160,"line":972},[158,1917,975],{"class":478},[158,1919,504],{"class":482},[158,1921,1922,1924,1926],{"class":160,"line":980},[158,1923,983],{"class":478},[158,1925,483],{"class":482},[158,1927,989],{"class":988},[158,1929,1930,1932],{"class":160,"line":992},[158,1931,995],{"class":478},[158,1933,504],{"class":482},[158,1935,1936,1938,1940],{"class":160,"line":1000},[158,1937,895],{"class":482},[158,1939,1005],{"class":478},[158,1941,504],{"class":482},[158,1943,1944,1946],{"class":160,"line":1010},[158,1945,1013],{"class":482},[158,1947,903],{"class":172},[158,1949,1950,1952,1954],{"class":160,"line":1018},[158,1951,1021],{"class":478},[158,1953,483],{"class":482},[158,1955,1026],{"class":172},[10,1957,1029],{},[148,1959,1960],{"className":150,"code":1032,"language":152,"meta":153,"style":153},[155,1961,1962],{"__ignoreMap":153},[158,1963,1964,1966,1968,1970],{"class":160,"line":161},[158,1965,402],{"class":164},[158,1967,286],{"class":172},[158,1969,289],{"class":168},[158,1971,1045],{"class":172},[451,1973,1049],{"id":1048},[148,1975,1976],{"className":150,"code":1052,"language":152,"meta":153,"style":153},[155,1977,1978],{"__ignoreMap":153},[158,1979,1980,1982,1984,1986,1988],{"class":160,"line":161},[158,1981,402],{"class":164},[158,1983,208],{"class":172},[158,1985,1063],{"class":172},[158,1987,316],{"class":168},[158,1989,678],{"class":172},[10,1991,1070],{},[148,1993,1994],{"className":150,"code":1073,"language":152,"meta":153,"style":153},[155,1995,1996],{"__ignoreMap":153},[158,1997,1998,2000,2002,2004,2006],{"class":160,"line":161},[158,1999,402],{"class":164},[158,2001,208],{"class":172},[158,2003,1084],{"class":172},[158,2005,316],{"class":168},[158,2007,678],{"class":172},[10,2009,1091,2010,1095,2012,1099],{},[155,2011,1094],{},[155,2013,1098],{},[451,2015,1103],{"id":1102},[148,2017,2018],{"className":150,"code":1106,"language":152,"meta":153,"style":153},[155,2019,2020],{"__ignoreMap":153},[158,2021,2022,2024,2026,2028,2030,2032,2034,2036,2038,2040,2042,2044,2046,2048,2050,2052],{"class":160,"line":161},[158,2023,402],{"class":164},[158,2025,316],{"class":168},[158,2027,692],{"class":172},[158,2029,208],{"class":172},[158,2031,1121],{"class":172},[158,2033,1124],{"class":172},[158,2035,1127],{"class":168},[158,2037,1130],{"class":172},[158,2039,1133],{"class":748},[158,2041,1136],{"class":172},[158,2043,1133],{"class":748},[158,2045,177],{"class":176},[158,2047,1143],{"class":164},[158,2049,1146],{"class":168},[158,2051,1149],{"class":482},[158,2053,1153],{"class":1152},[28,2055,1157],{"id":1156},[10,2057,1160,2058,1164],{},[155,2059,1163],{},[10,2061,2062],{},[1168,2063],{"alt":1170,"src":1171},[10,2065,1174],{},[148,2067,2069],{"className":2068,"code":1178,"language":654},[652],[155,2070,1178],{"__ignoreMap":153},[10,2072,1183],{},[10,2074,2075],{},[1168,2076],{"alt":1188,"src":1189},[10,2078,1192],{},[1194,2080,1196],{},{"title":153,"searchDepth":239,"depth":239,"links":2082},[2083,2084,2085,2086,2095],{"id":30,"depth":239,"text":31},{"id":349,"depth":239,"text":350},{"id":381,"depth":239,"text":382},{"id":388,"depth":239,"text":389,"children":2087},[2088,2089,2090,2091,2092,2093,2094],{"id":453,"depth":418,"text":454},{"id":630,"depth":418,"text":631},{"id":659,"depth":418,"text":660},{"id":710,"depth":418,"text":711},{"id":782,"depth":418,"text":783},{"id":1048,"depth":418,"text":1049},{"id":1102,"depth":418,"text":1103},{"id":1156,"depth":239,"text":1157},{},{"title":5,"description":1213},[1221,1222,345],{"id":2100,"title":2101,"body":2102,"date":2330,"description":2331,"extension":1214,"image":2332,"meta":2333,"navigation":414,"path":2334,"seo":2335,"stem":2336,"tags":2337,"type":1223,"updatedAt":1224,"__hash__":2343},"articlesEn\u002Farticles\u002Fen\u002FVps_vs_Cloud_vs_Dedicated_server.md","VPS vs Cloud vs Dedicated Server: Which One Should You Choose?",{"type":7,"value":2103,"toc":2317},[2104,2108,2111,2114,2117,2121,2124,2127,2131,2135,2138,2142,2145,2149,2152,2156,2159,2163,2174,2178,2181,2186,2200,2202,2206,2209,2213,2216,2222,2226,2252,2254,2258,2261,2265,2285,2288,2290,2294,2314],[14,2105,2107],{"id":2106},"vps-vs-cloud-vs-dedicated-server-the-ultimate-comparison","VPS vs Cloud vs Dedicated Server: The Ultimate Comparison",[10,2109,2110],{},"Choosing the right hosting provider and infrastructure type is a common challenge for developers. Whether you're launching a small side project or a high-traffic enterprise application, understanding the differences between Cloud, VPS, and Dedicated Servers is essential.",[10,2112,2113],{},"In this guide, we'll break down each option, their pros and cons, and when to use them.",[2115,2116],"hr",{},[14,2118,2120],{"id":2119},"cloud-computing","Cloud Computing",[10,2122,2123],{},"Cloud computing has become the industry standard over the last decade, and for good reason. It offers unparalleled flexibility and performance that can scale infinitely based on your needs.",[10,2125,2126],{},"However, \"with great power comes great responsibility\"—and a potentially high price tag. If you don't manage your cloud resources carefully, you might find yourself with a surprisingly large bill at the end of the month.",[28,2128,2130],{"id":2129},"major-cloud-providers","Major Cloud Providers",[451,2132,2134],{"id":2133},"aws-amazon-web-services","AWS (Amazon Web Services)",[10,2136,2137],{},"The undisputed market leader. AWS offers over 200 services, ranging from traditional servers (EC2) to databases (RDS) and serverless functions (Lambda). It's incredibly powerful but comes with a steep learning curve.",[451,2139,2141],{"id":2140},"gcp-google-cloud-platform","GCP (Google Cloud Platform)",[10,2143,2144],{},"Google's offering is a strong challenger, particularly known for its excellence in Kubernetes (GKE), data analytics, and machine learning.",[451,2146,2148],{"id":2147},"azure-microsoft","Azure (Microsoft)",[10,2150,2151],{},"Azure is a heavy hitter in the enterprise world. It integrates perfectly with Microsoft's ecosystem and offers powerful DevOps tools (Azure DevOps).",[451,2153,2155],{"id":2154},"ovhcloud","OVHcloud",[10,2157,2158],{},"A top French provider that offers a great balance between features and competitive pricing. It's an excellent choice for those looking for European sovereignty and transparent costs.",[28,2160,2162],{"id":2161},"why-is-it-so-popular","Why is it so popular?",[10,2164,2165,2166,2169,2170,2173],{},"The primary advantage of the Cloud is ",[56,2167,2168],{},"speed and scalability",". Need a database in seconds? Spin up an RDS instance. Need to handle a sudden traffic spike? Auto-scaling has you covered. Tools like ",[56,2171,2172],{},"Terraform"," allow you to treat your infrastructure as code, making deployments fast and reproducible.",[28,2175,2177],{"id":2176},"the-limitations","The Limitations",[10,2179,2180],{},"Cloud can be overkill for small projects or static websites. The complexity of managing VPCs, IAM roles, and assorted services is time-consuming.",[10,2182,2183],{},[56,2184,2185],{},"Example:",[36,2187,2188,2194],{},[39,2189,2190,2193],{},[56,2191,2192],{},"Solo Dev:"," For a simple blog or a small app, AWS might cost you $20-$50\u002Fmonth once you factor in EC2, RDS, NAT Gateways, and storage.",[39,2195,2196,2199],{},[56,2197,2198],{},"Small Team:"," For a microservices architecture with 4-5 people, the Cloud is perfect for horizontal scaling, monitoring (CloudWatch), and granular security (IAM).",[2115,2201],{},[14,2203,2205],{"id":2204},"vps-virtual-private-server","VPS (Virtual Private Server)",[10,2207,2208],{},"A VPS is often the \"sweet spot\" for many developers. It provides a fixed-cost environment where you know exactly what you're paying for each month.",[28,2210,2212],{"id":2211},"what-is-a-vps","What is a VPS?",[10,2214,2215],{},"A VPS is a virtual machine running on a large physical server. The provider (like OVH or DigitalOcean) takes a powerful machine (e.g., 256GB RAM) and partitions it into smaller \"virtual\" servers (e.g., 8GB RAM each) using virtualization software like VMware or KVM.",[10,2217,2218,2221],{},[56,2219,2220],{},"Important Note:"," Resources on a VPS are often \"bursty\" or shared. If other users on the same physical host are maxing out their resources, you might experience slight performance degradation, though most providers guarantee a baseline.",[28,2223,2225],{"id":2224},"popular-vps-providers","Popular VPS Providers",[36,2227,2228,2234,2240,2246],{},[39,2229,2230,2233],{},[56,2231,2232],{},"OVHcloud:"," Competitive European pricing.",[39,2235,2236,2239],{},[56,2237,2238],{},"Hostinger:"," Extremely affordable for entry-level projects.",[39,2241,2242,2245],{},[56,2243,2244],{},"Hetzner:"," Renowned for high-performance servers at low costs (Germany).",[39,2247,2248,2251],{},[56,2249,2250],{},"DigitalOcean:"," Famous for its \"Droplets\" and developer-friendly UX.",[2115,2253],{},[14,2255,2257],{"id":2256},"dedicated-server","Dedicated Server",[10,2259,2260],{},"A dedicated server is exactly what it sounds like: you rent an entire physical machine that belongs solely to you. No sharing, no virtualization overhead—just raw power.",[28,2262,2264],{"id":2263},"why-choose-dedicated","Why Choose Dedicated?",[36,2266,2267,2273,2279],{},[39,2268,2269,2272],{},[56,2270,2271],{},"Performance:"," You have 100% of the CPU, RAM, and Disk I\u002FO at your disposal.",[39,2274,2275,2278],{},[56,2276,2277],{},"Privacy & Control:"," Since you aren't sharing hardware, it's inherently more secure for sensitive data.",[39,2280,2281,2284],{},[56,2282,2283],{},"Customization:"," You can install your own hypervisor (like Proxmox) and create your own mini-cloud.",[10,2286,2287],{},"For example, a dedicated server with 256GB of RAM might cost $200\u002Fmonth, whereas the equivalent resources in the Cloud could cost thousands. This makes dedicated servers ideal for high-performance databases, game servers, or hosting dozens of smaller websites.",[2115,2289],{},[14,2291,2293],{"id":2292},"conclusion-which-one-is-for-you","Conclusion: Which one is for you?",[36,2295,2296,2302,2308],{},[39,2297,2298,2301],{},[56,2299,2300],{},"Choose a VPS"," if you're a solo developer or have a small project with a fixed budget. It's the simplest and most cost-effective starting point.",[39,2303,2304,2307],{},[56,2305,2306],{},"Choose a Dedicated Server"," if you need maximum performance, want to host many concurrent projects, or need to manage costs while scaling large workloads.",[39,2309,2310,2313],{},[56,2311,2312],{},"Choose the Cloud"," if you have a global user base, require high availability across multiple regions, or need advanced services like managed AI, big data, or extreme auto-scaling.",[10,2315,2316],{},"The best choice depends on your specific needs, your team's expertise, and—most importantly—your budget.",{"title":153,"searchDepth":239,"depth":239,"links":2318},[2319,2325,2326,2327,2328,2329],{"id":2129,"depth":239,"text":2130,"children":2320},[2321,2322,2323,2324],{"id":2133,"depth":418,"text":2134},{"id":2140,"depth":418,"text":2141},{"id":2147,"depth":418,"text":2148},{"id":2154,"depth":418,"text":2155},{"id":2161,"depth":239,"text":2162},{"id":2176,"depth":239,"text":2177},{"id":2211,"depth":239,"text":2212},{"id":2224,"depth":239,"text":2225},{"id":2263,"depth":239,"text":2264},"2026-04-13","Choosing the right hosting infrastructure is critical for your project's success. Compare VPS, Cloud, and Dedicated Servers to find the best fit for your needs and budget.","\u002Farticles\u002Fhosting_comparison\u002Fheader.png",{},"\u002Farticles\u002Fen\u002Fvps_vs_cloud_vs_dedicated_server",{"title":2101,"description":2331},"articles\u002Fen\u002FVps_vs_Cloud_vs_Dedicated_server",[2338,2339,2340,2341,2342],"hosting","vps","cloud","dedicated server","infrastructure","UdG6JfYhyfG2u_ho0cIM6b759uNClclk_sYEBea0H7M",{"id":2345,"title":2346,"body":2347,"date":3181,"description":3182,"extension":1214,"image":3183,"meta":3184,"navigation":414,"path":3185,"seo":3186,"stem":3187,"tags":3188,"type":1223,"updatedAt":1224,"__hash__":3190},"articlesEn\u002Farticles\u002Fen\u002Freverse_proxy.md","What is a Reverse Proxy and What is its Role in Your Infrastructure?",{"type":7,"value":2348,"toc":3155},[2349,2352,2355,2358,2362,2369,2372,2379,2405,2409,2412,2416,2419,2454,2458,2476,2478,2482,2485,2488,2494,2517,2520,2523,2550,2553,2556,2576,2579,2582,2602,2604,2608,2611,2615,2618,2632,2636,2639,2652,2656,2659,2666,2670,2673,2680,2682,2686,2693,2697,2700,2705,2737,2746,2801,2805,2808,2812,2831,2837,2867,2871,2874,2882,3044,3048,3051,3059,3109,3111,3115,3118,3152],[14,2350,2346],{"id":2351},"what-is-a-reverse-proxy-and-what-is-its-role-in-your-infrastructure",[10,2353,2354],{},"A reverse proxy is probably your best friend when it comes to improving your application's performance quickly and easily — without writing complex code or using magic tricks.",[10,2356,2357],{},"However, configuring a reverse proxy can sometimes feel tedious. Nevertheless, it remains one of the best ways to expose your applications securely and efficiently to your audience.",[28,2359,2361],{"id":2360},"️-reverse-proxy-what-is-it","🛡️ Reverse Proxy — What Is It?",[10,2363,2364,2365,2368],{},"A reverse proxy is like ",[56,2366,2367],{},"Gandalf",". I really like this analogy: when traffic reaches your server, the reverse proxy stands at the gate and decides who can enter and where they should go.",[10,2370,2371],{},"In general, traffic comes through HTTP or HTTPS (ports 80 and 443). The role of a reverse proxy is to inspect incoming requests (based on IP address, domain name, etc.) and route them to the correct application — as long as that application is known and configured.",[10,2373,2374,2375,2378],{},"Think of it as the ",[56,2376,2377],{},"\"Google Maps\""," for your server. It knows where to send traffic and how to manage it. It also provides many powerful features such as:",[36,2380,2381,2387,2393,2399],{},[39,2382,2383,2386],{},[56,2384,2385],{},"Caching",": Storing copies of content to serve them faster.",[39,2388,2389,2392],{},[56,2390,2391],{},"Security",": Hiding your internal server IP and protecting against DDoS.",[39,2394,2395,2398],{},[56,2396,2397],{},"SSL Termination",": Handling HTTPS encryption so your app doesn't have to.",[39,2400,2401,2404],{},[56,2402,2403],{},"Performance Optimization",": Compressing data and managing connections.",[28,2406,2408],{"id":2407},"choosing-a-reverse-proxy","🚦 Choosing a Reverse Proxy",[10,2410,2411],{},"Choosing the right reverse proxy is an important decision. You need to consider several factors based on your specific needs.",[451,2413,2415],{"id":2414},"_1-your-architecture","1. Your Architecture",[10,2417,2418],{},"Your infrastructure determines which tool fits best:",[36,2420,2421,2430,2443],{},[39,2422,2423,2426,2427,2429],{},[56,2424,2425],{},"Docker Swarm \u002F Kubernetes",": ",[56,2428,263],{}," is often the best choice here. It can automatically discover your services via labels, exposing your application without manual config files.",[39,2431,2432,2426,2435,2438,2439,2442],{},[56,2433,2434],{},"Classic VPS (No Docker)",[56,2436,2437],{},"Nginx"," and ",[56,2440,2441],{},"Caddy"," are excellent choices in 2026. They are fast to install and stable.",[39,2444,2445,2426,2448,139,2451,2453],{},[56,2446,2447],{},"High-Scale Production",[56,2449,2450],{},"NGINX",[56,2452,330],{}," are the industry standards for heavy loads and fine-tuned control.",[451,2455,2457],{"id":2456},"_2-your-traffic-and-requirements","2. Your Traffic and Requirements",[36,2459,2460,2468],{},[39,2461,2462,2426,2465,2467],{},[56,2463,2464],{},"Small Projects \u002F Personal Tools",[56,2466,2441],{}," is a great choice. It’s simple, fast, and handles HTTPS automatically.",[39,2469,2470,2426,2473,2475],{},[56,2471,2472],{},"Professional Grade \u002F Fine-tuned Control",[56,2474,2437],{}," is a must-have. It requires more setup but gives you total control over every aspect of your traffic.",[2115,2477],{},[28,2479,2481],{"id":2480},"️-which-reverse-proxies-exist","🛠️ Which Reverse Proxies Exist?",[10,2483,2484],{},"Let's explore the advantages and disadvantages of the most popular solutions.",[451,2486,2441],{"id":2487},"caddy",[10,2489,2490,2491,264],{},"Caddy is a modern reverse proxy written in Go. Its main strengths are ",[56,2492,2493],{},"simplicity and speed",[36,2495,2496,2502,2511],{},[39,2497,2498,2501],{},[56,2499,2500],{},"Installation",": Extremely fast (often just one command).",[39,2503,2504,2507,2508,264],{},[56,2505,2506],{},"Configuration",": Very easy — you only need a single file called the ",[155,2509,2510],{},"Caddyfile",[39,2512,2513,2516],{},[56,2514,2515],{},"HTTPS",": It handles SSL certificates (via Let's Encrypt) automatically by default.",[451,2518,2450],{"id":2519},"nginx",[10,2521,2522],{},"Nginx is the most widely used reverse proxy in the world. It offers a perfect balance between performance and flexibility.",[36,2524,2525,2531,2537],{},[39,2526,2527,2530],{},[56,2528,2529],{},"Versatility",": Works well for everything from small blogs to giant enterprises.",[39,2532,2533,2536],{},[56,2534,2535],{},"Scalability",": Scales very efficiently for high-traffic systems.",[39,2538,2539,2541,2542,2545,2546,2549],{},[56,2540,2506],{},": Uses ",[155,2543,2544],{},".conf"," files (usually located in ",[155,2547,2548],{},"\u002Fetc\u002Fnginx\u002F","). It's more verbose than Caddy but very powerful.",[451,2551,263],{"id":2552},"traefik",[10,2554,2555],{},"Traefik was built for the modern era of microservices and containers.",[36,2557,2558,2564,2570],{},[39,2559,2560,2563],{},[56,2561,2562],{},"Native Docker Support",": It listens to the Docker socket and configures itself automatically.",[39,2565,2566,2569],{},[56,2567,2568],{},"Dynamic",": No need to restart the proxy when adding new services.",[39,2571,2572,2575],{},[56,2573,2574],{},"Dashboard",": Comes with a nice built-in UI to see your routes in real-time.",[451,2577,330],{"id":2578},"haproxy",[10,2580,2581],{},"HAProxy is a true \"mastodon\" of performance. It is designed purely for high availability and load balancing.",[36,2583,2584,2590,2596],{},[39,2585,2586,2589],{},[56,2587,2588],{},"Performance",": Extremely high throughput and low latency.",[39,2591,2592,2595],{},[56,2593,2594],{},"Reliability",": Rock-solid stability used by giants like GitHub and Stack Overflow.",[39,2597,2598,2601],{},[56,2599,2600],{},"Focus",": It doesn't try to be a web server; it's a dedicated proxy\u002Fload balancer.",[2115,2603],{},[28,2605,2607],{"id":2606},"️-load-balancing-algorithms","⚖️ Load Balancing Algorithms",[10,2609,2610],{},"Load balancing is a core feature of any reverse proxy. If you have multiple instances of your app (e.g., VPS Alpha and VPS Bravo), the proxy decides how to split the work.",[451,2612,2614],{"id":2613},"_1-round-robin","1. Round Robin",[10,2616,2617],{},"The simplest method. Requests are sent to each server in turn.",[36,2619,2620,2626],{},[39,2621,2622,2625],{},[56,2623,2624],{},"How it works",": VPS Alpha → VPS Bravo → VPS Alpha → VPS Bravo.",[39,2627,2628,2631],{},[56,2629,2630],{},"Best for",": Servers with identical capacity (80% of simple use cases).",[451,2633,2635],{"id":2634},"_2-least-connections","2. Least Connections",[10,2637,2638],{},"Requests are sent to the server with the fewest active connections.",[36,2640,2641,2646],{},[39,2642,2643,2645],{},[56,2644,2630],{},": Long-running requests (Streaming, heavy APIs).",[39,2647,2648,2651],{},[56,2649,2650],{},"Advantage",": Prevents overloading one server if it's processing slow requests.",[451,2653,2655],{"id":2654},"_3-ip-hash-sticky-sessions","3. IP Hash (Sticky Sessions)",[10,2657,2658],{},"Requests from the same client IP are always sent to the same server.",[36,2660,2661],{},[39,2662,2663,2665],{},[56,2664,2630],{},": Applications that store user sessions locally (login states, shopping carts) and don't use a shared storage like Redis.",[451,2667,2669],{"id":2668},"_4-least-response-time","4. Least Response Time",[10,2671,2672],{},"Sends traffic to the server that responds the fastest.",[36,2674,2675],{},[39,2676,2677,2679],{},[56,2678,2630],{},": Optimizing user experience by avoiding slower or lagging nodes.",[2115,2681],{},[28,2683,2685],{"id":2684},"quick-installation-config-guide","🚀 Quick Installation & Config Guide",[10,2687,2688,2689,2692],{},"Here is how to set up the 4 major players with a basic example for a ",[56,2690,2691],{},"React\u002FVue (SPA)"," application.",[451,2694,2696],{"id":2695},"_1-nginx","1. Nginx",[10,2698,2699],{},"Ideal for serving pre-built static files with high performance.",[10,2701,2702],{},[56,2703,2704],{},"Install:",[148,2706,2708],{"className":150,"code":2707,"language":152,"meta":153,"style":153},"sudo apt update && sudo apt install nginx -y\n",[155,2709,2710],{"__ignoreMap":153},[158,2711,2712,2714,2717,2720,2723,2726,2728,2731,2734],{"class":160,"line":161},[158,2713,199],{"class":164},[158,2715,2716],{"class":172}," apt",[158,2718,2719],{"class":172}," update",[158,2721,2722],{"class":482}," &&",[158,2724,2725],{"class":164}," sudo",[158,2727,2716],{"class":172},[158,2729,2730],{"class":172}," install",[158,2732,2733],{"class":172}," nginx",[158,2735,2736],{"class":168}," -y\n",[10,2738,2739],{},[56,2740,2741,2742,2745],{},"Basic Config (",[155,2743,2744],{},"\u002Fetc\u002Fnginx\u002Fsites-available\u002Fmyapp.conf","):",[148,2747,2750],{"className":2748,"code":2749,"language":2519,"meta":153,"style":153},"language-nginx shiki shiki-themes material-theme-lighter github-light monokai","server {\n    listen 80;\n    server_name myapp.com;\n\n    location \u002F {\n        root \u002Fvar\u002Fwww\u002Fmyapp\u002Fdist; # Path to your React\u002FVue build\n        index index.html;\n        try_files $uri $uri\u002F \u002Findex.html; # Handle SPA routing (important!)\n    }\n}\n",[155,2751,2752,2757,2762,2767,2771,2776,2781,2786,2791,2796],{"__ignoreMap":153},[158,2753,2754],{"class":160,"line":161},[158,2755,2756],{},"server {\n",[158,2758,2759],{"class":160,"line":239},[158,2760,2761],{},"    listen 80;\n",[158,2763,2764],{"class":160,"line":418},[158,2765,2766],{},"    server_name myapp.com;\n",[158,2768,2769],{"class":160,"line":425},[158,2770,415],{"emptyLinePlaceholder":414},[158,2772,2773],{"class":160,"line":517},[158,2774,2775],{},"    location \u002F {\n",[158,2777,2778],{"class":160,"line":525},[158,2779,2780],{},"        root \u002Fvar\u002Fwww\u002Fmyapp\u002Fdist; # Path to your React\u002FVue build\n",[158,2782,2783],{"class":160,"line":533},[158,2784,2785],{},"        index index.html;\n",[158,2787,2788],{"class":160,"line":544},[158,2789,2790],{},"        try_files $uri $uri\u002F \u002Findex.html; # Handle SPA routing (important!)\n",[158,2792,2793],{"class":160,"line":555},[158,2794,2795],{},"    }\n",[158,2797,2798],{"class":160,"line":563},[158,2799,2800],{},"}\n",[451,2802,2804],{"id":2803},"_2-caddy","2. Caddy",[10,2806,2807],{},"Best for \"no-fuss\" SSL and easy configuration.",[10,2809,2810],{},[56,2811,2704],{},[148,2813,2815],{"className":150,"code":2814,"language":152,"meta":153,"style":153},"sudo apt install -y caddy\n",[155,2816,2817],{"__ignoreMap":153},[158,2818,2819,2821,2823,2825,2828],{"class":160,"line":161},[158,2820,199],{"class":164},[158,2822,2716],{"class":172},[158,2824,2730],{"class":172},[158,2826,2827],{"class":168}," -y",[158,2829,2830],{"class":172}," caddy\n",[10,2832,2833],{},[56,2834,2741,2835,2745],{},[155,2836,2510],{},[148,2838,2841],{"className":2839,"code":2840,"language":2487,"meta":153,"style":153},"language-caddy shiki shiki-themes material-theme-lighter github-light monokai","myapp.com {\n    root * \u002Fvar\u002Fwww\u002Fmyapp\u002Fdist\n    file_server\n    try_files {path} \u002Findex.html # SPA routing\n}\n",[155,2842,2843,2848,2853,2858,2863],{"__ignoreMap":153},[158,2844,2845],{"class":160,"line":161},[158,2846,2847],{},"myapp.com {\n",[158,2849,2850],{"class":160,"line":239},[158,2851,2852],{},"    root * \u002Fvar\u002Fwww\u002Fmyapp\u002Fdist\n",[158,2854,2855],{"class":160,"line":418},[158,2856,2857],{},"    file_server\n",[158,2859,2860],{"class":160,"line":425},[158,2861,2862],{},"    try_files {path} \u002Findex.html # SPA routing\n",[158,2864,2865],{"class":160,"line":517},[158,2866,2800],{},[451,2868,2870],{"id":2869},"_3-traefik-docker","3. Traefik (Docker)",[10,2872,2873],{},"The standard for containerized environments.",[10,2875,2876],{},[56,2877,2878,2881],{},[155,2879,2880],{},"docker-compose.yml"," for your React App:",[148,2883,2885],{"className":469,"code":2884,"language":471,"meta":153,"style":153},"services:\n  traefik:\n    image: traefik:v3.0\n    command: [\"--api.insecure=true\", \"--providers.docker=true\", \"--entrypoints.web.address=:80\"]\n    ports: [\"80:80\", \"8080:8080\"]\n    volumes: [\"\u002Fvar\u002Frun\u002Fdocker.sock:\u002Fvar\u002Frun\u002Fdocker.sock:ro\"]\n\n  my-app:\n    image: my-react-app:latest\n    labels:\n      - \"traefik.http.routers.myapp.rule=Host(`myapp.com`)\"\n      - \"traefik.http.services.myapp.loadbalancer.server.port=80\"\n",[155,2886,2887,2894,2901,2911,2950,2977,2995,2999,3006,3015,3022,3033],{"__ignoreMap":153},[158,2888,2889,2892],{"class":160,"line":161},[158,2890,2891],{"class":478},"services",[158,2893,504],{"class":482},[158,2895,2896,2899],{"class":160,"line":239},[158,2897,2898],{"class":478},"  traefik",[158,2900,504],{"class":482},[158,2902,2903,2906,2908],{"class":160,"line":418},[158,2904,2905],{"class":478},"    image",[158,2907,483],{"class":482},[158,2909,2910],{"class":172}," traefik:v3.0\n",[158,2912,2913,2916,2918,2921,2923,2926,2928,2931,2933,2936,2938,2940,2942,2945,2947],{"class":160,"line":425},[158,2914,2915],{"class":478},"    command",[158,2917,483],{"class":482},[158,2919,2920],{"class":482}," [",[158,2922,1133],{"class":748},[158,2924,2925],{"class":172},"--api.insecure=true",[158,2927,1133],{"class":748},[158,2929,2930],{"class":482},",",[158,2932,871],{"class":748},[158,2934,2935],{"class":172},"--providers.docker=true",[158,2937,1133],{"class":748},[158,2939,2930],{"class":482},[158,2941,871],{"class":748},[158,2943,2944],{"class":172},"--entrypoints.web.address=:80",[158,2946,1133],{"class":748},[158,2948,2949],{"class":482},"]\n",[158,2951,2952,2955,2957,2959,2961,2964,2966,2968,2970,2973,2975],{"class":160,"line":517},[158,2953,2954],{"class":478},"    ports",[158,2956,483],{"class":482},[158,2958,2920],{"class":482},[158,2960,1133],{"class":748},[158,2962,2963],{"class":172},"80:80",[158,2965,1133],{"class":748},[158,2967,2930],{"class":482},[158,2969,871],{"class":748},[158,2971,2972],{"class":172},"8080:8080",[158,2974,1133],{"class":748},[158,2976,2949],{"class":482},[158,2978,2979,2982,2984,2986,2988,2991,2993],{"class":160,"line":525},[158,2980,2981],{"class":478},"    volumes",[158,2983,483],{"class":482},[158,2985,2920],{"class":482},[158,2987,1133],{"class":748},[158,2989,2990],{"class":172},"\u002Fvar\u002Frun\u002Fdocker.sock:\u002Fvar\u002Frun\u002Fdocker.sock:ro",[158,2992,1133],{"class":748},[158,2994,2949],{"class":482},[158,2996,2997],{"class":160,"line":533},[158,2998,415],{"emptyLinePlaceholder":414},[158,3000,3001,3004],{"class":160,"line":544},[158,3002,3003],{"class":478},"  my-app",[158,3005,504],{"class":482},[158,3007,3008,3010,3012],{"class":160,"line":555},[158,3009,2905],{"class":478},[158,3011,483],{"class":482},[158,3013,3014],{"class":172}," my-react-app:latest\n",[158,3016,3017,3020],{"class":160,"line":563},[158,3018,3019],{"class":478},"    labels",[158,3021,504],{"class":482},[158,3023,3024,3026,3028,3031],{"class":160,"line":573},[158,3025,584],{"class":482},[158,3027,871],{"class":748},[158,3029,3030],{"class":172},"traefik.http.routers.myapp.rule=Host(`myapp.com`)",[158,3032,877],{"class":748},[158,3034,3035,3037,3039,3042],{"class":160,"line":581},[158,3036,584],{"class":482},[158,3038,871],{"class":748},[158,3040,3041],{"class":172},"traefik.http.services.myapp.loadbalancer.server.port=80",[158,3043,877],{"class":748},[451,3045,3047],{"id":3046},"_4-haproxy","4. HAProxy",[10,3049,3050],{},"Pure performance and dedicated load balancing.",[10,3052,3053],{},[56,3054,3055,3056,2745],{},"Basic Frontend\u002FBackend (",[155,3057,3058],{},"\u002Fetc\u002Fhaproxy\u002Fhaproxy.cfg",[148,3060,3063],{"className":3061,"code":3062,"language":2578,"meta":153,"style":153},"language-haproxy shiki shiki-themes material-theme-lighter github-light monokai","frontend main_gateway\n    bind *:80\n    acl is_myapp hdr(host) -i myapp.com\n    use_backend react_cluster if is_myapp\n\nbackend react_cluster\n    balance roundrobin\n    server node1 192.168.1.10:80 check\n    server node2 192.168.1.11:80 check\n",[155,3064,3065,3070,3075,3080,3085,3089,3094,3099,3104],{"__ignoreMap":153},[158,3066,3067],{"class":160,"line":161},[158,3068,3069],{},"frontend main_gateway\n",[158,3071,3072],{"class":160,"line":239},[158,3073,3074],{},"    bind *:80\n",[158,3076,3077],{"class":160,"line":418},[158,3078,3079],{},"    acl is_myapp hdr(host) -i myapp.com\n",[158,3081,3082],{"class":160,"line":425},[158,3083,3084],{},"    use_backend react_cluster if is_myapp\n",[158,3086,3087],{"class":160,"line":517},[158,3088,415],{"emptyLinePlaceholder":414},[158,3090,3091],{"class":160,"line":525},[158,3092,3093],{},"backend react_cluster\n",[158,3095,3096],{"class":160,"line":533},[158,3097,3098],{},"    balance roundrobin\n",[158,3100,3101],{"class":160,"line":544},[158,3102,3103],{},"    server node1 192.168.1.10:80 check\n",[158,3105,3106],{"class":160,"line":555},[158,3107,3108],{},"    server node2 192.168.1.11:80 check\n",[2115,3110],{},[28,3112,3114],{"id":3113},"conclusion","🧠 Conclusion",[10,3116,3117],{},"Choosing the right reverse proxy depends on your architecture, your traffic, and how much time you want to spend on configuration.",[36,3119,3120,3129,3136,3144],{},[39,3121,3122,3123,3126,3127,264],{},"Want it ",[56,3124,3125],{},"automatic","? Go ",[56,3128,263],{},[39,3130,3122,3131,3126,3134,264],{},[56,3132,3133],{},"simple",[56,3135,2441],{},[39,3137,3138,3139,3126,3142,264],{},"Want the ",[56,3140,3141],{},"industry standard",[56,3143,2437],{},[39,3145,3146,3147,3126,3150,264],{},"Want ",[56,3148,3149],{},"raw performance",[56,3151,330],{},[1194,3153,3154],{},"html pre.shiki code .ssU3Q, html code.shiki .ssU3Q{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#A6E22E}html pre.shiki code .sqNgn, html code.shiki .sqNgn{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#E6DB74}html pre.shiki code .sWZ6u, html code.shiki .sWZ6u{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#F8F8F2}html pre.shiki code .sZ_HY, html code.shiki .sZ_HY{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#AE81FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s5svD, html code.shiki .s5svD{--shiki-light:#E53935;--shiki-default:#22863A;--shiki-dark:#F92672}html pre.shiki code .ssona, html code.shiki .ssona{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#E6DB74}",{"title":153,"searchDepth":239,"depth":239,"links":3156},[3157,3158,3162,3168,3174,3180],{"id":2360,"depth":239,"text":2361},{"id":2407,"depth":239,"text":2408,"children":3159},[3160,3161],{"id":2414,"depth":418,"text":2415},{"id":2456,"depth":418,"text":2457},{"id":2480,"depth":239,"text":2481,"children":3163},[3164,3165,3166,3167],{"id":2487,"depth":418,"text":2441},{"id":2519,"depth":418,"text":2450},{"id":2552,"depth":418,"text":263},{"id":2578,"depth":418,"text":330},{"id":2606,"depth":239,"text":2607,"children":3169},[3170,3171,3172,3173],{"id":2613,"depth":418,"text":2614},{"id":2634,"depth":418,"text":2635},{"id":2654,"depth":418,"text":2655},{"id":2668,"depth":418,"text":2669},{"id":2684,"depth":239,"text":2685,"children":3175},[3176,3177,3178,3179],{"id":2695,"depth":418,"text":2696},{"id":2803,"depth":418,"text":2804},{"id":2869,"depth":418,"text":2870},{"id":3046,"depth":418,"text":3047},{"id":3113,"depth":239,"text":3114},"2026-04-04","A reverse proxy is a server that sits in front of your application and forwards client requests to the appropriate backend server. Learn how to choose and configure the right reverse proxy for your needs.","\u002Farticles\u002Freverse_proxy\u002Fheader.png",{},"\u002Farticles\u002Fen\u002Freverse_proxy",{"title":2346,"description":3182},"articles\u002Fen\u002Freverse_proxy",[3189,2519,2487,2552,2578],"reverse_proxy","Cf4bn29q_S6i-eos7TJf4nhlpqmFjRbGwAfAD3Uh9sU",{"id":4,"title":5,"body":3192,"date":1212,"description":1213,"extension":1214,"image":1215,"meta":4060,"navigation":414,"path":1217,"seo":4061,"stem":1219,"tags":4062,"type":1223,"updatedAt":1224,"__hash__":1225},{"type":7,"value":3193,"toc":4045},[3194,3196,3198,3200,3202,3204,3206,3208,3216,3218,3256,3262,3268,3270,3276,3278,3296,3298,3300,3316,3318,3346,3348,3352,3354,3356,3374,3376,3396,3398,3406,3408,3412,3414,3416,3418,3420,3422,3428,3430,3432,3434,3436,3438,3440,3474,3481,3483,3487,3491,3595,3597,3611,3613,3625,3627,3632,3634,3664,3670,3672,3674,3724,3726,3730,3920,3922,3936,3938,3954,3956,3972,3978,3980,4018,4020,4024,4028,4030,4035,4037,4041,4043],[10,3195,12],{},[14,3197,17],{"id":16},[10,3199,20],{},[10,3201,23],{},[10,3203,26],{},[28,3205,31],{"id":30},[10,3207,34],{},[36,3209,3210,3212,3214],{},[39,3211,41],{},[39,3213,44],{},[39,3215,47],{},[10,3217,50],{},[36,3219,3220,3224,3228,3232,3236,3240,3244,3248,3252],{},[39,3221,3222,59],{},[56,3223,58],{},[39,3225,3226,65],{},[56,3227,64],{},[39,3229,3230,71],{},[56,3231,70],{},[39,3233,3234,77],{},[56,3235,76],{},[39,3237,3238,83],{},[56,3239,82],{},[39,3241,3242,89],{},[56,3243,88],{},[39,3245,3246,95],{},[56,3247,94],{},[39,3249,3250,101],{},[56,3251,100],{},[39,3253,3254,107],{},[56,3255,106],{},[10,3257,110,3258,114,3260,118],{},[56,3259,113],{},[56,3261,117],{},[10,3263,121,3264,128],{},[56,3265,124,3266],{},[126,3267],{},[14,3269,132],{"id":131},[10,3271,135,3272,139,3274,143],{},[56,3273,138],{},[56,3275,142],{},[10,3277,146],{},[148,3279,3280],{"className":150,"code":151,"language":152,"meta":153,"style":153},[155,3281,3282],{"__ignoreMap":153},[158,3283,3284,3286,3288,3290,3292,3294],{"class":160,"line":161},[158,3285,165],{"class":164},[158,3287,169],{"class":168},[158,3289,173],{"class":172},[158,3291,177],{"class":176},[158,3293,180],{"class":164},[158,3295,183],{"class":172},[10,3297,186],{},[10,3299,189],{},[148,3301,3302],{"className":150,"code":192,"language":152,"meta":153,"style":153},[155,3303,3304],{"__ignoreMap":153},[158,3305,3306,3308,3310,3312,3314],{"class":160,"line":161},[158,3307,199],{"class":164},[158,3309,202],{"class":172},[158,3311,205],{"class":172},[158,3313,208],{"class":172},[158,3315,211],{"class":172},[10,3317,214],{},[148,3319,3320],{"className":150,"code":217,"language":152,"meta":153,"style":153},[155,3321,3322,3334],{"__ignoreMap":153},[158,3323,3324,3326,3328,3330,3332],{"class":160,"line":161},[158,3325,224],{"class":164},[158,3327,227],{"class":172},[158,3329,230],{"class":172},[158,3331,233],{"class":172},[158,3333,236],{"class":172},[158,3335,3336,3338,3340,3342,3344],{"class":160,"line":239},[158,3337,242],{"class":164},[158,3339,245],{"class":172},[158,3341,248],{"class":172},[158,3343,251],{"class":172},[158,3345,254],{"class":172},[10,3347,257],{},[10,3349,260,3350,264],{},[56,3351,263],{},[10,3353,267],{},[10,3355,270],{},[148,3357,3358],{"className":150,"code":273,"language":152,"meta":153,"style":153},[155,3359,3360],{"__ignoreMap":153},[158,3361,3362,3364,3366,3368,3370,3372],{"class":160,"line":161},[158,3363,199],{"class":164},[158,3365,202],{"class":172},[158,3367,205],{"class":172},[158,3369,286],{"class":172},[158,3371,289],{"class":168},[158,3373,292],{"class":172},[10,3375,295],{},[148,3377,3378],{"className":150,"code":298,"language":152,"meta":153,"style":153},[155,3379,3380],{"__ignoreMap":153},[158,3381,3382,3384,3386,3388,3390,3392,3394],{"class":160,"line":161},[158,3383,199],{"class":164},[158,3385,202],{"class":172},[158,3387,205],{"class":172},[158,3389,208],{"class":172},[158,3391,313],{"class":172},[158,3393,316],{"class":168},[158,3395,319],{"class":172},[10,3397,322],{},[36,3399,3400,3402,3404],{},[39,3401,327],{},[39,3403,330],{},[39,3405,333],{},[10,3407,336],{},[338,3409,3410],{},[10,3411,342],{},[14,3413,346],{"id":345},[28,3415,350],{"id":349},[10,3417,353],{},[14,3419,357],{"id":356},[10,3421,360],{},[10,3423,363,3424,367,3426,371],{},[56,3425,366],{},[56,3427,370],{},[10,3429,374],{},[14,3431,378],{"id":377},[28,3433,382],{"id":381},[10,3435,385],{},[28,3437,389],{"id":388},[10,3439,392],{},[148,3441,3442],{"className":150,"code":395,"language":152,"meta":153,"style":153},[155,3443,3444,3454,3458,3462],{"__ignoreMap":153},[158,3445,3446,3448,3450,3452],{"class":160,"line":161},[158,3447,402],{"class":164},[158,3449,286],{"class":172},[158,3451,289],{"class":168},[158,3453,409],{"class":172},[158,3455,3456],{"class":160,"line":239},[158,3457,415],{"emptyLinePlaceholder":414},[158,3459,3460],{"class":160,"line":418},[158,3461,422],{"class":421},[158,3463,3464,3466,3468,3470,3472],{"class":160,"line":425},[158,3465,402],{"class":164},[158,3467,208],{"class":172},[158,3469,432],{"class":172},[158,3471,316],{"class":168},[158,3473,437],{"class":172},[338,3475,3476],{},[10,3477,442,3478,264],{},[444,3479,449],{"href":446,"rel":3480},[448],[451,3482,454],{"id":453},[10,3484,457,3485,461],{},[155,3486,460],{},[338,3488,3489],{},[10,3490,466],{},[148,3492,3493],{"className":469,"code":470,"language":471,"meta":153,"style":153},[155,3494,3495,3503,3511,3517,3525,3531,3537,3545,3553,3559,3567,3573,3581,3587],{"__ignoreMap":153},[158,3496,3497,3499,3501],{"class":160,"line":161},[158,3498,479],{"class":478},[158,3500,483],{"class":482},[158,3502,486],{"class":172},[158,3504,3505,3507,3509],{"class":160,"line":239},[158,3506,491],{"class":478},[158,3508,483],{"class":482},[158,3510,496],{"class":172},[158,3512,3513,3515],{"class":160,"line":418},[158,3514,501],{"class":478},[158,3516,504],{"class":482},[158,3518,3519,3521,3523],{"class":160,"line":425},[158,3520,509],{"class":478},[158,3522,483],{"class":482},[158,3524,514],{"class":172},[158,3526,3527,3529],{"class":160,"line":517},[158,3528,520],{"class":478},[158,3530,504],{"class":482},[158,3532,3533,3535],{"class":160,"line":525},[158,3534,528],{"class":478},[158,3536,504],{"class":482},[158,3538,3539,3541,3543],{"class":160,"line":533},[158,3540,536],{"class":478},[158,3542,483],{"class":482},[158,3544,541],{"class":172},[158,3546,3547,3549,3551],{"class":160,"line":544},[158,3548,547],{"class":478},[158,3550,483],{"class":482},[158,3552,552],{"class":172},[158,3554,3555,3557],{"class":160,"line":555},[158,3556,558],{"class":478},[158,3558,504],{"class":482},[158,3560,3561,3563,3565],{"class":160,"line":563},[158,3562,566],{"class":478},[158,3564,483],{"class":482},[158,3566,514],{"class":172},[158,3568,3569,3571],{"class":160,"line":573},[158,3570,576],{"class":478},[158,3572,504],{"class":482},[158,3574,3575,3577,3579],{"class":160,"line":581},[158,3576,584],{"class":482},[158,3578,587],{"class":478},[158,3580,504],{"class":482},[158,3582,3583,3585],{"class":160,"line":592},[158,3584,595],{"class":478},[158,3586,504],{"class":482},[158,3588,3589,3591,3593],{"class":160,"line":600},[158,3590,603],{"class":478},[158,3592,483],{"class":482},[158,3594,608],{"class":172},[10,3596,611],{},[148,3598,3599],{"className":150,"code":614,"language":152,"meta":153,"style":153},[155,3600,3601],{"__ignoreMap":153},[158,3602,3603,3605,3607,3609],{"class":160,"line":161},[158,3604,402],{"class":164},[158,3606,286],{"class":172},[158,3608,289],{"class":168},[158,3610,627],{"class":172},[451,3612,631],{"id":630},[148,3614,3615],{"className":150,"code":634,"language":152,"meta":153,"style":153},[155,3616,3617],{"__ignoreMap":153},[158,3618,3619,3621,3623],{"class":160,"line":161},[158,3620,402],{"class":164},[158,3622,208],{"class":172},[158,3624,645],{"class":172},[10,3626,648],{},[148,3628,3630],{"className":3629,"code":653,"language":654},[652],[155,3631,653],{"__ignoreMap":153},[451,3633,660],{"id":659},[148,3635,3636],{"className":150,"code":663,"language":152,"meta":153,"style":153},[155,3637,3638,3648],{"__ignoreMap":153},[158,3639,3640,3642,3644,3646],{"class":160,"line":161},[158,3641,402],{"class":164},[158,3643,672],{"class":172},[158,3645,675],{"class":172},[158,3647,678],{"class":172},[158,3649,3650,3652,3654,3656,3658,3660,3662],{"class":160,"line":239},[158,3651,402],{"class":164},[158,3653,286],{"class":172},[158,3655,687],{"class":168},[158,3657,316],{"class":168},[158,3659,692],{"class":172},[158,3661,289],{"class":168},[158,3663,697],{"class":172},[699,3665,3666],{},[10,3667,703,3668,707],{},[56,3669,706],{},[451,3671,711],{"id":710},[10,3673,714],{},[148,3675,3676],{"className":150,"code":717,"language":152,"meta":153,"style":153},[155,3677,3678,3704,3708],{"__ignoreMap":153},[158,3679,3680,3682,3684,3686,3688,3690,3692,3694,3696,3698,3700,3702],{"class":160,"line":161},[158,3681,402],{"class":164},[158,3683,726],{"class":172},[158,3685,729],{"class":172},[158,3687,732],{"class":172},[158,3689,316],{"class":168},[158,3691,692],{"class":172},[158,3693,739],{"class":168},[158,3695,742],{"class":172},[158,3697,745],{"class":168},[158,3699,749],{"class":748},[158,3701,752],{"class":172},[158,3703,755],{"class":748},[158,3705,3706],{"class":160,"line":239},[158,3707,415],{"emptyLinePlaceholder":414},[158,3709,3710,3712,3714,3716,3718,3720,3722],{"class":160,"line":418},[158,3711,402],{"class":164},[158,3713,766],{"class":172},[158,3715,769],{"class":172},[158,3717,772],{"class":172},[158,3719,775],{"class":172},[158,3721,316],{"class":168},[158,3723,678],{"class":172},[451,3725,783],{"id":782},[10,3727,457,3728,483],{},[155,3729,788],{},[148,3731,3732],{"className":469,"code":791,"language":471,"meta":153,"style":153},[155,3733,3734,3742,3750,3756,3764,3772,3778,3786,3794,3806,3812,3818,3828,3834,3840,3850,3858,3864,3870,3878,3884,3892,3898,3906,3912],{"__ignoreMap":153},[158,3735,3736,3738,3740],{"class":160,"line":161},[158,3737,479],{"class":478},[158,3739,483],{"class":482},[158,3741,802],{"class":172},[158,3743,3744,3746,3748],{"class":160,"line":239},[158,3745,491],{"class":478},[158,3747,483],{"class":482},[158,3749,811],{"class":172},[158,3751,3752,3754],{"class":160,"line":418},[158,3753,501],{"class":478},[158,3755,504],{"class":482},[158,3757,3758,3760,3762],{"class":160,"line":425},[158,3759,509],{"class":478},[158,3761,483],{"class":482},[158,3763,826],{"class":172},[158,3765,3766,3768,3770],{"class":160,"line":517},[158,3767,831],{"class":478},[158,3769,483],{"class":482},[158,3771,678],{"class":172},[158,3773,3774,3776],{"class":160,"line":525},[158,3775,840],{"class":478},[158,3777,504],{"class":482},[158,3779,3780,3782,3784],{"class":160,"line":533},[158,3781,847],{"class":478},[158,3783,483],{"class":482},[158,3785,514],{"class":172},[158,3787,3788,3790,3792],{"class":160,"line":544},[158,3789,856],{"class":478},[158,3791,483],{"class":482},[158,3793,861],{"class":172},[158,3795,3796,3798,3800,3802,3804],{"class":160,"line":555},[158,3797,866],{"class":478},[158,3799,483],{"class":482},[158,3801,871],{"class":748},[158,3803,874],{"class":172},[158,3805,877],{"class":748},[158,3807,3808,3810],{"class":160,"line":563},[158,3809,520],{"class":478},[158,3811,504],{"class":482},[158,3813,3814,3816],{"class":160,"line":573},[158,3815,888],{"class":478},[158,3817,504],{"class":482},[158,3819,3820,3822,3824,3826],{"class":160,"line":581},[158,3821,895],{"class":482},[158,3823,898],{"class":478},[158,3825,483],{"class":482},[158,3827,903],{"class":172},[158,3829,3830,3832],{"class":160,"line":592},[158,3831,908],{"class":478},[158,3833,504],{"class":482},[158,3835,3836,3838],{"class":160,"line":600},[158,3837,915],{"class":478},[158,3839,504],{"class":482},[158,3841,3842,3844,3846,3848],{"class":160,"line":920},[158,3843,923],{"class":482},[158,3845,926],{"class":478},[158,3847,483],{"class":482},[158,3849,931],{"class":172},[158,3851,3852,3854,3856],{"class":160,"line":934},[158,3853,937],{"class":478},[158,3855,483],{"class":482},[158,3857,942],{"class":172},[158,3859,3860,3862],{"class":160,"line":945},[158,3861,948],{"class":478},[158,3863,504],{"class":482},[158,3865,3866,3868],{"class":160,"line":953},[158,3867,956],{"class":478},[158,3869,504],{"class":482},[158,3871,3872,3874,3876],{"class":160,"line":961},[158,3873,964],{"class":478},[158,3875,483],{"class":482},[158,3877,969],{"class":172},[158,3879,3880,3882],{"class":160,"line":972},[158,3881,975],{"class":478},[158,3883,504],{"class":482},[158,3885,3886,3888,3890],{"class":160,"line":980},[158,3887,983],{"class":478},[158,3889,483],{"class":482},[158,3891,989],{"class":988},[158,3893,3894,3896],{"class":160,"line":992},[158,3895,995],{"class":478},[158,3897,504],{"class":482},[158,3899,3900,3902,3904],{"class":160,"line":1000},[158,3901,895],{"class":482},[158,3903,1005],{"class":478},[158,3905,504],{"class":482},[158,3907,3908,3910],{"class":160,"line":1010},[158,3909,1013],{"class":482},[158,3911,903],{"class":172},[158,3913,3914,3916,3918],{"class":160,"line":1018},[158,3915,1021],{"class":478},[158,3917,483],{"class":482},[158,3919,1026],{"class":172},[10,3921,1029],{},[148,3923,3924],{"className":150,"code":1032,"language":152,"meta":153,"style":153},[155,3925,3926],{"__ignoreMap":153},[158,3927,3928,3930,3932,3934],{"class":160,"line":161},[158,3929,402],{"class":164},[158,3931,286],{"class":172},[158,3933,289],{"class":168},[158,3935,1045],{"class":172},[451,3937,1049],{"id":1048},[148,3939,3940],{"className":150,"code":1052,"language":152,"meta":153,"style":153},[155,3941,3942],{"__ignoreMap":153},[158,3943,3944,3946,3948,3950,3952],{"class":160,"line":161},[158,3945,402],{"class":164},[158,3947,208],{"class":172},[158,3949,1063],{"class":172},[158,3951,316],{"class":168},[158,3953,678],{"class":172},[10,3955,1070],{},[148,3957,3958],{"className":150,"code":1073,"language":152,"meta":153,"style":153},[155,3959,3960],{"__ignoreMap":153},[158,3961,3962,3964,3966,3968,3970],{"class":160,"line":161},[158,3963,402],{"class":164},[158,3965,208],{"class":172},[158,3967,1084],{"class":172},[158,3969,316],{"class":168},[158,3971,678],{"class":172},[10,3973,1091,3974,1095,3976,1099],{},[155,3975,1094],{},[155,3977,1098],{},[451,3979,1103],{"id":1102},[148,3981,3982],{"className":150,"code":1106,"language":152,"meta":153,"style":153},[155,3983,3984],{"__ignoreMap":153},[158,3985,3986,3988,3990,3992,3994,3996,3998,4000,4002,4004,4006,4008,4010,4012,4014,4016],{"class":160,"line":161},[158,3987,402],{"class":164},[158,3989,316],{"class":168},[158,3991,692],{"class":172},[158,3993,208],{"class":172},[158,3995,1121],{"class":172},[158,3997,1124],{"class":172},[158,3999,1127],{"class":168},[158,4001,1130],{"class":172},[158,4003,1133],{"class":748},[158,4005,1136],{"class":172},[158,4007,1133],{"class":748},[158,4009,177],{"class":176},[158,4011,1143],{"class":164},[158,4013,1146],{"class":168},[158,4015,1149],{"class":482},[158,4017,1153],{"class":1152},[28,4019,1157],{"id":1156},[10,4021,1160,4022,1164],{},[155,4023,1163],{},[10,4025,4026],{},[1168,4027],{"alt":1170,"src":1171},[10,4029,1174],{},[148,4031,4033],{"className":4032,"code":1178,"language":654},[652],[155,4034,1178],{"__ignoreMap":153},[10,4036,1183],{},[10,4038,4039],{},[1168,4040],{"alt":1188,"src":1189},[10,4042,1192],{},[1194,4044,1196],{},{"title":153,"searchDepth":239,"depth":239,"links":4046},[4047,4048,4049,4050,4059],{"id":30,"depth":239,"text":31},{"id":349,"depth":239,"text":350},{"id":381,"depth":239,"text":382},{"id":388,"depth":239,"text":389,"children":4051},[4052,4053,4054,4055,4056,4057,4058],{"id":453,"depth":418,"text":454},{"id":630,"depth":418,"text":631},{"id":659,"depth":418,"text":660},{"id":710,"depth":418,"text":711},{"id":782,"depth":418,"text":783},{"id":1048,"depth":418,"text":1049},{"id":1102,"depth":418,"text":1103},{"id":1156,"depth":239,"text":1157},{},{"title":5,"description":1213},[1221,1222,345],1777912144368]