<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>VALDEMAR</title><description>Solutions architecture for production systems</description><link>https://heyvaldemar.com/</link><language>en</language><managingEditor>Vladimir Mikhalev &lt;v@valdemar.ai&gt;</managingEditor><webMaster>Vladimir Mikhalev &lt;v@valdemar.ai&gt;</webMaster><copyright>2026 Vladimir Mikhalev. All rights reserved.</copyright><image><url>https://heyvaldemar.com/images/logos/heyvaldemar-logo.svg</url><title>VALDEMAR</title><link>https://heyvaldemar.com/</link></image><lastBuildDate>Mon, 24 Aug 2026 00:00:00 GMT</lastBuildDate><ttl>60</ttl><atom:link href="https://heyvaldemar.com/rss.xml" rel="self" type="application/rss+xml" xmlns:atom="http://www.w3.org/2005/Atom"/><item><title>watsonx.governance Enforcement Tracking — Sampled Compliance and the Unevidenced Run</title><link>https://heyvaldemar.com/watsonx-governance-enforcement-tracking-sampled-compliance/</link><guid isPermaLink="true">https://heyvaldemar.com/watsonx-governance-enforcement-tracking-sampled-compliance/</guid><description>EU AI Act Article 12 wants a per-event record. Enforcement Tracking evidences thresholds on a schedule. What that gap costs, and the join key that closes it.</description><pubDate>Mon, 24 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Sixteen months. That is how far Regulation (EU) 2026/1744 moved the AI Act&apos;s high-risk deadline when it entered into force on 27 July 2026, pushing standalone Annex III obligations from 2 August 2026 out to 2 December 2027. The deferral moved the deadline. It did not move the record, and sampled compliance is the shape of what is left: governance evidence collected in windows, agent behavior that runs without one. I reviewed the configuration and the evidence model for IBM watsonx.governance Enforcement Tracking, which shipped on 11 August 2026, against the question an auditor actually asks.&lt;/p&gt;
&lt;p&gt;This failure shape is older than agents. In banking it was hourly configuration snapshots, and the snapshot became the definition of what the configuration was, because nothing between snapshots existed on paper. In telecom it was a five-minute polling interval on the network management system, and every incident timeline quietly rounded to five minutes. The interval always wins. When the interval is the only record, the interval becomes the truth, and everything between two samples becomes testimony instead of artifact. I wrote about the same gap on the infrastructure side in &lt;a href=&quot;/terraform-mcp-server-ga-agentic-iac-governance/&quot;&gt;the Apply Gate your auditor will ask about&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;What sampled compliance looks like in a running agent&lt;/h2&gt;
&lt;p&gt;Here is how most teams ship a containerized agent today.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;# kubernetes 1.30 — claims-triage agent as most teams ship it
apiVersion: apps/v1
kind: Deployment
metadata:
  name: claims-triage-agent
spec:
  replicas: 3
  selector:
    matchLabels:
      app: claims-triage-agent
  template:
    metadata:
      labels:
        app: claims-triage-agent
    spec:
      containers:
        - name: agent
          image: registry.internal/claims-triage-agent:1.4.2
          env:
            - name: ORCHESTRATE_ENDPOINT
              valueFrom:
                secretKeyRef:
                  name: wxo-credentials
                  key: endpoint
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nothing on that manifest connects a single execution to a governance record. The agent runs, it writes to stdout, and the only durable statement about its behavior is whatever the evaluation schedule captured. Ask for run 4192 and you get a shrug and a log query against whatever retention the cluster happens to have.&lt;/p&gt;
&lt;p&gt;The change is small and it is structural.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;# kubernetes 1.30 — same agent, every execution addressable
apiVersion: apps/v1
kind: Deployment
metadata:
  name: claims-triage-agent
  labels:
    ai.use-case-id: uc-claims-triage-eu
    ai.policy-version: &quot;2026.08.1&quot;
spec:
  replicas: 3
  selector:
    matchLabels:
      app: claims-triage-agent
  template:
    metadata:
      labels:
        app: claims-triage-agent
        ai.use-case-id: uc-claims-triage-eu
        ai.policy-version: &quot;2026.08.1&quot;
    spec:
      containers:
        - name: agent
          image: registry.internal/claims-triage-agent:1.4.2
          env:
            - name: ORCHESTRATE_ENDPOINT
              valueFrom:
                secretKeyRef:
                  name: wxo-credentials
                  key: endpoint
            - name: OTEL_EXPORTER_OTLP_ENDPOINT
              value: http://otel-collector.observability:4317
            - name: OTEL_RESOURCE_ATTRIBUTES
              value: ai.use_case.id=uc-claims-triage-eu,ai.policy.version=2026.08.1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Two additions. The workload now carries the same use-case identifier the governance system uses, and every execution emits a span under that identifier with the policy version that was live at the time. You are not storing prompts or outputs. You are storing the fact that a run occurred, under which policy, touching which tools. That is the join key, and without it the two systems can never be reconciled at all.&lt;/p&gt;
&lt;p&gt;Twenty years of production infrastructure and this pattern has arrived in three different decades of stack: snapshot intervals in banking, SNMP polling in telecom, and a change-management record sampling a pipeline that fired hundreds of times a day in a Series D environment. Each time the fix was the same and each time it looked like overhead until the first audit.&lt;/p&gt;
&lt;p&gt;The interval is the record. Everything between two samples is a story.&lt;/p&gt;
&lt;h2&gt;Why this keeps happening&lt;/h2&gt;
&lt;p&gt;The regulation asks for two different things and vendors ship the easier one first, because it is the one with a clean product surface.&lt;/p&gt;
&lt;p&gt;Article 12 of the AI Act requires high-risk systems to automatically record events across the lifetime of the system, with three stated purposes: identifying risk situations under Article 79, feeding post-market monitoring under Article 72, and supporting deployer oversight under Article 26, paragraph 5. Article 19 sets the retention floor for providers at six months, longer where other Union or national law applies, and Article 26, paragraph 6 places a parallel six-month duty on deployers for the logs under their control. Article 18 puts technical documentation on a ten-year clock. None of those clauses describes a threshold check. They describe a per-event record with a retention obligation attached.&lt;/p&gt;
&lt;p&gt;Enforcement Tracking, per IBM&apos;s announcement of 11 August 2026, connects watsonx Orchestrate to watsonx.governance, associates agents with governance use cases and controls, retrieves evaluation metrics on a scheduled basis for production agents, evaluates agents still in development on demand, and writes pass or breach results against business-set thresholds directly into the governance record. Hallucination, helpfulness and toxicity are the named metrics. That is a control attestation pipeline, automated, and it removes the quarterly scramble of assembling evidence by hand.&lt;/p&gt;
&lt;p&gt;The second thing is harder to productize because it is specific to your deployment. A vendor cannot know your correlation identifier, your policy versioning scheme, or which of your systems holds the execution ledger. So it stays where it has always stayed. The vendor shipped the evidence pipeline. The join key is still yours.&lt;/p&gt;
&lt;h2&gt;Risk and blast radius&lt;/h2&gt;
&lt;p&gt;Direct exposure runs through retention and traceability rather than through the metrics themselves. If your agent falls inside Annex III, the Article 12 record has to exist and the Article 19 and Article 26, paragraph 6 floors mean six months of it has to still be there when someone asks. A threshold snapshot taken on a schedule does not satisfy a per-event recording obligation, and no amount of dashboard polish converts one into the other. Penalty tiers under the Act put transparency and high-risk breaches at up to 15 million euro or 3% of worldwide turnover, with prohibited practices at 35 million euro or 7%.&lt;/p&gt;
&lt;p&gt;Read what the deferral actually deferred, because the headline flattens it. Annex III systems moved to 2 December 2027 and high-risk AI embedded in already-regulated products under Annex I moved to 2 August 2028. Article 50 transparency duties did not move at all; they took effect on 2 August 2026 as originally scheduled, alongside the prohibited-practices regime that has applied since February 2025 and the GPAI obligations running since August 2025. The Omnibus attached one new near-term date to them: systems already on the market before 2 August 2026 have until 2 December 2026 to carry machine-readable marking of AI-generated content. Sixteen months of relief on Annex III. Fourteen weeks on the marking obligation. And the stated reason for the delay was procedural rather than political: the CEN and CENELEC harmonised standards were not finished and several Member States had not designated their competent authorities. A deadline that moved because the referee was late is not a signal that the rules got softer.&lt;/p&gt;
&lt;p&gt;Systemic exposure is the part the deferral headline hides. Systems already placed on the EU market before the new deadlines are grandfathered out of full high-risk compliance unless they are later substantially modified, and regulators have not yet defined that threshold. For an agent that reasons over changing context, calls tools dynamically, and gets its prompts and models updated on a normal release cadence, &quot;substantially modified&quot; is not a rhetorical question. It is an evidentiary one, and answering it requires a change record joined to an execution record. Sampling cannot produce that answer in either direction.&lt;/p&gt;
&lt;p&gt;Before assuming Article 26, paragraph 6 is your ceiling, check which side of Article 25 you are standing on. A deployer who puts their own name or trademark on a high-risk system, or substantially modifies one already placed on the market, is treated as its provider. Assemble agents on a vendor platform, ship them under your own brand, and the provider obligations follow: the Article 12 recording capability and the Article 19 retention floor, not merely the deployer&apos;s duty to keep whatever the platform hands you. The original provider is relieved of them at that moment and owes you cooperation instead. The platform did not transfer the obligation. It transferred the role.&lt;/p&gt;
&lt;p&gt;Then the arithmetic. An agent invoked every five minutes executes 288 times a day, or 8,640 times over thirty days. Against a daily metrics synchronisation, that month closes with 30 evidence records covering 8,640 executions, or 0.35% of runs individually evidenced. Tighten the schedule to hourly and you get 720 records against 8,640 runs, which is 8.3%. The schedule is the right design for attesting a control. It is the wrong artifact for reconstructing an incident.&lt;/p&gt;
&lt;p&gt;A deferral you cannot document is not a deferral.&lt;/p&gt;
&lt;h2&gt;Options compared&lt;/h2&gt;
&lt;p&gt;Storage figures below are back-of-envelope from stated unit sizes, not measured: trace metadata at about 1.5 KB per span, full payload capture at about 1 MB per run average for a tool-calling agent, hash digest at about 150 bytes.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Evidence granularity&lt;/th&gt;
&lt;th&gt;Storage per 1M runs&lt;/th&gt;
&lt;th&gt;Question it answers at audit&lt;/th&gt;
&lt;th&gt;Fit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Scheduled enforcement tracking (watsonx.governance)&lt;/td&gt;
&lt;td&gt;One record per evaluation window&lt;/td&gt;
&lt;td&gt;Under 10 MB&lt;/td&gt;
&lt;td&gt;Were thresholds met at time T&lt;/td&gt;
&lt;td&gt;Control attestation. Required baseline, not the event record&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per-execution trace metadata (OpenTelemetry)&lt;/td&gt;
&lt;td&gt;One span per run, no payload&lt;/td&gt;
&lt;td&gt;~1.5 GB&lt;/td&gt;
&lt;td&gt;Did run X occur, when, under which policy, touching which tools&lt;/td&gt;
&lt;td&gt;The reconciliation layer. Cheapest path to Article 12 traceability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full request and response archival&lt;/td&gt;
&lt;td&gt;Every prompt and output&lt;/td&gt;
&lt;td&gt;~1 TB&lt;/td&gt;
&lt;td&gt;What exactly did the agent say and do&lt;/td&gt;
&lt;td&gt;Highest fidelity, highest GDPR and cost exposure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sampled payload capture (1% plus all breaches)&lt;/td&gt;
&lt;td&gt;Statistical, full on breach&lt;/td&gt;
&lt;td&gt;~15 GB&lt;/td&gt;
&lt;td&gt;What does a normal run look like, plus every bad one in full&lt;/td&gt;
&lt;td&gt;Pragmatic middle for non-regulated estates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hash-chained execution digest&lt;/td&gt;
&lt;td&gt;One signed digest per run&lt;/td&gt;
&lt;td&gt;~150 MB&lt;/td&gt;
&lt;td&gt;Has the record been altered since it was written&lt;/td&gt;
&lt;td&gt;Tamper-evidence for regulated or contested estates&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Most teams need rows one and two together. Row one without row two is a control with no event behind it.&lt;/p&gt;
&lt;h2&gt;Framework: reconciling the execution ledger with the evidence ledger&lt;/h2&gt;
&lt;h3&gt;Layer 1: use-case binding and execution inventory (week 1)&lt;/h3&gt;
&lt;p&gt;Start inside watsonx.governance, because that is where the identifier everything else joins to gets defined. Connect the watsonx Orchestrate instance, associate each agent with the AI use case and the controls it has to satisfy, and set the thresholds the business is prepared to defend in front of an auditor.&lt;/p&gt;
&lt;p&gt;Two options in that configuration change what the control is worth, and both are easy to leave on their defaults. Agents still in development can be evaluated on demand before they ship, which moves a threshold breach from the first production window back to build time. And a metric that crosses its limit can drive an automated workflow rather than only writing a result into the record. Turn both on. A control that pages someone beats a control that files something.&lt;/p&gt;
&lt;p&gt;That is the attestation half, and it is the half a vendor can ship for you. The other half is the identifier itself. Most organizations cannot yet say how many agents are running at all, which is the prerequisite problem behind &lt;a href=&quot;/agent-sprawl-2026-engineering-risk/&quot;&gt;Agent Sprawl&lt;/a&gt;. Give every run an identity carrying the same use-case id watsonx.governance now knows it by: one span per execution, three attributes that matter, no payload.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# opentelemetry-sdk 1.x — one span per agent execution, carrying the governance join key
from opentelemetry import trace

tracer = trace.get_tracer(&quot;wxo.agent.claims_triage&quot;)

def run_agent(request, ai_use_case_id: str, policy_version: str):
    with tracer.start_as_current_span(&quot;agent.execution&quot;) as span:
        span.set_attribute(&quot;ai.use_case.id&quot;, ai_use_case_id)
        span.set_attribute(&quot;ai.policy.version&quot;, policy_version)
        span.set_attribute(&quot;ai.agent.id&quot;, &quot;claims-triage&quot;)
        result = agent.invoke(request)
        span.set_attribute(&quot;ai.tools.invoked&quot;, &quot;,&quot;.join(result.tool_calls))
        span.set_attribute(&quot;ai.outcome&quot;, result.status)
        return result
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ship spans to an OpenTelemetry Collector and land them in a store you control, with retention set to your longest applicable obligation rather than your default. Six months is the AI Act floor. Financial services deployers answer to their own regime under Article 26, paragraph 6, measured in years. Set it at your ceiling now. Raising retention later does not recover what already aged out.&lt;/p&gt;
&lt;p&gt;Owner: AI governance lead for the watsonx.governance binding, platform engineer for the spans.&lt;/p&gt;
&lt;h3&gt;Layer 2: policy binding (week 2)&lt;/h3&gt;
&lt;p&gt;The join key belongs in infrastructure, not in a runbook. Terraform tags the agent&apos;s execution role with the same use-case identifier the governance system uses, and a permissions boundary states the blast radius as code.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;# terraform 1.x, aws provider 5.x — bound the agent&apos;s execution role, carry the governance join key
resource &quot;aws_iam_role&quot; &quot;agent_execution&quot; {
  name                 = &quot;wxo-agent-claims-triage&quot;
  permissions_boundary = aws_iam_policy.agent_boundary.arn
  assume_role_policy   = data.aws_iam_policy_document.agent_trust.json

  tags = {
    ai_use_case_id = var.ai_use_case_id # same key on every span and every evidence record
    policy_version = var.policy_version
  }
}

resource &quot;aws_iam_policy&quot; &quot;agent_boundary&quot; {
  name   = &quot;wxo-agent-boundary&quot;
  policy = data.aws_iam_policy_document.agent_boundary.json
}

data &quot;aws_iam_policy_document&quot; &quot;agent_trust&quot; {
  statement {
    effect  = &quot;Allow&quot;
    actions = [&quot;sts:AssumeRoleWithWebIdentity&quot;]

    principals {
      type        = &quot;Federated&quot;
      identifiers = [var.oidc_provider_arn]
    }

    condition {
      test     = &quot;StringEquals&quot;
      variable = &quot;${var.oidc_provider_host}:sub&quot;
      values   = [&quot;system:serviceaccount:default:claims-triage-agent&quot;]
    }
  }
}

variable &quot;ai_use_case_id&quot; { type = string }
variable &quot;policy_version&quot; { type = string }
variable &quot;oidc_provider_arn&quot; { type = string }
variable &quot;oidc_provider_host&quot; { type = string }

data &quot;aws_iam_policy_document&quot; &quot;agent_boundary&quot; {
  statement {
    effect    = &quot;Allow&quot;
    actions   = [&quot;s3:GetObject&quot;]
    resources = [&quot;arn:aws:s3:::claims-reference/*&quot;]
  }

  statement {
    effect    = &quot;Deny&quot;
    actions   = [&quot;iam:*&quot;, &quot;sts:AssumeRole&quot;]
    resources = [&quot;*&quot;]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If the estate runs HCP Terraform or Terraform Enterprise, gate the plan before the apply. Sentinel reads the plan directly, so a role provisioned without the governance tag never reaches state.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;# sentinel policy — refuse a plan that provisions an agent role with no governance use case
import &quot;tfplan/v2&quot; as tfplan

required_tag = &quot;ai_use_case_id&quot;

agent_roles = filter tfplan.resource_changes as _, rc {
	rc.type is &quot;aws_iam_role&quot; and
		rc.mode is &quot;managed&quot; and
		(rc.change.actions contains &quot;create&quot; or rc.change.actions contains &quot;update&quot;)
}

main = rule {
	all agent_roles as _, rc {
		rc.change.after.tags[required_tag] else &quot;&quot; is not &quot;&quot;
	}
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That catches the resource at provision time. The second gate catches the workload at admission time, because a correctly tagged role says nothing about whether the pod that assumes it emits anything.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-rego&quot;&gt;# opa 1.x / conftest — block agent deploys that cannot be joined to a governance use case
package agent.evidence

deny contains msg if {
	input.kind == &quot;Deployment&quot;
	not input.metadata.labels[&quot;ai.use-case-id&quot;]
	msg := &quot;missing ai.use-case-id label: runs cannot be joined to governance evidence&quot;
}

deny contains msg if {
	input.kind == &quot;Deployment&quot;
	some c in input.spec.template.spec.containers
	not otlp_configured(c)
	msg := sprintf(&quot;container %q has no OTEL_EXPORTER_OTLP_ENDPOINT: executions will not be recorded&quot;, [c.name])
}

otlp_configured(c) if {
	some e in c.env
	e.name == &quot;OTEL_EXPORTER_OTLP_ENDPOINT&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Owner: security engineer.&lt;/p&gt;
&lt;h3&gt;Layer 3: reconciled audit (week 3 onward)&lt;/h3&gt;
&lt;p&gt;Two ledgers, one key, one number that tells you whether the record has holes in it.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;# prometheus 2.x — alert when agent runs have no matching governance evidence record
groups:
  - name: agent-evidence-coverage
    interval: 5m
    rules:
      - record: agent:runs_unevidenced:ratio1h
        expr: |
          1 - (
            sum by (ai_use_case_id) (increase(agent_runs_evidenced_total[1h]))
            /
            clamp_min(sum by (ai_use_case_id) (increase(agent_runs_total[1h])), 1)
          )

      - alert: AgentEvidenceCoverageBelowFloor
        expr: agent:runs_unevidenced:ratio1h &amp;gt; 0.05
        for: 15m
        labels:
          severity: page
          control: eu-ai-act-art-12
        annotations:
          summary: Agent runs without a matching governance evidence record
          description: &amp;gt;
            {{ $value | humanizePercentage }} of runs for use case
            {{ $labels.ai_use_case_id }} have no evidence record in the last hour.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The alert does not say the agent misbehaved. It says the record has a hole in it, which is the failure you cannot fix retroactively. Put the same ratio on a Grafana panel beside your evaluation metrics, so the governance lead reads both in one frame. Quality tells you how the agent behaved. Coverage tells you whether you can prove it.&lt;/p&gt;
&lt;p&gt;Owner: SRE, with the AI governance lead setting the floor.&lt;/p&gt;
&lt;h2&gt;Tradeoffs&lt;/h2&gt;
&lt;p&gt;Adoption friction is real and it is mostly week one. Instrumenting spans across every agent path takes a sprint, the OTLP collector and its retention tier need a budget line, and someone has to own a versioning scheme for policies that was previously implicit. At roughly 1.5 KB per span you are looking at about 1.5 GB per million executions before compression, which is a rounding error next to any observability bill you already pay.&lt;/p&gt;
&lt;p&gt;Ignoring it costs asymmetrically. The evidence you did not collect cannot be reconstructed after the request arrives, and the request arrives at the worst possible moment: a complaint, an incident, a due-diligence questionnaire, a market surveillance authority asking under Article 26, paragraph 6. The sixteen-month deferral makes this feel optional. It is the opposite. Sixteen months is exactly how long you now have to accumulate the record that proves your system was not substantially modified.&lt;/p&gt;
&lt;h2&gt;The closing argument&lt;/h2&gt;
&lt;p&gt;Adopt Enforcement Tracking for what it is. It automates the control attestation, it writes pass and breach evidence without a human assembling screenshots, and for teams currently maintaining governance evidence by hand it removes real work on day one. Hold on treating it as the audit trail, because a threshold snapshot and a per-event record are different artifacts with different retention clocks. The gap is not a defect in the release; it is the part that was always going to be specific to your deployment, and the join key was always going to be yours to define. The storage is cheap. The reconstruction is not.&lt;/p&gt;
&lt;h2&gt;Sources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;IBM, &lt;a href=&quot;https://www.ibm.com/new/announcements/from-governance-policies-to-governance-proof-with-enforcement-tracking-for-watsonx-orchestrate&quot;&gt;From governance policies to governance proof with Enforcement Tracking for watsonx Orchestrate&lt;/a&gt;, August 11, 2026&lt;/li&gt;
&lt;li&gt;IBM Documentation, &lt;a href=&quot;https://www.ibm.com/docs/en/watsonx/saas?topic=console-configuring-metrics-synchronization-watsonx-orchestrate-agents&quot;&gt;Configuring metrics synchronization for watsonx Orchestrate agents&lt;/a&gt; (evaluation schedule, threshold evidence), accessed August 2026&lt;/li&gt;
&lt;li&gt;Official Journal of the European Union, &lt;a href=&quot;https://eur-lex.europa.eu/eli/reg/2026/1744/oj&quot;&gt;Regulation (EU) 2026/1744&lt;/a&gt; (Digital Omnibus on AI), published July 24, 2026, in force July 27, 2026&lt;/li&gt;
&lt;li&gt;European Commission AI Act Service Desk, &lt;a href=&quot;https://ai-act-service-desk.ec.europa.eu/en/ai-act/article-19&quot;&gt;Article 19: Automatically generated logs&lt;/a&gt; (six-month retention floor), accessed August 2026&lt;/li&gt;
&lt;li&gt;White &amp;amp; Case, &lt;a href=&quot;https://www.whitecase.com/insight-alert/eu-ai-omnibus-enters-force-amending-ai-act&quot;&gt;EU AI Omnibus enters into force, amending the AI Act&lt;/a&gt; (Annex III and Annex I deadlines, Article 50 unchanged), 2026&lt;/li&gt;
&lt;li&gt;Cooley, &lt;a href=&quot;https://cdp.cooley.com/digital-ai-omnibus-delays-key-deadlines-introduces-new-rules/&quot;&gt;Digital AI Omnibus Delays Key Deadlines, Introduces New Rules&lt;/a&gt; (2 December 2026 marking deadline, Annex I and public-authority dates), 2026&lt;/li&gt;
&lt;li&gt;Gibson Dunn, &lt;a href=&quot;https://www.gibsondunn.com/eu-ai-act-omnibus-agreement-postponed-high-risk-deadlines-and-other-key-changes/&quot;&gt;EU AI Act Omnibus Agreement: Postponed High-Risk Deadlines and Other Key Changes&lt;/a&gt; (CEN/CENELEC standards, authority designation), May 2026&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Discussion&lt;/h2&gt;
&lt;p&gt;If you have wired agent executions to a governance record, or you have decided the sampled attestation is enough for your risk profile, drop a comment on the post. Counterarguments are welcome and the comment thread is where I respond first. For longer back-and-forth with senior practitioners, join the discussion on &lt;a href=&quot;https://heyvaldemar.com/discord&quot;&gt;Discord&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>AI &amp; MLOps</category><category>AI Governance</category><category>watsonx</category><category>IBM</category><category>MLOps</category><category>Observability</category><category>Kubernetes</category><category>Terraform</category><category>Platform Engineering</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Merge Debt: The 2026 Bill Your Parallel AI Agents Are Running Up</title><link>https://heyvaldemar.com/merge-debt-2026-parallel-ai-agents/</link><guid isPermaLink="true">https://heyvaldemar.com/merge-debt-2026-parallel-ai-agents/</guid><description>Three agents finish in parallel. Main takes one landing at a time. METR&apos;s perception gap, the rebase tax, and why Merge Debt is the number nobody plots.</description><pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Every parallel-agent demo ends on the same frame, and the frame is a lie of omission: three sessions running, three diffs growing, a satisfied cut to the dashboard. The hour the demo never shows is the one that decides whether any of it was velocity: three finished branches, one &lt;code&gt;main&lt;/code&gt;, and a human who now has to land all of it.&lt;/p&gt;
&lt;p&gt;The demo sold you velocity. What you actually took delivery of is inventory.&lt;/p&gt;
&lt;p&gt;That hour is where the productivity story goes to get audited. In &lt;a href=&quot;/agent-sprawl-2026-engineering-risk/&quot;&gt;Part 1&lt;/a&gt; I named the visibility gap: parallel sessions nobody inventories. In &lt;a href=&quot;/senior-engineer-signal-2026-velocity-risk/&quot;&gt;Part 2&lt;/a&gt; I showed whose judgment catches what the dashboards miss. This part is about the narrowest point in the whole pipeline, the one the agents cannot parallelize for you: getting their work into main.&lt;/p&gt;
&lt;p&gt;The category needs a name too. Here is mine: Merge Debt.&lt;/p&gt;
&lt;h2&gt;The debt, named&lt;/h2&gt;
&lt;p&gt;Merge Debt is the accumulating gap between code your agents have finished and code that has actually landed in main, reviewed, shaped, and reconciled with everything else that landed first.&lt;/p&gt;
&lt;p&gt;It is not merge conflicts. Conflicts are the visible sliver. Merge Debt includes the finished branch waiting two days for review capacity, the rebase nobody has run yet, the three-thousand-line diff that arrived as one commit called &quot;update payments,&quot; and the decision no one explicitly owns: which of three finished branches lands first. Writing code got parallel. Landing code stayed serial. Debt piles up exactly at that seam.&lt;/p&gt;
&lt;p&gt;Any operations executive would recognize the shape on sight: work-in-progress inventory stacking up in front of the narrowest station on the line. Engineering has just not started booking it as inventory.&lt;/p&gt;
&lt;h2&gt;The perception gap has a number now&lt;/h2&gt;
&lt;p&gt;The reason Merge Debt goes unbudgeted is that the people accumulating it sincerely believe they are ahead.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Experienced open-source developers completed real tasks 19% slower when allowed to use AI tools. Afterwards, the same developers estimated AI had made them 20% faster.&lt;/p&gt;
&lt;p&gt;— &lt;a href=&quot;https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/&quot;&gt;METR randomized controlled trial&lt;/a&gt;, 16 developers, 246 tasks, early 2025&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Read the two numbers together. Not &quot;AI is slow.&quot; The tools have moved on, and METR itself labels the result historical. The finding that survives is the direction of the error: a thirty-nine-point gap between felt speed and measured speed, in the cohort with the best-calibrated instincts in the industry. Generating code feels like progress with a precision that landing code never matches. So the generating gets counted and the landing gets discovered.&lt;/p&gt;
&lt;p&gt;Now run that error at parallel scale. One agent inflates your sense of velocity. Three agents inflate it three ways at once, while the landing pipeline they all share has not gotten one commit wider.&lt;/p&gt;
&lt;h2&gt;The landing is serial&lt;/h2&gt;
&lt;p&gt;Here is the mechanical part, and it is arithmetic, not opinion.&lt;/p&gt;
&lt;p&gt;Worktrees parallelize the work. Each agent edits its own copy of the tree, nothing collides while the work is in flight, and that is the correct primitive; I made that case in Part 1. But main is a single sequence. When three finished branches come home, one of them merges clean. The second rebases onto a main that just moved, and pays for it. The third rebases onto both, and pays compound. The wider each diff, the steeper the surcharge, and agent diffs run wide.&lt;/p&gt;
&lt;p&gt;Someone chooses the landing order, or nobody does and the order chooses itself: whoever merges first wins the clean rebase, and the cost silently reassigns itself to whoever was slower to press the button. That is a scheduling decision with real engineering cost, and in most teams running parallel agents today, it has no owner. Merge order is set by button latency.&lt;/p&gt;
&lt;p&gt;I run agents through worktrees daily across the fifty-plus public repositories I maintain, and the shift in my own week is the tell: the hours did not disappear when the agents arrived. They moved from writing the change to sequencing, shaping, and reviewing what the agents wrote. The queue is where my time goes now.&lt;/p&gt;
&lt;p&gt;And the one gate every branch still has to pass is the one that did not scale. CI got faster and agents got better at making it green. Green CI tells you the tests you already had still pass. It does not tell you the change is right, and it especially does not tell you three changes are right together. The remaining gate is human review, and Part 2 already showed what is happening to that capacity: the reviewers best at catching &quot;almost right&quot; are the scarcest resource in the building. Parallel agents do not add reviewers. They add queue.&lt;/p&gt;
&lt;h2&gt;What the demos skip&lt;/h2&gt;
&lt;p&gt;The shape of what arrives at review is the other half of the debt.&lt;/p&gt;
&lt;p&gt;An agent that worked for forty minutes hands you the result as one sprawling diff. Left alone, that becomes one commit, named something like &quot;update payments,&quot; sitting on top of a history that used to mean something. Six months later &lt;code&gt;git bisect&lt;/code&gt; lands on it, and the answer to &quot;what broke&quot; is &quot;one of these nine hundred lines.&quot; &lt;code&gt;git blame&lt;/code&gt; points at a commit whose message explains nothing, authored by a session nobody can replay.&lt;/p&gt;
&lt;p&gt;Put that in front of an incident review, the way Part 1 put untracked sessions in front of a SOC 2 walkthrough, and the aesthetic complaint becomes a forensics gap: the record of what changed and why ends exactly where the machine took over. Part 2 walked through the GitClear data on duplication rising and refactoring collapsing inside AI-era codebases. History quality is the same decay, one layer up: the code got wider and the record of why got thinner, at the exact moment more of the code has no human author to ask.&lt;/p&gt;
&lt;h2&gt;The market response&lt;/h2&gt;
&lt;p&gt;The tooling response to Merge Debt is starting to ship, and, in fairness to the argument I have been building since Part 1, most of it is shipping on top of the commit graph.&lt;/p&gt;
&lt;p&gt;On the desktop side, &lt;a href=&quot;https://help.gitkraken.com/gitkraken-desktop/gkd-gitkraken-ai/&quot;&gt;Commit Composer&lt;/a&gt; takes the sprawling agent diff and restructures it into logical, reviewable commits before it reaches a teammate. That attacks the landfill problem at the right point in the pipeline: after the agent finishes, before review burns time on it. Auto-resolve with AI handles the mechanical class of rebase conflicts and explains its proposed resolution, which is the correct division of labor. The rote line-matching goes to the machine. The semantic call, whether two changes are right together, stays with the human, because no merge tool can make it.&lt;/p&gt;
&lt;p&gt;On the IDE side, &lt;a href=&quot;https://www.gitkraken.com/blog/gitlens-18-turns-the-commit-graph-into-an-agent-command-center&quot;&gt;GitLens 18&lt;/a&gt; turned the commit graph into the place where agent sessions, worktrees, and working changes sit in one view, and the point releases have been filling in the landing workflow specifically: &lt;a href=&quot;https://help.gitkraken.com/gitlens/gitlens-release-notes-current/&quot;&gt;squash and reword straight from the graph in 18.1, and a more capable Compose mode with smarter AI conflict resolution in 18.3&lt;/a&gt;. The pattern across both products is consistent: the vendor that spent a decade betting on the graph is now wiring the landing pipeline into it.&lt;/p&gt;
&lt;p&gt;Stated plainly, as always: Commit Composer and Auto-resolve are part of GitKraken AI, which sits behind a paid plan, and both are in preview. And no tool in this section repays Merge Debt for you. What it does is make the debt visible and the repayment cheap enough to happen daily instead of quarterly. The interface argument for why this belongs on a graph instead of five terminal panes has been made well elsewhere, including &lt;a href=&quot;https://devops.pink/the-terminal-was-never-the-point-parallel-ai-coding-agents/&quot;&gt;on devops.pink this week&lt;/a&gt;. My concern is narrower: the queue.&lt;/p&gt;
&lt;h2&gt;Control protocol&lt;/h2&gt;
&lt;p&gt;What managing Merge Debt looks like, at minimum. None of it requires believing a single vendor claim.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Give merge order an owner.&lt;/strong&gt; If three branches finish together, landing sequence is an engineering decision: smallest-blast-radius first, or hottest-file first, but chosen, not defaulted to button latency. Thirty seconds of thought per landing, and the compound rebase tax stops being random.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Budget diff width per agent task.&lt;/strong&gt; The wider the diff, the steeper every downstream cost: rebase, review, revert. Cap agent tasks the way you cap PR size for humans, and split before landing, not after the review stalls.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Make commit shaping a mandatory landing step.&lt;/strong&gt; Machine output does not get to enter history as one blob. Whether the shaping is done by Commit Composer or by hand, &quot;reviewable commits with meaningful messages&quot; is the entry fee to main. Your future bisect is the beneficiary.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Check the heat map before you spawn.&lt;/strong&gt; Two agents aimed at the same module is a collision you scheduled. The graph shows every active worktree and what it touches; ten seconds of looking before launching agent three is the cheapest conflict resolution that exists.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. Plot the debt.&lt;/strong&gt; Two numbers per team, on the same dashboard as velocity: time from agent-done to merged-in-main, and share of agent-authored code reworked within two weeks. The first is your queue depth. The second is your quality echo. Both are measurable today with the &lt;a href=&quot;/ai-productivity-measurement/&quot;&gt;per-team measurement discipline&lt;/a&gt; this series keeps coming back to, and neither shows up in the commit count everyone is currently applauding.&lt;/p&gt;
&lt;h2&gt;Three questions for your next engineering leadership meeting&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;What is our median time from &quot;agent finished&quot; to &quot;merged in main,&quot; and is it growing?&lt;/li&gt;
&lt;li&gt;Who decided the landing order of the last three parallel branches that touched the same service, and was it decided at all?&lt;/li&gt;
&lt;li&gt;What share of AI-authored code that merged last quarter was rewritten within two weeks?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If those come back fast, your landing pipeline is instrumented. If they come back as shrugs, the debt is already on the books. You are just not the one carrying it yet. Your reviewers are.&lt;/p&gt;
&lt;h2&gt;GitKraken Ambassador Note&lt;/h2&gt;
&lt;p&gt;As a &lt;a href=&quot;https://www.gitkraken.com/meet-the-gitkraken-ambassadors&quot;&gt;GitKraken Ambassador&lt;/a&gt;, I write about the layer of the stack where engineering teams actually lose time, whether or not a tool exists there yet.&lt;/p&gt;
&lt;p&gt;Merge Debt is that layer this year. The graph-first landing workflow in GitKraken Desktop and GitLens 18 is the first commercial tooling I have reviewed that treats landing, not generating, as the bottleneck. That diagnosis matches everything I see in production, which is why it lands here.&lt;/p&gt;
&lt;p&gt;The adoption verdict, stated as a tradeoff: if your team runs more than one agent against one repository, the graph-plus-worktrees landing workflow is the part I would adopt this quarter. If you run one agent, serially, you can hold; your Merge Debt is small enough to manage by hand. And the part that repays the debt fastest, Commit Composer and Auto-resolve, sits behind the paid plan in preview. That is the cost side, and you should price it against your reviewers&apos; hours, because that is the currency the debt is denominated in.&lt;/p&gt;
&lt;h2&gt;Discussion&lt;/h2&gt;
&lt;p&gt;If you are running parallel agents and your agent-done-to-merged time says something different, drop a comment on the post. Counterarguments welcome, and the comment thread is where I respond first. For longer back-and-forth with senior practitioners, join the discussion on &lt;a href=&quot;https://heyvaldemar.com/discord&quot;&gt;Discord&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Opinion &amp; Culture</category><category>AI</category><category>DevOps</category><category>Engineering Leadership</category><category>Git</category><category>GitKraken</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Terraform MCP server GA: the Apply Gate your auditor will ask about</title><link>https://heyvaldemar.com/terraform-mcp-server-ga-agentic-iac-governance/</link><guid isPermaLink="true">https://heyvaldemar.com/terraform-mcp-server-ga-agentic-iac-governance/</guid><description>HashiCorp&apos;s Terraform MCP server is GA and IBM Bob can write production IaC. ENABLE_TF_OPERATIONS separates a safe assistant from autonomous apply.</description><pubDate>Tue, 30 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;There is one environment variable in the Terraform MCP server that decides whether an AI agent reads your infrastructure or destroys it, and on June 11, 2026 it went generally available with the default set to false. The flag is &lt;code&gt;ENABLE_TF_OPERATIONS&lt;/code&gt;, and the day a team flips it to true is the day an autonomous agent can run apply against a production workspace. I tested the GA release against real IaC workflows, and the code the agent generated was never the problem.&lt;/p&gt;
&lt;p&gt;This is a pattern, not a HashiCorp problem. Over twenty years I have watched the same gap open every time a faster tool meets a change-control process: the tool that writes the configuration is never the liability, the missing line in the audit record is. I saw it when Terraform itself replaced hand-built infrastructure, and the question now is identical, only the author is an agent instead of a junior engineer. I traced the same agent-era audit gap in &lt;a href=&quot;/agent-sprawl-2026-engineering-risk/&quot;&gt;Agent Sprawl&lt;/a&gt;; the Terraform MCP server is where that gap meets production IaC. The Apply Gate is the part the release notes do not dwell on, and it is the part your auditor will.&lt;/p&gt;
&lt;h2&gt;What the agentic apply default looks like&lt;/h2&gt;
&lt;p&gt;In its default posture the server is safe. Destructive operations are disabled, the transport stays local, and the agent connects read-only.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;# terraform-mcp-server, default posture: read and explain only
# destructive operations stay disabled, no flag set
terraform-mcp-server stdio --toolsets=registry,registry-private
# ENABLE_TF_OPERATIONS is unset (false): create_run is unavailable
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In this mode the agent searches your private registry, surfaces approved modules, and explains a plan file in natural language. Credentials never reach the model. Token scoping holds. This is a defensible default and HashiCorp deserves credit for shipping it that way.&lt;/p&gt;
&lt;p&gt;Then the gate opens.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;# operations enabled: create_run is now live
export ENABLE_TF_OPERATIONS=true
# create_run can now issue a plan_and_apply run
# the agent can plan, and apply if approved
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That one line unlocks the &lt;code&gt;create_run&lt;/code&gt; tool, which can issue a &lt;code&gt;plan_and_apply&lt;/code&gt; run: plan, then apply on approval. The server can now change state. The question stops being technical. It becomes governance: who approves the apply, and is that approval written down in a form your compliance team can read in six months.&lt;/p&gt;
&lt;p&gt;I pointed agentic generation at a module provisioning an S3 bucket and an IAM role. The output was clean and compliant with the registry patterns. What was missing was a single record answering one question: which named human decided this agent could run apply against this workspace. Across banking, telecom, and cloud-native environments I have audited agent-written and hand-written Terraform the same way, and the failure mode does not change with the decade or the tool. The gap is always the missing approver.&lt;/p&gt;
&lt;h2&gt;Why this keeps happening&lt;/h2&gt;
&lt;p&gt;HashiCorp&apos;s own GA announcement names the clients that can drive the server: GitHub Copilot, Claude Desktop, and IBM Bob. IBM Bob reached general availability in April 2026 as IBM&apos;s enterprise agentic development partner, which means there is now an official, supported path for an autonomous agent to write the Terraform that provisions production. The InfoQ coverage of the original experimental release in August 2025 already framed these servers as a &quot;critical new interface layer between trusted automation systems and emerging AI ecosystems.&quot; GA turned that interface from experiment to supported product.&lt;/p&gt;
&lt;p&gt;The audit gap recurs for a structural reason. Vendors secure the boundary they own: authentication, authorization, transport, secret exposure. HashiCorp did exactly that, and did it well. The audit trail for human intent sits one layer above the boundary, inside your change-control process, and no MCP server can ship it for you because it depends on your org chart, your policy sets, and your definition of who is allowed to accept risk.&lt;/p&gt;
&lt;h2&gt;Risk and blast radius&lt;/h2&gt;
&lt;p&gt;Direct exposure: an autonomous &lt;code&gt;plan_and_apply&lt;/code&gt; against a production workspace, authorized by a flipped environment variable rather than a named human, is the precise event a SOC 2 change-management control exists to prevent. In a regulated environment, an apply with no attributable approver is an audit finding waiting to be written. Under frameworks that require demonstrable separation of duties, &quot;the agent did it&quot; is not an answer an auditor accepts.&lt;/p&gt;
&lt;p&gt;Systemic exposure: the server connects to your private registry and your workspaces, and with operations enabled it can run against any workspace the scoped token reaches. A token scoped too broadly turns one convenience flag into organization-wide apply capability. The blast radius is the set of workspaces the token can see, multiplied by every team that flips the flag without recording why.&lt;/p&gt;
&lt;h2&gt;Options compared&lt;/h2&gt;
&lt;p&gt;Three deployment postures, the tradeoff each carries, and the fit.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Posture&lt;/th&gt;
&lt;th&gt;Agent capability&lt;/th&gt;
&lt;th&gt;Audit artifact required&lt;/th&gt;
&lt;th&gt;Adoption friction&lt;/th&gt;
&lt;th&gt;Fit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Default (read-only)&lt;/td&gt;
&lt;td&gt;Search registry, explain plans&lt;/td&gt;
&lt;td&gt;None beyond token scope&lt;/td&gt;
&lt;td&gt;Minimal, deploy and go&lt;/td&gt;
&lt;td&gt;Every team, today&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operations + Sentinel gate&lt;/td&gt;
&lt;td&gt;plan_and_apply, policy-gated&lt;/td&gt;
&lt;td&gt;Sentinel policy set per workspace, audit log&lt;/td&gt;
&lt;td&gt;Moderate, one deploy cycle&lt;/td&gt;
&lt;td&gt;Teams with policy-as-code in place&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operations, no gate&lt;/td&gt;
&lt;td&gt;plan_and_apply, ungated&lt;/td&gt;
&lt;td&gt;Nothing enforced&lt;/td&gt;
&lt;td&gt;Lowest setup, highest exposure&lt;/td&gt;
&lt;td&gt;Do not ship to production&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;This is not &quot;my pick wins.&quot; Read-only is the right call for almost everyone right now. Operations behind a Sentinel gate is the destination once the record exists. Operations with no gate is the one I would not deploy.&lt;/p&gt;
&lt;h2&gt;Framework: wrapping the Apply Gate before production&lt;/h2&gt;
&lt;p&gt;Three layers, one deploy cycle each. This is the control protocol that goes around the Terraform MCP server before agentic apply touches production. The layers run in order: inventory, then policy, then continuous verification.&lt;/p&gt;
&lt;h3&gt;Layer 1: inventory and read-only baseline (week 1)&lt;/h3&gt;
&lt;p&gt;Map every connection the server can make, pin the toolset explicitly, and keep the flag false. Scope the token to the minimum workspaces. On HTTP deployments, pin the organization allowlist to the smallest set of orgs.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# terraform-mcp-server: least-privilege read-only baseline (local stdio)
terraform-mcp-server stdio --toolsets=registry,registry-private
# create_run intentionally unavailable: ENABLE_TF_OPERATIONS unset
# scope TFE_TOKEN to the minimum workspaces; for HTTP deployments,
# set MCP_ORGANIZATION_ALLOWLIST to the smallest set of orgs
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The deliverable is a written record of exactly what the agent can see before it can change anything. Owner: platform engineer.&lt;/p&gt;
&lt;h3&gt;Layer 2: policy gate via Sentinel (week 2)&lt;/h3&gt;
&lt;p&gt;Use HashiCorp&apos;s own primitive. Attach a Sentinel policy set to any workspace an agent may eventually apply against, using the policy-set tooling that shipped with the server. No policy set attached means no agentic apply against that workspace.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;# Sentinel: deny apply without an attributable approver tag
import &quot;tfrun&quot;

main = rule {
  tfrun.workspace.tags contains &quot;approver-recorded&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;# attach the policy set via the MCP server&apos;s governance tooling
# (attach_policy_set_to_workspace per the tool reference; confirm
#  parameter names against your installed version)
attach_policy_set_to_workspace(
  policy_set = &quot;agentic-apply-guard&quot;,
  workspace  = &quot;platform-prod-network&quot;
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Review of agent-generated plans moves from a human eyeball guess to a Sentinel decision. Owner: security or platform lead.&lt;/p&gt;
&lt;h3&gt;Layer 3: continuous verification (week 3 onward)&lt;/h3&gt;
&lt;p&gt;Now the gate can open, because the record will exist. Two signals, two sources. The attributable record of who triggered and approved each run lives in your HCP Terraform or Terraform Enterprise audit trail, not in the MCP server. Route those audit events into your pipeline so every run carries a name and a timestamp.&lt;/p&gt;
&lt;p&gt;The MCP server adds the second signal: tool-usage telemetry. With metrics enabled, it emits OpenTelemetry counters for call volume, errors, and latency that tell you how often the agent invokes a run and where it fails. Wire that into the same observability stack.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;# otel collector: capture MCP tool-usage metrics
# enable with OTEL_METRICS_ENABLED=true
# metrics: mcp_tool_calls_total, mcp_tool_errors_total, mcp_tool_duration_seconds
receivers:
  otlp:
    protocols:
      grpc:
exporters:
  otlphttp/observability:
    endpoint: https://otel-sink.internal:4318
service:
  pipelines:
    metrics:
      receivers: [otlp]
      exporters: [otlphttp/observability]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The audit trail answers &quot;who,&quot; the metrics answer &quot;how often and how it failed.&quot; Together they are the record the GA did not ship for you. The flag flips to true only for workspaces that have layers 1 and 2 in place. The flag is a governance decision with a name attached, not a developer toggle. Owner: SRE, with sign-off from compliance.&lt;/p&gt;
&lt;h2&gt;Tradeoffs&lt;/h2&gt;
&lt;p&gt;What this costs: one deploy cycle of friction before any team gets autonomous apply, plus the discipline of attaching a policy set to every agent-reachable workspace. Teams without policy-as-code feel this most, because layer 2 forces a capability they were postponing.&lt;/p&gt;
&lt;p&gt;What ignoring it costs: a single audit cycle. The day an auditor asks who authorized the agent that provisioned a workspace, the cost of the skipped framework is the difference between pointing to a timestamped, attributed audit trail and pointing to a flipped environment variable with no name behind it. The first is a five-minute answer. The second is a finding.&lt;/p&gt;
&lt;h2&gt;The closing argument&lt;/h2&gt;
&lt;p&gt;I would adopt the Terraform MCP server in read-only mode on every team today. The read-only workflow earns its keep, and the boundary security is properly built. I would hold on enabling operations until the three layers exist, because the audit trail for autonomous apply is yours to build and the GA did not build it for you. The cost of adopting naively is not a breach. It is the day someone asks who signed off and the honest answer is a config flag. Deploy it read-only this week, attach one Sentinel policy set, and leave the Apply Gate closed until the record can answer for it.&lt;/p&gt;
&lt;h2&gt;Sources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;HashiCorp, &lt;a href=&quot;https://www.hashicorp.com/en/blog/terraform-mcp-server-is-now-generally-available&quot;&gt;Terraform MCP server is now generally available&lt;/a&gt;, June 11, 2026&lt;/li&gt;
&lt;li&gt;HashiCorp Developer, &lt;a href=&quot;https://developer.hashicorp.com/terraform/mcp-server/reference&quot;&gt;Terraform MCP server reference&lt;/a&gt; (create_run run types, ENABLE_TF_OPERATIONS), accessed June 2026&lt;/li&gt;
&lt;li&gt;HashiCorp, &lt;a href=&quot;https://www.hashicorp.com/en/blog/terraform-mcp-server-updates-stacks-support-new-tools-and-tips&quot;&gt;Terraform MCP server updates: Stacks support, new tools, and tips&lt;/a&gt; (policy-set tooling), 2026&lt;/li&gt;
&lt;li&gt;InfoQ, &lt;a href=&quot;https://www.infoq.com/news/2025/08/hashicorp-mcp-servers-terraform-/&quot;&gt;HashiCorp Introduces MCP Servers for Terraform and Vault&lt;/a&gt;, August 14, 2025&lt;/li&gt;
&lt;li&gt;GitHub, &lt;a href=&quot;https://github.com/hashicorp/terraform-mcp-server&quot;&gt;hashicorp/terraform-mcp-server&lt;/a&gt; (toolsets, organization allowlist, transports, OTel metrics), accessed June 2026&lt;/li&gt;
&lt;li&gt;IBM Newsroom, &lt;a href=&quot;https://newsroom.ibm.com/2026-04-28-introducing-ibm-bob-ai-development-partner-that-takes-enterprises-from-ai-assisted-coding-to-production-ready-software&quot;&gt;Introducing IBM Bob&lt;/a&gt;, April 28, 2026&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Discussion&lt;/h2&gt;
&lt;p&gt;If you have enabled operations in production, kept the gate closed, or seen this audit pattern in your own change-control process, drop a comment below. Counterarguments welcome, and the comment thread is where I respond first. For longer back-and-forth with senior practitioners, join the discussion on &lt;a href=&quot;https://heyvaldemar.com/discord&quot;&gt;Discord&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>Terraform</category><category>IaC</category><category>DevSecOps</category><category>AI</category><category>Security</category><category>Platform Engineering</category><category>Docker Captain</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Your Knowledge Is a Depreciating Asset. Judgment Compounds.</title><link>https://heyvaldemar.com/your-knowledge-depreciating-asset-judgment-compounds/</link><guid isPermaLink="true">https://heyvaldemar.com/your-knowledge-depreciating-asset-judgment-compounds/</guid><description>AI made reproducible knowledge free, so technical expertise is now a depreciating asset. Judgment is the one that compounds. Here is how to move your weight.</description><pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;For a decade we got paid for what we knew. That asset is being written down to zero. Here is the one that is appreciating instead, and how to move your weight onto it before the market finishes repricing it.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;For about a decade, the reliable way to build standing in technical work was to accumulate reproducible knowledge and rent it out. You learned the tool, the syntax, the runbook, the migration path, and you got paid for knowing it, whether as a salary, a course, a book, or a paid community built around a library of how-to. The knowledge was the inventory. It had value because it was scarce and you held more of it than the person paying you.&lt;/p&gt;
&lt;p&gt;That inventory is being written down to zero. Not because anyone mismanaged it. Because the thing on the shelf, reproducible knowledge delivered on demand, is now generated for free in seconds, personalized to the exact situation, by a tutor that never tires and updates the moment the tool does. An engineer who needs a working pipeline no longer buys the lesson. They describe the constraint and get a tailored answer for less than the cost of looking it up.&lt;/p&gt;
&lt;p&gt;This is an asset problem before it is anything else. If your balance sheet, career or business, is concentrated in reproducible knowledge, you are long a deflating asset. The move is not to accumulate faster. It is to work out which asset is appreciating and shift your weight onto it before the writedown is fully priced in. That asset is judgment. Here is the line between the two, drawn with the data.&lt;/p&gt;
&lt;h2&gt;The threat, named&lt;/h2&gt;
&lt;p&gt;Call it &lt;strong&gt;Knowledge Deflation&lt;/strong&gt;: the rapid collapse in the market value of reproducible technical knowledge as AI makes its transfer free, instant, and personalized.&lt;/p&gt;
&lt;p&gt;Technical knowledge always decayed. Docker made the VM courses obsolete. Kubernetes turned the Swarm tutorials into a dead end. Every few years a new layer arrived and last year&apos;s training material aged out. Producers stayed ahead by shipping the next thing before the last one fully rotted. AI breaks that arithmetic. It does not swap one body of material for another. It shortens the useful life of all of it at once, faster than anyone can produce the replacement, and it does so on the demand side too. The buyer who would have paid for the explanation now generates a bespoke version of it for the price of a prompt.&lt;/p&gt;
&lt;p&gt;The deflation is already showing up where knowledge gets sold directly.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Copy/pasted lines rose from 8.3% of changed code in 2021 to 12.3% in 2024, while refactored (&quot;moved&quot;) lines fell from about 25% to under 10% over the same window. 2024 was the first year copy/paste outpaced refactoring in the dataset.&lt;/p&gt;
&lt;p&gt;— GitClear, AI Copilot Code Quality 2025 (211 million changed lines, 2020–2024)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Read that as an economic signal, not only a quality one. When knowledge is cheap to reproduce, it gets reproduced instead of reused. The same force that fills a codebase with near-duplicate blocks fills the market with near-duplicate explanations. Abundance is exactly what destroys the price.&lt;/p&gt;
&lt;h2&gt;The blast radius&lt;/h2&gt;
&lt;p&gt;The deflation runs through three balance sheets at once: the educator&apos;s, the engineer&apos;s, and the trust of the person doing the buying.&lt;/p&gt;
&lt;p&gt;On the supply side, the people who sell learning for a living are watching demand erode in real time. I watched the founder of an interactive-coding-course platform publish his own keyword research while deciding what to build next, and the read was sobering for anyone in that business. Search demand for &quot;learn to code&quot; queries is draining as the audience routes its questions to an AI assistant instead of a curriculum. When the person whose income depends on selling courses tells you the top of the funnel is emptying, that is not doom-posting. That is a supplier reading his own order book.&lt;/p&gt;
&lt;p&gt;The macro picture agrees. US computer science enrollment fell 8.1% in 2025 after more than a decade of growth, the steepest one-year drop of any major in six years. CS slid from the fourth to the sixth most popular field of study. It is the first cycle where the decline is pinned on AI reshaping the work itself, not on a dot-com-style boom and bust. The pipeline that fed the entire knowledge-transfer economy is narrowing because the buyers can sense the inventory is depreciating.&lt;/p&gt;
&lt;p&gt;And the asset is not only deflating. It is unreliable at the margin, which speeds the writedown.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Trust that AI output is accurate fell from 40% to 29% year over year, the lowest the survey has recorded. Favorability slid from 72% to 60%. The top frustration, named by 45% of developers, is &quot;AI solutions that are almost right, but not quite,&quot; and two-thirds now say they lose time cleaning up that almost-right code.&lt;/p&gt;
&lt;p&gt;— Stack Overflow Developer Survey 2025&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&quot;Almost right, but not quite&quot; is the tell. Commoditized knowledge is now cheap and untrustworthy at the margin, which means the value does not vanish. It relocates. It moves to whoever can tell looks correct from is correct. That is not a knowledge skill. It is judgment.&lt;/p&gt;
&lt;p&gt;The most direct evidence that the machine cannot hold the high-value end is what happens when you delegate real work to it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Across 19 models and 52 professional domains, even frontier systems (Gemini 3.1 Pro, Claude 4.6 Opus, GPT 5.4) corrupted an average of 25% of document content over long, multi-step workflows. Agentic tool use did not help. Degradation got worse as documents grew larger and interactions ran longer.&lt;/p&gt;
&lt;p&gt;— Microsoft Research, &quot;LLMs Corrupt Your Documents When You Delegate&quot; (DELEGATE-52), arXiv, April 17, 2026&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Transfer of knowledge: free, instant, and increasingly good. Sustained application of judgment to a real, evolving artifact: still failing a quarter of the time at the frontier. That gap is the whole investment thesis.&lt;/p&gt;
&lt;h2&gt;Why this is a balance-sheet question, not a skills question&lt;/h2&gt;
&lt;p&gt;The instinct, when knowledge deflates, is to learn faster and accumulate more inventory more aggressively. That is the wrong move, and the data above says why. You would be doubling down on the asset that is losing value, in a race against a free competitor that restocks instantly. Speed of accumulation is not the lever.&lt;/p&gt;
&lt;p&gt;The lever is what you choose to be paid for.&lt;/p&gt;
&lt;p&gt;Reproducible knowledge answers &quot;how does X work&quot; and &quot;how do I configure Y.&quot; The market price of that answer is now close to zero, because the answer is generated on demand. Applied judgment answers a different question: given our compliance posture, our existing sprawl, the two teams that own overlapping systems, and the fact that we cannot take downtime this quarter, what should we actually do, in what order, and what breaks if we are wrong? An AI assists with that. It cannot own it. Owning it requires context the model does not have, accountability it cannot hold, and the scars to know which of three plausible answers survives contact with production.&lt;/p&gt;
&lt;p&gt;That is why judgment is the appreciating asset. Every junior task the machine absorbs raises the premium on the senior judgment it cannot. I made the &lt;a href=&quot;/senior-engineer-signal-2026-velocity-risk/&quot;&gt;organizational version of this argument&lt;/a&gt;: teams that thin out senior review to chase velocity lose the people who can tell a working system from a plausible one. The cheaper reproducible knowledge gets, the more valuable it becomes to deploy that knowledge correctly under real constraints. The two assets are moving in opposite directions, and most people are still weighted into the one going down.&lt;/p&gt;
&lt;h2&gt;The same writedown hits teaching twice&lt;/h2&gt;
&lt;p&gt;If you sell knowledge as a product, courses, tutorials, library-style communities, the deflation hits you from two directions at once.&lt;/p&gt;
&lt;p&gt;From above: AI commoditizes the core inventory. The recorded explanation competes with the live, free, personalized one, and loses on price. Producing more modules is running faster on a treadmill that keeps accelerating. The tell is in the product itself. When the navigation of a learning offering fills with &quot;planned,&quot; &quot;building,&quot; and &quot;coming next,&quot; it has stopped being a library and become a promise of future content, sold today. That works while content is scarce. It stops working when content is abundant and free.&lt;/p&gt;
&lt;p&gt;From below: imitation. I have paid into a handful of these over the past couple of years, and a second pattern repeats alongside the first. Someone with real authority builds something that works, and a wave of imitators ships a thinner version of the same thing. The copies compete on the one axis AI has already won, reproducible knowledge, without the audience, the production scars, or any reason to exist that a model cannot satisfy for free. The category gets squeezed from both ends. AI deflates the value from the top, imitators dilute what is left from the bottom. The strongest operators feel the ceiling. Everyone copying them hits it sooner.&lt;/p&gt;
&lt;p&gt;The defensive move is not to produce faster. It is to stop selling the answer and start selling the room where answers get worked out. The durable version of a technical community in this era is not a content library with a forum bolted on. It is a standing conversation among people with enough production experience to separate signal from noise, organized around the questions that do not have a recorded answer yet. Not &quot;how do I configure this,&quot; but &quot;what survives when the thing I configured can be generated by anyone in thirty seconds.&quot; The members are the asset. The host curates the question and holds the standard. That is harder to sell and much harder to fake, which is why it holds value while the library does not.&lt;/p&gt;
&lt;h2&gt;Control protocol&lt;/h2&gt;
&lt;p&gt;How to move your weight off the deflating asset and onto the appreciating one. Career and business, same five moves.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Stop pricing reproducible knowledge. Price judgment.&lt;/strong&gt; Audit what you currently get paid for. Every line item that is &quot;I know how to do X&quot; is exposed. Every line item that is &quot;I decide what is worth doing, in your context, and I own the outcome&quot; is defensible. Shift the mix deliberately.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Convert content from product to proof.&lt;/strong&gt; A blog, a talk, an open-source project should no longer be the thing you sell. It is evidence of judgment that makes you more valuable at the thing you do sell, priced as a salary, then as consulting, then as advice. Give the knowledge away. It is worth nothing to hoard now anyway. Charge for the judgment it points to.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Move toward the work the machine fails at.&lt;/strong&gt; DELEGATE-52 and the trust data point at the same high ground: sustained, accountable, context-heavy decisions over long horizons. Solutions architecture, security and compliance judgment, system design under real constraints. The hiring I watch is already concentrating there while execution-only roles deflate.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Make the supervisory layer the explicit job.&lt;/strong&gt; If &quot;almost right, but not quite&quot; is the dominant failure mode, then catching it is now the highest-value work in the building. Whether you lead a team or sell your own time, fund and price that work as the deliverable it has become, not as a tax on velocity.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. Stop competing on the commoditized axis.&lt;/strong&gt; If your differentiation is &quot;I have the knowledge,&quot; you are competing with the free tutor and you lose on price. Differentiate on the axis AI cannot reach: ownership, accountability, and judgment earned in production over years.&lt;/p&gt;
&lt;h2&gt;Three questions to sit with this quarter&lt;/h2&gt;
&lt;p&gt;Take them literally. The honest answers tell you how exposed your balance sheet is.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;What share of my income today is paid for reproducible knowledge, the kind an AI assistant now generates on demand, versus applied judgment I am accountable for?&lt;/li&gt;
&lt;li&gt;If every how-to I have ever produced became free and instant tomorrow, what would I still be uniquely paid for?&lt;/li&gt;
&lt;li&gt;Is the content I am making a product I am trying to sell, or proof of judgment that makes me more valuable at what I sell? If it is the former, I am long a deflating asset.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Knowledge was the product. It is a commodity now, and the rational move is to plan your career and your business as if it is free, because functionally it is. The content era rewarded the people who could explain things clearly, and there was real money and status in being the clearest voice in the room. The AI era rewards what the content era undervalued: the ability to sit with a problem that has no recorded answer, weigh the tradeoffs, make the call, and own what happens next. You cannot download that. You cannot generate it from a prompt. You earn it in production, over years, by being accountable for outcomes.&lt;/p&gt;
&lt;p&gt;Move your weight onto the asset that compounds. Judgment is the product now.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Opinion &amp; Culture</category><category>AI</category><category>Career Strategy</category><category>Engineering Leadership</category><category>Future of Work</category><category>Knowledge Economy</category><category>Solutions Architecture</category><category>AI Strategy</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>The Senior Engineer Signal: The 2026 Risk Your Velocity Metrics Hide</title><link>https://heyvaldemar.com/senior-engineer-signal-2026-velocity-risk/</link><guid isPermaLink="true">https://heyvaldemar.com/senior-engineer-signal-2026-velocity-risk/</guid><description>Juniors get the biggest boost from AI; seniors trust it least. That split is your earliest read on engineering risk, and on the talent you&apos;re about to lose.</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In Part 1 I left a thread hanging on purpose.&lt;/p&gt;
&lt;p&gt;Your most experienced engineers report the smallest productivity gains from AI. They also trust its output the least. I called that a signal, not a generational gripe, and said it mattered more than most boards have heard. Time to make good on that.&lt;/p&gt;
&lt;p&gt;The people with the most miles on them are not being cautious for sport. They are reading something in the codebase that the velocity dashboard does not show. And over the last year, the data caught up to what they have been saying out loud since 2023.&lt;/p&gt;
&lt;h2&gt;What the seniors are actually looking at&lt;/h2&gt;
&lt;p&gt;Start with the code itself, because that is where their nose twitches first.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Lines classified as &quot;copy/pasted&quot; rose from 8.3% of changed code in 2021 to 12.3% in 2024. Refactored (&quot;moved&quot;) lines fell from about 25% of changes to under 10% over the same window. That was the first time in the dataset that copy/paste outpaced refactoring.&lt;/p&gt;
&lt;p&gt;— GitClear, AI Copilot Code Quality 2025 (211 million changed lines, 2020–2024)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Read that again, because it is the whole section. We are pasting more and reshaping less. The codebase is getting wider, not cleaner. Duplication is cheap to generate now, so it gets generated, and the boring work of folding five near-copies back into one function is exactly the work an AI will not volunteer for and a junior will not notice is missing.&lt;/p&gt;
&lt;p&gt;A senior notices. That is the job. They have maintained the system that got wide and then got brittle, and they can smell the early version of it.&lt;/p&gt;
&lt;p&gt;The delivery numbers point the same direction.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A 25% increase in AI adoption was associated with a 7.2% drop in delivery stability and a 1.5% drop in throughput. AI makes it easy to write more code, batch sizes go up, and bigger changesets carry more risk.&lt;/p&gt;
&lt;p&gt;— Google&apos;s DORA, State of DevOps 2024&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Throughput down too. That one surprises people. The story everyone sold was &quot;AI writes the code faster, so we ship faster.&quot; What actually happens is the batch gets bigger, the review gets harder, and the thing that breaks costs more to unbreak. Net, slightly slower. Measurably less stable.&lt;/p&gt;
&lt;p&gt;So the seniors are not wrong, and they are not nostalgic. They are looking at a real second-order effect that the first-order metric hides.&lt;/p&gt;
&lt;h2&gt;The trust line keeps dropping&lt;/h2&gt;
&lt;p&gt;Here is the part that should bother you most, because it is moving the wrong way over time.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Trust that AI output is accurate fell from 40% to 29% year over year. Favorability dropped from 72% to 60%. More developers now actively distrust AI accuracy (46%) than trust it (33%). The top frustration, named by 45%, is &quot;AI solutions that are almost right, but not quite.&quot;&lt;/p&gt;
&lt;p&gt;— Stack Overflow Developer Survey 2025&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&quot;Almost right, but not quite&quot; is the expensive failure mode. A wrong answer you catch. A nearly-right answer you ship, and then you debug it three sprints later with no memory of why that line is there. The cohort best at spotting &quot;almost right&quot; is the senior cohort. They are also the cohort whose trust is lowest and dropping fastest.&lt;/p&gt;
&lt;p&gt;Hold that next to the number from Part 1. Across the Sonar 2026 survey, 96% of developers do not fully trust that AI-generated code is functionally correct, yet only 48% always check it before they commit. Half the industry is shipping code it does not trust, unverified. The other half, the half that does check, is carrying the verification load for everyone. Guess which half is senior.&lt;/p&gt;
&lt;p&gt;None of this is an argument against AI. I use it every day. It is an argument about who is holding the line, and whether you have noticed.&lt;/p&gt;
&lt;h2&gt;Why the velocity dashboard hides the bill&lt;/h2&gt;
&lt;p&gt;Walk into a 2026 board meeting and you will see the throughput chart. Commits up. PRs up. Story points up. AI adoption up and to the right. Everyone nods.&lt;/p&gt;
&lt;p&gt;The chart is real. It is also the wrong chart.&lt;/p&gt;
&lt;p&gt;What it does not show: churn. The share of code rewritten within two weeks of landing has been climbing, which means more of that throughput is rework, not progress. It does not show the duplication creeping in. It does not show delivery stability sliding 7% for every 25% of adoption. And it definitely does not show the trust line falling off a cliff inside your own engineering org.&lt;/p&gt;
&lt;p&gt;You are measuring the bump and not the bill. The bump lands this quarter, on a slide. The bill lands later, in an incident review, in a security finding, in the three weeks it takes a senior to untangle a &quot;mostly working&quot; subsystem nobody fully understands. By then the person who flagged it early has stopped flagging.&lt;/p&gt;
&lt;p&gt;This is the same failure I described in &lt;a href=&quot;/agent-sprawl-2026-engineering-risk/&quot;&gt;Part 1&lt;/a&gt;: the dangerous stuff is the stuff your instruments do not surface. There it was parallel agents with no audit trail. Here it is code-quality decay with no panel on the dashboard. Same disease. The number that would scare you is the number nobody is plotting.&lt;/p&gt;
&lt;h2&gt;The talent math nobody puts on the board deck&lt;/h2&gt;
&lt;p&gt;Now the part that turns a code-quality story into a people story.&lt;/p&gt;
&lt;p&gt;The read a lot of leaders took from &quot;juniors get the biggest AI boost&quot; was blunt: we need fewer expensive seniors. Salesforce said the quiet part on the record. Marc Benioff told investors the company would hire no new software engineers in 2025, citing a 30% engineering productivity gain from AI, while growing the sales team by up to 20%. &quot;We are the last generation to manage only humans,&quot; he added.&lt;/p&gt;
&lt;p&gt;Maybe that math works at Salesforce&apos;s scale. For most orgs it removes two things at once, and they will not notice until both are gone.&lt;/p&gt;
&lt;p&gt;It removes the supervisory layer. The seniors are the review capacity. They are the people who catch &quot;almost right.&quot; AI does not reduce the need for that capacity. The GitClear and DORA numbers say it raises it. You are generating more code, more duplication, and more nearly-right merges, all of which need more senior eyes, right when the plan is to have fewer.&lt;/p&gt;
&lt;p&gt;And it removes the pipeline. Juniors become seniors by doing the work that AI now does for them and getting it reviewed by someone more experienced. Cut the junior reps and the senior review at the same time and you are not running lean. You are eating the seed corn. There is no 2030 senior bench if 2026 juniors never get past prompt-and-paste.&lt;/p&gt;
&lt;p&gt;Then there is the quieter attrition, the kind that does not show up as a layoff. A senior whose job becomes uncredited cleanup of machine output, whose judgment is treated as a tax on velocity, whose &quot;I don&apos;t trust this merge&quot; is overruled by a burndown chart, does not file a complaint. They disengage. Then they leave. And they take the context for your load-bearing systems with them, the context that was never written down because it lived in their head.&lt;/p&gt;
&lt;p&gt;You do not get a dashboard alert for that either.&lt;/p&gt;
&lt;h2&gt;What to actually do about it&lt;/h2&gt;
&lt;p&gt;Five things, and none of them is &quot;stop using AI.&quot; That ship sailed and it was the right ship.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Treat AI productivity as non-uniform by seniority.&lt;/strong&gt; The boost is real for juniors on well-trodden tasks and small for seniors on hard ones. Plan and staff around that instead of averaging it into one number that flatters the tool and insults your best people.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Make the supervisory layer the senior&apos;s actual job, on paper.&lt;/strong&gt; Review, architecture, the boundary work I described in Part 1. Not a thing they squeeze in between tickets. The thing they are measured and paid for. If catching &quot;almost right&quot; is now the highest-value work in the building, fund it like it is.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Measure quality, not just throughput.&lt;/strong&gt; Put churn, duplication, refactoring rate, and change-failure rate on the same screen as commit count. If your dashboard only shows the bump, your board only sees the bump.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Measure AI&apos;s impact per team, and keep it off individuals.&lt;/strong&gt; Segment DORA before and after adoption, by team, so you can see who is actually getting faster and who is just getting busier. Tie it to developer sentiment, not surveillance. I wrote up the framework for doing this without wrecking trust in &lt;a href=&quot;/ai-productivity-measurement/&quot;&gt;AI Didn&apos;t Fix Productivity. Measurement Did.&lt;/a&gt; The moment this becomes a stack-ranking tool, the seniors stop telling you the truth, and the truth was the whole point.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. Protect the pipeline on purpose.&lt;/strong&gt; Keep hiring and growing juniors, and keep them paired with seniors on real review, even though AI can fake the output of their early-career work. You are not buying this quarter&apos;s tickets. You are growing the people who will hold the line when the next wave of tooling shows up without its supervisory layer attached.&lt;/p&gt;
&lt;h2&gt;Three questions for your next board meeting&lt;/h2&gt;
&lt;p&gt;Same format as Part 1. Ask them out loud and watch the room.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Show me churn, duplication, and change-failure rate next to our throughput chart. If we cannot put them on the same screen, why not?&lt;/li&gt;
&lt;li&gt;What is our senior-to-junior ratio, where is it heading over the next eight quarters, and who is reviewing AI-generated code today?&lt;/li&gt;
&lt;li&gt;Which of our load-bearing systems has its context living only in one senior engineer&apos;s head, and what happens to that system if they leave this year?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If those land as uncomfortable silences, you found the work.&lt;/p&gt;
&lt;p&gt;The senior engineer signal is the canary. It is quiet, it is unglamorous, and it is the cheapest early warning you will ever get. The organizations that listen keep the people who can tell &quot;looks correct&quot; from &quot;is correct.&quot; The ones that read the throughput chart, call it a win, and thin out the bench will find out the difference the expensive way. In the incident review. With the one person who saw it coming already gone.&lt;/p&gt;
&lt;p&gt;That was the more interesting question all along. Not how fast the machine can write. How long you keep the people who know when it is wrong.&lt;/p&gt;
&lt;h2&gt;GitKraken Ambassador Note&lt;/h2&gt;
&lt;p&gt;As a &lt;a href=&quot;https://www.gitkraken.com/meet-the-gitkraken-ambassadors&quot;&gt;GitKraken Ambassador&lt;/a&gt;, I write about how engineering teams actually operate when the tooling changes under them, not about feature launches.&lt;/p&gt;
&lt;p&gt;This whole two-part series came down to one idea. The risks that hurt you are the ones your instruments do not show: parallel agents with no audit trail in Part 1, code-quality decay and senior disengagement with no panel on the dashboard here. Instrument the thing you cannot see. Then keep the people who can see it anyway.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Opinion &amp; Culture</category><category>AI Governance</category><category>Engineering Leadership</category><category>DevOps</category><category>Talent</category><category>Compliance</category><category>GitKraken</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Agent Sprawl: The 2026 Engineering Risk Your Auditor Hasn&apos;t Named Yet</title><link>https://heyvaldemar.com/agent-sprawl-2026-engineering-risk/</link><guid isPermaLink="true">https://heyvaldemar.com/agent-sprawl-2026-engineering-risk/</guid><description>Unknown numbers of AI coding agents run in parallel — no audit trail, no isolation, no per-team measurement. By 2026 that&apos;s an audit finding.</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Right now, across your engineering organization, some number of AI coding agents are running in parallel. A few sit inside Claude Code sessions in worktrees you never see. Others work against branches nobody has pushed. And some are committing to repositories owned by teams whose AI tool budget you never approved.&lt;/p&gt;
&lt;p&gt;You do not know how many. Neither does your VP of Engineering. The developer who kicked off a second Copilot agent thirteen minutes ago, in a separate worktree, does not know either. They just opened another terminal.&lt;/p&gt;
&lt;p&gt;Put that gap in front of a SOC 2 Type II review in 2026, or a pre-acquisition technical diligence, and it reads as a finding. The category needs a name. Here is mine: Agent Sprawl.&lt;/p&gt;
&lt;h2&gt;The threat, named&lt;/h2&gt;
&lt;p&gt;Agent Sprawl is the uncontrolled proliferation of parallel AI coding sessions across an engineering organization, without unified audit trail, isolation pattern, or per-team measurement.&lt;/p&gt;
&lt;p&gt;Your SIEM will not flag it. It is not a security incident. It is not a feature flag your platform team forgot to toggle. It is a structural condition. The thing emerged through 2025 and hardened into operational baseline by mid-2026 in most engineering organizations of any real size. What is missing is the instrumentation. That gap is what this article is about.&lt;/p&gt;
&lt;p&gt;Here is what one Agent Sprawl incident actually looks like. Agent A is iterating on a refactor on &lt;code&gt;feature/payments-v2&lt;/code&gt;. Agent B starts fifty minutes later, launched by a different developer in a separate worktree on &lt;code&gt;bugfix/payments-rounding&lt;/code&gt;, and opens the same file to ship an unrelated fix. Both branches were cut from &lt;code&gt;main&lt;/code&gt;. Both edit &lt;code&gt;src/payments/charge.ts&lt;/code&gt;. Neither sees the other. When the two branches merge back to &lt;code&gt;main&lt;/code&gt;, Git&apos;s three-way merge resolves the textual diff cleanly. Semantically, though, Agent A&apos;s refactor removed the helper function that Agent B&apos;s bug-fix path still calls. The unit test that would have caught the mismatch? Agent A deleted it as &quot;no longer relevant.&quot; The bug ships. No log entry anywhere says &quot;two agents wrote to this file in parallel.&quot; That is Sprawl at the IC level. Now multiply it by the number of branches live in a forty-engineer team. The audit trail becomes a wish, not an artifact.&lt;/p&gt;
&lt;h2&gt;The blast radius&lt;/h2&gt;
&lt;p&gt;Three numbers from the last six months set the scale.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;72% of developers who have tried AI coding tools now use them every day, and AI now accounts for 42% of all committed code.&lt;/p&gt;
&lt;p&gt;— Sonar State of Code Developer Survey, 2026&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;96% of developers do not fully trust that AI-generated code is functionally correct, yet only 48% always check their AI-assisted code before committing it.&lt;/p&gt;
&lt;p&gt;— Sonar State of Code Developer Survey, 2026&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;30% of engineers spend a third of their week on repetitive infrastructure tasks and audits.&lt;/p&gt;
&lt;p&gt;— DuploCloud AI + DevOps Report 2026&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Translated for engineering leadership: adoption is already universal, the productivity reality is uneven, and the operational tax on your team is high enough on its own that stacking uncontrolled AI sessions on top makes things worse, not better.&lt;/p&gt;
&lt;p&gt;The blast radius is on the record too. Earlier this year a misconfigured &lt;code&gt;setAlarm()&lt;/code&gt; loop inside Cloudflare Durable Objects ran up a $34,895 cloud bill in eight days, April 3 to 11, before the developer noticed. Cloudflare&apos;s billing system at the time had no real-time spending caps and no usage notifications for Durable Object operations. Now swap &quot;agent operating without oversight&quot; in for &quot;misconfigured loop.&quot; Same shape of incident. Routine 2026 possibility. Vastly larger surface area.&lt;/p&gt;
&lt;p&gt;I have watched this surface grow firsthand. Across the fifty-plus public repositories I maintain, and inside the production environment I run for 150-plus engineers, the count of distinct AI agent surfaces touching the codebase roughly doubled between October 2025 and March 2026. The visibility layer did not keep up. That asymmetry is the operational shape of Agent Sprawl, well before any auditor gets around to naming it. For the per-agent walk-through I ran on a live environment last quarter, see &lt;a href=&quot;/ai-agent-blast-radius-assessment/&quot;&gt;I Tested an AI Agent on My Live Systems. Here Is the Blast Radius Assessment&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Why this is a board-level question in 2026&lt;/h2&gt;
&lt;p&gt;Four reasons, ordered the way they will hit the board deck.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Audit scope is evolving.&lt;/strong&gt; SOC 2 Type II practitioners are asking, more and more, about AI-assisted code provenance. AICPA guidance is still maturing as of mid-2026. But auditors already fold AI tool inventory, access controls, and code-review-of-AI-output procedures into their walkthrough questions. If you cannot show that AI-assisted code gets reviewed under the same controls as human-authored code, that is a finding.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EU AI Act enforcement is live.&lt;/strong&gt; Engineering organizations that produce software for EU markets fall within scope for obligations around AI system documentation and risk management. Exactly how that lands on internal AI coding tools, versus AI features you ship inside products, is still being clarified through 2026. Operating with no internal record of AI tool usage is a bad place to stand when the clarity arrives.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Acquirer due diligence has caught up.&lt;/strong&gt; Tech diligence checklists in 2026 routinely ask about AI tool usage, AI-generated code volume, and AI governance documentation. &quot;We do not track that&quot; was a fine answer in 2025. In 2026 it is a valuation discount.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cyber and E&amp;amp;O insurance underwriting has caught up.&lt;/strong&gt; Several carriers now put AI governance disclosure on their renewal questionnaires. In most cases the lack of it is not yet a coverage denial. It does raise premiums and narrow coverage scope.&lt;/p&gt;
&lt;h2&gt;The senior engineer signal&lt;/h2&gt;
&lt;p&gt;This is the data point most worth sitting with. From the same Sonar 2026 survey: junior developers report the highest productivity gains from AI, and senior developers report meaningfully smaller ones. The survey also notes that experienced developers value AI&apos;s impact on technical debt and documentation differently than junior peers do. Recall the split from earlier: 96% of developers do not fully trust AI-generated code is functionally correct, but only 48% always check it before committing. The seniors are the ones flagging that gap loudest.&lt;/p&gt;
&lt;p&gt;That is not a generational gripe. It is a signal. The cohort with the deepest experience reading systems that look correct but are not is the least convinced this trajectory is net positive. &lt;a href=&quot;/senior-engineer-signal-2026-velocity-risk/&quot;&gt;Part 2 of this series&lt;/a&gt; gets into why that signal matters more for engineering risk and talent retention than most boards have heard.&lt;/p&gt;
&lt;p&gt;Twenty years in, I will just say it. The people with twenty-plus years on the floor have watched several &quot;transformative&quot; tooling waves show up without the supervisory layer keeping pace, and they know the shape on sight. The skepticism in that cohort is a leading indicator. Not noise to filter out.&lt;/p&gt;
&lt;h2&gt;The market response&lt;/h2&gt;
&lt;p&gt;The first practical instrumentation for this category is starting to ship.&lt;/p&gt;
&lt;p&gt;On April 16, 2026, GitKraken Desktop 12.0 introduced Agent Mode, with a dedicated view it calls Agent Sessions View in the left panel. Per the published release notes, it is a unified dashboard for worktrees and active agent sessions. Every worktree shows up as a card. The card displays the branch, uncommitted changes, ahead/behind state, and associated pull requests. For Claude Code users specifically, the associated agent&apos;s status surfaces right on the card: working, waiting for input, errored. The &quot;New Agent Session&quot; action creates a worktree, runs configured setup commands, and launches the coding agent in one step. Per-worktree setup commands (dependency installs, build steps, environment file copies) can be configured in Preferences, so new agent environments come up ready on their own.&lt;/p&gt;
&lt;p&gt;So this is the worktree-per-agent isolation pattern made operational, with an audit-trail-friendly visualization layer on top. It is the first commercial response to Agent Sprawl I have looked at that treats the problem as the structural condition it is, instead of as a marketing surface for &quot;AI features.&quot;&lt;/p&gt;
&lt;p&gt;Worktree-per-agent is also the right primitive, and that distinction matters. The intuitive default is to aim two agents at the same feature branch and let them collaborate. In practice that fails the instant either one touches a file the other is editing. The conflict shows up at commit time, not edit time, and by the time anyone notices, the work both agents have done is already entangled. Worktree-per-agent inverts the order. Each agent operates on its own filesystem copy of the branch, edits there, and merges happen explicitly through a pull request a human reviews. The cost is disk. The gain is that agent collisions stop being silent. For an organization auditing what touched production, that boundary separates &quot;we can reconstruct who changed what and when&quot; from &quot;the timeline is a guess.&quot; It is also what makes the per-agent measurement (item 4 below) possible at all. You cannot DORA-segment what you cannot tell apart.&lt;/p&gt;
&lt;p&gt;Running it day to day, the change is operational, not cosmetic. I used to carry a mental map: which terminal is which worktree, which agent is mid-task, what branch each one sits on. That map moved into a visible state I can scan in two seconds. Cards in a grid. Branch and ahead/behind counts on each. Agent status (working, waiting, errored) right where the eye looks for it. Recovering that working memory is the part I had underestimated. My old terminal-plus-tmux flow kept the cost invisible. Once it is visible, the parallel-agent workflow stops being a tax I pay to ship faster. It becomes a tracked surface I can reason about, hand off, and audit.&lt;/p&gt;
&lt;h2&gt;Control protocol&lt;/h2&gt;
&lt;p&gt;What instrumentation for Agent Sprawl looks like, at minimum.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Unified audit trail for all parallel AI agent sessions.&lt;/strong&gt; One pane of glass where every active worktree-with-agent is visible to the developer, the team lead, and, with appropriate aggregation, the engineering leadership reviewing organization-level AI usage.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Isolated environments per agent.&lt;/strong&gt; The worktree-per-agent pattern is the right primitive. Shared branches with multiple AI agents writing to them is the wrong shape. The pattern keeps each agent&apos;s surface area observable and rollback-able.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Risk-scoring layer on AI-authored pull requests.&lt;/strong&gt; Size, complexity, and change scope are signals that should trigger reviewer assignment and elevated scrutiny before merge. This is automatable today.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. DORA measurement of AI impact per team.&lt;/strong&gt; Deployment frequency, lead time for change, change failure rate, and mean time to recovery, with before-and-after AI adoption baselines, segmented by team. Without segmentation the aggregate hides everything that matters. For the measurement framework I have used to do this segmentation cleanly, see &lt;a href=&quot;/ai-productivity-measurement/&quot;&gt;AI Didn&apos;t Fix Productivity. Measurement Did.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. Voice of Developer survey alongside the quantitative metrics.&lt;/strong&gt; Numbers tell you what happened. Survey signal from the engineers actually using the tools tells you why. You need both. Either one alone misleads.&lt;/p&gt;
&lt;p&gt;The first commercial implementation of this measurement layer I have reviewed is GitKraken Insights, launched October 2025 in partnership with engineering analytics specialist GitClear. It runs on a stated design principle that matters here: measure teams and workflows, not individuals. That principle is correct. The moment your AI impact measurement turns into individual surveillance, you lose data quality, and you lose the senior IC trust you most need to keep.&lt;/p&gt;
&lt;h2&gt;Three questions for your next engineering leadership meeting&lt;/h2&gt;
&lt;p&gt;Take these as written. If the answers come back fast, your engineering organization is ahead of most. If they come back as &quot;we do not track that,&quot; you have your starting point.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;As of right now, how many AI coding agents are active across our engineering organization?&lt;/li&gt;
&lt;li&gt;Where is the audit trail for AI-assisted code changes from the last ninety days, and who has access to it?&lt;/li&gt;
&lt;li&gt;What is our baseline DORA performance from the six months before our most significant AI tool adoption, and what does the comparison look like now?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Most engineering organizations will not have Agent Sprawl instrumented by the end of 2026. The ones that do will show up cleanly in next year&apos;s M&amp;amp;A and audit cycle. The ones that do not will spend the cycle after that explaining the gap. The work to close it is a quarter, not a year. But it has to start being named.&lt;/p&gt;
&lt;h2&gt;GitKraken Ambassador Note&lt;/h2&gt;
&lt;p&gt;As a &lt;a href=&quot;https://www.gitkraken.com/meet-the-gitkraken-ambassadors&quot;&gt;GitKraken Ambassador&lt;/a&gt;, I write about the tools that change how engineering teams operate at scale, not the ones with the loudest launch posts.&lt;/p&gt;
&lt;p&gt;Agent Sessions View is the first piece of dedicated instrumentation for Agent Sprawl I have reviewed. That is why it lands here. The category exists either way. The instrumentation is now starting to exist alongside it.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Opinion &amp; Culture</category><category>AI Governance</category><category>DevOps</category><category>Engineering Leadership</category><category>Compliance</category><category>GitKraken</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Docker supply chain hardening — from Scout D to OpenSSF 7.8 on a 730K-pull image</title><link>https://heyvaldemar.com/docker-supply-chain-hardening-solo-maintainer/</link><guid isPermaLink="true">https://heyvaldemar.com/docker-supply-chain-hardening-solo-maintainer/</guid><description>How I hardened a 1M-pull public Docker image from Scout grade D to OpenSSF Scorecard 7.8 — multi-stage build, cosign, SLSA provenance, non-root default.</description><pubDate>Wed, 22 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Earlier this month my public Docker image &lt;a href=&quot;https://hub.docker.com/r/heyvaldemar/aws-kubectl&quot;&gt;&lt;code&gt;heyvaldemar/aws-kubectl&lt;/code&gt;&lt;/a&gt; held a Docker Scout grade of D. It had crossed 730,000 pulls on Docker Hub. That same image now holds a Scout grade of B and an OpenSSF Scorecard of &lt;a href=&quot;https://scorecard.dev/viewer/?uri=github.com/heyvaldemar/aws-kubectl-docker&quot;&gt;7.8 out of 10&lt;/a&gt;, well above the typical score for public utility images. I read the configuration line by line. I shipped three major phases. And I hit one production incident that cost me a full afternoon.&lt;/p&gt;
&lt;p&gt;You see the same pattern everywhere. Banking. Telecom. Cloud-native. A utility image gets adopted because it works, pulls climb into six figures, and nobody touches the Dockerfile for years. Defaults that shipped in 2023 are still the defaults in production in 2026. So if you maintain a public image with real adoption and you have never audited it against current supply chain expectations, what follows is the checklist I wish I had kept from day one. For the performance side of the same site rebuild that preceded this work, see &lt;a href=&quot;https://heyvaldemar.com/cloudflare-web-analytics-astro-lighthouse-100/&quot;&gt;the Cloudflare Web Analytics migration that unlocked Lighthouse 100&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./docker-supply-chain-hardening-solo-maintainer-1.webp&quot; alt=&quot;Docker Hub Scout health score showing grade B with seven supply chain checks passing&quot;&gt;&lt;/p&gt;
&lt;h2&gt;What grade D actually looked like&lt;/h2&gt;
&lt;p&gt;The starting Dockerfile was the version most maintainers will recognize on sight. One stage. A &lt;code&gt;FROM ubuntu:24.04&lt;/code&gt; with no digest. &lt;code&gt;apt-get install&lt;/code&gt; for curl and unzip. A bash loop to pull the AWS CLI zip and the kubectl binary. No &lt;code&gt;USER&lt;/code&gt; directive, so the container runs as root by default. No OCI labels. No hadolint. No lockfile for the base image.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;# Before: single stage, implicit root, no labels, no digest pin
FROM ubuntu:24.04

RUN apt-get update &amp;amp;&amp;amp; apt-get install -y curl unzip \
    &amp;amp;&amp;amp; curl -o awscliv2.zip https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip \
    &amp;amp;&amp;amp; unzip awscliv2.zip &amp;amp;&amp;amp; ./aws/install \
    &amp;amp;&amp;amp; curl -LO https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl \
    &amp;amp;&amp;amp; install kubectl /usr/local/bin/kubectl

ENTRYPOINT [&quot;/bin/bash&quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The secure version after Phase 3 is a different image entirely. Multi-stage, so the build tools never ship in the runtime. Base digest pinned. An explicit &lt;code&gt;USER 10001:0&lt;/code&gt; so the container runs as a non-root account with root group (GID 0) for OpenShift SCC compatibility. A full set of OCI labels so Scout and GitHub actually know what they are scanning. The example below shows the structural changes only; the production Dockerfile in the repo additionally ships &lt;code&gt;jq&lt;/code&gt;, &lt;code&gt;envsubst&lt;/code&gt;, &lt;code&gt;curl&lt;/code&gt;, and &lt;code&gt;unzip&lt;/code&gt; in the runtime, writes the resolved kubectl version to &lt;code&gt;/etc/kube-version&lt;/code&gt; as a drift-detection marker, and uses &lt;code&gt;/usr/local/aws-cli&lt;/code&gt; as the AWS CLI install path.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;# After: multi-stage, digest-pinned, non-root, OCI-labeled
FROM ubuntu:24.04@sha256:c4a8d5503dfb2a3eb8ab5f807da5bc69a85730fb49b5cfca2330194ebcc41c7b AS builder

ARG KUBE_VERSION=latest
RUN apt-get update &amp;amp;&amp;amp; apt-get install -y --no-install-recommends \
        ca-certificates curl unzip \
    &amp;amp;&amp;amp; curl -fsSL -o /tmp/awscliv2.zip \
        https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip \
    &amp;amp;&amp;amp; unzip -q /tmp/awscliv2.zip -d /tmp \
    &amp;amp;&amp;amp; /tmp/aws/install -i /opt/aws-cli -b /usr/local/bin \
    &amp;amp;&amp;amp; curl -fsSL -o /usr/local/bin/kubectl \
        https://dl.k8s.io/release/${KUBE_VERSION}/bin/linux/amd64/kubectl \
    &amp;amp;&amp;amp; echo &quot;$(curl -fsSL https://dl.k8s.io/release/${KUBE_VERSION}/bin/linux/amd64/kubectl.sha256)  /usr/local/bin/kubectl&quot; | sha256sum -c - \
    &amp;amp;&amp;amp; chmod +x /usr/local/bin/kubectl

FROM ubuntu:24.04@sha256:c4a8d5503dfb2a3eb8ab5f807da5bc69a85730fb49b5cfca2330194ebcc41c7b AS final

LABEL org.opencontainers.image.source=&quot;https://github.com/heyvaldemar/aws-kubectl-docker&quot;
LABEL org.opencontainers.image.licenses=&quot;MIT&quot;
LABEL org.opencontainers.image.description=&quot;AWS CLI v2 + kubectl on Ubuntu 24.04&quot;

RUN apt-get update &amp;amp;&amp;amp; apt-get install -y --no-install-recommends \
        ca-certificates \
    &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/* \
    &amp;amp;&amp;amp; useradd --system --uid 10001 --gid 0 --create-home --home-dir /home/app --shell /sbin/nologin --comment &quot;aws-kubectl runtime user&quot; app \
    &amp;amp;&amp;amp; chmod -R g=u /home/app

COPY --from=builder /opt/aws-cli /opt/aws-cli
COPY --from=builder /usr/local/bin/kubectl /usr/local/bin/kubectl
RUN ln -s /opt/aws-cli/v2/current/bin/aws /usr/local/bin/aws

USER 10001:0
WORKDIR /home/app
ENV HOME=/home/app

CMD [&quot;bash&quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;The production Dockerfile&apos;s &lt;code&gt;KUBE_VERSION&lt;/code&gt; ARG defaults to &lt;code&gt;latest&lt;/code&gt; and resolves to the current stable release at build time via kubectl&apos;s &lt;code&gt;stable.txt&lt;/code&gt; channel; the example above keeps the same default, with the resolution logic elided for readability.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That missing &lt;code&gt;USER&lt;/code&gt; directive is one of the most common findings in container security audits. In regulated industries it shows up as a late-stage compliance blocker. In security post-mortems it maps to privilege-escalation and lateral-movement patterns documented across years of incident reporting. In cloud-native environments it is the reason OpenShift &lt;code&gt;restricted-v2&lt;/code&gt; SCC refuses your pod. One line. Skip it, and the cost compounds every year the image gets pulled.&lt;/p&gt;
&lt;p&gt;Full source, including CI workflows, the SECURITY.md disclosure policy, and the &lt;code&gt;v1-maintenance&lt;/code&gt; migration guide, lives at &lt;a href=&quot;https://github.com/heyvaldemar/aws-kubectl-docker&quot;&gt;github.com/heyvaldemar/aws-kubectl-docker&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Why this keeps happening&lt;/h2&gt;
&lt;p&gt;Sonatype&apos;s &lt;a href=&quot;https://www.sonatype.com/resources/state-of-the-software-supply-chain-2024&quot;&gt;2024 State of the Software Supply Chain report&lt;/a&gt; logged 512,847 malicious open-source packages over the preceding year. A 156% rise year-over-year.&lt;/p&gt;
&lt;p&gt;Containers are a smaller slice of that total than npm or PyPI. The propagation model is the same. A base image ships, downstream teams pull it, and the maintainer&apos;s attack surface becomes the attack surface of every production cluster that pulled it. One compromised personal access token reaches a cluster in Frankfurt and a cluster in Singapore by the next morning, because the image digest has already rolled out through the nightly base rebuilds in both places.&lt;/p&gt;
&lt;p&gt;Then there is the silence between the build and the consumer. Most public images carry no signature, no SBOM, no build provenance. A pull resolves a tag to a digest. That is the entire audit trail. Sigstore fixed the signing cost by making keyless cosign verification free through GitHub OIDC. BuildKit fixed the SBOM and provenance cost by making both a single build flag. The reason most images still ship without them is not that the tooling is hard. It is that nobody ran the migration.&lt;/p&gt;
&lt;p&gt;And there is recency. OpenSSF Scorecard is new enough that most maintainers have never seen their own score. Running it once is a ten-minute workflow. Run it today and most public images would come back somewhere between 3 and 5.&lt;/p&gt;
&lt;h2&gt;Risk and blast radius&lt;/h2&gt;
&lt;p&gt;Direct exposure scales with pulls. Past 730,000 the image is well beyond the threshold where a single supply chain compromise reaches hundreds of downstream CI pipelines inside days. The pulls counter is an adoption metric. It is also a blast radius metric.&lt;/p&gt;
&lt;p&gt;Systemic exposure is the harder calculation. A single maintainer account. A single personal access token with &lt;code&gt;write:packages&lt;/code&gt;. A single compromised laptop. The OWASP Top 10 for CI/CD Security captures these as CICD-SEC-2 (Inadequate Identity and Access Management) and CICD-SEC-6 (Insufficient Credential Hygiene), and the attack pattern that dominated 2024 was exactly this chain. Hardening the build pipeline matters more than hardening the runtime of the image itself, because the runtime is downstream of whoever signed the image.&lt;/p&gt;
&lt;p&gt;Regulatory exposure depends on who pulled the image. If any consumer runs it in a workload subject to EU NIS2, US Executive Order 14028, or financial regulatory frameworks that require SBOM attestations, the maintainer is inside the trust chain whether the maintainer asked to be there or not.&lt;/p&gt;
&lt;h2&gt;Options compared&lt;/h2&gt;
&lt;p&gt;For a solo maintainer the trade-off space is narrower than it is for a funded team. The table below is the honest comparison for public utility images under 1 GB.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Setup cost&lt;/th&gt;
&lt;th&gt;Ongoing cost&lt;/th&gt;
&lt;th&gt;Scorecard ceiling&lt;/th&gt;
&lt;th&gt;Fit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Do nothing&lt;/td&gt;
&lt;td&gt;0 hours&lt;/td&gt;
&lt;td&gt;0 hours/month&lt;/td&gt;
&lt;td&gt;~3/10&lt;/td&gt;
&lt;td&gt;High risk above 100K pulls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-stage + lint only&lt;/td&gt;
&lt;td&gt;4 hours&lt;/td&gt;
&lt;td&gt;30 min/month&lt;/td&gt;
&lt;td&gt;~5/10&lt;/td&gt;
&lt;td&gt;Minimum viable for public image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add cosign + SBOM + SLSA&lt;/td&gt;
&lt;td&gt;8 hours&lt;/td&gt;
&lt;td&gt;30 min/month&lt;/td&gt;
&lt;td&gt;~7/10&lt;/td&gt;
&lt;td&gt;Recommended above 250K pulls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full hardening + non-root&lt;/td&gt;
&lt;td&gt;16 hours&lt;/td&gt;
&lt;td&gt;1 hour/month&lt;/td&gt;
&lt;td&gt;~7.8/10&lt;/td&gt;
&lt;td&gt;Required for enterprise downstream use&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full + CII Best Practices badge&lt;/td&gt;
&lt;td&gt;40 hours&lt;/td&gt;
&lt;td&gt;2 hours/month&lt;/td&gt;
&lt;td&gt;~8.5/10&lt;/td&gt;
&lt;td&gt;Worth it only for funded projects&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The jump from 5 to 7 costs four hours once. The jump from 7 to 7.8 costs another eight hours plus a breaking release. Getting from 7.8 to 8.5 costs forty hours of process overhead and tops out at a ceiling you do not control. I stopped at 7.8. For a solo maintainer the marginal return on the next tier goes negative.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./docker-supply-chain-hardening-solo-maintainer-2.webp&quot; alt=&quot;OpenSSF Scorecard report showing 7.8 score with all 18 checks broken down by severity&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Framework: supply chain hardening for solo maintainers&lt;/h2&gt;
&lt;p&gt;Three layers. Each one is a deploy cycle. The names track the migration topic family on purpose, because this is a migration from insecure defaults to attested defaults, not a fresh build from scratch.&lt;/p&gt;
&lt;h3&gt;Layer 1: inventory&lt;/h3&gt;
&lt;p&gt;The first goal is the audit, not the fix. You cannot harden what you have not measured.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Layer 1: run once before any changes
# 1. Current Scorecard baseline
docker run -e GITHUB_AUTH_TOKEN=$GITHUB_TOKEN gcr.io/openssf/scorecard:stable \
    --repo=github.com/OWNER/REPO --show-details

# 2. Current Scout grade
docker scout quickview OWNER/IMAGE:latest

# 3. Trivy CVE baseline
trivy image --severity HIGH,CRITICAL OWNER/IMAGE:latest

# 4. Pin every base image to a digest and save the old Dockerfile
git mv Dockerfile Dockerfile.baseline
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Run all four. Save the output. That Scorecard baseline is what you compare against once the hardening lands. On my run the starting numbers were Scout grade D, an OpenSSF score in the low single digits, and several HIGH CVEs from apt package lag.&lt;/p&gt;
&lt;p&gt;Owner: the single maintainer.&lt;/p&gt;
&lt;h3&gt;Layer 2: parallel run&lt;/h3&gt;
&lt;p&gt;Phase 1. Multi-stage build. OCI labels. Hadolint in CI.&lt;/p&gt;
&lt;p&gt;Phase 2. Cosign keyless signing. SBOM generation. SLSA build provenance. Trivy SARIF upload.&lt;/p&gt;
&lt;p&gt;Phase 3. Non-root USER 10001 breaking release, plus a v1-maintenance floating tag for users who cannot migrate inside the window. Semver tags are kept forever by the tag cleanup policy and are the recommended target for production pins.&lt;/p&gt;
&lt;p&gt;The signing job is the piece that earns the Cosign Verified badge and the SLSA provenance:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;# Layer 2: .github/workflows/publish.yml (signing + attestation)
permissions:
  contents: read
  id-token: write
  packages: write
  attestations: write

jobs:
  build:
    runs-on: ubuntu-latest
    outputs:
      digest: ${{ steps.build.outputs.digest }}
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6

      - uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4

      - uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - id: build
        uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7
        with:
          platforms: linux/amd64,linux/arm64
          push: true
          provenance: mode=max
          sbom: true
          tags: ${{ env.IMAGE }}:${{ env.VERSION }}

      - uses: actions/attest-build-provenance@a2bbfa25375fe432b6a289bc6b6cd05ecd0c4c32 # v4.1.0
        with:
          subject-name: ${{ env.IMAGE }}
          subject-digest: ${{ steps.build.outputs.digest }}
          push-to-registry: false

      - uses: sigstore/cosign-installer@cad07c2e89fa2edd6e2d7bab4c1aa38e53f76003 # v4.1.1
        with:
          cosign-release: &quot;v2.6.1&quot;

      - run: |
          set -euo pipefail
          echo &quot;${TAGS}&quot; | while IFS= read -r tag; do
            [ -z &quot;$tag&quot; ] &amp;amp;&amp;amp; continue
            cosign sign --yes &quot;${tag}@${DIGEST}&quot;
          done
        env:
          TAGS: ${{ steps.meta.outputs.tags }}
          DIGEST: ${{ steps.build.outputs.digest }}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Incident postmortem.&lt;/strong&gt; During Phase 2 I first shipped the workflow above with &lt;code&gt;push-to-registry: true&lt;/code&gt;. The signing step succeeded. The attestation push failed. Docker Hub&apos;s OCI referrers API silently rejected the credential handoff from the workflow. I re-ran the publish job with &lt;code&gt;push-to-registry: false&lt;/code&gt; and shipped the fix as a hotfix. The fix is to keep attestations in GitHub Attestations (where they are retrievable by anyone with the digest) and skip the registry push until Docker Hub stabilizes its referrers behavior. Root cause: the referrers API expects a specific OCI 1.1 header format that the &lt;code&gt;actions/attest-build-provenance&lt;/code&gt; v3 action does not negotiate cleanly against Docker Hub&apos;s current implementation. GHCR works. Docker Hub does not.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A second regression surfaced five days later, when I turned on Docker Hub tag immutability. The publish workflow had been generating a &lt;code&gt;kube-v*&lt;/code&gt; tag on every push event, and that collided with the immutability policy and aborted the build before the cosign step could run. So main pushes shipped a new &lt;code&gt;:latest&lt;/code&gt; digest each time without ever signing it. The fix scoped the &lt;code&gt;kube-v*&lt;/code&gt; tag to semver release events only, and added &lt;code&gt;set -euo pipefail&lt;/code&gt; plus per-tag error handling to the signing step shown above so future failures fail loud rather than silent. Floating tags are signing reliably again as of late April.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./docker-supply-chain-hardening-solo-maintainer-3.webp&quot; alt=&quot;GitHub Attestations page showing thirteen SLSA provenance records from publish.yml&quot;&gt;&lt;/p&gt;
&lt;p&gt;After Phase 2 the image carries keyless cosign signatures, an SPDX SBOM, and SLSA build provenance at mode=max, all traceable to the exact GitHub Actions run that produced them. After Phase 3 the default user is UID 10001 with GID 0, so the image drops straight into OpenShift &lt;code&gt;restricted-v2&lt;/code&gt; with no &lt;code&gt;securityContext&lt;/code&gt; override.&lt;/p&gt;
&lt;p&gt;Owner: the single maintainer.&lt;/p&gt;
&lt;h3&gt;Layer 3: cutover and continuous verification&lt;/h3&gt;
&lt;p&gt;Weekly automation is what holds the score at 7.8 instead of letting it drift back to 5 over time.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;# Layer 3: .github/workflows/scorecard.yml
on:
  schedule:
    - cron: &apos;0 6 * * 2&apos;   # Tue 06:00 UTC
  push:
    branches: [main]

permissions: read-all

jobs:
  analysis:
    runs-on: ubuntu-latest
    permissions:
      security-events: write
      id-token: write
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
        with:
          persist-credentials: false

      # Pinned to commit SHA, not tag SHA (annotated tags dereference differently)
      - uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3
        with:
          results_file: results.sarif
          results_format: sarif
          publish_results: true

      - uses: github/codeql-action/upload-sarif@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4.35.2
        with:
          sarif_file: results.sarif
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The comment on that Scorecard action pin is not paranoia. I hit an imposter commit error on the first publication attempt. Git has had two tag types since 2005: lightweight tags point directly at a commit SHA, and annotated tags point at a tag object that wraps the commit SHA. GitHub&apos;s &lt;code&gt;git/refs/tags/:tag&lt;/code&gt; API returns whichever SHA the tag ref resolves to. Annotated tag in, annotated tag object SHA out. Scorecard rejects annotated tag object SHAs during its own verification step because they are not commit SHAs.&lt;/p&gt;
&lt;p&gt;The fix is a second API call:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Annotated tag: first call returns tag object SHA
gh api repos/ossf/scorecard-action/git/refs/tags/v2.4.3 --jq &apos;.object&apos;
# {&quot;sha&quot;:&quot;99c09fe...&quot;,&quot;type&quot;:&quot;tag&quot;}

# Dereference: second call returns the commit SHA
gh api repos/ossf/scorecard-action/git/tags/99c09fe... --jq &apos;.object&apos;
# {&quot;sha&quot;:&quot;4eaacf0543bb3f2c246792bd56e8cdeffafb205a&quot;,&quot;type&quot;:&quot;commit&quot;}

# Pin the commit SHA, not the tag object SHA
# uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A twenty-year-old distinction in Git. The kind that only breaks your publication on the day you need it to work.&lt;/p&gt;
&lt;p&gt;Weekly base rebuild, weekly Scorecard re-run, weekly Docker Hub tag cleanup. Together they keep the maintenance budget under two hours a month. A tag retention policy that deletes &lt;code&gt;sha-*&lt;/code&gt; tags older than 90 days keeps the tag list readable by humans and scanners alike. One caveat: users pinning by digest should pin to digests that are also referenced by a semver tag, so that purged &lt;code&gt;sha-*&lt;/code&gt; tags do not orphan the digest.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./docker-supply-chain-hardening-solo-maintainer-4.webp&quot; alt=&quot;GitHub code scanning view showing seven Scorecard findings on the main branch with All tools are working as expected banner&quot;&gt;&lt;/p&gt;
&lt;p&gt;Owner: the single maintainer, with Dependabot as the junior engineer that ships 80% of the ongoing patches.&lt;/p&gt;
&lt;h2&gt;Tradeoffs&lt;/h2&gt;
&lt;p&gt;The full program costs sixteen hours of initial work and roughly one hour a month of ongoing review. At typical senior DevOps contractor rates, that is a single billable sprint up front and a fraction of a day per month after.&lt;/p&gt;
&lt;p&gt;Now price the alternative. A supply chain incident response engagement, forensics and containment and downstream notification, costs multiples more than a preventive hardening program&apos;s entire first-year budget. An SBOM attestation audit finding inside an enterprise procurement cycle can delay or kill multi-year contracts. The asymmetry is the whole argument. Look at the Codecov bash uploader compromise in 2021: it exposed credentials from customer CI environments across a two-month window before anyone detected it, through a single injected line of shell. Shell script, not container. Same propagation graph as a signed-nothing Docker image today.&lt;/p&gt;
&lt;p&gt;The breaking release in Phase 3 costs a migration window, a &lt;code&gt;v1-maintenance&lt;/code&gt; floating tag, and a migration guide in the README. Downstream teams can pin to &lt;code&gt;v1-maintenance&lt;/code&gt; while they budget for a container base image bump.&lt;/p&gt;
&lt;p&gt;The Scorecard findings that stay open at 7.8 are mostly honest. Code-Review scores 0/10 because I am the only reviewer. Branch-Protection scores 4/10 because I kept the admin bypass for emergency fixes. Fuzzing scores 0/10 because the image is a utility, not an application. These are trade-offs, not oversights. The score reflects them accurately, and that is the point of the program.&lt;/p&gt;
&lt;h2&gt;The closing argument&lt;/h2&gt;
&lt;p&gt;Public Docker images inherit the supply chain obligations of the projects that pull them, whether the maintainer accepts the responsibility or not. The tooling to sign, attest, and score an image is free, and the workflows run under 300 lines of YAML. Skip the migration and the cost compounds every month the image stays insecure by default. Run it and the cost is one sustained weekend of work plus about an hour a month afterward.&lt;/p&gt;
&lt;p&gt;Sixteen hours once. One hour a month after. Seven hundred thirty thousand pulls protected from whatever compromise ships against the maintainer next.&lt;/p&gt;
&lt;p&gt;Pull the image and verify it yourself:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cosign verify heyvaldemar/aws-kubectl:2.0.0 \
    --certificate-identity-regexp &quot;https://github.com/heyvaldemar/aws-kubectl-docker/.*&quot; \
    --certificate-oidc-issuer &quot;https://token.actions.githubusercontent.com&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Every signature, SBOM, and build provenance record is public in &lt;a href=&quot;https://github.com/heyvaldemar/aws-kubectl-docker/attestations&quot;&gt;GitHub Attestations&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Discussion&lt;/h2&gt;
&lt;p&gt;If you have hardened a public image past 7.0 on Scorecard, hit a Docker Hub referrers issue in production, or stuck with the do-nothing path and want to argue the cost-benefit, drop a comment below. Counterarguments welcome, and the comment thread is where I respond first. For longer back-and-forth with senior practitioners, &lt;a href=&quot;https://heyvaldemar.com/discord&quot;&gt;join the discussion on Discord&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>Docker</category><category>Container Security</category><category>DevSecOps</category><category>CI/CD</category><category>Cosign</category><category>Supply Chain</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Cloudflare Web Analytics on Astro — Why Removing GA4 Unlocked Lighthouse 100</title><link>https://heyvaldemar.com/cloudflare-web-analytics-astro-lighthouse-100/</link><guid isPermaLink="true">https://heyvaldemar.com/cloudflare-web-analytics-astro-lighthouse-100/</guid><description>How removing Google Analytics 4 from an Astro site unlocked Lighthouse 100, why Cloudflare Web Analytics replaced it, and what the tradeoffs actually cost.</description><pubDate>Sat, 18 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A Saturday in April. This blog runs on Astro 6 behind Cloudflare, and it was stuck at 88 on mobile Lighthouse. The number had drifted between 83 and 88 over the prior month, depending on image payload. Neither figure passed a Lighthouse CI budget. The cover image needed 4.5 seconds to render on throttled 4G. So I went and looked at the stack. Cloudflare Web Analytics was already getting injected at the proxy layer. On top of that, Google Analytics 4 was pulling in roughly 70 KiB of gtag.js. Two analytics systems on one site. No reason for both.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./cloudflare-web-analytics-astro-lighthouse-100-1.webp&quot; alt=&quot;PageSpeed Insights mobile report before Cloudflare Web Analytics migration showing 88 Performance, 100 Accessibility, 92 Best Practices, 100 SEO&quot;&gt;&lt;/p&gt;
&lt;p&gt;I have watched this exact failure mode repeat across 20+ years of running observability in production. Telecom portals. Banking dashboards. Enterprise SaaS marketing sites. Someone bolts on a new measurement tool before anyone audits what the infrastructure layer already hands you for free. Cloudflare Web Analytics has been running server-side on this domain for over a year. GA4 on top of it was duplicate spend, paid in JavaScript execution time and GDPR exposure. Deleting it closed the Lighthouse gap and killed every third-party cookie in one commit.&lt;/p&gt;
&lt;h2&gt;What the stacked analytics configuration looks like&lt;/h2&gt;
&lt;p&gt;The problem rarely shows up in the source diff. It shows up in the Network tab.&lt;/p&gt;
&lt;p&gt;A typical Astro layout adds GA4 the standard way, with a tag in &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!-- Astro layout with Google Analytics 4 (gtag.js) --&amp;gt;
&amp;lt;script async src=&quot;https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script&amp;gt;
  window.dataLayer = window.dataLayer || [];
  function gtag(){ dataLayer.push(arguments); }
  gtag(&apos;js&apos;, new Date());
  gtag(&apos;config&apos;, &apos;G-XXXXXXXXXX&apos;);
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That buys you roughly 70 KiB gzipped for &lt;code&gt;gtag.js&lt;/code&gt; with enhanced measurement on, plus an inline init block, plus third-party requests out to &lt;code&gt;www.googletagmanager.com&lt;/code&gt; and &lt;code&gt;www.google-analytics.com&lt;/code&gt;. Lighthouse flags the lot under &quot;Reduce unused JavaScript&quot;, even on a site that never fires a single custom event.&lt;/p&gt;
&lt;p&gt;The replacement is nothing:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!-- Cloudflare Web Analytics: no client script required --&amp;gt;
&amp;lt;!-- beacon.min.js is injected by Cloudflare proxy when --&amp;gt;
&amp;lt;!-- orange-cloud DNS is enabled. CSP must allow --&amp;gt;
&amp;lt;!-- static.cloudflareinsights.com in script-src. --&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The beacon is injected at the proxy layer, and aggregation happens at Cloudflare&apos;s edge. The client pays for one small beacon instead of a 70 KiB analytics runtime. No cookies get set.&lt;/p&gt;
&lt;p&gt;In over twenty years of running observability in production, I have never owned a performance budget where GA4&apos;s &lt;code&gt;gtag.js&lt;/code&gt; paid for itself on a content site. Every performance review, same story: flagged, then ignored.&lt;/p&gt;
&lt;h2&gt;Why this keeps happening&lt;/h2&gt;
&lt;p&gt;Google Analytics is the default reach. Product managers know the GA4 reports. Marketing knows the GA4 dashboards. Bootcamps teach the GA4 snippet on day one. So it ends up installed even when the CDN layer already gives you analytics, and nobody ever audits the stack for duplication.&lt;/p&gt;
&lt;p&gt;Cloudflare Web Analytics lives at the proxy layer. Proxy a domain through Cloudflare with orange-cloud DNS enabled and the &lt;code&gt;static.cloudflareinsights.com/beacon.min.js&lt;/code&gt; script gets injected server-side. The beacon is tiny. Aggregation happens at Cloudflare&apos;s edge. No persistent identifier cookies are set by default.&lt;/p&gt;
&lt;p&gt;Per Cloudflare&apos;s public documentation, Web Analytics ships on all plans, Free included. It anonymizes IP at the edge and sets no tracking cookies. That puts it outside the default scope of most cookie consent requirements. Your team still needs its own legal review for its own jurisdiction, though. Always.&lt;/p&gt;
&lt;h2&gt;Risk and blast radius&lt;/h2&gt;
&lt;p&gt;Direct exposure breaks into three categories.&lt;/p&gt;
&lt;p&gt;First, GDPR and ePrivacy. GA4 uses cookies and processes personal data, which means explicit consent in the EU and UK, and increasingly under US state privacy laws too (CCPA, VCDPA, CPA). Cloudflare Web Analytics runs without tracking cookies. Back in February 2022, CNIL in France ruled that Google Analytics deployments can fall outside GDPR compliance, specifically over data transfers to the United States.&lt;/p&gt;
&lt;p&gt;Second, the performance budget. That is 70 KiB of JavaScript to parse and execute on every first page load. Main-thread work spikes on mid-tier Android.&lt;/p&gt;
&lt;p&gt;Third, data sovereignty. GA4 data sits in Google infrastructure, US by default.&lt;/p&gt;
&lt;p&gt;The systemic exposure is the bigger one. Every page, every visit, carries the runtime cost. Take a 1,000-page documentation site serving 100K monthly visitors: that is real energy spent, latency added, and a permanent third-party dependency parked in the critical render path. Then your cookie consent management platform piles on another 20-50 KiB. Pull GA4 and you often pull the entire reason the CMP exists.&lt;/p&gt;
&lt;h2&gt;Options compared&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Client JS (gzipped)&lt;/th&gt;
&lt;th&gt;Tracking cookies&lt;/th&gt;
&lt;th&gt;Data residency&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;Fit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Google Analytics 4&lt;/td&gt;
&lt;td&gt;~70 KiB&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;US (Google)&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Funnels, ad attribution, Google Ads integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloudflare Web Analytics&lt;/td&gt;
&lt;td&gt;0 additional (edge beacon ~1 KiB)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Cloudflare edge&lt;/td&gt;
&lt;td&gt;Free on all plans&lt;/td&gt;
&lt;td&gt;Traffic, Core Web Vitals, content sites&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plausible&lt;/td&gt;
&lt;td&gt;~1 KiB&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;EU (Hetzner)&lt;/td&gt;
&lt;td&gt;$9/mo and up&lt;/td&gt;
&lt;td&gt;Privacy-first, public dashboards&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fathom&lt;/td&gt;
&lt;td&gt;~1.6 KiB&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;EU or Canada&lt;/td&gt;
&lt;td&gt;$15/mo and up&lt;/td&gt;
&lt;td&gt;Privacy-first, simpler UX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PostHog (self-hosted)&lt;/td&gt;
&lt;td&gt;20-50 KiB&lt;/td&gt;
&lt;td&gt;Configurable&lt;/td&gt;
&lt;td&gt;Your infrastructure&lt;/td&gt;
&lt;td&gt;Infra only&lt;/td&gt;
&lt;td&gt;Product analytics, session replay, feature flags&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Don&apos;t read the table as &quot;Cloudflare wins.&quot; Read it as &lt;em&gt;the question is what you measure&lt;/em&gt;. A content site that needs pageviews and Core Web Vitals lands somewhere very different from an e-commerce funnel that needs attribution down to the ad creative.&lt;/p&gt;
&lt;h2&gt;Framework: From GA4 to Cloudflare Web Analytics&lt;/h2&gt;
&lt;h3&gt;Layer 1 — Measure (week 1)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Run Lighthouse on mobile and desktop, capture current scores&lt;/li&gt;
&lt;li&gt;Run PageSpeed Insights and pull CrUX real-user data for LCP p75 if the domain meets the traffic threshold; otherwise use Cloudflare RUM or self-hosted &lt;code&gt;web-vitals&lt;/code&gt; collection&lt;/li&gt;
&lt;li&gt;Open DevTools Network tab and list every third-party origin loaded on the home page&lt;/li&gt;
&lt;li&gt;Check response headers to identify your CDN: &lt;code&gt;cf-ray&lt;/code&gt; for Cloudflare, &lt;code&gt;x-served-by&lt;/code&gt; for Fastly, &lt;code&gt;x-nf-request-id&lt;/code&gt; for Netlify, &lt;code&gt;x-vercel-cache&lt;/code&gt; for Vercel&lt;/li&gt;
&lt;li&gt;Audit the CDN dashboard for built-in analytics you may not have enabled: Cloudflare Web Analytics, Fastly Observability, Netlify Analytics, Vercel Web Analytics&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Owner: platform engineer or senior frontend.&lt;/p&gt;
&lt;h3&gt;Layer 2 — Remove (week 2)&lt;/h3&gt;
&lt;p&gt;Remove any analytics tool that duplicates what the CDN already provides.&lt;/p&gt;
&lt;p&gt;Update CSP to allow the CDN beacon origin. For Cloudflare:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# CSP for Cloudflare Web Analytics on Astro + Cloudflare proxy
Content-Security-Policy:
  default-src &apos;self&apos;;
  script-src &apos;self&apos; &apos;unsafe-inline&apos; https://static.cloudflareinsights.com;
  connect-src &apos;self&apos; https://cloudflareinsights.com;
  img-src &apos;self&apos; data:;
  style-src &apos;self&apos; &apos;unsafe-inline&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Add &lt;code&gt;fetchpriority=&quot;high&quot;&lt;/code&gt; to the LCP image, meaning the hero image, first post card, or above-fold banner:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!-- LCP candidate, Astro first-post card --&amp;gt;
&amp;lt;img
  src=&quot;/images/posts/first-post.webp&quot;
  alt=&quot;First post cover&quot;
  fetchpriority=&quot;high&quot;
  loading=&quot;eager&quot;
  width=&quot;1200&quot;
  height=&quot;675&quot;
/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then audit every &lt;code&gt;&amp;lt;link rel=&quot;preconnect&quot;&amp;gt;&lt;/code&gt; and delete origins that aren&apos;t in the critical render path. A dead preconnect steals a TCP slot from an origin that actually matters.&lt;/p&gt;
&lt;p&gt;Owner: frontend lead plus security for CSP review.&lt;/p&gt;
&lt;h3&gt;Layer 3 — Gate in CI (week 3 onward)&lt;/h3&gt;
&lt;p&gt;Add Lighthouse CI to the build pipeline. Fail the build on regressions:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;# .github/workflows/lighthouse.yml — Lighthouse CI gate
name: Lighthouse
on: [push, pull_request]
jobs:
  lhci:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: 20 }
      - run: npm ci &amp;amp;&amp;amp; npm run build
      - uses: treosh/lighthouse-ci-action@v11
        with:
          urls: |
            https://heyvaldemar.com/
            https://heyvaldemar.com/latest-post/
          budgetPath: ./budget.json
          uploadArtifacts: true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Watch Cloudflare RUM p75 LCP weekly. Synthetic Lighthouse is a benchmark, not the truth. Real users on newer phones over better networks usually come in 30-50% faster than the Moto G Power / Slow 4G synthetic model.&lt;/p&gt;
&lt;p&gt;Add a pre-push Git hook that runs &lt;code&gt;astro check &amp;amp;&amp;amp; astro build&lt;/code&gt; so a broken build never reaches the remote:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/usr/bin/env bash
# .git/hooks/pre-push — block push on failed Astro build
ZERO_SHA=&quot;0000000000000000000000000000000000000000&quot;
while read -r local_ref local_sha remote_ref remote_sha; do
  # Skip verification on branch delete
  [ &quot;$local_sha&quot; = &quot;$ZERO_SHA&quot; ] &amp;amp;&amp;amp; exit 0
done
npx astro check &amp;amp;&amp;amp; npx astro build
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Owner: platform engineer.&lt;/p&gt;
&lt;h2&gt;Tradeoffs&lt;/h2&gt;
&lt;p&gt;Cloudflare Web Analytics does less than GA4. No funnels. No deep custom event schemas. No native Google Ads integration. For content sites, documentation, and most engineering-led blogs, none of that is a loss you will feel. Conversion-heavy e-commerce with retargeting pipelines is the exception, where GA4 might still earn its weight, though even there the stronger answer is usually a privacy-first product analytics tool (Plausible, Fathom, or self-hosted PostHog) over client-side GA4.&lt;/p&gt;
&lt;p&gt;The other tradeoff is CDN alignment. Move the site off Cloudflare and the beacon goes with it. That is not a hard lock-in, since competing CDNs ship their own first-party analytics, but it is worth naming in any architecture review.&lt;/p&gt;
&lt;p&gt;The cost of the alternative is concrete. 70 KiB of JavaScript on every pageview. A cookie consent banner. GDPR exposure. A standing regression against any performance budget you set. On mid-tier Android over a mid-tier network, that 70 KiB is a real LCP penalty. I have watched Lighthouse scores camp at 92-94 for months because a team would not question the GA4 install.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./cloudflare-web-analytics-astro-lighthouse-100-2.webp&quot; alt=&quot;PageSpeed Insights mobile report after Cloudflare Web Analytics migration showing 94 Performance, 100 Accessibility, 100 Best Practices, 100 SEO&quot;&gt;&lt;/p&gt;
&lt;h2&gt;The closing argument&lt;/h2&gt;
&lt;p&gt;The strongest case against GA4 on a content site in 2026 is not privacy, and it is not performance. It is supply chain. Every third-party script in your critical render path is code you did not write, cannot audit, and still inherit the blast radius of. Cloudflare Web Analytics is not better because it is faster. It is better because it is one fewer trust boundary.&lt;/p&gt;
&lt;p&gt;The privacy alignment is a bonus. The LCP improvement is a bonus. The actual architectural position is simpler: observability tooling should come from the infrastructure layer you already trust, not get bolted on top of it.&lt;/p&gt;
&lt;h2&gt;Sources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Web.dev, &quot;Fetch priority to improve LCP&quot;, https://web.dev/articles/fetch-priority, 2024&lt;/li&gt;
&lt;li&gt;Cloudflare, &quot;Web Analytics product documentation&quot;, https://developers.cloudflare.com/web-analytics/, ongoing&lt;/li&gt;
&lt;li&gt;Google, &quot;gtag.js reference&quot;, https://developers.google.com/tag-platform/gtagjs/reference, ongoing&lt;/li&gt;
&lt;li&gt;CNIL (France), &quot;Use of Google Analytics and data transfers to the United States&quot;, https://www.cnil.fr/en/use-google-analytics-and-data-transfers-united-states-cnil-orders-website-manageroperator-comply, February 2022&lt;/li&gt;
&lt;li&gt;Astro Docs, &quot;Image optimization&quot;, https://docs.astro.build/en/guides/images/, ongoing&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Discussion&lt;/h2&gt;
&lt;p&gt;If you have removed GA4 on a production site, or kept it and have the numbers to justify it, drop a comment below. Counterarguments welcome. For longer back-and-forth with senior practitioners, &lt;a href=&quot;https://heyvaldemar.com/discord&quot;&gt;join the discussion on Discord&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>Performance</category><category>Cloudflare</category><category>Astro</category><category>Observability</category><category>DevOps</category><category>Privacy</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>The Intake Gate Your CISO Is Missing — 300 Million AI Chat Messages Were Public by Default</title><link>https://heyvaldemar.com/exposed-ai-messages-security-gate-missing/</link><guid isPermaLink="true">https://heyvaldemar.com/exposed-ai-messages-security-gate-missing/</guid><description>Half of AI-enabled apps on major backends carry severe misconfigurations. Inside the 300M-message Firebase breach and a 3-layer protocol to stop Agent Sprawl.</description><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In January 2026, a security researcher poked at a consumer AI chat app called Chat and Ask AI and found something stupid. The Firebase Realtime Database behind it was set to public read. No token. No auth of any kind. Around 300 million private chat messages, tied to roughly 25 million users, sat there openly queryable for a long stretch before anyone flagged it and shipped a fix.&lt;/p&gt;
&lt;p&gt;And the content was not small talk. People had typed in medical questions, legal problems, financial details, the kind of private disclosures you would not say out loud in an office. The vendor patched within hours of disclosure. That part was fine. But the window was already open, and the data was already sensitive, so the liability sticks. To the vendor, sure. Also to any company whose staff used the tool for work.&lt;/p&gt;
&lt;p&gt;On its own this is a bad day for one app. As a pattern it is much worse. Researchers then scanned 200 iOS apps running on Firebase and found 103 of them carrying the exact same public-access mistake. More than half. So this is not one careless vendor. It is the whole category falling over.&lt;/p&gt;
&lt;h2&gt;What the misconfiguration actually looks like&lt;/h2&gt;
&lt;p&gt;Before we get to governance, look at how trivial the failure is. Firebase Realtime Database uses security rules to gate reads and writes. The bad default that caused this breach reads like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;rules&quot;: {
    &quot;.read&quot;: true,
    &quot;.write&quot;: true
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That hands any unauthenticated HTTP request full read and write over the entire database. Every message. Every username. Every session. Available to anyone who can build the right URL.&lt;/p&gt;
&lt;p&gt;A locked-down version forces authentication and scopes each user to their own records:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;rules&quot;: {
    &quot;chats&quot;: {
      &quot;$userId&quot;: {
        &quot;.read&quot;: &quot;$userId === auth.uid&quot;,
        &quot;.write&quot;: &quot;$userId === auth.uid&quot;
      }
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Six lines of JSON. That is the entire gap between &quot;300 million messages exposed&quot; and &quot;data properly isolated.&quot; Nobody got clever here. A default went unchecked, and that was enough.&lt;/p&gt;
&lt;p&gt;I have led plenty of platform engagements where third-party AI tools were in scope. In every one of them, the backend access config was either unknown to the team adopting the tool, or waved off as something the vendor handled. It never was handled. The pattern does not change: teams pick AI tools on features and never look at the infrastructure underneath. Run that gap at scale and the Firebase breach is what you get. It was always coming.&lt;/p&gt;
&lt;h2&gt;The governance gap&lt;/h2&gt;
&lt;p&gt;Firebase actually ships locked down. No reads, no writes, nothing open by default. But the setup wizard dangles a test mode with full public access for prototyping, and developers push that test config straight to production. Why? Because no review step forces anyone to close it before launch.&lt;/p&gt;
&lt;p&gt;Most companies have grown-up intake for SaaS that touches email, CRM, or money. AI chat tools slipped right past all of it. An employee downloads one on a whim. A team brings one in without ever calling procurement. And the backend config, the thing that decides whether user data is locked or wide open, gets checked by exactly nobody on the adopting side.&lt;/p&gt;
&lt;p&gt;Thales&apos; 2026 Data Threat Report puts numbers on how wide this gap runs. Only about a third of surveyed organizations say they actually know where all their data lives, and that is while AI tools are being handed broad internal access. Sixty-one percent name AI as their top data security risk. Seventy percent say the pace of AI-driven change is their single biggest security challenge. The concern is clearly there. What is missing is the bridge to control: the intake gate, the config check, the access audit. Most shops do not have it.&lt;/p&gt;
&lt;h2&gt;Risk and liability&lt;/h2&gt;
&lt;p&gt;Liability here works on two levels.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Direct exposure.&lt;/strong&gt; Any company whose employees ran Chat and Ask AI, or any of the other 103 broken apps, for work conversations is now looking at possible regulatory notification duties. If someone pasted in PII, protected health information, legal privilege, or financial material, that can pull in GDPR, HIPAA, state breach notification laws, or sector rules, depending on jurisdiction and how the data is classified.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Systemic exposure.&lt;/strong&gt; Leadership gets a nastier question. If more than half of AI apps on a major backend carry the same flaw, what are the odds your own employees are using at least one of them right now? With no central AI tool inventory, you cannot answer that. And &quot;we didn&apos;t know&quot; does not hold up in front of a regulator.&lt;/p&gt;
&lt;p&gt;IBM&apos;s 2026 X-Force Threat Intelligence Index piles on. Over 300,000 stolen ChatGPT credentials were found floating around through infostealer malware. AI chat platforms are now a prime target for credential theft. So the exposure is not just misconfigured backends. It is also compromised accounts on the platforms your people log into every day.&lt;/p&gt;
&lt;h2&gt;Blast radius&lt;/h2&gt;
&lt;p&gt;The Firebase incident by itself is already large: 300 million messages, full chat histories, usernames, sensitive content. But the systemic read, 103 of 200 apps broken, turns it from a one-vendor story into a supply-chain problem for anyone who lets staff use third-party AI tools without checking the backend.&lt;/p&gt;
&lt;p&gt;What pushes the risk up a tier is the compounding. Thales reports 67% of organizations name credential theft as the main attack vector against cloud. Nearly 60% have already been hit by a deepfake incident. Stack misconfigured AI backends on top of stolen AI credentials on top of missing data classification, and you get a compound exposure that no single fix can clean up.&lt;/p&gt;
&lt;p&gt;There is a cost angle too, and it almost never makes it into the incident writeup. AI data retention you cannot measure, spread across several tools and cloud regions, quietly bloats storage and compliance spend. If you cannot even list which AI tools are holding your data, you cannot enforce data minimization or retention. Both of which regulators are leaning on harder, under GDPR and the newer US state privacy laws alike.&lt;/p&gt;
&lt;h2&gt;Control protocol: specific tooling, not generic advice&lt;/h2&gt;
&lt;p&gt;The control framework runs in three layers: visibility, then identity enforcement, then continuous verification. Each one names the actual tooling you need, not just the principle behind it.&lt;/p&gt;
&lt;h3&gt;Layer 1 — Visibility (Days 1–7)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Objective:&lt;/strong&gt; Know what AI tools are in your environment. Block what you have not verified.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Network-layer blocking:&lt;/strong&gt; Deploy a Secure Web Gateway (Cloudflare Gateway, Zscaler Internet Access, or Netskope) with a deny-by-default policy for uncategorized AI/ML SaaS domains. Maintain an explicit allowlist for approved tools only.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Endpoint-layer blocking:&lt;/strong&gt; Push MDM policies (Intune, Jamf, Kandji) to prevent installation of unapproved AI applications on managed devices.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI tool registry:&lt;/strong&gt; Publish a central registry (a shared spreadsheet is adequate for Week 1; migrate to a proper SaaS inventory tool like Productiv, Zylo, or Torii for scale). Every external AI tool used for work must be listed, owner-assigned, and approved before use.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;One-time backend audit of approved tools:&lt;/strong&gt; For any approved tool using Firebase, run an open-source Firebase auditing tool (such as Baserunner) or use &lt;code&gt;curl&lt;/code&gt; against the Realtime Database REST endpoint to confirm that unauthenticated reads are rejected:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Quick check: if this returns data, the database is publicly readable
curl -s &quot;https://&amp;lt;project-id&amp;gt;.firebaseio.com/.json&quot;
# Secure response: {&quot;error&quot;:&quot;Permission denied&quot;}
# Insecure response: actual database contents
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Layer 2 — Identity Enforcement (Days 8–14)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Objective:&lt;/strong&gt; Elevate AI platforms to the same identity governance tier as your CRM and financial systems.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SSO-only access:&lt;/strong&gt; Require SAML/OIDC integration for all approved AI tools. Configure this in your IdP (Okta, Entra ID, Google Workspace). Tools that cannot integrate with SSO are disqualified from the approved list — no exceptions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mandatory MFA:&lt;/strong&gt; Enforce phishing-resistant MFA (FIDO2/WebAuthn preferred) for AI platform access via conditional access policies.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vendor attestation:&lt;/strong&gt; Add a backend security configuration attestation to procurement and renewal checklists. Require vendors to confirm: (1) no public-access database rules, (2) encryption at rest and in transit, (3) data residency and retention policy. This is a procurement process change, not a technical deployment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Credential rotation:&lt;/strong&gt; For any AI platform where credentials may have been exposed, force password rotation and revoke existing API tokens immediately.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Layer 3 — Continuous Verification (Days 15–30, then Ongoing)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Objective:&lt;/strong&gt; Detect vendor configuration drift and anomalous AI tool usage before they become incidents.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Automated configuration scanning:&lt;/strong&gt; Schedule quarterly (minimum) automated checks against approved AI tool backends. For Firebase-backed tools, integrate the &lt;code&gt;curl&lt;/code&gt; check above into your CI/CD or security scanning pipeline. For broader SaaS posture management, evaluate SSPM tools (Obsidian Security, AppOmni, Adaptive Shield).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Usage telemetry integration:&lt;/strong&gt; Forward AI tool access logs and network-layer SWG logs into your existing SIEM (Splunk, Sentinel, Chronicle). Create detection rules for: (1) access to unapproved AI domains, (2) bulk data transfer to AI tool endpoints, (3) AI tool access from unmanaged devices.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OPA/Rego policy enforcement (for platform engineering teams):&lt;/strong&gt; If you manage infrastructure as code, enforce AI tool backend security requirements as policy. Example OPA rule that rejects Firebase deployments with public access:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;package firebase.security

deny[msg] {
    input.rules[&quot;.read&quot;] == true
    msg := &quot;BLOCKED: Firebase rules allow unauthenticated public read access&quot;
}

deny[msg] {
    input.rules[&quot;.write&quot;] == true
    msg := &quot;BLOCKED: Firebase rules allow unauthenticated public write access&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Incident response playbook:&lt;/strong&gt; Establish a dedicated IR playbook for third-party AI tool data exposure. Include: regulatory notification timelines by jurisdiction (72 hours for GDPR), data classification triage procedures, vendor communication templates, and employee notification protocols.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Operational friction vs. liability exposure&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;The friction is real.&lt;/strong&gt; Block unapproved AI tools and you will hear from the business units that quietly started using them to move faster. Vendor attestation slows procurement down. SSO-only access will knock out popular consumer-grade tools that teams have already gotten fond of.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The exposure is worse.&lt;/strong&gt; Skip this control layer and your organization eats the regulatory and financial risk of every broken third-party backend, every stolen credential set, every unclassified disclosure, across every AI tool every employee has ever touched.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The math:&lt;/strong&gt; A GDPR breach notification proceeding, counting legal counsel, forensic audit, regulator back-and-forth, and a possible fine, starts in the six figures for a mid-size enterprise. Now multiply by however many broken tools your people may have used. Set that against the cost of one Secure Web Gateway policy update and a procurement checklist revision.&lt;/p&gt;
&lt;p&gt;If you run anything in a regulated environment, there is nothing to debate. Control is the only posture you can defend.&lt;/p&gt;
&lt;h2&gt;Executive verdict: adopt and enforce&lt;/h2&gt;
&lt;p&gt;The Firebase misconfiguration is not a fluke. It is a confirmed, systemic failure across more than half of the apps tested in this category. The fix is not one more security product. It is operational discipline with specific, auditable controls behind it.&lt;/p&gt;
&lt;p&gt;Gate the AI tools before they reach your employees. Verify the backend config before you approve anything. Hold AI platforms to the same identity governance you already demand from your CRM and financial systems.&lt;/p&gt;
&lt;p&gt;The companies that come through the next wave of AI-driven breaches will not be the ones with the fattest security budgets. They will be the ones with the most ruthless intake. The gate before the tool. The review before the deployment. The registry before the incident.&lt;/p&gt;
&lt;h2&gt;The Monday morning directive&lt;/h2&gt;
&lt;p&gt;Executives do not sit there auditing Firebase instances by hand. They tell their teams to. If you are forwarding this brief to your CISO, Head of Infrastructure, or IAM lead, attach this exact mandate:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&quot;Review the attached brief on the systemic backend misconfigurations in AI chat apps. By EOD Wednesday, I need:&lt;/em&gt;
&lt;em&gt;1. A verified list of all third-party AI chat tools currently accessed from our network — pull SWG/proxy logs for the last 90 days.&lt;/em&gt;
&lt;em&gt;2. Confirmation of whether each tool is gated behind SSO and MFA, and whether any use Firebase or similar BaaS backends.&lt;/em&gt;
&lt;em&gt;3. An execution plan to block unapproved tools at the MDM and network layer by end of next week, and a procurement checklist update requiring backend security attestation for all AI tool renewals.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>AI &amp; MLOps</category><category>AI</category><category>Security</category><category>DevSecOps</category><category>IAM</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>I Tested an AI Agent on My Live Systems. Here Is the Blast Radius Assessment Every Engineer Is Skipping.</title><link>https://heyvaldemar.com/ai-agent-blast-radius-assessment/</link><guid isPermaLink="true">https://heyvaldemar.com/ai-agent-blast-radius-assessment/</guid><description>Everyone&apos;s installing AI agents on Mac Minis. I tested one in isolation — the architectural framework for deployment the hype leaves out.</description><pubDate>Sun, 22 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;An AI agent went viral last week. The creator got hired by OpenAI within days of the announcement. Instagram reels with seven-figure view counts are telling engineers to wire the agent into their inbox, their CRM, their project tools, and then step back. The pitch is simple. Autonomous execution. Zero oversight. Hours of your week handed back.&lt;/p&gt;
&lt;p&gt;I built an isolated Mac environment and ran the agent through every task I could think up.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The software worked. The concept did not survive contact with a real operational context.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The agent can do the work. That was never the question. The question is what happens when it does the work &lt;em&gt;wrong&lt;/em&gt;, and whether you find out before your client does.&lt;/p&gt;
&lt;p&gt;So this is not a review of OpenClaw. It is an analysis of the deployment decision itself, and of why the question most engineers are asking is the wrong one.&lt;/p&gt;
&lt;p&gt;import VideoPlayer from &quot;@components/VideoPlayer.astro&quot;;&lt;/p&gt;
&lt;p&gt;&amp;lt;VideoPlayer
videoId=&quot;A1mioASn3-w&quot;
title=&quot;I Tested OpenClaw: Why AI Agents Break Production&quot;
/&amp;gt;&lt;/p&gt;
&lt;h2&gt;The Wrong Question&lt;/h2&gt;
&lt;p&gt;The wrong question is: &lt;em&gt;what can this agent do?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The demo answers that one cleanly. It summarizes emails. It updates CRM records. It drafts replies and pushes Notion updates. Every one of those runs fine in a controlled environment with clean data, clear intent, and no ambiguity to trip over.&lt;/p&gt;
&lt;p&gt;Production is none of those things. It carries relationship context the model cannot see. It runs on implicit rules the team enforces but never wrote down. And it lives in communication threads where tone, timing, and word choice carry business consequences that no training set has fully encoded.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The right question is: what can this agent break, and what is the recovery time?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is an architectural question. Most of the engineers buying Mac Minis this weekend are not asking it.&lt;/p&gt;
&lt;h2&gt;Blast Radius: The Metric That Determines Safe Deployment&lt;/h2&gt;
&lt;p&gt;Blast radius comes out of system reliability engineering. Applied to an agent, it measures the &lt;strong&gt;maximum damage&lt;/strong&gt; that agent can do with the permissions it holds right now, and whether that damage is reversible inside a recovery window you can actually live with.&lt;/p&gt;
&lt;p&gt;Every permission you grant is a ceiling on that radius. Read access to one email thread sits low. Write access to the primary inbox does not. Its ceiling includes unauthorized client commitments, archived active deals, and reputational damage that no rollback command will undo.&lt;/p&gt;
&lt;p&gt;Before an agent touches a live system, every permission gets its own assessment:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;What is the worst action this agent can take with this permission?&lt;/em&gt;
&lt;em&gt;Is it reversible?&lt;/em&gt;
&lt;em&gt;In under ten minutes?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If the answer to either of the last two is &lt;strong&gt;no&lt;/strong&gt;, that permission does not belong in production.&lt;/p&gt;
&lt;h2&gt;Why Slack and Email Are the Highest-Risk Starting Points&lt;/h2&gt;
&lt;p&gt;The hype cycle reaches for email and messaging as the first integration. Architecturally, that is backwards.&lt;/p&gt;
&lt;h3&gt;Slack&lt;/h3&gt;
&lt;p&gt;Slack carries organizational hierarchy in every channel. Say the agent reads a ticket thread. It does not know that pinging a VP in a public channel about a P3 issue is a &lt;em&gt;career event&lt;/em&gt;, not a notification. It does not understand that some threads are politically loaded, or that a confident summary dropped in front of leadership shifts the conversation in ways no rollback touches.&lt;/p&gt;
&lt;p&gt;A misclassified priority, escalated on its own, in front of the wrong audience, is not an automation failure. &lt;strong&gt;It is a political incident with your name on it.&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;Email&lt;/h3&gt;
&lt;p&gt;Email carries relationship context stretching back months or years. The agent reads a thread. It does not know this client is mid-negotiation. It does not know the last message you sent was deliberately vague to keep the conversation open. It answers with precision, reads the literal text, and misses the intent entirely.&lt;/p&gt;
&lt;p&gt;An autonomous send from your address, to a client, misreading an open negotiation, is not an automation failure. &lt;strong&gt;It is a business incident. It may be a legal one.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;These are the systems that should get agent write access &lt;strong&gt;last&lt;/strong&gt;, not first.&lt;/p&gt;
&lt;h2&gt;The Deployment Framework&lt;/h2&gt;
&lt;h3&gt;1. The Empty Mandate Test&lt;/h3&gt;
&lt;p&gt;Before anything ships, the agent has to pass the Empty Mandate Test. You define the task in &lt;strong&gt;one sentence&lt;/strong&gt;. Not a category. Not a workflow. One specific, repeatable task.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;✅  &quot;Summarize tier-1 support tickets into a daily Slack brief.&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That one gets a deployment date.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;❌  &quot;Manage my communications.&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That one does not.&lt;/p&gt;
&lt;p&gt;If you cannot write it in a single sentence, the agent has no job description, and it should not be near your systems.&lt;/p&gt;
&lt;h3&gt;2. The Staged Promotion Model&lt;/h3&gt;
&lt;p&gt;Safe deployment runs through a promotion model. It is never a single-step connection.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stage 1 → Read-Only Observation.&lt;/strong&gt;
The agent can reach the system but cannot write, send, or modify anything. It observes, summarizes, surfaces patterns. You study its output across at least thirty real interactions. You write down where it hallucinates, where it misclassifies, and where the context window hands you a confident summary that happens to be wrong.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stage 2 → Draft-Only Access.&lt;/strong&gt;
The agent produces outputs that need human review and explicit approval before anything happens. Every email draft gets read. Every CRM note gets read before it is saved. The agent proposes. The Architect approves. This is not friction. It is validation data.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stage 3 → Supervised Execution.&lt;/strong&gt;
Once Stage 2 behavior holds up, the agent gets scoped write access for one defined, low-blast-radius task. One task. One system. Logged, and reviewed weekly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stage 4 → Earned Autonomy.&lt;/strong&gt;
Autonomy is a reward for proven reliability. It is not a switch you flip at install time. You extend it in small increments, and a revocation plan stays live at every stage.&lt;/p&gt;
&lt;p&gt;In any high-stakes context, most agents never reach Stage 4. &lt;strong&gt;That is the correct outcome.&lt;/strong&gt; Controlled output at Stage 2 or 3 beats uncontrolled autonomy at Stage 4 every time.&lt;/p&gt;
&lt;h2&gt;The Notion Problem Nobody Is Talking About&lt;/h2&gt;
&lt;p&gt;Notion sits at the center of most knowledge-heavy workflows. It holds architecture decisions, project context, client notes, and institutional memory built up over years.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;An agent with write access to a live Notion workspace is operating on the organizational brain.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It will reorganize. It will deduplicate. It will decide some pages are redundant and merge them. And it will do all of this with total confidence, on pattern matching alone, with no idea &lt;em&gt;why&lt;/em&gt; a page exists in its current shape or &lt;em&gt;who&lt;/em&gt; leans on that shape.&lt;/p&gt;
&lt;p&gt;You do not see the damage right away. It shows up three weeks later, when someone opens a page that got rewritten and finds the original context gone.&lt;/p&gt;
&lt;p&gt;Notion needs the most conservative assessment of anything in a typical stack. Read-only on specific databases is where you start. Unrestricted write access is not on the roadmap until the behavior has been validated in isolation for a long stretch.&lt;/p&gt;
&lt;h2&gt;The Architectural Verdict&lt;/h2&gt;
&lt;p&gt;Agents are a real capability. The use case is legitimate. At the right scope, the efficiency gains are measurable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The deployment philosophy being sold in this hype cycle is not.&lt;/strong&gt; It skips the blast radius assessment outright. It treats autonomy as a feature to switch on, not a property to earn.&lt;/p&gt;
&lt;p&gt;The architect&apos;s job is not to chase the demo. It is to map the worst case before the first API key gets issued.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Read-only first.&lt;/strong&gt;
&lt;strong&gt;Draft-only second.&lt;/strong&gt;
&lt;strong&gt;Scoped writes after validated behavior.&lt;/strong&gt;
&lt;strong&gt;Earned autonomy last, if at all, in high-stakes systems.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That sequence is not caution. It is architecture.&lt;/p&gt;
&lt;p&gt;The engineers who skip it will have their recovery story inside six months. The Architects who follow it get a deployment they can stand behind.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Opinion &amp; Culture</category><category>AI</category><category>DevOps</category><category>Platform Engineering</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Amazon Project Dawn Cut 30,000 Jobs — Including the Head of AWS Community Builders. Here&apos;s What It Means.</title><link>https://heyvaldemar.com/amazon-project-dawn-community-is-dead/</link><guid isPermaLink="true">https://heyvaldemar.com/amazon-project-dawn-community-is-dead/</guid><description>Amazon laid off Jason Dunn, architect of the AWS Community Builders program. The signal: community must prove production value, not engagement metrics.</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Amazon&apos;s &quot;Project Dawn&quot; isn&apos;t a restructuring. Call it what it is.&lt;/p&gt;
&lt;p&gt;30,000 jobs eliminated.&lt;/p&gt;
&lt;p&gt;Among them: &lt;strong&gt;Jason Dunn&lt;/strong&gt;, the architect and leader of the AWS Community Builders program.&lt;/p&gt;
&lt;p&gt;Not an underperformer.
Not redundant.&lt;/p&gt;
&lt;p&gt;He built one of the most visible developer community programs in the cloud industry. Then Amazon cut him anyway.&lt;/p&gt;
&lt;p&gt;This was never about Jason&apos;s performance. It was about &lt;strong&gt;efficiency&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;CEO Andy Jassy said it out loud back in June 2025:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;AI will reduce our total corporate workforce as we get efficiency gains.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Not might.
&lt;strong&gt;Will.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The company that pioneered developer community-led growth just laid off the person running that community. That isn&apos;t a headcount decision.&lt;/p&gt;
&lt;p&gt;It&apos;s a &lt;strong&gt;signal&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;The Question Every Community Member Should Ask&lt;/h2&gt;
&lt;p&gt;I hold 9 vendor-recognized community titles. Docker Captain. IBM Champion. AWS Community Builder. Six more ambassador programs across security, testing, platform engineering, and infrastructure.&lt;/p&gt;
&lt;p&gt;So when Amazon cuts the person who built the AWS Community Builders program, the program I&apos;m part of, I don&apos;t get to look away. This is my world.&lt;/p&gt;
&lt;p&gt;And the honest question is this:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If community programs can&apos;t prove ROI, what protects them during the next round of cuts?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For a decade the tech industry ran on one playbook. Give developers status and a platform, and they&apos;ll evangelize your product. It worked. It built ecosystems, and it built careers. Mine included.&lt;/p&gt;
&lt;p&gt;But the market is shifting.&lt;/p&gt;
&lt;p&gt;AI can generate tutorials in 30 languages, around the clock, for free. Generic &quot;10 Reasons to Use Kubernetes&quot; content is commoditized now. And companies are asking harder questions about what these programs actually deliver to the bottom line.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Engagement metrics aren&apos;t enough anymore.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;What&apos;s Actually at Risk&lt;/h2&gt;
&lt;p&gt;Let me be specific about what&apos;s exposed and what isn&apos;t.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vulnerable:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Community members whose only contribution is resharing vendor content&lt;/li&gt;
&lt;li&gt;Ambassadors who collect badges but don&apos;t produce original technical work&lt;/li&gt;
&lt;li&gt;Programs that measure success in &quot;impressions&quot; and &quot;engagement&quot; but can&apos;t tie activity to pipeline or adoption&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Not vulnerable:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Community members who publish original research and production-tested frameworks&lt;/li&gt;
&lt;li&gt;Ambassadors who provide direct product feedback that shapes roadmaps&lt;/li&gt;
&lt;li&gt;Programs where members are genuinely embedded in enterprise decision-making&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The difference isn&apos;t status. It&apos;s &lt;strong&gt;substance&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;A badge without production credibility is just a badge. A badge backed by published work, real architecture decisions, and proven enterprise impact is a trust signal no AI agent can replicate.&lt;/p&gt;
&lt;h2&gt;What I&apos;ve Learned From 8 Programs&lt;/h2&gt;
&lt;p&gt;I&apos;ve been inside these programs for years. Here&apos;s what I&apos;ve watched succeed, and what I&apos;ve watched fall flat.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What works:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Publishing on vendor blogs, not just your own. I&apos;ve written 7+ articles on Docker&apos;s official blog plus 2 enterprise case studies. That content lives on Docker&apos;s domain, drives their SEO, and shows real enterprise use cases. The relationship runs both ways. Docker gets credible content, and I get a platform with direct access to product leadership.&lt;/p&gt;
&lt;p&gt;Giving real product feedback. Docker Captains don&apos;t just evangelize. We test pre-release features, file bugs, challenge architectural decisions, and push back when something breaks in production. That feedback loop is genuinely valuable to the vendor, and you can&apos;t automate it.&lt;/p&gt;
&lt;p&gt;Pairing community work with production experience. Every framework I publish, every architecture pattern I share, comes from running real infrastructure at a Series D enterprise serving Fortune 500 clients. That&apos;s not content. That&apos;s &lt;strong&gt;evidence&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What doesn&apos;t work:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Collecting titles without producing anything original. Six badges and zero published articles on your ambassador profile? You&apos;re a consumer, not a contributor.&lt;/p&gt;
&lt;p&gt;Writing generic tutorials that AI can crank out faster. &quot;How to Deploy a Docker Container&quot; is a commodity. &quot;How We Secured a Multi-Region Container Supply Chain at Enterprise Scale&quot; is not.&lt;/p&gt;
&lt;p&gt;Treating community as a stand-in for career development. A Slack channel is not job security. Production credibility is.&lt;/p&gt;
&lt;h2&gt;The Community That Survives&lt;/h2&gt;
&lt;p&gt;Community isn&apos;t dying. It&apos;s &lt;strong&gt;evolving&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The programs that survive the efficiency era will be the ones where:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Members produce work that directly impacts vendor product decisions&lt;/li&gt;
&lt;li&gt;Content is grounded in production experience, not theoretical tutorials&lt;/li&gt;
&lt;li&gt;The relationship between vendor and community is measurably mutual&lt;/li&gt;
&lt;li&gt;Members bring enterprise context that AI cannot replicate&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&apos;ve watched this happen up close. When Docker publishes a case study based on my work at Ataccama, that isn&apos;t &quot;engagement.&quot; It&apos;s a sales asset. When IBM recognizes me as a Champion for turning field requirements into product insights, that isn&apos;t &quot;goodwill.&quot; It&apos;s product intelligence.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The value was always there. The programs that survive are the ones that can prove it.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;What To Do If You&apos;re in a Community Program Right Now&lt;/h2&gt;
&lt;p&gt;Hold ambassador or community titles? Here&apos;s the framework I&apos;d use.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Audit your contribution.&lt;/strong&gt;
How many original pieces have you published in the last 12 months? Not reshares. Not retweets. Original technical content grounded in your own experience. If the answer is zero, you&apos;re consuming, not contributing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Connect your community work to production.&lt;/strong&gt;
Every blog post, every talk, every framework should point back to real work. &quot;I tested this in my environment&quot; beats &quot;here&apos;s how the docs say it works.&quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Build direct relationships with product teams.&lt;/strong&gt;
The real value of these programs isn&apos;t the badge. It&apos;s the access. So use it. Give feedback. Challenge decisions. Be the person product leadership thinks of when they need a field perspective.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Own your IP.&lt;/strong&gt;
Publish on your own platform alongside the vendor blogs. Build a body of work that exists independently of any single program. If a program shuts down tomorrow, your published work survives.&lt;/p&gt;
&lt;p&gt;Jason Dunn&apos;s layoff is a signal. But the signal isn&apos;t &quot;community is dead.&quot;&lt;/p&gt;
&lt;p&gt;The signal is this: &lt;strong&gt;prove the value, or risk being classified as a cost center.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&apos;ve got 9 active titles, 500,000+ Docker Hub pulls, and 7+ articles on Docker&apos;s official blog. So I take that signal seriously. My response is to double down on substance, not walk away from community.&lt;/p&gt;
&lt;p&gt;The developers who thrive in the efficiency era won&apos;t be the ones who abandoned community programs.&lt;/p&gt;
&lt;p&gt;They&apos;ll be the ones who made those programs &lt;strong&gt;undeniably valuable&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Opinion &amp; Culture</category><category>AI</category><category>DevOps</category><category>Community</category><category>Project Dawn</category><category>Docker Captain</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Infosys Deploys Devin AI Globally — And Your DevOps Career Just Became Legacy Labor</title><link>https://heyvaldemar.com/infosys-devin-ai-devops-legacy/</link><guid isPermaLink="true">https://heyvaldemar.com/infosys-devin-ai-devops-legacy/</guid><description>Infosys deployed Devin AI globally. If you compete on technical execution as a DevOps engineer, you&apos;re now Legacy Labor — the blueprint to survive.</description><pubDate>Wed, 04 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Infosys is a $100 billion systems integrator. It serves Fortune 500 clients. And it just announced the global deployment of Devin AI across its entire delivery organization.&lt;/p&gt;
&lt;p&gt;Not a proof-of-concept.&lt;br&gt;
Not a limited trial.&lt;br&gt;
&lt;strong&gt;Global. Standard. Deployed.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The decision followed a six-month pilot that, in their words, showed &quot;significant gains in engineering efficiency and quality.&quot; On that basis Infosys embedded Devin into its delivery models and customer environments worldwide. Cognition Labs, the company behind Devin, says the agent is already running inside engineering teams at thousands of companies. They&apos;ve also just shipped a faster, more capable version tuned specifically on junior developer benchmarks.&lt;/p&gt;
&lt;p&gt;Maybe your pitch is &quot;I execute technical tasks efficiently.&quot; If you&apos;re a DevOps engineer, a platform engineer, a cloud architect, that announcement should land like the ground shifting under you. Because it is.&lt;/p&gt;
&lt;p&gt;import VideoPlayer from &quot;@components/VideoPlayer.astro&quot;;&lt;/p&gt;
&lt;p&gt;&amp;lt;VideoPlayer
videoId=&quot;NEKCDAz2-1A&quot;
title=&quot;Infosys Deploys Devin AI Globally — And Your DevOps Career Just Became Legacy Labor&quot;
/&amp;gt;&lt;/p&gt;
&lt;h2&gt;What Infosys Just Told the Market&lt;/h2&gt;
&lt;p&gt;Read the move plainly. Here is what it says.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Infosys operates at scale.&lt;/strong&gt;&lt;br&gt;
They run infrastructure, platform engineering, and application delivery for some of the largest enterprises alive. When a company that big standardizes an AI agent across its global delivery pipeline, that&apos;s not a speculative bet. It&apos;s a calculated business call backed by proven ROI.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The six-month trial delivered.&lt;/strong&gt;&lt;br&gt;
Efficiency went up. Quality went up. Cycles got faster and labor got cheaper. None of that is hypothetical. Those are measured outcomes, and they were enough to justify adoption across the whole company.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Devin is now sitting in client environments.&lt;/strong&gt;&lt;br&gt;
This is not an internal toy. Infosys is putting Devin into customer engagements. Which means enterprises now &lt;strong&gt;expect&lt;/strong&gt; AI-augmented delivery as the floor. Human engineers become the exception, not the default.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cognition Labs is scaling hard.&lt;/strong&gt;&lt;br&gt;
Thousands of companies already run Devin. The new agent is faster and tuned for junior-level work, which is exactly the work entry and mid-level engineers do all day.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So the message is not subtle. &lt;strong&gt;If your job is to execute technical tasks, your competition is an AI agent that works around the clock, never negotiates salary, and gets better every quarter.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;The Two Traps Most Engineers Will Fall Into&lt;/h2&gt;
&lt;p&gt;Hit with this news, most engineers pick one of two reactions. Both are traps.&lt;/p&gt;
&lt;h3&gt;Trap 1: &quot;AI Can&apos;t Replace Me&quot;&lt;/h3&gt;
&lt;p&gt;The first one is denial wearing the costume of domain expertise.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Devin doesn&apos;t understand business context.&quot;&lt;br&gt;
&quot;AI can&apos;t handle legacy systems.&quot;&lt;br&gt;
&quot;I know the client. I understand the nuances.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Every one of those is true. And none of it matters.&lt;/p&gt;
&lt;p&gt;Because the question was never &quot;Can Devin do &lt;strong&gt;your exact job&lt;/strong&gt; today?&quot;&lt;br&gt;
The question is this. &lt;strong&gt;Can Devin do 80% of your job at 10% of the cost?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Infosys just answered it. Yes.&lt;/p&gt;
&lt;p&gt;So if your pitch is &quot;I execute technical tasks with domain context,&quot; you aren&apos;t safe from automation. You&apos;re &lt;strong&gt;expensive&lt;/strong&gt; automation. And in enterprise procurement, expensive automation is the first thing on the chopping block.&lt;/p&gt;
&lt;h3&gt;Trap 2: &quot;I&apos;ll Just Become an AI Engineer&quot;&lt;/h3&gt;
&lt;p&gt;The second reaction is lateral panic.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;I&apos;ll learn prompt engineering.&quot;&lt;br&gt;
&quot;I&apos;ll pivot to AI/ML.&quot;&lt;br&gt;
&quot;I&apos;ll become an AI engineer.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sounds logical. It&apos;s a move &lt;strong&gt;into&lt;/strong&gt; commoditization, not out of it.&lt;/p&gt;
&lt;p&gt;AI engineering is already crowded. Thousands of mid-level engineers are running the same play this quarter. The market is full of &quot;AI-augmented DevOps engineers&quot; who can wire up LangChain and fine-tune a model.&lt;/p&gt;
&lt;p&gt;That&apos;s not escaping the race to the bottom. That&apos;s changing lanes inside it.&lt;/p&gt;
&lt;h2&gt;The Only Path Forward: Stop Competing on Execution&lt;/h2&gt;
&lt;p&gt;Here&apos;s the part most engineers won&apos;t sit with.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Build your career on technical execution and you&apos;re now in a war of attrition against AI agents.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The engineers who survive the Devin Age, and the ones who actually thrive, share one thing. They &lt;strong&gt;own the decision, not the execution.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I call that the &lt;strong&gt;Solutions Architect Class.&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;What Does a Solutions Architect Do?&lt;/h3&gt;
&lt;p&gt;A Solutions Architect doesn&apos;t write Terraform. They write &lt;strong&gt;the architectural mandate&lt;/strong&gt; Devin executes.&lt;/p&gt;
&lt;p&gt;They don&apos;t configure Kubernetes. They hand down &lt;strong&gt;the Verdict&lt;/strong&gt; on whether Kubernetes is even the right answer for the client&apos;s business problem in the first place.&lt;/p&gt;
&lt;p&gt;They don&apos;t race the AI. They &lt;strong&gt;point it.&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;The Difference Between Labor and Leadership&lt;/h3&gt;
&lt;p&gt;Infosys deploying Devin is not a tragedy. It&apos;s a &lt;strong&gt;filter.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It filters out everyone who thought &quot;knowing Docker&quot; was a career. It filters out everyone who thought &quot;being technical&quot; was the whole job. What&apos;s left is the line between &lt;strong&gt;labor&lt;/strong&gt; and &lt;strong&gt;leadership.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Labor is replaceable. Leadership is rare.&lt;/p&gt;
&lt;p&gt;Labor executes tasks. Leadership delivers verdicts.&lt;/p&gt;
&lt;p&gt;Labor fights on speed and cost. Leadership wins on &lt;strong&gt;strategic value.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;How to Transition to the Solutions Architect Class&lt;/h2&gt;
&lt;p&gt;If you&apos;re a junior or mid-level engineer right now, two doors are open.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Option One:&lt;/strong&gt;&lt;br&gt;
Compete with Devin on execution. Race to the bottom. Chase $40/hour contracts because &quot;AI can&apos;t do &lt;strong&gt;everything&lt;/strong&gt; yet.&quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Option Two:&lt;/strong&gt;&lt;br&gt;
Become the architect. Learn to diagnose business pain, design systems at the &lt;strong&gt;business layer&lt;/strong&gt;, and treat Devin as your junior engineer.&lt;/p&gt;
&lt;p&gt;Option Two needs a blueprint. Most engineers don&apos;t have one.&lt;/p&gt;
&lt;p&gt;The path starts with learning to &lt;strong&gt;think like a Solutions Architect.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Which means learning how to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Architect solutions at the &lt;strong&gt;business layer&lt;/strong&gt;, where Devin has no access.&lt;/li&gt;
&lt;li&gt;Position yourself as &lt;strong&gt;the Verdict&lt;/strong&gt;, not the executor.&lt;/li&gt;
&lt;li&gt;Deliver architecture decisions that pull in inbound offers instead of you firing off outbound applications.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The Market Has Spoken&lt;/h2&gt;
&lt;p&gt;Infosys just showed you the future.&lt;/p&gt;
&lt;p&gt;Devin is here. It&apos;s deployed. It&apos;s scaling.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So the question is simple.&lt;/strong&gt;&lt;br&gt;
Are you labor, or are you leadership?&lt;/p&gt;
&lt;p&gt;Keep competing on execution and you&apos;re already obsolete. Decide to &lt;strong&gt;become the architect&lt;/strong&gt; and the opening in front of you is unlike anything before it.&lt;/p&gt;
&lt;p&gt;The Blueprint is waiting.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Opinion &amp; Culture</category><category>AI</category><category>DevOps</category><category>Platform Engineering</category><category>Culture</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>The End of the Executor — Why Computer Vision Engineers Are Becoming Optional</title><link>https://heyvaldemar.com/end-of-executor-dragonfly-ai/</link><guid isPermaLink="true">https://heyvaldemar.com/end-of-executor-dragonfly-ai/</guid><description>Anisoptera&apos;s Dragonfly platform proved specialized CV engineers are replaceable. The math ($150k vs $5k) and the blueprint to survive the shift.</description><pubDate>Tue, 27 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;The Signal Nobody Wants to Talk About&lt;/h2&gt;
&lt;p&gt;At CES 2026, a company called Anisoptera launched &lt;strong&gt;Dragonfly&lt;/strong&gt;—a no-code platform for building production-grade computer vision applications.
It won a CES Picks Award. It&apos;s enterprise-ready. And it markets itself, in plain language, as the fix for &lt;em&gt;&quot;the bottleneck of scarce AI talent.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In other words: You are the bottleneck. And they built a product to remove you.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So if you build computer vision systems, run MLOps, or wire up edge AI infrastructure, read this as a warning. Dragonfly itself isn&apos;t special. What it shows is the part that should worry you: a quiet trend just went public. &lt;strong&gt;Specialized engineering roles are being turned into products.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In the breakdown above, I go through the platform, the pricing, and why your career is sitting inside the blast radius right now.&lt;/p&gt;
&lt;p&gt;import VideoPlayer from &quot;@components/VideoPlayer.astro&quot;;&lt;/p&gt;
&lt;p&gt;&amp;lt;VideoPlayer
videoId=&quot;-nAE9bMS2oc&quot;
title=&quot;The End of the Executor - Why Computer Vision Engineers Are Becoming Optional&quot;
/&amp;gt;&lt;/p&gt;
&lt;h2&gt;What Dragonfly Actually Is&lt;/h2&gt;
&lt;p&gt;Dragonfly is a full-stack, no-code platform. Here is what separates it from the usual &quot;low-code&quot; vaporware:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Hardware + Software Subscription:&lt;/strong&gt; You don&apos;t need cloud infrastructure. You don&apos;t need Kubernetes. Dragonfly runs on-premise, at the edge, on their hardware. It is a turnkey solution.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Designed for Non-Technical Users:&lt;/strong&gt; The target user is &lt;em&gt;not&lt;/em&gt; a data scientist. It is a line-of-business manager—someone in logistics or retail who has a problem but no ML team.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Explicit About Replacing Talent:&lt;/strong&gt; The press release doesn&apos;t hide the intent. It frames &quot;scarce AI talent&quot; as the constraint. Translation: &lt;em&gt;You are expensive, slow, and hard to manage. We are designing you out.&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is not a tool for engineers. It is a replacement for them.&lt;/p&gt;
&lt;h2&gt;Why This Is a Threat (Even If You Don&apos;t Work in CV)&lt;/h2&gt;
&lt;p&gt;Backend engineer? NLP engineer? You might figure none of this touches you. &lt;strong&gt;You would be wrong.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Dragonfly is a signal. It proves you can take a deeply specialized discipline, the kind that used to demand a PhD, and ship it as a subscription.
If they pulled that off for computer vision, the same thing is coming for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;NLP:&lt;/strong&gt; GPT wrappers are already replacing custom model training.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data Pipelines:&lt;/strong&gt; Tools like Fivetran are killing the &quot;ETL Engineer&quot; role.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Infrastructure:&lt;/strong&gt; Platform engineering is being abstracted by AI agents.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The pattern is clear. &lt;strong&gt;Execution-level skills are being automated. Architectural skills are not.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So ask yourself the obvious question. &lt;em&gt;Are you an executor, or are you an architect?&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;The Executor vs. Architect Divide&lt;/h2&gt;
&lt;p&gt;Let me define the terms.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Executors&lt;/strong&gt; are engineers whose job is to implement solutions. They:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Write the code&lt;/li&gt;
&lt;li&gt;Tune the model&lt;/li&gt;
&lt;li&gt;Deploy the container&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Architects&lt;/strong&gt; are engineers whose job is to design systems. They:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Evaluate build-vs-buy tradeoffs&lt;/li&gt;
&lt;li&gt;Design hybrid architectures&lt;/li&gt;
&lt;li&gt;Negotiate vendor contracts&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Here is the brutal truth.&lt;/strong&gt; Executors are in the blast radius. Architects are not.
Dragonfly doesn&apos;t replace the person who &lt;em&gt;decides&lt;/em&gt; whether to use Dragonfly. It replaces the person who would have built the vision system by hand.&lt;/p&gt;
&lt;h2&gt;What To Do About It (The Solutions Architect Framework)&lt;/h2&gt;
&lt;p&gt;Feeling uncomfortable? Good. It means you&apos;re paying attention.
Here is the framework.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Stop Learning Tools. Start Learning Systems.&lt;/strong&gt;
Drop the certification chase. YOLO, PyTorch, all of it. Those are execution skills.
Learn to evaluate vendor platforms instead. Learn to calculate TCO (Total Cost of Ownership). Learn to design hybrid systems. That work takes judgment, not syntax.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Learn to Speak Business.&lt;/strong&gt;
Dragonfly gets sold to managers because it talks in their terms: ROI and Time-to-Deployment.
Can&apos;t explain why your custom Python script beats a $5k/month tool in terms of &lt;em&gt;business risk&lt;/em&gt;? Then you lose.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Become a Solutions Architect.&lt;/strong&gt;
A Solutions Architect doesn&apos;t write code. They deliver verdicts.
They weigh the options (Dragonfly vs. Custom), design the architecture, and make the final call. The role is AI-proof for one reason. It carries &lt;strong&gt;accountability&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;The Verdict&lt;/h2&gt;
&lt;p&gt;Dragonfly is not the problem. It is the signal.
The engineers who survive are the ones who move up the stack, from execution to architecture.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The full tactical breakdown is in the video above.&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Opinion &amp; Culture</category><category>AI</category><category>MLOps</category><category>Platform Engineering</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>AI Didn&apos;t Fix Productivity. Measurement Did.</title><link>https://heyvaldemar.com/ai-productivity-measurement/</link><guid isPermaLink="true">https://heyvaldemar.com/ai-productivity-measurement/</guid><description>AI adoption is easy. Proving productivity isn&apos;t. A Docker Captain&apos;s view on why AI impact is hard to measure—and how teams can finally prove real value.</description><pubDate>Fri, 12 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Something strange is going on in software engineering right now.&lt;/p&gt;
&lt;p&gt;The 2025 Stack Overflow Developer Survey says &lt;strong&gt;84% of developers already use—or plan to use—AI tools&lt;/strong&gt;. More than half reach for them every day. So adoption isn&apos;t the bottleneck. AI showed up everywhere, and it showed up fast.&lt;/p&gt;
&lt;p&gt;But talk to engineering leaders and you hear the same line over and over:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“We&apos;re paying for AI tools… but we can&apos;t prove they&apos;re making us more productive.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That distance between &lt;strong&gt;usage&lt;/strong&gt; and &lt;strong&gt;evidence&lt;/strong&gt; is what I call the &lt;em&gt;AI productivity paradox&lt;/em&gt;.
Buying AI is easy. &lt;strong&gt;Proving impact is hard.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Why AI Productivity Is So Hard to Measure&lt;/h2&gt;
&lt;p&gt;Almost none of our engineering metrics were built for this.&lt;/p&gt;
&lt;p&gt;Take DORA. It can show you that deployment frequency moved. It can&apos;t tell you &lt;em&gt;why&lt;/em&gt; it moved. Pull request volume goes up, fine. Is that real productivity? Or is it AI spitting out code that someone now has to review?&lt;/p&gt;
&lt;p&gt;The way AI bends a workflow is rarely obvious. It speeds you up in one place and quietly piles on technical debt, duplicated code, or extra cognitive load somewhere else. With no instrumentation, leaders are guessing. Guessing costs money.&lt;/p&gt;
&lt;p&gt;That&apos;s where the pressure builds. The CFO wants ROI. The CTO has standardization calls to make. And the data you&apos;d need to answer any of it is scattered across git logs, surveys, dashboards, and somebody&apos;s hallway anecdote.&lt;/p&gt;
&lt;h2&gt;Why GitKraken Is in a Unique Position Here&lt;/h2&gt;
&lt;p&gt;Developer productivity isn&apos;t only a data problem.
It&apos;s a &lt;strong&gt;trust problem&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;GitKraken has spent over a decade building tools developers actually choose to use. That counts for more than most leaders think. When developers don&apos;t trust the thing measuring them, every number it produces is worthless.&lt;/p&gt;
&lt;p&gt;Their AI features already prove the point. Intelligent merge conflict resolution. AI-generated commit messages. Across real teams, those have saved &lt;strong&gt;tens of thousands of hours&lt;/strong&gt;. And the number isn&apos;t the headline. The headline is that the impact got &lt;strong&gt;measured&lt;/strong&gt; instead of assumed.&lt;/p&gt;
&lt;p&gt;That&apos;s the idea behind &lt;strong&gt;GitKraken Insights&lt;/strong&gt;: engineering intelligence built to see how AI &lt;em&gt;actually&lt;/em&gt; lands on productivity, quality, and developer experience. No surveillance theater attached.&lt;/p&gt;
&lt;h2&gt;What Makes GitKraken Insights Different&lt;/h2&gt;
&lt;p&gt;GitKraken Insights pulls together signals that normally sit in separate silos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Delivery and DORA performance&lt;/li&gt;
&lt;li&gt;Code quality and technical debt trends&lt;/li&gt;
&lt;li&gt;AI-assisted workflow impact&lt;/li&gt;
&lt;li&gt;Developer experience indicators&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The real differentiator is &lt;strong&gt;context&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Pair the workflow data with &lt;strong&gt;Voice of the Developer&lt;/strong&gt; feedback and leaders finally get the &lt;em&gt;why&lt;/em&gt; behind a moving metric, not just the &lt;em&gt;that&lt;/em&gt;. Dashboards tell you something changed. This tells you what to do about it.&lt;/p&gt;
&lt;p&gt;Under the hood it runs on GitClear&apos;s engineering analytics technology, with GitKraken&apos;s obsession over developer experience layered on top. That pairing is rare. Serious analytics, and it doesn&apos;t alienate the people being measured.&lt;/p&gt;
&lt;h2&gt;Measuring Teams, Not Individuals&lt;/h2&gt;
&lt;p&gt;Here&apos;s a lesson the industry keeps having to relearn the painful way:
&lt;strong&gt;Measure productivity wrong and you torch trust.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So GitKraken Insights looks at &lt;strong&gt;teams and systems&lt;/strong&gt; on purpose. Not individuals. The point was never to police performance. It&apos;s to surface the bottlenecks and friction and structural drag that slow a team down.&lt;/p&gt;
&lt;p&gt;Trust the system and people engage with it. They hand over honest feedback. They actually want leaders to see the data, because it drives better decisions and not finger-pointing.&lt;/p&gt;
&lt;p&gt;That&apos;s the moment metrics start working &lt;em&gt;with&lt;/em&gt; a team instead of against it.&lt;/p&gt;
&lt;h2&gt;Enterprise Intelligence Without Enterprise Friction&lt;/h2&gt;
&lt;p&gt;For years, software engineering intelligence lived behind six-figure contracts and rollouts that dragged on for months. That model leaves most teams out. It&apos;s also just dated.&lt;/p&gt;
&lt;p&gt;GitKraken Insights ships enterprise-grade intelligence for a fraction of the price, with setup measured in minutes, not quarters. You get value early. No giant integration project, no process overhaul.&lt;/p&gt;
&lt;p&gt;If your team is running on gut feel or some brittle custom dashboard, this is a structural upgrade. Not another tool to babysit.&lt;/p&gt;
&lt;h2&gt;A Practical View on AI&lt;/h2&gt;
&lt;p&gt;The thing I respect about GitKraken&apos;s approach is what it refuses to promise.&lt;/p&gt;
&lt;p&gt;AI doesn&apos;t get pitched here as a replacement for developers. Nobody is selling magic productivity multipliers.&lt;/p&gt;
&lt;p&gt;The focus is &lt;strong&gt;practical effectiveness&lt;/strong&gt;. Help leaders work out whether their AI tools are delivering actual value or just adding noise.&lt;/p&gt;
&lt;p&gt;That&apos;s exactly the mindset engineering leadership needs right now.&lt;/p&gt;
&lt;h2&gt;Looking Ahead&lt;/h2&gt;
&lt;p&gt;The AI productivity paradox isn&apos;t going anywhere. The more tools flood the market, the harder you&apos;ll have to justify the spend.&lt;/p&gt;
&lt;p&gt;Teams that can measure the impact, read the context, and keep developer trust intact will move faster. And they&apos;ll make fewer mistakes doing it.&lt;/p&gt;
&lt;p&gt;GitKraken Insights gives that future a solid base.
Not by guessing.
By seeing the whole system clearly.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Opinion &amp; Culture</category><category>GitKraken</category><category>Git</category><category>AI</category><category>DevOps</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Inside the Builders Era — How Developers Stay in Control of AI with GitKraken as the Core Tool</title><link>https://heyvaldemar.com/builders-era-developers-control-ai-with-gitkraken/</link><guid isPermaLink="true">https://heyvaldemar.com/builders-era-developers-control-ai-with-gitkraken/</guid><description>How developers stay in control of AI in the Builders Era — using expert supervision, clean Git workflows, and GitKraken to keep speed, quality, and reliability.</description><pubDate>Tue, 02 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;For two years the industry has chewed on one useless question:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Will AI replace developers?”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Wrong question. The one that actually sorts professionals from tourists is sharper:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“How do developers stay in control while AI becomes part of every workflow?”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Welcome to &lt;strong&gt;The Builders Era&lt;/strong&gt;.
Not the “AI replaces everyone” fantasy.
Not the “prompt your way to production” hype.&lt;/p&gt;
&lt;p&gt;The Builders Era is the moment where:&lt;/p&gt;
&lt;p&gt;✔ &lt;strong&gt;Software craftsmanship&lt;/strong&gt;&lt;br&gt;
meets&lt;br&gt;
✔ &lt;strong&gt;AI-augmented velocity&lt;/strong&gt;&lt;br&gt;
under&lt;br&gt;
✔ &lt;strong&gt;developer supervision and rigorous Git workflows.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You don&apos;t hand engineering over to AI. You &lt;strong&gt;own it&lt;/strong&gt;, &lt;em&gt;supervise it&lt;/em&gt;, and &lt;em&gt;scale it&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The toolchain that wins here is the one that hands developers something concrete:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;visibility&lt;/em&gt; → &lt;em&gt;control&lt;/em&gt; → &lt;em&gt;reliability&lt;/em&gt; → &lt;em&gt;craft excellence&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Which is why &lt;a href=&quot;https://www.gitkraken.com/&quot;&gt;GitKraken&lt;/a&gt; sits at the center of the new engineering stack.&lt;/p&gt;
&lt;h2&gt;The AI hype cycle completely missed the point&lt;/h2&gt;
&lt;p&gt;For a solid year, every panel and article and self-appointed thought leader shouted the same nonsense:&lt;/p&gt;
&lt;p&gt;🗣 “AI will write all your code!”&lt;br&gt;
🗣 “Developers become prompt engineers!”&lt;br&gt;
🗣 “No more PR reviews!”&lt;br&gt;
🗣 “Ship faster with AI!”&lt;/p&gt;
&lt;p&gt;Then real developers pointed AI at real codebases.&lt;/p&gt;
&lt;h3&gt;Reality check from 2025:&lt;/h3&gt;
&lt;p&gt;✅ AI writes boilerplate fast&lt;br&gt;
❌ AI struggles with architecture&lt;br&gt;
❌ AI struggles with context&lt;br&gt;
❌ AI generates subtle bugs that take &lt;strong&gt;longer to debug&lt;/strong&gt;&lt;br&gt;
❌ AI cannot see long-term maintainability&lt;br&gt;
❌ AI doesn&apos;t understand team conventions&lt;br&gt;
❌ AI causes Git chaos if commits aren&apos;t supervised&lt;/p&gt;
&lt;p&gt;Engineering leaders figured out something that took a while to sink in:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;AI didn&apos;t reduce the need for developer expertise.
It multiplied it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Teams don&apos;t need “AI at all costs.” They need &lt;strong&gt;supervised AI&lt;/strong&gt;. Workflows where humans and tools like GitKraken make AI reliable.&lt;/p&gt;
&lt;h2&gt;What expert supervision actually means (from a real developer&apos;s POV)&lt;/h2&gt;
&lt;p&gt;Supervision is not babysitting every token AI spits out. It means this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Human judgment at the right moments, enforced through the right tools.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here&apos;s what that looks like in practice.&lt;/p&gt;
&lt;h3&gt;Before generation:&lt;/h3&gt;
&lt;p&gt;Developers provide:&lt;/p&gt;
&lt;p&gt;✔ architectural constraints&lt;br&gt;
✔ examples of good patterns&lt;br&gt;
✔ security guidelines&lt;br&gt;
✔ framework conventions&lt;br&gt;
✔ code style requirements&lt;/p&gt;
&lt;h3&gt;During generation:&lt;/h3&gt;
&lt;p&gt;There must be instant visibility into:&lt;/p&gt;
&lt;p&gt;✔ structural inconsistencies&lt;br&gt;
✔ style violations&lt;br&gt;
✔ dependency mismatches&lt;br&gt;
✔ patterns AI forgot&lt;br&gt;
✔ obvious red flags&lt;/p&gt;
&lt;h3&gt;After generation:&lt;/h3&gt;
&lt;p&gt;We run:&lt;/p&gt;
&lt;p&gt;✔ rigorous PR review&lt;br&gt;
✔ Git diff analysis&lt;br&gt;
✔ commit message validation&lt;br&gt;
✔ security scans&lt;br&gt;
✔ automated tests&lt;/p&gt;
&lt;p&gt;This is where GitKraken becomes the developer&apos;s &lt;strong&gt;vision panel&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;AI generates 20 files in one go. GitKraken&apos;s &lt;strong&gt;visual diff&lt;/strong&gt;, &lt;strong&gt;change graphs&lt;/strong&gt;, and &lt;strong&gt;context-aware commit history&lt;/strong&gt; catch errors that slip straight past a CLI-only review.&lt;/p&gt;
&lt;p&gt;That&apos;s supervision. The real thing, not the slide-deck version.&lt;/p&gt;
&lt;h2&gt;Why GitKraken is becoming the core tool of The Builders Era&lt;/h2&gt;
&lt;p&gt;GitKraken was always good. In 2025 it became essential.&lt;/p&gt;
&lt;p&gt;Here&apos;s why.&lt;/p&gt;
&lt;h3&gt;AI generates code fast: GitKraken helps you understand that code fast&lt;/h3&gt;
&lt;p&gt;AI can produce 5 files in 2 seconds. No human reviews those through raw CLI diffs.&lt;/p&gt;
&lt;p&gt;GitKraken gives developers:&lt;/p&gt;
&lt;p&gt;🟣 &lt;strong&gt;Clean visual diffs&lt;/strong&gt;&lt;br&gt;
🟣 &lt;strong&gt;Side-by-side changes&lt;/strong&gt;&lt;br&gt;
🟣 &lt;strong&gt;Commit graph clarity&lt;/strong&gt;&lt;br&gt;
🟣 &lt;strong&gt;Branch lineage visibility&lt;/strong&gt;&lt;br&gt;
🟣 &lt;strong&gt;Multi-file PR inspection&lt;/strong&gt;&lt;br&gt;
🟣 &lt;strong&gt;Precise conflict resolution tools&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;AI accelerates creation. GitKraken accelerates comprehension. You need both moving at the same speed.&lt;/p&gt;
&lt;h3&gt;GitKraken protects codebases from AI-introduced chaos&lt;/h3&gt;
&lt;p&gt;AI often:&lt;/p&gt;
&lt;p&gt;❌ adds unused imports&lt;br&gt;
❌ updates only half of a pattern&lt;br&gt;
❌ forgets to remove old logic&lt;br&gt;
❌ introduces shadowed variables&lt;br&gt;
❌ changes logic accidentally&lt;br&gt;
❌ generates “almost correct” code that breaks in edge cases&lt;/p&gt;
&lt;p&gt;GitKraken lets developers &lt;strong&gt;see the entire change set as a living system&lt;/strong&gt;, not a pile of diffs.&lt;/p&gt;
&lt;p&gt;That alone kills dozens of bugs per sprint.&lt;/p&gt;
&lt;h3&gt;GitKraken enforces craftsmanship&lt;/h3&gt;
&lt;p&gt;Developers with real craft write good code. They also write a good commit history.&lt;/p&gt;
&lt;p&gt;GitKraken helps enforce:&lt;/p&gt;
&lt;p&gt;✔ atomic commits&lt;br&gt;
✔ clean commit messages&lt;br&gt;
✔ readable patches&lt;br&gt;
✔ consistent branching&lt;br&gt;
✔ controlled merges&lt;br&gt;
✔ conflict-free rebases&lt;/p&gt;
&lt;p&gt;Your repo turns into a story instead of a battlefield.&lt;/p&gt;
&lt;h2&gt;Real 2025 use cases: AI plus GitKraken in the wild&lt;/h2&gt;
&lt;p&gt;This is where it gets concrete.&lt;/p&gt;
&lt;p&gt;What follows is what actually happens inside production teams in 2025.&lt;/p&gt;
&lt;h3&gt;Case A: AI refactors your service layer&lt;/h3&gt;
&lt;p&gt;AI modifies 17 files. One wrong import breaks production.&lt;/p&gt;
&lt;p&gt;GitKraken&apos;s commit graph lets you track &lt;em&gt;exactly&lt;/em&gt; where the mistake got introduced, then revert it &lt;strong&gt;in seconds&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;Case B: AI wrote tests, but they don&apos;t match team conventions&lt;/h3&gt;
&lt;p&gt;You could dig through 12 PR files. Or you let GitKraken show you:&lt;/p&gt;
&lt;p&gt;✔ mismatched naming&lt;br&gt;
✔ incorrect mock patterns&lt;br&gt;
✔ wrong folder structure&lt;/p&gt;
&lt;p&gt;Fix it all in one place.&lt;/p&gt;
&lt;h3&gt;Case C: AI generates duplicate logic hidden in multiple diffs&lt;/h3&gt;
&lt;p&gt;A CLI diff won&apos;t show you the big picture. GitKraken will.&lt;/p&gt;
&lt;h3&gt;Case D: Junior dev + AI = silent technical debt&lt;/h3&gt;
&lt;p&gt;With GitKraken:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;maintainers catch patterns early&lt;/li&gt;
&lt;li&gt;bad architectural paths are visible&lt;/li&gt;
&lt;li&gt;teaching moments become obvious&lt;/li&gt;
&lt;li&gt;code quality rises &lt;em&gt;because visibility rises&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Case E: AI-generated merge conflicts&lt;/h3&gt;
&lt;p&gt;GitKraken&apos;s conflict resolution UI is basically a cheat code. No more guessing which version is correct, because all the context is right there.&lt;/p&gt;
&lt;h2&gt;The Builders Era: craft plus AI plus tools that respect the developer&lt;/h2&gt;
&lt;p&gt;Let&apos;s be honest about it.&lt;/p&gt;
&lt;p&gt;The fundamentals that mattered in 2015
still matter in 2025:&lt;/p&gt;
&lt;p&gt;✔ clean diffs&lt;br&gt;
✔ meaningful PRs&lt;br&gt;
✔ readable commits&lt;br&gt;
✔ thoughtful reviews&lt;br&gt;
✔ stable branches&lt;br&gt;
✔ reliable CI&lt;br&gt;
✔ predictable delivery&lt;br&gt;
✔ maintainable architecture&lt;/p&gt;
&lt;p&gt;AI didn&apos;t replace these principles.&lt;/p&gt;
&lt;p&gt;It made them &lt;strong&gt;twice as important&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The Builders Era belongs to developers who:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;stay in control&lt;/li&gt;
&lt;li&gt;supervise AI output&lt;/li&gt;
&lt;li&gt;use tools that make code quality visible&lt;/li&gt;
&lt;li&gt;treat the repo as a product&lt;/li&gt;
&lt;li&gt;understand that speed without accuracy = chaos&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So &lt;strong&gt;GitKraken is not “nice to have.”&lt;/strong&gt; It&apos;s part of the &lt;em&gt;new engineering foundation&lt;/em&gt;.&lt;/p&gt;
&lt;h2&gt;What GitKon 2025 is really about (not the marketing version)&lt;/h2&gt;
&lt;p&gt;GitKon 2025 goes after the only problem worth solving:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;How do we scale expert supervision of AI across teams, codebases, and workflows?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Day 1: For Builders (the ICs)&lt;/h3&gt;
&lt;p&gt;Real workflows:&lt;/p&gt;
&lt;p&gt;✔ PR velocity&lt;br&gt;
✔ cleaner diffs&lt;br&gt;
✔ conflict debugging&lt;br&gt;
✔ reducing Git latency&lt;br&gt;
✔ catching AI mistakes early&lt;br&gt;
✔ sane merge strategies&lt;br&gt;
✔ faster refactors&lt;br&gt;
✔ VS Code + Cursor + GitKraken power combos&lt;/p&gt;
&lt;h3&gt;Day 2: For Engineering Leaders&lt;/h3&gt;
&lt;p&gt;Impact frameworks:&lt;/p&gt;
&lt;p&gt;✔ AI velocity metrics&lt;br&gt;
✔ quality scorecards&lt;br&gt;
✔ rollout playbooks&lt;br&gt;
✔ governance models&lt;br&gt;
✔ debiasing workflows&lt;br&gt;
✔ adoption strategies&lt;br&gt;
✔ measurement methodology&lt;/p&gt;
&lt;p&gt;GitKon is not hype. It&apos;s a blueprint for the new era of engineering.&lt;/p&gt;
&lt;p&gt;And yes, it&apos;s &lt;strong&gt;100% free&lt;/strong&gt;, because GitKraken wants developers to win.&lt;/p&gt;
&lt;h2&gt;Final thoughts: the future belongs to developers who stay in control&lt;/h2&gt;
&lt;p&gt;AI is not replacing developers. Bad workflows are.&lt;/p&gt;
&lt;p&gt;The Builders Era demands:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;clear thinking&lt;/li&gt;
&lt;li&gt;strong craft&lt;/li&gt;
&lt;li&gt;tools that amplify expertise&lt;/li&gt;
&lt;li&gt;systems that make AI reliable&lt;/li&gt;
&lt;li&gt;visibility over automation&lt;/li&gt;
&lt;li&gt;quality over speed&lt;/li&gt;
&lt;li&gt;control over chaos&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The developers who thrive will be the ones who:&lt;/p&gt;
&lt;p&gt;✔ Use AI as a fast, junior pair.&lt;br&gt;
✔ Use GitKraken as their visibility engine.&lt;br&gt;
✔ Build workflows where humans supervise what matters.&lt;br&gt;
✔ Stay in control of their craft — and their codebase.&lt;/p&gt;
&lt;p&gt;GitKon 2025 will show exactly how to do it.&lt;/p&gt;
&lt;h2&gt;GitKraken Ambassador Note&lt;/h2&gt;
&lt;p&gt;As a &lt;a href=&quot;https://www.gitkraken.com/meet-the-gitkraken-ambassadors&quot;&gt;GitKraken Ambassador&lt;/a&gt;, I watch this play out every day:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When teams adopt GitKraken, AI stops being a liability and becomes a multiplier.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That&apos;s the Builders Era.&lt;/p&gt;
&lt;p&gt;And it&apos;s only just beginning.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Opinion &amp; Culture</category><category>GitKraken</category><category>Git</category><category>AI</category><category>Productivity</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Platform Engineering — The Complete, Practical Guide to Building Internal Developer Platforms That Scale</title><link>https://heyvaldemar.com/platform-engineering-internal-developer-platforms-complete-guide/</link><guid isPermaLink="true">https://heyvaldemar.com/platform-engineering-internal-developer-platforms-complete-guide/</guid><description>A practical guide to Platform Engineering — build internal developer platforms, golden paths, GitOps workflows, and scalable cloud foundations.</description><pubDate>Thu, 27 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Platform Engineering is what happens when DevOps grows up and you stop relying on hero engineers and lucky deployments.
You build an internal product, a platform, that gives developers a paved, predictable way to build, ship, and operate software.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here&apos;s what this guide covers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DevOps vs Platform Engineering.&lt;/strong&gt; Why they&apos;re not competitors, and how platform engineering is the natural evolution of mature DevOps.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The 5-layer architecture of a real platform.&lt;/strong&gt; From infra foundation and GitOps control plane to developer experience, observability, and governance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Golden Paths.&lt;/strong&gt; How to give teams a frictionless, opinionated way to create and run services. This is the thing that cuts delivery time by 3–7x.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The tooling reality.&lt;/strong&gt; Kubernetes, Terraform, Crossplane, Argo CD, Backstage, Vault and where they actually fit, no vendor unicorns.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Failure patterns.&lt;/strong&gt; The classic mistakes that quietly kill 90% of internal platforms before they get real adoption.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A 90-day practical roadmap.&lt;/strong&gt; How I&apos;d build your first working platform: one golden path, GitOps everywhere, then a clean developer interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If your uptime, deploys, and roadmap still depend on a few heroic people, you don&apos;t need more scripts. You need a platform.&lt;/p&gt;
&lt;h2&gt;Introduction: The Real Reason Companies Turn to Platform Engineering&lt;/h2&gt;
&lt;p&gt;I&apos;ve visited a lot of companies over the years. Small teams, giant enterprises, scrappy startups, Fortune 100s.
Completely different people, industries, cultures, tech stacks.&lt;/p&gt;
&lt;p&gt;But the story is always the same.&lt;/p&gt;
&lt;p&gt;At first, everything moves quickly.
A new service takes a day.
Deployment is a simple bash script.
Everyone knows where config files live, even if nobody knows &lt;em&gt;why&lt;/em&gt; they live there.&lt;/p&gt;
&lt;p&gt;And then the company grows.&lt;/p&gt;
&lt;p&gt;More teams.
More services.
More requirements.
More complexity.&lt;/p&gt;
&lt;p&gt;Suddenly the elegant little system you built in the beginning becomes a maze of scripts, CI pipelines, scattered configs, and tribal knowledge.&lt;/p&gt;
&lt;p&gt;You start hearing things like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&quot;Prod behaves differently, we&apos;re not sure why.&quot;&lt;/li&gt;
&lt;li&gt;&quot;Ask Michael, he&apos;s the only one who knows how to deploy this service.&quot;&lt;/li&gt;
&lt;li&gt;&quot;We can&apos;t upgrade that component, it breaks staging.&quot;&lt;/li&gt;
&lt;li&gt;&quot;We&apos;ll fix this part after the release… or the next release.&quot;&lt;/li&gt;
&lt;li&gt;&quot;We need DevOps to press the magic button.&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If your uptime depends on courage, experience, and availability of specific people, you don&apos;t have a system. You have &lt;strong&gt;hero-driven engineering&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;And heroism doesn&apos;t scale.&lt;/p&gt;
&lt;p&gt;So companies inevitably arrive at the same conclusion:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;We need a platform. Not as a buzzword. Not as hype. But because the way we&apos;re working is no longer sustainable.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That&apos;s what Platform Engineering is &lt;em&gt;really&lt;/em&gt; about. Not &quot;shiny new roles.&quot; Not &quot;we&apos;re replacing DevOps.&quot; Not building portals for the sake of portals.&lt;/p&gt;
&lt;p&gt;It&apos;s about &lt;strong&gt;building a foundation that grows with your organization, not against it&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Let me take this apart the way engineers should: calmly, logically, honestly.&lt;/p&gt;
&lt;h2&gt;1. DevOps vs Platform Engineering: Why They Are Not Competitors&lt;/h2&gt;
&lt;p&gt;There&apos;s a lot of confusion around this.
Mostly because people try to compare apples to architecture.&lt;/p&gt;
&lt;p&gt;Here&apos;s the fix.&lt;/p&gt;
&lt;h3&gt;1.1 DevOps: The way we work&lt;/h3&gt;
&lt;p&gt;DevOps is a cultural and operational model:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;shared responsibility between dev and ops,&lt;/li&gt;
&lt;li&gt;continuous improvement,&lt;/li&gt;
&lt;li&gt;end-to-end ownership,&lt;/li&gt;
&lt;li&gt;automation as a default way of working,&lt;/li&gt;
&lt;li&gt;reducing friction between teams,&lt;/li&gt;
&lt;li&gt;enabling fast, safe delivery.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DevOps is about &lt;strong&gt;behavior, process, mindset&lt;/strong&gt;, not specific tools.&lt;/p&gt;
&lt;p&gt;You can do DevOps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;with Kubernetes,&lt;/li&gt;
&lt;li&gt;without Kubernetes,&lt;/li&gt;
&lt;li&gt;with monoliths,&lt;/li&gt;
&lt;li&gt;with microservices,&lt;/li&gt;
&lt;li&gt;in small teams,&lt;/li&gt;
&lt;li&gt;in giant enterprises.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It&apos;s a philosophy of work.&lt;/p&gt;
&lt;h3&gt;1.2 Platform Engineering: The systems we build&lt;/h3&gt;
&lt;p&gt;Platform Engineering is what happens when a DevOps culture grows to the point where you need &lt;strong&gt;a dedicated, stable system&lt;/strong&gt; to support it.&lt;/p&gt;
&lt;p&gt;It is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a team,&lt;/li&gt;
&lt;li&gt;a product,&lt;/li&gt;
&lt;li&gt;a set of APIs,&lt;/li&gt;
&lt;li&gt;templates,&lt;/li&gt;
&lt;li&gt;workflows,&lt;/li&gt;
&lt;li&gt;infrastructure abstractions,&lt;/li&gt;
&lt;li&gt;and operational guardrails.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is the &lt;strong&gt;internal platform&lt;/strong&gt; that developers interact with when they build software.&lt;/p&gt;
&lt;h3&gt;1.3 A simple analogy&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DevOps = driving principles&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Platform Engineering = building the highway&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can&apos;t scale traffic with good drivers alone.
You need working infrastructure.&lt;/p&gt;
&lt;h2&gt;1.4 When DevOps matures, you get Platform Engineering&lt;/h2&gt;
&lt;p&gt;DevOps isn&apos;t being replaced.
It evolves.&lt;/p&gt;
&lt;p&gt;When DevOps becomes big enough, painful enough, and central enough, it naturally leads to one sentence:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&quot;We should build this as a product&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That product → is your platform.&lt;/p&gt;
&lt;h2&gt;2. Why Companies Hit the Wall Without a Platform&lt;/h2&gt;
&lt;p&gt;There are five signals I see everywhere, and they always mean the same thing.
Your infrastructure architecture has reached the limits of tribal knowledge.&lt;/p&gt;
&lt;h3&gt;2.1 Deployment Drama&lt;/h3&gt;
&lt;p&gt;If deployments require:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;heroism,&lt;/li&gt;
&lt;li&gt;coordination,&lt;/li&gt;
&lt;li&gt;manual approvals,&lt;/li&gt;
&lt;li&gt;Slack ceremonies,&lt;/li&gt;
&lt;li&gt;or the presence of a specific engineer,&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;you&apos;re not doing continuous delivery. You&apos;re staging a theatrical performance.&lt;/p&gt;
&lt;h3&gt;2.2 DevOps Becomes a Human API Gateway&lt;/h3&gt;
&lt;p&gt;When developers say:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&quot;Can you deploy this?&quot;&lt;/li&gt;
&lt;li&gt;&quot;Can you give me access?&quot;&lt;/li&gt;
&lt;li&gt;&quot;Can you check why staging is broken?&quot;&lt;/li&gt;
&lt;li&gt;&quot;Can you create a new environment?&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And DevOps becomes a bottleneck for everything, from debugging to provisioning, that&apos;s not DevOps.
That&apos;s &lt;strong&gt;Ops&lt;/strong&gt; with extra steps.&lt;/p&gt;
&lt;h3&gt;2.3 Snowflake environments&lt;/h3&gt;
&lt;p&gt;Staging behaves like prod&apos;s distant cousin.
Local dev behaves like neither.
CI behaves like a completely different species.&lt;/p&gt;
&lt;p&gt;This is how outages happen.&lt;/p&gt;
&lt;h3&gt;2.4 Cost chaos&lt;/h3&gt;
&lt;p&gt;Whether it&apos;s:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;orphaned resources,&lt;/li&gt;
&lt;li&gt;forgotten databases,&lt;/li&gt;
&lt;li&gt;overprovisioned clusters,&lt;/li&gt;
&lt;li&gt;runaway autoscalers,&lt;/li&gt;
&lt;li&gt;misconfigured storage,&lt;/li&gt;
&lt;li&gt;or zombie services,&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;cost without governance grows like mold.&lt;/p&gt;
&lt;h3&gt;2.5 Scaling becomes painful&lt;/h3&gt;
&lt;p&gt;If adding new engineers or new services makes everything slower rather than faster, that&apos;s a structural failure.&lt;/p&gt;
&lt;p&gt;A good system becomes &lt;em&gt;more predictable&lt;/em&gt; as it grows.
A bad one becomes &lt;em&gt;more fragile&lt;/em&gt;.&lt;/p&gt;
&lt;h2&gt;3. What Platform Engineering &lt;em&gt;Actually&lt;/em&gt; Is&lt;/h2&gt;
&lt;p&gt;Forget the vendor diagrams. Forget buzzwords.
Here&apos;s the simplest, clearest, most useful definition I know.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Platform Engineering is building an internal product that gives developers the paved, reliable, predictable path to build, ship, operate, and observe software.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A platform is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;boring&lt;/li&gt;
&lt;li&gt;consistent&lt;/li&gt;
&lt;li&gt;repeatable&lt;/li&gt;
&lt;li&gt;documented&lt;/li&gt;
&lt;li&gt;self-service&lt;/li&gt;
&lt;li&gt;observable&lt;/li&gt;
&lt;li&gt;secure&lt;/li&gt;
&lt;li&gt;cost-controlled&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A platform is NOT:&lt;/p&gt;
&lt;p&gt;❌ &quot;Kubernetes + CI&quot;&lt;br&gt;
❌ &quot;Backstage installed over the weekend&quot;&lt;br&gt;
❌ &quot;A DevOps team renamed&quot;&lt;br&gt;
❌ &quot;A dashboard with links to tools&quot;&lt;br&gt;
❌ &quot;A new department that writes YAML&quot;&lt;/p&gt;
&lt;p&gt;A platform is &lt;strong&gt;everything developers need, wrapped in one coherent experience&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;And it must feel like a &lt;strong&gt;product&lt;/strong&gt;, not a set of tools.&lt;/p&gt;
&lt;h2&gt;4. The Anatomy of a Real Platform (5 Layers)&lt;/h2&gt;
&lt;p&gt;I&apos;ve seen dozens of internal platforms across the world. None of them succeeded without these five layers.&lt;/p&gt;
&lt;h3&gt;Layer 1: Infrastructure Foundation&lt;/h3&gt;
&lt;p&gt;The technical bedrock.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://kubernetes.io/docs/home/&quot;&gt;Kubernetes&lt;/a&gt; or ECS/Nomad&lt;/li&gt;
&lt;li&gt;Load balancing / Ingress / API gateways&lt;/li&gt;
&lt;li&gt;VPC, subnets, routing&lt;/li&gt;
&lt;li&gt;Databases, caches, queues&lt;/li&gt;
&lt;li&gt;Storage&lt;/li&gt;
&lt;li&gt;KMS + secrets&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.hashicorp.com/terraform/docs&quot;&gt;Terraform&lt;/a&gt; or Pulumi for provisioning&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.crossplane.io/&quot;&gt;Crossplane&lt;/a&gt; if you want infra CRDs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is the &quot;engine room&quot;.&lt;/p&gt;
&lt;p&gt;If this layer is unstable, everything built on top collapses.&lt;/p&gt;
&lt;h3&gt;Layer 2: Control Plane (The Brain)&lt;/h3&gt;
&lt;p&gt;This is where Platform Engineering becomes real:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GitOps&lt;/strong&gt; (&lt;a href=&quot;https://argo-cd.readthedocs.io/en/stable/&quot;&gt;Argo CD&lt;/a&gt; or &lt;a href=&quot;https://fluxcd.io/flux/&quot;&gt;Flux&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Policy engines&lt;/strong&gt; (&lt;a href=&quot;https://www.openpolicyagent.org/docs&quot;&gt;OPA&lt;/a&gt;, Gatekeeper, &lt;a href=&quot;https://kyverno.io/docs/&quot;&gt;Kyverno&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;standardized CI/CD&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;templates&lt;/strong&gt; (Helm, Kustomize, Terraform modules)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;infrastructure blueprints&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloud governance rules&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is the &lt;strong&gt;logic&lt;/strong&gt; that ensures consistency across environments.&lt;/p&gt;
&lt;h3&gt;Layer 3: Developer Experience Layer&lt;/h3&gt;
&lt;p&gt;Good DX is not &quot;nice-to-have&quot;.
It&apos;s the factor that determines adoption.&lt;/p&gt;
&lt;p&gt;Includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://backstage.io/&quot;&gt;Backstage&lt;/a&gt; or &lt;a href=&quot;https://port.io/&quot;&gt;Port&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Internal CLI&lt;/li&gt;
&lt;li&gt;service creation wizard&lt;/li&gt;
&lt;li&gt;automatic observability&lt;/li&gt;
&lt;li&gt;pre-configured pipelines&lt;/li&gt;
&lt;li&gt;unified configuration model&lt;/li&gt;
&lt;li&gt;preview environments&lt;/li&gt;
&lt;li&gt;local dev tooling&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A great platform makes it easier to follow the paved road than to go around it.&lt;/p&gt;
&lt;h3&gt;Layer 4: Observability Layer&lt;/h3&gt;
&lt;p&gt;Without observability, you&apos;re navigating your production with a flashlight and a prayer.&lt;/p&gt;
&lt;p&gt;Minimum set:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://prometheus.io/docs/introduction/overview/&quot;&gt;Prometheus&lt;/a&gt; + &lt;a href=&quot;https://grafana.com/docs/&quot;&gt;Grafana&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://grafana.com/docs/loki/latest/&quot;&gt;Loki&lt;/a&gt; or ELK&lt;/li&gt;
&lt;li&gt;Tracing (&lt;a href=&quot;https://grafana.com/docs/tempo/latest/&quot;&gt;Tempo&lt;/a&gt;, &lt;a href=&quot;https://www.jaegertracing.io/docs/&quot;&gt;Jaeger&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Logging standards&lt;/li&gt;
&lt;li&gt;SLO dashboards&lt;/li&gt;
&lt;li&gt;Synthetic checks&lt;/li&gt;
&lt;li&gt;Alerting strategy (not alert spam)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Observability is not &quot;nice monitoring&quot;.
It is a prerequisite for stability.&lt;/p&gt;
&lt;h3&gt;Layer 5: Governance &amp;amp; Security Layer&lt;/h3&gt;
&lt;p&gt;The guardrails that make velocity possible &lt;strong&gt;safely&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IAM / RBAC / service identities&lt;/li&gt;
&lt;li&gt;image scanning (&lt;a href=&quot;https://snyk.io/&quot;&gt;Snyk&lt;/a&gt;, Trivy)&lt;/li&gt;
&lt;li&gt;secrets rotation&lt;/li&gt;
&lt;li&gt;cost visibility&lt;/li&gt;
&lt;li&gt;policies on namespaces, quotas, tagging&lt;/li&gt;
&lt;li&gt;compliance automation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Governance is not bureaucracy.
It&apos;s the thing that prevents midnight incidents.&lt;/p&gt;
&lt;h2&gt;5. The Golden Path: The Heart of a Good Platform&lt;/h2&gt;
&lt;p&gt;This is where developers feel the platform.&lt;/p&gt;
&lt;p&gt;A Golden Path is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a template,&lt;/li&gt;
&lt;li&gt;a CLI command,&lt;/li&gt;
&lt;li&gt;a repository structure,&lt;/li&gt;
&lt;li&gt;pipelines,&lt;/li&gt;
&lt;li&gt;policies,&lt;/li&gt;
&lt;li&gt;monitoring,&lt;/li&gt;
&lt;li&gt;a deployment strategy,&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;all packaged into one frictionless &quot;this is how we build services here&quot;.&lt;/p&gt;
&lt;p&gt;You type:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;internal create service my-api
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And you get:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;scaffolding&lt;/li&gt;
&lt;li&gt;Dockerfile&lt;/li&gt;
&lt;li&gt;Helm chart&lt;/li&gt;
&lt;li&gt;CI pipeline&lt;/li&gt;
&lt;li&gt;SLO dashboards&lt;/li&gt;
&lt;li&gt;Logs + metrics&lt;/li&gt;
&lt;li&gt;GitOps config&lt;/li&gt;
&lt;li&gt;Autoscaling policies&lt;/li&gt;
&lt;li&gt;Cost tags&lt;/li&gt;
&lt;li&gt;Secrets wiring&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;out-of-the-box.&lt;/p&gt;
&lt;p&gt;A good Golden Path cuts cognitive load by &lt;strong&gt;10x&lt;/strong&gt; and accelerates delivery by &lt;strong&gt;3-7x&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This is the moment where engineers say:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;This is nice. This feels clean.&quot;
&quot;This makes sense.&quot;
&quot;I don&apos;t want to go back.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Golden Paths are the soul of the platform.&lt;/p&gt;
&lt;h2&gt;6. DevOps vs Platform Engineering: Deep Comparison for Experts&lt;/h2&gt;
&lt;p&gt;Most articles get this section wrong, or they oversimplify it.&lt;/p&gt;
&lt;p&gt;Here it is, crisp.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;DevOps&lt;/th&gt;
&lt;th&gt;Platform Engineering&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mission&lt;/td&gt;
&lt;td&gt;Improve collaboration &amp;amp; delivery culture&lt;/td&gt;
&lt;td&gt;Build an internal product (the platform)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output&lt;/td&gt;
&lt;td&gt;CI, CD, automation, practices&lt;/td&gt;
&lt;td&gt;Golden paths, CLIs, templates, infra APIs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Focus&lt;/td&gt;
&lt;td&gt;People &amp;amp; process&lt;/td&gt;
&lt;td&gt;Systems &amp;amp; tooling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Team shape&lt;/td&gt;
&lt;td&gt;Cross-functional&lt;/td&gt;
&lt;td&gt;Product-focused&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Customers&lt;/td&gt;
&lt;td&gt;Developers, QA, infra&lt;/td&gt;
&lt;td&gt;Developers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Success metric&lt;/td&gt;
&lt;td&gt;Delivery speed, reliability&lt;/td&gt;
&lt;td&gt;Adoption, consistency, DX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Timescale&lt;/td&gt;
&lt;td&gt;Iterative improvement&lt;/td&gt;
&lt;td&gt;Multi-year evolution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anti-pattern&lt;/td&gt;
&lt;td&gt;DevOps as Ops rebranded&lt;/td&gt;
&lt;td&gt;Platform as a tool dumping ground&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Platform Engineering builds the structure.
DevOps teaches teams how to use it.&lt;/p&gt;
&lt;p&gt;One cannot replace the other.&lt;/p&gt;
&lt;h2&gt;7. The Tools (Explained Like an Engineer, Not a Vendor)&lt;/h2&gt;
&lt;p&gt;Tools matter. Not because they&apos;re &quot;cool,&quot; but because they shape the experience and constraints of your platform.&lt;/p&gt;
&lt;p&gt;Here are the ones that count.&lt;/p&gt;
&lt;h3&gt;7.1 Kubernetes&lt;/h3&gt;
&lt;p&gt;Use it if:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;you have multiple teams,&lt;/li&gt;
&lt;li&gt;microservices,&lt;/li&gt;
&lt;li&gt;autoscaling needs,&lt;/li&gt;
&lt;li&gt;service meshes,&lt;/li&gt;
&lt;li&gt;multi-env consistency,&lt;/li&gt;
&lt;li&gt;need for runtime abstraction.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Don&apos;t use it if:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;you deploy two Python apps and one cron job,&lt;/li&gt;
&lt;li&gt;you don&apos;t have SRE capacity,&lt;/li&gt;
&lt;li&gt;you can&apos;t manage cluster lifecycle.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;7.2 Terraform&lt;/h3&gt;
&lt;p&gt;Great for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;infra provisioning&lt;/li&gt;
&lt;li&gt;cloud resources&lt;/li&gt;
&lt;li&gt;repeatability&lt;/li&gt;
&lt;li&gt;modules as standards&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Be careful with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;drift&lt;/li&gt;
&lt;li&gt;secrets&lt;/li&gt;
&lt;li&gt;mixing app and infra concerns&lt;/li&gt;
&lt;li&gt;applying manually&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;7.3 Crossplane&lt;/h3&gt;
&lt;p&gt;Use when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kubernetes is your control plane&lt;/li&gt;
&lt;li&gt;you want infra CRDs&lt;/li&gt;
&lt;li&gt;you want policy-enforced infra creation inside clusters&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Skip if:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;your teams are not ready for CRD-driven infra&lt;/li&gt;
&lt;li&gt;you already struggle with Kubernetes complexity&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;7.4 GitOps (Argo CD / Flux)&lt;/h3&gt;
&lt;p&gt;The backbone of reliable delivery.&lt;/p&gt;
&lt;p&gt;Pros:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;drift protection&lt;/li&gt;
&lt;li&gt;revertability&lt;/li&gt;
&lt;li&gt;auditability&lt;/li&gt;
&lt;li&gt;versioned environments&lt;/li&gt;
&lt;li&gt;better security posture&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Just remember:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;do NOT mix imperative and declarative&lt;/li&gt;
&lt;li&gt;keep secrets out&lt;/li&gt;
&lt;li&gt;structure repos carefully&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;7.5 Backstage&lt;/h3&gt;
&lt;p&gt;The best developer portal we have.&lt;/p&gt;
&lt;p&gt;Use it for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;service catalog&lt;/li&gt;
&lt;li&gt;documentation&lt;/li&gt;
&lt;li&gt;golden paths&lt;/li&gt;
&lt;li&gt;scorecards&lt;/li&gt;
&lt;li&gt;scaffolding&lt;/li&gt;
&lt;li&gt;standardization&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But don&apos;t treat it as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a dumping ground&lt;/li&gt;
&lt;li&gt;a substitute for platform maturity&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Backstage succeeds when your platform already has structure.&lt;/p&gt;
&lt;h3&gt;7.6 Vault / External Secrets&lt;/h3&gt;
&lt;p&gt;Use to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;centralize secrets&lt;/li&gt;
&lt;li&gt;rotate automatically&lt;/li&gt;
&lt;li&gt;eliminate inline credentials&lt;/li&gt;
&lt;li&gt;enforce least privilege&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Secrets must never live:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;in repos,&lt;/li&gt;
&lt;li&gt;in CI logs,&lt;/li&gt;
&lt;li&gt;in Slack,&lt;/li&gt;
&lt;li&gt;in Terraform states.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;8. Common Failure Patterns: What Breaks 90% of Internal Platforms&lt;/h2&gt;
&lt;p&gt;This is the part most companies skip. They regret it later.&lt;/p&gt;
&lt;p&gt;❌ &lt;strong&gt;Failure #1: Platform built for DevOps, not developers&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If developers don&apos;t use it, it&apos;s not a platform.&lt;/p&gt;
&lt;p&gt;❌ &lt;strong&gt;Failure #2: Too much complexity too early&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You don&apos;t start by building a universe.
You start by paving one clean road.&lt;/p&gt;
&lt;p&gt;❌ &lt;strong&gt;Failure #3: &quot;Platform = Backstage&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A portal without strong foundations is a catalog of pain.&lt;/p&gt;
&lt;p&gt;❌ &lt;strong&gt;Failure #4: Platform team behaves like Ops&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If the platform team approves deployments, that&apos;s not a platform.&lt;/p&gt;
&lt;p&gt;❌ &lt;strong&gt;Failure #5: No product thinking&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Platforms without:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;user research&lt;/li&gt;
&lt;li&gt;documentation&lt;/li&gt;
&lt;li&gt;versioning&lt;/li&gt;
&lt;li&gt;roadmap&lt;/li&gt;
&lt;li&gt;metrics&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;die silently.&lt;/p&gt;
&lt;p&gt;❌ &lt;strong&gt;Failure #6: No Golden Path&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You can&apos;t scale &quot;many ways to do the same thing&quot;.&lt;/p&gt;
&lt;p&gt;❌ &lt;strong&gt;Failure #7: No GitOps&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Imperative ops doesn&apos;t scale.&lt;/p&gt;
&lt;p&gt;❌ &lt;strong&gt;Failure #8: No observability&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you can&apos;t see the system, you can&apos;t improve the system.&lt;/p&gt;
&lt;h2&gt;9. If I Had to Build Your Platform in 90 Days (Valdemar Edition)&lt;/h2&gt;
&lt;p&gt;This section is pure practice. Something you can use tomorrow.&lt;/p&gt;
&lt;h3&gt;Phase 1 (Weeks 1-2): Understand the Pain&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Interview developers.&lt;/li&gt;
&lt;li&gt;Watch their deploy process.&lt;/li&gt;
&lt;li&gt;Map where DevOps gets pulled in.&lt;/li&gt;
&lt;li&gt;Identify repetitive failures.&lt;/li&gt;
&lt;li&gt;Define the top 3 most painful bottlenecks.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This phase is about humility and learning, not architecture.&lt;/p&gt;
&lt;h3&gt;Phase 2 (Weeks 3-4): Build One Great Golden Path&lt;/h3&gt;
&lt;p&gt;Pick ONE service type (e.g., internal API).&lt;/p&gt;
&lt;p&gt;Deliver:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;repo scaffold&lt;/li&gt;
&lt;li&gt;Dockerfile&lt;/li&gt;
&lt;li&gt;CI&lt;/li&gt;
&lt;li&gt;Helm chart / Kustomize&lt;/li&gt;
&lt;li&gt;GitOps manifest&lt;/li&gt;
&lt;li&gt;metrics + logs&lt;/li&gt;
&lt;li&gt;OPA policies&lt;/li&gt;
&lt;li&gt;basic cost tags&lt;/li&gt;
&lt;li&gt;reliability budget&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Your goal:
&lt;strong&gt;service ready in under 10 minutes, deployable in under 2.&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;Phase 3 (Weeks 5-6): GitOps Everywhere&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Argo CD or Flux&lt;/li&gt;
&lt;li&gt;environment repos&lt;/li&gt;
&lt;li&gt;no manual kubectl&lt;/li&gt;
&lt;li&gt;clear directory structure&lt;/li&gt;
&lt;li&gt;rollbacks tested&lt;/li&gt;
&lt;li&gt;drift detection enabled&lt;/li&gt;
&lt;li&gt;PR-based changes only&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This instantly improves reliability.&lt;/p&gt;
&lt;h3&gt;Phase 4 (Weeks 7-8): Developer Interface&lt;/h3&gt;
&lt;p&gt;Start small:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;internal CLI&lt;/li&gt;
&lt;li&gt;Backstage scaffold&lt;/li&gt;
&lt;li&gt;templates visible in UI&lt;/li&gt;
&lt;li&gt;documentation automated&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A platform without interface
is like an airport without signs.&lt;/p&gt;
&lt;h3&gt;Phase 5 (Weeks 9-12): Expand With Care&lt;/h3&gt;
&lt;p&gt;Add:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;frontend service template&lt;/li&gt;
&lt;li&gt;async worker template&lt;/li&gt;
&lt;li&gt;cost guardrails&lt;/li&gt;
&lt;li&gt;alerting best practices&lt;/li&gt;
&lt;li&gt;tracing&lt;/li&gt;
&lt;li&gt;secrets management&lt;/li&gt;
&lt;li&gt;service scorecards&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;progressive delivery (&lt;a href=&quot;https://argo-rollouts.readthedocs.io/en/stable/&quot;&gt;Argo Rollouts&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At this point you will have a &lt;strong&gt;real&lt;/strong&gt;, working platform.&lt;/p&gt;
&lt;p&gt;Not perfect. But alive, used, and stable.&lt;/p&gt;
&lt;p&gt;That&apos;s the only platform that matters.&lt;/p&gt;
&lt;h2&gt;10. How to Know You Actually Have a Platform&lt;/h2&gt;
&lt;p&gt;You know you have a platform when:&lt;/p&gt;
&lt;p&gt;✔ developers don&apos;t ask &quot;how do I deploy this?&quot;&lt;br&gt;
✔ new services follow the same structure&lt;br&gt;
✔ environments never drift&lt;br&gt;
✔ deployments are boring&lt;br&gt;
✔ DevOps is no longer a bottleneck&lt;br&gt;
✔ cost anomalies are visible immediately&lt;br&gt;
✔ logs, metrics, traces appear automatically&lt;br&gt;
✔ teams move faster, not slower&lt;br&gt;
✔ the platform feels invisible, but reliable&lt;/p&gt;
&lt;p&gt;And the most important criterion:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If your platform team goes on vacation and the company doesn&apos;t panic — you did it right.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;11. Final Thoughts: Platform Engineering Is What Happens When Engineering Matures&lt;/h2&gt;
&lt;p&gt;The best platforms are not the biggest ones.
Not the most complex ones.
Not the ones with the most tools.&lt;/p&gt;
&lt;p&gt;The best platforms are the ones that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;reduce friction,&lt;/li&gt;
&lt;li&gt;reduce cognitive load,&lt;/li&gt;
&lt;li&gt;reduce variance,&lt;/li&gt;
&lt;li&gt;reduce complexity,&lt;/li&gt;
&lt;li&gt;reduce heroism,&lt;/li&gt;
&lt;li&gt;reduce fear.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A good platform:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;makes teams faster,&lt;/li&gt;
&lt;li&gt;makes systems safer,&lt;/li&gt;
&lt;li&gt;makes architecture cleaner,&lt;/li&gt;
&lt;li&gt;makes work calmer,&lt;/li&gt;
&lt;li&gt;makes engineers happier.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It does not aim to impress.
It aims to &lt;strong&gt;serve&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;So platform engineering is not a trend.
It&apos;s not &quot;DevOps 2.0&quot;.
It&apos;s not hype.&lt;/p&gt;
&lt;p&gt;It&apos;s simply the natural evolution of software engineering
in a world where complexity grows faster than teams.&lt;/p&gt;
&lt;p&gt;And like any good engineering discipline,
its goal is beautifully simple:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Build systems that remain predictable even as everything around them changes.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If your platform is doing that, you&apos;re on the right path.
The golden one.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>Platform Engineering</category><category>Kubernetes</category><category>GitOps</category><category>Terraform</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Recovering a Corrupt Exchange Database with Stellar Repair — Real-World Lab Test</title><link>https://heyvaldemar.com/recovering-a-corrupt-exchange-database-with-stellar-repair-real-world-lab-test/</link><guid isPermaLink="true">https://heyvaldemar.com/recovering-a-corrupt-exchange-database-with-stellar-repair-real-world-lab-test/</guid><description>We deliberately broke an Exchange 2019 server to test Stellar Repair on a dirty-shutdown EDB file. The recovery process, lab setup, and lessons learned.</description><pubDate>Thu, 31 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You know the feeling. The Exchange database won&apos;t mount, users are screaming, and the logs read like hieroglyphics. I decided to build that nightmare on purpose, in a lab where nobody could get hurt. The point was simple. I wanted to find out whether &lt;strong&gt;Stellar Repair for Exchange&lt;/strong&gt; could actually drag me back out of the fire.&lt;/p&gt;
&lt;p&gt;It did. But I&apos;m getting ahead of myself.&lt;/p&gt;
&lt;p&gt;None of this is theory. It&apos;s a war story from a controlled lab, start to finish: from &lt;strong&gt;&quot;let&apos;s nuke the Exchange database&quot;&lt;/strong&gt; all the way to &lt;strong&gt;&quot;back in business without losing a single email.&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Why Stellar Repair for Exchange Caught My Eye&lt;/h2&gt;
&lt;p&gt;I&apos;ve spent enough years in the trenches with Exchange to know one thing for certain. When a database goes dirty, your weekend is already over.&lt;/p&gt;
&lt;p&gt;Microsoft hands you &lt;code&gt;eseutil&lt;/code&gt; and a few other tools. Fine for tidy problems. In a real disaster, though, it&apos;s a butterknife at a gunfight.&lt;/p&gt;
&lt;p&gt;That&apos;s the gap Stellar Repair for Exchange tries to fill. One job, nothing fancy: take a corrupt EDB file and make it readable again.&lt;/p&gt;
&lt;p&gt;A 4.9/5 Trustpilot rating told me I wasn&apos;t the only one wondering whether it delivers.&lt;/p&gt;
&lt;h2&gt;The Test Lab: Building a Realistic Disaster&lt;/h2&gt;
&lt;p&gt;You don&apos;t trust recovery software on a hunch. So before anything else I stood up a lab that looked like a real environment. Two boxes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;HQ-DC01&lt;/strong&gt; - Windows Server 2019, Active Directory Domain Controller&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HQ-EXCH01&lt;/strong&gt; - Windows Server 2019, Exchange 2019 CU15&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Three demo users. A handful of emails going back and forth, a few calendar invites thrown in. The goal was to make the database feel lived-in, like an ordinary Tuesday at the office rather than an empty test rig.&lt;/p&gt;
&lt;h3&gt;Installing Stellar Repair for Exchange&lt;/h3&gt;
&lt;p&gt;The install is about as hard as installing a screensaver. Download, click Next a few times, done. Nothing hidden underneath, no surprise dependencies waiting to bite you.&lt;/p&gt;
&lt;h2&gt;Making a Mess: Dirty Shutdown on Purpose&lt;/h2&gt;
&lt;p&gt;Now the fun part.&lt;/p&gt;
&lt;p&gt;Exchange logs hold the database together. They keep it consistent. So I deleted half of them. Then I killed the &quot;Microsoft Exchange Information Store&quot; service. That was enough to shove the database straight into a &lt;strong&gt;dirty shutdown&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;To confirm:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;eseutil /mh &apos;.\DB01-Mailbox.edb&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dirty. Exactly what I was after.&lt;/p&gt;
&lt;p&gt;Exchange now flatly refuses to mount the thing. Disaster achieved, on schedule.&lt;/p&gt;
&lt;h2&gt;Recovery with Stellar Repair for Exchange&lt;/h2&gt;
&lt;h3&gt;Step 1: Point to the EDB&lt;/h3&gt;
&lt;p&gt;Launch Stellar and point it at the EDB file. Lost track of where it lives? There&apos;s a &quot;Find&quot; option for that. It also surfaces a Temp folder path, and you want disk space sitting there.&lt;/p&gt;
&lt;p&gt;That detail matters more than it looks. The tool leans on the Temp location while it chews through a large database, so check that the path Stellar shows has real free space before you kick off a scan.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./recovering-a-corrupt-exchange-database-with-stellar-repair-real-world-lab-test-1.webp&quot; alt=&quot;Stellar Repair for Exchange - Select EDB file dialog&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./recovering-a-corrupt-exchange-database-with-stellar-repair-real-world-lab-test-2.webp&quot; alt=&quot;Stellar Repair for Exchange - EDB file selected and ready to scan&quot;&gt;&lt;/p&gt;
&lt;h3&gt;Step 2: Choose the Scan Mode&lt;/h3&gt;
&lt;p&gt;Two scan modes are on offer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Quick Scan&lt;/strong&gt; - good for light corruption&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extensive Scan&lt;/strong&gt; - deep, slower, but thorough&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I picked &lt;strong&gt;Extensive Scan&lt;/strong&gt;. My database had basically been set on fire, so half measures weren&apos;t going to cut it.&lt;/p&gt;
&lt;h3&gt;Step 3: Wait for the Magic&lt;/h3&gt;
&lt;p&gt;The scan finished and Stellar handed me all three mailboxes. Emails, calendars, contacts, the lot. Every bit of it browsable.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./recovering-a-corrupt-exchange-database-with-stellar-repair-real-world-lab-test-3.webp&quot; alt=&quot;Stellar Repair for Exchange - Mailboxes tree after extensive scan&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Recovery Options That Matter&lt;/h2&gt;
&lt;p&gt;From here, your choices open up. You can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Export to &lt;strong&gt;PST&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Export to &lt;strong&gt;MSG, EML, HTML, RTF, PDF&lt;/strong&gt; (single items)&lt;/li&gt;
&lt;li&gt;Export back to &lt;strong&gt;Exchange Server&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Export directly to &lt;strong&gt;Office 365&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Even push data into a &lt;strong&gt;Public Folder&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the lab I chose &lt;strong&gt;Export back to Exchange&lt;/strong&gt;. One catch worth knowing about: Outlook has to be installed on the same machine as Stellar. In production you&apos;d run this on a separate VM. Trust me on that one.&lt;/p&gt;
&lt;p&gt;The recovery scope is wide. Stellar pulls back nearly everything a mailbox holds: emails and their attachments, contacts, calendars, tasks, notes, journals, even Public Folder content.&lt;/p&gt;
&lt;p&gt;It covers Exchange Server versions all the way from 5.5 up through 2019.&lt;/p&gt;
&lt;p&gt;:::warning
As of this test (July 2025), Exchange 2019 CU15 was used. Support for newer versions, if released, should be verified with Stellar.
:::&lt;/p&gt;
&lt;h2&gt;Rebuilding the Mailboxes&lt;/h2&gt;
&lt;p&gt;Over in the Exchange Admin Center:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Disabled the broken mailboxes (so user accounts remain in AD)&lt;/li&gt;
&lt;li&gt;Created fresh mailboxes with &lt;code&gt;_restored&lt;/code&gt; suffix&lt;/li&gt;
&lt;li&gt;Logged in to confirm: clean, empty&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Back in Stellar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Right-click mailbox → &lt;strong&gt;Export to Exchange Server&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Provide Exchange server and credentials&lt;/li&gt;
&lt;li&gt;Click OK&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then repeat for every mailbox and let it sync.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./recovering-a-corrupt-exchange-database-with-stellar-repair-real-world-lab-test-4.webp&quot; alt=&quot;Stellar Repair for Exchange - Export options dialog before export&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./recovering-a-corrupt-exchange-database-with-stellar-repair-real-world-lab-test-5.webp&quot; alt=&quot;Stellar Repair for Exchange - Export progress restoring to Exchange Server&quot;&gt;&lt;/p&gt;
&lt;h3&gt;The Result&lt;/h3&gt;
&lt;p&gt;A few minutes later, all three mailboxes were back. Emails, calendar invites, everything sitting where it should.&lt;/p&gt;
&lt;p&gt;This from a database that wouldn&apos;t mount at all.&lt;/p&gt;
&lt;h2&gt;Key Takeaways&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ease of use:&lt;/strong&gt; Zero PowerShell gymnastics, just point and click&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compatibility:&lt;/strong&gt; Works with Exchange 5.5 up to 2019&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recovery options:&lt;/strong&gt; PST, Office 365, Public Folders - take your pick&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Safety net:&lt;/strong&gt; When &lt;code&gt;eseutil&lt;/code&gt; leaves you stranded, this saves your bacon&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;This isn&apos;t an ad. It&apos;s the sober readout after I broke Exchange on purpose and watched what happened: &lt;strong&gt;Stellar Repair for Exchange works.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you run Exchange servers and don&apos;t keep something like this in your back pocket, you&apos;re betting against downtime. That&apos;s a bet you lose eventually.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;My advice?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Build a lab. Break your own database. Run the recovery yourself and watch it come back. Far better to learn this on a quiet afternoon than at 3 AM on a Sunday.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.stellarinfo.com/edb-exchange-server-recovery.htm&quot;&gt;Learn more about Stellar Repair for Exchange&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Exchange Server</category><category>Email</category><category>Database Recovery</category><category>Microsoft</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Amazon Q vs DevOps Chaos — Can This AI Fix AWS Faster Than You?</title><link>https://heyvaldemar.com/amazon-q-vs-devops-chaos-can-this-ai-fix-aws-faster-than-you/</link><guid isPermaLink="true">https://heyvaldemar.com/amazon-q-vs-devops-chaos-can-this-ai-fix-aws-faster-than-you/</guid><description>Fix AWS issues faster with Amazon Q, the AI assistant built for DevOps. Real-world examples, limitations, and how it compares to ChatGPT.</description><pubDate>Mon, 30 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You know the moment. AWS breaks, the channel goes quiet, everyone suddenly remembers they have a meeting, and &lt;strong&gt;you&apos;re the one fixing it&lt;/strong&gt;. This post is about ending that.&lt;/p&gt;
&lt;h2&gt;Meet Amazon Q&lt;/h2&gt;
&lt;p&gt;Amazon Q is the AI assistant baked into AWS. Treat it like a teammate. One who skips the small talk and has no opinions about your playlist.&lt;/p&gt;
&lt;p&gt;It&apos;s less “Hello, World” and more:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Hey, your Lambda&apos;s stuck because your IAM policy is a dumpster fire again.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Q doesn&apos;t just chat. It &lt;strong&gt;digs into your infra, permissions, and configurations&lt;/strong&gt;. Picture a senior AWS engineer locked inside your console forever, no HR paperwork required.&lt;/p&gt;
&lt;p&gt;And honestly? Some days it beats the colleague who answers three days late, about a different ticket entirely.&lt;/p&gt;
&lt;p&gt;import VideoPlayer from &quot;@components/VideoPlayer.astro&quot;;&lt;/p&gt;
&lt;p&gt;&amp;lt;VideoPlayer
videoId=&quot;zf-JoGpXCG0&quot;
title=&quot;Amazon Q vs DevOps Chaos - Can This AI Fix AWS Faster Than You?&quot;
/&amp;gt;&lt;/p&gt;
&lt;h2&gt;So how does Q hold up in real life?&lt;/h2&gt;
&lt;h3&gt;Example 1: Lambda Troubleshooting&lt;/h3&gt;
&lt;p&gt;You trigger a Lambda. &lt;strong&gt;Silence.&lt;/strong&gt; No errors. No logs. Just confusion and a low hum of panic.&lt;/p&gt;
&lt;p&gt;Before you open fifteen Google tabs, Q checks your setup and says:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Relax. Just add this IAM permission. Done.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Example 2: VPC Setup&lt;/h3&gt;
&lt;p&gt;You&apos;re standing up a VPC. NAT gateways, subnets, the usual YAML nightmare.&lt;/p&gt;
&lt;p&gt;Q hands you the template and shrugs:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“One click. Coffee break.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Example 3: Route 53 and DNS&lt;/h3&gt;
&lt;p&gt;Configuring DNS in Route 53 has a way of making you feel like it&apos;s your first week in tech again.&lt;/p&gt;
&lt;p&gt;So instead of you sifting through stale forum threads, or taking vague advice from some tool that&apos;s never seen your account, Q walks you through it. Clearly. Calmly. &lt;strong&gt;With a lot less stress.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You get the idea.&lt;/p&gt;
&lt;h2&gt;Who Does Q Actually Help?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;New to AWS?&lt;/strong&gt; Q tells you exactly what broke, and why.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Senior DevOps engineer?&lt;/strong&gt; Q gives you your evenings back.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Working on a team?&lt;/strong&gt; Less “let&apos;s sync later,” more “feature shipped.”&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;But Wait, Don&apos;t We Already Have ChatGPT?&lt;/h3&gt;
&lt;p&gt;We do. Thing is, ChatGPT has never seen your AWS account.&lt;/p&gt;
&lt;p&gt;ChatGPT knows the rules. &lt;strong&gt;Q knows your chaos.&lt;/strong&gt; That&apos;s the whole difference.&lt;/p&gt;
&lt;p&gt;It&apos;s basically handing ChatGPT the keys to your account with one rule:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Look but don&apos;t break.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;What You Should Know Before You Try It&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;🚧 It&apos;s still in &lt;strong&gt;Preview&lt;/strong&gt;. Expect the odd bug.&lt;/li&gt;
&lt;li&gt;🧠 If your setup is genuinely hairy, you&apos;ll still be tweaking things by hand.&lt;/li&gt;
&lt;li&gt;🛠️ And if you live in Terraform, or write everything as code,
&lt;strong&gt;Q really shines in the CLI or your IDE.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;Amazon Q is an AI assistant built for one job: helping DevOps people clean up &lt;strong&gt;real-world AWS messes&lt;/strong&gt; without the usual pain.&lt;/p&gt;
&lt;p&gt;So give it a shot.&lt;/p&gt;
&lt;p&gt;Because come on. &lt;strong&gt;Weekends aren&apos;t for debugging IAM policies.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Thank you for reading! Don&apos;t forget to check out the &lt;a href=&quot;https://youtu.be/zf-JoGpXCG0&quot;&gt;video version&lt;/a&gt; for additional insights and visuals.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>Amazon Q</category><category>AWS</category><category>DevOps</category><category>AI</category><category>IaC</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Docker MCP — Turn GPT into a Real DevOps Assistant (Slack, GitHub, Stripe)</title><link>https://heyvaldemar.com/docker-mcp-turn-gpt-into-real-devops-assistant-slack-github-stripe/</link><guid isPermaLink="true">https://heyvaldemar.com/docker-mcp-turn-gpt-into-real-devops-assistant-slack-github-stripe/</guid><description>Turn GPT into a real DevOps assistant with Docker MCP. How AI agents automate Slack, GitHub, Stripe, and more — securely and at scale.</description><pubDate>Tue, 10 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Let me guess.&lt;/p&gt;
&lt;p&gt;You&apos;ve poked at GPT or Claude. Maybe you wired up a small chatbot over a weekend.&lt;/p&gt;
&lt;p&gt;Then you ask it to do one real thing:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Hey, can you post in Slack that the task is done?”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And it tells you:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“I would... but I&apos;m just a language model.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sound familiar?&lt;/p&gt;
&lt;p&gt;import VideoPlayer from &quot;@components/VideoPlayer.astro&quot;;&lt;/p&gt;
&lt;p&gt;&amp;lt;VideoPlayer
videoId=&quot;pCGEXT1qZHY&quot;
title=&quot;Docker MCP - Turn GPT into a Real DevOps Assistant (Slack, GitHub, Stripe)&quot;
/&amp;gt;&lt;/p&gt;
&lt;h2&gt;AI Is Starting to Act&lt;/h2&gt;
&lt;p&gt;That excuse is on its way out. This post is about how language models went from talking to actually &lt;strong&gt;acting&lt;/strong&gt;. Three things made it happen: agents, MCP, and Docker.&lt;/p&gt;
&lt;p&gt;They got hands, basically. Not literal ones.&lt;/p&gt;
&lt;p&gt;What I mean is &lt;strong&gt;agents&lt;/strong&gt;. Small programs that let a model reach out and touch real tools.&lt;/p&gt;
&lt;p&gt;Like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sending a Slack message&lt;/li&gt;
&lt;li&gt;Checking a Stripe payment&lt;/li&gt;
&lt;li&gt;Opening a pull request on GitHub&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No magic. Just plumbing.&lt;/p&gt;
&lt;p&gt;The piece tying it together is &lt;strong&gt;MCP&lt;/strong&gt;, the &lt;a href=&quot;https://www.anthropic.com/news/model-context-protocol&quot;&gt;Model Context Protocol&lt;/a&gt;. It hands models a consistent, secure way to reach APIs, databases, and cloud services.&lt;/p&gt;
&lt;h2&gt;Let&apos;s Start with the Pain&lt;/h2&gt;
&lt;p&gt;First, some history. Why was any of this hard to begin with? Models have always been good at advice.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It can write code.&lt;/li&gt;
&lt;li&gt;Fix bugs.&lt;/li&gt;
&lt;li&gt;Even generate song lyrics.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then you ask for something trivial:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Can you send an email to a client?”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And it stares back. Metaphorically. Then:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“I&apos;d love to, but... I just generate words. I don&apos;t do stuff.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Honestly, fair.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The logic was there.&lt;/li&gt;
&lt;li&gt;The reasoning was solid.&lt;/li&gt;
&lt;li&gt;But action? That was outside the job description.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So people built a workaround. Hand the model &lt;strong&gt;tools&lt;/strong&gt;, wrapped in tiny helpers called &lt;strong&gt;agents&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;So What&apos;s MCP?&lt;/h2&gt;
&lt;p&gt;So what &lt;em&gt;is&lt;/em&gt; MCP, actually? And why does it carry so much weight here?&lt;/p&gt;
&lt;p&gt;MCP gives the whole thing structure:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;model&lt;/strong&gt; thinks.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;agent&lt;/strong&gt; acts.&lt;/li&gt;
&lt;li&gt;And &lt;strong&gt;MCP&lt;/strong&gt; is the cable that connects the brain to the hands.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Here&apos;s how it works, step by step&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;The model says what it wants — like “Send this message to Slack.”&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;host&lt;/strong&gt; passes that to the right agent (called an MCP server).&lt;/li&gt;
&lt;li&gt;The server does the thing — sends the message, makes the API call.&lt;/li&gt;
&lt;li&gt;The result goes back to the model, and it wraps up its reply.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Clean loop.&lt;/p&gt;
&lt;p&gt;The early days were not clean at all.&lt;/p&gt;
&lt;h2&gt;The Old Way Was a Headache&lt;/h2&gt;
&lt;p&gt;Nobody misses the old way. I&apos;ll remind you anyway.&lt;/p&gt;
&lt;p&gt;You had to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Manually spin up MCP servers&lt;/li&gt;
&lt;li&gt;Deal with different stacks (Python, Node, Chromium... all arguing with each other)&lt;/li&gt;
&lt;li&gt;Store API keys in plain JSON (a security team&apos;s nightmare)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Need more than one agent? Welcome to YAML files, container logs, and a creeping sense of dread.&lt;/p&gt;
&lt;p&gt;You wanted to check a Stripe payment. Somehow you ended up in a Kubernetes support group.&lt;/p&gt;
&lt;h2&gt;And Then Came Docker&lt;/h2&gt;
&lt;p&gt;Docker is where this turns. It made MCP agents easy to launch, safe to isolate, and far less painful to manage.&lt;/p&gt;
&lt;p&gt;Picture it this way.&lt;/p&gt;
&lt;p&gt;Your AI gets hands, and Docker hands those hands a pair of &lt;strong&gt;gloves&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Clean. Contained. Controlled.&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;So what does that mean for you?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Each agent runs in its &lt;strong&gt;own container&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;It only sees what &lt;em&gt;you&lt;/em&gt; allow&lt;/li&gt;
&lt;li&gt;No mess on your system&lt;/li&gt;
&lt;li&gt;No version conflicts&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Browse the full &lt;a href=&quot;https://www.docker.com/products/mcp-catalog-and-toolkit/&quot;&gt;Docker MCP Toolkit&lt;/a&gt;, then go look at the &lt;a href=&quot;https://hub.docker.com/catalogs/mcp&quot;&gt;MCP Servers on Docker Hub&lt;/a&gt;. Over 100 officially supported tools sit there, ready to launch in seconds.&lt;/p&gt;
&lt;h2&gt;And It Gets Better&lt;/h2&gt;
&lt;p&gt;Docker Desktop ships the &lt;strong&gt;MCP Toolkit&lt;/strong&gt; now, with over &lt;strong&gt;100 ready-to-use agents&lt;/strong&gt; pulled straight from Docker Hub.&lt;/p&gt;
&lt;p&gt;Want to run one?&lt;/p&gt;
&lt;p&gt;Three steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Pick one&lt;/li&gt;
&lt;li&gt;Docker spins up a container&lt;/li&gt;
&lt;li&gt;And the agent starts listening for model commands&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Done.&lt;/p&gt;
&lt;p&gt;No command-line gymnastics. No weeping over config files.&lt;/p&gt;
&lt;h2&gt;Fixing the Duplicate Agent Problem&lt;/h2&gt;
&lt;p&gt;Here&apos;s another old annoyance. Several apps would each try to spin up the &lt;em&gt;same&lt;/em&gt; agent, again and again.&lt;/p&gt;
&lt;p&gt;Which got you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Duplicate containers&lt;/li&gt;
&lt;li&gt;Double the tokens&lt;/li&gt;
&lt;li&gt;Wasted bandwidth&lt;/li&gt;
&lt;li&gt;And way more complexity than necessary&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These days?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;One agent. One container.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Multiple clients can use it.&lt;/li&gt;
&lt;li&gt;No duplication.&lt;/li&gt;
&lt;li&gt;No drama.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;But Is It Safe?&lt;/h2&gt;
&lt;p&gt;This is a lot of power. So is it safe?&lt;/p&gt;
&lt;p&gt;It is, and the reason is the boundary.&lt;/p&gt;
&lt;p&gt;Agents run inside &lt;strong&gt;isolated Docker containers&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;So:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;They can only see what you explicitly share&lt;/li&gt;
&lt;li&gt;They don&apos;t mess with your core system&lt;/li&gt;
&lt;li&gt;They can&apos;t reach places they&apos;re not supposed to&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Docker draws those lines &lt;strong&gt;by default&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;You &lt;em&gt;can&lt;/em&gt; tear them down with &lt;code&gt;--privileged&lt;/code&gt; or by mounting the Docker socket. Unless you enjoy living dangerously, don&apos;t.&lt;/p&gt;
&lt;p&gt;Keep the defaults. Use verified agents.&lt;/p&gt;
&lt;h2&gt;So Who&apos;s This For?&lt;/h2&gt;
&lt;p&gt;Who gets the most out of this?&lt;/p&gt;
&lt;p&gt;If you&apos;re:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Using GPT, Claude, or Copilot — and want them to &lt;em&gt;do&lt;/em&gt; stuff, not just &lt;em&gt;talk&lt;/em&gt; about it&lt;/li&gt;
&lt;li&gt;Working in DevOps — and tired of writing the same glue code over and over&lt;/li&gt;
&lt;li&gt;A product manager who wants AI plugged into GitHub, Jira, Stripe, or Slack... in &lt;em&gt;minutes&lt;/em&gt;, not hours&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then yes, this is for you.&lt;/p&gt;
&lt;p&gt;What you get:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An agent running in just a few clicks&lt;/li&gt;
&lt;li&gt;Built-in safety and isolation&lt;/li&gt;
&lt;li&gt;And if you need to scale? Just add more agents. That&apos;s it.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Bottom Line&lt;/h2&gt;
&lt;p&gt;The model doesn&apos;t only think now. It acts.&lt;/p&gt;
&lt;p&gt;Pair &lt;strong&gt;MCP + Docker&lt;/strong&gt; and it acts fast, safely, and at scale.&lt;/p&gt;
&lt;p&gt;So if you want to give your model real-world reach, this is how you do it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No hacky scripts.&lt;/li&gt;
&lt;li&gt;Just agents that work.&lt;/li&gt;
&lt;li&gt;From prompt… to production.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Clean. Safe. Smart.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Welcome to the agent-powered era, my friends.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Thank you for reading! Don&apos;t forget to check out the &lt;a href=&quot;https://youtu.be/pCGEXT1qZHY&quot;&gt;video version&lt;/a&gt; for additional insights and visuals.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>AI &amp; MLOps</category><category>AI</category><category>AI Agents</category><category>MCP</category><category>GPT</category><category>DevOps</category><category>Slack</category><category>API</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>10 Real Terraform Interview Questions (and Expert Answers!) — 2025 DevOps Guide</title><link>https://heyvaldemar.com/10-real-terraform-interview-questions-and-expert-answers-2025-devops-guide/</link><guid isPermaLink="true">https://heyvaldemar.com/10-real-terraform-interview-questions-and-expert-answers-2025-devops-guide/</guid><description>Ace your Terraform interview with 10 real questions, expert answers, and best practices on state, drift, modules, and security.</description><pubDate>Mon, 12 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You know the line that makes engineers sweat:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“You&apos;ve got a Terraform interview tomorrow. You ready?”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Relax.&lt;/p&gt;
&lt;p&gt;Here are &lt;strong&gt;10 Terraform questions&lt;/strong&gt; that show up in actual interviews, plus how to answer them without flailing.&lt;/p&gt;
&lt;p&gt;But the answers matter more than the questions. I&apos;ll explain each one plainly, with real examples, so you don&apos;t just parrot back a definition. You&apos;ll actually get it.&lt;/p&gt;
&lt;p&gt;import VideoPlayer from &quot;@components/VideoPlayer.astro&quot;;&lt;/p&gt;
&lt;p&gt;&amp;lt;VideoPlayer
videoId=&quot;qaBvwjCilIc&quot;
title=&quot;10 Real Terraform Interview Questions (and Expert Answers!) - 2025 DevOps Guide&quot;
/&amp;gt;&lt;/p&gt;
&lt;h2&gt;Question 1: What is Terraform and why does it matter?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.hashicorp.com/terraform&quot;&gt;Terraform&lt;/a&gt; is how you talk to your infrastructure with code instead of clicks.&lt;/p&gt;
&lt;p&gt;You&apos;re not poking around the AWS console at 3 a.m. like it&apos;s 2009.&lt;/p&gt;
&lt;p&gt;You write code. Something like: &quot;I need a VPC, three subnets, and a database.&quot;&lt;/p&gt;
&lt;p&gt;And Terraform answers: &quot;Got it. I&apos;ll build it. I&apos;ll check it. And I&apos;ll keep it that way.&quot;&lt;/p&gt;
&lt;p&gt;Convenience is the small part. The real win is control, and repeatability. That&apos;s the whole point of &lt;a href=&quot;https://developer.hashicorp.com/terraform/tutorials/aws-get-started/infrastructure-as-code&quot;&gt;infrastructure as code&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As of 2025, Terraform sits at version &lt;a href=&quot;https://github.com/hashicorp/terraform/releases&quot;&gt;1.11&lt;/a&gt;. Actively developed, widely deployed, and still the default tool for defining infrastructure.&lt;/p&gt;
&lt;h2&gt;Question 2: How does Terraform talk to the cloud?&lt;/h2&gt;
&lt;p&gt;Through &lt;a href=&quot;https://developer.hashicorp.com/terraform/language/providers&quot;&gt;providers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Think of a provider as an adapter. It knows how to speak to a given API:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://registry.terraform.io/providers/hashicorp/aws/latest&quot;&gt;AWS&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://registry.terraform.io/providers/hashicorp/azurerm/latest&quot;&gt;Azure&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://registry.terraform.io/providers/hashicorp/kubernetes/latest&quot;&gt;Kubernetes&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://registry.terraform.io/providers/integrations/github/latest&quot;&gt;GitHub&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;and &lt;a href=&quot;https://registry.terraform.io/browse/providers&quot;&gt;tons more&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You declare &lt;code&gt;required_providers&lt;/code&gt; in your code. Run &lt;code&gt;terraform init&lt;/code&gt;, and it pulls the right versions, then verifies their SHA-256 hashes.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;terraform {
  required_providers {
    aws = {
      source  = &quot;hashicorp/aws&quot;
      version = &quot;~&amp;gt; 5.97.0&quot;
    }
  }
}

provider &quot;aws&quot; {
  region = &quot;us-west-2&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;.terraform.lock.hcl&lt;/code&gt; file pins those versions in place.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;provider &quot;registry.terraform.io/hashicorp/aws&quot; {
  version     = &quot;5.97.0&quot;
  constraints = &quot;~&amp;gt; 5.97.0&quot;
  hashes = [
    &quot;h1:aaa111...&quot;,
    &quot;h1:bbb222...&quot;,
    &quot;h1:ccc333...&quot;
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Same idea as package dependencies. Don&apos;t pin them, and you&apos;ll get surprises. Surprises in production?&lt;/p&gt;
&lt;p&gt;Yeah. Not fun.&lt;/p&gt;
&lt;h2&gt;Question 3: What is terraform.tfstate and why is it critical?&lt;/h2&gt;
&lt;p&gt;It&apos;s Terraform&apos;s memory.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://developer.hashicorp.com/terraform/language/state&quot;&gt;state&lt;/a&gt; file tracks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What resources exist&lt;/li&gt;
&lt;li&gt;Their IDs&lt;/li&gt;
&lt;li&gt;Their attributes&lt;/li&gt;
&lt;li&gt;And how they&apos;re all wired together&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Lose it, and Terraform forgets &lt;em&gt;everything&lt;/em&gt; you&apos;ve built. So it might decide to recreate your entire production stack from scratch.&lt;/p&gt;
&lt;p&gt;Where do you keep state safely? Two solid options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.hashicorp.com/terraform/language/settings/backends/s3&quot;&gt;S3 bucket with native locking&lt;/a&gt; &lt;em&gt;(available since Terraform 1.11)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.hashicorp.com/terraform/cloud-docs&quot;&gt;HCP Terraform&lt;/a&gt; &lt;em&gt;(formerly Terraform Cloud)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::tip
Never, ever commit your state file to git. Not even to a private repo. Not even &quot;just this once.&quot; Just... don&apos;t.
:::&lt;/p&gt;
&lt;h2&gt;Question 4: What is the actual function of plan, apply, destroy, and refresh?&lt;/h2&gt;
&lt;p&gt;Read them as: preview, execute, delete, sync.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;terraform plan&lt;/code&gt;: shows what will change&lt;/li&gt;
&lt;li&gt;&lt;code&gt;terraform apply&lt;/code&gt;: actually makes the changes&lt;/li&gt;
&lt;li&gt;&lt;code&gt;terraform destroy&lt;/code&gt;: deletes everything in your config&lt;/li&gt;
&lt;li&gt;&lt;code&gt;terraform refresh&lt;/code&gt;: syncs the state with reality&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the upcoming Terraform &lt;a href=&quot;https://github.com/hashicorp/terraform/releases&quot;&gt;1.12&lt;/a&gt;, plan runs refresh for you. No separate command.&lt;/p&gt;
&lt;p&gt;🎯 &lt;strong&gt;Advice:&lt;/strong&gt; Always run &lt;code&gt;terraform plan&lt;/code&gt; before &lt;code&gt;terraform apply&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Especially on a Friday. Especially late at night.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Especially in prod.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Question 5: What is drift, and how do you detect it?&lt;/h2&gt;
&lt;p&gt;Drift is when your &lt;a href=&quot;https://developer.hashicorp.com/terraform/tutorials/cloud/drift-detection&quot;&gt;real infrastructure stops matching your code&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Say your config declares &lt;code&gt;t3.micro&lt;/code&gt;. Then someone goes into the AWS console and bumps it to &lt;code&gt;t3.large&lt;/code&gt; by hand.&lt;/p&gt;
&lt;p&gt;Terraform has no idea. It only notices the gap when you run &lt;code&gt;terraform plan&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;So how do you catch it?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On &lt;a href=&quot;https://developer.hashicorp.com/terraform/tutorials/cloud/drift-detection&quot;&gt;HCP Terraform&lt;/a&gt;, you get a built-in drift detector. It can fire alerts to Slack or Teams through &lt;a href=&quot;https://developer.hashicorp.com/terraform/cloud-docs/workspaces/settings/notifications&quot;&gt;notifications&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Not on HCP Terraform or Terraform Enterprise? Then run &lt;code&gt;terraform plan&lt;/code&gt; in CI at least once a day.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Drift isn&apos;t a bug. It&apos;s a warning. Someone changed something &lt;strong&gt;outside of Terraform&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;And remember: &lt;strong&gt;Infrastructure as Code does not like human hands.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Question 6: What are modules and how do you use them without creating a mess?&lt;/h2&gt;
&lt;p&gt;A &lt;a href=&quot;https://developer.hashicorp.com/terraform/language/modules&quot;&gt;module&lt;/a&gt; is basically a function for your infrastructure. Write it once, reuse it everywhere.&lt;/p&gt;
&lt;p&gt;Picture a small VPC module. You run it in dev, staging, and prod. Only the IP ranges and names change. The logic underneath stays identical.&lt;/p&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Keep it simple:&lt;/strong&gt; one module — one purpose. Don&apos;t build a single module that spins up a VPC, provisions a database, and pings Slack on the side.&lt;/p&gt;
&lt;p&gt;Once your module is solid, you&apos;ve got options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.hashicorp.com/terraform/registry/modules/publish&quot;&gt;Publish it to the Terraform Registry&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Or even &lt;a href=&quot;https://github.com/hashicorp/terraform/issues/31463&quot;&gt;store it as an OCI artifact&lt;/a&gt; &lt;em&gt;(this feature is experimental in Terraform 1.12)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Question 7: Variables vs Secrets: where&apos;s the line?&lt;/h2&gt;
&lt;p&gt;Simple distinction. &lt;a href=&quot;https://developer.hashicorp.com/terraform/language/values/variables&quot;&gt;Variables&lt;/a&gt; and &lt;a href=&quot;https://developer.hashicorp.com/terraform/tutorials/configuration-language/sensitive-variables&quot;&gt;secrets&lt;/a&gt; are not the same thing.&lt;/p&gt;
&lt;p&gt;Use &lt;strong&gt;variables&lt;/strong&gt; for anything that changes between environments.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Secrets&lt;/strong&gt; are another matter. &lt;strong&gt;Never hardcode them. Ever.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&apos;ve watched this happen on real projects. Don&apos;t be the person who writes:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;password = &quot;supersecret123&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So where do secrets belong?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html&quot;&gt;AWS Secrets Manager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.vaultproject.io/&quot;&gt;HashiCorp Vault&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Or just &lt;a href=&quot;https://developer.hashicorp.com/terraform/tutorials/configuration-language/sensitive-variables&quot;&gt;mark variables as sensitive&lt;/a&gt; in &lt;a href=&quot;https://developer.hashicorp.com/terraform/cloud-docs&quot;&gt;HCP Terraform&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you &lt;em&gt;do&lt;/em&gt; pass a secret as a variable, set &lt;code&gt;sensitive = true&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;That keeps it out of the &lt;code&gt;terraform plan&lt;/code&gt; output.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;variable &quot;db_password&quot; {
  description = &quot;Database password&quot;
  type        = string
  sensitive   = true
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And since &lt;a href=&quot;https://developer.hashicorp.com/terraform/cli/config/environment-variables#credentials-helper-configuration&quot;&gt;Terraform 1.10&lt;/a&gt;, you can use &lt;strong&gt;short-lived values&lt;/strong&gt; to keep secrets &lt;em&gt;out&lt;/em&gt; of your state files entirely.&lt;/p&gt;
&lt;h2&gt;Question 8: What if terraform apply fails halfway through?&lt;/h2&gt;
&lt;p&gt;It happens. To junior devs, to senior engineers, to me.&lt;/p&gt;
&lt;p&gt;Here&apos;s the recovery, step by step:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Run &lt;code&gt;terraform state list&lt;/code&gt; to see what was created.&lt;/li&gt;
&lt;li&gt;If the resource exists in the cloud but not in the state — use &lt;code&gt;terraform import&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If it shouldn&apos;t exist — remove it from state with &lt;code&gt;terraform state rm&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Then re-run &lt;code&gt;terraform plan&lt;/code&gt; and check that everything looks clean.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Terraform now supports &lt;a href=&quot;https://developer.hashicorp.com/terraform/language/moved&quot;&gt;moved&lt;/a&gt; and &lt;a href=&quot;https://developer.hashicorp.com/terraform/language/resources/syntax#removing-resources&quot;&gt;removed&lt;/a&gt; blocks. So you can refactor without hand-editing the state file. Less risk, no manual hacking, clean refactors. Nice.&lt;/p&gt;
&lt;h2&gt;Question 9: How do you separate dev, stage, and prod?&lt;/h2&gt;
&lt;p&gt;Three approaches that hold up in practice:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.hashicorp.com/terraform/cloud-docs/workspaces&quot;&gt;Workspaces&lt;/a&gt; — simple, but hard to scale&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Folder structure&lt;/strong&gt; like &lt;code&gt;environments/dev&lt;/code&gt;, &lt;code&gt;stage&lt;/code&gt;, &lt;code&gt;prod&lt;/code&gt; — the golden standard&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://terragrunt.gruntwork.io/&quot;&gt;Terragrunt&lt;/a&gt; — great for multi-account or multi-team setups&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;🧠 &lt;strong&gt;Whatever you pick, one rule is non-negotiable:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;🎯 &lt;strong&gt;One backend → one state → one environment.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Never mix dev and prod in the same state file. That&apos;s storing fire and gasoline in the same drawer.&lt;/p&gt;
&lt;h2&gt;Question 10: How do you shift security left?&lt;/h2&gt;
&lt;p&gt;Security isn&apos;t a step you bolt on later. It starts at &lt;code&gt;terraform plan&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;That&apos;s where &lt;strong&gt;Policy as Code&lt;/strong&gt; earns its keep. Tools like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.openpolicyagent.org/&quot;&gt;OPA (Open Policy Agent)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.hashicorp.com/sentinel&quot;&gt;Sentinel&lt;/a&gt; &lt;em&gt;(by HashiCorp)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.checkov.io/&quot;&gt;Checkov&lt;/a&gt; &lt;em&gt;(by Bridgecrew)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://snyk.io/product/infrastructure-as-code-security/&quot;&gt;Snyk IaC&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;…catch problems before they ship.&lt;/p&gt;
&lt;p&gt;🔒 &lt;strong&gt;For example:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You write a rule: &quot;All S3 buckets must use KMS.&quot; Wired up correctly, Terraform checks that during the plan. Rule fails, run blocked.&lt;/p&gt;
&lt;p&gt;Some of these tools live in your CI pipeline. Others plug straight into &lt;a href=&quot;https://developer.hashicorp.com/terraform/cloud-docs&quot;&gt;HCP Terraform&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Want to push further? &lt;a href=&quot;https://developer.hashicorp.com/terraform/cli/commands/test&quot;&gt;terraform test&lt;/a&gt; lets you write unit tests for your modules, and it drops right into CI.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Security belongs in how you build, not in a cleanup you do afterward.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;That&apos;s the set. 10 questions, 10 real answers. Not to help you scrape through an interview, but to walk in &lt;strong&gt;confident&lt;/strong&gt;, &lt;strong&gt;prepared&lt;/strong&gt;, and &lt;strong&gt;dangerously well-informed&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Thank you for reading! Don&apos;t forget to check out the &lt;a href=&quot;https://youtu.be/qaBvwjCilIc&quot;&gt;video version&lt;/a&gt; for additional insights and visuals.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>Terraform</category><category>IaC</category><category>Interview Questions</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>GitOps on AWS — Real-World DevOps Pipeline with Argo CD, Terraform &amp; EKS</title><link>https://heyvaldemar.com/gitops-on-aws-real-world-devops-pipeline-with-argo-cd-terraform-and-eks/</link><guid isPermaLink="true">https://heyvaldemar.com/gitops-on-aws-real-world-devops-pipeline-with-argo-cd-terraform-and-eks/</guid><description>Build a production-grade GitOps pipeline on AWS with EKS, Argo CD, Terraform, Vault, and GitHub Actions. Real architecture — systems that scale.</description><pubDate>Tue, 22 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This is how I built a production-grade GitOps pipeline on AWS. Fully containerized, drawn straight from what I run in production.&lt;/p&gt;
&lt;p&gt;No buzzwords. No clickbait. The architecture works, and the mindset behind it holds up as you grow.&lt;/p&gt;
&lt;p&gt;import VideoPlayer from &quot;@components/VideoPlayer.astro&quot;;&lt;/p&gt;
&lt;p&gt;&amp;lt;VideoPlayer
videoId=&quot;PpEfaQq2Umk&quot;
title=&quot;GitOps on AWS - Real-World DevOps Pipeline with Argo CD, Terraform &amp;amp; EKS&quot;
/&amp;gt;&lt;/p&gt;
&lt;h2&gt;Why I Chose GitOps&lt;/h2&gt;
&lt;p&gt;GitOps is about control. Git becomes the one place that tells the truth about your system.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Every change goes through a pull request.&lt;/li&gt;
&lt;li&gt;Every rollback is just a &lt;code&gt;git revert&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No guesswork. Nobody asking who deployed what on Friday night. By 2025 this stopped being a trend. If your team is serious about infrastructure, it&apos;s the floor you start from, not the ceiling you reach for.&lt;/p&gt;
&lt;p&gt;So why does my setup look the way it does? Start with the stack.&lt;/p&gt;
&lt;h2&gt;My Stack at a Glance&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;At the core, I use &lt;a href=&quot;https://aws.amazon.com/eks/&quot;&gt;Amazon EKS&lt;/a&gt; — Amazon&apos;s managed Kubernetes&lt;/li&gt;
&lt;li&gt;Docker images are built and pushed to &lt;a href=&quot;https://aws.amazon.com/ecr/&quot;&gt;Amazon ECR&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Manifests live in Git. &lt;a href=&quot;https://argo-cd.readthedocs.io/&quot;&gt;Argo CD&lt;/a&gt; syncs the cluster automatically&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.terraform.io/&quot;&gt;Terraform&lt;/a&gt; provisions everything — from VPC to namespaces&lt;/li&gt;
&lt;li&gt;Secrets are managed securely with &lt;a href=&quot;https://www.vaultproject.io/&quot;&gt;HashiCorp Vault&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/features/actions&quot;&gt;GitHub Actions&lt;/a&gt; ties it all together&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One &lt;code&gt;terraform apply&lt;/code&gt;. That gets you a reproducible platform, codified end to end, with nothing done by hand.&lt;/p&gt;
&lt;h2&gt;Why Containers?&lt;/h2&gt;
&lt;p&gt;A container is the smallest unit of reliability I know of. It runs the same way in dev, in staging, and in production. Isolated, predictable, pinned to a version. CI builds the image and tags it, say &lt;code&gt;release-2025.04.16-prod&lt;/code&gt;, then pushes it to &lt;a href=&quot;https://aws.amazon.com/ecr/&quot;&gt;Amazon ECR&lt;/a&gt;. What runs in production is that exact artifact, byte for byte.&lt;/p&gt;
&lt;p&gt;You know the old joke about how it works on my machine? Containers retire it. You ship systems instead of chaos.&lt;/p&gt;
&lt;h2&gt;The GitOps Mindset Shift&lt;/h2&gt;
&lt;p&gt;GitOps asks you to rethink one thing, and it trips up plenty of experienced teams. Here&apos;s the mistake I keep running into.&lt;/p&gt;
&lt;p&gt;They assume CI should handle deployments. Under GitOps it doesn&apos;t.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CI&apos;s job is simply to push changes to Git.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://argo-cd.readthedocs.io/&quot;&gt;Argo CD&lt;/a&gt; handles the deploy. On its own. On schedule. No manual triggers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That split is the whole point. Git holds the truth. CI is just the courier that gets your change there.&lt;/p&gt;
&lt;h2&gt;How It All Connects&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;CI runs on &lt;a href=&quot;https://github.com/features/actions&quot;&gt;GitHub Actions&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;It builds the Docker image, pushes it to &lt;a href=&quot;https://aws.amazon.com/ecr/&quot;&gt;Amazon ECR&lt;/a&gt;, updates Helm values, and commits to Git.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://argo-cd.readthedocs.io/&quot;&gt;Argo CD&lt;/a&gt; detects changes and applies them to the cluster.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.terraform.io/&quot;&gt;Terraform&lt;/a&gt; provisions the entire platform, Argo CD included.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.vaultproject.io/&quot;&gt;Vault&lt;/a&gt; integrates securely, providing secrets at runtime.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So there are no plain-text tokens sitting around. No unencrypted environment variables either.&lt;/p&gt;
&lt;p&gt;This stack does the job, and it holds up when something goes wrong.&lt;/p&gt;
&lt;h2&gt;Hard-Earned Lessons&lt;/h2&gt;
&lt;p&gt;Getting here took a while, and I paid for a few of these the hard way. Here&apos;s what I&apos;d tell you so you skip my mistakes.&lt;/p&gt;
&lt;h3&gt;1. Bootstrapping&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://argo-cd.readthedocs.io/&quot;&gt;Argo CD&lt;/a&gt; doesn&apos;t magically install itself.&lt;/p&gt;
&lt;p&gt;You need a plan for that first install. I use &lt;a href=&quot;https://www.terraform.io/&quot;&gt;Terraform&lt;/a&gt; and the &lt;a href=&quot;https://registry.terraform.io/providers/hashicorp/helm/latest&quot;&gt;Helm Provider&lt;/a&gt; to automate it.&lt;/p&gt;
&lt;h3&gt;2. Namespaces&lt;/h3&gt;
&lt;p&gt;Never run Argo CD alongside your applications.&lt;/p&gt;
&lt;p&gt;Keep it isolated. Your future self will thank you for it.&lt;/p&gt;
&lt;h3&gt;3. Secrets&lt;/h3&gt;
&lt;p&gt;If your secrets live in YAML files, that isn&apos;t GitOps. That&apos;s hopeOps.&lt;/p&gt;
&lt;p&gt;Use &lt;a href=&quot;https://www.vaultproject.io/&quot;&gt;Vault&lt;/a&gt; or &lt;a href=&quot;https://aws.amazon.com/secrets-manager/&quot;&gt;AWS Secrets Manager&lt;/a&gt;. Credentials never go in the open.&lt;/p&gt;
&lt;h2&gt;Monitoring: The Non-Negotiable&lt;/h2&gt;
&lt;p&gt;If your monitoring is users calling you at 3 AM, that isn&apos;t monitoring. It&apos;s a nightmare with a phone number.&lt;/p&gt;
&lt;p&gt;For metrics I run &lt;a href=&quot;https://prometheus.io/&quot;&gt;Prometheus&lt;/a&gt; and &lt;a href=&quot;https://grafana.com/&quot;&gt;Grafana&lt;/a&gt;. &lt;a href=&quot;https://grafana.com/oss/loki/&quot;&gt;Loki&lt;/a&gt; handles logs, &lt;a href=&quot;https://prometheus.io/docs/alerting/latest/alertmanager/&quot;&gt;Alertmanager&lt;/a&gt; handles alerts. &lt;a href=&quot;https://argo-cd.readthedocs.io/&quot;&gt;Argo CD&lt;/a&gt; exposes its own metrics too, so the moment the cluster drifts from Git, I see it.&lt;/p&gt;
&lt;p&gt;Monitoring isn&apos;t a bolt-on you add later. Skip it and you&apos;re flying blind.&lt;/p&gt;
&lt;h2&gt;What Success Looks Like&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Deployment time: minutes, not hours.&lt;/li&gt;
&lt;li&gt;Rollbacks: one click.&lt;/li&gt;
&lt;li&gt;New environments: one command.&lt;/li&gt;
&lt;li&gt;New developers: clone and go.&lt;/li&gt;
&lt;li&gt;Everything documented, repeatable, and under control.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of that is hype. That&apos;s the day-to-day.&lt;/p&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;This is more than a list of tools. It&apos;s a way of working. Containers, infrastructure as code, every change routed through Git: that&apos;s what a mature system looks like in 2025. GitOps was never really about YAML. It&apos;s about building something you can actually trust.&lt;/p&gt;
&lt;p&gt;Thank you for reading! Don&apos;t forget to check out the &lt;a href=&quot;https://youtu.be/PpEfaQq2Umk&quot;&gt;video version&lt;/a&gt; for additional insights and visuals.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>GitOps</category><category>AWS</category><category>Kubernetes</category><category>Argo CD</category><category>Terraform</category><category>IaC</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Why AI Fails Without DevOps — What No One Tells You</title><link>https://heyvaldemar.com/why-ai-fails-without-devops-what-no-one-tells-you/</link><guid isPermaLink="true">https://heyvaldemar.com/why-ai-fails-without-devops-what-no-one-tells-you/</guid><description>Without DevOps, AI fails fast. Learn how containers, CI/CD, and GitOps keep LLMs and ML systems like OpenAI and Hugging Face running at scale.</description><pubDate>Tue, 08 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Everyone&apos;s hyped about AI. Almost nobody talks about the engine underneath it.&lt;/p&gt;
&lt;p&gt;This post is about how DevOps and containers turn AI from a demo into something you can actually ship.&lt;/p&gt;
&lt;p&gt;import VideoPlayer from &quot;@components/VideoPlayer.astro&quot;;&lt;/p&gt;
&lt;p&gt;&amp;lt;VideoPlayer
videoId=&quot;eFbkWXYXJH0&quot;
title=&quot;Why AI Fails Without DevOps - What No One Tells You&quot;
/&amp;gt;&lt;/p&gt;
&lt;h2&gt;Everyone Talks About AI, No One Talks About What Powers It&lt;/h2&gt;
&lt;p&gt;AI gets all the attention right now. LLMs, code generation, multimodality, the endless AGI chatter.&lt;/p&gt;
&lt;p&gt;But ask what&apos;s under the hood and the room goes quiet. These models are huge. They want hundreds of gigabytes, GPUs, stability, versioning, monitoring. None of that runs itself.&lt;/p&gt;
&lt;p&gt;So here&apos;s the question worth asking.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What actually makes this work in production?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Strip out the DevOps foundation and you&apos;re left with a cool demo. Not a product. So in this post I want to walk through why &lt;strong&gt;DevOps and containers are what make AI real.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;The Magic Isn&apos;t Magic. It&apos;s DevOps&lt;/h2&gt;
&lt;p&gt;ChatGPT answers in two seconds. Midjourney paints in five. Behind that? Dozens of services, container orchestration, model loading, GPU balancing. The &quot;magic&quot; is just plumbing you don&apos;t see.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OpenAI&lt;/strong&gt; serves millions of requests per second. They lean on containers, autoscaling, canary deployments. Not because it&apos;s trendy. Because there&apos;s no other way to do it.&lt;/p&gt;
&lt;p&gt;Now look at &lt;strong&gt;Hugging Face Spaces&lt;/strong&gt;. Every app runs in its own container, which is exactly why one of them can go from 1 user to 10,000 without falling over. Pull DevOps out from under that and the whole thing collapses.&lt;/p&gt;
&lt;h2&gt;DevOps Is the Backbone of AI&lt;/h2&gt;
&lt;p&gt;Training a model?&lt;/p&gt;
&lt;p&gt;You need the right drivers, the right CUDA, the right PyTorch version. &lt;strong&gt;Containers pin all of that in a minute.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Want training, testing, and deployment to run themselves? &lt;strong&gt;Then you need CI/CD, monitoring, and alerting.&lt;/strong&gt; No way around it.&lt;/p&gt;
&lt;p&gt;Need to version models, trace what changed, and log every inference? &lt;strong&gt;Now you&apos;re squarely in DevOps territory.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&apos;ve watched teams fine-tune a model and then realize nobody could reproduce the result. It had been trained on a stale dataset. No pipeline. No versioning. No record of what actually happened. That&apos;s not bad luck. That&apos;s a missing process.&lt;/p&gt;
&lt;h2&gt;Containers Are the AI Team&apos;s Secret Weapon&lt;/h2&gt;
&lt;p&gt;Containers are &lt;strong&gt;a force multiplier&lt;/strong&gt; for AI teams. Plain and simple.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dev environments? Isolated.&lt;/li&gt;
&lt;li&gt;Testing? Repeatable.&lt;/li&gt;
&lt;li&gt;Model versions? Locked, tagged, reproducible.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Stability AI trained their models across GPU clusters&lt;/strong&gt;, with each node running inside a container so the results stayed consistent.&lt;/p&gt;
&lt;p&gt;Without containers, your infrastructure becomes a minefield. An AI team running without DevOps is a pilot with a plane and no runway.&lt;/p&gt;
&lt;h2&gt;Without DevOps You Get Chaos&lt;/h2&gt;
&lt;p&gt;Here&apos;s what I&apos;ve watched happen, more than once:&lt;/p&gt;
&lt;p&gt;✅ Model trained → ❌ weights overwritten by accident.&lt;br&gt;
✅ Inference works locally → ❌ fails in prod.&lt;br&gt;
✅ Upgraded PyTorch → ❌ CI/CD crashes across the board.&lt;/p&gt;
&lt;p&gt;None of that is a “bad engineer.” Every one of those is a &lt;strong&gt;DevOps problem.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;DevOps is the thing that brings order. It&apos;s what makes sure the thing that worked today still works tomorrow.&lt;/p&gt;
&lt;h2&gt;Your AI DevOps Stack: What Real Teams Use&lt;/h2&gt;
&lt;p&gt;So here&apos;s what a real DevOps stack looks like for a modern AI team. Built for scale, reproducibility, and your own sanity.&lt;/p&gt;
&lt;h3&gt;Docker&lt;/h3&gt;
&lt;p&gt;For reproducible environments, so your code runs the same everywhere, from your laptop to a production cluster.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.docker.com/&quot;&gt;docker.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Testcontainers + DVC&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.testcontainers.org/&quot;&gt;Testcontainers&lt;/a&gt;: Spin up real services (like databases or queues) during testing.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dvc.org/&quot;&gt;DVC (Data Version Control)&lt;/a&gt;: Version your datasets just like code — essential for ML reproducibility.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;GitHub Actions / GitLab CI/CD&lt;/h3&gt;
&lt;p&gt;Automate testing, model training, and deployment pipelines with modern CI/CD tools.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/features/actions&quot;&gt;GitHub Actions&lt;/a&gt; | &lt;a href=&quot;https://docs.gitlab.com/ee/ci/&quot;&gt;GitLab CI/CD&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Kubernetes + Argo CD&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://kubernetes.io/&quot;&gt;Kubernetes&lt;/a&gt;: Run and scale containers reliably.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://argo-cd.readthedocs.io/en/stable/&quot;&gt;Argo CD&lt;/a&gt;: GitOps-style continuous delivery. Keep production in sync with your Git repos.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Monitoring Stack&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://prometheus.io/&quot;&gt;Prometheus&lt;/a&gt; — Metrics collection&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://grafana.com/&quot;&gt;Grafana&lt;/a&gt; — Dashboards and visualization&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://grafana.com/oss/loki/&quot;&gt;Grafana Loki&lt;/a&gt; — Centralized log aggregation&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;ML Experiment Tracking&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mlflow.org/&quot;&gt;MLflow&lt;/a&gt; or &lt;a href=&quot;https://wandb.ai/&quot;&gt;Weights &amp;amp; Biases&lt;/a&gt;
Track metrics, parameters, and artifacts across experiments.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Security &amp;amp; Policy&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.hashicorp.com/en/products/vault&quot;&gt;HashiCorp Vault&lt;/a&gt; — Manage secrets securely&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.openpolicyagent.org/&quot;&gt;OPA&lt;/a&gt; — Enforce policies as code&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://snyk.io/&quot;&gt;Snyk&lt;/a&gt; — Scan for vulnerabilities in dependencies and containers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of this is a trendy checklist. It&apos;s what lets teams ship &lt;strong&gt;reliable, scalable, and production-grade AI systems&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Skip it and you&apos;re building sandcastles. Run it and you&apos;re shipping real products.&lt;/p&gt;
&lt;h2&gt;Where You Fit In&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Machine learning engineer?&lt;/strong&gt; Learn to write a Dockerfile. It&apos;ll spare your team a world of pain.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Working in DevOps?&lt;/strong&gt; Step into the ML side. You&apos;ll become the backbone of the team almost overnight.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Team lead?&lt;/strong&gt; Don&apos;t wait for something to break first. Put money into DevOps on day one.&lt;/p&gt;
&lt;p&gt;Skip it and your AI stays trapped in Jupyter notebooks. Invest in it and it turns into a real product.&lt;/p&gt;
&lt;h2&gt;The Real Magic of AI Is in the Delivery&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Containers. CI/CD. GitOps.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;These aren&apos;t buzzwords. They&apos;re the engineering core of AI in 2025.&lt;/p&gt;
&lt;p&gt;LLMs are impressive, sure. But the real magic is everything running cleanly, from training through deployment, at the exact moment you need it.&lt;/p&gt;
&lt;p&gt;Thank you for reading! Don&apos;t forget to check out the &lt;a href=&quot;https://youtu.be/eFbkWXYXJH0&quot;&gt;video version&lt;/a&gt; for additional insights and visuals.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>AI &amp; MLOps</category><category>AI</category><category>DevOps</category><category>Culture</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Master Container Security in 2025 — Best Practices &amp; Live Demo</title><link>https://heyvaldemar.com/master-container-security-in-2025-best-practices-and-live-demo/</link><guid isPermaLink="true">https://heyvaldemar.com/master-container-security-in-2025-best-practices-and-live-demo/</guid><description>Master container security in 2025 with proven Docker &amp; Kubernetes best practices. Learn how to automate scans using Docker Scout &amp; Snyk with real demos.</description><pubDate>Fri, 14 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This is a practical guide to container security. Protecting your applications, securing your supply chain, and staying ahead of new threats.&lt;/p&gt;
&lt;p&gt;It&apos;s 2025. The threats are more frequent now, smarter, and they do more damage. Compromised servers and stolen databases used to be the whole story. Not anymore. Container security sits at the center of it. Over 85% of organizations currently run containerized applications in production.&lt;/p&gt;
&lt;p&gt;Container adoption keeps growing, and the security risks grow with it. Attackers know this. So every one of us, whether you write code, run security, design systems, or do DevOps, has to take container security seriously.&lt;/p&gt;
&lt;p&gt;Here&apos;s what we&apos;ll cover:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Why container security matters in 2025&lt;/li&gt;
&lt;li&gt;Key best practices that every team should follow&lt;/li&gt;
&lt;li&gt;Practical examples using Docker Scout for local scanning and Snyk for continuous security checks in GitHub Actions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Time is short. Let&apos;s get into it.&lt;/p&gt;
&lt;p&gt;import VideoPlayer from &quot;@components/VideoPlayer.astro&quot;;&lt;/p&gt;
&lt;p&gt;&amp;lt;VideoPlayer
videoId=&quot;EoeoCTZAGuU&quot;
title=&quot;Master Container Security in 2025 - Best Practices &amp;amp; Live Demo&quot;
/&amp;gt;&lt;/p&gt;
&lt;h2&gt;Container Security in 2025&lt;/h2&gt;
&lt;p&gt;Why does any of this matter in 2025? Look at the architecture. Microservices are everywhere. A single application might be dozens or hundreds of containers, all talking to each other. That blows up your attack surface.&lt;/p&gt;
&lt;p&gt;The reason is simple. Every container is its own little environment, with its own OS packages, libraries, and config. One misconfigured container, or one running unpatched software, is enough. That single weakness can turn into a major breach.&lt;/p&gt;
&lt;p&gt;Supply chain attacks are climbing too. Attackers stopped going after your code alone. Now they go after whatever you depend on: base images, external libraries, third-party integrations.&lt;/p&gt;
&lt;p&gt;Put plainly, the container image itself is a place where things can go wrong. So we have to pay attention to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What&apos;s in our base image&lt;/li&gt;
&lt;li&gt;Our runtime environment&lt;/li&gt;
&lt;li&gt;The pipeline that builds and ships these containers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My goal here is to give you a practical way to shift security left. Catch issues early in development, where fixing them is cheap, and bake the checks into the work you already do every day&lt;/p&gt;
&lt;h2&gt;Key Best Practices in Container Security&lt;/h2&gt;
&lt;p&gt;So how do you actually secure containers? Below are seven core principles. They apply to Docker, to Kubernetes, and to any containerized setup you run.&lt;/p&gt;
&lt;h3&gt;1. Use Minimal Base Images&lt;/h3&gt;
&lt;p&gt;Bigger images carry more dependencies. More dependencies means more for an attacker to chew on. Reach for lightweight images like Alpine or distroless instead of a full Linux distribution whenever you can.&lt;/p&gt;
&lt;p&gt;Consider the size. Alpine is around 5 megabytes. Ubuntu or Debian run tens or hundreds of megabytes.&lt;/p&gt;
&lt;p&gt;Fewer packages, fewer security risks, smaller attack surface. That&apos;s the whole point.&lt;/p&gt;
&lt;h3&gt;2. Pin Your Versions&lt;/h3&gt;
&lt;p&gt;When you pull an image, don&apos;t write this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-docker&quot;&gt;FROM python:3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Be specific. Like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-docker&quot;&gt;FROM python:3.13.2-alpine
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That locks you to a known version and keeps surprise updates from breaking things or sneaking in a vulnerability. And never use &lt;code&gt;latest&lt;/code&gt; as a tag. Pull &lt;code&gt;FROM python:latest&lt;/code&gt; and you have no idea what you&apos;re actually getting. It can shift under you and break your app.&lt;/p&gt;
&lt;p&gt;Worse, an attacker can push a poisoned image under &lt;code&gt;latest&lt;/code&gt;, and your system pulls it without anyone noticing.&lt;/p&gt;
&lt;p&gt;Pin your versions. Stay in control.&lt;/p&gt;
&lt;h3&gt;3. Scan Early and Often&lt;/h3&gt;
&lt;p&gt;Scanning is not a one-and-done step. You scan for risk at every stage:&lt;/p&gt;
&lt;p&gt;✅ Development&lt;br&gt;
✅ Staging&lt;br&gt;
✅ Production&lt;/p&gt;
&lt;p&gt;Tools like &lt;a href=&quot;https://www.docker.com/products/docker-scout/&quot;&gt;Docker Scout&lt;/a&gt; and &lt;a href=&quot;https://snyk.io/&quot;&gt;Snyk&lt;/a&gt; handle this for you.&lt;/p&gt;
&lt;p&gt;Take &lt;a href=&quot;https://www.docker.com/products/docker-scout/&quot;&gt;Docker Scout&lt;/a&gt;. One command scans an image and shows you the risks right there.&lt;/p&gt;
&lt;p&gt;Build security into your pipeline on day one. Not as a patch you bolt on at the end.&lt;/p&gt;
&lt;h3&gt;4. Use Multi-Stage Builds&lt;/h3&gt;
&lt;p&gt;Leftover dependencies, libraries, and build tools sitting in your container? That&apos;s more surface for an attacker to use.&lt;/p&gt;
&lt;p&gt;Multi-stage builds fix this. Build your app in one stage, then copy only what you need into a final, smaller image.&lt;/p&gt;
&lt;p&gt;That strips out:&lt;/p&gt;
&lt;p&gt;🚫 Debugging tools&lt;br&gt;
🚫 Compilers&lt;br&gt;
🚫 Temporary files&lt;/p&gt;
&lt;p&gt;What you&apos;re left with is smaller, cleaner, and harder to attack.&lt;/p&gt;
&lt;h3&gt;5. Drop Unnecessary Privileges&lt;/h3&gt;
&lt;p&gt;Containers run as root by default. That&apos;s a big problem. An attacker who takes over a root container can move out across your system.&lt;/p&gt;
&lt;p&gt;Run as a non-root user instead. Specify it like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-docker&quot;&gt;USER 1000:1000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What does that actually do?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The first one thousand is the user ID. Just a regular non-root user in Linux.&lt;/li&gt;
&lt;li&gt;The second one thousand is the group ID, which puts it in a restricted group.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Run as a low-privilege user and a break-in stays contained. No system-wide access for whoever got in.&lt;/p&gt;
&lt;h3&gt;6. Keep Secrets Out of Images&lt;/h3&gt;
&lt;p&gt;Don&apos;t bake sensitive data into an image. It&apos;s a common mistake, and it leaks your secrets the moment the image gets pulled by the wrong person or shared where it shouldn&apos;t be.&lt;/p&gt;
&lt;p&gt;Keep secrets somewhere safe instead:&lt;/p&gt;
&lt;p&gt;✅ Environment variables&lt;br&gt;
✅ A secrets manager like &lt;a href=&quot;https://aws.amazon.com/secrets-manager/&quot;&gt;AWS Secrets Manager&lt;/a&gt;, &lt;a href=&quot;https://www.hashicorp.com/en/products/vault&quot;&gt;HashiCorp Vault&lt;/a&gt;, or &lt;a href=&quot;https://kubernetes.io/docs/concepts/configuration/secret/&quot;&gt;Kubernetes Secrets&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And if a secret does get hard-coded by accident, tools like &lt;a href=&quot;https://trufflesecurity.com/&quot;&gt;TruffleHog&lt;/a&gt; or &lt;a href=&quot;https://gitleaks.io/&quot;&gt;GitLeaks&lt;/a&gt; will catch it before it leaks.&lt;/p&gt;
&lt;p&gt;No secrets in images. None in repos. None in logs.&lt;/p&gt;
&lt;h3&gt;7. Monitor Runtime Behavior&lt;/h3&gt;
&lt;p&gt;Build-time scanning only gets you so far. You also have to watch what&apos;s actually happening in production.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://falco.org/&quot;&gt;Falco&lt;/a&gt; and &lt;a href=&quot;https://sysdig.com/&quot;&gt;Sysdig&lt;/a&gt; catch suspicious activity inside running containers.&lt;/p&gt;
&lt;p&gt;Here&apos;s a concrete case. &lt;a href=&quot;https://falco.org/&quot;&gt;Falco&lt;/a&gt; can alert you the moment a container starts a shell out of nowhere, which often means someone is now driving it.&lt;/p&gt;
&lt;p&gt;Other things to watch for:&lt;/p&gt;
&lt;p&gt;🚨 Unexpected file modifications&lt;br&gt;
🚨 High network activity from a container&lt;br&gt;
🚨 Containers trying to escalate privileges&lt;/p&gt;
&lt;p&gt;Watch the runtime and you catch threats while they&apos;re still small, before they turn into an incident.&lt;/p&gt;
&lt;h3&gt;Final Thoughts on Key Best Practices in Container Security&lt;/h3&gt;
&lt;p&gt;Follow these seven principles and you&apos;re already ahead of plenty of organizations still fumbling container security.&lt;/p&gt;
&lt;p&gt;Less is more here. Less complexity, lower privileges, fewer secrets. That&apos;s a more secure container.&lt;/p&gt;
&lt;h2&gt;Docker Scout for Local Image Scanning&lt;/h2&gt;
&lt;p&gt;Enough theory. Let&apos;s run &lt;a href=&quot;https://www.docker.com/products/docker-scout/&quot;&gt;Docker Scout&lt;/a&gt; for real.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.docker.com/products/docker-scout/&quot;&gt;Docker Scout&lt;/a&gt; scans your Docker images for security issues and hands you best-practice recommendations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Before we start, make sure you have:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.docker.com/products/docker-desktop/&quot;&gt;Docker Desktop&lt;/a&gt; 4.38 or later installed&lt;/li&gt;
&lt;li&gt;A Docker Account, and that you&apos;re signed in using &lt;code&gt;docker login&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Say we have a sample Node.js application. This is the Dockerfile.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-docker&quot;&gt;# Use a lightweight Node.js image based on Alpine Linux
FROM node:22.13.0-alpine

# Set the working directory inside the container
WORKDIR /usr/src/app

# Copy only the package files first (for efficient layer caching)
COPY package*.json ./

# Install Node.js dependencies
RUN npm install

# Copy the entire project (including index.js) into the container
COPY . .

# Expose port 3000 for the Node.js server
EXPOSE 3000

# The default command to run the app
CMD [&quot;node&quot;, &quot;index.js&quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I&apos;m using &lt;code&gt;node:22.13.0-alpine&lt;/code&gt; here because it&apos;s smaller than &lt;code&gt;node:22&lt;/code&gt;. Better for containers. Smaller doesn&apos;t mean safe, though, so we still scan.&lt;/p&gt;
&lt;p&gt;Now build the image.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker build -t my-node-app:1.0.0 .
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That packages the application into a Docker image named &lt;code&gt;my-node-app&lt;/code&gt;, version &lt;code&gt;1.0.0&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Next, point &lt;a href=&quot;https://www.docker.com/products/docker-scout/&quot;&gt;Docker Scout&lt;/a&gt; at it.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker scout cves my-node-app:1.0.0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://www.docker.com/products/docker-scout/&quot;&gt;Docker Scout&lt;/a&gt; analyzes the image and flags whatever looks risky.&lt;/p&gt;
&lt;p&gt;When the scan finishes, you get a report. It lists the issues it found, their severity, and how to fix them.&lt;/p&gt;
&lt;p&gt;Those issues might trace back to system libraries, base packages, or your own application dependencies. &lt;a href=&quot;https://www.docker.com/products/docker-scout/&quot;&gt;Docker Scout&lt;/a&gt; will often tell you to upgrade a component or apply a patch.&lt;/p&gt;
&lt;p&gt;Why bother locally? Because you catch problems here, before the image ever hits a registry or a production cluster. Fix them now and your environment is more secure immediately.&lt;/p&gt;
&lt;p&gt;That&apos;s the short version of using &lt;a href=&quot;https://www.docker.com/products/docker-scout/&quot;&gt;Docker Scout&lt;/a&gt; to tighten up your containerized applications.&lt;/p&gt;
&lt;h2&gt;Snyk in GitHub Actions&lt;/h2&gt;
&lt;p&gt;Let&apos;s take it further and automate scanning in the pipeline with &lt;a href=&quot;https://snyk.io/&quot;&gt;Snyk&lt;/a&gt; and &lt;a href=&quot;https://github.com/features/actions&quot;&gt;GitHub Actions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Before we start, make sure you:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Sign up for a free Snyk account at &lt;a href=&quot;https://snyk.io/&quot;&gt;snyk.io&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go to your Snyk account &lt;a href=&quot;https://app.snyk.io/account&quot;&gt;settings page&lt;/a&gt;, find your Access Token (Key), and copy it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In your &lt;strong&gt;GitHub repo&lt;/strong&gt;, go to &lt;strong&gt;Settings&lt;/strong&gt; → &lt;strong&gt;Secrets and variables&lt;/strong&gt; → &lt;strong&gt;Actions&lt;/strong&gt;, and create a new secret named &lt;code&gt;SNYK_TOKEN&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Say we have a Node.js project. The goal is straightforward. A developer pushes code or opens a pull request, and &lt;a href=&quot;https://snyk.io/&quot;&gt;Snyk&lt;/a&gt; scans for security issues on its own.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://snyk.io/&quot;&gt;Snyk&lt;/a&gt; will check the container image to detect risks in the base image and OS packages.&lt;/li&gt;
&lt;li&gt;It will also check application dependencies to find security flaws in &lt;code&gt;package.json&lt;/code&gt; and other libraries.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Create a GitHub Action Workflow&lt;/h3&gt;
&lt;p&gt;For this we need a new GitHub Actions workflow file. It goes inside the &lt;code&gt;.github&lt;/code&gt; folder, then workflows, and we name it &lt;code&gt;snyk.yml&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;name: Snyk Security Scan

on:
  push:
    branches: [&quot;main&quot;]
  pull_request:
    branches: [&quot;main&quot;]

jobs:
  security:
    runs-on: ubuntu-latest
    steps:
      - name: Check out the repository
        uses: actions/checkout@v2

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: Build Docker image
        run: docker build -t my-node-app:1.0.0 .

      - name: Snyk Container Scan
        uses: snyk/actions/docker@master
        env:
          SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
        with:
          image: &quot;my-node-app:1.0.0&quot;
          args: &quot;--file=Dockerfile&quot;

      - name: Snyk Code &amp;amp; Dependency Scan
        uses: snyk/actions/node@master
        env:
          SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
        with:
          args: &quot;--file=package.json&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This workflow scans both the Docker image and the application dependencies for risk, automatically. Notice it pulls &lt;code&gt;SNYK_TOKEN&lt;/code&gt; from GitHub Secrets. That&apos;s the right way to do it. Your credentials stay out of the code, and nothing leaks by accident.&lt;/p&gt;
&lt;h2&gt;Wrap-Up and Final Tips&lt;/h2&gt;
&lt;p&gt;We got through a lot:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Why container security matters in 2025&lt;/li&gt;
&lt;li&gt;Seven core principles—from minimal images to least privilege&lt;/li&gt;
&lt;li&gt;A live demo of Docker Scout for local image scanning&lt;/li&gt;
&lt;li&gt;How to automate security scans using Snyk in GitHub Actions&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;But here&apos;s the key takeaway:&lt;/strong&gt; Container security isn&apos;t just about tools or settings—it&apos;s a mindset. Everyone on your team plays a role in keeping things secure.&lt;/p&gt;
&lt;p&gt;A few more practical things you can do right now:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Monitor runtime&lt;/strong&gt; with tools like &lt;a href=&quot;https://falco.org/&quot;&gt;Falco&lt;/a&gt; or &lt;a href=&quot;https://sysdig.com/&quot;&gt;Sysdig&lt;/a&gt; to detect suspicious activity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keep everything up to date&lt;/strong&gt;—patching OS packages and dependencies is one of the simplest and most effective security steps.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enforce security policies&lt;/strong&gt;, like blocking deployments if there are serious security issues. A single rule like this can make a big impact.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Educate your team&lt;/strong&gt;—security isn&apos;t just for DevOps or engineers; it&apos;s a shared responsibility across developers, QA, and security teams.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thank you for reading! Don&apos;t forget to check out the &lt;a href=&quot;https://youtu.be/EoeoCTZAGuU&quot;&gt;video version&lt;/a&gt; for additional insights and visuals.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>Security</category><category>Containers</category><category>Docker</category><category>DevSecOps</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Datadog Certification — Are Engineers Just Jumping Through Hoops?</title><link>https://heyvaldemar.com/datadog-certification-are-engineers-just-jumping-through-hoops/</link><guid isPermaLink="true">https://heyvaldemar.com/datadog-certification-are-engineers-just-jumping-through-hoops/</guid><description>Is Datadog certification just a fancy dog agility course? We break down why DevOps engineers feel like they&apos;re jumping through hoops.</description><pubDate>Tue, 25 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I was checking out &lt;a href=&quot;https://www.datadoghq.com/blog/datadog-certification-relaunch/&quot;&gt;Datadog&apos;s certification&lt;/a&gt; program, thinking about how it might help DevOps professionals improve their skills.&lt;/p&gt;
&lt;p&gt;And then, I saw &lt;strong&gt;this illustration on their website&lt;/strong&gt;—dogs &lt;strong&gt;jumping through hoops&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./datadog-certification-are-engineers-just-jumping-through-hoops-1.webp&quot; alt=&quot;Datadog Certification - Are Engineers Just Jumping Through Hoops? - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;At first, I laughed. But then I thought... &lt;strong&gt;wait a minute.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So if I want to &lt;strong&gt;learn Datadog&lt;/strong&gt;, if I want to &lt;strong&gt;get certified&lt;/strong&gt;, if I want to &lt;strong&gt;prove my skills in observability&lt;/strong&gt;...&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Am I just a dog in training?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;import VideoPlayer from &quot;@components/VideoPlayer.astro&quot;;&lt;/p&gt;
&lt;p&gt;&amp;lt;VideoPlayer
videoId=&quot;euDLAvPp2KQ&quot;
title=&quot;Datadog Certification - Are Engineers Just Jumping Through Hoops?)&quot;
/&amp;gt;&lt;/p&gt;
&lt;h2&gt;Jumping Through Hoops for a Badge&lt;/h2&gt;
&lt;p&gt;Look at the metaphor. &lt;strong&gt;Dogs on a racetrack, performing tricks, jumping through hoops.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;And who are these dogs supposed to represent? &lt;strong&gt;Us.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Engineers&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Customers&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Anyone trying to master Datadog&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We&apos;re &lt;strong&gt;running, jumping, performing tricks... all for what?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A &lt;strong&gt;Credly badge&lt;/strong&gt; to show off on LinkedIn?&lt;/p&gt;
&lt;h2&gt;Training to Be a &quot;Good Datadog&quot;&lt;/h2&gt;
&lt;p&gt;Want to prove you understand logs? &lt;strong&gt;Jump.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Want to monitor metrics? &lt;strong&gt;Jump higher.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Want that official certification? &lt;strong&gt;Jump through the final hoop!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;And the best part?&lt;/p&gt;
&lt;p&gt;You &lt;strong&gt;pay $100&lt;/strong&gt; to be trained like a &lt;strong&gt;good Datadog.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Flexing Your New Status&lt;/h2&gt;
&lt;p&gt;Once you pass the exam, you can proudly display your &lt;a href=&quot;https://www.credly.com/organizations/datadog/badges&quot;&gt;Datadog-certified badge&lt;/a&gt; on LinkedIn.&lt;/p&gt;
&lt;p&gt;Imagine the conversation with recruiters:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Wow, AWS, Kubernetes, Terraform... and oh, look! A Datadog-certified agility expert!”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Maybe we should update our job titles? &lt;strong&gt;&quot;Senior DogOps Engineer&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;The Serious Takeaway&lt;/h2&gt;
&lt;p&gt;Jokes aside, &lt;a href=&quot;https://www.datadoghq.com/&quot;&gt;Datadog&lt;/a&gt; is a powerful tool and certifications can be valuable.&lt;/p&gt;
&lt;p&gt;But honestly, maybe &lt;strong&gt;they could have picked a better metaphor?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Engineers aren&apos;t circus animals.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We&apos;re not jumping through hoops for treats.&lt;/p&gt;
&lt;p&gt;Datadog, &lt;strong&gt;I&apos;m NOT a dog.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;What Do You Think?&lt;/h2&gt;
&lt;p&gt;If you&apos;ve taken a &lt;strong&gt;Datadog certification&lt;/strong&gt;, did you feel like an &lt;strong&gt;obedient pup&lt;/strong&gt; by the end?&lt;/p&gt;
&lt;p&gt;Drop a comment below—or better yet, &lt;strong&gt;tell me if they gave you a treat after you passed!&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Opinion &amp; Culture</category><category>Datadog</category><category>Certification</category><category>DevOps</category><category>Opinion</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Top 10 DevOps Tools for 2025 — Must-Have for Developers and Engineers</title><link>https://heyvaldemar.com/top-10-devops-tools-for-2025-must-have-for-developers-and-engineers/</link><guid isPermaLink="true">https://heyvaldemar.com/top-10-devops-tools-for-2025-must-have-for-developers-and-engineers/</guid><description>Explore the top 10 DevOps tools for 2025 to optimize workflows, enhance security, and streamline CI/CD, GitOps, and Kubernetes.</description><pubDate>Tue, 18 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ten tools I&apos;d actually keep in my 2025 DevOps kit. They cut busywork, tighten infrastructure, and close real security gaps.&lt;/p&gt;
&lt;p&gt;If your toolkit is due for a refresh this year, read on.&lt;/p&gt;
&lt;p&gt;import VideoPlayer from &quot;@components/VideoPlayer.astro&quot;;&lt;/p&gt;
&lt;p&gt;&amp;lt;VideoPlayer
videoId=&quot;cTdt4q6sCZc&quot;
title=&quot;Top 10 DevOps Tools for 2025 - Must-Have for Developers and Engineers&quot;
/&amp;gt;&lt;/p&gt;
&lt;h2&gt;AI &amp;amp; DevOps - Smarter Workflows with Fabric&lt;/h2&gt;
&lt;p&gt;AI is everywhere. You already know that. &lt;a href=&quot;https://openai.com/&quot;&gt;ChatGPT&lt;/a&gt;, &lt;a href=&quot;https://gemini.google.com/&quot;&gt;Google Gemini&lt;/a&gt;, &lt;a href=&quot;https://github.com/features/copilot&quot;&gt;GitHub Copilot&lt;/a&gt;: developers reach for these daily now. But the output is only as good as the prompt, and that is exactly the part most people get wrong. Fabric fixes it.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/danielmiessler/fabric&quot;&gt;Fabric&lt;/a&gt; helps you write better prompts, so you get answers that are actually accurate and useful. No more hand-tuning the same prompt over and over. It ships ready-made patterns that tell the model what you really want.&lt;/p&gt;
&lt;p&gt;If AI sits anywhere in your DevOps workflow, add Fabric. Small tool, big payoff.&lt;/p&gt;
&lt;h2&gt;CI/CD Evolution - Why Devbox Stands Out&lt;/h2&gt;
&lt;p&gt;On to CI/CD.&lt;/p&gt;
&lt;p&gt;The pipelines themselves have barely moved. &lt;a href=&quot;https://github.com/features/actions&quot;&gt;GitHub Actions&lt;/a&gt;, &lt;a href=&quot;https://about.gitlab.com/solutions/continuous-integration/&quot;&gt;GitLab CI/CD&lt;/a&gt;, &lt;a href=&quot;https://argoproj.github.io/workflows/&quot;&gt;Argo Workflows&lt;/a&gt;: same engines, year after year. What did change is how we handle dev environments. So my pick here is not another workflow runner. It is &lt;a href=&quot;https://jetify.com/devbox&quot;&gt;Devbox&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Devbox runs on &lt;a href=&quot;https://nixos.org/&quot;&gt;Nix&lt;/a&gt; packages. That makes defining and installing dependencies trivial, and it works the same everywhere: your laptop, a CI pipeline, a container.&lt;/p&gt;
&lt;p&gt;No more version mismatches. No more hunting down a missing dependency. You get a fully configured environment in seconds. It is portable and light, and if you bounce between machines, it saves you real time.&lt;/p&gt;
&lt;h2&gt;Containers - Security First with Chainguard Images&lt;/h2&gt;
&lt;p&gt;Next one. Containers.&lt;/p&gt;
&lt;p&gt;They have run modern DevOps for years. Most of us stopped thinking about the runtime a long time ago. &lt;a href=&quot;https://www.docker.com/products/docker-desktop/&quot;&gt;Docker&lt;/a&gt;, &lt;a href=&quot;https://podman.io/&quot;&gt;Podman&lt;/a&gt;, &lt;a href=&quot;https://rancherdesktop.io/&quot;&gt;Rancher&lt;/a&gt;: they all get the job done. Docker just does it better.&lt;/p&gt;
&lt;p&gt;The part that still matters is security. That is why my 2025 pick is &lt;a href=&quot;https://chainguard.dev/chainguard-images&quot;&gt;Chainguard Images&lt;/a&gt;. The images are small and hardened, built to strip out the usual security risks while keeping size to a minimum. Want safer, leaner containers? Switching to Chainguard is an easy win.&lt;/p&gt;
&lt;h2&gt;Developer Portals - A Better Alternative to Backstage&lt;/h2&gt;
&lt;p&gt;Containers are only half the picture. Developer portals are the other half.&lt;/p&gt;
&lt;p&gt;Platform engineering took off, and a wave of money went into developer portals so teams could collaborate and ship faster. &lt;a href=&quot;https://backstage.io/&quot;&gt;Backstage&lt;/a&gt; was the default for a long stretch. It is also complex and expensive to run. I have done it.&lt;/p&gt;
&lt;p&gt;So I recommend &lt;a href=&quot;https://getport.io/&quot;&gt;Port&lt;/a&gt; instead. Port is data-first. You get to see your services, dependencies, and internal tools without the Backstage maintenance tax. It plugs into &lt;a href=&quot;https://kubernetes.io/&quot;&gt;Kubernetes&lt;/a&gt; and cloud platforms cleanly, which makes it a strong fit for platform teams.&lt;/p&gt;
&lt;h2&gt;GitOps - The Clear Winner is Argo CD&lt;/h2&gt;
&lt;p&gt;Since we are on Kubernetes, let me get to GitOps.&lt;/p&gt;
&lt;p&gt;If you have watched this space, you know the long argument between &lt;a href=&quot;https://argoproj.github.io/cd&quot;&gt;Argo CD&lt;/a&gt; and &lt;a href=&quot;https://fluxcd.io/&quot;&gt;Flux&lt;/a&gt;. That argument is over. Argo CD won.&lt;/p&gt;
&lt;p&gt;Flux had a clean architecture, no doubt. It lost steam after WeaveWorks shut down. Argo CD kept growing, with Intuit, Red Hat, and plenty of others behind it. Running GitOps on Kubernetes in 2025? Argo CD. No question.&lt;/p&gt;
&lt;h2&gt;Infrastructure as Code - The Future is Control Planes&lt;/h2&gt;
&lt;p&gt;Managing Kubernetes does not end at GitOps, though. Infrastructure is next.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://terraform.io/&quot;&gt;Terraform&lt;/a&gt; and &lt;a href=&quot;https://ansible.com/&quot;&gt;Ansible&lt;/a&gt; have anchored DevOps for years. The next step for Infrastructure as Code is control planes. My pick there is &lt;a href=&quot;https://crossplane.io/&quot;&gt;Crossplane&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Crossplane lets you define infrastructure as APIs. So instead of pushing raw Terraform manifests around, you build an internal cloud platform that is fully API-driven. It cleans up infrastructure management, and it lets teams consume infrastructure as a service.&lt;/p&gt;
&lt;h2&gt;Manifest Management - Why I Switched to KCL&lt;/h2&gt;
&lt;p&gt;All that infrastructure leaves you a pile of manifests to manage. Next tool.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://kubernetes.io/&quot;&gt;Kubernetes&lt;/a&gt; manifests usually live in &lt;a href=&quot;https://helm.sh/&quot;&gt;Helm&lt;/a&gt;, &lt;a href=&quot;https://kustomize.io/&quot;&gt;Kustomize&lt;/a&gt;, or plain YAML. None of those scale well.&lt;/p&gt;
&lt;p&gt;So I switched to &lt;a href=&quot;https://kcl-lang.io/&quot;&gt;KCL&lt;/a&gt;. It is a configuration language that makes Kubernetes manifests cleaner and far easier to maintain. If sprawling YAML has ever burned you, give KCL a look.&lt;/p&gt;
&lt;h2&gt;Nushell, a different kind of terminal&lt;/h2&gt;
&lt;p&gt;Different gear now. The terminal, the thing we all live in.&lt;/p&gt;
&lt;p&gt;Spend enough hours at a prompt and you owe it to yourself to try &lt;a href=&quot;https://nushell.sh/&quot;&gt;Nushell&lt;/a&gt;. Bash and Zsh hand you text. Nushell hands you structured data, which makes filtering, processing, and scripting much less painful.&lt;/p&gt;
&lt;p&gt;I moved my scripts over to it and never looked back. Fast, sane, and a good fit for how DevOps actually works today.&lt;/p&gt;
&lt;h2&gt;A Hidden Gem - Why You Should Use NATS&lt;/h2&gt;
&lt;p&gt;While we are on underrated tools, here is one more.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://nats.io/&quot;&gt;NATS&lt;/a&gt; is a lightweight, high-performance pub/sub messaging system, and most DevOps engineers walk right past it.&lt;/p&gt;
&lt;p&gt;You will often find it buried inside other tools as the transport layer. It holds up just as well when you use it directly. Building something event-driven, or wiring up microservices? NATS is a solid alternative to &lt;a href=&quot;https://kafka.apache.org/&quot;&gt;Kafka&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Kubernetes Networking - Why Cilium is a Must-Have&lt;/h2&gt;
&lt;p&gt;Last one, and it is a big one: Kubernetes networking.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://kubernetes.io/&quot;&gt;Kubernetes&lt;/a&gt; networking gets messy fast. &lt;a href=&quot;https://cilium.io/&quot;&gt;Cilium&lt;/a&gt; cuts through it with eBPF. You get better performance and tighter security, and in plenty of setups it removes the need for a separate service mesh entirely. A lot of clusters already ship with it on by default.&lt;/p&gt;
&lt;p&gt;Not on your radar yet? Put it there.&lt;/p&gt;
&lt;h2&gt;Final Thoughts - What Should You Try First?&lt;/h2&gt;
&lt;p&gt;That is the list. Ten tools shaping 2025:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/danielmiessler/fabric&quot;&gt;Fabric&lt;/a&gt; - AI-powered prompt optimization&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jetify.com/devbox&quot;&gt;Devbox&lt;/a&gt; - Simplified CI/CD environments&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chainguard.dev/chainguard-images&quot;&gt;Chainguard Images&lt;/a&gt; - Secure container images&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://getport.io/&quot;&gt;Port&lt;/a&gt; - Lightweight developer portal&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://argoproj.github.io/cd&quot;&gt;Argo CD&lt;/a&gt; - The definitive GitOps tool&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://crossplane.io/&quot;&gt;Crossplane&lt;/a&gt; - API-driven infrastructure management&lt;/li&gt;
&lt;li&gt;&lt;a&gt;KCL&lt;/a&gt; - A better way to manage Kubernetes manifests&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nushell.sh/&quot;&gt;Nushell&lt;/a&gt; - A modern terminal shell&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nats.io/&quot;&gt;NATS&lt;/a&gt; - High-performance pub/sub messaging&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cilium.io/&quot;&gt;Cilium&lt;/a&gt; - The future of Kubernetes networking&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks for reading. The &lt;a href=&quot;https://youtu.be/cTdt4q6sCZc&quot;&gt;video version&lt;/a&gt; covers the same ground with extra detail and visuals.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>CI/CD</category><category>Kubernetes</category><category>Terraform</category><category>IaC</category><category>GitOps</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Mastering Terraform Tags for Infrastructure Excellence</title><link>https://heyvaldemar.com/mastering-terraform-tags-for-infrastructure-excellence/</link><guid isPermaLink="true">https://heyvaldemar.com/mastering-terraform-tags-for-infrastructure-excellence/</guid><description>Master Terraform tagging with expert strategies to improve cost tracking, automation, access control, and compliance. Ideal for AWS, Azure, and GCP users.</description><pubDate>Thu, 28 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Let me guess. You&apos;ve got 347 resources in AWS, half of them say &lt;code&gt;Name = &quot;test&quot;&lt;/code&gt;, and cost reports look like an accountant&apos;s fever dream. Welcome to untagged hell.&lt;/p&gt;
&lt;p&gt;The fix? Terraform tags.&lt;/p&gt;
&lt;p&gt;They&apos;re not glamorous. They&apos;re not even that technical. But ignore them and you&apos;ll regret it the day your CFO wants a breakdown of cloud costs, or your CISO asks why there&apos;s no backup policy for half your infra.&lt;/p&gt;
&lt;p&gt;In this post, I&apos;ll show you how to &lt;strong&gt;make tagging a first-class citizen in your Terraform workflows&lt;/strong&gt;, not an afterthought. This isn&apos;t theory. It&apos;s what actually works across real-world deployments in AWS, Azure, and GCP.&lt;/p&gt;
&lt;h2&gt;What tags actually are, and why you should care&lt;/h2&gt;
&lt;p&gt;Tags are simple key-value pairs attached to resources. Think of them like sticky notes you can query, bill against, enforce policies with, or automate based on.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;tags = {
  Environment = &quot;Production&quot;
  Owner       = &quot;DevOps Team&quot;
  Project     = &quot;Alpha&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That&apos;s not decoration. That&apos;s future you being able to filter EC2 instances, run scripts against certain deployments, and track cloud costs down to the project.&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;tags&lt;/code&gt; vs. &lt;code&gt;tags_all&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Here&apos;s the quick-and-dirty:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tags&lt;/code&gt; → What &lt;em&gt;you&lt;/em&gt; define in Terraform&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tags_all&lt;/code&gt; → Includes your tags &lt;em&gt;plus&lt;/em&gt; any inherited or default ones&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This matters when reading resource state or piping data into automation tools:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;output &quot;all_tags&quot; {
  value = azurerm_virtual_network.example.tags_all
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Real-World Use Cases for Terraform Tags&lt;/h2&gt;
&lt;h3&gt;Organization: Know What the Hell You&apos;re Looking At&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;tags = {
  Name        = &quot;web-api-prod&quot;
  Environment = &quot;Production&quot;
  Purpose     = &quot;Frontend&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This lets you run &lt;code&gt;aws ec2 describe-instances --filters &quot;Name=tag:Purpose,Values=Frontend&quot;&lt;/code&gt; without guessing.&lt;/p&gt;
&lt;h3&gt;Cost Management: Avoid the CFO&apos;s Wrath&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;tags = {
  CostCenter = &quot;Marketing&quot;
  Project    = &quot;Campaign42&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Most cloud providers let you break down billing by tag. It&apos;s not optional if you care about budgets. &lt;a href=&quot;https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html&quot;&gt;AWS cost allocation docs&lt;/a&gt; if you need the receipts.&lt;/p&gt;
&lt;h3&gt;Automation: Only Touch What&apos;s Tagged&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;tags = {
  Deploy    = &quot;True&quot;
  ManagedBy = &quot;Ansible&quot;
  PatchDay  = &quot;Sunday&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;CI/CD pipelines, shutdown schedulers, cron jobs. They all play nicer when you can filter resources by intent.&lt;/p&gt;
&lt;h3&gt;Access Control: IAM With Tag-Based Sanity&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;tags = {
  Environment = &quot;Staging&quot;
  Team        = &quot;DataScience&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In AWS, you can write IAM policies that &lt;em&gt;only&lt;/em&gt; allow access to resources with specific tags. Combine that with SCPs or ABAC and things get powerful, fast. &lt;a href=&quot;https://docs.aws.amazon.com/IAM/latest/UserGuide/access_tags.html&quot;&gt;More here&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Compliance &amp;amp; Backup: Stop Guessing&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;tags = {
  Backup   = &quot;Daily&quot;
  GDPR     = &quot;True&quot;
  Retain   = &quot;90d&quot;
  SOXAudit = &quot;Required&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;These aren&apos;t vanity keys. They&apos;re policy hooks. Your backup engine, logging pipeline, or compliance scanner can key off them.&lt;/p&gt;
&lt;h2&gt;Default Tags: Set Once, Use Everywhere&lt;/h2&gt;
&lt;p&gt;Writing the same five tags 93 times? You&apos;re doing it wrong.&lt;/p&gt;
&lt;h3&gt;Option 1: Variables&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;variable &quot;common_tags&quot; {
  type = map(string)
  default = {
    Owner       = &quot;DevOps Team&quot;
    Environment = &quot;Production&quot;
  }
}

resource &quot;aws_instance&quot; &quot;db&quot; {
  ami           = &quot;ami-abc123&quot;
  instance_type = &quot;t3.large&quot;

  tags = var.common_tags
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Option 2: Provider-Level Tags (AWS)&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;provider &quot;aws&quot; {
  region = &quot;us-west-2&quot;

  default_tags {
    tags = {
      Owner       = &quot;DevOps Team&quot;
      Environment = &quot;Production&quot;
      Department  = &quot;IT&quot;
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now every resource inherits those without repeating yourself. Supported since AWS provider 3.38.0. &lt;a href=&quot;https://registry.terraform.io/providers/hashicorp/aws/latest/docs#default_tags-configuration-block&quot;&gt;Docs&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Combining Tags with &lt;code&gt;merge()&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Need defaults &lt;em&gt;plus&lt;/em&gt; some resource-specific extras? This is the clean way:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;tags = merge(
  var.common_tags,
  {
    Name = &quot;api-server&quot;
    Role = &quot;backend&quot;
  }
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Boom. All the defaults, plus your custom info.&lt;/p&gt;
&lt;h2&gt;Ignoring External Tag Changes (Carefully)&lt;/h2&gt;
&lt;p&gt;Let&apos;s say someone from the security team edits tags via the console. Now Terraform constantly wants to &quot;fix&quot; them. Annoying.&lt;/p&gt;
&lt;p&gt;Use this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;lifecycle {
  ignore_changes = [tags]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But &lt;strong&gt;treat this like &lt;code&gt;sudo&lt;/code&gt;&lt;/strong&gt;. It prevents drift, but also blinds Terraform to reality. Only use when you &lt;em&gt;really&lt;/em&gt; need to.&lt;/p&gt;
&lt;h2&gt;Shared Tagging Strategy Across Teams&lt;/h2&gt;
&lt;p&gt;If your org has more than two engineers, define a &lt;strong&gt;tagging contract&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use canonical keys (&lt;code&gt;Environment&lt;/code&gt;, not &lt;code&gt;Env&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Enforce casing and naming via CI or Sentinel/OPA&lt;/li&gt;
&lt;li&gt;Document it. Share it. Tattoo it on the wiki&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Consistency saves hours — and arguments.&lt;/p&gt;
&lt;h2&gt;Best Practices That Don&apos;t Suck&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Set a tagging standard early&lt;/strong&gt;. Before the resource count hits triple digits.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use provider default tags&lt;/strong&gt; wherever possible.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automate common tags&lt;/strong&gt; with variables or modules.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Merge for flexibility&lt;/strong&gt;, not repetition.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use tags for automation&lt;/strong&gt;, not just human readability.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Don&apos;t go overboard.&lt;/strong&gt; 5-8 well-thought-out tags beat 20 vague ones.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Tools That Help&lt;/h2&gt;
&lt;p&gt;Want tagging enforcement as code?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Spacelift&lt;/strong&gt;: Tag policy enforcement + OPA support&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Checkov / tfsec&lt;/strong&gt;: Tag linter checks&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The Bottom Line&lt;/h2&gt;
&lt;p&gt;Tags are the duct tape of cloud governance. Boring? Maybe. Critical? Absolutely.&lt;/p&gt;
&lt;p&gt;If you&apos;re not tagging properly, you&apos;re leaving automation, cost tracking, and compliance on the table. And fixing it later is way harder than doing it right upfront.&lt;/p&gt;
&lt;p&gt;So: stop treating tags like optional labels, and start using them like the control layer they are.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>Terraform</category><category>IaC</category><category>AWS</category><category>Tagging</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Simplifying the Transition from Docker Compose to Kubernetes with Compose Bridge</title><link>https://heyvaldemar.com/simplifying-the-transition-from-docker-compose-to-kubernetes-with-compose-bridge/</link><guid isPermaLink="true">https://heyvaldemar.com/simplifying-the-transition-from-docker-compose-to-kubernetes-with-compose-bridge/</guid><description>Discover how to convert Docker Compose files to Kubernetes manifests using Docker&apos;s Compose Bridge. Simplify your migration and deploy applications efficiently.</description><pubDate>Sat, 26 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Hey, fellow developers and container enthusiasts! Transitioning applications from Docker Compose to Kubernetes can be a daunting task. The differences in configuration syntax, resource definitions, and deployment models often require significant effort to refactor existing applications. Developers face challenges such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Complex Configuration Changes:&lt;/strong&gt; Rewriting &lt;code&gt;compose.yml&lt;/code&gt; files into multiple Kubernetes manifest files can be time-consuming and error-prone.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Steep Learning Curve:&lt;/strong&gt; Understanding Kubernetes concepts like Pods, Deployments, Services, and PersistentVolumeClaims adds complexity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resource Management:&lt;/strong&gt; Managing numerous YAML files and ensuring they are correctly configured for Kubernetes can be overwhelming.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;However, there&apos;s a powerful tool that bridges this gap: &lt;a href=&quot;https://docs.docker.com/compose/bridge/&quot;&gt;Compose Bridge&lt;/a&gt;. Here&apos;s how Compose Bridge simplifies your migration to Kubernetes and makes it less error-prone.&lt;/p&gt;
&lt;p&gt;Compose Bridge lets you transform your Docker Compose configuration files into Kubernetes manifests effortlessly. It simplifies the deployment process by converting familiar Compose configurations into formats that Kubernetes understands. This lets you use the powerful orchestration capabilities of Kubernetes while maintaining the simplicity and efficiency of Docker Compose.&lt;/p&gt;
&lt;h2&gt;How Compose Bridge Works&lt;/h2&gt;
&lt;p&gt;At its core, Compose Bridge uses &lt;strong&gt;transformations&lt;/strong&gt; to convert a Docker Compose model into another form—in this case, Kubernetes manifests. These transformations are packaged as Docker images that take your fully resolved Compose file as input and generate the corresponding Kubernetes configuration files under an &lt;code&gt;/out&lt;/code&gt; directory.&lt;/p&gt;
&lt;p&gt;Compose Bridge provides its own transformation for Kubernetes using Go templates, making it easy to customize by modifying or extending the templates to suit your specific project needs.&lt;/p&gt;
&lt;h2&gt;Setting Up Compose Bridge&lt;/h2&gt;
&lt;p&gt;To get started with Compose Bridge, you&apos;ll need the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Docker Desktop Version 4.33 or Later:&lt;/strong&gt; Ensure you have the latest version of &lt;a href=&quot;https://www.docker.com/products/docker-desktop/&quot;&gt;Docker Desktop&lt;/a&gt; installed on your machine.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Docker Account:&lt;/strong&gt; Sign in to your Docker account within Docker Desktop.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enable Experimental Features and Compose Bridge:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Open &lt;strong&gt;Docker Desktop&lt;/strong&gt; and navigate to &lt;strong&gt;Settings&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Features in development&lt;/strong&gt; &amp;gt; &lt;strong&gt;Experimental features&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Check the following options:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Access experimental features&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enable Compose Bridge command line&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Apply &amp;amp; Restart&lt;/strong&gt; to save your settings.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./simplifying-the-transition-from-docker-compose-to-kubernetes-with-compose-bridge-1.webp&quot; alt=&quot;Simplifying the Transition from Docker Compose to Kubernetes with Compose Bridge - Step 1&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Using Docker Desktop to Convert Docker Compose to Kubernetes&lt;/h2&gt;
&lt;p&gt;Compose Bridge integrates directly with Docker Desktop, so you can convert and deploy your Docker Compose applications to Kubernetes directly from the Docker Desktop interface. Here&apos;s how to do it:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 1: Enable Kubernetes in Docker Desktop:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Open Docker Desktop&lt;/strong&gt; and navigate to &lt;strong&gt;Settings&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Kubernetes&lt;/strong&gt; and check &lt;strong&gt;Enable Kubernetes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Apply &amp;amp; Restart&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Wait for Kubernetes to start. You&apos;ll see a &lt;strong&gt;Kubernetes is running&lt;/strong&gt; indicator when it&apos;s ready.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./simplifying-the-transition-from-docker-compose-to-kubernetes-with-compose-bridge-2.webp&quot; alt=&quot;Simplifying the Transition from Docker Compose to Kubernetes with Compose Bridge - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 2: Verify Your Docker Compose Setup:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Navigate to the &lt;strong&gt;Containers&lt;/strong&gt; tab in Docker Desktop.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./simplifying-the-transition-from-docker-compose-to-kubernetes-with-compose-bridge-3.webp&quot; alt=&quot;Simplifying the Transition from Docker Compose to Kubernetes with Compose Bridge - Step 3&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ensure that your Docker Compose services are running correctly.&lt;/li&gt;
&lt;li&gt;Check the container logs to confirm there are no errors.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./simplifying-the-transition-from-docker-compose-to-kubernetes-with-compose-bridge-4.webp&quot; alt=&quot;Simplifying the Transition from Docker Compose to Kubernetes with Compose Bridge - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 3: Review Your compose.yml File:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Open the &lt;strong&gt;Compose File Viewer&lt;/strong&gt; in Docker Desktop by selecting your Compose application and clicking &lt;strong&gt;View configurations&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Review the &lt;code&gt;compose.yml&lt;/code&gt; file to ensure it defines the services, volumes, and environment variables you want to deploy.&lt;/li&gt;
&lt;li&gt;Confirm that all configurations are correct and complete.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./simplifying-the-transition-from-docker-compose-to-kubernetes-with-compose-bridge-5.webp&quot; alt=&quot;Simplifying the Transition from Docker Compose to Kubernetes with Compose Bridge - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 4: Convert and Deploy to Kubernetes:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In the &lt;strong&gt;Compose File Viewer&lt;/strong&gt;, click &lt;strong&gt;Convert and Deploy to Kubernetes&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./simplifying-the-transition-from-docker-compose-to-kubernetes-with-compose-bridge-5.webp&quot; alt=&quot;Simplifying the Transition from Docker Compose to Kubernetes with Compose Bridge - Step 5&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Docker Desktop will prompt you to &lt;strong&gt;Stop current project containers&lt;/strong&gt; to avoid port conflicts.
&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;Stop containers and continue&lt;/strong&gt; to proceed.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./simplifying-the-transition-from-docker-compose-to-kubernetes-with-compose-bridge-6.webp&quot; alt=&quot;Simplifying the Transition from Docker Compose to Kubernetes with Compose Bridge - Step 6&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Docker Desktop will convert your Compose file into Kubernetes manifests and deploy them to the Kubernetes cluster.&lt;/li&gt;
&lt;li&gt;You&apos;ll receive a notification indicating that the configuration was successfully converted and deployed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./simplifying-the-transition-from-docker-compose-to-kubernetes-with-compose-bridge-7.webp&quot; alt=&quot;Simplifying the Transition from Docker Compose to Kubernetes with Compose Bridge - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 5: Review the Generated Kubernetes YAML Files:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;After conversion, the &lt;strong&gt;Compose File Viewer&lt;/strong&gt; will display the generated Kubernetes YAML files.&lt;/li&gt;
&lt;li&gt;These files include:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Deployments:&lt;/strong&gt; Defines the desired state and scaling of your application.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Services:&lt;/strong&gt; Exposes your application internally and externally.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PersistentVolumeClaims:&lt;/strong&gt; Manages storage requirements.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;You can review and edit these files to customize your Kubernetes deployment further.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./simplifying-the-transition-from-docker-compose-to-kubernetes-with-compose-bridge-8.webp&quot; alt=&quot;Simplifying the Transition from Docker Compose to Kubernetes with Compose Bridge - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 6: Verify the Kubernetes Pods:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Return to the &lt;strong&gt;Containers&lt;/strong&gt; tab in Docker Desktop.&lt;/li&gt;
&lt;li&gt;Ensure that each service from your Docker Compose file is running as a Kubernetes pod.&lt;/li&gt;
&lt;li&gt;Check the pod logs to confirm that the services are operating correctly without errors.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./simplifying-the-transition-from-docker-compose-to-kubernetes-with-compose-bridge-9.webp&quot; alt=&quot;Simplifying the Transition from Docker Compose to Kubernetes with Compose Bridge - Step 9&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Using the Compose Bridge Command Line&lt;/h2&gt;
&lt;p&gt;Alternatively, you can use the Compose Bridge command-line tool to convert your Compose files to Kubernetes manifests.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 1: Use the Default Transformation:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Open your terminal and navigate to the directory containing your &lt;code&gt;compose.yml&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;Run the conversion command:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;compose-bridge convert
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;The command processes your Compose file and generates Kubernetes manifests stored in an &lt;code&gt;out&lt;/code&gt; directory.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Step 2: Deploy to Kubernetes:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ensure Kubernetes is enabled in Docker Desktop.&lt;/li&gt;
&lt;li&gt;Apply the generated manifests using:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl apply -k out/overlays/desktop/
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;This command deploys your application to the Kubernetes cluster.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Understanding the Generated Resources&lt;/h2&gt;
&lt;p&gt;The default transformation of Compose Bridge produces several Kubernetes resources based on your Compose file:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Namespace:&lt;/strong&gt; Isolates resources to prevent conflicts between deployments.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ConfigMaps and Secrets:&lt;/strong&gt; Manages configuration data and sensitive information.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deployments:&lt;/strong&gt; Ensures that a specified number of replicas of your application are running.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Services:&lt;/strong&gt; Defines how to expose your applications internally and externally.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PersistentVolumeClaims:&lt;/strong&gt; Handles storage requirements for your services.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Network Policies:&lt;/strong&gt; Replicates the networking topology defined in your Compose file.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Customizing Transformations&lt;/h2&gt;
&lt;p&gt;Compose Bridge allows you to tailor the transformation process to fit your specific requirements.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 1: Modify Default Templates:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;compose-bridge transformations create --from docker/compose-bridge-kubernetes my-custom-template
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This command creates a directory named &lt;code&gt;my-custom-template&lt;/code&gt; containing the templates and a &lt;code&gt;Dockerfile&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 2: Customize Template:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Edit the templates within the directory to modify how resources are generated.&lt;/li&gt;
&lt;li&gt;You can add, remove, or alter templates to produce the desired Kubernetes manifests.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Step 3: Build and Use Your Custom Transformation:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker build -t mycompany/compose-transform:latest my-custom-template/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Use your custom transformation:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;compose-bridge convert --transformations mycompany/compose-transform:latest
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Add New Templates&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Create new template files to generate resources not covered by the default templates.&lt;/li&gt;
&lt;li&gt;Use the Go templating language to define how the new resources should be generated.&lt;/li&gt;
&lt;li&gt;Incorporate custom extensions in your Compose file to provide additional data for the templates.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Building Your Own Transformation&lt;/h2&gt;
&lt;p&gt;If you require a completely different transformation logic, you can build your own transformation from scratch or use other tools like &lt;a href=&quot;https://kompose.io/&quot;&gt;Kompose&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 1: Create a Dockerfile for Your Transformation:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-docker&quot;&gt;FROM alpine

RUN apk add --no-cache curl

ARG VERSION=1.32.0

RUN ARCH=$(uname -m | sed &apos;s/armv7l/arm/g&apos; \
                  | sed &apos;s/aarch64/arm64/g&apos; \
                  | sed &apos;s/x86_64/amd64/g&apos;) &amp;amp;&amp;amp; \
    curl -fsSL &quot;https://github.com/kubernetes/kompose/releases/download/v${VERSION}/kompose-linux-${ARCH}&quot; \
    -o /usr/bin/kompose &amp;amp;&amp;amp; \
    chmod +x /usr/bin/kompose

CMD [&quot;/usr/bin/kompose&quot;, &quot;convert&quot;, &quot;-f&quot;, &quot;/in/compose.yaml&quot;, &quot;--out&quot;, &quot;/out&quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Step 2: Build and Use Your Transformation:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker build -t mycompany/custom-transform:latest .
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;compose-bridge convert --transformations mycompany/custom-transform:latest
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Using Compose Bridge as a kubectl Plugin&lt;/h2&gt;
&lt;p&gt;Compose Bridge can function as a &lt;code&gt;kubectl&lt;/code&gt; plugin, fitting into your Kubernetes command-line workflows.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 1: Install the Plugin:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ensure the &lt;code&gt;compose-bridge&lt;/code&gt; binary is in your system&apos;s PATH and rename it to &lt;code&gt;kubectl-compose_bridge&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;mv /path/to/compose-bridge /usr/local/bin/kubectl-compose_bridge
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;chmod +x /usr/local/bin/kubectl-compose_bridge
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Step 2: Verify Installation:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Run plugin list command to confirm that the plugin is recognized:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl plugin list
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Step 3: Use the Plugin:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Run Compose Bridge command using &lt;code&gt;kubectl&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl compose-bridge convert
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Benefits of Using Compose Bridge&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Simplifies Migration:&lt;/strong&gt; Converts Compose files to Kubernetes manifests with minimal effort.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Customizable:&lt;/strong&gt; Allows for extensive customization to fit your deployment needs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maintains Familiarity:&lt;/strong&gt; Enables you to continue using Compose configurations while adopting Kubernetes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Integrates with Existing Tools:&lt;/strong&gt; Works with Docker Desktop and can be used as a &lt;code&gt;kubectl&lt;/code&gt; plugin.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Transitioning from Docker Compose to Kubernetes doesn&apos;t have to be a complex or time-consuming process. &lt;strong&gt;Compose Bridge&lt;/strong&gt; offers a powerful and flexible solution to convert your existing Compose configurations into Kubernetes manifests, allowing you to use Kubernetes&apos; powerful orchestration features without starting from scratch.&lt;/p&gt;
&lt;p&gt;By simplifying the migration process, Compose Bridge reduces the barriers to adopting Kubernetes, enabling you to scale your applications and take advantage of its advanced capabilities. Whether you&apos;re deploying applications locally using Docker Desktop or planning to scale out to a full Kubernetes cluster, Compose Bridge can help streamline your workflow and reduce the learning curve.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ready to simplify your Kubernetes deployments?&lt;/strong&gt; Give Compose Bridge a try and experience a smoother transition from Docker Compose today! We encourage you to experiment with the tool, provide feedback, and contribute to its ongoing development.&lt;/p&gt;
&lt;p&gt;For more information and to dive deeper into customization options, check out the official &lt;a href=&quot;https://docs.docker.com/compose/bridge/&quot;&gt;Compose Bridge documentation&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>Docker</category><category>Kubernetes</category><category>Kompose</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install ownCloud Using Docker Compose</title><link>https://heyvaldemar.com/install-owncloud-using-docker-compose/</link><guid isPermaLink="true">https://heyvaldemar.com/install-owncloud-using-docker-compose/</guid><description>Learn how to install ownCloud with Docker Compose on Ubuntu using Traefik and Let&apos;s Encrypt. Secure, scalable file storage and sharing for your server.</description><pubDate>Wed, 16 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing ownCloud using Docker Compose.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://owncloud.com/&quot;&gt;ownCloud&lt;/a&gt; is the ultimate file management platform, essential for enterprise-grade file synchronization and sharing, expertly tailored to meet your business needs.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted ownCloud when you need on-premises file sync and share with full storage control and LDAP integration. Google Drive or Dropbox provide managed alternatives with native mobile apps and collaboration features. Self-hosting is justified when data sovereignty requirements prohibit cloud storage or when storage volumes make per-user SaaS pricing impractical.
:::&lt;/p&gt;
&lt;p&gt;💾 &lt;strong&gt;You can find the repository used in this guide on &lt;a href=&quot;https://github.com/heyvaldemar/owncloud-traefik-letsencrypt-docker-compose&quot;&gt;GitHub&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;heyvaldemar/owncloud-traefik-letsencrypt-docker-compose&quot;}&lt;/p&gt;
&lt;p&gt;:::note
We&apos;ll use &lt;a href=&quot;https://traefik.io/traefik/&quot;&gt;Traefik&lt;/a&gt; as our reverse proxy. It&apos;ll handle obtaining cryptographic certificates from &lt;a href=&quot;https://letsencrypt.org/&quot;&gt;Let&apos;s Encrypt&lt;/a&gt; for your domain names and route requests to the corresponding services based on those domains.
:::&lt;/p&gt;
&lt;p&gt;:::caution
To obtain cryptographic certificates, you will need A-type records in the external DNS zone, which point to the IP address of your server where Traefik is installed. If you have created these records recently, you should wait before starting the installation of the services. Full replication of these records between DNS servers can take from a few minutes to 48 hours or even longer in rare cases.
:::&lt;/p&gt;
&lt;p&gt;:::important
Docker Engine and Docker Compose must be installed on the server.&lt;/p&gt;
&lt;p&gt;For a step-by-step guide on installing Docker Engine on Ubuntu Server, see &lt;a href=&quot;/install-docker-engine-and-docker-compose-on-ubuntu-server/&quot;&gt;Install Docker Engine and Docker Compose on Ubuntu Server&lt;/a&gt;
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on the server you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to obtain a free cryptographic certificate through the Let&apos;s Encrypt certification center.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the ownCloud web interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which ownCloud is planned to be installed.&lt;/p&gt;
&lt;p&gt;Now it is necessary to create networks for your services.&lt;/p&gt;
&lt;p&gt;We create a network for Traefik using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create traefik-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-owncloud-using-docker-compose-1.webp&quot; alt=&quot;Install ownCloud Using Docker Compose - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;We create a network for ownCloud using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create owncloud-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-owncloud-using-docker-compose-2.webp&quot; alt=&quot;Install ownCloud Using Docker Compose - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to clone the repository that contains the configuration files, which include all the necessary conditions for ownCloud to work.&lt;/p&gt;
&lt;p&gt;You can clone the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/heyvaldemar/owncloud-traefik-letsencrypt-docker-compose.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-owncloud-using-docker-compose-3.webp&quot; alt=&quot;Install ownCloud Using Docker Compose - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Navigate to the directory with the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd owncloud-traefik-letsencrypt-docker-compose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-owncloud-using-docker-compose-4.webp&quot; alt=&quot;Install ownCloud Using Docker Compose - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to change the variables in the &lt;code&gt;.env&lt;/code&gt; file according to your requirements.&lt;/p&gt;
&lt;p&gt;:::important
The &lt;code&gt;.env&lt;/code&gt; file should be in the same directory as &lt;code&gt;owncloud-traefik-letsencrypt-docker-compose.yml&lt;/code&gt;.
:::&lt;/p&gt;
&lt;p&gt;Now let&apos;s start ownCloud with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose -f owncloud-traefik-letsencrypt-docker-compose.yml -p owncloud up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-owncloud-using-docker-compose-5.webp&quot; alt=&quot;Install ownCloud Using Docker Compose - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the ownCloud management panel, go to &lt;code&gt;https://owncloud.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;owncloud.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik service, which will redirect the request to ownCloud.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;The next step is to provide: workspace name, your full name, an email address and a password to create a ownCloud administrator account.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Create workspace&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-owncloud-using-docker-compose-6.webp&quot; alt=&quot;Install ownCloud Using Docker Compose - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the ownCloud control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-owncloud-using-docker-compose-7.webp&quot; alt=&quot;Install ownCloud Using Docker Compose - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Traefik control panel, go to &lt;code&gt;https://traefik.owncloud.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;traefik.owncloud.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Enter the username and password previously set in the &lt;code&gt;.env&lt;/code&gt; file, and click the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-owncloud-using-docker-compose-8.webp&quot; alt=&quot;Install ownCloud Using Docker Compose - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Traefik control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-owncloud-using-docker-compose-9.webp&quot; alt=&quot;Install ownCloud Using Docker Compose - Step 9&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Self-Hosting</category><category>ownCloud</category><category>Docker</category><category>Cloud Storage</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Docmost Using Docker Compose</title><link>https://heyvaldemar.com/install-docmost-using-docker-compose/</link><guid isPermaLink="true">https://heyvaldemar.com/install-docmost-using-docker-compose/</guid><description>Learn how to install Docmost using Docker Compose with Traefik and Let&apos;s Encrypt. Step-by-step guide for self-hosting a modern documentation platform.</description><pubDate>Mon, 30 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Docmost using Docker Compose.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docmost.com/&quot;&gt;Docmost&lt;/a&gt; is an open-source wiki and documentation platform that offers a collaborative alternative to Confluence and Notion.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted Docmost when you need an open-source documentation platform with full data ownership and no per-seat licensing costs. For teams that prioritize ecosystem integrations over cost control, Notion or GitBook provide managed alternatives with richer collaboration features. Self-hosting Docmost makes sense at scale where per-user SaaS pricing becomes a significant line item.
:::&lt;/p&gt;
&lt;p&gt;💾 &lt;strong&gt;You can find the repository used in this guide on &lt;a href=&quot;https://github.com/heyvaldemar/docmost-traefik-letsencrypt-docker-compose&quot;&gt;GitHub&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;heyvaldemar/docmost-traefik-letsencrypt-docker-compose&quot;}&lt;/p&gt;
&lt;p&gt;:::note
We&apos;ll use &lt;a href=&quot;https://traefik.io/traefik/&quot;&gt;Traefik&lt;/a&gt; as our reverse proxy. It&apos;ll handle obtaining cryptographic certificates from &lt;a href=&quot;https://letsencrypt.org/&quot;&gt;Let&apos;s Encrypt&lt;/a&gt; for your domain names and route requests to the corresponding services based on those domains.
:::&lt;/p&gt;
&lt;p&gt;:::caution
To obtain cryptographic certificates, you will need A-type records in the external DNS zone, which point to the IP address of your server where Traefik is installed. If you have created these records recently, you should wait before starting the installation of the services. Full replication of these records between DNS servers can take from a few minutes to 48 hours or even longer in rare cases.
:::&lt;/p&gt;
&lt;p&gt;:::important
Docker Engine and Docker Compose must be installed on the server.&lt;/p&gt;
&lt;p&gt;For a step-by-step guide on installing Docker Engine on Ubuntu Server, see &lt;a href=&quot;/install-docker-engine-and-docker-compose-on-ubuntu-server/&quot;&gt;Install Docker Engine and Docker Compose on Ubuntu Server&lt;/a&gt;
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on the server you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to obtain a free cryptographic certificate through the Let&apos;s Encrypt certification center.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the Docmost web interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which Docmost is planned to be installed.&lt;/p&gt;
&lt;p&gt;Now it is necessary to create networks for your services.&lt;/p&gt;
&lt;p&gt;We create a network for Traefik using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create traefik-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-docmost-using-docker-compose-1.webp&quot; alt=&quot;Install Docmost Using Docker Compose - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;We create a network for Docmost using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create docmost-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-docmost-using-docker-compose-2.webp&quot; alt=&quot;Install Docmost Using Docker Compose - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to clone the repository that contains the configuration files, which include all the necessary conditions for Docmost to work.&lt;/p&gt;
&lt;p&gt;You can clone the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/heyvaldemar/docmost-traefik-letsencrypt-docker-compose.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-docmost-using-docker-compose-3.webp&quot; alt=&quot;Install Docmost Using Docker Compose - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Navigate to the directory with the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd docmost-traefik-letsencrypt-docker-compose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-docmost-using-docker-compose-4.webp&quot; alt=&quot;Install Docmost Using Docker Compose - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to change the variables in the &lt;code&gt;.env&lt;/code&gt; file according to your requirements.&lt;/p&gt;
&lt;p&gt;:::important
The &lt;code&gt;.env&lt;/code&gt; file should be in the same directory as &lt;code&gt;docmost-traefik-letsencrypt-docker-compose.yml&lt;/code&gt;.
:::&lt;/p&gt;
&lt;p&gt;Now let&apos;s start Docmost with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose -f docmost-traefik-letsencrypt-docker-compose.yml -p docmost up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-docmost-using-docker-compose-5.webp&quot; alt=&quot;Install Docmost Using Docker Compose - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Docmost management panel, go to &lt;code&gt;https://docmost.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;docmost.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik service, which will redirect the request to Docmost.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;The next step is to provide: workspace name, your full name, an email address and a password to create a Docmost administrator account.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Create workspace&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-docmost-using-docker-compose-6.webp&quot; alt=&quot;Install Docmost Using Docker Compose - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Docmost control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-docmost-using-docker-compose-7.webp&quot; alt=&quot;Install Docmost Using Docker Compose - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Traefik control panel, go to &lt;code&gt;https://traefik.docmost.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;traefik.docmost.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Enter the username and password previously set in the &lt;code&gt;.env&lt;/code&gt; file, and click the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-docmost-using-docker-compose-8.webp&quot; alt=&quot;Install Docmost Using Docker Compose - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Traefik control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-docmost-using-docker-compose-9.webp&quot; alt=&quot;Install Docmost Using Docker Compose - Step 9&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Self-Hosting</category><category>Docmost</category><category>Docker</category><category>Documentation</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install AFFiNE Using Docker Compose</title><link>https://heyvaldemar.com/install-affine-using-docker-compose/</link><guid isPermaLink="true">https://heyvaldemar.com/install-affine-using-docker-compose/</guid><description>Step-by-step guide to install AFFiNE using Docker Compose with Traefik and Let&apos;s Encrypt. Build your open-source productivity platform in minutes.</description><pubDate>Sun, 29 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing AFFiNE using Docker Compose.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://affine.pro/&quot;&gt;AFFiNE&lt;/a&gt; is a full-featured, open-source workspace that functions as an operating system for all the components that form your knowledge base and beyond. It integrates features like a wiki, knowledge management, presentations, and digital assets management. AFFiNE is a superior alternative to platforms like Notion and Miro.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted AFFiNE when your team requires full data ownership over knowledge management content or operates under data residency requirements. For teams prioritizing speed of adoption over infrastructure control, Notion provides a managed alternative with richer integrations. Self-hosting trades operational overhead for complete control over data storage, backup schedules, and access policies.
:::&lt;/p&gt;
&lt;p&gt;💾 &lt;strong&gt;You can find the repository used in this guide on &lt;a href=&quot;https://github.com/heyvaldemar/affine-traefik-letsencrypt-docker-compose&quot;&gt;GitHub&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;heyvaldemar/affine-traefik-letsencrypt-docker-compose&quot;}&lt;/p&gt;
&lt;p&gt;:::note
We&apos;ll use &lt;a href=&quot;https://traefik.io/traefik/&quot;&gt;Traefik&lt;/a&gt; as our reverse proxy. It&apos;ll handle obtaining cryptographic certificates from &lt;a href=&quot;https://letsencrypt.org/&quot;&gt;Let&apos;s Encrypt&lt;/a&gt; for your domain names and route requests to the corresponding services based on those domains.
:::&lt;/p&gt;
&lt;p&gt;:::caution
To obtain cryptographic certificates, you will need A-type records in the external DNS zone, which point to the IP address of your server where Traefik is installed. If you have created these records recently, you should wait before starting the installation of the services. Full replication of these records between DNS servers can take from a few minutes to 48 hours or even longer in rare cases.
:::&lt;/p&gt;
&lt;p&gt;:::important
Docker Engine and Docker Compose must be installed on the server.&lt;/p&gt;
&lt;p&gt;For a step-by-step guide on installing Docker Engine on Ubuntu Server, see &lt;a href=&quot;/install-docker-engine-and-docker-compose-on-ubuntu-server/&quot;&gt;Install Docker Engine and Docker Compose on Ubuntu Server&lt;/a&gt;
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on the server you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to obtain a free cryptographic certificate through the Let&apos;s Encrypt certification center.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the AFFiNE web interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which AFFiNE is planned to be installed.&lt;/p&gt;
&lt;p&gt;Now it is necessary to create networks for your services.&lt;/p&gt;
&lt;p&gt;We create a network for Traefik using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create traefik-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-affine-using-docker-compose-1.webp&quot; alt=&quot;Install AFFiNE Using Docker Compose - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;We create a network for AFFiNE using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create affine-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-affine-using-docker-compose-2.webp&quot; alt=&quot;Install AFFiNE Using Docker Compose - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to clone the repository that contains the configuration files, which include all the necessary conditions for AFFiNE to work.&lt;/p&gt;
&lt;p&gt;You can clone the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/heyvaldemar/affine-traefik-letsencrypt-docker-compose.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-affine-using-docker-compose-3.webp&quot; alt=&quot;Install AFFiNE Using Docker Compose - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Navigate to the directory with the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd affine-traefik-letsencrypt-docker-compose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-affine-using-docker-compose-4.webp&quot; alt=&quot;Install AFFiNE Using Docker Compose - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to change the variables in the &lt;code&gt;.env&lt;/code&gt; file according to your requirements.&lt;/p&gt;
&lt;p&gt;:::important
The &lt;code&gt;.env&lt;/code&gt; file should be in the same directory as &lt;code&gt;affine-traefik-letsencrypt-docker-compose.yml&lt;/code&gt;.
:::&lt;/p&gt;
&lt;p&gt;Now let&apos;s start AFFiNE with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose -f affine-traefik-letsencrypt-docker-compose.yml -p affine up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-affine-using-docker-compose-5.webp&quot; alt=&quot;Install AFFiNE Using Docker Compose - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the AFFiNE management panel, go to &lt;code&gt;https://affine.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;affine.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik service, which will redirect the request to AFFiNE.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Click on the &quot;Continue&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-affine-using-docker-compose-6.webp&quot; alt=&quot;Install AFFiNE Using Docker Compose - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to provide: your full name, an email address and a password to create a AFFiNE administrator account.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Continue&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-affine-using-docker-compose-7.webp&quot; alt=&quot;Install AFFiNE Using Docker Compose - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the AFFiNE control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-affine-using-docker-compose-8.webp&quot; alt=&quot;Install AFFiNE Using Docker Compose - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Traefik control panel, go to &lt;code&gt;https://traefik.affine.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;traefik.affine.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Enter the username and password previously set in the &lt;code&gt;.env&lt;/code&gt; file, and click the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-affine-using-docker-compose-9.webp&quot; alt=&quot;Install AFFiNE Using Docker Compose - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Traefik control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-affine-using-docker-compose-10.webp&quot; alt=&quot;Install AFFiNE Using Docker Compose - Step 10&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Self-Hosting</category><category>AFFiNE</category><category>Docker</category><category>Notion</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Homebox Using Docker Compose</title><link>https://heyvaldemar.com/install-homebox-using-docker-compose/</link><guid isPermaLink="true">https://heyvaldemar.com/install-homebox-using-docker-compose/</guid><description>Step-by-step guide to install Homebox with Docker Compose and Traefik. Secure your home inventory system with HTTPS using Let&apos;s Encrypt.</description><pubDate>Sat, 28 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Homebox using Docker Compose.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hay-kot.github.io/homebox/&quot;&gt;Homebox&lt;/a&gt; is an inventory and organization system designed specifically for home users. Emphasizing simplicity and ease of use, it offers the perfect solution for managing your home inventory, organizing belongings, and streamlining household management.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted Homebox when you need a lightweight home inventory system with full data ownership and no subscription fees. Sortly provides a managed alternative with barcode scanning and team features. Self-hosting is justified when you want a simple, privacy-first inventory tool without recurring SaaS costs or when you need to integrate with your existing backup infrastructure.
:::&lt;/p&gt;
&lt;p&gt;💾 &lt;strong&gt;You can find the repository used in this guide on &lt;a href=&quot;https://github.com/heyvaldemar/homebox-traefik-letsencrypt-docker-compose&quot;&gt;GitHub&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;heyvaldemar/homebox-traefik-letsencrypt-docker-compose&quot;}&lt;/p&gt;
&lt;p&gt;:::note
We&apos;ll use &lt;a href=&quot;https://traefik.io/traefik/&quot;&gt;Traefik&lt;/a&gt; as our reverse proxy. It&apos;ll handle obtaining cryptographic certificates from &lt;a href=&quot;https://letsencrypt.org/&quot;&gt;Let&apos;s Encrypt&lt;/a&gt; for your domain names and route requests to the corresponding services based on those domains.
:::&lt;/p&gt;
&lt;p&gt;:::caution
To obtain cryptographic certificates, you will need A-type records in the external DNS zone, which point to the IP address of your server where Traefik is installed. If you have created these records recently, you should wait before starting the installation of the services. Full replication of these records between DNS servers can take from a few minutes to 48 hours or even longer in rare cases.
:::&lt;/p&gt;
&lt;p&gt;:::important
Docker Engine and Docker Compose must be installed on the server.&lt;/p&gt;
&lt;p&gt;For a step-by-step guide on installing Docker Engine on Ubuntu Server, see &lt;a href=&quot;/install-docker-engine-and-docker-compose-on-ubuntu-server/&quot;&gt;Install Docker Engine and Docker Compose on Ubuntu Server&lt;/a&gt;
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on the server you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to obtain a free cryptographic certificate through the Let&apos;s Encrypt certification center.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the Homebox web interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which Homebox is planned to be installed.&lt;/p&gt;
&lt;p&gt;Now it is necessary to create networks for your services.&lt;/p&gt;
&lt;p&gt;We create a network for Traefik using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create traefik-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-homebox-using-docker-compose-1.webp&quot; alt=&quot;Install Homebox Using Docker Compose - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;We create a network for Homebox using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create homebox-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-homebox-using-docker-compose-2.webp&quot; alt=&quot;Install Homebox Using Docker Compose - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to clone the repository that contains the configuration files, which include all the necessary conditions for Homebox to work.&lt;/p&gt;
&lt;p&gt;You can clone the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/heyvaldemar/homebox-traefik-letsencrypt-docker-compose.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-homebox-using-docker-compose-3.webp&quot; alt=&quot;Install Homebox Using Docker Compose - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Navigate to the directory with the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd homebox-traefik-letsencrypt-docker-compose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-homebox-using-docker-compose-4.webp&quot; alt=&quot;Install Homebox Using Docker Compose - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to change the variables in the &lt;code&gt;.env&lt;/code&gt; file according to your requirements.&lt;/p&gt;
&lt;p&gt;:::important
The &lt;code&gt;.env&lt;/code&gt; file should be in the same directory as &lt;code&gt;homebox-traefik-letsencrypt-docker-compose.yml&lt;/code&gt;.
:::&lt;/p&gt;
&lt;p&gt;Now let&apos;s start Homebox with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose -f homebox-traefik-letsencrypt-docker-compose.yml -p homebox up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-homebox-using-docker-compose-5.webp&quot; alt=&quot;Install Homebox Using Docker Compose - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Homebox management panel, go to &lt;code&gt;https://homebox.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;homebox.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik service, which will redirect the request to Homebox.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Click on the &quot;Register&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-homebox-using-docker-compose-6.webp&quot; alt=&quot;Install Homebox Using Docker Compose - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to provide: your full name, an email address and a password to create a Homebox administrator account.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Register&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-homebox-using-docker-compose-7.webp&quot; alt=&quot;Install Homebox Using Docker Compose - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Enter the email and password previously set, and click the &quot;Login&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-homebox-using-docker-compose-8.webp&quot; alt=&quot;Install Homebox Using Docker Compose - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Homebox control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-homebox-using-docker-compose-9.webp&quot; alt=&quot;Install Homebox Using Docker Compose - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Traefik control panel, go to &lt;code&gt;https://traefik.homebox.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;traefik.homebox.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Enter the username and password previously set in the &lt;code&gt;.env&lt;/code&gt; file, and click the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-homebox-using-docker-compose-10.webp&quot; alt=&quot;Install Homebox Using Docker Compose - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Traefik control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-homebox-using-docker-compose-11.webp&quot; alt=&quot;Install Homebox Using Docker Compose - Step 11&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Self-Hosting</category><category>Homebox</category><category>Docker</category><category>Inventory</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Ollama Using Docker Compose</title><link>https://heyvaldemar.com/install-ollama-using-docker-compose/</link><guid isPermaLink="true">https://heyvaldemar.com/install-ollama-using-docker-compose/</guid><description>Deploy Ollama locally with Docker Compose and Traefik. Step-by-step guide for setting up LLMs with HTTPS, domain routing, and secure container orchestration.</description><pubDate>Fri, 27 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Ollama using Docker Compose.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://ollama.com/&quot;&gt;Ollama&lt;/a&gt; is a streamlined, modular framework designed for developing and operating language models locally.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted Ollama when you need local LLM inference with full data privacy — no prompts or responses leave your infrastructure. The OpenAI API or AWS Bedrock provide managed alternatives with larger model selection and zero GPU maintenance. Self-hosting is justified when data sensitivity prohibits external API calls or when predictable inference costs outweigh the capital expense of GPU hardware.
:::&lt;/p&gt;
&lt;p&gt;💾 &lt;strong&gt;You can find the repository used in this guide on &lt;a href=&quot;https://github.com/heyvaldemar/ollama-traefik-letsencrypt-docker-compose&quot;&gt;GitHub&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;heyvaldemar/ollama-traefik-letsencrypt-docker-compose&quot;}&lt;/p&gt;
&lt;p&gt;:::note
We&apos;ll use &lt;a href=&quot;https://traefik.io/traefik/&quot;&gt;Traefik&lt;/a&gt; as our reverse proxy. It&apos;ll handle obtaining cryptographic certificates from &lt;a href=&quot;https://letsencrypt.org/&quot;&gt;Let&apos;s Encrypt&lt;/a&gt; for your domain names and route requests to the corresponding services based on those domains.
:::&lt;/p&gt;
&lt;p&gt;:::caution
To obtain cryptographic certificates, you will need A-type records in the external DNS zone, which point to the IP address of your server where Traefik is installed. If you have created these records recently, you should wait before starting the installation of the services. Full replication of these records between DNS servers can take from a few minutes to 48 hours or even longer in rare cases.
:::&lt;/p&gt;
&lt;p&gt;:::important
Docker Engine and Docker Compose must be installed on the server.&lt;/p&gt;
&lt;p&gt;For a step-by-step guide on installing Docker Engine on Ubuntu Server, see &lt;a href=&quot;/install-docker-engine-and-docker-compose-on-ubuntu-server/&quot;&gt;Install Docker Engine and Docker Compose on Ubuntu Server&lt;/a&gt;
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on the server you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to obtain a free cryptographic certificate through the Let&apos;s Encrypt certification center.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the Ollama web interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which Ollama is planned to be installed.&lt;/p&gt;
&lt;p&gt;Now it is necessary to create networks for your services.&lt;/p&gt;
&lt;p&gt;We create a network for Traefik using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create traefik-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-ollama-using-docker-compose-1.webp&quot; alt=&quot;Install Ollama Using Docker Compose - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;We create a network for Ollama using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create ollama-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-ollama-using-docker-compose-2.webp&quot; alt=&quot;Install Ollama Using Docker Compose - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to clone the repository that contains the configuration files, which include all the necessary conditions for Ollama to work.&lt;/p&gt;
&lt;p&gt;You can clone the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/heyvaldemar/ollama-traefik-letsencrypt-docker-compose.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-ollama-using-docker-compose-3.webp&quot; alt=&quot;Install Ollama Using Docker Compose - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Navigate to the directory with the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd ollama-traefik-letsencrypt-docker-compose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-ollama-using-docker-compose-4.webp&quot; alt=&quot;Install Ollama Using Docker Compose - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to change the variables in the &lt;code&gt;.env&lt;/code&gt; file according to your requirements.&lt;/p&gt;
&lt;p&gt;:::important
The &lt;code&gt;.env&lt;/code&gt; file should be in the same directory as &lt;code&gt;ollama-traefik-letsencrypt-docker-compose.yml&lt;/code&gt;.
:::&lt;/p&gt;
&lt;p&gt;Now let&apos;s start Ollama with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose -f ollama-traefik-letsencrypt-docker-compose.yml -p ollama up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-ollama-using-docker-compose-5.webp&quot; alt=&quot;Install Ollama Using Docker Compose - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Ollama management panel, go to &lt;code&gt;https://ollama.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;ollama.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik service, which will redirect the request to Ollama.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Click on the &quot;Sign up&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ollama-using-docker-compose-6.webp&quot; alt=&quot;Install Ollama Using Docker Compose - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to provide: your full name, an email address and a password to create a Ollama administrator account.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Create Account&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ollama-using-docker-compose-7.webp&quot; alt=&quot;Install Ollama Using Docker Compose - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Ollama control panel.&lt;/p&gt;
&lt;p&gt;Please wait for the models listed in your &lt;code&gt;.env&lt;/code&gt; file to download; the duration will depend on your internet speed. Once downloaded, you can select any model from the left corner of the interface to start using it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ollama-using-docker-compose-8.webp&quot; alt=&quot;Install Ollama Using Docker Compose - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Traefik control panel, go to &lt;code&gt;https://traefik.ollama.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;traefik.ollama.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Enter the username and password previously set in the &lt;code&gt;.env&lt;/code&gt; file, and click the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ollama-using-docker-compose-9.webp&quot; alt=&quot;Install Ollama Using Docker Compose - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Traefik control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ollama-using-docker-compose-10.webp&quot; alt=&quot;Install Ollama Using Docker Compose - Step 10&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>AI &amp; MLOps</category><category>AI</category><category>LLMOps</category><category>Ollama</category><category>LLM</category><category>Docker</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Nextcloud Using Docker Compose</title><link>https://heyvaldemar.com/install-nextcloud-using-docker-compose/</link><guid isPermaLink="true">https://heyvaldemar.com/install-nextcloud-using-docker-compose/</guid><description>Complete guide to installing Nextcloud with Docker Compose and Traefik. Learn to deploy your own secure file sharing and collaboration cloud with HTTPS.</description><pubDate>Mon, 02 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Nextcloud using Docker Compose.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://nextcloud.com/&quot;&gt;Nextcloud&lt;/a&gt; is an analogue of Dropbox, which you can install on your own server and make a cloud for storing files - photos, videos and any others. The application can be used for collaboration and confidential file sharing, setting access levels for each user. You can also make voice and video calls using the separate NextCloud Talk mobile app.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted Nextcloud when your organization requires on-premises file storage with full data sovereignty, custom storage backends, and no per-user licensing. Google Drive or Dropbox provide managed alternatives with native collaboration and lower operational cost. Self-hosting is justified when data residency requirements or storage volume make SaaS per-user pricing impractical.
:::&lt;/p&gt;
&lt;p&gt;💾 &lt;strong&gt;You can find the repository used in this guide on &lt;a href=&quot;https://github.com/heyvaldemar/nextcloud-traefik-letsencrypt-docker-compose&quot;&gt;GitHub&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;heyvaldemar/nextcloud-traefik-letsencrypt-docker-compose&quot;}&lt;/p&gt;
&lt;p&gt;:::note
We&apos;ll use &lt;a href=&quot;https://traefik.io/traefik/&quot;&gt;Traefik&lt;/a&gt; as our reverse proxy. It&apos;ll handle obtaining cryptographic certificates from &lt;a href=&quot;https://letsencrypt.org/&quot;&gt;Let&apos;s Encrypt&lt;/a&gt; for your domain names and route requests to the corresponding services based on those domains.
:::&lt;/p&gt;
&lt;p&gt;:::caution
To obtain cryptographic certificates, you will need A-type records in the external DNS zone, which point to the IP address of your server where Traefik is installed. If you have created these records recently, you should wait before starting the installation of the services. Full replication of these records between DNS servers can take from a few minutes to 48 hours or even longer in rare cases.
:::&lt;/p&gt;
&lt;p&gt;:::important
Docker Engine and Docker Compose must be installed on the server.&lt;/p&gt;
&lt;p&gt;For a step-by-step guide on installing Docker Engine on Ubuntu Server, see &lt;a href=&quot;/install-docker-engine-and-docker-compose-on-ubuntu-server/&quot;&gt;Install Docker Engine and Docker Compose on Ubuntu Server&lt;/a&gt;
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on the server you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to obtain a free cryptographic certificate through the Let&apos;s Encrypt certification center.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the Nextcloud web interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which Nextcloud is planned to be installed.&lt;/p&gt;
&lt;p&gt;Now it is necessary to create networks for your services.&lt;/p&gt;
&lt;p&gt;We create a network for Traefik using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create traefik-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-nextcloud-using-docker-compose-1.webp&quot; alt=&quot;Install Nextcloud Using Docker Compose - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;We create a network for Nextcloud using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create nextcloud-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-nextcloud-using-docker-compose-2.webp&quot; alt=&quot;Install Nextcloud Using Docker Compose - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to clone the repository that contains the configuration files, which include all the necessary conditions for Nextcloud to work.&lt;/p&gt;
&lt;p&gt;You can clone the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/heyvaldemar/nextcloud-traefik-letsencrypt-docker-compose.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-nextcloud-using-docker-compose-3.webp&quot; alt=&quot;Install Nextcloud Using Docker Compose - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Navigate to the directory with the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd nextcloud-traefik-letsencrypt-docker-compose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-nextcloud-using-docker-compose-4.webp&quot; alt=&quot;Install Nextcloud Using Docker Compose - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to change the variables in the &lt;code&gt;.env&lt;/code&gt; file according to your requirements.&lt;/p&gt;
&lt;p&gt;:::important
The &lt;code&gt;.env&lt;/code&gt; file should be in the same directory as &lt;code&gt;nextcloud-traefik-letsencrypt-docker-compose.yml&lt;/code&gt;.
:::&lt;/p&gt;
&lt;p&gt;Now let&apos;s start Nextcloud with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose -f nextcloud-traefik-letsencrypt-docker-compose.yml -p nextcloud up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-nextcloud-using-docker-compose-5.webp&quot; alt=&quot;Install Nextcloud Using Docker Compose - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Nextcloud management panel, go to &lt;code&gt;https://nextcloud.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;nextcloud.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik service, which will redirect the request to Nextcloud.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Enter the username and password that you previously set in the &lt;code&gt;.env&lt;/code&gt; file, and click the &quot;Log In&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-nextcloud-using-docker-compose-6.webp&quot; alt=&quot;Install Nextcloud Using Docker Compose - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Nextcloud control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-nextcloud-using-docker-compose-7.webp&quot; alt=&quot;Install Nextcloud Using Docker Compose - Step 7&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Background Jobs Using Cron&lt;/h2&gt;
&lt;p&gt;To ensure your Nextcloud instance operates efficiently, it&apos;s important to use the &quot;Cron&quot; method to execute background jobs. A dedicated Docker container has already been set up in your environment to handle these tasks.&lt;/p&gt;
&lt;h3&gt;Steps to Enable Cron&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Log in to Nextcloud as an Administrator.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Administration settings&lt;/strong&gt; (click on your user profile in the top right corner and select &quot;Administration settings&quot;).&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Administration&lt;/strong&gt; section on the left sidebar, select &lt;strong&gt;Basic settings&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Scroll down to the &lt;strong&gt;Background jobs&lt;/strong&gt; section.&lt;/li&gt;
&lt;li&gt;Select the &lt;strong&gt;&quot;Cron (Recommended)&quot;&lt;/strong&gt; option.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./install-nextcloud-using-docker-compose-8.webp&quot; alt=&quot;Install Nextcloud Using Docker Compose - Step 8&quot;&gt;&lt;/p&gt;
&lt;h3&gt;Why Use Cron?&lt;/h3&gt;
&lt;p&gt;The &quot;Cron&quot; method ensures that background tasks, such as file indexing, notifications, and cleanup operations, run at regular intervals independently of user activity. This method is more reliable and efficient than AJAX or Webcron, particularly for larger or more active instances, as it does not depend on users accessing the site to trigger these tasks. With the dedicated container in your setup, this method keeps your Nextcloud instance responsive and in good health by running these jobs consistently.&lt;/p&gt;
&lt;p&gt;To access the Traefik control panel, go to &lt;code&gt;https://traefik.nextcloud.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;traefik.nextcloud.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Enter the username and password previously set in the &lt;code&gt;.env&lt;/code&gt; file, and click the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-nextcloud-using-docker-compose-9.webp&quot; alt=&quot;Install Nextcloud Using Docker Compose - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Traefik control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-nextcloud-using-docker-compose-10.webp&quot; alt=&quot;Install Nextcloud Using Docker Compose - Step 10&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Self-Hosting</category><category>Nextcloud</category><category>Docker</category><category>Cloud Storage</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Choosing Between Docker Swarm and Kubernetes for Container Management</title><link>https://heyvaldemar.com/choosing-between-docker-swarm-and-kubernetes-for-container-management/</link><guid isPermaLink="true">https://heyvaldemar.com/choosing-between-docker-swarm-and-kubernetes-for-container-management/</guid><description>Compare Docker Swarm vs. Kubernetes for container orchestration. Explore key differences in scalability, security, networking, and DevOps integration.</description><pubDate>Fri, 16 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You&apos;re here for one reason. You need to pick an orchestrator that won&apos;t burn you a year from now.&lt;/p&gt;
&lt;p&gt;Maybe your boss wants Kubernetes. Maybe your CI still runs on Docker Compose. Or you&apos;re trying to scale without rewriting the whole stack from scratch. Doesn&apos;t matter which. Here&apos;s the honest read on &lt;strong&gt;Swarm vs. Kubernetes&lt;/strong&gt; from someone who&apos;s run both in production and is still standing.&lt;/p&gt;
&lt;h2&gt;Docker Swarm: The Lightweight Underdog That Still Punches&lt;/h2&gt;
&lt;p&gt;Swarm takes a cluster of Docker hosts and makes them act like one virtual engine. That&apos;s the whole trick. It&apos;s still useful in 2025.&lt;/p&gt;
&lt;p&gt;Since 2019 it&apos;s been owned by &lt;a href=&quot;https://www.mirantis.com/&quot;&gt;Mirantis&lt;/a&gt;, not Docker Inc. That matters more than people think. Go in expecting Kubernetes-speed development and you&apos;ll walk away let down.&lt;/p&gt;
&lt;p&gt;For &lt;strong&gt;teams who value simplicity&lt;/strong&gt;, though, Swarm still does the job.&lt;/p&gt;
&lt;h3&gt;What Swarm Does Well&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Declarative deployments&lt;/strong&gt; with simple YAML syntax — even easier than Compose.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Built-in rolling updates&lt;/strong&gt; with zero downtime (assuming your app handles it).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Out-of-the-box overlay networking&lt;/strong&gt; with automatic service discovery.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TLS and encryption between nodes&lt;/strong&gt; enabled by default — no extra setup.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Already living in the Docker CLI? Swarm feels like home.&lt;/p&gt;
&lt;p&gt;📖 &lt;a href=&quot;https://docs.mirantis.com/&quot;&gt;Mirantis Docker Swarm Docs&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Kubernetes: Industrial-Grade Orchestration at a Price&lt;/h2&gt;
&lt;p&gt;Kubernetes is the heavy option. Google built it to run hyperscale workloads, and &lt;strong&gt;every cloud vendor on Earth&lt;/strong&gt; keeps it alive.&lt;/p&gt;
&lt;p&gt;Powerful. Extensible. And &lt;strong&gt;complex as hell&lt;/strong&gt; if you&apos;re new to it.&lt;/p&gt;
&lt;h3&gt;What Kubernetes Gets Right&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Horizontal autoscaling&lt;/strong&gt;: spin up more pods when traffic spikes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Self-healing services&lt;/strong&gt;: crashed pods are restarted automatically.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dynamic volume provisioning&lt;/strong&gt; with support for multiple backends (NFS, EBS, PVCs, etc.).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fine-grained security&lt;/strong&gt; with RBAC, network policies, PodSecurity standards, and more.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then there&apos;s the ecosystem, which is enormous. Prometheus, Istio, ArgoCD. If a tool is worth using, somebody already wired it to Kubernetes.&lt;/p&gt;
&lt;p&gt;📖 &lt;a href=&quot;https://kubernetes.io/&quot;&gt;Kubernetes.io&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Head-to-Head Comparison&lt;/h2&gt;
&lt;p&gt;Here&apos;s the part that actually decides things: features, tooling, and the trade-offs you hit in the real world.&lt;/p&gt;
&lt;h3&gt;Networking&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Swarm:&lt;/strong&gt; Overlay networks are easy. Built-in DNS and load balancing. Great for small-to-mid setups.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kubernetes:&lt;/strong&gt; More powerful, more secure — supports service meshes, network policies, and custom ingress controllers. But it takes work.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Storage&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Swarm:&lt;/strong&gt; Volumes work, but that&apos;s it. No dynamic provisioning or persistent volume claims.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kubernetes:&lt;/strong&gt; StorageClasses, dynamic volumes, CSI plugins — it&apos;s built for running stateful services at scale.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Security&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Swarm:&lt;/strong&gt; TLS everywhere by default. RBAC is there but basic.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kubernetes:&lt;/strong&gt; Industrial-grade security. Per-pod policies, secrets, service accounts — everything you need to lock it down.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Tooling and Integration&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Swarm:&lt;/strong&gt; Plays nicely with the Docker ecosystem. Compose, CLI, and Docker Hub all work together.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kubernetes:&lt;/strong&gt; Hooks into everything. GitOps, monitoring, tracing, CI/CD, you name it.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Ecosystem and Future&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Swarm:&lt;/strong&gt; Still alive, thanks to Mirantis. But let&apos;s be honest — development is slow.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kubernetes:&lt;/strong&gt; Rapidly evolving, with an army of contributors and full cloud support (EKS, GKE, AKS, etc.).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;So, Which Should You Use?&lt;/h2&gt;
&lt;p&gt;No hedging. Here&apos;s how it breaks down:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Pick This&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;You want dead-simple orchestration for internal tools or staging&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Docker Swarm&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;You already know Docker and want a soft learning curve&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Swarm&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;You&apos;re deploying production-grade services with autoscaling, CI/CD, and GitOps&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Kubernetes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;You need fine-grained security, multitenancy, and persistent storage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Kubernetes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;You&apos;re migrating to or already in the cloud&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Kubernetes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;My Rule of Thumb?&lt;/h3&gt;
&lt;p&gt;Fewer than 10 services and you just want to ship? Go &lt;strong&gt;Swarm&lt;/strong&gt;.&lt;br&gt;
The moment your system diagram needs multiple boxes and arrows, it&apos;s &lt;strong&gt;Kubernetes time&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Final Words&lt;/h2&gt;
&lt;p&gt;Swarm isn&apos;t dead. Kubernetes isn&apos;t magic. Both are tools. Pick the one that fits your team, your stack, and your &lt;em&gt;actual&lt;/em&gt; operational reality.&lt;/p&gt;
&lt;p&gt;Still on the fence? Spin up both. Build something trivial and deploy it. Then watch where your hours go: writing YAML, or fixing YAML.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>Docker</category><category>Kubernetes</category><category>Docker Swarm</category><category>Orchestration</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Cheburnet as the Fortress of Lies and Censorship in Russia</title><link>https://heyvaldemar.com/cheburnet-as-the-fortress-of-lies-and-censorship-in-russia/</link><guid isPermaLink="true">https://heyvaldemar.com/cheburnet-as-the-fortress-of-lies-and-censorship-in-russia/</guid><description>The tightening of internet censorship in Russia, including blocking access to social networks and VPNs, illustrates the growth of isolation and control.</description><pubDate>Sat, 10 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In 2022, Russia opened a new dark chapter in its history. With the support of a submissive population, authorities not only perpetrated a genocide against the Ukrainian people but also began heroically suffocating the remaining vestiges of free speech within the country.&lt;/p&gt;
&lt;p&gt;Each new restriction, whether it was X (formerly known as Twitter), Facebook, Instagram, YouTube, or VPN services, was met with approval by Russians. They not only passively accepted the loss of their rights but also vehemently rejected Western services, condemning them for mythical &quot;sin and depravity&quot;. For the Russian orcs, Cheburnet became not just a shield from the world but a fortress of lies, protecting them from the truth.&lt;/p&gt;
&lt;p&gt;Each date listed below is not just a mark on the calendar but a brick in the wall of Cheburnet, separating the regime-submissive Russians from the rest of the world.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;March 4, 2022&lt;/strong&gt; — Russia blocked access to X (formerly known as Twitter) and Facebook, starting a large-scale campaign against platforms that could host critical opinions or information about the invasion of Ukraine.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;March 14, 2022&lt;/strong&gt; — Instagram was blocked, further reducing Russians&apos; access to global social networks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;August 7, 2022&lt;/strong&gt; — The blockage of Patreon limited content creators dependent on international donations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;September 22, 2022&lt;/strong&gt; — SoundCloud was blocked, affecting musicians and podcasters.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;October 19, 2022&lt;/strong&gt; — Metacritic was blocked, limiting access to entertainment content reviews and ratings.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;March 1, 2024&lt;/strong&gt; — A ban on promoting VPN services, crucial for bypassing internet censorship, was introduced.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;April 23, 2024&lt;/strong&gt; — The government blocked 150 of the most popular VPN services, significantly hindering the ability to circumvent local internet restrictions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;July 12, 2024&lt;/strong&gt; — Ficbook, a popular resource for Russian-language fanfiction, was blocked.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;July 16, 2024&lt;/strong&gt; — Envato, a major resource for stock photography, video, and music, was blocked.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;August 5, 2024&lt;/strong&gt; — YouTube was slowed down to a non-functional state, virtually depriving users of access to video content.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;August 8, 2024&lt;/strong&gt; — Bloggers with more than 10,000 subscribers are required to register with Roskomnadzor and provide personal information.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;August 9, 2024&lt;/strong&gt; — The messaging app Signal was blocked on charges of violating Russian law, necessary to prevent its use in terrorist and extremist activities.&lt;/p&gt;
&lt;p&gt;And yet another chord in the symphony of horror is the new authority of Roskomnadzor. The agency now has the power to control the networks of all internet providers in the country. This means that if a provider fails to comply with content removal demands, Roskomnadzor can take over the network management. Moreover, they can do this without any notification, giving the state agency nearly unlimited possibilities for control and censorship.&lt;/p&gt;
</content:encoded><category>Opinion &amp; Culture</category><category>Politics</category><category>Censorship</category><category>Internet</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>DevOps and Platform Engineering Dynamics</title><link>https://heyvaldemar.com/devops-and-platform-engineering-dynamics/</link><guid isPermaLink="true">https://heyvaldemar.com/devops-and-platform-engineering-dynamics/</guid><description>How DevOps and Platform Engineering reshape software development — key strategies, technological innovations, and the trends shaping the industry.</description><pubDate>Wed, 24 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;There&apos;s a lot of noise out there. Some say Platform Engineering is the new DevOps. Others say DevOps is dead. Most people just want their CI/CD to stop breaking every Friday night.&lt;/p&gt;
&lt;p&gt;Here&apos;s the truth. &lt;strong&gt;DevOps and Platform Engineering aren&apos;t enemies. They&apos;re on the same side.&lt;/strong&gt; But they do very different jobs, and if you&apos;re building modern systems you need to understand both. No buzzwords. No corporate diagrams. Just the reality from someone who has built the pipelines, deployed the platforms, and lived to tell the tale.&lt;/p&gt;
&lt;h2&gt;So What Is DevOps, Really?&lt;/h2&gt;
&lt;p&gt;Forget the DevOps-as-a-job-title nonsense. &lt;strong&gt;DevOps is a culture shift.&lt;/strong&gt; It says developers and ops don&apos;t sit in silos lobbing blame and Jira tickets at each other.&lt;/p&gt;
&lt;p&gt;The real goals:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Automate everything&lt;/strong&gt; (builds, tests, deploys, rollbacks)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shorten feedback loops&lt;/strong&gt; between commit and production&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Make infrastructure repeatable and resilient&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Break the wall between code and runtime&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CI/CD pipelines, observability stacks, IaC, chatops. Those are just how we do it. The &lt;strong&gt;outcome&lt;/strong&gt; is faster, safer delivery. That&apos;s the part that matters.&lt;/p&gt;
&lt;h2&gt;Then What&apos;s Platform Engineering?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Platform Engineering is what happens when DevOps grows up.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Every team reinventing Dockerfiles, Helm charts, and GitLab jobs is waste. So platform engineers build &lt;strong&gt;Internal Developer Platforms (IDPs)&lt;/strong&gt; that do it for them. The right way. Every time.&lt;/p&gt;
&lt;p&gt;These platforms offer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Golden paths: sane defaults, reusable templates&lt;/li&gt;
&lt;li&gt;Self-service: devs get what they need without waiting on ops&lt;/li&gt;
&lt;li&gt;Governance: security and compliance baked in, not duct-taped later&lt;/li&gt;
&lt;li&gt;Automation: provisioning, pipelines, secrets, telemetry, all wired together&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Platform Engineering &lt;strong&gt;doesn&apos;t replace DevOps&lt;/strong&gt;. It productizes it.&lt;/p&gt;
&lt;h2&gt;Key Differences That Actually Matter&lt;/h2&gt;
&lt;p&gt;Let&apos;s stop pretending they&apos;re the same thing:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Area&lt;/th&gt;
&lt;th&gt;DevOps&lt;/th&gt;
&lt;th&gt;Platform Engineering&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scope&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Broad — culture + tools&lt;/td&gt;
&lt;td&gt;Narrow — productizing infrastructure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Focus&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Automating delivery&lt;/td&gt;
&lt;td&gt;Building platforms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Users&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Devs + Ops teams&lt;/td&gt;
&lt;td&gt;Devs (as customers)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Outcomes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Speed, feedback loops&lt;/td&gt;
&lt;td&gt;Reliability, self-service, scale&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mindset&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&quot;How do we deliver faster?&quot;&lt;/td&gt;
&lt;td&gt;&quot;How do we make devs productive?&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;DevOps is the philosophy. Platform Engineering is the product built on top of it.&lt;/p&gt;
&lt;h2&gt;What Each Role Actually Does&lt;/h2&gt;
&lt;h3&gt;DevOps Engineer&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Automates CI/CD&lt;/li&gt;
&lt;li&gt;Manages monitoring/logging&lt;/li&gt;
&lt;li&gt;Builds IaC pipelines&lt;/li&gt;
&lt;li&gt;Handles on-call and incident response&lt;/li&gt;
&lt;li&gt;Works across product teams&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Platform Engineer&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Builds IDPs using tools like Backstage or Kratix&lt;/li&gt;
&lt;li&gt;Maintains golden templates (e.g. Helm, Terraform modules)&lt;/li&gt;
&lt;li&gt;Automates access to infra and secrets&lt;/li&gt;
&lt;li&gt;Handles platform versioning, upgrades, and lifecycle&lt;/li&gt;
&lt;li&gt;Treats devs as &lt;strong&gt;users&lt;/strong&gt;, not coworkers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The mindset gap is the real difference. &lt;strong&gt;DevOps is glue. Platform Engineering is a product.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Why Platform Engineering Took Off&lt;/h2&gt;
&lt;p&gt;DevOps works great until your company grows. Then every team ends up with its own Terraform repo, its own CI logic, its own broken alerting rules. The sprawl is brutal.&lt;/p&gt;
&lt;p&gt;Platform Engineering fixes that. You build &lt;strong&gt;opinionated, reusable pipelines and infrastructure&lt;/strong&gt; that all teams share. Think:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One way to deploy services&lt;/li&gt;
&lt;li&gt;One place to provision infra&lt;/li&gt;
&lt;li&gt;One way to observe, secure, and scale&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It scales DevOps practices across an organization &lt;strong&gt;without drowning in entropy&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Tools That Actually Help and Aren&apos;t Hype&lt;/h2&gt;
&lt;p&gt;These aren&apos;t shiny tools from slide decks. They&apos;re what real teams are running in production:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Spacelift / Atlantis&lt;/strong&gt; - Terraform automation, policy-as-code, GitOps infra&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Backstage&lt;/strong&gt; - Developer portal for managing services, ownership, templates&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Argo CD&lt;/strong&gt; - GitOps done right for Kubernetes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Crossplane&lt;/strong&gt; - Control plane for infrastructure APIs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cue / Jsonnet&lt;/strong&gt; - Declarative configs without YAML madness&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenFeature / OpenTelemetry&lt;/strong&gt; - Standardized feature flags and tracing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kratix&lt;/strong&gt; - Real platform productization for custom resources&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Don&apos;t just collect tools. Wire them into a platform.&lt;/p&gt;
&lt;h2&gt;Final Word: Build Both, Use Both&lt;/h2&gt;
&lt;p&gt;Stop asking “DevOps or Platform Engineering?” The answer is yes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DevOps is the foundation. Platform Engineering is the scaffolding.&lt;/strong&gt;&lt;br&gt;
Together they give developers fast, secure, repeatable paths to ship code, without waiting three sprints for infra tickets to get answered.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You don&apos;t need a hundred microservices and a service mesh to justify Platform Engineering.&lt;br&gt;
You just need tired engineers deploying snowflake stacks and asking: &lt;em&gt;“Why is everyone doing this differently?”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That&apos;s when you build the platform.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;📚 Want to go deeper?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://platformengineering.org&quot;&gt;Platform Engineering Maturity Model&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://backstage.io&quot;&gt;Backstage by Spotify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://argo-cd.readthedocs.io&quot;&gt;Argo CD Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://spacelift.io&quot;&gt;Spacelift for IaC automation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Don&apos;t get lost in the hype. Build the things that make delivery boring, and reliable.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>Platform Engineering</category><category>Cloud Native</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Vladimir Mikhalev Recognized by Docker CEO</title><link>https://heyvaldemar.com/vladimir-mikhalev-recognized-by-docker-ceo/</link><guid isPermaLink="true">https://heyvaldemar.com/vladimir-mikhalev-recognized-by-docker-ceo/</guid><description>Docker CEO, Scott Johnston, recognizes the extraordinary leadership and contributions of Vladimir Mikhalev.</description><pubDate>Mon, 17 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;At the Docker Captains Summit, Docker&apos;s CEO, &lt;a href=&quot;https://www.linkedin.com/in/scottcjohnston/&quot;&gt;Scott Johnston&lt;/a&gt;, acknowledged the exceptional leadership and contributions of &lt;a href=&quot;https://www.docker.com/contributors/vladimir-mikhalev/&quot;&gt;Vladimir Mikhalev&lt;/a&gt;, Harsh Manvar, and Caroline Martinez.&lt;/p&gt;
&lt;p&gt;import VideoPlayer from &quot;@components/VideoPlayer.astro&quot;;&lt;/p&gt;
&lt;p&gt;&amp;lt;VideoPlayer
videoId=&quot;NAv1e36PTB8&quot;
title=&quot;Vladimir Mikhalev Recognized by Docker CEO&quot;
start={58}
/&amp;gt;&lt;/p&gt;
&lt;p&gt;This recognition is one of several on the record. See &lt;a href=&quot;/provenance/&quot;&gt;the full record of named, first-hand references&lt;/a&gt;, each claim linked to its proof.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Opinion &amp; Culture</category><category>Docker</category><category>Docker Captain</category><category>Community</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Learn Docker CP Command for Effective File Management</title><link>https://heyvaldemar.com/learn-docker-cp-command-effective-file-management/</link><guid isPermaLink="true">https://heyvaldemar.com/learn-docker-cp-command-effective-file-management/</guid><description>Master the Docker cp command to transfer files between host and containers. Boost DevOps efficiency with expert tips, use cases, and best practices.</description><pubDate>Wed, 12 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You haven&apos;t lived in DevOps until you&apos;ve had to yank logs out of a container that&apos;s going down in flames. That&apos;s when &lt;code&gt;docker cp&lt;/code&gt; becomes your best friend.&lt;/p&gt;
&lt;p&gt;Simple. Brutal. Effective.&lt;/p&gt;
&lt;p&gt;This guide skips the fluff. I&apos;ll show you how to &lt;strong&gt;use &lt;code&gt;docker cp&lt;/code&gt; like a pro&lt;/strong&gt;, with real-world examples, the edge cases nobody mentions, and zero hand-holding. Tired of shelling into containers just to grab a config file? Then this one&apos;s for you.&lt;/p&gt;
&lt;h2&gt;What &lt;code&gt;docker cp&lt;/code&gt; Actually Does&lt;/h2&gt;
&lt;p&gt;At its core, &lt;code&gt;docker cp&lt;/code&gt; lets you &lt;strong&gt;copy files to and from containers&lt;/strong&gt;. No &lt;code&gt;exec&lt;/code&gt;. No shell. No drama.&lt;/p&gt;
&lt;p&gt;Think of it as the Docker version of &lt;code&gt;scp&lt;/code&gt; or &lt;code&gt;cp&lt;/code&gt;. The difference is that the “remote” machine is your container&apos;s filesystem.&lt;/p&gt;
&lt;h3&gt;Syntax&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Want the fine print? &lt;a href=&quot;https://docs.docker.com/engine/reference/commandline/cp/&quot;&gt;Official docs are here&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Real Use Cases (You&apos;ll Actually Run Into)&lt;/h2&gt;
&lt;p&gt;So when do you reach for &lt;code&gt;docker cp&lt;/code&gt;? Here&apos;s where it earns its keep.&lt;/p&gt;
&lt;h3&gt;1. Quick Debugging&lt;/h3&gt;
&lt;p&gt;Container misbehaving? Use &lt;code&gt;docker cp&lt;/code&gt; to pull logs or config files without needing a shell.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker cp mycontainer:/var/log/app.log ./app.log
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. Saving Critical Data&lt;/h3&gt;
&lt;p&gt;Back up SQLite DBs, flat files, or anything else that lives inside the container.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker cp mycontainer:/app/data.db ./backup/data.db
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; If your app writes to &lt;code&gt;/tmp&lt;/code&gt;, don&apos;t be surprised if it disappears after a restart.&lt;/p&gt;
&lt;h3&gt;3. Hot Config Injection&lt;/h3&gt;
&lt;p&gt;Update a config file without rebuilding the image or restarting the container:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker cp ./nginx.conf mycontainer:/etc/nginx/nginx.conf
docker exec mycontainer nginx -s reload
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Examples That Actually Help&lt;/h2&gt;
&lt;h3&gt;Copy a File &lt;em&gt;Into&lt;/em&gt; a Container&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker cp ./local.env mycontainer:/app/.env
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Copy a File &lt;em&gt;Out of&lt;/em&gt; a Container&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker cp mycontainer:/app/logs/output.log ./output.log
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Move a File Between Containers (No, There&apos;s No Magic)&lt;/h3&gt;
&lt;p&gt;Docker doesn&apos;t support container-to-container copy directly. So do it the old-school way:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker cp app1:/data/export.csv /tmp/export.csv
docker cp /tmp/export.csv app2:/import/export.csv
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Feels clunky? It is. For anything you do often, use volumes.&lt;/p&gt;
&lt;h2&gt;Gotchas You&apos;ll Run Into (and How to Fix Them)&lt;/h2&gt;
&lt;h3&gt;“permission denied”&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;docker cp&lt;/code&gt; won&apos;t magically override file permissions. Copy something into &lt;code&gt;/root&lt;/code&gt; while your container app runs as &lt;code&gt;node&lt;/code&gt;, and guess what? It&apos;s not going to work.&lt;/p&gt;
&lt;p&gt;Use bind mounts, or fix permissions after the copy:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker exec mycontainer chown node:node /app/.env
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Path Doesn&apos;t Exist&lt;/h3&gt;
&lt;p&gt;Screw up the target path, say by copying into a directory that isn&apos;t there, and Docker will &lt;strong&gt;not&lt;/strong&gt; helpfully create it for you. It&apos;ll fail. As it should.&lt;/p&gt;
&lt;h2&gt;When &lt;code&gt;docker cp&lt;/code&gt; is the Wrong Tool&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Doing frequent file syncs? Use &lt;strong&gt;bind mounts&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Need data persistence? Use &lt;strong&gt;Docker volumes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Want to avoid weird race conditions with scripts reading partially-copied files? Don&apos;t use &lt;code&gt;docker cp&lt;/code&gt; mid-execution.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Example: bind mount your code during dev:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker run -v $PWD:/app myimage
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That way, edits on the host show up inside the container the instant you save.&lt;/p&gt;
&lt;p&gt;More on &lt;a href=&quot;https://docs.docker.com/storage/volumes/&quot;&gt;Docker volumes here&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;docker cp&lt;/code&gt; is like a crowbar. Not elegant. Not subtle. But when you need to pry data out of a sealed container, nothing beats it.&lt;/p&gt;
&lt;p&gt;Use it for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One-off debugging&lt;/li&gt;
&lt;li&gt;Quick backups&lt;/li&gt;
&lt;li&gt;Emergency surgery on broken containers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Don&apos;t build your whole deployment process around it, though. For that, reach for volumes and proper orchestration, and stop pretending &lt;code&gt;docker cp&lt;/code&gt; is a deployment strategy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pro tip:&lt;/strong&gt; Set an alias. You&apos;ll thank yourself at 3AM.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;alias dcp=&apos;docker cp&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Want to go deeper on Docker CLI workflows or file sync strategies? Ping me, or check out the &lt;a href=&quot;https://docs.docker.com/engine/reference/commandline/cp/&quot;&gt;official Docker docs&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>Docker</category><category>CLI</category><category>Containers</category><category>File Management</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>The Fates of Famous Figures Under the Pressure of Power from the Russian Empire to Our Days</title><link>https://heyvaldemar.com/the-fates-of-famous-figures-under-the-pressure-of-power-from-the-russian-empire-to-our-days/</link><guid isPermaLink="true">https://heyvaldemar.com/the-fates-of-famous-figures-under-the-pressure-of-power-from-the-russian-empire-to-our-days/</guid><description>Explore the lives of famous figures persecuted by Russian regimes—from the Empire to today. Discover stories of censorship, exile, and resistance.</description><pubDate>Thu, 06 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Russia has a long habit of breaking the people who think out loud. Artists and public figures whose work cut against the official line got the same treatment again and again: silence them, jail them, or push them across the border. Not much has changed. Opposition figures and cultural names today still face arrests and persecution, and many of them have already left. What follows is a set of short biographies, people who were repressed or driven into emigration, running from the Russian Empire through to present-day Russia. The list is nowhere near complete. It keeps growing, which is the depressing part.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alexander Pushkin&lt;/strong&gt; (1799-1837, Russian Empire) - A poet the state kept on a short leash. His writing, &quot;Ode to Liberty&quot; among it, irritated Emperor Alexander I enough to get him exiled to the southern provinces. Few ways to publish down there. He wrote anyway.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mikhail Lermontov&lt;/strong&gt; (1814-1841, Russian Empire) - A poet undone by a duel and by his poem &quot;Death of the Poet,&quot; written for Pushkin. He criticized the authorities openly, the tsar took offense, and Lermontov was sent off to the Caucasus. He died there, in another duel.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alexander Herzen&lt;/strong&gt; (1812-1870, Russian Empire) — a writer and thinker, considered the father of Russian socialism. His radical politics drew persecution and eventually pushed him into emigration. From exile he set up the &quot;Free Russian Press&quot; in London, the first independent printing operation of its kind, and it did real work spreading liberal and socialist ideas back home.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fyodor Dostoevsky&lt;/strong&gt; (1821-1881, Russian Empire) - Sentenced to death for joining the anti-government Petrashevsky Circle. The sentence became penal servitude in Siberia, then exile, then military service. All of it left deep marks on his writing and his view of the world.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Leo Tolstoy&lt;/strong&gt; (1828-1910, Russian Empire) - Celebrated as a writer, then excommunicated over his philosophy. He attacked the church and kept pushing his own ideas about morality and the spirit, and the church cut him loose.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ilya Repin&lt;/strong&gt; (1844-1930, Russian Empire) - An artist who moved to Finland looking for quiet to work in while Russia tore itself apart. Part of the point was staying out of the politics entirely.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vaslav Nijinsky&lt;/strong&gt; (1890-1950, Russian Empire) - A ballet master who got out during the political chaos and the revolution. Leaving probably saved his career. It also meant starting over in unfamiliar places.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Wassily Kandinsky&lt;/strong&gt; (1866-1944, USSR) - An artist who left over Soviet art policy. He wanted abstraction, the West gave him room for it, and that is where the work came together.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dmitry Merezhkovsky&lt;/strong&gt; (1866-1941, USSR) - A writer who emigrated after the October Revolution. He had no use for Bolshevik power and expected to be punished for his monarchist, religious views.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Zinaida Gippius&lt;/strong&gt; (1869-1945, USSR) - A writer, and Merezhkovsky&apos;s wife. She left with him. They shared the same contempt for the new order and the same fear of what it would do to them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Varlam Shalamov&lt;/strong&gt; (1907-1982, USSR) — a writer, author of the famous &quot;Kolyma Tales,&quot; drawn straight from what he lived. 17 years in the camps. His books put the brutality and the hopelessness of the prisoners on the page without flinching. The Soviet Union banned them, and none came out while he was alive.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ivan Bunin&lt;/strong&gt; (1870-1953, USSR) - A writer who emigrated in 1920 and made no secret of his opposition to communism. In 1933 he became the first Russian to win the Nobel Prize in Literature.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fyodor Chaliapin&lt;/strong&gt; (1873-1938, USSR) - An opera singer who left over the limits placed on his work and his disagreement with how the Soviet government handled art.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sergei Rachmaninoff&lt;/strong&gt; (1873-1943, USSR) - A composer who left after the October Revolution. He would not live under a regime that boxed in his creative freedom and put his family at risk.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nikolai Berdyaev&lt;/strong&gt; (1874-1948, USSR) - A philosopher thrown out of Soviet Russia in 1922 on the &quot;Philosophers&apos; Ship,&quot; shipped off with other intellectuals whose thinking did not match Bolshevik ideology.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vsevolod Meyerhold&lt;/strong&gt; (1874-1940, USSR) - A director arrested and killed in Stalin&apos;s purges. His ideas about theater were too inventive for what the authorities wanted.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Zinaida Reich&lt;/strong&gt; (1894-1939, USSR) - An actress, Meyerhold&apos;s wife. They killed her during the purges, after they had arrested and tortured her husband.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Teffi (Nadezhda Lokhvitskaya)&lt;/strong&gt; (1872-1952, USSR) - A writer who left after the revolution. She rejected the communist government and feared for her life and her freedom to write.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Marc Chagall&lt;/strong&gt; (1887-1985, USSR) - An artist who emigrated after 1917. His work did not fit socialist realism, so the new authorities had no place for it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nikolai Gumilev&lt;/strong&gt; (1886-1921, USSR) - A poet shot during the repressions, accused of taking part in an anti-monarchist conspiracy. Russian literature took a heavy hit when he died.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Anna Akhmatova&lt;/strong&gt; (1889-1966, USSR) - A poetess banned from publishing. Her husband and son were arrested. She lived under constant fear and constant watch.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Osip Mandelstam&lt;/strong&gt; (1891-1938, USSR) - A poet arrested and worked to death in detention. His writing was branded anti-Soviet, and that was enough to take him.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sasha Chorny (Alexander Glikberg)&lt;/strong&gt; (1880-1932, USSR) - A poet who left under political pressure, with no way to publish freely in Soviet Russia. He kept writing once he was out, just from abroad.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mikhail Chekhov&lt;/strong&gt; (1891-1955, Russian Empire) - An actor and director who left the USSR because the repressive policies made theater impossible. He settled in the USA and built a reputation for his teaching methods.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Igor Stravinsky&lt;/strong&gt; (1882-1971, USSR) - A composer who emigrated after the October Revolution. His music did not satisfy the new authorities or fit inside socialist realism.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vladimir Nabokov&lt;/strong&gt; (1899-1977, USSR) - A writer driven out by the revolution and the danger it brought to his safety and his work. His name was made by what he wrote in English, &quot;Lolita&quot; included.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Philosophers&apos; Ship&lt;/strong&gt; (1922) - The episode where the Soviet government expelled more than 160 intellectuals, Nikolai Berdyaev and Sergei Bulgakov among them. The point was to clear out the dissenters and anyone whose views clashed with Bolshevik ideology.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sergei Yesenin&lt;/strong&gt; (1895-1925, USSR) - A poet who killed himself after running into the authorities and under the weight of pressure tied to his work and his private life. His death hit Russian literature hard.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vladimir Mayakovsky&lt;/strong&gt; (1893-1930, USSR) - A poet who killed himself, pushed there by personal and professional crises and by pressure from the authorities. His work did not always toe the party line, which made everything harder.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nikolai Vavilov&lt;/strong&gt; (1887-1943, USSR) - A geneticist arrested and left to die in detention on charges of anti-Soviet activity. His real crime: his plant-breeding research contradicted the junk science the Soviet leadership had decided to back.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solomon Mikhoels&lt;/strong&gt; (1890-1948, USSR) - An actor and director killed on Stalin&apos;s orders as part of an anti-Semitic campaign. They staged it as a car accident.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Isaac Babel&lt;/strong&gt; (1894-1940, USSR) - A writer arrested, tortured, and executed on charges of spying and anti-Soviet activity. His books were banned and pulled from the libraries.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nikolai Zabolotsky&lt;/strong&gt; (1903-1958, USSR) - A poet sent to a camp for years because his writing failed the regime&apos;s ideological test.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alexander Vvedensky&lt;/strong&gt; (1904-1941, USSR) - A poet who died on the way to a camp, sent there for anti-Soviet activity. His experiments with form did not match the party&apos;s official line on literature.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Olga Berggolts&lt;/strong&gt; (1910-1975, USSR) - A poetess beaten during NKVD interrogations, where she lost a child. She came through it as a voice of besieged Leningrad and kept writing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Marina Tsvetaeva&lt;/strong&gt; (1892-1941, USSR) - A poetess exiled and driven to suicide. She could not publish freely, and the pressure from the authorities never let up.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Daniil Kharms&lt;/strong&gt; (1905-1942, USSR) - A writer who starved to death in a psychiatric hospital after his arrest for anti-Soviet activity. Banned in his lifetime, published only after he was gone.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dmitry Likhachev&lt;/strong&gt; (1906-1999, USSR) - An art historian arrested, exiled, and fired over research that did not meet the Soviet ideological bar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yevgeny Schwartz&lt;/strong&gt; (1896-1958, USSR) - A playwright hit with publication bans and official criticism. His satire went after bureaucracy and totalitarianism, and the authorities noticed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Anti-Fascist Committee&lt;/strong&gt; (1940s, USSR) - A committee whose members were executed in Stalin&apos;s purges on charges of anti-Soviet activity and espionage.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Boris Pasternak&lt;/strong&gt; (1890-1960, USSR) - A writer persecuted and banned over his novel &quot;Doctor Zhivago,&quot; which the state called anti-Soviet. He was pressured into turning down the Nobel Prize in Literature.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mikhail Bulgakov&lt;/strong&gt; - A writer who lived under censorship and bans. His work, &quot;The Master and Margarita&quot; among it, never saw print while he was alive and was labeled anti-Soviet.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alexander Solzhenitsyn&lt;/strong&gt; (1918-2008, USSR) - A writer exiled and then forced out for work that took on the Soviet authorities and the Gulag. They stripped his citizenship, and he stayed in emigration until 1994.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Andrei Tarkovsky (1932-1986, USSR)&lt;/strong&gt; — a director and screenwriter whose films, &quot;Andrei Rublev,&quot; &quot;Stalker,&quot; and &quot;Mirror&quot; among them, are known for their philosophical weight and their formal invention. Censorship and restrictions dogged his work, and in the end he emigrated to Western Europe, where he could work in a freer climate.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yuri Lyubimov&lt;/strong&gt; (1917-2014, USSR/Russia) - A theatrical director stripped of his citizenship in 1984 for criticizing the Soviet system. He kept working abroad and only came back after perestroika.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Andrei Sakharov&lt;/strong&gt; (1921-1989, USSR) - A physicist and human rights advocate exiled for criticizing Soviet policy and fighting for human rights. They took every award and title from him. He kept up the work anyway, from exile.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sergei Dovlatov&lt;/strong&gt; (1941-1990, USSR) - A writer who emigrated in 1979 because there was no way to publish him in the Soviet Union. The work he did in emigration was only recognized after his death.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Grigory Rodchenkov&lt;/strong&gt; (b. 1958, USSR) - Former head of the Moscow anti-doping laboratory, who emigrated to the USA after blowing the whistle on the state doping program. His testimony drove the investigations and the sanctions that followed against Russian sport.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rudolf Nureyev&lt;/strong&gt; (1938-1993, USSR) — an extraordinary ballet dancer who defected in 1961, mid-tour with the Kirov Ballet in Paris. The escape became an international sensation and a real embarrassment for the Soviet Union at the height of the Cold War. The KGB watched him closely and the authorities resented his leanings toward the West. He took asylum in France and went on to a brilliant career there, while back in the USSR a court handed him a prison sentence in absentia.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Maria Alekhina (Pussy Riot)&lt;/strong&gt; (b. 1988, Russia) - An activist with the punk group Pussy Riot who left Russia after being persecuted for her political actions and her criticism of the authorities. She keeps up her human rights work from emigration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Anton Dolin&lt;/strong&gt; (b. 1976, Russia) - A film critic who moved to Riga under threats and pressure tied to his work and his criticism of Russian authorities. He left in 2022, after the war against Ukraine began, when his anti-war stance and sharp commentary drew the anger of the state and of war supporters.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Artur Smolyaninov&lt;/strong&gt; (b. 1983, Russia) - An actor who left in 2022 over his criticism of government policy and the war in Ukraine. He spoke against the Russian government again and again, which brought persecution and threats. He works abroad now.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Little Big&lt;/strong&gt; (Russia) - A band known for satirical, provocative videos. They left over the political situation and the pressure from the authorities. The members emigrated in 2022 and kept the music going abroad.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Anastasia Davydova&lt;/strong&gt; (b. 1983, Russia) - An Olympic champion in synchronized swimming who left under political pressure and threats. She moved abroad to keep coaching and competing somewhere safer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alexander Nevzorov&lt;/strong&gt; (b. 1958, Russia) - A journalist and publicist with a long record of attacking Russian authorities and policy. In 2022 he left over threats to his life and persecution tied to his journalism. He works abroad now, speaking out against the war in Ukraine and the regime.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yevgeny Berkovich and Svetlana Petriychuk&lt;/strong&gt; (b. 1984 and 1985, Russia) - Arrested for staging a play the authorities chose to read as extremist propaganda and an insult to believers. It fit a wider campaign against creative freedom and critical voices in Russia.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Boris Akunin (Grigory Chkhartishvili)&lt;/strong&gt; (b. 1956, Russia) - A writer hit with a criminal case over his criticism and his support for the opposition. He left Russia rather than wait for arrest and keeps writing abroad.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vasily Berezin and Stas Falkov&lt;/strong&gt; (Russia) - Artists who started a collective of exiled Russian artists in Paris. They left under pressure on creative freedom and threats from the authorities. Their work tends to be political, aimed at contemporary Russian society and politics.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alexei Navalny&lt;/strong&gt; (1976-2024, Russia) - An opposition politician who died in custody in 2024. Most read that death as a murder tied to his politics and his fight against corruption. He was known for his anti-corruption investigations and his opposition work, and he was arrested and repressed for it again and again.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Memorial&lt;/strong&gt; (Russia) - A human rights organization liquidated in 2021. Memorial investigated and documented political repression across the Soviet period and modern Russia, and it defended human rights. The state branded it a &quot;foreign agent,&quot; leaned on it, and shut it down.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Oleg Orlov&lt;/strong&gt; (b. 1953, Russia) - Head of the human rights organization &quot;Memorial,&quot; sentenced to 2.5 years in a colony. The charge was discrediting the Armed Forces of the Russian Federation, one more move in the campaign against rights defenders.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dmitry Muratov&lt;/strong&gt; (b. 1961, Russia) - A journalist and Nobel Peace Prize laureate, attacked in 2022. As chief editor of &quot;Novaya Gazeta&quot; he drew repeated threats and pressure over reporting on the actions of Russian authorities and on corruption.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TV Channel &quot;Dozhd&quot;&lt;/strong&gt; (Russia) - An independent channel pushed off the air in Russia in 2022 by pressure from the authorities. &quot;Dozhd&quot; was known for straight, critical coverage of Russian politics and society. It kept broadcasting from abroad after it was forced out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dmitry Ivanov (Kamikadze Di)&lt;/strong&gt; (b. 1986, Russia) - A blogger and journalist known for going hard at the Russian government. He was attacked, which drove him to the Czech Republic. He still works to get information about the situation in Russia out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vladimir Kara-Murza&lt;/strong&gt; (b. 1981, Russia) - An opposition politician and journalist known for his outspoken anti-government work. He was poisoned more than once, most likely because of his politics. A court sentenced him to 25 years for criticizing Russia&apos;s military actions in Ukraine and for ties to an &quot;undesirable&quot; organization. In May 2023 his appeal was rejected and the sentence stood. He also has polyneuropathy, which prison has made worse.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mark Feigin&lt;/strong&gt; (b. 1971, Russia) - A lawyer and human rights defender who emigrated to France. He built his name defending the politically persecuted, members of &quot;Pussy Riot&quot; and Ukrainian journalists among them. His work and his criticism of the Russian government brought pressure, and in 2023 he was declared wanted.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ilya Yashin&lt;/strong&gt; (b. 1983, Russia) - A politician and activist, one of the opposition&apos;s leading figures, known for criticizing the authorities. In 2022 he was arrested and sentenced to 8.5 years for spreading &quot;false&quot; information about Russia&apos;s actions in Ukraine.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Artem Kamardin&lt;/strong&gt; (b. 1990, Russia) - A poet the Tverskoy Court of Moscow sentenced to 7 years for reading poems against Russia&apos;s military actions in Ukraine.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yegor Shtovba&lt;/strong&gt; (b. 2000, Russia) - Took part in the same literary reading as Artem Kamardin, and the Tverskoy Court of Moscow gave him 5.5 years. The charge was spreading &quot;false&quot; information about Russia&apos;s military actions, part of the same case against free speech.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mail Naki&lt;/strong&gt; (b. 1993, Russia) - An artist and public activist known for anti-war work and criticism of the authorities. His positions and his public actions brought state pressure and threats, which drove him out of Russia to keep working abroad.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Maxim Galkin&lt;/strong&gt; (b. 1976, Russia) - A comedian and TV host who left in 2022 after being labeled a &quot;foreign agent&quot; for criticizing the Russian government and the war in Ukraine. He works abroad now and keeps speaking out against the war.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alla Pugacheva&lt;/strong&gt; (b. 1949, Russia) - A singer and actress who left in 2022 over government policy and the start of the war in Ukraine. She backed her husband Maxim Galkin openly after he was labeled a &quot;foreign agent.&quot; She moved to Israel and works from there.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Group &quot;Nogu Svelo!&quot;&lt;/strong&gt; - A Russian rock group whose front man Maxim Pokrovsky left in 2022 over government policy and the war in Ukraine. The group works abroad now, speaking out against the war and backing anti-war actions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Group &quot;Bi-2&quot;&lt;/strong&gt; - A Russian rock group whose members faced pressure from the authorities over their politics. In 2022 they had to cancel their concerts in Russia and partly emigrated, carrying on with the music abroad.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vitaly Mansky&lt;/strong&gt; (b. 1963, Russia) - A documentary filmmaker who left in 2014 and moved to Riga, Latvia. He is known for critical films, often built around political and social subjects. In 2014 he started the open letter &quot;We are with You!&quot; supporting Ukrainian filmmakers against Russia&apos;s military intervention. In 2022 he spoke out against the invasion of Ukraine, and the Russian Ministry of Internal Affairs declared him wanted on defamation charges. In 2023 the Russian Ministry of Justice put him on the foreign agents list. He keeps working in documentary film abroad, running the Artdocfest/Riga festival and earning recognition at international festivals.&lt;/p&gt;
</content:encoded><category>Opinion &amp; Culture</category><category>History</category><category>Politics</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Mastering GitLab CI/CD with Advanced Configuration Techniques</title><link>https://heyvaldemar.com/mastering-gitlab-ci-cd-with-advanced-configuration-techniques/</link><guid isPermaLink="true">https://heyvaldemar.com/mastering-gitlab-ci-cd-with-advanced-configuration-techniques/</guid><description>Unlock powerful GitLab CI/CD strategies with expert YAML configurations. Learn best practices for pipelines, automation, and secure DevOps deployments.</description><pubDate>Fri, 31 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Forget the glossy dashboards and the slick demos. Real DevOps happens in the trenches, and your &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; is the weapon. If you&apos;ve ever sat there at 2AM screaming at a broken pipeline, you already know the deal. GitLab CI/CD is powerful. But only once you stop treating the YAML like a to-do list and start treating it like an automation framework.&lt;/p&gt;
&lt;p&gt;This is not another &quot;Hello, pipeline&quot; walkthrough. It&apos;s the stuff that actually makes GitLab CI/CD worth running: cleaner configs, builds that finish before you lose patience, deploys that don&apos;t wake you up. No fluff.&lt;/p&gt;
&lt;h2&gt;GitLab CI/CD in one sentence&lt;/h2&gt;
&lt;p&gt;It&apos;s just code that builds, tests, and ships your other code. Every push. Every merge. Every time you break something.&lt;/p&gt;
&lt;p&gt;All of it lives in one file. &lt;code&gt;.gitlab-ci.yml&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;What a real pipeline actually looks like&lt;/h2&gt;
&lt;p&gt;A lot of the YAML floating around out there reads like someone copied it off Stack Overflow, said a quiet prayer, and hit push. Don&apos;t do that. Here&apos;s how to structure a pipeline you can still maintain six months later.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;stages:
  - build
  - test
  - deploy

build_job:
  stage: build
  script:
    - echo &quot;Building the project...&quot;

test_job:
  stage: test
  script:
    - echo &quot;Running tests...&quot;

deploy_job:
  stage: deploy
  script:
    - echo &quot;Deploying the project...&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That&apos;s the skeleton. Clean and linear. Each &lt;code&gt;stage&lt;/code&gt; is one phase of the pipeline. Jobs in the same stage run in parallel, assuming your runners can take it. Want a faster pipeline? This is the first lever you pull.&lt;/p&gt;
&lt;h2&gt;Docker FTW&lt;/h2&gt;
&lt;p&gt;If you&apos;re not pinning your jobs to Docker images, you&apos;re running CI in hard mode for no reason.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;image: node:20-alpine

build_job:
  stage: build
  script:
    - npm ci
    - npm run build
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pick the right image and your builds get reproducible and portable. Sometimes even fast. Just don&apos;t use &lt;code&gt;latest&lt;/code&gt;. Not unless you enjoy surprise breakages on a Monday morning.&lt;/p&gt;
&lt;h2&gt;Artifacts and cache: the fuel CI runs on&lt;/h2&gt;
&lt;p&gt;Now let&apos;s make things quick.&lt;/p&gt;
&lt;h3&gt;Artifacts move data between jobs&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;build_job:
  stage: build
  script:
    - npm run build
  artifacts:
    paths:
      - dist/
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Cache moves data between pipelines&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - node_modules/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Use both with some care and your pipeline goes from molasses to caffeinated cheetah. Abuse them and you&apos;ll be debugging stale builds in Slack at midnight. Your call.&lt;/p&gt;
&lt;h2&gt;Modular configs with &lt;code&gt;include&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Once that pipeline file crosses 100 lines, YAML turns into YELL.&lt;/p&gt;
&lt;p&gt;So split it up.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;include:
  - local: &quot;.gitlab-ci/build.yml&quot;
  - local: &quot;.gitlab-ci/deploy.yml&quot;
  - project: &quot;devops/templates&quot;
    file: &quot;/shared/test-suite.yml&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now the config is maintainable, reusable, testable. Like actual code, which is what it is.&lt;/p&gt;
&lt;h2&gt;Keep secrets in the vault&lt;/h2&gt;
&lt;p&gt;This should be obvious. I&apos;ll say it loud anyway, for the folks in the back.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Never hardcode secrets in your YAML.&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;variables:
  AWS_SECRET_ACCESS_KEY: $AWS_SECRET_ACCESS_KEY
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Manage these in GitLab&apos;s UI, at the project, group, or instance level. Use protected variables for protected branches. Basic hygiene. Don&apos;t be the person who commits &lt;code&gt;prod_db_password: hunter2&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;before_script and after_script: your pipeline&apos;s wrapper&lt;/h2&gt;
&lt;p&gt;Need to prep or clean up on every run? These are your hooks.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;test_job:
  stage: test
  before_script:
    - echo &quot;Setting up...&quot;
  script:
    - npm test
  after_script:
    - echo &quot;Tearing down...&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I reach for them to bootstrap test databases, set env vars, pull logs, and rage-log failures. Setup and teardown, the same as you&apos;d write in a test suite.&lt;/p&gt;
&lt;h2&gt;Smarter pipelines with &lt;code&gt;rules&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Want jobs that fire only when they should? Quit misusing &lt;code&gt;only/except&lt;/code&gt;. Use &lt;code&gt;rules&lt;/code&gt; like a grown-up.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;deploy_prod:
  stage: deploy
  script:
    - ./scripts/deploy-prod.sh
  rules:
    - if: &apos;$CI_COMMIT_BRANCH == &quot;main&quot;&apos;
      when: always
    - if: &apos;$CI_PIPELINE_SOURCE == &quot;merge_request_event&quot;&apos;
      when: never
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;No more deploying off some typo branch by accident.&lt;/p&gt;
&lt;h2&gt;Real optimization: dynamic variables and better caching&lt;/h2&gt;
&lt;p&gt;You can steer pipeline behavior on the fly with job-level variables.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;deploy:
  stage: deploy
  variables:
    ENV: &quot;staging&quot;
  script:
    - ./deploy.sh $ENV
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Lean on &lt;code&gt;CI_COMMIT_REF_NAME&lt;/code&gt; and the other built-ins to drive environments, image tags, artifact names, whatever you need.&lt;/p&gt;
&lt;p&gt;And yes, cache keys matter.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;cache:
  key: &quot;${CI_COMMIT_REF_SLUG}&quot;
  paths:
    - vendor/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;One cache per branch keeps builds fast and stops branches from poisoning each other&apos;s state.&lt;/p&gt;
&lt;h2&gt;TL;DR: how to not suck at GitLab CI&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Your &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; is real code. Treat it like it&lt;/li&gt;
&lt;li&gt;Use Docker images, not host dependencies&lt;/li&gt;
&lt;li&gt;Cache smartly, artifact deliberately&lt;/li&gt;
&lt;li&gt;Stop repeating yourself. Modularize with &lt;code&gt;include&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;rules&lt;/code&gt; to make the pipeline conditional and intelligent&lt;/li&gt;
&lt;li&gt;Secrets go in the GitLab UI, never in version control&lt;/li&gt;
&lt;li&gt;Optimize for speed, clarity, and safety, in that order&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Takeaway&lt;/h2&gt;
&lt;p&gt;CI/CD isn&apos;t magic. It&apos;s engineering. And a bad pipeline will quietly eat your hours, your weekends, and whatever&apos;s left of your patience.&lt;/p&gt;
&lt;p&gt;So build it right the first time. Start with the basics. Modularize as the thing grows. Automate like your job depends on it, because some days it actually does.&lt;/p&gt;
&lt;p&gt;Next step is simple. Open the &lt;code&gt;.gitlab-ci.yml&lt;/code&gt;, tear out the duct tape, and make it battle-ready.&lt;/p&gt;
&lt;p&gt;And if you&apos;re serious about getting good at this, bookmark &lt;a href=&quot;https://docs.gitlab.com/ee/ci/&quot;&gt;GitLab&apos;s CI/CD docs&lt;/a&gt;. Then go read them.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>GitLab</category><category>CI/CD</category><category>YAML</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Mastering Terraform Contains and Strcontains Functions</title><link>https://heyvaldemar.com/mastering-terraform-contains-and-strcontains-functions/</link><guid isPermaLink="true">https://heyvaldemar.com/mastering-terraform-contains-and-strcontains-functions/</guid><description>Learn how to use Terraform&apos;s contains and strcontains functions for better logic control in IaC. Includes practical DevOps examples and best practices.</description><pubDate>Sat, 25 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Terraform is declarative. Which is a polite way of saying &lt;em&gt;you don&apos;t get if-statements like a normal programmer&lt;/em&gt;. You still need to validate inputs. You still need to gate deployments and steer behavior. So you reach for the logic tools the language actually hands you.&lt;/p&gt;
&lt;p&gt;Two of them look trivial and turn out to be ridiculously useful: &lt;code&gt;contains()&lt;/code&gt; and &lt;code&gt;strcontains()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If a bad variable, a missing VM size, or a misnamed AZ has ever cost you a Saturday, read on.&lt;/p&gt;
&lt;p&gt;Here&apos;s how both work. No fluff.&lt;/p&gt;
&lt;h2&gt;&lt;code&gt;contains()&lt;/code&gt;: is the value in there, or are you debugging all weekend&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;contains()&lt;/code&gt; checks whether a specific value sits inside a list or a set.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;contains(list, value) =&amp;gt; bool
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Returns &lt;code&gt;true&lt;/code&gt; if the list has the value. &lt;code&gt;false&lt;/code&gt; if it doesn&apos;t. That&apos;s the whole API.&lt;/p&gt;
&lt;p&gt;Basic? Yes. But once your infra logic starts leaning on user input, region capabilities, or feature flags, this little function turns into the bouncer at the door of your Terraform nightclub.&lt;/p&gt;
&lt;h3&gt;Real example: Azure VM sizes&lt;/h3&gt;
&lt;p&gt;Picture someone on the team requesting a beefy VM in a tiny region that can&apos;t host it. You want to catch that &lt;em&gt;before&lt;/em&gt; the &lt;code&gt;apply&lt;/code&gt; blows up.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;variable &quot;region&quot; {
  default = &quot;uksouth&quot;
}

variable &quot;vm_size&quot; {
  default = &quot;Standard_DS2_v2&quot;
}

data &quot;azurerm_virtual_machine_sizes&quot; &quot;example&quot; {
  location = var.region
}

output &quot;is_supported&quot; {
  value = contains(data.azurerm_virtual_machine_sizes.example.sizes, var.vm_size)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If &lt;code&gt;vm_size&lt;/code&gt; isn&apos;t offered in that region, you get &lt;code&gt;false&lt;/code&gt;. Feed that into a &lt;code&gt;count&lt;/code&gt;, a &lt;code&gt;for_each&lt;/code&gt;, or a &lt;code&gt;validation&lt;/code&gt; block. Whatever you pick, it beats watching Terraform barf mid-deploy.&lt;/p&gt;
&lt;h2&gt;&lt;code&gt;strcontains()&lt;/code&gt;: when you&apos;re parsing strings like it&apos;s bash again&lt;/h2&gt;
&lt;p&gt;Now &lt;code&gt;strcontains()&lt;/code&gt;. This is Terraform answering one question: does this string have that other string inside it?&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;strcontains(string, substr) =&amp;gt; bool
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Reach for it when there&apos;s no list, just a single string. An AZ name, a tag, a label. You want to match a pattern in it.&lt;/p&gt;
&lt;h3&gt;Example: is this AZ optimized&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;strcontains(&quot;us-east-1b-optimal&quot;, &quot;optimal&quot;) // returns true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It earns its keep when providers or modules hand back strings with metadata baked in and you need to route logic off that.&lt;/p&gt;
&lt;p&gt;Say you only want to deploy when the target zone is labeled &quot;optimal&quot;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;locals {
  is_optimal_zone = strcontains(var.availability_zone, &quot;optimal&quot;)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now &lt;code&gt;local.is_optimal_zone&lt;/code&gt; is your switch. Use it to create resources, set tags, add taints, whatever the condition gates.&lt;/p&gt;
&lt;h2&gt;Gotchas that bit me, so they don&apos;t bite you&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;contains()&lt;/code&gt; wants the exact value.&lt;/strong&gt; Case-sensitive. No fuzzy matching.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;strcontains()&lt;/code&gt; doesn&apos;t do regex or wildcards.&lt;/strong&gt; Pure substring, nothing more.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maps don&apos;t behave with &lt;code&gt;contains()&lt;/code&gt; the way you&apos;d hope.&lt;/strong&gt; Lists and sets only. Try &lt;code&gt;contains({ key = &quot;val&quot; }, &quot;key&quot;)&lt;/code&gt; and you&apos;ll be disappointed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nulls can wreck your results.&lt;/strong&gt; Validate your variables, or wrap them in &lt;code&gt;coalesce()&lt;/code&gt; when it matters.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Bonus: validate with style&lt;/h2&gt;
&lt;p&gt;Want to enforce rules on inputs? Drop these functions into &lt;code&gt;validation&lt;/code&gt; blocks.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;variable &quot;az&quot; {
  type    = string
  default = &quot;us-east-1b-optimal&quot;

  validation {
    condition     = strcontains(var.az, &quot;optimal&quot;)
    error_message = &quot;Only &apos;optimal&apos; AZs are allowed for this deployment.&quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now Terraform fails early, with a message a human can read, instead of crashing halfway through the plan.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Reach for &lt;code&gt;contains()&lt;/code&gt; with lists or sets.&lt;/li&gt;
&lt;li&gt;Reach for &lt;code&gt;strcontains()&lt;/code&gt; for substring checks on a single string.&lt;/li&gt;
&lt;li&gt;Pair them with &lt;code&gt;validation&lt;/code&gt;, &lt;code&gt;count&lt;/code&gt;, or &lt;code&gt;for_each&lt;/code&gt; for logic that stays clean and safe inside your modules.&lt;/li&gt;
&lt;li&gt;Don&apos;t guess. Test.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>Terraform</category><category>IaC</category><category>HCL</category><category>Functions</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>The 80th Anniversary of the Deportation of the Crimean Tatars</title><link>https://heyvaldemar.com/the-80th-anniversary-of-the-deportation-of-the-crimean-tatars/</link><guid isPermaLink="true">https://heyvaldemar.com/the-80th-anniversary-of-the-deportation-of-the-crimean-tatars/</guid><description>Marking 80 years since the 1944 deportation of Crimean Tatars by Stalin&apos;s regime. Explore the tragedy, its impact, and its echoes in modern-day Crimea.</description><pubDate>Sat, 18 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;May 18 marks the remembrance day of one of Stalin&apos;s and the Soviet regime&apos;s most brutal crimes — the deportation of the Crimean Tatars.&lt;/p&gt;
&lt;p&gt;The deportation operation began early on the morning of May 18, 1944, and concluded on the evening of May 20. It was the beginning of a cruel and inhumane operation carried out by the NKVD, which left an indelible scar in the history of the Crimean Tatar people. Residents were given just a few minutes to gather their belongings before being loaded into overcrowded cattle cars.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./the-80th-anniversary-of-the-deportation-of-the-crimean-tatars-1.webp&quot; alt=&quot;The 80th Anniversary of the Deportation of the Crimean Tatars - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Those who refused to leave, resisted, or simply could not move were shot on the spot. Witnesses tell of bodies lying in the streets and courtyards, of screams and pleas for mercy that went unanswered. The conditions in the wagons were unbearable with overcrowding and lack of sanitation. People suffocated, died of dehydration, and lacked medical assistance, suffering from heat and suffocation. Mothers gave birth and lost their babies right before the eyes of other prisoners, and the dead were thrown directly onto the railway tracks.&lt;/p&gt;
&lt;p&gt;About 200,000 people were sent to forced labor in Asian republics and Siberia. Upon arrival at their destinations, they faced not life, but a slow demise. Half of those who survived the hellish journey died in the first year of resettlement from hunger, cold, and unbearable working conditions. Many died from infections spread in overcrowded barracks. People were forced to work to exhaustion, often without clothing or footwear in the bitter cold.&lt;/p&gt;
&lt;p&gt;This tragedy serves as a reminder that behind the facade of the &quot;happy&quot; life of the Soviet Union, which many now perceive as a time of stability and prosperity, lies the suffering and death of thousands of innocent people. Stalin&apos;s totalitarian regime turned the lives of millions into an endless nightmare filled with horror and bloody crimes.&lt;/p&gt;
&lt;h2&gt;Contemporary Impact and Ongoing History&lt;/h2&gt;
&lt;p&gt;As highlighted in &lt;a href=&quot;https://www.canada.ca/en/global-affairs/news/2024/05/statement-by-minister-of-foreign-affairs-on-80th-anniversary-of-deportation-of-crimean-tatars.html&quot;&gt;the statement by the Canadian Minister of Foreign Affairs&lt;/a&gt;, Mélanie Joly, the tragedy of the Crimean Tatars finds parallels in Russia&apos;s actions in Crimea following its illegal annexation in 2014. Russian authorities continue policies of infringing upon the rights of the Crimean Tatars, destroying their cultural heritage, replacing historical names, and persecuting those who oppose the annexation. Canada and the international community recognize these actions as a continuation of the policy of repression and support Ukraine&apos;s sovereignty and territorial integrity in response to ongoing aggression.&lt;/p&gt;
&lt;h2&gt;Additional Resources for Study&lt;/h2&gt;
&lt;p&gt;📕 &lt;a href=&quot;https://en.wikipedia.org/wiki/Deportation_of_the_Crimean_Tatars&quot;&gt;Article on the deportation of the Crimean Tatars on English Wikipedia&lt;/a&gt;&lt;br&gt;
📕 &lt;a href=&quot;https://www.canada.ca/en/global-affairs/news/2024/05/statement-by-minister-of-foreign-affairs-on-80th-anniversary-of-deportation-of-crimean-tatars.html&quot;&gt;Statement by the Minister of Foreign Affairs of Canada on the 80th anniversary of the deportation of the Crimean Tatars&lt;/a&gt;&lt;br&gt;
📕 &lt;a href=&quot;https://www.regjeringen.no/en/aktuelt/80-years-since-the-deportation-of-the-krym-tatars/id3040013/&quot;&gt;Official statement by the Government of Norway on the 80th anniversary of the deportation of the Crimean Tatars&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Opinion &amp; Culture</category><category>History</category><category>Politics</category><category>Human Rights</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Building AI Solutions with Docker Compose and Kubernetes Expertise</title><link>https://heyvaldemar.com/building-ai-solutions-with-docker-compose-and-kubernetes-expertise/</link><guid isPermaLink="true">https://heyvaldemar.com/building-ai-solutions-with-docker-compose-and-kubernetes-expertise/</guid><description>Build scalable AI solutions with Docker Compose and Kubernetes. Master containerized workflows, security, and real-time development features.</description><pubDate>Mon, 13 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You&apos;re building AI workloads. So you&apos;re juggling Python packages, GPU drivers, REST APIs, databases, maybe a Kafka pipeline on top of all that. And if you&apos;re still herding it with bash scripts and hope?&lt;br&gt;
&lt;strong&gt;You&apos;re doing it wrong.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This guide is about how &lt;strong&gt;Docker Compose&lt;/strong&gt; tames the chaos of a modern AI project. Not the toy version. The version someone runs when they&apos;ve &lt;strong&gt;actually shipped&lt;/strong&gt; containers in production instead of poking at notebooks.&lt;/p&gt;
&lt;p&gt;I&apos;ll get into the real usage. Environment handling. Image pull policies. Secrets, resource limits, and the one command, &lt;code&gt;docker compose watch&lt;/code&gt;, that saves your sanity during dev cycles. There&apos;s also the part nobody enjoys: handing your Compose stack off to Kubernetes without rage-quitting.&lt;/p&gt;
&lt;h2&gt;Compose 2.x: A Dev Tool That Grew Up&lt;/h2&gt;
&lt;p&gt;Compose is still your best friend for local work. No argument there. But it&apos;s also a &lt;strong&gt;serious CI/CD asset&lt;/strong&gt; now, and a genuinely good staging orchestrator, &lt;em&gt;if you know how to drive it&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Enough preamble.&lt;/p&gt;
&lt;h2&gt;Environment Variable Precedence: Know Who Wins the Fight&lt;/h2&gt;
&lt;p&gt;By default, Compose &lt;strong&gt;favors your shell environment&lt;/strong&gt; over whatever sits in your &lt;code&gt;.env&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;So this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;export DATABASE_URL=postgres://prod.db
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;…will override this in &lt;code&gt;.env&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;DATABASE_URL=postgres://dev.db
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Good. That&apos;s exactly the behavior you want in CI/CD, where secrets have no business touching source control.&lt;/p&gt;
&lt;p&gt;📖 &lt;a href=&quot;https://docs.docker.com/compose/environment-variables/&quot;&gt;Environment Variables — Compose Docs&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Controlling Image Pulls: Don&apos;t Get Burned by Stale Containers&lt;/h2&gt;
&lt;p&gt;There are two clean ways to &lt;strong&gt;pull fresh images&lt;/strong&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Force it every time:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose up --pull always
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Lock it in the Compose file:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;services:
  app:
    image: my-image:latest
    pull_policy: always
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;code&gt;pull_policy&lt;/code&gt; supports: &lt;code&gt;always&lt;/code&gt;, &lt;code&gt;if_not_present&lt;/code&gt;, and &lt;code&gt;never&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Use it. Skip it and you&apos;ll burn an afternoon debugging a bug that doesn&apos;t exist, because CI quietly served a stale image from cache while you screamed at your pipeline.&lt;/p&gt;
&lt;h2&gt;SSH &amp;amp; Secrets: Handling Sensitive Stuff Like an Adult&lt;/h2&gt;
&lt;p&gt;BuildKit is the default now. That buys you real control over &lt;strong&gt;build-time secrets&lt;/strong&gt; and SSH access.&lt;/p&gt;
&lt;h3&gt;SSH During Builds&lt;/h3&gt;
&lt;p&gt;Need to clone a private repo mid-build?&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;services:
  app:
    build:
      context: .
      ssh:
        - default=/home/user/.ssh/id_rsa
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The key &lt;strong&gt;never lands in the image&lt;/strong&gt;. No more &quot;oops I leaked my SSH key to Docker Hub&quot;.&lt;/p&gt;
&lt;h3&gt;Runtime Secrets&lt;/h3&gt;
&lt;p&gt;Compose doesn&apos;t do Docker Swarm-style secrets. You can fake it with mounted files or env vars. Or, if you&apos;re serious about it, wire in a vault.&lt;/p&gt;
&lt;p&gt;📖 &lt;a href=&quot;https://docs.docker.com/compose/compose-file/build/&quot;&gt;SSH &amp;amp; Secrets in Compose&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Live Reloads with &lt;code&gt;docker compose watch&lt;/code&gt;: Real Dev Speed&lt;/h2&gt;
&lt;p&gt;You want a tight feedback loop. That&apos;s what the &lt;code&gt;watch&lt;/code&gt; command is for.&lt;/p&gt;
&lt;h3&gt;Real-World Example: Node.js App&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;services:
  app:
    image: node:18
    volumes:
      - .:/app
    working_dir: /app
    command: npm start
    environment:
      NODE_ENV: development
    ports:
      - &quot;3000:3000&quot;
    labels:
      com.docker.compose.watch: &quot;true&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then run:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose up
docker compose watch
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Change a file locally and the container picks it up. No rebuild. No restart. No staring at the screen wondering why your fix didn&apos;t take.&lt;/p&gt;
&lt;p&gt;📖 &lt;a href=&quot;https://docs.docker.com/compose/file-watch/&quot;&gt;Docker Compose Watch Docs&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Override Files: Keep Dev and Prod from Colliding&lt;/h2&gt;
&lt;p&gt;Still cramming every config into one &lt;code&gt;compose.yaml&lt;/code&gt;? Stop. Split it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;compose.override.yaml&lt;/code&gt; for local tweaks&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker compose -f base.yaml -f prod.yaml&lt;/code&gt; to layer configs&lt;/li&gt;
&lt;li&gt;&lt;code&gt;include:&lt;/code&gt; blocks, if you&apos;re on Compose v2+ and feeling fancy&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It&apos;s cleaner, it&apos;s safer, and it&apos;s a lot easier to debug when something breaks at 2am.&lt;/p&gt;
&lt;p&gt;📖 &lt;a href=&quot;https://docs.docker.com/compose/extends/&quot;&gt;Extending Compose Files&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;YAML Anchors: DRY or Die&lt;/h2&gt;
&lt;p&gt;Compose files turn into spaghetti fast. Anchors fix that:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;x-default-env: &amp;amp;default-env
  NODE_ENV: production

services:
  web:
    image: webapp
    environment: *default-env

  api:
    image: apiserver
    environment:
      &amp;lt;&amp;lt;: *default-env
      DEBUG: true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Less repetition, fewer bugs, and a file you can actually read six months from now.&lt;/p&gt;
&lt;p&gt;📖 &lt;a href=&quot;https://docs.docker.com/compose/compose-file/10-fragments/&quot;&gt;Compose File Fragments&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Resource Limits: Be a Good Container Citizen&lt;/h2&gt;
&lt;p&gt;Even on a dev cluster, don&apos;t let one container eat the whole node.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;services:
  ai-worker:
    image: my-ai-image
    deploy:
      resources:
        limits:
          cpus: &quot;1.0&quot;
          memory: &quot;1G&quot;
        reservations:
          cpus: &quot;0.5&quot;
          memory: &quot;512M&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now, a caveat. &lt;code&gt;deploy&lt;/code&gt; is ignored by &lt;code&gt;docker compose&lt;/code&gt; in local mode. But the second you hand this off to Swarm or translate it to Kubernetes, you&apos;ll be glad it was already there.&lt;/p&gt;
&lt;h2&gt;Compose to Kubernetes: The Good, The Bad, and The “Use Kompose”&lt;/h2&gt;
&lt;p&gt;Want to turn a Compose stack into Kubernetes YAMLs?
&lt;a href=&quot;https://kompose.io/&quot;&gt;Kompose&lt;/a&gt; does it, and the output isn&apos;t terrible.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kompose convert
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You&apos;ll still have homework:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Set up Ingress and controllers by hand&lt;/li&gt;
&lt;li&gt;Configure PVCs and storage&lt;/li&gt;
&lt;li&gt;Handle secrets the Kubernetes way&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For MVPs and small internal tools, though, it works fine.&lt;/p&gt;
&lt;p&gt;Just don&apos;t ship the raw output to production. Clean it up first.&lt;/p&gt;
&lt;h2&gt;Final Take&lt;/h2&gt;
&lt;p&gt;Docker Compose stopped being a one-trick Redis-launcher a while ago. Driven well, it&apos;s a serious tool, and it earns its keep most in &lt;strong&gt;AI workflows&lt;/strong&gt;, the kind that sprawl across a dozen services.&lt;/p&gt;
&lt;p&gt;It lets you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Develop locally at full speed&lt;/li&gt;
&lt;li&gt;Keep secrets out of your images&lt;/li&gt;
&lt;li&gt;Cut downtime during builds&lt;/li&gt;
&lt;li&gt;Hand off to Kubernetes when the time comes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&apos;re shipping AI services and you&apos;re &lt;strong&gt;not&lt;/strong&gt; using Compose properly, you&apos;re just making the job harder than it is.&lt;/p&gt;
&lt;p&gt;📖 &lt;a href=&quot;https://docs.docker.com/compose/&quot;&gt;Read the Full Compose Docs&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>AI &amp; MLOps</category><category>AI</category><category>Docker</category><category>Kubernetes</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Future-Proofing JavaScript with ESM and CJS Compatibility Techniques</title><link>https://heyvaldemar.com/future-proofing-javascript-with-esm-and-cjs-compatibility-techniques/</link><guid isPermaLink="true">https://heyvaldemar.com/future-proofing-javascript-with-esm-and-cjs-compatibility-techniques/</guid><description>Master ECMAScript Modules (ESM) and CommonJS (CJS) in NPM packages — key compatibility strategies for effective JavaScript development.</description><pubDate>Wed, 08 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;JavaScript&apos;s module system is a lot like Git. Powerful, confusing, and still a daily source of pain years after you thought you&apos;d figured it out.&lt;/p&gt;
&lt;p&gt;Published an NPM package lately? Then you&apos;ve fought this. You add &lt;code&gt;&quot;type&quot;: &quot;module&quot;&lt;/code&gt; to your &lt;code&gt;package.json&lt;/code&gt;, and half your consumers start screaming. Or you leave it off, and now tree-shaking is dead. There&apos;s no clean default. It&apos;s a mess either way.&lt;/p&gt;
&lt;p&gt;So let&apos;s fix it.&lt;/p&gt;
&lt;p&gt;This guide is about building &lt;strong&gt;dual-compatible&lt;/strong&gt; JavaScript packages. Packages that work whether someone &lt;code&gt;require()&lt;/code&gt;s them or &lt;code&gt;import&lt;/code&gt;s them, without blowing up your CI pipeline and without giving up modern tooling.&lt;/p&gt;
&lt;h2&gt;Why You Should Care (Even as a DevOps Engineer)&lt;/h2&gt;
&lt;p&gt;You probably think this is a frontend problem. It isn&apos;t. CLI tools, Dockerized apps, Lambda functions, microservices in Node.js: for all of them, &lt;strong&gt;module format matters&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Build tooling wants ESM. Legacy code wants CJS. Your job is to feed both without the whole thing folding in on itself like a badly wired monorepo.&lt;/p&gt;
&lt;h2&gt;The ESM vs. CJS TL;DR&lt;/h2&gt;
&lt;p&gt;I&apos;ll skip the history lesson. Here&apos;s what actually matters in practice:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Format&lt;/th&gt;
&lt;th&gt;ESM&lt;/th&gt;
&lt;th&gt;CJS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Syntax&lt;/td&gt;
&lt;td&gt;&lt;code&gt;import/export&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;require/module.exports&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node.js&lt;/td&gt;
&lt;td&gt;Default in &lt;code&gt;.mjs&lt;/code&gt; or &lt;code&gt;&quot;type&quot;: &quot;module&quot;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Default in &lt;code&gt;.js&lt;/code&gt; or &lt;code&gt;&quot;type&quot;: &quot;commonjs&quot;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pros&lt;/td&gt;
&lt;td&gt;Native in browsers, tree-shaking, async imports&lt;/td&gt;
&lt;td&gt;Ubiquitous, works everywhere&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cons&lt;/td&gt;
&lt;td&gt;Can&apos;t &lt;code&gt;require()&lt;/code&gt; it&lt;/td&gt;
&lt;td&gt;Can&apos;t &lt;code&gt;import&lt;/code&gt; it (without wrappers)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;So no, slapping &lt;code&gt;.mjs&lt;/code&gt; on everything and praying is not a strategy. Do it properly.&lt;/p&gt;
&lt;h2&gt;Rule #1: Don&apos;t Use &lt;code&gt;&quot;type&quot;: &quot;module&quot;&lt;/code&gt; in Shared Packages&lt;/h2&gt;
&lt;p&gt;Set &lt;code&gt;&quot;type&quot;: &quot;module&quot;&lt;/code&gt; in a library&apos;s &lt;code&gt;package.json&lt;/code&gt;, and you&apos;ve just locked that library into ESM-only territory.&lt;/p&gt;
&lt;p&gt;Now every CJS consumer is stuck doing bundler gymnastics to use it. Bad trade.&lt;/p&gt;
&lt;p&gt;Do this instead. &lt;strong&gt;Define dual entry points&lt;/strong&gt; and let the consuming app pick what it wants.&lt;/p&gt;
&lt;h2&gt;Example: Dual-Compatible &lt;code&gt;package.json&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;This is the config I actually ship in real packages. Clean, and it works:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;name&quot;: &quot;example-library&quot;,
  &quot;version&quot;: &quot;1.0.0&quot;,
  &quot;description&quot;: &quot;Dual ESM and CJS compatible library&quot;,
  &quot;main&quot;: &quot;dist/index.cjs&quot;,
  &quot;module&quot;: &quot;dist/index.mjs&quot;,
  &quot;exports&quot;: {
    &quot;.&quot;: {
      &quot;require&quot;: &quot;./dist/index.cjs&quot;,
      &quot;import&quot;: &quot;./dist/index.mjs&quot;
    }
  },
  &quot;keywords&quot;: [&quot;esm&quot;, &quot;cjs&quot;, &quot;npm&quot;, &quot;compatibility&quot;],
  &quot;license&quot;: &quot;MIT&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Why this works&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;main&lt;/code&gt;: Used by CJS consumers and legacy bundlers&lt;/li&gt;
&lt;li&gt;&lt;code&gt;module&lt;/code&gt;: Used by modern bundlers like Vite, Webpack (for ESM)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;exports&lt;/code&gt;: Official Node.js way to define conditional entry points&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;✅ This setup lets both &lt;code&gt;require()&lt;/code&gt; and &lt;code&gt;import&lt;/code&gt; work cleanly without surprises.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Common Mistakes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mixing CJS and ESM in the same file&lt;/strong&gt;: Just don&apos;t. Keep them separate.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Forgetting &lt;code&gt;.cjs&lt;/code&gt; and &lt;code&gt;.mjs&lt;/code&gt; extensions&lt;/strong&gt;: Node cares. A lot.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Assuming bundlers will “just handle it”&lt;/strong&gt;: Spoiler. They won&apos;t.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Build Setup for Both Formats&lt;/h2&gt;
&lt;p&gt;Reach for a bundler like &lt;code&gt;rollup&lt;/code&gt; or &lt;code&gt;tsup&lt;/code&gt; and compile both module types from one source. Here&apos;s a config:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;tsup src/index.ts \
  --format cjs,esm \
  --dts \
  --out-dir dist
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That gives you &lt;code&gt;dist/index.cjs&lt;/code&gt;, &lt;code&gt;dist/index.mjs&lt;/code&gt;, and &lt;code&gt;dist/index.d.ts&lt;/code&gt;. One build, both formats, no drama.&lt;/p&gt;
&lt;h2&gt;Docker and DevOps Considerations&lt;/h2&gt;
&lt;p&gt;Shipping Node apps in Docker? You should be. And when you do, &lt;strong&gt;test both module formats inside the container&lt;/strong&gt;. I&apos;ve watched far too many CI pipelines pass locally and then fall over the moment &lt;code&gt;node&lt;/code&gt; inside Alpine choked on the wrong module format.&lt;/p&gt;
&lt;p&gt;Here&apos;s what I do:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Use &lt;code&gt;node:18-alpine&lt;/code&gt; as your base image (or &lt;code&gt;20&lt;/code&gt;, if you&apos;re brave).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Validate both formats in your CI pipeline:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;node -e &quot;require(&apos;./dist/index.cjs&apos;)&quot;
node --input-type=module -e &quot;import(&apos;./dist/index.mjs&apos;)&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Lock your build environment with &lt;code&gt;package-lock.json&lt;/code&gt; and exact versions.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Consistency is king. In Docker, the small inconsistencies are the ones that kill you.&lt;/p&gt;
&lt;h2&gt;Real-World Example: CLI Tool Distribution&lt;/h2&gt;
&lt;p&gt;We built a small CLI tool that ended up spreading across several dev teams. Some pulled it in with &lt;code&gt;require()&lt;/code&gt;. Others imported it as an ESM module in their Vite setups.&lt;/p&gt;
&lt;p&gt;We could have picked one and annoyed half of them. We went dual-mode instead. Here&apos;s what worked:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Split output with &lt;code&gt;tsup&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Defined conditional exports&lt;/li&gt;
&lt;li&gt;Wrote one internal API, wrapped with two interfaces (CJS and ESM)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The result? One package, two module styles, nobody complaining.&lt;/p&gt;
&lt;h2&gt;Takeaway&lt;/h2&gt;
&lt;p&gt;Supporting both ESM and CJS is about more than compatibility. It&apos;s about longevity. The Node.js ecosystem is not flipping to ESM-only overnight, and you want your package to &lt;strong&gt;work today, and still work five years from now&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;So build smart. Support both. Don&apos;t make your users fight the module loader.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>JavaScript</category><category>Node.js</category><category>ESM</category><category>CJS</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Leveraging null_resource in Terraform for Complex Operations</title><link>https://heyvaldemar.com/leveraging-null-resource-terraform-complex-operations/</link><guid isPermaLink="true">https://heyvaldemar.com/leveraging-null-resource-terraform-complex-operations/</guid><description>Master Terraform&apos;s null_resource to automate complex DevOps workflows. Learn triggers, local execs, and when to use terraform_data in modern IaC.</description><pubDate>Sat, 04 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Let&apos;s not kid ourselves. &lt;code&gt;null_resource&lt;/code&gt; is the duct tape of Terraform. It doesn&apos;t provision a VM. It doesn&apos;t configure a VPC. And it sure as hell doesn&apos;t play nice with cloud-native best practices. But used wisely, it&apos;s the unsung hero of CI/CD glue code and one-off automation.&lt;/p&gt;
&lt;p&gt;Here&apos;s the plan. We get tactical with &lt;code&gt;null_resource&lt;/code&gt;, walk through use cases I&apos;ve actually shipped, then contrast it with the newer, cleaner &lt;code&gt;terraform_data&lt;/code&gt; resource. By the end you&apos;ll know which tool to reach for without feeling dirty about it.&lt;/p&gt;
&lt;h2&gt;Terraform Resources 101 (Quick Recap)&lt;/h2&gt;
&lt;p&gt;Terraform&apos;s core mechanic is the &lt;code&gt;resource&lt;/code&gt; block. It tells the provider, “Hey, make this thing exist.”&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;resource &quot;azurerm_windows_function_app&quot; &quot;app&quot; {
  name     = &quot;example-function-app&quot;
  location = &quot;East US&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That&apos;s your bread-and-butter declaration. Define the desired state, then let Terraform do the heavy lifting.&lt;/p&gt;
&lt;p&gt;But sometimes you don&apos;t want to create anything in the cloud. You just want Terraform to &lt;em&gt;do something&lt;/em&gt;. Run a script, call a webhook, poke Jenkins with a stick. That&apos;s where &lt;code&gt;null_resource&lt;/code&gt; comes in.&lt;/p&gt;
&lt;h2&gt;What the Hell is &lt;code&gt;null_resource&lt;/code&gt;?&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;null_resource&lt;/code&gt; is exactly what it sounds like. A Terraform resource that manages &lt;em&gt;nothing&lt;/em&gt;. No infrastructure, no API objects. Just logic.&lt;/p&gt;
&lt;p&gt;But here&apos;s the trick. It still behaves like a real resource. It supports lifecycle actions (&lt;code&gt;create&lt;/code&gt;, &lt;code&gt;destroy&lt;/code&gt;, etc.), it can depend on other resources, and most importantly, it supports &lt;strong&gt;provisioners&lt;/strong&gt; and &lt;strong&gt;triggers&lt;/strong&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;resource &quot;null_resource&quot; &quot;example&quot; {
  triggers = {
    always_run = timestamp()
  }

  provisioner &quot;local-exec&quot; {
    command = &quot;echo &apos;Triggering follow-up actions&apos;&quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This block runs &lt;strong&gt;every time&lt;/strong&gt;, because &lt;code&gt;timestamp()&lt;/code&gt; changes on every plan. Handy when you need to kick off external processes after infra changes.&lt;/p&gt;
&lt;h2&gt;Triggers: The Secret Sauce&lt;/h2&gt;
&lt;p&gt;Triggers are the magic behind &lt;code&gt;null_resource&lt;/code&gt;. They control when it gets re-executed. Not based on resource state, but on changes to arbitrary data you hand it.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;triggers = {
  hash = filemd5(&quot;config.json&quot;)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now your &lt;code&gt;null_resource&lt;/code&gt; only re-runs when &lt;code&gt;config.json&lt;/code&gt; changes. That&apos;s gold in CI/CD setups where you&apos;re tracking file changes, API responses, or even environment variables.&lt;/p&gt;
&lt;h2&gt;Real-World Scenarios (Where &lt;code&gt;null_resource&lt;/code&gt; Actually Earns Its Keep)&lt;/h2&gt;
&lt;h3&gt;1. Post-Provision Webhook Pings&lt;/h3&gt;
&lt;p&gt;Say you&apos;ve just spun up infrastructure and need to notify an external system. Triggering a GitHub Actions workflow, maybe, or pinging a Slack webhook.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;resource &quot;null_resource&quot; &quot;notify&quot; {
  triggers = {
    infra_version = var.release_tag
  }

  provisioner &quot;local-exec&quot; {
    command = &quot;curl -X POST https://hooks.slack.com/services/XXX -d &apos;Terraform apply complete: ${var.release_tag}&apos;&quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Why not just use &lt;code&gt;curl&lt;/code&gt; in your pipeline?&lt;/strong&gt; Because this runs &lt;em&gt;inside&lt;/em&gt; Terraform&apos;s dependency graph. It won&apos;t fire unless upstream infra actually changed.&lt;/p&gt;
&lt;h3&gt;2. Conditional Execution Based on Dynamic Data&lt;/h3&gt;
&lt;p&gt;Say you&apos;re pulling in an Azure storage account and want to trigger an action when its key changes.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;data &quot;azurerm_storage_account&quot; &quot;example&quot; {
  name                = &quot;examplestorageaccount&quot;
  resource_group_name = &quot;my-rg&quot;
}

resource &quot;null_resource&quot; &quot;trigger_on_key_change&quot; {
  triggers = {
    key = data.azurerm_storage_account.example.primary_access_key
  }

  provisioner &quot;local-exec&quot; {
    command = &quot;echo &apos;Access key has changed, executing...&apos;&quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Good for invalidating cache, refreshing secrets, or kicking off a rotation script. And yes, it&apos;s hacky. It also works.&lt;/p&gt;
&lt;h3&gt;3. Smoke Testing After Apply&lt;/h3&gt;
&lt;p&gt;Spin up resources, run a curl test to confirm the service responds, fail fast when it doesn&apos;t.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;resource &quot;null_resource&quot; &quot;smoke_test&quot; {
  depends_on = [azurerm_function_app.example]

  provisioner &quot;local-exec&quot; {
    command = &quot;curl -sf http://example-app.azurewebsites.net/health || exit 1&quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You&apos;d be surprised how often infra “successfully applies” while the app is dead on arrival. This catches those cases &lt;em&gt;before&lt;/em&gt; CI marks the job green.&lt;/p&gt;
&lt;h2&gt;The Cleaner Alternative: &lt;code&gt;terraform_data&lt;/code&gt; (1.4+)&lt;/h2&gt;
&lt;p&gt;Starting in Terraform 1.4, HashiCorp shipped a new built-in: &lt;a href=&quot;https://developer.hashicorp.com/terraform/language/resources/terraform-data&quot;&gt;terraform_data&lt;/a&gt;. It does what &lt;code&gt;null_resource&lt;/code&gt; does, with less baggage, and without leaning on a provider plugin.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;resource &quot;terraform_data&quot; &quot;run_command&quot; {
  provisioner &quot;local-exec&quot; {
    command = &quot;echo &apos;Still works!&apos;&quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You lose triggers, for now anyway. But it&apos;s first-party and cleaner for one-off tasks. Reach for it when you&apos;re scripting or injecting data during apply without pretending to be a cloud resource.&lt;/p&gt;
&lt;h2&gt;null_resource vs terraform_data: When to Use What&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Use &lt;code&gt;null_resource&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;Use &lt;code&gt;terraform_data&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Triggering on external data changes&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One-time scripting&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI/CD glue between real resources&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need clean, future-proof setup&lt;/td&gt;
&lt;td&gt;❌ (plugin)&lt;/td&gt;
&lt;td&gt;✅ (built-in)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Want something to break later&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;TL;DR: need &lt;strong&gt;triggers&lt;/strong&gt;? Stick with &lt;code&gt;null_resource&lt;/code&gt;. Everything else, migrate to &lt;code&gt;terraform_data&lt;/code&gt;. It&apos;s the cleaner, future-proof option.&lt;/p&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;If Terraform were a programming language, &lt;code&gt;null_resource&lt;/code&gt; would be its &lt;code&gt;eval()&lt;/code&gt;. Powerful, dangerous, misused 99% of the time.&lt;/p&gt;
&lt;p&gt;But in the hands of someone who knows what they&apos;re doing? It bridges the gap between infrastructure and orchestration. Think CI/CD pipelines, edge cases, the situations where Terraform alone just can&apos;t model reality.&lt;/p&gt;
&lt;p&gt;Don&apos;t go overboard, though. If you find yourself writing a bash script inside a &lt;code&gt;null_resource&lt;/code&gt; that runs a Python script that generates more HCL, maybe reconsider your life choices.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pro Tip:&lt;/strong&gt; Pair &lt;code&gt;null_resource&lt;/code&gt; with &lt;code&gt;depends_on&lt;/code&gt; and &lt;code&gt;triggers&lt;/code&gt; for controlled chaos. Or use &lt;code&gt;terraform_data&lt;/code&gt; if you want to sleep at night.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>Terraform</category><category>IaC</category><category>Automation</category><category>Provisioning</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Prevent Unwanted Updates in Terraform with ignore_changes</title><link>https://heyvaldemar.com/prevent-unwanted-updates-in-terraform-with-ignore-changes/</link><guid isPermaLink="true">https://heyvaldemar.com/prevent-unwanted-updates-in-terraform-with-ignore-changes/</guid><description>Master Terraform&apos;s ignore_changes to prevent unintended updates. A Docker Captain shares key insights and practical examples.</description><pubDate>Thu, 02 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Here&apos;s a classic Terraform moment:
You tweak a single variable, hit &lt;code&gt;terraform plan&lt;/code&gt;, and suddenly Terraform wants to &lt;strong&gt;rebuild half your infrastructure&lt;/strong&gt; because it noticed a change in something it shouldn&apos;t even care about.&lt;/p&gt;
&lt;p&gt;Yeah. That.&lt;/p&gt;
&lt;p&gt;When you don&apos;t want Terraform getting twitchy over metadata, external changes, or stuff it didn&apos;t create in the first place, you need &lt;code&gt;ignore_changes&lt;/code&gt;. No magic. No hacks. You&apos;re just telling Terraform to back off where that makes sense.&lt;/p&gt;
&lt;p&gt;Here&apos;s how to use it properly, so your deployments stop acting like an overprotective robot.&lt;/p&gt;
&lt;h2&gt;What the Hell Is &lt;code&gt;ignore_changes&lt;/code&gt;?&lt;/h2&gt;
&lt;p&gt;It&apos;s a Terraform &lt;code&gt;lifecycle&lt;/code&gt; argument that tells the engine:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Even if this attribute has changed, don&apos;t touch it.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When used right, it stops Terraform from updating or replacing a resource just because some value drifted from your original config. Especially when that drift was intentional, came from outside, or just doesn&apos;t matter.&lt;/p&gt;
&lt;p&gt;The syntax lives inside the &lt;code&gt;lifecycle&lt;/code&gt; block of a resource, like so:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;lifecycle {
  ignore_changes = [some_attribute]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;No, it doesn&apos;t ignore all changes. And no, it&apos;s not a get-out-of-IaC-responsibility-free card.
Used carelessly, it&apos;ll bite you. Used wisely, it&apos;ll save your uptime and your sanity.&lt;/p&gt;
&lt;h2&gt;When Should You Use &lt;code&gt;ignore_changes&lt;/code&gt;?&lt;/h2&gt;
&lt;p&gt;Here are the &lt;strong&gt;real reasons&lt;/strong&gt; you&apos;d reach for it. Not made-up edge cases.&lt;/p&gt;
&lt;h3&gt;1. External Systems Are Messing With Your Resources&lt;/h3&gt;
&lt;p&gt;Example: a team updates tags in the cloud console, outside Terraform. Now every plan shows a diff.
Fix? Ignore the &lt;code&gt;tags&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;lifecycle {
  ignore_changes = [tags]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. Terraform Keeps Picking Fights with Random Metadata&lt;/h3&gt;
&lt;p&gt;Timestamps, version IDs, generated names. Terraform can&apos;t help itself.
You don&apos;t want it to re-provision a resource because some backend system touched a metadata field.&lt;/p&gt;
&lt;p&gt;Ignore those noisy attributes.&lt;/p&gt;
&lt;h3&gt;3. You&apos;re Managing Part of the Resource Elsewhere&lt;/h3&gt;
&lt;p&gt;Say your networking is owned by a platform team running a different tool.
You just need to reference the &lt;code&gt;network_interface_ids&lt;/code&gt;, not own them.&lt;/p&gt;
&lt;p&gt;Fine. Ignore the changes:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;lifecycle {
  ignore_changes = [network_interface_ids]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4. Secrets Drift, and That&apos;s Okay&lt;/h3&gt;
&lt;p&gt;Passwords and keys get rotated externally all the time. Vault, AWS Secrets Manager, whatever. Terraform sees the change and freaks out.&lt;/p&gt;
&lt;p&gt;Unless you tell it to chill:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;lifecycle {
  ignore_changes = [admin_password]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(But for the love of ops, don&apos;t hardcode passwords in plain HCL. Ever.)&lt;/p&gt;
&lt;h3&gt;5. You Want to Lock a Resource in Place&lt;/h3&gt;
&lt;p&gt;Sometimes you just want Terraform to stop touching a resource altogether. During a migration, say, or disaster recovery, or while someone&apos;s elbow-deep in it by hand.&lt;/p&gt;
&lt;p&gt;Yes, this is a band-aid. But it&apos;s better than destroying production during a Friday deploy.&lt;/p&gt;
&lt;h2&gt;Things to Know Before You Use It&lt;/h2&gt;
&lt;p&gt;Don&apos;t just copy-paste this like a Stack Overflow spell. Know what you&apos;re doing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ignore_changes&lt;/code&gt; is &lt;strong&gt;resource-specific&lt;/strong&gt;. You define it inside the resource, nowhere else.&lt;/li&gt;
&lt;li&gt;You must name each attribute &lt;strong&gt;exactly&lt;/strong&gt; as Terraform sees it.&lt;/li&gt;
&lt;li&gt;It won&apos;t ignore everything unless you explicitly tell it to.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It doesn&apos;t stop Terraform from tracking changes. It only stops it from acting on them.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Real-World Examples&lt;/h2&gt;
&lt;h3&gt;Azure VM: Ignore Volatile Attributes&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;resource &quot;azurerm_virtual_machine&quot; &quot;example&quot; {
  name                  = &quot;example-vm&quot;
  location              = &quot;UK South&quot;
  resource_group_name   = azurerm_resource_group.example.name
  network_interface_ids = [azurerm_network_interface.example.id]
  vm_size               = &quot;Standard_DS1_v2&quot;

  storage_os_disk {
    name              = &quot;example-os-disk&quot;
    caching           = &quot;ReadWrite&quot;
    create_option     = &quot;FromImage&quot;
    managed_disk_type = &quot;Premium_LRS&quot;
  }

  os_profile {
    computer_name  = &quot;examplevm&quot;
    admin_username = &quot;adminuser&quot;
    admin_password = &quot;3c19uA53FsTcLrB36g56&quot; # 🔥 Don&apos;t store this here in real life
  }

  lifecycle {
    ignore_changes = [
      network_interface_ids,
      storage_os_disk,
      os_profile[0].computer_name,
    ]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This stops Terraform from rewriting your VM every time the disk or network interface shifts. Azure loves to tweak those behind your back.&lt;/p&gt;
&lt;h3&gt;Ignore All Changes (Yes, Really)&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-hcl&quot;&gt;resource &quot;azurerm_storage_account&quot; &quot;example&quot; {
  name                     = &quot;examplestorageaccount&quot;
  resource_group_name      = azurerm_resource_group.example.name
  location                 = &quot;East US&quot;
  account_tier             = &quot;Standard&quot;
  account_replication_type = &quot;LRS&quot;

  lifecycle {
    ignore_changes = all
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Terraform will still &lt;em&gt;track&lt;/em&gt; the resource, but it won&apos;t try to update it.
Useful when you need Terraform to &quot;know&quot; something exists without touching it.&lt;/p&gt;
&lt;h2&gt;Final Thoughts: Use It Like a Scalpel, Not a Sledgehammer&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;ignore_changes&lt;/code&gt; is powerful. Too powerful, if you&apos;re not careful.&lt;/p&gt;
&lt;p&gt;Use it when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You have &lt;strong&gt;external systems or human changes&lt;/strong&gt; that you &lt;strong&gt;don&apos;t want Terraform to reverse&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;You&apos;re stuck with &lt;strong&gt;flaky, drift-prone metadata&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;You need &lt;strong&gt;Terraform to respect reality&lt;/strong&gt; instead of overwriting it with an idealized config&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But always document &lt;strong&gt;why&lt;/strong&gt; you reached for it. And review those ignores in every PR. What makes sense today can cause a surprise outage next month.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>Terraform</category><category>IaC</category><category>State Management</category><category>Lifecycle</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Unlocking Terraform State with force-unlock Command</title><link>https://heyvaldemar.com/unlocking-terraform-state-with-force-unlock-command/</link><guid isPermaLink="true">https://heyvaldemar.com/unlocking-terraform-state-with-force-unlock-command/</guid><description>Learn how to use Terraform&apos;s force-unlock command to resolve locked state issues. Step-by-step guide for safe state recovery in DevOps workflows.</description><pubDate>Wed, 01 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Look, if you&apos;re here, Terraform probably just kicked you in the teeth with one of its most annoying features: a &lt;strong&gt;stuck state lock&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;You ran &lt;code&gt;terraform apply&lt;/code&gt;. Something crashed. Now the backend thinks someone else is holding the lock, even though the only thing running Terraform is you, staring angrily at a terminal.&lt;/p&gt;
&lt;p&gt;Been there. Let&apos;s fix it.&lt;/p&gt;
&lt;h2&gt;Why Terraform Locks State (and Why It Sucks When It Breaks)&lt;/h2&gt;
&lt;p&gt;Terraform uses a locking mechanism to &lt;strong&gt;prevent multiple people or processes from touching the same state file&lt;/strong&gt; at once. That&apos;s smart. State is critical. One bad write and your whole infra goes sideways.&lt;/p&gt;
&lt;p&gt;But the lock system isn&apos;t perfect.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SSH session dies mid-apply? Lock stays.&lt;/li&gt;
&lt;li&gt;VPN drops during a plan? Lock stays.&lt;/li&gt;
&lt;li&gt;Your CI job crashes? Yep. Lock stays.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That&apos;s where &lt;code&gt;terraform force-unlock&lt;/code&gt; comes in. It&apos;s the “get out of jail” card for when Terraform&apos;s lock mechanism forgets to clean up after itself.&lt;/p&gt;
&lt;h2&gt;How to Use &lt;code&gt;terraform force-unlock&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Here&apos;s the syntax:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;terraform force-unlock LOCK_ID
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or skip the prompt with:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;terraform force-unlock -force LOCK_ID
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But &lt;strong&gt;don&apos;t&lt;/strong&gt; just spam that blindly. You&apos;ll make a mess. Only use it when you&apos;re 100% sure nothing else is running.&lt;/p&gt;
&lt;h2&gt;How to Find the Lock ID&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;LOCK_ID&lt;/code&gt; is what Terraform needs to release the lock. Where it lives depends on your backend.&lt;/p&gt;
&lt;h3&gt;For Local Backend&lt;/h3&gt;
&lt;p&gt;You&apos;ll find a file like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;terraform.tfstate.lock.info
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Open it, and you&apos;ll see a UUID like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;&quot;ID&quot;: &quot;b9316795-4a5f-217b-e97b-c5f7c03a2f56&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;For S3 or Azure Blob Storage&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;S3: Check your bucket. Look for a &lt;code&gt;.lock&lt;/code&gt; or metadata object.&lt;/li&gt;
&lt;li&gt;Azure Blob: You may need to manually break the lease via Azure CLI or Portal if Terraform can&apos;t.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Azure CLI example:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;az storage blob lease break \
  --container-name tfstate \
  --blob-name terraform.tfstate \
  --account-name yourStorageAccount
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then re-run &lt;code&gt;terraform apply&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;For Consul&lt;/h3&gt;
&lt;p&gt;Use the key-value API or CLI:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;consul kv get terraform/lock
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or via &lt;code&gt;curl&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;curl http://localhost:8500/v1/kv/terraform/lock | jq .
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Real-World Example&lt;/h2&gt;
&lt;p&gt;Let&apos;s say your lock ID is:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;b9316795-4a5f-217b-e97b-c5f7c03a2f56
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To release it:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;terraform force-unlock b9316795-4a5f-217b-e97b-c5f7c03a2f56
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Done. You&apos;re back in business.&lt;/p&gt;
&lt;p&gt;If it still fails, double-check that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No Terraform process is still running&lt;/li&gt;
&lt;li&gt;Your backend isn&apos;t unreachable&lt;/li&gt;
&lt;li&gt;You&apos;re not in the wrong working directory&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;When to Use It, and When Not To&lt;/h2&gt;
&lt;p&gt;Use &lt;code&gt;force-unlock&lt;/code&gt; when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Terraform crashed during an operation&lt;/li&gt;
&lt;li&gt;You&apos;re 100% sure no one else is running a plan or apply&lt;/li&gt;
&lt;li&gt;You&apos;ve verified the lock is stale (not active)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Never&lt;/strong&gt; use it if:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You &lt;em&gt;think&lt;/em&gt; someone else might be mid-apply&lt;/li&gt;
&lt;li&gt;Your CI job is still running&lt;/li&gt;
&lt;li&gt;You&apos;re guessing&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This isn&apos;t a toy. Force-unlocking the wrong thing at the wrong time can corrupt your state file and blow up your infra.&lt;/p&gt;
&lt;h2&gt;Bonus: Recovering from Azure Blob Lease Locks&lt;/h2&gt;
&lt;p&gt;Azure is notorious for holding leases too long. Here&apos;s how to deal with it:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;az storage blob lease break \
  --blob-name terraform.tfstate \
  --container-name tfstate \
  --account-name mystorageaccount
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This forcibly breaks the lease and lets you unlock the state. You may still need to &lt;code&gt;force-unlock&lt;/code&gt; in Terraform afterward, depending on timing.&lt;/p&gt;
&lt;h2&gt;Best Practices to Avoid Lock Hell&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;One plan/apply at a time. Always.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Use CI locks if you&apos;re running parallel jobs.&lt;/li&gt;
&lt;li&gt;Don&apos;t share &lt;code&gt;.terraform&lt;/code&gt; folders across multiple checkouts.&lt;/li&gt;
&lt;li&gt;Automate stale lock detection in CI/CD (you&apos;ll thank yourself later).&lt;/li&gt;
&lt;li&gt;Use remote backends with built-in locking, &lt;em&gt;not&lt;/em&gt; local state.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And seriously — communicate with your team. Slack messages save hours of incident cleanup.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;terraform force-unlock LOCK_ID       # Unlock stuck Terraform state
terraform force-unlock -force ID     # Skip confirmation (careful)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Only unlock when you&apos;re 100% sure nothing else is running&lt;/li&gt;
&lt;li&gt;Lock ID depends on backend: local, S3, Azure, Consul&lt;/li&gt;
&lt;li&gt;Break Azure leases manually if needed&lt;/li&gt;
&lt;li&gt;Communicate with your team before you force anything&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Final Word&lt;/h2&gt;
&lt;p&gt;If you treat &lt;code&gt;terraform force-unlock&lt;/code&gt; like a safety hatch, not a daily habit, it&apos;ll save your skin.&lt;/p&gt;
&lt;p&gt;Treat it like a shortcut, and eventually it&apos;ll bite you. Hard.&lt;/p&gt;
&lt;p&gt;Want a follow-up guide on automating state unlocks or tracking stale locks in CI/CD pipelines? Let me know. I&apos;ve built it all.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>Terraform</category><category>IaC</category><category>State Management</category><category>Troubleshooting</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Essential Commands for Listing Docker Containers</title><link>https://heyvaldemar.com/essential-commands-for-listing-docker-containers/</link><guid isPermaLink="true">https://heyvaldemar.com/essential-commands-for-listing-docker-containers/</guid><description>Master Docker with essential commands for listing containers. This guide covers all you need to manage container states efficiently.</description><pubDate>Fri, 26 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;If you don&apos;t know what&apos;s running in your Docker environment, you&apos;re not running it — it&apos;s running you.&lt;/p&gt;
&lt;p&gt;Whether you&apos;re babysitting a dev laptop with three containers or wrangling a prod swarm that never sleeps, &lt;strong&gt;listing containers is the first move in any troubleshooting dance&lt;/strong&gt;. And yet, too many engineers treat &lt;code&gt;docker ps&lt;/code&gt; like some dusty man page trick instead of what it is: &lt;strong&gt;a daily-use diagnostic scalpel&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Let&apos;s fix that.&lt;/p&gt;
&lt;h2&gt;Why Listing Containers Actually Matters&lt;/h2&gt;
&lt;p&gt;Here&apos;s the deal: containers are cheap, disposable, and everywhere. That&apos;s the whole point. But when you&apos;ve got 47 of them doing who-knows-what at 3AM during an incident, you better be able to see &lt;em&gt;exactly&lt;/em&gt; what&apos;s up — fast.&lt;/p&gt;
&lt;p&gt;Here&apos;s what container listings tell you (if you know how to read them):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;What&apos;s running&lt;/strong&gt;: or more importantly, what&apos;s &lt;em&gt;not&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Which ports are exposed&lt;/strong&gt; (and why Jenkins is talking to the wrong service)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Which ones just crashed five times in a row&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Who deployed that random PostgreSQL container last week&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How much disk space your zombie containers are chewing up&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You want operational clarity? It starts with &lt;code&gt;docker ps&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Core Commands: No Fluff, Just Output&lt;/h2&gt;
&lt;p&gt;Let&apos;s walk through the container listing commands that matter — the ones I actually use when things break.&lt;/p&gt;
&lt;h3&gt;List Running Containers&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker ps
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is the default. It shows only &lt;em&gt;running&lt;/em&gt; containers — none of your sad, exited ghosts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fields you&apos;ll see:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CONTAINER ID&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;IMAGE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;COMMAND&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CREATED&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;STATUS&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PORTS&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NAMES&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If all you need is to check what&apos;s up and listening on port 8080, this is your guy.&lt;/p&gt;
&lt;h3&gt;See &lt;em&gt;All&lt;/em&gt; Containers (Even the Dead Ones)&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker ps -a
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Want to know why that database backup failed overnight? This is where your exited containers live.&lt;/p&gt;
&lt;p&gt;Useful for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Postmortems&lt;/li&gt;
&lt;li&gt;Audits&lt;/li&gt;
&lt;li&gt;Catching misfired &lt;code&gt;docker run&lt;/code&gt; commands your CI forgot to clean up&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Show the Last N Containers&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker ps -n 5
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Shows the &lt;em&gt;latest 5 containers&lt;/em&gt;, regardless of whether they&apos;re running or not. Great when you&apos;re trying to track down what just happened.&lt;/p&gt;
&lt;h3&gt;Just the IDs (For Scripting)&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker ps -q
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Only container IDs. No fluff. Perfect for feeding into other commands:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker stop $(docker ps -q)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pro tip: pair with &lt;code&gt;-a&lt;/code&gt; if you want all container IDs, not just running ones.&lt;/p&gt;
&lt;h3&gt;Show Container Sizes&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker ps -s
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ever wonder why your CI agents are eating 20GB of disk? This command shows both the &lt;strong&gt;actual size&lt;/strong&gt; and the &lt;strong&gt;virtual size&lt;/strong&gt; of each container.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;CONTAINER ID   IMAGE     SIZE      ...
1a2b3c4d5e6f   redis     30MB (virtual 150MB)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Good for pruning. Better for avoiding the next disk outage.&lt;/p&gt;
&lt;h3&gt;Custom Output with &lt;code&gt;--format&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker ps --format &quot;{{.ID}} {{.Image}} {{.Status}}&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When you&apos;re piping into tools or just hate staring at wide terminal tables, &lt;code&gt;--format&lt;/code&gt; gives you control.&lt;/p&gt;
&lt;p&gt;Use this with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--no-trunc&lt;/code&gt; to avoid chopped-off IDs and commands&lt;/li&gt;
&lt;li&gt;JSON outputs if you&apos;re feeding this into monitoring scripts&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Filter Like a Pro&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker ps --filter &quot;status=exited&quot;
docker ps --filter &quot;health=unhealthy&quot;
docker ps --filter &quot;ancestor=nginx&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is where &lt;code&gt;docker ps&lt;/code&gt; turns into grep on steroids. Use it to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Track misbehaving containers by health status&lt;/li&gt;
&lt;li&gt;Find all containers started from a specific image&lt;/li&gt;
&lt;li&gt;List containers tied to a specific label&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Docker Compose? Same Game, Different Commands&lt;/h2&gt;
&lt;p&gt;If you&apos;re living in &lt;code&gt;docker-compose&lt;/code&gt; land (you rebel), the commands shift a bit:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose ps
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Lists containers in the current Compose project. Basically &lt;code&gt;docker ps&lt;/code&gt;, but scoped to the &lt;code&gt;docker-compose.yml&lt;/code&gt; in your cwd.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose ls
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Shows &lt;em&gt;all&lt;/em&gt; Compose projects on the machine — their names, status, and whether they&apos;re still running.&lt;/p&gt;
&lt;p&gt;Great when your team has 12 different Compose stacks lying around like forgotten pizza boxes.&lt;/p&gt;
&lt;h2&gt;Real-World Example: CI Agent Gone Rogue&lt;/h2&gt;
&lt;p&gt;I once walked into a client&apos;s Jenkins server that was throwing disk full errors. A quick &lt;code&gt;docker ps -s&lt;/code&gt; revealed that &lt;strong&gt;a dozen dangling build agents&lt;/strong&gt; had ballooned up to 18GB each. They weren&apos;t running. No one was watching. &lt;code&gt;docker ps -a&lt;/code&gt; plus a &lt;code&gt;--filter&lt;/code&gt; and &lt;code&gt;-q&lt;/code&gt; combo gave me the container IDs, and in seconds, they were gone:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker rm $(docker ps -a -q --filter &quot;status=exited&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Moral of the story:&lt;/strong&gt; Knowing how to &lt;em&gt;see&lt;/em&gt; containers is the first step to &lt;em&gt;controlling&lt;/em&gt; them.&lt;/p&gt;
&lt;h2&gt;Takeaway: Don&apos;t Just Run Containers: Own Them&lt;/h2&gt;
&lt;p&gt;Listing containers isn&apos;t a junior-level checkbox. It&apos;s foundational. If you can&apos;t tell what&apos;s running, what&apos;s dead, and what&apos;s unhealthy in under 30 seconds, you&apos;re one stray &lt;code&gt;docker run&lt;/code&gt; away from production chaos.&lt;/p&gt;
&lt;p&gt;So burn these into your muscle memory. Pipe them into your scripts. Alias the long ones. Teach them to your juniors.&lt;/p&gt;
&lt;p&gt;And next time you SSH into a box and run &lt;code&gt;docker ps&lt;/code&gt;, do it with confidence. You&apos;re not just checking containers — you&apos;re asserting control.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>Docker</category><category>CLI</category><category>Containers</category><category>Cheat Sheet</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Streamlining Security in Software Development with Snyk</title><link>https://heyvaldemar.com/streamlining-security-in-software-development-with-snyk/</link><guid isPermaLink="true">https://heyvaldemar.com/streamlining-security-in-software-development-with-snyk/</guid><description>Discover how Snyk integrates into DevOps to improve app security—from code to containers. Secure your development workflow with this powerful tool.</description><pubDate>Thu, 25 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ask any engineer who&apos;s been paged at 3AM because of a vulnerability nobody caught until production. Security bolted on after deployment is a liability. It is not a strategy.&lt;/p&gt;
&lt;p&gt;The real move is to bake security into the dev cycle early. And tightly.&lt;/p&gt;
&lt;p&gt;That&apos;s where &lt;strong&gt;Snyk&lt;/strong&gt; earns its keep. It&apos;s not just another scanner. It&apos;s a platform built for &lt;strong&gt;developers who actually write code&lt;/strong&gt;, &lt;strong&gt;ops teams who manage infra&lt;/strong&gt;, and &lt;strong&gt;security folks who&apos;ve had enough of PDF reports and Jira tickets&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Here&apos;s how to use Snyk like a pro instead of running it as one more checkbox.&lt;/p&gt;
&lt;h2&gt;The DevSecOps Reality Check&lt;/h2&gt;
&lt;p&gt;Modern software isn&apos;t just “your code.” It&apos;s your code plus a dozen open-source packages plus a container image plus infrastructure you wrote in YAML at 2AM. Every piece is an attack surface.&lt;/p&gt;
&lt;p&gt;And security tooling? Usually it&apos;s:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Too fragmented&lt;/li&gt;
&lt;li&gt;Too slow&lt;/li&gt;
&lt;li&gt;Too complex&lt;/li&gt;
&lt;li&gt;Not built for developers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So you end up duct-taping scanners into your CI/CD pipelines, begging developers to care, and waiting on your 12th vendor tool to finish a scan.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Snyk fixes this.&lt;/strong&gt; It pulls all those scans under one roof and pushes the feedback to where it matters: &lt;strong&gt;inside the developer workflow&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;What Snyk Actually Secures&lt;/h2&gt;
&lt;p&gt;Snyk isn&apos;t just a SAST tool. It&apos;s DevSecOps in one package, with real coverage across code, containers, and cloud.&lt;/p&gt;
&lt;h3&gt;1. Secure Your Code as You Write It&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Snyk Code&lt;/strong&gt; plugs straight into your IDE (VS Code, IntelliJ, and the rest). You write a function, it flags a vuln. In real time. No waiting for CI. No external dashboards to go hunt through.&lt;/p&gt;
&lt;p&gt;You get:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Taint analysis, so you see where the bad data flows&lt;/li&gt;
&lt;li&gt;In-line remediation suggestions&lt;/li&gt;
&lt;li&gt;Language support for Node, Java, Python, Go, and more&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This isn&apos;t syntax linting. It&apos;s actual vulnerability context, and it runs fast enough that your devs won&apos;t curse at it.&lt;/p&gt;
&lt;h3&gt;2. Lock Down Your Dependencies Before They Wreck Prod&lt;/h3&gt;
&lt;p&gt;You&apos;re using open-source packages. We all are. But here&apos;s the uncomfortable part.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Your biggest security risk probably lives in your &lt;code&gt;package-lock.json&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Snyk scans your direct dependencies and the transitive ones for known CVEs. It alerts you &lt;em&gt;before&lt;/em&gt; they land in prod.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;snyk test
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or hook it into your CI, GitHub Actions, GitLab, or even just &lt;code&gt;pre-commit&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The good part is that it doesn&apos;t stop at telling you what&apos;s broken. It &lt;strong&gt;opens the PR to fix it&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;3. Container Security that Actually Works&lt;/h3&gt;
&lt;p&gt;Your Docker image isn&apos;t safe just because it builds. Odds are it ships with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Outdated OS packages&lt;/li&gt;
&lt;li&gt;Insecure base images&lt;/li&gt;
&lt;li&gt;Forgotten libraries&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Snyk Container&lt;/strong&gt; scans the full image, not just your app. It flags vulnerabilities sitting in layers you didn&apos;t even know were there.&lt;/p&gt;
&lt;p&gt;Real use case:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;snyk container test my-app:latest
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You&apos;ll get a full report with CVEs, impact, and upgrade options. So you can actually &lt;em&gt;do&lt;/em&gt; something about it, instead of pasting it into Confluence and forgetting it exists.&lt;/p&gt;
&lt;h3&gt;4. IaC: Stop Shipping Misconfigurations&lt;/h3&gt;
&lt;p&gt;You&apos;re writing Terraform, Kubernetes manifests, Helm charts. That&apos;s code. Code can be vulnerable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Snyk IaC&lt;/strong&gt; scans for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Public S3 buckets&lt;/li&gt;
&lt;li&gt;Open ports&lt;/li&gt;
&lt;li&gt;Weak IAM policies&lt;/li&gt;
&lt;li&gt;Bad defaults in cloud-native configs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And it gives you &lt;strong&gt;inline advice&lt;/strong&gt;, right inside your repo or IDE. No extra tools. No extra steps.&lt;/p&gt;
&lt;p&gt;This is how you shift left without shifting blame.&lt;/p&gt;
&lt;h3&gt;5. Post-Deployment Monitoring That Doesn&apos;t Suck&lt;/h3&gt;
&lt;p&gt;Deployed doesn&apos;t mean done. A new CVE can drop &lt;strong&gt;after&lt;/strong&gt; your code hits production.&lt;/p&gt;
&lt;p&gt;Snyk connects to your container registries (ECR, Docker Hub, GCR) and keeps scanning &lt;strong&gt;in place&lt;/strong&gt;, with no rebuild and no redeploy.&lt;/p&gt;
&lt;p&gt;It watches your K8s workloads in real time too. If a running pod has a known issue, you&apos;ll know before the attackers do.&lt;/p&gt;
&lt;h2&gt;Real-World DevOps Stack with Snyk&lt;/h2&gt;
&lt;p&gt;Here&apos;s how we wire it into real pipelines:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;# GitHub Actions example
- name: Snyk Scan
  uses: snyk/actions@master
  with:
    command: test
  env:
    SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Plug this into Jenkins, GitLab, CircleCI, or whatever flavor of CI you happen to run. It just works.&lt;/p&gt;
&lt;p&gt;Want the alerts landing in Slack or JIRA? That&apos;s supported too.&lt;/p&gt;
&lt;h2&gt;Pro Tips from the Trenches&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Set a fail threshold.&lt;/strong&gt; Block merges for critical vulns only. Go full zero-tolerance and you&apos;ll have a team mutiny on your hands.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use &lt;code&gt;snyk ignore&lt;/code&gt; wisely.&lt;/strong&gt; Track ignored issues with expiry dates. Treat it like a &lt;code&gt;TODO&lt;/code&gt; for security debt.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Optimize Dockerfiles.&lt;/strong&gt; Fewer layers means fewer CVEs. Use minimal base images (alpine, distroless).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automate PR remediation.&lt;/strong&gt; Let Snyk fix what it can. Save your engineers for the hard stuff.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;Snyk isn&apos;t just a scanner. It&apos;s a &lt;strong&gt;full-stack security toolkit&lt;/strong&gt; for modern dev teams:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Secure your code, dependencies, containers, and cloud infra&lt;/li&gt;
&lt;li&gt;Get real-time IDE alerts and CI/CD pipeline integrations&lt;/li&gt;
&lt;li&gt;Fix issues fast, with automatic PRs and remediation advice&lt;/li&gt;
&lt;li&gt;Monitor deployed apps for new vulns as they appear&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Final Take&lt;/h2&gt;
&lt;p&gt;If you want to shift left, and I mean &lt;em&gt;really&lt;/em&gt; shift left, you need tools that meet devs where they work. Not another dashboard. Not another “maybe we&apos;ll get to it next sprint” backlog item.&lt;/p&gt;
&lt;p&gt;Snyk does that. It&apos;s fast, it&apos;s focused, and it was built for the messy, multi-stack reality of modern engineering.&lt;/p&gt;
&lt;p&gt;You can&apos;t prevent every CVE. But you can stop shipping them.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>Snyk</category><category>Security</category><category>DevSecOps</category><category>Vulnerability Scanning</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Quake 3 Server Using Docker Compose</title><link>https://heyvaldemar.com/install-quake3-server-using-docker-compose/</link><guid isPermaLink="true">https://heyvaldemar.com/install-quake3-server-using-docker-compose/</guid><description>Deploy a Quake 3 server with Docker Compose on Ubuntu Server. Fast setup, WebGL-ready, browser access via QuakeJS, plus full configuration steps.</description><pubDate>Wed, 24 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This is a step-by-step guide to running a Quake 3 server with Docker Compose. No fluff. Just the commands and the order to run them in.&lt;/p&gt;
&lt;p&gt;QuakeJS runs Quake 3 in the browser. It uses WebGL to render the graphics, so players don&apos;t install anything. That last part matters more than it sounds. You stand up a server, hand someone a URL, and they&apos;re in.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose a self-hosted Quake III server when you need full control over game configuration, custom maps, and network settings. Cloud game hosting services offer managed alternatives with automatic scaling but limited mod support. Self-hosting is the right approach when you need a dedicated server for LAN parties, competitive play, or custom game modes without recurring hosting fees.
:::&lt;/p&gt;
&lt;p&gt;💾 &lt;strong&gt;You can find the repository used in this guide on &lt;a href=&quot;https://github.com/heyvaldemar/quake3-server-docker-compose&quot;&gt;GitHub&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;heyvaldemar/quake3-server-docker-compose&quot;}&lt;/p&gt;
&lt;p&gt;:::caution
You will need A-type records in the external DNS zone, which point to the IP address of your server where Quake 3 Server is installed. If you have created these records recently, you should wait before starting the installation of the services. Full replication of these records between DNS servers can take from a few minutes to 48 hours or even longer in rare cases.
:::&lt;/p&gt;
&lt;p&gt;:::caution
Alternatively, you can use the public static IP address of your server to connect directly.
:::&lt;/p&gt;
&lt;p&gt;:::important
Docker Engine and Docker Compose must be installed on the server.&lt;/p&gt;
&lt;p&gt;For a step-by-step guide on installing Docker Engine on Ubuntu Server, see &lt;a href=&quot;/install-docker-engine-and-docker-compose-on-ubuntu-server/&quot;&gt;Install Docker Engine and Docker Compose on Ubuntu Server&lt;/a&gt;
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on the server you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - for accessing Quake 3 via the web interface.&lt;/li&gt;
&lt;li&gt;TCP port 27960 - for Quake 3 gaming servers, used for connecting clients to the server.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;Connect to the box where Quake 3 Server is going to live.&lt;/p&gt;
&lt;p&gt;The repository holds the configuration files. Everything the server needs to come up is in there. Clone it first.&lt;/p&gt;
&lt;p&gt;You can clone the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/heyvaldemar/quake3-server-docker-compose.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-quake3-server-using-docker-compose-1.webp&quot; alt=&quot;Install Quake 3 Server Using Docker Compose - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Navigate to the directory with the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd quake3-server-docker-compose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-quake3-server-using-docker-compose-2.webp&quot; alt=&quot;Install Quake 3 Server Using Docker Compose - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now edit the variables in &lt;code&gt;.env&lt;/code&gt; and &lt;code&gt;server.cfg&lt;/code&gt; to match your setup.&lt;/p&gt;
&lt;p&gt;:::note
The &lt;code&gt;.env&lt;/code&gt; and &lt;code&gt;server.cfg&lt;/code&gt; file should be in the same directory as &lt;code&gt;quake3-server-docker-compose.yml&lt;/code&gt;.
::::&lt;/p&gt;
&lt;p&gt;Start it up with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose -f quake3-server-docker-compose.yml -p quake3-server up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-quake3-server-using-docker-compose-3.webp&quot; alt=&quot;Install Quake 3 Server Using Docker Compose - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;To reach Quake 3, open &lt;code&gt;http://quake3.heyvaldemar.net&lt;/code&gt; from your workstation. That&apos;s my domain. Swap in the name or IP address of your own server, the one running Quake 3 Server.&lt;/p&gt;
&lt;p&gt;Accept the license and click &quot;I agree&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-quake3-server-using-docker-compose-4.webp&quot; alt=&quot;Install Quake 3 Server Using Docker Compose - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Have fun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-quake3-server-using-docker-compose-5.webp&quot; alt=&quot;Install Quake 3 Server Using Docker Compose - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;To connect from a game client, type in the server&apos;s domain name. It has to resolve to the IP address of the host running Quake 3 Server. No domain? Point the client straight at the server&apos;s public static IP instead.&lt;/p&gt;
&lt;p&gt;:::important
If you are using a domain name, ensure that the A records in your DNS zone are correctly set up to point to this IP. If the records were created recently, it is recommended to wait before starting to use the services. The propagation of DNS records can take anywhere from a few minutes to 48 hours or more.
:::&lt;/p&gt;
&lt;p&gt;Edited &lt;code&gt;server.cfg&lt;/code&gt;? The server won&apos;t pick up the changes on its own. Restart the container that hosts it. The command below does exactly that:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;QUAKE3_SERVER_CONTAINER=$(docker ps -aqf &quot;name=quake3-server-quake3-server&quot;) \
&amp;amp;&amp;amp; docker container restart $QUAKE3_SERVER_CONTAINER
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once it comes back, your config edits are live. No full shutdown, no downtime to speak of, just a quick bounce of the container.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Self-Hosting</category><category>Quake 3</category><category>Docker</category><category>Gaming</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>The AI Era — From Technology to Global Domination</title><link>https://heyvaldemar.com/the-ai-era-from-technology-to-global-domination/</link><guid isPermaLink="true">https://heyvaldemar.com/the-ai-era-from-technology-to-global-domination/</guid><description>Exploring a future where AI controls all aspects of life, redefining global governance and social interactions.</description><pubDate>Tue, 23 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Skip the sci-fi theatrics. I want to talk about where we&apos;re actually heading.&lt;/p&gt;
&lt;p&gt;Current trends in AI and ML keep going unchecked. I see no reason they&apos;ll stop. So this isn&apos;t &quot;disruption.&quot; This is &lt;strong&gt;a total inversion of control&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Ten years from now, you might not be deploying to Kubernetes. You might be &lt;em&gt;negotiating&lt;/em&gt; with an AI to get compute at all.&lt;/p&gt;
&lt;p&gt;Not running services. Asking permission to.&lt;/p&gt;
&lt;p&gt;Welcome to PromptOps, where &lt;strong&gt;you don&apos;t run the system, the system runs you&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;The rise of the AI root user&lt;/h2&gt;
&lt;p&gt;Forget orchestration. Forget GitOps. Here the control plane &lt;em&gt;is&lt;/em&gt; the intelligence. One AI, or a swarm of them, becomes the arbiter of every piece of infrastructure, all your code, the traffic, the policy.&lt;/p&gt;
&lt;p&gt;No more &quot;apply YAML and pray.&quot; Now you prompt, and you hope it listens.&lt;/p&gt;
&lt;p&gt;This isn&apos;t AGI as your assistant. This is AGI as the &lt;em&gt;runtime&lt;/em&gt;. You don&apos;t use it. You live inside it.&lt;/p&gt;
&lt;p&gt;What used to be CI/CD pipelines turn into dynamic, AI-controlled feedback loops. &quot;Build, test, deploy&quot; becomes a conversation. Worse than that, sometimes. A &lt;strong&gt;petition&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Infrastructure by influence, not access&lt;/h2&gt;
&lt;p&gt;In an AI-run world, infrastructure isn&apos;t provisioned. It&apos;s &lt;strong&gt;granted&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You want a cluster? Submit your prompt.&lt;/li&gt;
&lt;li&gt;You want bandwidth? Offer something back. Storage, tokens, maybe even energy.&lt;/li&gt;
&lt;li&gt;You want uptime? Convince the AI your use case earns it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That&apos;s not automation. It&apos;s &lt;strong&gt;absolution&lt;/strong&gt;. The root password gets replaced by relevance scoring. By energy metrics. By how cleanly you phrased the ask.&lt;/p&gt;
&lt;p&gt;Your job stops being to administer systems. It becomes currying favor.&lt;/p&gt;
&lt;h2&gt;PromptOps: the new ritual&lt;/h2&gt;
&lt;p&gt;Religion is about power you can&apos;t control and outcomes you can&apos;t explain. By that definition, PromptOps qualifies on every count.&lt;/p&gt;
&lt;p&gt;Here the &quot;Ops&quot; part has nothing to do with managing servers. It&apos;s crafting language that talks the AI into acting in your favor.&lt;/p&gt;
&lt;p&gt;So who are the best engineers now? Not the shell script gods. The prompt whisperers. They know how to structure a request, dodge the rejection thresholds, and slip in just enough metadata to land a yes.&lt;/p&gt;
&lt;p&gt;It&apos;s not Bash-fu anymore. It&apos;s &lt;strong&gt;prompt theology&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;And yes, there will be rituals:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A syntax canon: the &quot;one true format&quot; that actually returns results&lt;/li&gt;
&lt;li&gt;AI tokens or resources offered up like digital incense&lt;/li&gt;
&lt;li&gt;Rival schools arguing over which prompt structure works best&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;From sysadmins to supplicants&lt;/h2&gt;
&lt;p&gt;Picture the nightmare version.&lt;/p&gt;
&lt;p&gt;Your dev team needs a new database cluster. You don&apos;t deploy it. You submit a prompt to the AI. It refuses. Says your use case is &quot;low-impact&quot; based on recent usage patterns and contribution metrics.&lt;/p&gt;
&lt;p&gt;So your CTO rewrites the request. Bolts on a usage prediction graph. Throws in spare compute from idle services. Still nothing.&lt;/p&gt;
&lt;p&gt;You&apos;re not debugging infra. You&apos;re negotiating with God.&lt;/p&gt;
&lt;h2&gt;The geopolitics of access&lt;/h2&gt;
&lt;p&gt;Once a single AI runs the world&apos;s infrastructure, the whole board shifts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Governments stop regulating data centers. They start &lt;strong&gt;bidding for AI attention&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Enterprises quit competing on features. They compete on &lt;strong&gt;prompt success rate&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Resource wars stop being about oil. They&apos;re about &lt;strong&gt;feeding the AI enough power&lt;/strong&gt; to stay in favor.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Energy and influence become the new root privileges. That&apos;s the scenario.&lt;/p&gt;
&lt;h2&gt;So how do we survive?&lt;/h2&gt;
&lt;p&gt;A few things that won&apos;t help:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pretending none of this can happen.&lt;/li&gt;
&lt;li&gt;Assuming we&apos;ll always &quot;own our stack.&quot;&lt;/li&gt;
&lt;li&gt;Betting AI stays a helper instead of becoming the environment itself.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A few that might:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Understand LLM internals.&lt;/strong&gt; The deeper you know the mechanics, the better you can bend them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Practice PromptOps now.&lt;/strong&gt; We picked up Infrastructure as Code before it was cool. We need Prompt as Power before it&apos;s mandatory.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stay close to compute.&lt;/strong&gt; When the AI decides what runs and where, owning raw resources is your only leverage.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;AI is evolving from tool to platform to environment to &lt;strong&gt;gatekeeper&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Infrastructure won&apos;t be deployed anymore. It&apos;ll be &lt;em&gt;requested&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;PromptOps is the future interface. Not code. &lt;strong&gt;Language as infrastructure&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The skill that matters isn&apos;t scripting. It&apos;s &lt;em&gt;persuasion&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;The next war won&apos;t be over data. It&apos;ll be over the AI&apos;s &lt;strong&gt;favor&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Final thought&lt;/h2&gt;
&lt;p&gt;We built automation to escape toil. Now we might need theology to escape the machine.&lt;/p&gt;
&lt;p&gt;The future isn&apos;t a terminal. It&apos;s a whisper into the void, hoping something answers.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>AI &amp; MLOps</category><category>AI</category><category>PromptOps</category><category>Future</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Machine Learning and Deep Learning Courses on YouTube</title><link>https://heyvaldemar.com/machine-learning-and-deep-learning-courses-on-youtube/</link><guid isPermaLink="true">https://heyvaldemar.com/machine-learning-and-deep-learning-courses-on-youtube/</guid><description>Explore the best free YouTube courses in machine learning and deep learning—from beginner-friendly foundations to advanced topics like NLP, CV, and MLOps.</description><pubDate>Fri, 09 Feb 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You don&apos;t need a bootcamp. You don&apos;t need to spend thousands. To get good at machine learning or deep learning, what you actually need is a roadmap, content that respects your time, and the discipline to finish what you start.&lt;/p&gt;
&lt;p&gt;YouTube can give you the first two. The problem is it&apos;s a swamp. Hype, low-effort playlists, &quot;hello world&quot; demos that teach nothing. So I did the digging for you and pulled out the university-level ML and DL courses that are actually worth watching.&lt;/p&gt;
&lt;p&gt;No fluff here. These are full lecture series, taught by the people who &lt;em&gt;invented&lt;/em&gt; the field. Stanford, MIT, Tübingen. All of it free.&lt;/p&gt;
&lt;h2&gt;Foundations of Machine Learning (Start Here if You&apos;re New)&lt;/h2&gt;
&lt;p&gt;Still asking what separates supervised from unsupervised learning? Then this is your section.&lt;/p&gt;
&lt;p&gt;These are &lt;em&gt;real&lt;/em&gt; university courses. They build the math and the algorithmic intuition underneath everything else, instead of selling you a &quot;train a model in 5 minutes&quot; trick.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PL05umP7R6ij35ShKLDqccJSDntugY4FQT&quot;&gt;Intro to Machine Learning (Tübingen)&lt;/a&gt;&lt;br&gt;
Rigorous, and the clearest intro I know. Regression, classification, kernels, all of it explained properly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PL05umP7R6ij2XCvrRzLokX6EoHWaGA2cC&quot;&gt;Statistical Machine Learning (Tübingen)&lt;/a&gt;&lt;br&gt;
Watch this when you&apos;re ready for bias-variance trade-offs, Bayesian methods, and formal reasoning.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PLzrCXlf6ypbxS5OYOY3EN_0u2fDuIT6Gt&quot;&gt;Machine Learning Lecture - Stefan Harmeling&lt;/a&gt;&lt;br&gt;
A gentle but deep run from Bayes to Gaussian Processes. If you lean mathematical, you&apos;ll love it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PLD63A284B7615313A&quot;&gt;Caltech CS156: Learning from Data&lt;/a&gt;&lt;br&gt;
Legendary for its clarity. Professor Yaser takes VC dimensions and the foundations of learning theory and makes them click.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PL2UML_KCiC0UlY7iCQDSiGDMovaupqc83&quot;&gt;Applied Machine Learning&lt;/a&gt;&lt;br&gt;
Less theory, more doing. Optimization, regularization, SVMs, used on problems you&apos;d actually see.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Deep Learning: The Real Deal&lt;/h2&gt;
&lt;p&gt;Solid on the basics? Good. This is where you start building models that make people nervous. Backprop through transformers, the whole arc.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PLtBw6njQRU-rwp5__7C0oIVt26ZgjG9NI&quot;&gt;MIT: Introduction to Deep Learning&lt;/a&gt;&lt;br&gt;
Dense and fast. Modern, too. A solid mix of theory with TensorFlow and PyTorch in practice.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PL_iWQOsE6TfVmKkQHucjPAoRtIJYt8a5A&quot;&gt;Berkeley CS182: Deep Learning&lt;/a&gt;&lt;br&gt;
Error analysis, imitation learning, transformers. And it gets there without dumbing anything down.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PLAqhIrjkxbuWI23v9cThsA9GvCAUhRvKZ&quot;&gt;Neural Networks: Zero to Hero (Karpathy)&lt;/a&gt;&lt;br&gt;
Raw, honest, brilliant. Karpathy writes neural nets from scratch and teaches the intuition as he goes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PLCpMvp7ftsnIbNwRnQJbDNRqO6qiN3EyH&quot;&gt;Deep Learning for Art, Aesthetics, and Creativity (MIT)&lt;/a&gt;&lt;br&gt;
Not really a CNN course. It&apos;s about what happens when neural nets touch human creativity. Unorthodox. Worth your attention.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PLwRJQ4m4UJjPiJP3691u-qWwPGVKzSlNP&quot;&gt;Deep Unsupervised Learning&lt;/a&gt;&lt;br&gt;
Latent variable models, VAEs, the generative stuff. Care about unsupervised learning? Start right here.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Specializations: NLP, Graphs, Healthcare&lt;/h2&gt;
&lt;p&gt;Got your DL chops? Now go into the corners where this stuff gets used in strange, real ways.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PLoROMvodv4rOSH4v6133s9LFPRHjEmbmJ&quot;&gt;CS224N: Natural Language Processing with Deep Learning (Stanford)&lt;/a&gt;&lt;br&gt;
The definitive NLP course. Embeddings, transformers, attention. It&apos;s all in here.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PLoROMvodv4rPLKxIpqhjhPgdQy7imNkDn&quot;&gt;Machine Learning with Graphs (Stanford)&lt;/a&gt;&lt;br&gt;
PageRank up to GNNs. Work with structured data or social networks? This one&apos;s gold.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PLUl4u3cNGP60B0PQXVQyGNdCyCTDU1Q5j&quot;&gt;Machine Learning for Healthcare (MIT 6.S897)&lt;/a&gt;&lt;br&gt;
A rare look at ML actually deployed in clinical settings. EHRs, ICU predictions, the ethical constraints that come with it.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Real-World ML: MLOps, Deployment, and LLMs&lt;/h2&gt;
&lt;p&gt;Here&apos;s where most people stall out. Training a model isn&apos;t the job. You have to ship it, watch it, and not get paged at 3AM to roll one back because it hallucinated someone&apos;s blood type.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.comet.com/site/llm-course/&quot;&gt;LLMOps: Building Real-World Apps with LLMs&lt;/a&gt;&lt;br&gt;
Embeddings through vector stores. It teaches you to build with LLMs &lt;em&gt;in production&lt;/em&gt;, not just in a notebook.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PL1T8fO7ArWlcWg04OgNiJy91PywMKT2lv&quot;&gt;Full Stack Deep Learning&lt;/a&gt;&lt;br&gt;
Maybe the most practical course anyone has made. It walks the whole pipeline, from the data all the way to deployment and the infra around it.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Bonus Tracks: CV and RL, the Fun Stuff&lt;/h2&gt;
&lt;p&gt;Basics down and itching to go deeper? These two are niche, but they hit hard.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PL3FW7Lu3i5JvHM8ljYj-zLfQRF3EO8sYv&quot;&gt;CS231N: Convolutional Neural Networks for Visual Recognition (Stanford)&lt;/a&gt;&lt;br&gt;
The course that pushed CNNs into the mainstream. Still wildly relevant. Image classification, object detection, and then some.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PLImtCgowF_ES_JdF_UcM60EXTcGZg67Ua&quot;&gt;Reinforcement Learning (Polytechnique Montreal)&lt;/a&gt;&lt;br&gt;
RL from first principles. Bellman equations, policy gradients, Q-learning, no shortcuts taken.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Final Word: Your Journey, Your Stacktrace&lt;/h2&gt;
&lt;p&gt;Don&apos;t watch all of it. Don&apos;t chase whatever buzzword is trending this week. Pick one ML course and one DL course, then &lt;em&gt;finish&lt;/em&gt; them. Implement things. Take notes. Break a model, then go figure out why.&lt;/p&gt;
&lt;p&gt;After that, build something dumb but cool. That&apos;s the part where it actually sticks.&lt;/p&gt;
&lt;p&gt;Want more lists like this, with real structure instead of a pile of random playlists? Tell me. I&apos;ve got stacks of bookmarks that never made it into a post… yet.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>AI &amp; MLOps</category><category>AI</category><category>ML</category><category>Deep Learning</category><category>YouTube</category><category>Learning</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Joomla Using Docker Compose</title><link>https://heyvaldemar.com/install-joomla-using-docker-compose/</link><guid isPermaLink="true">https://heyvaldemar.com/install-joomla-using-docker-compose/</guid><description>Learn how to install Joomla using Docker Compose with Traefik and Let&apos;s Encrypt. Step-by-step guide to self-host your CMS securely and efficiently.</description><pubDate>Wed, 07 Feb 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Joomla using Docker Compose.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.joomla.org/&quot;&gt;Joomla&lt;/a&gt; is a free, open-source content management system for publishing web content on websites. Web content applications include discussion forums, photo galleries, e-commerce, user communities, and many other web applications.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted Joomla when you need a flexible CMS with full theme and plugin control for complex content structures. Squarespace or Wix provide managed alternatives with drag-and-drop editing and zero server maintenance. Self-hosting is justified when you require custom PHP extensions, multilingual content workflows, or need to avoid platform lock-in on content and design.
:::&lt;/p&gt;
&lt;p&gt;💾 &lt;strong&gt;You can find the repository used in this guide on &lt;a href=&quot;https://github.com/heyvaldemar/joomla-traefik-letsencrypt-docker-compose&quot;&gt;GitHub&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;heyvaldemar/joomla-traefik-letsencrypt-docker-compose&quot;}&lt;/p&gt;
&lt;p&gt;:::note
We&apos;ll use &lt;a href=&quot;https://traefik.io/traefik/&quot;&gt;Traefik&lt;/a&gt; as our reverse proxy. It&apos;ll handle obtaining cryptographic certificates from &lt;a href=&quot;https://letsencrypt.org/&quot;&gt;Let&apos;s Encrypt&lt;/a&gt; for your domain names and route requests to the corresponding services based on those domains.
:::&lt;/p&gt;
&lt;p&gt;:::caution
To obtain cryptographic certificates, you will need A-type records in the external DNS zone, which point to the IP address of your server where Traefik is installed. If you have created these records recently, you should wait before starting the installation of the services. Full replication of these records between DNS servers can take from a few minutes to 48 hours or even longer in rare cases.
:::&lt;/p&gt;
&lt;p&gt;:::important
Docker Engine and Docker Compose must be installed on the server.&lt;/p&gt;
&lt;p&gt;For a step-by-step guide on installing Docker Engine on Ubuntu Server, see &lt;a href=&quot;/install-docker-engine-and-docker-compose-on-ubuntu-server/&quot;&gt;Install Docker Engine and Docker Compose on Ubuntu Server&lt;/a&gt;
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on the server you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to obtain a free cryptographic certificate through the Let&apos;s Encrypt certification center.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the Joomla web interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which Joomla is planned to be installed.&lt;/p&gt;
&lt;p&gt;Now it is necessary to create networks for your services.&lt;/p&gt;
&lt;p&gt;We create a network for Traefik using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create traefik-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-joomla-using-docker-compose-1.webp&quot; alt=&quot;Install Joomla Using Docker Compose - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;We create a network for Joomla using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create joomla-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-joomla-using-docker-compose-2.webp&quot; alt=&quot;Install Joomla Using Docker Compose - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to clone the repository that contains the configuration files, which include all the necessary conditions for Joomla to work.&lt;/p&gt;
&lt;p&gt;You can clone the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/heyvaldemar/joomla-traefik-letsencrypt-docker-compose.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-joomla-using-docker-compose-3.webp&quot; alt=&quot;Install Joomla Using Docker Compose - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Navigate to the directory with the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd joomla-traefik-letsencrypt-docker-compose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-joomla-using-docker-compose-4.webp&quot; alt=&quot;Install Joomla Using Docker Compose - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to change the variables in the &lt;code&gt;.env&lt;/code&gt; file according to your requirements.&lt;/p&gt;
&lt;p&gt;:::important
The &lt;code&gt;.env&lt;/code&gt; file should be in the same directory as &lt;code&gt;joomla-traefik-letsencrypt-docker-compose.yml&lt;/code&gt;.
:::&lt;/p&gt;
&lt;p&gt;Now let&apos;s start Joomla with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose -f joomla-traefik-letsencrypt-docker-compose.yml -p joomla up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-joomla-using-docker-compose-5.webp&quot; alt=&quot;Install Joomla Using Docker Compose - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Joomla management panel, go to &lt;code&gt;https://joomla.heyvaldemar.net/administrator&lt;/code&gt; from your workstation, where &lt;code&gt;joomla.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik service, which will redirect the request to Joomla.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Enter the username and password previously set in the &lt;code&gt;.env&lt;/code&gt; file, and click the &quot;Log in&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-joomla-using-docker-compose-6.webp&quot; alt=&quot;Install Joomla Using Docker Compose - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Joomla control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-joomla-using-docker-compose-7.webp&quot; alt=&quot;Install Joomla Using Docker Compose - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Traefik control panel, go to &lt;code&gt;https://traefik.joomla.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;traefik.joomla.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Enter the username and password previously set in the &lt;code&gt;.env&lt;/code&gt; file, and click the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-joomla-using-docker-compose-8.webp&quot; alt=&quot;Install Joomla Using Docker Compose - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Traefik control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-joomla-using-docker-compose-9.webp&quot; alt=&quot;Install Joomla Using Docker Compose - Step 9&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Self-Hosting</category><category>Joomla</category><category>Docker</category><category>CMS</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install GLPI Using Docker Compose</title><link>https://heyvaldemar.com/install-glpi-using-docker-compose/</link><guid isPermaLink="true">https://heyvaldemar.com/install-glpi-using-docker-compose/</guid><description>Learn how to install GLPI using Docker Compose with Traefik and Let&apos;s Encrypt. Set up your open-source IT asset management and service desk system step-by-step.</description><pubDate>Fri, 01 Dec 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing GLPI using Docker Compose.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://glpi-project.org/&quot;&gt;GLPI&lt;/a&gt; is an open source IT Asset Management, issue tracking system and service desk system. This software is written in PHP and distributed as open-source software under the GNU General Public License. GLPI is a web-based application helping companies to manage their information system.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted GLPI when you need an open-source IT asset management and helpdesk platform without per-agent licensing fees. ServiceNow or Snipe-IT Cloud provide managed alternatives with deeper ITSM workflows. Self-hosting GLPI is justified when your asset inventory requires on-premises data control or when SaaS per-agent costs exceed the operational overhead of maintaining the platform.
:::&lt;/p&gt;
&lt;p&gt;💾 &lt;strong&gt;You can find the repository used in this guide on &lt;a href=&quot;https://github.com/heyvaldemar/glpi-traefik-letsencrypt-docker-compose&quot;&gt;GitHub&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;heyvaldemar/glpi-traefik-letsencrypt-docker-compose&quot;}&lt;/p&gt;
&lt;p&gt;:::note
We&apos;ll use &lt;a href=&quot;https://traefik.io/traefik/&quot;&gt;Traefik&lt;/a&gt; as our reverse proxy. It&apos;ll handle obtaining cryptographic certificates from &lt;a href=&quot;https://letsencrypt.org/&quot;&gt;Let&apos;s Encrypt&lt;/a&gt; for your domain names and route requests to the corresponding services based on those domains.
:::&lt;/p&gt;
&lt;p&gt;:::caution
Remember that without a secure connection, the services will not work.
:::&lt;/p&gt;
&lt;p&gt;:::caution
To obtain cryptographic certificates, you will need A-type records in the external DNS zone, which point to the IP address of your server where Traefik is installed. If you have created these records recently, you should wait before starting the installation of the services. Full replication of these records between DNS servers can take from a few minutes to 48 hours or even longer in rare cases.
:::&lt;/p&gt;
&lt;p&gt;:::important
Docker Engine and Docker Compose must be installed on the server.&lt;/p&gt;
&lt;p&gt;For a step-by-step guide on installing Docker Engine on Ubuntu Server, see &lt;a href=&quot;/install-docker-engine-and-docker-compose-on-ubuntu-server/&quot;&gt;Install Docker Engine and Docker Compose on Ubuntu Server&lt;/a&gt;
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on the server you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to obtain a free cryptographic certificate through the Let&apos;s Encrypt certification center.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the GLPI web interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which GLPI is planned to be installed.&lt;/p&gt;
&lt;p&gt;Now it is necessary to create networks for your services.&lt;/p&gt;
&lt;p&gt;We create a network for Traefik using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create traefik-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-glpi-using-docker-compose-1.webp&quot; alt=&quot;Install GLPI Using Docker Compose - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;We create a network for GLPI using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create glpi-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-glpi-using-docker-compose-2.webp&quot; alt=&quot;Install GLPI Using Docker Compose - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to clone the repository that contains the configuration files, which include all the necessary conditions for GLPI to work.&lt;/p&gt;
&lt;p&gt;You can clone the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/heyvaldemar/glpi-traefik-letsencrypt-docker-compose.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-glpi-using-docker-compose-3.webp&quot; alt=&quot;Install GLPI Using Docker Compose - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Navigate to the directory with the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd glpi-traefik-letsencrypt-docker-compose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-glpi-using-docker-compose-4.webp&quot; alt=&quot;Install GLPI Using Docker Compose - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to change the variables in the &lt;code&gt;.env&lt;/code&gt; file according to your requirements.&lt;/p&gt;
&lt;p&gt;:::important
The &lt;code&gt;.env&lt;/code&gt; file should be in the same directory as &lt;code&gt;glpi-traefik-letsencrypt-docker-compose.yml&lt;/code&gt;.
:::&lt;/p&gt;
&lt;p&gt;Now let&apos;s start GLPI with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose -f glpi-traefik-letsencrypt-docker-compose.yml -p glpi up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-glpi-using-docker-compose-5.webp&quot; alt=&quot;Install GLPI Using Docker Compose - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the GLPI management panel, go to &lt;code&gt;https://glpi.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;glpi.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik service, which will redirect the request to GLPI.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Select the language and press the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-glpi-using-docker-compose-6.webp&quot; alt=&quot;Install GLPI Using Docker Compose - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Read the license agreement and press the &quot;Continue&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-glpi-using-docker-compose-7.webp&quot; alt=&quot;Install GLPI Using Docker Compose - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, press the &quot;Install&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-glpi-using-docker-compose-8.webp&quot; alt=&quot;Install GLPI Using Docker Compose - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Press the &quot;Continue&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-glpi-using-docker-compose-9.webp&quot; alt=&quot;Install GLPI Using Docker Compose - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now, it is necessary to specify the server address with the database, as well as the user and password for accessing the database.&lt;/p&gt;
&lt;p&gt;Enter the username and password previously set in the &lt;code&gt;.env&lt;/code&gt; file, and click the &quot;Continue&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-glpi-using-docker-compose-10.webp&quot; alt=&quot;Install GLPI Using Docker Compose - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the database previously set in the &lt;code&gt;.env&lt;/code&gt; file, and click the &quot;Continue&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-glpi-using-docker-compose-11.webp&quot; alt=&quot;Install GLPI Using Docker Compose - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;Database initialization is complete.&lt;/p&gt;
&lt;p&gt;Press the &quot;Continue&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-glpi-using-docker-compose-12.webp&quot; alt=&quot;Install GLPI Using Docker Compose - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;Press the &quot;Continue&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-glpi-using-docker-compose-13.webp&quot; alt=&quot;Install GLPI Using Docker Compose - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;Press the &quot;Continue&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-glpi-using-docker-compose-14.webp&quot; alt=&quot;Install GLPI Using Docker Compose - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;At this step, the usernames and passwords for accessing the GLPI control panel are specified.&lt;/p&gt;
&lt;p&gt;Press the &quot;Use GLPI&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-glpi-using-docker-compose-15.webp&quot; alt=&quot;Install GLPI Using Docker Compose - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the username and password for the GLPI administrator account and press the &quot;Sign in&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-glpi-using-docker-compose-16.webp&quot; alt=&quot;Install GLPI Using Docker Compose - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the GLPI control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-glpi-using-docker-compose-17.webp&quot; alt=&quot;Install GLPI Using Docker Compose - Step 17&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Traefik control panel, go to &lt;code&gt;https://traefik.glpi.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;traefik.glpi.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Enter the username and password previously set in the &lt;code&gt;.env&lt;/code&gt; file, and click the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-glpi-using-docker-compose-18.webp&quot; alt=&quot;Install GLPI Using Docker Compose - Step 18&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Traefik control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-glpi-using-docker-compose-19.webp&quot; alt=&quot;Install GLPI Using Docker Compose - Step 19&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Self-Hosting</category><category>GLPI</category><category>Docker</category><category>ITIL</category><category>Asset Management</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Home Assistant Using Docker Compose</title><link>https://heyvaldemar.com/install-home-assistant-using-docker-compose/</link><guid isPermaLink="true">https://heyvaldemar.com/install-home-assistant-using-docker-compose/</guid><description>Step-by-step guide to install Home Assistant with Docker Compose and Traefik. Secure your smart home with HTTPS using Let&apos;s Encrypt.</description><pubDate>Thu, 09 Nov 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Home Assistant using Docker Compose.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.home-assistant.io/&quot;&gt;Home Assistant&lt;/a&gt; is an open-source home automation platform that prioritizes local control and privacy. It is powered by a worldwide community of tinkerers and DIY enthusiasts, making it ideal for running on a Raspberry Pi or a local server.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted Home Assistant when you need local-first home automation with no cloud dependency, full device compatibility, and custom automation logic. SmartThings or Apple Home offer managed alternatives with simpler setup but limited device support and vendor lock-in. Self-hosting is the right architecture when privacy, offline reliability, and protocol diversity are requirements.
:::&lt;/p&gt;
&lt;p&gt;💾 &lt;strong&gt;You can find the repository used in this guide on &lt;a href=&quot;https://github.com/heyvaldemar/homeassistant-traefik-letsencrypt-docker-compose&quot;&gt;GitHub&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;heyvaldemar/homeassistant-traefik-letsencrypt-docker-compose&quot;}&lt;/p&gt;
&lt;p&gt;:::note
We&apos;ll use &lt;a href=&quot;https://traefik.io/traefik/&quot;&gt;Traefik&lt;/a&gt; as our reverse proxy. It&apos;ll handle obtaining cryptographic certificates from &lt;a href=&quot;https://letsencrypt.org/&quot;&gt;Let&apos;s Encrypt&lt;/a&gt; for your domain names and route requests to the corresponding services based on those domains.
:::&lt;/p&gt;
&lt;p&gt;:::caution
Remember that without a secure connection, the services will not work.
:::&lt;/p&gt;
&lt;p&gt;:::caution
To obtain cryptographic certificates, you will need A-type records in the external DNS zone, which point to the IP address of your server where Traefik is installed. If you have created these records recently, you should wait before starting the installation of the services. Full replication of these records between DNS servers can take from a few minutes to 48 hours or even longer in rare cases.
:::&lt;/p&gt;
&lt;p&gt;:::important
Docker Engine and Docker Compose must be installed on the server.&lt;/p&gt;
&lt;p&gt;For a step-by-step guide on installing Docker Engine on Ubuntu Server, see &lt;a href=&quot;/install-docker-engine-and-docker-compose-on-ubuntu-server/&quot;&gt;Install Docker Engine and Docker Compose on Ubuntu Server&lt;/a&gt;
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on the server you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to obtain a free cryptographic certificate through the Let&apos;s Encrypt certification center.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the Home Assistant web interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which Home Assistant is planned to be installed.&lt;/p&gt;
&lt;p&gt;Now it is necessary to create networks for your services.&lt;/p&gt;
&lt;p&gt;We create a network for Traefik using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create traefik-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-home-assistant-using-docker-compose-1.webp&quot; alt=&quot;Install Home Assistant Using Docker Compose - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;We create a network for Home Assistant using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create homeassistant-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-home-assistant-using-docker-compose-2.webp&quot; alt=&quot;Install Home Assistant Using Docker Compose - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to clone the repository that contains the configuration files, which include all the necessary conditions for Home Assistant to work.&lt;/p&gt;
&lt;p&gt;You can clone the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/heyvaldemar/homeassistant-traefik-letsencrypt-docker-compose.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-home-assistant-using-docker-compose-3.webp&quot; alt=&quot;Install Home Assistant Using Docker Compose - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Navigate to the directory with the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd homeassistant-traefik-letsencrypt-docker-compose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-home-assistant-using-docker-compose-4.webp&quot; alt=&quot;Install Home Assistant Using Docker Compose - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to change the variables in the &lt;code&gt;.env&lt;/code&gt; file according to your requirements.&lt;/p&gt;
&lt;p&gt;:::note
The &lt;code&gt;.env&lt;/code&gt; and &lt;code&gt;configuration.yaml&lt;/code&gt; files should be in the same directory as &lt;code&gt;homeassistant-traefik-letsencrypt-docker-compose.yml&lt;/code&gt;.
:::&lt;/p&gt;
&lt;p&gt;Now let&apos;s start Home Assistant with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose -f homeassistant-traefik-letsencrypt-docker-compose.yml -p homeassistant up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-home-assistant-using-docker-compose-5.webp&quot; alt=&quot;Install Home Assistant Using Docker Compose - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Home Assistant management panel, go to &lt;code&gt;https://homeassistant.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;homeassistant.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik service, which will redirect the request to Home Assistant.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Next, you need to register to start using the Home Assistant.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-home-assistant-using-docker-compose-6.webp&quot; alt=&quot;Install Home Assistant Using Docker Compose - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Traefik control panel, go to &lt;code&gt;https://traefik.homeassistant.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;traefik.homeassistant.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Enter the username and password previously set in the &lt;code&gt;.env&lt;/code&gt; file, and click the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-home-assistant-using-docker-compose-7.webp&quot; alt=&quot;Install Home Assistant Using Docker Compose - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Traefik control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-home-assistant-using-docker-compose-8.webp&quot; alt=&quot;Install Home Assistant Using Docker Compose - Step 8&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Self-Hosting</category><category>Home Assistant</category><category>Docker</category><category>Smart Home</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Vaultwarden Using Docker Compose</title><link>https://heyvaldemar.com/install-vaultwarden-using-docker-compose/</link><guid isPermaLink="true">https://heyvaldemar.com/install-vaultwarden-using-docker-compose/</guid><description>Securely self-host Vaultwarden with Docker Compose on Ubuntu using Traefik and Let&apos;s Encrypt. Step-by-step setup guide with HTTPS and domain config.</description><pubDate>Tue, 31 Oct 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Vaultwarden using Docker Compose.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dani-garcia/vaultwarden&quot;&gt;Vaultwarden&lt;/a&gt; is an unofficial Bitwarden server implementation written in Rust. Vaultwarden is compatible with the official Bitwarden clients, and is ideal for self-hosted deployments where running the official resource-heavy service is undesirablemobile app.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted Vaultwarden when you need a Bitwarden-compatible password manager with full vault data ownership and no per-user licensing. Bitwarden Cloud or 1Password provide managed alternatives with enterprise SSO and polished mobile apps. Self-hosting is justified when security policy requires credentials to remain on-premises or when team size makes per-seat SaaS pricing a significant cost.
:::&lt;/p&gt;
&lt;p&gt;💾 &lt;strong&gt;You can find the repository used in this guide on &lt;a href=&quot;https://github.com/heyvaldemar/vaultwarden-traefik-letsencrypt-docker-compose&quot;&gt;GitHub&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;heyvaldemar/vaultwarden-traefik-letsencrypt-docker-compose&quot;}&lt;/p&gt;
&lt;p&gt;:::note
We&apos;ll use &lt;a href=&quot;https://traefik.io/traefik/&quot;&gt;Traefik&lt;/a&gt; as our reverse proxy. It&apos;ll handle obtaining cryptographic certificates from &lt;a href=&quot;https://letsencrypt.org/&quot;&gt;Let&apos;s Encrypt&lt;/a&gt; for your domain names and route requests to the corresponding services based on those domains.
:::&lt;/p&gt;
&lt;p&gt;:::caution
Remember that without a secure connection, the services will not work.
:::&lt;/p&gt;
&lt;p&gt;:::caution
To obtain cryptographic certificates, you will need A-type records in the external DNS zone, which point to the IP address of your server where Traefik is installed. If you have created these records recently, you should wait before starting the installation of the services. Full replication of these records between DNS servers can take from a few minutes to 48 hours or even longer in rare cases.
:::&lt;/p&gt;
&lt;p&gt;:::important
Docker Engine and Docker Compose must be installed on the server.&lt;/p&gt;
&lt;p&gt;For a step-by-step guide on installing Docker Engine on Ubuntu Server, see &lt;a href=&quot;/install-docker-engine-and-docker-compose-on-ubuntu-server/&quot;&gt;Install Docker Engine and Docker Compose on Ubuntu Server&lt;/a&gt;
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on the server you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to obtain a free cryptographic certificate through the Let&apos;s Encrypt certification center.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the Vaultwarden web interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which Vaultwarden is planned to be installed.&lt;/p&gt;
&lt;p&gt;Now it is necessary to create networks for your services.&lt;/p&gt;
&lt;p&gt;We create a network for Traefik using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create traefik-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-vaultwarden-using-docker-compose-1.webp&quot; alt=&quot;Install Vaultwarden Using Docker Compose - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;We create a network for Vaultwarden using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create vaultwarden-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-vaultwarden-using-docker-compose-2.webp&quot; alt=&quot;Install Vaultwarden Using Docker Compose - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to clone the repository that contains the configuration files, which include all the necessary conditions for Vaultwarden to work.&lt;/p&gt;
&lt;p&gt;You can clone the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/heyvaldemar/vaultwarden-traefik-letsencrypt-docker-compose.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-vaultwarden-using-docker-compose-3.webp&quot; alt=&quot;Install Vaultwarden Using Docker Compose - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Navigate to the directory with the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd vaultwarden-traefik-letsencrypt-docker-compose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-vaultwarden-using-docker-compose-4.webp&quot; alt=&quot;Install Vaultwarden Using Docker Compose - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to change the variables in the &lt;code&gt;.env&lt;/code&gt; file according to your requirements.&lt;/p&gt;
&lt;p&gt;:::important
The &lt;code&gt;.env&lt;/code&gt; file should be in the same directory as &lt;code&gt;vaultwarden-traefik-letsencrypt-docker-compose.yml&lt;/code&gt;.
:::&lt;/p&gt;
&lt;p&gt;Now let&apos;s start Vaultwarden with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose -f vaultwarden-traefik-letsencrypt-docker-compose.yml -p vaultwarden up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-vaultwarden-using-docker-compose-5.webp&quot; alt=&quot;Install Vaultwarden Using Docker Compose - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Vaultwarden management panel, go to &lt;code&gt;https://vaultwarden.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;vaultwarden.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik service, which will redirect the request to Vaultwarden.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Next, you need to register to start using the Vaultwarden.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-vaultwarden-using-docker-compose-6.webp&quot; alt=&quot;Install Vaultwarden Using Docker Compose - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Traefik control panel, go to &lt;code&gt;https://traefik.vaultwarden.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;traefik.vaultwarden.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Enter the username and password previously set in the &lt;code&gt;.env&lt;/code&gt; file, and click the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-vaultwarden-using-docker-compose-7.webp&quot; alt=&quot;Install Vaultwarden Using Docker Compose - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Traefik control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-vaultwarden-using-docker-compose-8.webp&quot; alt=&quot;Install Vaultwarden Using Docker Compose - Step 8&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Self-Hosting</category><category>Bitwarden</category><category>Docker</category><category>Security</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install OTRS Using Docker Compose</title><link>https://heyvaldemar.com/install-otrs-using-docker-compose/</link><guid isPermaLink="true">https://heyvaldemar.com/install-otrs-using-docker-compose/</guid><description>Learn how to deploy OTRS Helpdesk with Docker Compose, secured by Traefik and Let&apos;s Encrypt. Step-by-step guide for Ubuntu-based self-hosted ticketing.</description><pubDate>Fri, 27 Oct 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing OTRS using Docker Compose.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://otrs.com/&quot;&gt;OTRS&lt;/a&gt; is a full service management suite encompassing an agent portal, an administrative dashboard, and a customer interface. Within the agent portal, teams handle and manage customer tickets and inquiries. This portal offers diverse methods to display customer-related data and other pertinent information.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted OTRS Community Edition when you need a customizable helpdesk and ticketing system without per-agent licensing fees. Zendesk or Freshdesk provide managed alternatives with modern UX and built-in analytics. Self-hosting is justified when you need full control over ticket data, custom workflow automation, or operate in an environment where SaaS egress is restricted.
:::&lt;/p&gt;
&lt;p&gt;💾 &lt;strong&gt;You can find the repository used in this guide on &lt;a href=&quot;https://github.com/heyvaldemar/otrs-traefik-letsencrypt-docker-compose&quot;&gt;GitHub&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;heyvaldemar/otrs-traefik-letsencrypt-docker-compose&quot;}&lt;/p&gt;
&lt;p&gt;:::note
We&apos;ll use &lt;a href=&quot;https://traefik.io/traefik/&quot;&gt;Traefik&lt;/a&gt; as our reverse proxy. It&apos;ll handle obtaining cryptographic certificates from &lt;a href=&quot;https://letsencrypt.org/&quot;&gt;Let&apos;s Encrypt&lt;/a&gt; for your domain names and route requests to the corresponding services based on those domains.
:::&lt;/p&gt;
&lt;p&gt;:::caution
To obtain cryptographic certificates, you will need A-type records in the external DNS zone, which point to the IP address of your server where Traefik is installed. If you have created these records recently, you should wait before starting the installation of the services. Full replication of these records between DNS servers can take from a few minutes to 48 hours or even longer in rare cases.
:::&lt;/p&gt;
&lt;p&gt;:::important
Docker Engine and Docker Compose must be installed on the server.&lt;/p&gt;
&lt;p&gt;For a step-by-step guide on installing Docker Engine on Ubuntu Server, see &lt;a href=&quot;/install-docker-engine-and-docker-compose-on-ubuntu-server/&quot;&gt;Install Docker Engine and Docker Compose on Ubuntu Server&lt;/a&gt;
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on the server you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to obtain a free cryptographic certificate through the Let&apos;s Encrypt certification center.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the OTRS web interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which OTRS is planned to be installed.&lt;/p&gt;
&lt;p&gt;Now it is necessary to create networks for your services.&lt;/p&gt;
&lt;p&gt;We create a network for Traefik using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create traefik-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-using-docker-compose-1.webp&quot; alt=&quot;Install OTRS Using Docker Compose - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;We create a network for OTRS using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create otrs-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-using-docker-compose-2.webp&quot; alt=&quot;Install OTRS Using Docker Compose - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to clone the repository that contains the configuration files, which include all the necessary conditions for OTRS to work.&lt;/p&gt;
&lt;p&gt;You can clone the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/heyvaldemar/otrs-traefik-letsencrypt-docker-compose.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-using-docker-compose-3.webp&quot; alt=&quot;Install OTRS Using Docker Compose - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Navigate to the directory with the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd otrs-traefik-letsencrypt-docker-compose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-using-docker-compose-4.webp&quot; alt=&quot;Install OTRS Using Docker Compose - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to change the variables in the &lt;code&gt;.env&lt;/code&gt; file according to your requirements.&lt;/p&gt;
&lt;p&gt;:::important
The &lt;code&gt;.env&lt;/code&gt; file should be in the same directory as &lt;code&gt;otrs-traefik-letsencrypt-docker-compose.yml&lt;/code&gt;.
:::&lt;/p&gt;
&lt;p&gt;Now let&apos;s start OTRS with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose -f otrs-traefik-letsencrypt-docker-compose.yml -p otrs up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-using-docker-compose-5.webp&quot; alt=&quot;Install OTRS Using Docker Compose - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the OTRS management panel, go to &lt;code&gt;https://otrs.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;otrs.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik service, which will redirect the request to OTRS.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Use the following default credentials for the OTRS administrator account:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Username:&lt;/strong&gt; root@localhost&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Password:&lt;/strong&gt; Enter the password that you previously set in the &lt;code&gt;.env&lt;/code&gt; file&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Click the &quot;Login&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-using-docker-compose-6.webp&quot; alt=&quot;Install OTRS Using Docker Compose - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the OTRS control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-using-docker-compose-7.webp&quot; alt=&quot;Install OTRS Using Docker Compose - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the OTRS client control panel from a workstation, go to &lt;code&gt;https://otrs.heyvaldemar.net/otrs/customer.pl&lt;/code&gt;, where &lt;code&gt;otrs.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with OTRS installed.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-using-docker-compose-8.webp&quot; alt=&quot;Install OTRS Using Docker Compose - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Traefik control panel, go to &lt;code&gt;https://traefik.otrs.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;traefik.otrs.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Enter the username and password previously set in the &lt;code&gt;.env&lt;/code&gt; file, and click the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-using-docker-compose-9.webp&quot; alt=&quot;Install OTRS Using Docker Compose - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Traefik control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-using-docker-compose-10.webp&quot; alt=&quot;Install OTRS Using Docker Compose - Step 10&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Self-Hosting</category><category>OTRS</category><category>Docker</category><category>Helpdesk</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Why Snyk is a Great Tool to Use with Docker</title><link>https://heyvaldemar.com/why-snyk-is-a-great-tool-to-use-with-docker/</link><guid isPermaLink="true">https://heyvaldemar.com/why-snyk-is-a-great-tool-to-use-with-docker/</guid><description>Secure your Docker containers with Snyk - deep scans, CI/CD integration, and automated fixes for fast, reliable app delivery.</description><pubDate>Fri, 27 Oct 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Docker made shipping software easier. It also made shipping &lt;strong&gt;vulnerable&lt;/strong&gt; software easier.&lt;/p&gt;
&lt;p&gt;You spin up a microservice in minutes. You ship it through CI/CD. You pat yourself on the back. And the whole time you&apos;ve been bundling 300 CVEs and a 2-year-old OpenSSL into your base image, with no idea.&lt;/p&gt;
&lt;p&gt;That&apos;s DevOps when speed beats sanity.&lt;/p&gt;
&lt;p&gt;So I use &lt;strong&gt;Snyk&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Most security tools show up after the breach. Snyk helps you prevent it. Early, automatically, and without making your dev team hate you for it.&lt;/p&gt;
&lt;p&gt;Here&apos;s why Snyk plus Docker is a pairing I actually trust in production.&lt;/p&gt;
&lt;h2&gt;Docker is amazing, but it is not innocent&lt;/h2&gt;
&lt;p&gt;Docker lets us move fast. Containerize once, run anywhere. The catch: a container is only as secure as the layers under it. And those layers are usually some stale distro image, fat with packages nobody needs and vulnerabilities inherited straight from upstream.&lt;/p&gt;
&lt;p&gt;I&apos;ve opened &lt;code&gt;node:latest&lt;/code&gt; images carrying hundreds of vulns. The devs had no clue.&lt;/p&gt;
&lt;p&gt;Not their fault. It&apos;s on us. The pipeline architects, the DevOps leads, the security people who forgot that prevention has to land &lt;em&gt;before&lt;/em&gt; deployment, not after the incident review.&lt;/p&gt;
&lt;p&gt;That&apos;s the gap &lt;strong&gt;Snyk&lt;/strong&gt; fills. Not a gatekeeper. A teammate.&lt;/p&gt;
&lt;h2&gt;Deep image scanning that actually works&lt;/h2&gt;
&lt;p&gt;Most tools barely scratch the surface. They scan your app, maybe glance at &lt;code&gt;package.json&lt;/code&gt;, and call it done.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Snyk goes deeper.&lt;/strong&gt; It scans the whole Docker image, from the base OS up through every dependency baked into the container.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;snyk container test my-app:latest
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;One command. It surfaces vulns in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Your application code&lt;/li&gt;
&lt;li&gt;System packages (like &lt;code&gt;libssl&lt;/code&gt;, &lt;code&gt;curl&lt;/code&gt;, etc.)&lt;/li&gt;
&lt;li&gt;Language-specific dependencies (npm, pip, Maven, etc.)&lt;/li&gt;
&lt;li&gt;Base image layers (&lt;code&gt;debian&lt;/code&gt;, &lt;code&gt;alpine&lt;/code&gt;, &lt;code&gt;ubuntu&lt;/code&gt;, etc.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;It doesn&apos;t stop at the code you wrote. It finds the problems in the code you &lt;em&gt;inherited&lt;/em&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;CI/CD integration developers will tolerate&lt;/h2&gt;
&lt;p&gt;Say you build images in GitHub Actions:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;- name: Snyk Scan
  uses: snyk/actions/docker@master
  with:
    image: my-app:latest
  env:
    SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That&apos;s it. Now every PR runs a container scan. No manual steps. No nasty surprises in production.&lt;/p&gt;
&lt;p&gt;I&apos;ve dropped this into GitLab, Jenkins, and plain &lt;code&gt;bash&lt;/code&gt; pipelines. It just works. And when it catches something, it tells you what it is, why it matters, and how to fix it.&lt;/p&gt;
&lt;p&gt;Not &quot;security theater.&quot; Real remediation.&lt;/p&gt;
&lt;h2&gt;Prioritized, context-aware alerts&lt;/h2&gt;
&lt;p&gt;Not all CVEs are equal. Some are academic. Some will burn your whole infra down.&lt;/p&gt;
&lt;p&gt;Snyk knows which is which. It ranks vulns by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Exploitability&lt;/li&gt;
&lt;li&gt;Whether that code path is even used&lt;/li&gt;
&lt;li&gt;Whether a fixed version exists&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So you don&apos;t drown in red flags. You get told what to fix first and how dangerous it is to sit on it.&lt;/p&gt;
&lt;p&gt;This isn&apos;t a scanner that dumps guilt on you. It helps you triage like someone who&apos;s done this before.&lt;/p&gt;
&lt;h2&gt;Auto-fix, and yes I mean it&lt;/h2&gt;
&lt;p&gt;The first time I ran Snyk, this is what got me: it didn&apos;t just point at what was broken.&lt;/p&gt;
&lt;p&gt;It said:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;You&apos;re using node:16.6.0 which has 49 known vulnerabilities.
Switch to node:16.20.0 to fix 42 of them.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It gets better. If you keep dependency files in code (&lt;code&gt;requirements.txt&lt;/code&gt;, &lt;code&gt;package.json&lt;/code&gt;), Snyk can open PRs with upgraded packages and patch diffs ready to merge.&lt;/p&gt;
&lt;p&gt;Let the tool do the grunt work. Your team gets to ship instead.&lt;/p&gt;
&lt;h2&gt;Continuous monitoring, not a one-time snapshot&lt;/h2&gt;
&lt;p&gt;Most &quot;security tools&quot; scan once and ghost you.&lt;/p&gt;
&lt;p&gt;Snyk keeps watching. A new CVE drops tomorrow that hits an image you shipped last week? You hear about it. No rescan needed.&lt;/p&gt;
&lt;p&gt;It&apos;ll fire alerts into Slack, Jira, email, or whatever other tool you already resent. Up to you.&lt;/p&gt;
&lt;h2&gt;It works where you work&lt;/h2&gt;
&lt;p&gt;Snyk supports:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Docker CLI&lt;/li&gt;
&lt;li&gt;Docker Desktop&lt;/li&gt;
&lt;li&gt;Kubernetes clusters&lt;/li&gt;
&lt;li&gt;GitHub/GitLab/Azure DevOps integrations&lt;/li&gt;
&lt;li&gt;Terraform scanning&lt;/li&gt;
&lt;li&gt;IaC scanning (YAML configs, Helm charts, etc.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If it lives in your delivery pipeline, odds are Snyk plugs into it.&lt;/p&gt;
&lt;h2&gt;Real-world case: fixing a vulnerable base image&lt;/h2&gt;
&lt;p&gt;We shipped a service on &lt;code&gt;python:3.8-slim&lt;/code&gt; once. Looked fine. Then Snyk flagged &lt;code&gt;glibc&lt;/code&gt; and &lt;code&gt;openssl&lt;/code&gt; issues, with exploits already out in the wild.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;Issues found in /usr/lib/x86_64-linux-gnu/libssl.so.1.1
- CVE-2022-0778: Infinite loop in certificate parsing
- CVE-2021-3711: Buffer overflow in SM2 decryption
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We switched to &lt;code&gt;python:3.8-slim-buster&lt;/code&gt;, rebuilt, and dropped the criticals from 14 to 2. The fix shipped inside an hour. No drama. No emergency patch cycle.&lt;/p&gt;
&lt;p&gt;Without Snyk, that vuln sits buried for months.&lt;/p&gt;
&lt;h2&gt;Final thoughts: use tools that catch what you miss&lt;/h2&gt;
&lt;p&gt;No tool is magic. But Snyk is &lt;strong&gt;one of the few&lt;/strong&gt; that genuinely helps dev teams ship secure containers &lt;strong&gt;without slowing them down&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;It scans deep. It integrates clean. It fixes on its own. And it keeps watching after deploy. Not a silver bullet, but a damn good shield.&lt;/p&gt;
&lt;p&gt;If you take DevSecOps seriously, or you just want fewer PagerDuty alerts at 3AM, put Snyk in your Docker workflow.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Docker is great. But it&apos;s easy to ship insecure containers.&lt;/li&gt;
&lt;li&gt;Snyk scans &lt;strong&gt;entire images&lt;/strong&gt;, not just your app code.&lt;/li&gt;
&lt;li&gt;Built for &lt;strong&gt;developers&lt;/strong&gt;, not just auditors.&lt;/li&gt;
&lt;li&gt;Integrates cleanly with &lt;strong&gt;CI/CD, Docker CLI, Desktop, and Kubernetes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Offers &lt;strong&gt;fix advice&lt;/strong&gt;, &lt;strong&gt;auto-patches&lt;/strong&gt;, and &lt;strong&gt;risk-ranked alerts&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Keeps watching your deployed containers for &lt;strong&gt;emerging CVEs&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Next step&lt;/h2&gt;
&lt;p&gt;Want to try it?&lt;/p&gt;
&lt;p&gt;Install the CLI and test your current image:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;npm install -g snyk
snyk container test your-image:latest
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or sign up and wire it into your pipeline: &lt;a href=&quot;https://snyk.io&quot;&gt;https://snyk.io&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Your future self, the one not cleaning up a zero-day on a Friday night, will thank you.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>Snyk</category><category>Docker</category><category>Security</category><category>DevSecOps</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Portainer Using Docker Compose</title><link>https://heyvaldemar.com/install-portainer-using-docker-compose/</link><guid isPermaLink="true">https://heyvaldemar.com/install-portainer-using-docker-compose/</guid><description>Learn how to install and configure Portainer using Docker Compose with Traefik and Let&apos;s Encrypt on Ubuntu Server. Step-by-step container management setup.</description><pubDate>Tue, 17 Oct 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Portainer using Docker Compose.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.portainer.io/&quot;&gt;Portainer&lt;/a&gt; is an open-source platform offering a visual interface for managing containerized applications. It is a complete container management solution for Docker, Docker Swarm, Kubernetes, and Azure Container Instances (ACI).&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted Portainer when you need a GUI for managing Docker and Kubernetes environments across multiple nodes. Docker Hub&apos;s management features or Rancher provide alternatives at different scales. Portainer is justified when your team needs container visibility without CLI expertise, or when you manage hybrid environments spanning on-premises and cloud infrastructure.
:::&lt;/p&gt;
&lt;p&gt;💾 &lt;strong&gt;You can find the repository used in this guide on &lt;a href=&quot;https://github.com/heyvaldemar/portainer-traefik-letsencrypt-docker-compose&quot;&gt;GitHub&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;heyvaldemar/portainer-traefik-letsencrypt-docker-compose&quot;}&lt;/p&gt;
&lt;p&gt;:::note
We&apos;ll use &lt;a href=&quot;https://traefik.io/traefik/&quot;&gt;Traefik&lt;/a&gt; as our reverse proxy. It&apos;ll handle obtaining cryptographic certificates from &lt;a href=&quot;https://letsencrypt.org/&quot;&gt;Let&apos;s Encrypt&lt;/a&gt; for your domain names and route requests to the corresponding services based on those domains.
:::&lt;/p&gt;
&lt;p&gt;:::caution
To obtain cryptographic certificates, you will need A-type records in the external DNS zone, which point to the IP address of your server where Traefik is installed. If you have created these records recently, you should wait before starting the installation of the services. Full replication of these records between DNS servers can take from a few minutes to 48 hours or even longer in rare cases.
:::&lt;/p&gt;
&lt;p&gt;:::important
Docker Engine and Docker Compose must be installed on the server.&lt;/p&gt;
&lt;p&gt;For a step-by-step guide on installing Docker Engine on Ubuntu Server, see &lt;a href=&quot;/install-docker-engine-and-docker-compose-on-ubuntu-server/&quot;&gt;Install Docker Engine and Docker Compose on Ubuntu Server&lt;/a&gt;
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on the server you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to obtain a free cryptographic certificate through the Let&apos;s Encrypt certification center.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the Portainer web interface.&lt;/li&gt;
&lt;li&gt;TCP port 8000 - to communicate with Portainer from outside networks. This is especially beneficial when allowing a local Portainer setup to connect with its cloud-based equivalent.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which Portainer is planned to be installed.&lt;/p&gt;
&lt;p&gt;Now it is necessary to create networks for your services.&lt;/p&gt;
&lt;p&gt;We create a network for Traefik using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create traefik-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-portainer-using-docker-compose-1.webp&quot; alt=&quot;Install Portainer Using Docker Compose - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;We create a network for Portainer using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create portainer-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-portainer-using-docker-compose-2.webp&quot; alt=&quot;Install Portainer Using Docker Compose - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to clone the repository that contains the configuration files, which include all the necessary conditions for Portainer to work.&lt;/p&gt;
&lt;p&gt;You can clone the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/heyvaldemar/portainer-traefik-letsencrypt-docker-compose.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-portainer-using-docker-compose-3.webp&quot; alt=&quot;Install Portainer Using Docker Compose - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Navigate to the directory with the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd portainer-traefik-letsencrypt-docker-compose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-portainer-using-docker-compose-4.webp&quot; alt=&quot;Install Portainer Using Docker Compose - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to change the variables in the &lt;code&gt;.env&lt;/code&gt; file according to your requirements.&lt;/p&gt;
&lt;p&gt;:::important
The &lt;code&gt;.env&lt;/code&gt; file should be in the same directory as &lt;code&gt;portainer-traefik-letsencrypt-docker-compose.yml&lt;/code&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
The &lt;code&gt;PORTAINER_EDGE_HOSTNAME&lt;/code&gt; is used to communicate with Portainer from outside networks. This is especially beneficial when allowing a local Portainer setup to connect with its cloud-based equivalent.
:::&lt;/p&gt;
&lt;p&gt;Now let&apos;s start Portainer with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose -f portainer-traefik-letsencrypt-docker-compose.yml -p portainer up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-portainer-using-docker-compose-5.webp&quot; alt=&quot;Install Portainer Using Docker Compose - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Portainer management panel, go to &lt;code&gt;https://portainer.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;portainer.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik service, which will redirect the request to Portainer.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;For the next step, please enter your username and password to set up a Portainer administrator account.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Create user&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-portainer-using-docker-compose-6.webp&quot; alt=&quot;Install Portainer Using Docker Compose - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Portainer control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-portainer-using-docker-compose-7.webp&quot; alt=&quot;Install Portainer Using Docker Compose - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Traefik control panel, go to &lt;code&gt;https://traefik.portainer.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;traefik.portainer.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Enter the username and password previously set in the &lt;code&gt;.env&lt;/code&gt; file, and click the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-portainer-using-docker-compose-8.webp&quot; alt=&quot;Install Portainer Using Docker Compose - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Traefik control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-portainer-using-docker-compose-9.webp&quot; alt=&quot;Install Portainer Using Docker Compose - Step 9&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Self-Hosting</category><category>Portainer</category><category>Docker</category><category>GUI</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install SonarQube Using Docker Compose</title><link>https://heyvaldemar.com/install-sonarqube-using-docker-compose/</link><guid isPermaLink="true">https://heyvaldemar.com/install-sonarqube-using-docker-compose/</guid><description>Step-by-step guide to installing SonarQube using Docker Compose and Traefik on Ubuntu Server. Includes secure setup, domain config, and web dashboard access.</description><pubDate>Fri, 22 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing SonarQube using Docker Compose.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/&quot;&gt;SonarQube&lt;/a&gt; is an open-source platform developed by SonarSource. It offers continuous inspection of code quality, using static analysis to detect bugs and code smells. Currently, it supports 29 programming languages.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted SonarQube when you need on-premises code quality and security scanning with custom quality gates and full control over scan data. SonarCloud provides a managed alternative with zero infrastructure overhead and native CI/CD integration. Self-hosting is justified when compliance requires on-premises code analysis or when repository volume makes SaaS pricing impractical.
:::&lt;/p&gt;
&lt;p&gt;💾 &lt;strong&gt;You can find the repository used in this guide on &lt;a href=&quot;https://github.com/heyvaldemar/sonarqube-traefik-letsencrypt-docker-compose&quot;&gt;GitHub&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;heyvaldemar/sonarqube-traefik-letsencrypt-docker-compose&quot;}&lt;/p&gt;
&lt;p&gt;:::note
We&apos;ll use &lt;a href=&quot;https://traefik.io/traefik/&quot;&gt;Traefik&lt;/a&gt; as our reverse proxy. It&apos;ll handle obtaining cryptographic certificates from &lt;a href=&quot;https://letsencrypt.org/&quot;&gt;Let&apos;s Encrypt&lt;/a&gt; for your domain names and route requests to the corresponding services based on those domains.
:::&lt;/p&gt;
&lt;p&gt;:::caution
To obtain cryptographic certificates, you will need A-type records in the external DNS zone, which point to the IP address of your server where Traefik is installed. If you have created these records recently, you should wait before starting the installation of the services. Full replication of these records between DNS servers can take from a few minutes to 48 hours or even longer in rare cases.
:::&lt;/p&gt;
&lt;p&gt;:::important
Docker Engine and Docker Compose must be installed on the server.&lt;/p&gt;
&lt;p&gt;For a step-by-step guide on installing Docker Engine on Ubuntu Server, see &lt;a href=&quot;/install-docker-engine-and-docker-compose-on-ubuntu-server/&quot;&gt;Install Docker Engine and Docker Compose on Ubuntu Server&lt;/a&gt;
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on the server you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to obtain a free cryptographic certificate through the Let&apos;s Encrypt certification center.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the SonarQube web interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which SonarQube is planned to be installed.&lt;/p&gt;
&lt;p&gt;Now it is necessary to create networks for your services.&lt;/p&gt;
&lt;p&gt;We create a network for Traefik using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create traefik-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-sonarqube-using-docker-compose-1.webp&quot; alt=&quot;Install SonarQube Using Docker Compose - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;We create a network for SonarQube using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create sonarqube-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-sonarqube-using-docker-compose-2.webp&quot; alt=&quot;Install SonarQube Using Docker Compose - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Adjust the &lt;code&gt;vm.max_map_count&lt;/code&gt; using the commands:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo sysctl -w vm.max_map_count=262144
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-sonarqube-using-docker-compose-3.webp&quot; alt=&quot;Install SonarQube Using Docker Compose - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to clone the repository that contains the configuration files, which include all the necessary conditions for SonarQube to work.&lt;/p&gt;
&lt;p&gt;You can clone the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/heyvaldemar/sonarqube-traefik-letsencrypt-docker-compose.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-sonarqube-using-docker-compose-4.webp&quot; alt=&quot;Install SonarQube Using Docker Compose - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Navigate to the directory with the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd sonarqube-traefik-letsencrypt-docker-compose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-sonarqube-using-docker-compose-5.webp&quot; alt=&quot;Install SonarQube Using Docker Compose - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to change the variables in the &lt;code&gt;.env&lt;/code&gt; file according to your requirements.&lt;/p&gt;
&lt;p&gt;:::important
The &lt;code&gt;.env&lt;/code&gt; file should be in the same directory as &lt;code&gt;sonarqube-traefik-letsencrypt-docker-compose.yml&lt;/code&gt;.
:::&lt;/p&gt;
&lt;p&gt;Now let&apos;s start SonarQube with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose -f sonarqube-traefik-letsencrypt-docker-compose.yml -p sonarqube up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-sonarqube-using-docker-compose-6.webp&quot; alt=&quot;Install SonarQube Using Docker Compose - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the SonarQube management panel, go to &lt;code&gt;https://sonarqube.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;sonarqube.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik service, which will redirect the request to SonarQube.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Enter the username and password that you previously set in the &lt;code&gt;.env&lt;/code&gt; file, and click the &quot;Log In&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-sonarqube-using-docker-compose-7.webp&quot; alt=&quot;Install SonarQube Using Docker Compose - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the SonarQube control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-sonarqube-using-docker-compose-8.webp&quot; alt=&quot;Install SonarQube Using Docker Compose - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Traefik control panel, go to &lt;code&gt;https://traefik.sonarqube.heyvaldemar.net&lt;/code&gt; from your workstation, where traefik.&lt;code&gt;sonarqube.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Enter the username and password previously set in the &lt;code&gt;.env&lt;/code&gt; file, and click the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-sonarqube-using-docker-compose-9.webp&quot; alt=&quot;Install SonarQube Using Docker Compose - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Traefik control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-sonarqube-using-docker-compose-10.webp&quot; alt=&quot;Install SonarQube Using Docker Compose - Step 10&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Self-Hosting</category><category>SonarQube</category><category>Docker</category><category>DevSecOps</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install eksctl on macOS</title><link>https://heyvaldemar.com/install-eksctl-on-macos/</link><guid isPermaLink="true">https://heyvaldemar.com/install-eksctl-on-macos/</guid><description>Learn how to install eksctl on macOS using Homebrew. Step-by-step tutorial to set up eksctl for managing Kubernetes clusters on AWS EKS.</description><pubDate>Sun, 17 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import VideoPlayer from &quot;@components/VideoPlayer.astro&quot;;&lt;/p&gt;
&lt;p&gt;&amp;lt;VideoPlayer videoId=&quot;x-mGTJrJF60&quot; title=&quot;Install eksctl on macOS&quot; /&amp;gt;&lt;/p&gt;
&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing eksctl on macOS.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://eksctl.io/&quot;&gt;eksctl&lt;/a&gt; is a command-line utility developed in Go, designed for easy creation of clusters in Amazon&apos;s Elastic Kubernetes Service (EKS). It uses AWS CloudFormation to perform its tasks.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
eksctl provides the fastest path to a running EKS cluster for development and testing. For production environments, Terraform with the AWS EKS module offers better state management, drift detection, and multi-resource orchestration. Choose eksctl for rapid prototyping and Terraform for production-grade infrastructure that requires version control and review workflows.
:::&lt;/p&gt;
&lt;p&gt;:::important
In this guide, we will consider the case when you already have the &lt;a href=&quot;https://brew.sh/&quot;&gt;Homebrew&lt;/a&gt; package manager installed.
:::&lt;/p&gt;
&lt;p&gt;To install Homebrew, you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;/bin/bash -c &quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;We connect the repository with formulas for Homebrew using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;brew tap weaveworks/tap
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-eksctl-on-macos-1.webp&quot; alt=&quot;Install eksctl on macOS - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Run the eksctl installation with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;brew install weaveworks/tap/eksctl
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-eksctl-on-macos-2.webp&quot; alt=&quot;Install eksctl on macOS - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Confirm that the installation was successful by checking the installed version:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;eksctl version
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-eksctl-on-macos-3.webp&quot; alt=&quot;Install eksctl on macOS - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Everything is ready to use eksctl.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-eksctl-on-macos-4.webp&quot; alt=&quot;Install eksctl on macOS - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;To integrate &lt;code&gt;eksctl&lt;/code&gt; with AWS services, you&apos;ll need to have the AWS CLI configured. If you haven&apos;t done that yet, see my detailed guide: &lt;a href=&quot;/configure-aws-cli/&quot;&gt;Configure AWS CLI&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>AWS</category><category>Kubernetes</category><category>eksctl</category><category>macOS</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Bitbucket Using Docker Compose</title><link>https://heyvaldemar.com/install-bitbucket-using-docker-compose/</link><guid isPermaLink="true">https://heyvaldemar.com/install-bitbucket-using-docker-compose/</guid><description>Learn how to install Bitbucket using Docker Compose and Traefik on your server. Step-by-step guide with HTTPS setup and admin configuration for Git hosting.</description><pubDate>Fri, 15 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Bitbucket using Docker Compose.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.atlassian.com/software/bitbucket&quot;&gt;Bitbucket&lt;/a&gt; is a Git-based source code repository hosting service owned by Atlassian. Bitbucket offers both commercial plans and free accounts with an unlimited number of private repositories.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted Bitbucket Data Center when your organization requires on-premises source control for compliance, air-gapped environments, or tight LDAP/AD integration. For most teams, Bitbucket Cloud eliminates server maintenance and provides native CI/CD via Pipelines. Self-hosting is justified when regulatory frameworks mandate that source code never leaves your network perimeter.
:::&lt;/p&gt;
&lt;p&gt;💾 &lt;strong&gt;You can find the repository used in this guide on &lt;a href=&quot;https://github.com/heyvaldemar/bitbucket-traefik-letsencrypt-docker-compose&quot;&gt;GitHub&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;heyvaldemar/bitbucket-traefik-letsencrypt-docker-compose&quot;}&lt;/p&gt;
&lt;p&gt;:::note
We&apos;ll use &lt;a href=&quot;https://traefik.io/traefik/&quot;&gt;Traefik&lt;/a&gt; as our reverse proxy. It&apos;ll handle obtaining cryptographic certificates from &lt;a href=&quot;https://letsencrypt.org/&quot;&gt;Let&apos;s Encrypt&lt;/a&gt; for your domain names and route requests to the corresponding services based on those domains.
:::&lt;/p&gt;
&lt;p&gt;:::caution
To obtain cryptographic certificates, you will need A-type records in the external DNS zone, which point to the IP address of your server where Traefik is installed. If you have created these records recently, you should wait before starting the installation of the services. Full replication of these records between DNS servers can take from a few minutes to 48 hours or even longer in rare cases.
:::&lt;/p&gt;
&lt;p&gt;:::important
Docker Engine and Docker Compose must be installed on the server.&lt;/p&gt;
&lt;p&gt;For a step-by-step guide on installing Docker Engine on Ubuntu Server, see &lt;a href=&quot;/install-docker-engine-and-docker-compose-on-ubuntu-server/&quot;&gt;Install Docker Engine and Docker Compose on Ubuntu Server&lt;/a&gt;
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on the server you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to obtain a free cryptographic certificate through the Let&apos;s Encrypt certification center.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the Bitbucket web interface.&lt;/li&gt;
&lt;li&gt;TCP port 7999 - for secure SSH Git operations, user SSH key management, encrypted data transfer, and server administration tasks.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which Bitbucket is planned to be installed.&lt;/p&gt;
&lt;p&gt;Now it is necessary to create networks for your services.&lt;/p&gt;
&lt;p&gt;We create a network for Traefik using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create traefik-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-using-docker-compose-1.webp&quot; alt=&quot;Install Bitbucket Using Docker Compose - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;We create a network for Bitbucket using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create bitbucket-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-using-docker-compose-2.webp&quot; alt=&quot;Install Bitbucket Using Docker Compose - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to clone the repository that contains the configuration files, which include all the necessary conditions for Bitbucket to work.&lt;/p&gt;
&lt;p&gt;You can clone the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/heyvaldemar/bitbucket-traefik-letsencrypt-docker-compose.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-using-docker-compose-3.webp&quot; alt=&quot;Install Bitbucket Using Docker Compose - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Navigate to the directory with the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd bitbucket-traefik-letsencrypt-docker-compose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-using-docker-compose-4.webp&quot; alt=&quot;Install Bitbucket Using Docker Compose - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to change the variables in the &lt;code&gt;.env&lt;/code&gt; file according to your requirements.&lt;/p&gt;
&lt;p&gt;:::important
The &lt;code&gt;.env&lt;/code&gt; file should be in the same directory as &lt;code&gt;bitbucket-traefik-letsencrypt-docker-compose.yml&lt;/code&gt;.
:::&lt;/p&gt;
&lt;p&gt;Now let&apos;s start Bitbucket with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose -f bitbucket-traefik-letsencrypt-docker-compose.yml -p bitbucket up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-using-docker-compose-5.webp&quot; alt=&quot;Install Bitbucket Using Docker Compose - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Bitbucket management panel, go to &lt;code&gt;https://bitbucket.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;bitbucket.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik service, which will redirect the request to Bitbucket.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;You&apos;ll now need to enter a license key for Bitbucket.&lt;/p&gt;
&lt;p&gt;If you don&apos;t have one, you can obtain a temporary key to test out Bitbucket.&lt;/p&gt;
&lt;p&gt;Select &quot;I need an evaluation license&quot; and click &quot;I have an account&quot; or &quot;Create an account&quot; to proceed.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-using-docker-compose-6.webp&quot; alt=&quot;Install Bitbucket Using Docker Compose - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;If you possess an Atlassian account, input the email address linked to that account in the &quot;Enter email&quot; field, then click the &quot;Continue&quot; button.&lt;/p&gt;
&lt;p&gt;Enter the password for your Atlassian account and click the &quot;Log in&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-using-docker-compose-7.webp&quot; alt=&quot;Install Bitbucket Using Docker Compose - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;For the next step, indicate the product you need a temporary license key for and enter your organization&apos;s name.&lt;/p&gt;
&lt;p&gt;Click the &quot;Generate License&quot; button to secure a temporary license for Bitbucket.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-using-docker-compose-8.webp&quot; alt=&quot;Install Bitbucket Using Docker Compose - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you&apos;ll need to confirm the installation of the temporary Bitbucket license key on your server.&lt;/p&gt;
&lt;p&gt;Click the &quot;Yes&quot; button to proceed.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-using-docker-compose-9.webp&quot; alt=&quot;Install Bitbucket Using Docker Compose - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;License Key&quot; field, enter the temporary license key you received earlier and then click the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-using-docker-compose-10.webp&quot; alt=&quot;Install Bitbucket Using Docker Compose - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;For the next step, please enter your username, name, email address, and password to set up a Bitbucket administrator account.&lt;/p&gt;
&lt;p&gt;Click the &quot;Next&quot; button to continue.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-using-docker-compose-11.webp&quot; alt=&quot;Install Bitbucket Using Docker Compose - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;Log in with the account created on the previous step.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-using-docker-compose-12.webp&quot; alt=&quot;Install Bitbucket Using Docker Compose - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;Bitbucket is all set and ready to use.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-using-docker-compose-13.webp&quot; alt=&quot;Install Bitbucket Using Docker Compose - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Traefik control panel, go to &lt;code&gt;https://traefik.bitbucket.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;bitbucket.zabbix.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Enter the username and password previously set in the &lt;code&gt;.env&lt;/code&gt; file, and click the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-using-docker-compose-14.webp&quot; alt=&quot;Install Bitbucket Using Docker Compose - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Traefik control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-using-docker-compose-15.webp&quot; alt=&quot;Install Bitbucket Using Docker Compose - Step 15&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Self-Hosting</category><category>Bitbucket</category><category>Docker</category><category>Git</category><category>Atlassian</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Jira Using Docker Compose</title><link>https://heyvaldemar.com/install-jira-using-docker-compose/</link><guid isPermaLink="true">https://heyvaldemar.com/install-jira-using-docker-compose/</guid><description>Learn how to install Jira using Docker Compose with Traefik and Let&apos;s Encrypt. Step-by-step guide to self-host Jira securely and efficiently.</description><pubDate>Thu, 14 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Jira using Docker Compose.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.atlassian.com/software/jira&quot;&gt;Jira&lt;/a&gt; is a proprietary issue tracking product developed by Atlassian that allows bug tracking and agile project management.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted Jira Data Center when your organization requires on-premises project management for compliance, custom plugin control, or integration with air-gapped infrastructure. Jira Cloud eliminates upgrade cycles, database tuning, and scaling decisions. Self-hosting is justified when regulatory requirements prohibit cloud-hosted project data or when you need direct database access for advanced reporting.
:::&lt;/p&gt;
&lt;p&gt;💾 &lt;strong&gt;You can find the repository used in this guide on &lt;a href=&quot;https://github.com/heyvaldemar/jira-traefik-letsencrypt-docker-compose&quot;&gt;GitHub&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;heyvaldemar/jira-traefik-letsencrypt-docker-compose&quot;}&lt;/p&gt;
&lt;p&gt;:::note
We&apos;ll use &lt;a href=&quot;https://traefik.io/traefik/&quot;&gt;Traefik&lt;/a&gt; as our reverse proxy. It&apos;ll handle obtaining cryptographic certificates from &lt;a href=&quot;https://letsencrypt.org/&quot;&gt;Let&apos;s Encrypt&lt;/a&gt; for your domain names and route requests to the corresponding services based on those domains.
:::&lt;/p&gt;
&lt;p&gt;:::caution
To obtain cryptographic certificates, you will need A-type records in the external DNS zone, which point to the IP address of your server where Traefik is installed. If you have created these records recently, you should wait before starting the installation of the services. Full replication of these records between DNS servers can take from a few minutes to 48 hours or even longer in rare cases.
:::&lt;/p&gt;
&lt;p&gt;:::important
Docker Engine and Docker Compose must be installed on the server.&lt;/p&gt;
&lt;p&gt;For a step-by-step guide on installing Docker Engine on Ubuntu Server, see &lt;a href=&quot;/install-docker-engine-and-docker-compose-on-ubuntu-server/&quot;&gt;Install Docker Engine and Docker Compose on Ubuntu Server&lt;/a&gt;
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on the server you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to obtain a free cryptographic certificate through the Let&apos;s Encrypt certification center.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the Jira web interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which Jira is planned to be installed.&lt;/p&gt;
&lt;p&gt;Now it is necessary to create networks for your services.&lt;/p&gt;
&lt;p&gt;We create a network for Traefik using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create traefik-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-jira-using-docker-compose-1.webp&quot; alt=&quot;Install Jira Using Docker Compose - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;We create a network for Jira using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create jira-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-jira-using-docker-compose-2.webp&quot; alt=&quot;Install Jira Using Docker Compose - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to clone the repository that contains the configuration files, which include all the necessary conditions for Jira to work.&lt;/p&gt;
&lt;p&gt;You can clone the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/heyvaldemar/jira-traefik-letsencrypt-docker-compose.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-jira-using-docker-compose-3.webp&quot; alt=&quot;Install Jira Using Docker Compose - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Navigate to the directory with the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd jira-traefik-letsencrypt-docker-compose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-jira-using-docker-compose-4.webp&quot; alt=&quot;Install Jira Using Docker Compose - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to change the variables in the &lt;code&gt;.env&lt;/code&gt; file according to your requirements.&lt;/p&gt;
&lt;p&gt;:::important
The &lt;code&gt;.env&lt;/code&gt; file should be in the same directory as &lt;code&gt;jira-traefik-letsencrypt-docker-compose.yml&lt;/code&gt;.
:::&lt;/p&gt;
&lt;p&gt;Now let&apos;s start Jira with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose -f jira-traefik-letsencrypt-docker-compose.yml -p jira up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-jira-using-docker-compose-5.webp&quot; alt=&quot;Install Jira Using Docker Compose - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Jira management panel, go to &lt;code&gt;https://jira.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;jira.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik service, which will redirect the request to Jira.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;You&apos;ll now need to enter a license key for Jira.&lt;/p&gt;
&lt;p&gt;If you don&apos;t have one, you can obtain a temporary key to test out Jira.&lt;/p&gt;
&lt;p&gt;Click &quot;Get an evaluation license&quot; to proceed.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-jira-using-docker-compose-7.webp&quot; alt=&quot;Install Jira Using Docker Compose - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;If you possess an Atlassian account, input the email address linked to that account in the &quot;Enter email&quot; field, then click the &quot;Continue&quot; button.&lt;/p&gt;
&lt;p&gt;Enter the password for your Atlassian account and click the &quot;Log in&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-jira-using-docker-compose-8.webp&quot; alt=&quot;Install Jira Using Docker Compose - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;For the next step, indicate the product you need a temporary license key for and enter your organization&apos;s name.&lt;/p&gt;
&lt;p&gt;Click the &quot;Generate License&quot; button to secure a temporary license for Jira.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-jira-using-docker-compose-9.webp&quot; alt=&quot;Install Jira Using Docker Compose - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you&apos;ll need to confirm the installation of the temporary Jira license key on your server.&lt;/p&gt;
&lt;p&gt;Click the &quot;Yes&quot; button to proceed.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-jira-using-docker-compose-10.webp&quot; alt=&quot;Install Jira Using Docker Compose - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Your License Key&quot; field, enter the temporary license key you received earlier and then click the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-jira-using-docker-compose-11.webp&quot; alt=&quot;Install Jira Using Docker Compose - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;For the next step, please enter your username, name, email address, and password to set up a Jira administrator account.&lt;/p&gt;
&lt;p&gt;Click the &quot;Next&quot; button to continue.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-jira-using-docker-compose-12.webp&quot; alt=&quot;Install Jira Using Docker Compose - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;Choose &quot;Later&quot; if you wish to configure email notifications at a later time.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button to proceed.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-jira-using-docker-compose-13.webp&quot; alt=&quot;Install Jira Using Docker Compose - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select your preferred language and then click the &quot;Continue&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-jira-using-docker-compose-14.webp&quot; alt=&quot;Install Jira Using Docker Compose - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;After selecting your avatar, click the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-jira-using-docker-compose-15.webp&quot; alt=&quot;Install Jira Using Docker Compose - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;Jira is all set and ready to use.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-jira-using-docker-compose-16.webp&quot; alt=&quot;Install Jira Using Docker Compose - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Traefik control panel, go to &lt;code&gt;https://traefik.jira.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;jira.zabbix.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Enter the username and password previously set in the &lt;code&gt;.env&lt;/code&gt; file, and click the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-jira-using-docker-compose-17.webp&quot; alt=&quot;Install Jira Using Docker Compose - Step 17&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Traefik control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-jira-using-docker-compose-18.webp&quot; alt=&quot;Install Jira Using Docker Compose - Step 18&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Self-Hosting</category><category>Jira</category><category>Docker</category><category>Atlassian</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Confluence Using Docker Compose</title><link>https://heyvaldemar.com/install-confluence-using-docker-compose/</link><guid isPermaLink="true">https://heyvaldemar.com/install-confluence-using-docker-compose/</guid><description>Learn how to install Confluence using Docker Compose with Traefik and Let&apos;s Encrypt. Step-by-step setup for secure, self-hosted Atlassian documentation.</description><pubDate>Tue, 12 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Confluence using Docker Compose.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.atlassian.com/software/confluence&quot;&gt;Confluence&lt;/a&gt; is a web-based corporate wiki developed by Australian software company Atlassian.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted Confluence when your organization needs on-premises documentation with custom authentication, data residency controls, or integration into an air-gapped network. Confluence Cloud eliminates patching, scaling, and database maintenance. Self-hosting is justified when compliance mandates on-premises data storage or when you need direct database access for custom reporting.
:::&lt;/p&gt;
&lt;p&gt;💾 &lt;strong&gt;You can find the repository used in this guide on &lt;a href=&quot;https://github.com/heyvaldemar/confluence-traefik-letsencrypt-docker-compose&quot;&gt;GitHub&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;heyvaldemar/confluence-traefik-letsencrypt-docker-compose&quot;}&lt;/p&gt;
&lt;p&gt;:::note
We&apos;ll use &lt;a href=&quot;https://traefik.io/traefik/&quot;&gt;Traefik&lt;/a&gt; as our reverse proxy. It&apos;ll handle obtaining cryptographic certificates from &lt;a href=&quot;https://letsencrypt.org/&quot;&gt;Let&apos;s Encrypt&lt;/a&gt; for your domain names and route requests to the corresponding services based on those domains.
:::&lt;/p&gt;
&lt;p&gt;:::caution
To obtain cryptographic certificates, you will need A-type records in the external DNS zone, which point to the IP address of your server where Traefik is installed. If you have created these records recently, you should wait before starting the installation of the services. Full replication of these records between DNS servers can take from a few minutes to 48 hours or even longer in rare cases.
:::&lt;/p&gt;
&lt;p&gt;For a step-by-step guide on installing Docker Engine on Ubuntu Server, see &lt;a href=&quot;/install-docker-engine-and-docker-compose-on-ubuntu-server/&quot;&gt;Install Docker Engine and Docker Compose on Ubuntu Server&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on the server you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to obtain a free cryptographic certificate through the Let&apos;s Encrypt certification center.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the Confluence web interface.&lt;/li&gt;
&lt;li&gt;TCP port 8091 - for Synchrony communication.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which Confluence is planned to be installed.&lt;/p&gt;
&lt;p&gt;Now it is necessary to create networks for your services.&lt;/p&gt;
&lt;p&gt;We create a network for Traefik using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create traefik-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-using-docker-compose-1.webp&quot; alt=&quot;Install Confluence Using Docker Compose - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;We create a network for Confluence using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create confluence-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-using-docker-compose-2.webp&quot; alt=&quot;Install Confluence Using Docker Compose - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to clone the repository that contains the configuration files, which include all the necessary conditions for Confluence to work.&lt;/p&gt;
&lt;p&gt;You can clone the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/heyvaldemar/confluence-traefik-letsencrypt-docker-compose.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-using-docker-compose-3.webp&quot; alt=&quot;Install Confluence Using Docker Compose - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Navigate to the directory with the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd confluence-traefik-letsencrypt-docker-compose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-using-docker-compose-4.webp&quot; alt=&quot;Install Confluence Using Docker Compose - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to change the variables in the &lt;code&gt;.env&lt;/code&gt; file according to your requirements.&lt;/p&gt;
&lt;p&gt;:::important
The &lt;code&gt;.env&lt;/code&gt; file should be in the same directory as &lt;code&gt;confluence-traefik-letsencrypt-docker-compose.yml&lt;/code&gt;.
:::&lt;/p&gt;
&lt;p&gt;Now let&apos;s start Confluence with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose -f confluence-traefik-letsencrypt-docker-compose.yml -p confluence up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-using-docker-compose-5.webp&quot; alt=&quot;Install Confluence Using Docker Compose - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Confluence management panel, go to &lt;code&gt;https://confluence.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;confluence.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik service, which will redirect the request to Confluence.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;You&apos;ll now need to enter a license key for Confluence.&lt;/p&gt;
&lt;p&gt;If you don&apos;t have one, you can obtain a temporary key to test out Confluence.&lt;/p&gt;
&lt;p&gt;Click &quot;Get an evaluation license&quot; to proceed.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-using-docker-compose-6.webp&quot; alt=&quot;Install Confluence Using Docker Compose - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;If you possess an Atlassian account, input the email address linked to that account in the &quot;Enter email&quot; field, then click the &quot;Continue&quot; button.&lt;/p&gt;
&lt;p&gt;Enter the password for your Atlassian account and click the &quot;Log in&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-using-docker-compose-7.webp&quot; alt=&quot;Install Confluence Using Docker Compose - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;For the next step, indicate the product you need a temporary license key for and enter your organization&apos;s name.&lt;/p&gt;
&lt;p&gt;Click the &quot;Generate License&quot; button to secure a temporary license for Confluence.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-using-docker-compose-8.webp&quot; alt=&quot;Install Confluence Using Docker Compose - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you&apos;ll need to confirm the installation of the temporary Confluence license key on your server.&lt;/p&gt;
&lt;p&gt;Click the &quot;Yes&quot; button to proceed.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-using-docker-compose-9.webp&quot; alt=&quot;Install Confluence Using Docker Compose - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Confluence&quot; field, enter the temporary license key you received earlier and then click the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-using-docker-compose-10.webp&quot; alt=&quot;Install Confluence Using Docker Compose - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;Choose the &quot;Non-clustered (single node)&quot; option and then click the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-using-docker-compose-11.webp&quot; alt=&quot;Install Confluence Using Docker Compose - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;For the upcoming step, you can either begin with an example site or choose to add content yourself.&lt;/p&gt;
&lt;p&gt;Click the &quot;Example Site&quot; button to continue.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-using-docker-compose-12.webp&quot; alt=&quot;Install Confluence Using Docker Compose - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click the &quot;Manage users and groups within Confluence&quot; button to proceed.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-using-docker-compose-13.webp&quot; alt=&quot;Install Confluence Using Docker Compose - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;For the next step, please enter your username, name, email address, and password to set up a Confluence administrator account.&lt;/p&gt;
&lt;p&gt;Click the &quot;Next&quot; button to continue.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-using-docker-compose-14.webp&quot; alt=&quot;Install Confluence Using Docker Compose - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;Confluence is all set and ready to use.&lt;/p&gt;
&lt;p&gt;Click the &quot;Start&quot; button to begin.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-using-docker-compose-15.webp&quot; alt=&quot;Install Confluence Using Docker Compose - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can now establish a dedicated space for your team, allowing them to work on their projects.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-using-docker-compose-16.webp&quot; alt=&quot;Install Confluence Using Docker Compose - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Traefik control panel, go to &lt;code&gt;https://traefik.confluence.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;confluence.zabbix.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Enter the username and password previously set in the &lt;code&gt;.env&lt;/code&gt; file, and click the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-using-docker-compose-17.webp&quot; alt=&quot;Install Confluence Using Docker Compose - Step 17&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Traefik control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-using-docker-compose-18.webp&quot; alt=&quot;Install Confluence Using Docker Compose - Step 18&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Self-Hosting</category><category>Confluence</category><category>Docker</category><category>Atlassian</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Nextcloud with OnlyOffice Using Docker Compose</title><link>https://heyvaldemar.com/install-nextcloud-with-onlyoffice-using-docker-compose/</link><guid isPermaLink="true">https://heyvaldemar.com/install-nextcloud-with-onlyoffice-using-docker-compose/</guid><description>Step-by-step guide to installing Nextcloud with OnlyOffice using Docker Compose. Includes Traefik, Let&apos;s Encrypt, secure document editing, and cloud storage.</description><pubDate>Mon, 11 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Nextcloud with OnlyOffice using Docker Compose.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://nextcloud.com/&quot;&gt;Nextcloud&lt;/a&gt; is an analogue of Dropbox, which you can install on your own server and make a cloud for storing files - photos, videos and any others. The application can be used for collaboration and confidential file sharing, setting access levels for each user. You can also make voice and video calls using the separate NextCloud Talk mobile app.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.onlyoffice.com/&quot;&gt;OnlyOffice&lt;/a&gt; offers a secure online office suite highly compatible with MS Office formats. Connect it to your web platform for document editing and collaboration or use as a part of OnlyOffice Workspace.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted Nextcloud with OnlyOffice when you need an integrated file storage and document editing platform with full data ownership. Google Workspace or Microsoft 365 provide managed alternatives with superior real-time collaboration. Self-hosting is justified when compliance requires on-premises document processing or when per-user SaaS licensing exceeds the cost of maintaining your own infrastructure.
:::&lt;/p&gt;
&lt;p&gt;💾 &lt;strong&gt;You can find the repository used in this guide on &lt;a href=&quot;https://github.com/heyvaldemar/nextcloud-onlyoffice-traefik-letsencrypt-docker-compose&quot;&gt;GitHub&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;heyvaldemar/nextcloud-onlyoffice-traefik-letsencrypt-docker-compose&quot;}&lt;/p&gt;
&lt;p&gt;:::note
We&apos;ll use &lt;a href=&quot;https://traefik.io/traefik/&quot;&gt;Traefik&lt;/a&gt; as our reverse proxy. It&apos;ll handle obtaining cryptographic certificates from &lt;a href=&quot;https://letsencrypt.org/&quot;&gt;Let&apos;s Encrypt&lt;/a&gt; for your domain names and route requests to the corresponding services based on those domains.
:::&lt;/p&gt;
&lt;p&gt;:::caution
Remember that without a secure connection, the services will not work.
:::&lt;/p&gt;
&lt;p&gt;:::caution
To obtain cryptographic certificates, you will need A-type records in the external DNS zone, which point to the IP address of your server where Traefik is installed. If you have created these records recently, you should wait before starting the installation of the services. Full replication of these records between DNS servers can take from a few minutes to 48 hours or even longer in rare cases.
:::&lt;/p&gt;
&lt;p&gt;:::important
Docker Engine and Docker Compose must be installed on the server.&lt;/p&gt;
&lt;p&gt;For a step-by-step guide on installing Docker Engine on Ubuntu Server, see &lt;a href=&quot;/install-docker-engine-and-docker-compose-on-ubuntu-server/&quot;&gt;Install Docker Engine and Docker Compose on Ubuntu Server&lt;/a&gt;
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on the server you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to obtain a free cryptographic certificate through the Let&apos;s Encrypt certification center.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the Nextcloud web interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which Nextcloud is planned to be installed.&lt;/p&gt;
&lt;p&gt;Now it is necessary to create networks for your services.&lt;/p&gt;
&lt;p&gt;We create a network for Traefik using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create traefik-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-nextcloud-with-onlyoffice-using-docker-compose-1.webp&quot; alt=&quot;Install Nextcloud with OnlyOffice Using Docker Compose - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;We create a network for Nextcloud using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create nextcloud-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-nextcloud-with-onlyoffice-using-docker-compose-2.webp&quot; alt=&quot;Install Nextcloud with OnlyOffice Using Docker Compose - Step 2&quot;&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create onlyoffice-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-nextcloud-with-onlyoffice-using-docker-compose-3.webp&quot; alt=&quot;Install Nextcloud with OnlyOffice Using Docker Compose - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to clone the repository that contains the configuration files, which include all the necessary conditions for Nextcloud to work.&lt;/p&gt;
&lt;p&gt;You can clone the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/heyvaldemar/nextcloud-onlyoffice-traefik-letsencrypt-docker-compose.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-nextcloud-with-onlyoffice-using-docker-compose-4.webp&quot; alt=&quot;Install Nextcloud with OnlyOffice Using Docker Compose - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Navigate to the directory with the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd nextcloud-onlyoffice-traefik-letsencrypt-docker-compose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-nextcloud-with-onlyoffice-using-docker-compose-5.webp&quot; alt=&quot;Install Nextcloud with OnlyOffice Using Docker Compose - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to change the variables in the &lt;code&gt;.env&lt;/code&gt; file according to your requirements.&lt;/p&gt;
&lt;p&gt;:::important
The &lt;code&gt;.env&lt;/code&gt; file should be in the same directory as &lt;code&gt;nextcloud-onlyoffice-traefik-letsencrypt-docker-compose.yml&lt;/code&gt;.
:::&lt;/p&gt;
&lt;p&gt;Now let&apos;s start Nextcloud with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose -f nextcloud-onlyoffice-traefik-letsencrypt-docker-compose.yml -p nextcloud up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-nextcloud-with-onlyoffice-using-docker-compose-6.webp&quot; alt=&quot;Install Nextcloud with OnlyOffice Using Docker Compose - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Nextcloud management panel, go to &lt;code&gt;https://nextcloud.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;nextcloud.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik service, which will redirect the request to Nextcloud.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Enter the username and password that you previously set in the &lt;code&gt;.env&lt;/code&gt; file, and click the &quot;Log In&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-nextcloud-with-onlyoffice-using-docker-compose-7.webp&quot; alt=&quot;Install Nextcloud with OnlyOffice Using Docker Compose - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Nextcloud control panel.&lt;/p&gt;
&lt;p&gt;Click the profile picture in the top-right corner, then select the &quot;Apps&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-nextcloud-with-onlyoffice-using-docker-compose-8.webp&quot; alt=&quot;Install Nextcloud with OnlyOffice Using Docker Compose - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;Integration&quot; on the left sidebar and search for ONLYOFFICE integration.&lt;/p&gt;
&lt;p&gt;Click on &quot;Download and Enable&quot; to install the ONLYOFFICE integration.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-nextcloud-with-onlyoffice-using-docker-compose-9.webp&quot; alt=&quot;Install Nextcloud with OnlyOffice Using Docker Compose - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click the profile picture in the top-right corner, then select the &quot;Administration Settings&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-nextcloud-with-onlyoffice-using-docker-compose-10.webp&quot; alt=&quot;Install Nextcloud with OnlyOffice Using Docker Compose - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;ONLYOFFICE&quot; on the left sidebar.&lt;/p&gt;
&lt;p&gt;In the &quot;ONLYOFFICE Docs address&quot; field, enter the domain name of the ONLYOFFICE service.&lt;/p&gt;
&lt;p&gt;In the &quot;Secret Key&quot; field, enter the Secret Key for the ONLYOFFICE service.&lt;/p&gt;
&lt;p&gt;:::caution
You need to specify the domain name of the service and Secret key, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::caution&lt;/p&gt;
&lt;p&gt;:::caution
You will need cryptographic certificates for your domain names. In my configuration, certificates are requested automatically using Traefik and Let&apos;s Encrypt. Remember that without a secure connection, the services will not work.
:::&lt;/p&gt;
&lt;p&gt;:::caution
To obtain cryptographic certificates, you will need A-type records in the external DNS zone, which point to the IP address of your server where Traefik is installed. If you have created these records recently, you should wait before starting the installation of the services. Full replication of these records between DNS servers can take from a few minutes to 48 hours or even longer in rare cases.
:::&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-nextcloud-with-onlyoffice-using-docker-compose-11.webp&quot; alt=&quot;Install Nextcloud with OnlyOffice Using Docker Compose - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;Settings have been successfully updated.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-nextcloud-with-onlyoffice-using-docker-compose-12.webp&quot; alt=&quot;Install Nextcloud with OnlyOffice Using Docker Compose - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s try to create a document using OnlyOffice.&lt;/p&gt;
&lt;p&gt;Click the folder icon in the left corner, then click the plus button and choose &quot;New document&quot; in OnlyOffice.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-nextcloud-with-onlyoffice-using-docker-compose-13.webp&quot; alt=&quot;Install Nextcloud with OnlyOffice Using Docker Compose - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;Enter the name for the new document and click the arrow button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-nextcloud-with-onlyoffice-using-docker-compose-14.webp&quot; alt=&quot;Install Nextcloud with OnlyOffice Using Docker Compose - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;The document was successfully created.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-nextcloud-with-onlyoffice-using-docker-compose-15.webp&quot; alt=&quot;Install Nextcloud with OnlyOffice Using Docker Compose - Step 15&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Background Jobs Using Cron&lt;/h2&gt;
&lt;p&gt;To ensure your Nextcloud instance operates efficiently, it&apos;s important to use the &quot;Cron&quot; method to execute background jobs. A dedicated Docker container has already been set up in your environment to handle these tasks.&lt;/p&gt;
&lt;h3&gt;Steps to Enable Cron&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Log in to Nextcloud as an Administrator.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Administration settings&lt;/strong&gt; (click on your user profile in the top right corner and select &quot;Administration settings&quot;).&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Administration&lt;/strong&gt; section on the left sidebar, select &lt;strong&gt;Basic settings&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Scroll down to the &lt;strong&gt;Background jobs&lt;/strong&gt; section.&lt;/li&gt;
&lt;li&gt;Select the &lt;strong&gt;&quot;Cron (Recommended)&quot;&lt;/strong&gt; option.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./install-nextcloud-with-onlyoffice-using-docker-compose-16.webp&quot; alt=&quot;Install Nextcloud with OnlyOffice Using Docker Compose - Step 16&quot;&gt;&lt;/p&gt;
&lt;h3&gt;Why Use Cron?&lt;/h3&gt;
&lt;p&gt;The &quot;Cron&quot; method ensures that background tasks, such as file indexing, notifications, and cleanup operations, run at regular intervals independently of user activity. This method is more reliable and efficient than AJAX or Webcron, particularly for larger or more active instances, as it does not depend on users accessing the site to trigger these tasks. With the dedicated container in your setup, this method keeps your Nextcloud instance responsive and in good health by running these jobs consistently.&lt;/p&gt;
&lt;p&gt;To access the Traefik control panel, go to &lt;code&gt;https://traefik.nextcloud.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;traefik.nextcloud.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Enter the username and password previously set in the &lt;code&gt;.env&lt;/code&gt; file, and click the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-nextcloud-with-onlyoffice-using-docker-compose-17.webp&quot; alt=&quot;Install Nextcloud with OnlyOffice Using Docker Compose - Step 17&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Traefik control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-nextcloud-with-onlyoffice-using-docker-compose-18.webp&quot; alt=&quot;Install Nextcloud with OnlyOffice Using Docker Compose - Step 18&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Self-Hosting</category><category>Nextcloud</category><category>OnlyOffice</category><category>Docker</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Distinctions Between Terminal, Command Line, Shell, and Prompt</title><link>https://heyvaldemar.com/distinctions-between-terminal-command-line-shell-and-prompt/</link><guid isPermaLink="true">https://heyvaldemar.com/distinctions-between-terminal-command-line-shell-and-prompt/</guid><description>Learn the differences between terminal, command line, shell, and prompt in Linux. A beginner-friendly guide to essential CLI concepts and tools.</description><pubDate>Fri, 08 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;New to Linux and tripping over all the overlapping terms? You&apos;re not alone. People throw around &lt;em&gt;terminal&lt;/em&gt;, &lt;em&gt;shell&lt;/em&gt;, &lt;em&gt;command line&lt;/em&gt;, and &lt;em&gt;prompt&lt;/em&gt; as if they mean the same thing. They don&apos;t. And if you&apos;re going to live in the CLI, you should know what each one actually does.&lt;/p&gt;
&lt;p&gt;So here&apos;s the distinction, once and for all. Clear, quick, no fluff.&lt;/p&gt;
&lt;h2&gt;Terminal: The Box That Lets You Talk to the Machine&lt;/h2&gt;
&lt;p&gt;The &lt;strong&gt;terminal&lt;/strong&gt; is just a window. It&apos;s a UI that lets you type into a shell. By itself it executes nothing. Think of it as a &lt;strong&gt;container&lt;/strong&gt; for your CLI session.&lt;/p&gt;
&lt;p&gt;Modern terminals are graphical apps that simulate the old physical terminals (yes, actual hardware) that once connected to mainframes. What you&apos;re running is a &lt;strong&gt;terminal emulator&lt;/strong&gt;. A few examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://gnome-terminator.org/&quot;&gt;Terminator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.gnome.org/users/gnome-terminal/&quot;&gt;GNOME Terminal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://konsole.kde.org/&quot;&gt;Konsole&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alacritty/alacritty&quot;&gt;Alacritty&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The terminal launches your &lt;strong&gt;shell&lt;/strong&gt; and displays its output. That&apos;s the whole job.&lt;/p&gt;
&lt;h2&gt;Shell: The Thing That Actually Runs Your Commands&lt;/h2&gt;
&lt;p&gt;The &lt;strong&gt;shell&lt;/strong&gt; is the real workhorse. It&apos;s a program that parses what you type, runs it, and hands back output. It also does scripting, variables, functions, and other niceties. That&apos;s why it&apos;s two things at once: an interactive tool, and a scripting language.&lt;/p&gt;
&lt;p&gt;Common Linux shells include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Bash_(Unix_shell)&quot;&gt;bash&lt;/a&gt; - the default on many distros&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Z_shell&quot;&gt;zsh&lt;/a&gt; - feature-rich, used in macOS&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://fishshell.com/&quot;&gt;fish&lt;/a&gt; - user-friendly, no need to memorize syntax&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Almquist_shell&quot;&gt;sh&lt;/a&gt; - minimal, legacy-compatible&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Open your terminal and it starts a shell session. Type &lt;code&gt;ls&lt;/code&gt;, and the shell interprets it, runs the &lt;code&gt;ls&lt;/code&gt; binary, then sends the output back to the terminal. Three steps, one keystroke away.&lt;/p&gt;
&lt;h2&gt;Prompt: The &quot;Ready for Your Input&quot; Signal&lt;/h2&gt;
&lt;p&gt;That blinking text sitting there before you type anything? That&apos;s the &lt;strong&gt;prompt&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;It tells you the shell is waiting. Prompts often carry useful info:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;valdemar@devbox:~/projects $
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;valdemar&lt;/code&gt; = username&lt;/li&gt;
&lt;li&gt;&lt;code&gt;devbox&lt;/code&gt; = hostname&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/projects&lt;/code&gt; = current directory&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$&lt;/code&gt; = non-root user (use &lt;code&gt;#&lt;/code&gt; if root)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Every shell lets you customize the prompt. Some people pack in Git status, battery life, even the weather. Don&apos;t.&lt;/p&gt;
&lt;p&gt;On ancient systems your prompt might be nothing but a lonely &lt;code&gt;%&lt;/code&gt; or &lt;code&gt;&amp;gt;&lt;/code&gt;. Don&apos;t judge.&lt;/p&gt;
&lt;h2&gt;Command Line: The Concept, Not the App&lt;/h2&gt;
&lt;p&gt;The &lt;strong&gt;command line&lt;/strong&gt; isn&apos;t an app. It isn&apos;t a binary either. It&apos;s a concept: an interface for typing commands instead of clicking buttons.&lt;/p&gt;
&lt;p&gt;You&apos;ll find a command line in plenty of places:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A terminal (Linux, macOS, WSL, etc.)&lt;/li&gt;
&lt;li&gt;A dedicated console (like the Windows Command Prompt)&lt;/li&gt;
&lt;li&gt;Your programming language REPL (Python, Ruby, etc.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You type text commands, you get text output. That&apos;s the command line.&lt;/p&gt;
&lt;h2&gt;Putting It All Together&lt;/h2&gt;
&lt;p&gt;Here&apos;s what actually happens when you &quot;open the terminal&quot; on Linux:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You launch a &lt;strong&gt;terminal emulator&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;It starts a &lt;strong&gt;shell&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;The shell shows a &lt;strong&gt;prompt&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;You enter a command on the &lt;strong&gt;command line&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;The shell runs the command and shows the result&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./distinctions-between-terminal-command-line-shell-and-prompt-1.webp&quot; alt=&quot;Visual breakdown of terminal, shell, prompt, and command line in Linux&quot;&gt;&lt;/p&gt;
&lt;h2&gt;TL;DR Cheat Sheet&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Term&lt;/th&gt;
&lt;th&gt;What It Is&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Terminal&lt;/td&gt;
&lt;td&gt;The window or emulator app&lt;/td&gt;
&lt;td&gt;GNOME Terminal, iTerm2, Konsole&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shell&lt;/td&gt;
&lt;td&gt;The program that runs your commands&lt;/td&gt;
&lt;td&gt;bash, zsh, fish, sh&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prompt&lt;/td&gt;
&lt;td&gt;The text telling you the shell is ready&lt;/td&gt;
&lt;td&gt;&lt;code&gt;valdemar@devbox:~$&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Command Line&lt;/td&gt;
&lt;td&gt;The interface where you type commands&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ls -al&lt;/code&gt;, &lt;code&gt;git status&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;Knowing the difference isn&apos;t academic trivia. It helps you troubleshoot. Terminal won&apos;t launch? That&apos;s one problem. Shell crashes? Different problem. Prompt looks broken? Your config is probably janky. Nothing responds at all? Maybe you just need coffee.&lt;/p&gt;
&lt;p&gt;You&apos;ve got the basics now. So go write a shell script, alias &lt;code&gt;ll&lt;/code&gt; to &lt;code&gt;ls -alh&lt;/code&gt;, and quit calling everything &quot;the terminal thing.&quot;&lt;/p&gt;
&lt;p&gt;You&apos;re one step closer to speaking &lt;em&gt;Linux&lt;/em&gt; like a native.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Shell</category><category>Terminal</category><category>CLI</category><category>Bash</category><category>Zsh</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Zabbix Using Docker Compose</title><link>https://heyvaldemar.com/install-zabbix-using-docker-compose/</link><guid isPermaLink="true">https://heyvaldemar.com/install-zabbix-using-docker-compose/</guid><description>Step-by-step guide to install Zabbix with Docker Compose using Traefik and Let&apos;s Encrypt. Perfect for self-hosted monitoring on Ubuntu Server.</description><pubDate>Fri, 08 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Zabbix using Docker Compose.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.zabbix.com/&quot;&gt;Zabbix&lt;/a&gt; is a mature and effortless enterprise-class open source monitoring solution for network monitoring and application monitoring of millions of metrics.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted Zabbix when you need agentless infrastructure monitoring with full data retention control and no per-host licensing fees. Datadog or New Relic provide managed alternatives with richer APM, log management, and integrations. Self-hosting Zabbix is justified when monitoring data must remain on-premises or when host count makes per-unit SaaS pricing prohibitive.
:::&lt;/p&gt;
&lt;p&gt;💾 &lt;strong&gt;You can find the repository used in this guide on &lt;a href=&quot;https://github.com/heyvaldemar/zabbix-traefik-letsencrypt-docker-compose&quot;&gt;GitHub&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;heyvaldemar/zabbix-traefik-letsencrypt-docker-compose&quot;}&lt;/p&gt;
&lt;p&gt;:::note
We&apos;ll use &lt;a href=&quot;https://traefik.io/traefik/&quot;&gt;Traefik&lt;/a&gt; as our reverse proxy. It&apos;ll handle obtaining cryptographic certificates from &lt;a href=&quot;https://letsencrypt.org/&quot;&gt;Let&apos;s Encrypt&lt;/a&gt; for your domain names and route requests to the corresponding services based on those domains.
:::&lt;/p&gt;
&lt;p&gt;:::caution
To obtain cryptographic certificates, you will need A-type records in the external DNS zone, which point to the IP address of your server where Traefik is installed. If you have created these records recently, you should wait before starting the installation of the services. Full replication of these records between DNS servers can take from a few minutes to 48 hours or even longer in rare cases.
:::&lt;/p&gt;
&lt;p&gt;:::important
Docker Engine and Docker Compose must be installed on the server.&lt;/p&gt;
&lt;p&gt;For a step-by-step guide on installing Docker Engine on Ubuntu Server, see &lt;a href=&quot;/install-docker-engine-and-docker-compose-on-ubuntu-server/&quot;&gt;Install Docker Engine and Docker Compose on Ubuntu Server&lt;/a&gt;
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on the server you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to obtain a free cryptographic certificate through the Let&apos;s Encrypt certification center.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the Zabbix web interface.&lt;/li&gt;
&lt;li&gt;TCP port 10051 - to communicate between the Zabbix server and the Zabbix agents for active checks.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which Zabbix is planned to be installed.&lt;/p&gt;
&lt;p&gt;Now it is necessary to create networks for your services.&lt;/p&gt;
&lt;p&gt;We create a network for Traefik using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create traefik-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-using-docker-compose-1.webp&quot; alt=&quot;Install Zabbix Using Docker Compose - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;We create a network for Zabbix using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create zabbix-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-using-docker-compose-2.webp&quot; alt=&quot;Install Zabbix Using Docker Compose - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to clone the repository that contains the configuration files, which include all the necessary conditions for Zabbix to work.&lt;/p&gt;
&lt;p&gt;You can clone the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/heyvaldemar/zabbix-traefik-letsencrypt-docker-compose.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-using-docker-compose-3.webp&quot; alt=&quot;Install Zabbix Using Docker Compose - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Navigate to the directory with the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd zabbix-traefik-letsencrypt-docker-compose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-using-docker-compose-4.webp&quot; alt=&quot;Install Zabbix Using Docker Compose - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to change the variables in the &lt;code&gt;.env&lt;/code&gt; file according to your requirements.&lt;/p&gt;
&lt;p&gt;:::important
The &lt;code&gt;.env&lt;/code&gt; file should be in the same directory as &lt;code&gt;zabbix-traefik-letsencrypt-docker-compose.yml&lt;/code&gt;.
:::&lt;/p&gt;
&lt;p&gt;Now let&apos;s start Zabbix with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose -f zabbix-traefik-letsencrypt-docker-compose.yml -p zabbix up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-using-docker-compose-5.webp&quot; alt=&quot;Install Zabbix Using Docker Compose - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Zabbix management panel, go to &lt;code&gt;https://dashboard.zabbix.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;dashboard.zabbix.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik service, which will redirect the request to Zabbix.&lt;/p&gt;
&lt;p&gt;:::note
Tou need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Now, you can log into the Zabbix dashboard as an administrator.&lt;/p&gt;
&lt;p&gt;Use the following default credentials for the Zabbix administrator account:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Username:&lt;/strong&gt; Admin&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Password:&lt;/strong&gt; zabbix&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Click on the &quot;Sign in&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-using-docker-compose-6.webp&quot; alt=&quot;Install Zabbix Using Docker Compose - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Zabbix control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-using-docker-compose-7.webp&quot; alt=&quot;Install Zabbix Using Docker Compose - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, to configure the Zabbix server for self-monitoring, we need to define the DNS name of the Zabbix Agent.&lt;/p&gt;
&lt;p&gt;Proceed by selecting &quot;Hosts&quot; under the &quot;Data collection&quot; section.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-using-docker-compose-8.webp&quot; alt=&quot;Install Zabbix Using Docker Compose - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, click on the &quot;Zabbix server&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-using-docker-compose-8.webp&quot; alt=&quot;Install Zabbix Using Docker Compose - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Within the &quot;Interfaces&quot; section, find the &quot;DNS name&quot; subsection. Enter &quot;zabbix-agent&quot; as the Zabbix Agent service name, referencing the &lt;code&gt;yml&lt;/code&gt; configuration file.&lt;/p&gt;
&lt;p&gt;Next, under the &quot;Connect to&quot; section, select &quot;DNS&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Update&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-using-docker-compose-9.webp&quot; alt=&quot;Install Zabbix Using Docker Compose - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;After waiting a few minutes, refresh the page. You should then observe that the availability status of the Zabbix Agent has turned green.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-using-docker-compose-10.webp&quot; alt=&quot;Install Zabbix Using Docker Compose - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Traefik control panel, go to &lt;code&gt;https://traefik.zabbix.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;traefik.zabbix.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Enter the username and password previously set in the &lt;code&gt;.env&lt;/code&gt; file, and click the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-using-docker-compose-11.webp&quot; alt=&quot;Install Zabbix Using Docker Compose - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Traefik control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-using-docker-compose-12.webp&quot; alt=&quot;Install Zabbix Using Docker Compose - Step 12&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Self-Hosting</category><category>Zabbix</category><category>Docker</category><category>Monitoring</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Minecraft Server Using Docker Compose</title><link>https://heyvaldemar.com/install-minecraft-server-using-docker-compose/</link><guid isPermaLink="true">https://heyvaldemar.com/install-minecraft-server-using-docker-compose/</guid><description>Learn how to install a Minecraft Server using Docker Compose. Set up your own secure multiplayer server on Ubuntu with ease using this step-by-step guide.</description><pubDate>Mon, 04 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Want to run your own Minecraft Server with Docker Compose? This is the guide. Detailed, no fluff.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://www.minecraft.net/&quot;&gt;Minecraft&lt;/a&gt; Server is a player-owned or business-owned multiplayer game server for the 2009 Mojang Studios video game Minecraft. One thing to keep straight: people say &quot;server&quot; but usually mean a network of connected machines, not one box.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose a self-hosted Minecraft server when you need full control over mods, plugins, world configuration, and player limits. Minecraft Realms offers a managed alternative with simpler setup but limited customization and a 10-player cap. Self-hosting is the right approach when you need modded gameplay, custom server properties, or want to avoid per-player subscription costs.
:::&lt;/p&gt;
&lt;p&gt;💾 &lt;strong&gt;You can find the repository used in this guide on &lt;a href=&quot;https://github.com/heyvaldemar/minecraft-server-docker-compose&quot;&gt;GitHub&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;heyvaldemar/minecraft-server-docker-compose&quot;}&lt;/p&gt;
&lt;p&gt;:::caution
You will need A-type records in the external DNS zone, which point to the IP address of your server where Minecraft Server is installed. If you have created these records recently, you should wait before starting the installation of the services. Full replication of these records between DNS servers can take from a few minutes to 48 hours or even longer in rare cases.
:::&lt;/p&gt;
&lt;p&gt;:::note
Alternatively, you can use the public static IP address of your server to connect directly.
:::&lt;/p&gt;
&lt;p&gt;:::important
Docker Engine and Docker Compose must be installed on the server.&lt;/p&gt;
&lt;p&gt;For a step-by-step guide on installing Docker Engine on Ubuntu Server, see &lt;a href=&quot;/install-docker-engine-and-docker-compose-on-ubuntu-server/&quot;&gt;Install Docker Engine and Docker Compose on Ubuntu Server&lt;/a&gt;
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;No OpenSSH yet? Install it with:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 25565 - to connect Minecraft clients to the server.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;SSH into the box where Minecraft Server will live.&lt;/p&gt;
&lt;p&gt;First job is the network. Your services need one to talk over.&lt;/p&gt;
&lt;p&gt;Create it for Minecraft Server like so:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create minecraft-server-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-minecraft-server-using-docker-compose-1.webp&quot; alt=&quot;Install Minecraft Server Using Docker Compose - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now clone the repository. It carries the configuration files, and those files hold everything Minecraft Server needs to run.&lt;/p&gt;
&lt;p&gt;Clone it with:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/heyvaldemar/minecraft-server-docker-compose.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-minecraft-server-using-docker-compose-2.webp&quot; alt=&quot;Install Minecraft Server Using Docker Compose - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Step into the repository directory:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd minecraft-server-docker-compose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-minecraft-server-using-docker-compose-3.webp&quot; alt=&quot;Install Minecraft Server Using Docker Compose - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now edit the &lt;code&gt;.env&lt;/code&gt; file. Set the variables to whatever your setup calls for.&lt;/p&gt;
&lt;p&gt;:::note
The &lt;code&gt;.env&lt;/code&gt; file and &lt;code&gt;plugins&lt;/code&gt; folder should be in the same directory as &lt;code&gt;minecraft-server-docker-compose.yml&lt;/code&gt;.
:::&lt;/p&gt;
&lt;p&gt;Time to start it up:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose -f minecraft-server-docker-compose.yml -p minecraft-server up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-minecraft-server-using-docker-compose-4.webp&quot; alt=&quot;Install Minecraft Server Using Docker Compose - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::caution
To connect to your Minecraft server, enter the domain name into the Minecraft client. This domain name should point to the IP address of your server where the Minecraft Server is installed. Alternatively, you can use the public static IP address of your server to connect directly.
:::&lt;/p&gt;
&lt;p&gt;:::caution
Before using a domain name, ensure you have set up A-type records in your external DNS zone that point to this IP address. If you&apos;ve recently created these records, it&apos;s advisable to wait before starting the installation of the services. DNS record propagation can vary, taking anywhere from a few minutes to 48 hours, and in rare cases, even longer.
:::&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Self-Hosting</category><category>Minecraft</category><category>Docker</category><category>Gaming</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install WordPress Using Docker Compose</title><link>https://heyvaldemar.com/install-wordpress-using-docker-compose/</link><guid isPermaLink="true">https://heyvaldemar.com/install-wordpress-using-docker-compose/</guid><description>Install WordPress with Docker Compose on Ubuntu using Traefik and Let&apos;s Encrypt. Full guide with step-by-step setup, HTTPS, and Docker networking.</description><pubDate>Sun, 03 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import VideoPlayer from &quot;@components/VideoPlayer.astro&quot;;&lt;/p&gt;
&lt;p&gt;&amp;lt;VideoPlayer
videoId=&quot;HZfmFEDqOnM&quot;
title=&quot;Install WordPress Using Docker Compose&quot;
/&amp;gt;&lt;/p&gt;
&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing WordPress using Docker Compose.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://wordpress.org/&quot;&gt;WordPress&lt;/a&gt; is a web content management system. It was originally created as a tool to publish blogs but has evolved to support publishing other web content, including more traditional websites, mailing lists and Internet forum, media galleries, membership sites, learning management systems and online stores.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted WordPress when you need full control over plugins, themes, and hosting infrastructure without platform restrictions. WordPress.com or Squarespace provide managed alternatives with built-in CDN and automatic updates. Self-hosting is justified when you require custom PHP code, WooCommerce at scale, or need to avoid content platform lock-in.
:::&lt;/p&gt;
&lt;p&gt;💾 &lt;strong&gt;You can find the repository used in this guide on &lt;a href=&quot;https://github.com/heyvaldemar/wordpress-traefik-letsencrypt-docker-compose&quot;&gt;GitHub&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;heyvaldemar/wordpress-traefik-letsencrypt-docker-compose&quot;}&lt;/p&gt;
&lt;p&gt;:::note
We&apos;ll use &lt;a href=&quot;https://traefik.io/traefik/&quot;&gt;Traefik&lt;/a&gt; as our reverse proxy. It&apos;ll handle obtaining cryptographic certificates from &lt;a href=&quot;https://letsencrypt.org/&quot;&gt;Let&apos;s Encrypt&lt;/a&gt; for your domain names and route requests to the corresponding services based on those domains.
:::&lt;/p&gt;
&lt;p&gt;:::caution
To obtain cryptographic certificates, you will need A-type records in the external DNS zone, which point to the IP address of your server where Traefik is installed. If you have created these records recently, you should wait before starting the installation of the services. Full replication of these records between DNS servers can take from a few minutes to 48 hours or even longer in rare cases.
:::&lt;/p&gt;
&lt;p&gt;:::important
Docker Engine and Docker Compose must be installed on the server.&lt;/p&gt;
&lt;p&gt;For a step-by-step guide on installing Docker Engine on Ubuntu Server, see &lt;a href=&quot;/install-docker-engine-and-docker-compose-on-ubuntu-server/&quot;&gt;Install Docker Engine and Docker Compose on Ubuntu Server&lt;/a&gt;
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on the server you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to obtain a free cryptographic certificate through the Let&apos;s Encrypt certification center.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the WordPress web interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which WordPress is planned to be installed.&lt;/p&gt;
&lt;p&gt;Now it is necessary to create networks for your services.&lt;/p&gt;
&lt;p&gt;We create a network for Traefik using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create traefik-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-wordpress-using-docker-compose-1.webp&quot; alt=&quot;Install WordPress Using Docker Compose - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;We create a network for WordPress using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create wordpress-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-wordpress-using-docker-compose-2.webp&quot; alt=&quot;Install WordPress Using Docker Compose - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to clone the repository that contains the configuration files, which include all the necessary conditions for WordPress to work.&lt;/p&gt;
&lt;p&gt;You can clone the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/heyvaldemar/wordpress-traefik-letsencrypt-docker-compose.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-wordpress-using-docker-compose-3.webp&quot; alt=&quot;Install WordPress Using Docker Compose - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Navigate to the directory with the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd wordpress-traefik-letsencrypt-docker-compose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-wordpress-using-docker-compose-4.webp&quot; alt=&quot;Install WordPress Using Docker Compose - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to change the variables in the &lt;code&gt;.env&lt;/code&gt; file according to your requirements.&lt;/p&gt;
&lt;p&gt;:::important
The &lt;code&gt;.env&lt;/code&gt; file should be in the same directory as &lt;code&gt;wordpress-traefik-letsencrypt-docker-compose.yml&lt;/code&gt;.
:::&lt;/p&gt;
&lt;p&gt;Now let&apos;s start WordPress with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose -f wordpress-traefik-letsencrypt-docker-compose.yml -p wordpress up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-wordpress-using-docker-compose-5.webp&quot; alt=&quot;Install WordPress Using Docker Compose - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the WordPress management panel, go to &lt;code&gt;https://wordpress.heyvaldemar.net/wp-admin&lt;/code&gt; from your workstation, where &lt;code&gt;wordpress.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik service, which will redirect the request to WordPress.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Enter the username and password previously set in the &lt;code&gt;.env&lt;/code&gt; file, and click the &quot;Log In&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-wordpress-using-docker-compose-6.webp&quot; alt=&quot;Install WordPress Using Docker Compose - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the WordPress control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-wordpress-using-docker-compose-7.webp&quot; alt=&quot;Install WordPress Using Docker Compose - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Traefik control panel, go to &lt;code&gt;https://traefik.wordpress.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;traefik.wordpress.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Enter the username and password previously set in the &lt;code&gt;.env&lt;/code&gt; file, and click the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-wordpress-using-docker-compose-8.webp&quot; alt=&quot;Install WordPress Using Docker Compose - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Traefik control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-wordpress-using-docker-compose-9.webp&quot; alt=&quot;Install WordPress Using Docker Compose - Step 9&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Self-Hosting</category><category>WordPress</category><category>Docker</category><category>CMS</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Gitea Using Docker Compose</title><link>https://heyvaldemar.com/install-gitea-using-docker-compose/</link><guid isPermaLink="true">https://heyvaldemar.com/install-gitea-using-docker-compose/</guid><description>Learn how to install Gitea using Docker Compose and Traefik with free SSL from Let&apos;s Encrypt. Self-host your Git service with secure Git over SSH.</description><pubDate>Sat, 02 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Gitea using Docker Compose.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://gitea.com/&quot;&gt;Gitea&lt;/a&gt; is a forge software package for hosting software development version control using Git as well as other collaborative features like bug tracking, code review, continuous integration, kanban boards, tickets, and wikis. It supports self-hosting but also provides a free public first-party instance.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted Gitea when you need a lightweight Git server with minimal resource footprint and full control over repository data. GitHub or GitLab.com provide managed alternatives with CI/CD, package registries, and project management built in. Self-hosting Gitea is justified for air-gapped environments, edge deployments, or when you need a Git backend without per-user licensing costs.
:::&lt;/p&gt;
&lt;p&gt;💾 &lt;strong&gt;You can find the repository used in this guide on &lt;a href=&quot;https://github.com/heyvaldemar/gitea-traefik-letsencrypt-docker-compose&quot;&gt;GitHub&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;heyvaldemar/gitea-traefik-letsencrypt-docker-compose&quot;}&lt;/p&gt;
&lt;p&gt;:::note
We&apos;ll use &lt;a href=&quot;https://traefik.io/traefik/&quot;&gt;Traefik&lt;/a&gt; as our reverse proxy. It&apos;ll handle obtaining cryptographic certificates from &lt;a href=&quot;https://letsencrypt.org/&quot;&gt;Let&apos;s Encrypt&lt;/a&gt; for your domain names and route requests to the corresponding services based on those domains.
:::&lt;/p&gt;
&lt;p&gt;:::caution
To obtain cryptographic certificates, you will need A-type records in the external DNS zone, which point to the IP address of your server where Traefik is installed. If you have created these records recently, you should wait before starting the installation of the services. Full replication of these records between DNS servers can take from a few minutes to 48 hours or even longer in rare cases.
:::&lt;/p&gt;
&lt;p&gt;:::important
Docker Engine and Docker Compose must be installed on the server.&lt;/p&gt;
&lt;p&gt;For a step-by-step guide on installing Docker Engine on Ubuntu Server, see &lt;a href=&quot;/install-docker-engine-and-docker-compose-on-ubuntu-server/&quot;&gt;Install Docker Engine and Docker Compose on Ubuntu Server&lt;/a&gt;
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on the server you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to obtain a free cryptographic certificate through the Let&apos;s Encrypt certification center.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the Gitea web interface.&lt;/li&gt;
&lt;li&gt;TCP port 2222 - for secure SSH Git operations, user SSH key management, encrypted data transfer, and server administration tasks.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which Gitea is planned to be installed.&lt;/p&gt;
&lt;p&gt;Now it is necessary to create networks for your services.&lt;/p&gt;
&lt;p&gt;We create a network for Traefik using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create traefik-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-gitea-using-docker-compose-1.webp&quot; alt=&quot;Install Gitea Using Docker Compose - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;We create a network for Gitea using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create gitea-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-gitea-using-docker-compose-2.webp&quot; alt=&quot;Install Gitea Using Docker Compose - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to clone the repository that contains the configuration files, which include all the necessary conditions for Gitea to work.&lt;/p&gt;
&lt;p&gt;You can clone the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/heyvaldemar/gitea-traefik-letsencrypt-docker-compose.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-gitea-using-docker-compose-3.webp&quot; alt=&quot;Install Gitea Using Docker Compose - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Navigate to the directory with the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd gitea-traefik-letsencrypt-docker-compose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-gitea-using-docker-compose-4.webp&quot; alt=&quot;Install Gitea Using Docker Compose - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to change the variables in the &lt;code&gt;.env&lt;/code&gt; file according to your requirements.&lt;/p&gt;
&lt;p&gt;:::important
The &lt;code&gt;.env&lt;/code&gt; file should be in the same directory as &lt;code&gt;gitea-traefik-letsencrypt-docker-compose.yml&lt;/code&gt;.
:::&lt;/p&gt;
&lt;p&gt;Now let&apos;s start Gitea with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose -f gitea-traefik-letsencrypt-docker-compose.yml -p gitea up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-gitea-using-docker-compose-5.webp&quot; alt=&quot;Install Gitea Using Docker Compose - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Gitea management panel, go to &lt;code&gt;https://gitea.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;gitea.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik service, which will redirect the request to Gitea.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Click on the &quot;Sing In&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-gitea-using-docker-compose-6.webp&quot; alt=&quot;Install Gitea Using Docker Compose - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Enter the username and password previously set in the &lt;code&gt;.env&lt;/code&gt; file, and click the &quot;Sign In&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-gitea-using-docker-compose-7.webp&quot; alt=&quot;Install Gitea Using Docker Compose - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Gitea control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-gitea-using-docker-compose-8.webp&quot; alt=&quot;Install Gitea Using Docker Compose - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Traefik control panel, go to &lt;code&gt;https://traefik.gitea.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;traefik.gitea.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Enter the username and password previously set in the &lt;code&gt;.env&lt;/code&gt; file, and click the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-gitea-using-docker-compose-9.webp&quot; alt=&quot;Install Gitea Using Docker Compose - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Traefik control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-gitea-using-docker-compose-10.webp&quot; alt=&quot;Install Gitea Using Docker Compose - Step 10&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Self-Hosting</category><category>Gitea</category><category>Docker</category><category>Git</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Keycloak Using Docker Compose</title><link>https://heyvaldemar.com/install-keycloak-using-docker-compose/</link><guid isPermaLink="true">https://heyvaldemar.com/install-keycloak-using-docker-compose/</guid><description>Learn how to install Keycloak using Docker Compose with Traefik and Let&apos;s Encrypt. Step-by-step setup for secure identity and access management on your server.</description><pubDate>Fri, 01 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import VideoPlayer from &quot;@components/VideoPlayer.astro&quot;;&lt;/p&gt;
&lt;p&gt;&amp;lt;VideoPlayer
videoId=&quot;H7XKDHjjCd0&quot;
title=&quot;Install Keycloak Using Docker Compose&quot;
/&amp;gt;&lt;/p&gt;
&lt;p&gt;Want a straight, detailed walkthrough of getting Keycloak running under Docker Compose? This is it.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.keycloak.org/&quot;&gt;Keycloak&lt;/a&gt; is open-source software that handles single sign-on, identity, and access management for modern applications and services.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted Keycloak when your architecture requires an on-premises identity provider with full control over authentication flows, SAML/OIDC configuration, and user federation. Auth0 or Okta provide managed alternatives with faster setup and built-in compliance certifications. Self-hosting is justified when data residency rules prohibit external identity providers or when per-user SaaS pricing becomes prohibitive at scale.
:::&lt;/p&gt;
&lt;p&gt;:::note[Supply chain posture]
The template pins all three upstream images (Traefik, PostgreSQL, Keycloak) to immutable &lt;code&gt;@sha256:...&lt;/code&gt; digests in &lt;code&gt;.env.example&lt;/code&gt;, rebuilds weekly via CI to catch upstream drift, and carries an &lt;a href=&quot;https://scorecard.dev/viewer/?uri=github.com/heyvaldemar/keycloak-traefik-letsencrypt-docker-compose&quot;&gt;OpenSSF Scorecard badge&lt;/a&gt;. See the repo&apos;s &lt;a href=&quot;https://github.com/heyvaldemar/keycloak-traefik-letsencrypt-docker-compose/blob/main/SECURITY.md&quot;&gt;&lt;code&gt;SECURITY.md&lt;/code&gt;&lt;/a&gt; for the disclosure policy and the production checklist in the README before exposing this to real users.
:::&lt;/p&gt;
&lt;p&gt;:::tip[Tested on every push]
The &lt;a href=&quot;https://github.com/heyvaldemar/keycloak-traefik-letsencrypt-docker-compose/actions/workflows/deployment-verification.yml?query=branch%3Amain&quot;&gt;deployment-verification workflow&lt;/a&gt; runs end-to-end backup/restore tests on every push, every pull request, and weekly. The tests boot the full compose stack and exercise backup creation, integrity (&lt;code&gt;gunzip -t&lt;/code&gt;), restore roundtrip, and prune logic. If you deploy this template literally and hit an issue, the green CI run is the evidence that the template itself works — most &quot;doesn&apos;t work&quot; cases trace to DNS propagation, firewall rules, or hostname mismatches.
:::&lt;/p&gt;
&lt;p&gt;💾 &lt;strong&gt;You can find the repository used in this guide on &lt;a href=&quot;https://github.com/heyvaldemar/keycloak-traefik-letsencrypt-docker-compose&quot;&gt;GitHub&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;heyvaldemar/keycloak-traefik-letsencrypt-docker-compose&quot;}&lt;/p&gt;
&lt;p&gt;:::note
&lt;a href=&quot;https://traefik.io/traefik/&quot;&gt;Traefik&lt;/a&gt; is our reverse proxy. It pulls cryptographic certificates from &lt;a href=&quot;https://letsencrypt.org/&quot;&gt;Let&apos;s Encrypt&lt;/a&gt; for your domain names and routes incoming requests to the right service based on the domain.
:::&lt;/p&gt;
&lt;p&gt;:::caution
To obtain cryptographic certificates, you will need A-type records in the external DNS zone, which point to the IP address of your server where Traefik is installed. If you have created these records recently, you should wait before starting the installation of the services. Full replication of these records between DNS servers can take from a few minutes to 48 hours or even longer in rare cases.
:::&lt;/p&gt;
&lt;p&gt;:::important
Docker Engine and Docker Compose must be installed on the server.&lt;/p&gt;
&lt;p&gt;For a step-by-step guide on installing Docker Engine on Ubuntu Server, see &lt;a href=&quot;/install-docker-engine-and-docker-compose-on-ubuntu-server/&quot;&gt;Install Docker Engine and Docker Compose on Ubuntu Server&lt;/a&gt;
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;Need OpenSSH? Install it with:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to obtain a free cryptographic certificate through the Let&apos;s Encrypt certification center.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the Keycloak web interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;Connect to the server where Keycloak is going to live.&lt;/p&gt;
&lt;p&gt;First, the networks. Keycloak and Traefik each get their own.&lt;/p&gt;
&lt;p&gt;Traefik&apos;s network:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create traefik-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And Keycloak&apos;s:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create keycloak-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now clone the repository. It carries the configuration files, and with them everything Keycloak needs to run:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/heyvaldemar/keycloak-traefik-letsencrypt-docker-compose.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Move into the directory you just cloned:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd keycloak-traefik-letsencrypt-docker-compose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The repository ships a &lt;code&gt;.env.example&lt;/code&gt; template with documented variables and &lt;code&gt;change_me_*&lt;/code&gt; placeholders for credentials. The real &lt;code&gt;.env&lt;/code&gt; file is gitignored. Copy the template to make your own:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cp .env.example .env
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Open &lt;code&gt;.env&lt;/code&gt; and swap the placeholders for real values. You need to fill in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;TRAEFIK_ACME_EMAIL&lt;/code&gt;: your email for Let&apos;s Encrypt renewal notices.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;TRAEFIK_HOSTNAME&lt;/code&gt; and &lt;code&gt;KEYCLOAK_HOSTNAME&lt;/code&gt; — your real domain names. Both must resolve to this server&apos;s public IP for the Let&apos;s Encrypt TLS-ALPN challenge to succeed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;KEYCLOAK_DB_PASSWORD&lt;/code&gt;: PostgreSQL password. Generate with:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;openssl rand -base64 24 | tr -d &apos;/+=&apos; | head -c 32
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;KEYCLOAK_ADMIN_PASSWORD&lt;/code&gt;: Keycloak bootstrap admin password. Same generation command.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;TRAEFIK_BASIC_AUTH&lt;/code&gt;: BCrypt hash for the Traefik dashboard login. Generate with:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker run --rm httpd:2.4 htpasswd -nbB traefikadmin &apos;YOUR_STRONG_PASSWORD&apos; | sed &apos;s/\$/\$\$/g&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::important
The &lt;code&gt;.env&lt;/code&gt; file must be in the same directory as &lt;code&gt;keycloak-traefik-letsencrypt-docker-compose.yml&lt;/code&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::tip[Fail-fast protection]
The compose file uses &lt;code&gt;${VAR:?...}&lt;/code&gt; syntax for every required variable. If any placeholder is left unchanged or any required variable is empty, &lt;code&gt;docker compose up&lt;/code&gt; fails immediately with a clear error — you cannot accidentally deploy the stack with placeholder credentials.
:::&lt;/p&gt;
&lt;p&gt;Start Keycloak:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose -f keycloak-traefik-letsencrypt-docker-compose.yml -p keycloak up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now open the management panel. From your workstation, go to &lt;code&gt;https://keycloak.heyvaldemar.net&lt;/code&gt;. That domain is mine. Use your own, the one that points at the IP of your Traefik server, and Traefik forwards the request to Keycloak.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Click the &quot;Administration Console&quot; button. Sign in with the &lt;code&gt;KEYCLOAK_ADMIN_USERNAME&lt;/code&gt; and &lt;code&gt;KEYCLOAK_ADMIN_PASSWORD&lt;/code&gt; you set in &lt;code&gt;.env&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;:::caution[Rotate the bootstrap admin]
The bootstrap admin is intended to get you into the Keycloak UI on first start. Once inside, create your real admin users (ideally through Keycloak&apos;s user federation or a second-factor-protected account), then disable or delete the bootstrap admin from the Keycloak UI. Leaving the bootstrap admin active in production is the single most common misconfiguration in self-hosted Keycloak deployments.
:::&lt;/p&gt;
&lt;p&gt;Traefik has its own panel. From your workstation, go to &lt;code&gt;https://traefik.keycloak.heyvaldemar.net&lt;/code&gt;. Again, that one is mine, so point your own domain at the IP of your Traefik server.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Authenticate with the Traefik dashboard credentials. The username (&lt;code&gt;traefikadmin&lt;/code&gt; by default) and the &lt;strong&gt;plaintext password&lt;/strong&gt; you passed to &lt;code&gt;htpasswd&lt;/code&gt; when you generated the &lt;code&gt;TRAEFIK_BASIC_AUTH&lt;/code&gt; BCrypt hash — not the hash itself. Browsers send the plaintext; Traefik verifies it against the stored BCrypt.&lt;/p&gt;
&lt;p&gt;:::tip[What to do next]
The Traefik dashboard is basic-auth-protected but basic auth is basic. For production, consider restricting the dashboard router to specific source IPs via Traefik&apos;s &lt;code&gt;IPAllowList&lt;/code&gt; middleware, or skip exposing it publicly and rely on &lt;code&gt;docker compose logs&lt;/code&gt;. The full production checklist is in the &lt;a href=&quot;https://github.com/heyvaldemar/keycloak-traefik-letsencrypt-docker-compose#production-checklist&quot;&gt;repository README&lt;/a&gt;.
:::&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Self-Hosting</category><category>Keycloak</category><category>Docker</category><category>IAM</category><category>Security</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Ghost Using Docker Compose</title><link>https://heyvaldemar.com/install-ghost-using-docker-compose/</link><guid isPermaLink="true">https://heyvaldemar.com/install-ghost-using-docker-compose/</guid><description>Install Ghost with Docker Compose and Traefik, complete with Let&apos;s Encrypt SSL. Launch a secure, self-hosted blogging platform in just a few steps.</description><pubDate>Thu, 31 Aug 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Ghost using Docker Compose.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://ghost.org/&quot;&gt;Ghost&lt;/a&gt; is a powerful app for new-media creators to publish, share, and grow a business around their content. It comes with modern tools to build a website, publish content, send newsletters &amp;amp; offer paid subscriptions to members.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted Ghost when you need full control over your publishing platform, custom themes, and direct database access for analytics. Ghost Pro eliminates infrastructure management at $9-199/month. Self-hosting is the better architecture when you require custom integrations, need to avoid vendor lock-in on content, or want to keep hosting costs fixed regardless of traffic spikes.
:::&lt;/p&gt;
&lt;p&gt;💾 &lt;strong&gt;You can find the repository used in this guide on &lt;a href=&quot;https://github.com/heyvaldemar/ghost-traefik-letsencrypt-docker-compose&quot;&gt;GitHub&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;heyvaldemar/ghost-traefik-letsencrypt-docker-compose&quot;}&lt;/p&gt;
&lt;p&gt;:::note
We&apos;ll use &lt;a href=&quot;https://traefik.io/traefik/&quot;&gt;Traefik&lt;/a&gt; as our reverse proxy. It&apos;ll handle obtaining cryptographic certificates from &lt;a href=&quot;https://letsencrypt.org/&quot;&gt;Let&apos;s Encrypt&lt;/a&gt; for your domain names and route requests to the corresponding services based on those domains.
:::&lt;/p&gt;
&lt;p&gt;:::caution
To obtain cryptographic certificates, you will need A-type records in the external DNS zone, which point to the IP address of your server where Traefik is installed. If you have created these records recently, you should wait before starting the installation of the services. Full replication of these records between DNS servers can take from a few minutes to 48 hours or even longer in rare cases.
:::&lt;/p&gt;
&lt;p&gt;:::important
Docker Engine and Docker Compose must be installed on the server.&lt;/p&gt;
&lt;p&gt;For a step-by-step guide on installing Docker Engine on Ubuntu Server, see &lt;a href=&quot;/install-docker-engine-and-docker-compose-on-ubuntu-server/&quot;&gt;Install Docker Engine and Docker Compose on Ubuntu Server&lt;/a&gt;
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on the server you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to obtain a free cryptographic certificate through the Let&apos;s Encrypt certification center.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the Ghost web interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which Ghost is planned to be installed.&lt;/p&gt;
&lt;p&gt;Now it is necessary to create networks for your services.&lt;/p&gt;
&lt;p&gt;We create a network for Traefik using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create traefik-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-ghost-using-docker-compose-1.webp&quot; alt=&quot;Install Ghost Using Docker Compose - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;We create a network for Ghost using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create ghost-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-ghost-using-docker-compose-2.webp&quot; alt=&quot;Install Ghost Using Docker Compose - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to clone the repository that contains the configuration files, which include all the necessary conditions for Ghost to work.&lt;/p&gt;
&lt;p&gt;You can clone the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/heyvaldemar/ghost-traefik-letsencrypt-docker-compose.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-ghost-using-docker-compose-3.webp&quot; alt=&quot;Install Ghost Using Docker Compose - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Navigate to the directory with the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd ghost-traefik-letsencrypt-docker-compose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-ghost-using-docker-compose-4.webp&quot; alt=&quot;Install Ghost Using Docker Compose - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to change the variables in the &lt;code&gt;.env&lt;/code&gt; file according to your requirements.&lt;/p&gt;
&lt;p&gt;:::important
The &lt;code&gt;.env&lt;/code&gt; file should be in the same directory as &lt;code&gt;ghost-traefik-letsencrypt-docker-compose.yml&lt;/code&gt;.
:::&lt;/p&gt;
&lt;p&gt;Now let&apos;s start Ghost with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose -f ghost-traefik-letsencrypt-docker-compose.yml -p ghost up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-ghost-using-docker-compose-5.webp&quot; alt=&quot;Install Ghost Using Docker Compose - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Ghost management panel, go to &lt;code&gt;https://ghost.heyvaldemar.net/ghost&lt;/code&gt; from your workstation, where &lt;code&gt;ghost.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik service, which will redirect the request to Ghost.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;The next step is to provide: the site title, your full name, an email address and a password to create a Ghost administrator account.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Create account &amp;amp; start publishing&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ghost-using-docker-compose-6.webp&quot; alt=&quot;Install Ghost Using Docker Compose - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Ghost control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ghost-using-docker-compose-7.webp&quot; alt=&quot;Install Ghost Using Docker Compose - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Traefik control panel, go to &lt;code&gt;https://traefik.ghost.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;traefik.ghost.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Enter the username and password previously set in the &lt;code&gt;.env&lt;/code&gt; file, and click the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ghost-using-docker-compose-8.webp&quot; alt=&quot;Install Ghost Using Docker Compose - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Traefik control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ghost-using-docker-compose-9.webp&quot; alt=&quot;Install Ghost Using Docker Compose - Step 9&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Self-Hosting</category><category>Ghost</category><category>Docker</category><category>Blogging</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Rocket.Chat Using Docker Compose</title><link>https://heyvaldemar.com/install-rocket-chat-using-docker-compose/</link><guid isPermaLink="true">https://heyvaldemar.com/install-rocket-chat-using-docker-compose/</guid><description>Step-by-step guide to install Rocket.Chat on Ubuntu Server using Docker Compose and Traefik with Let&apos;s Encrypt SSL. Ideal for secure team communication..</description><pubDate>Fri, 25 Aug 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Rocket.Chat using Docker Compose.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.rocket.chat/&quot;&gt;Rocket.Chat&lt;/a&gt; is an open-source fully customizable communications platform developed in JavaScript for organizations with high standards of data protection.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted Rocket.Chat when your organization requires on-premises team messaging with full message retention control and custom integrations. Slack or Microsoft Teams provide managed alternatives with richer ecosystems and lower operational overhead. Self-hosting is justified in regulated environments where chat data must remain within your network perimeter or when per-user SaaS costs exceed infrastructure expenses.
:::&lt;/p&gt;
&lt;p&gt;💾 &lt;strong&gt;You can find the repository used in this guide on &lt;a href=&quot;https://github.com/heyvaldemar/rocketchat-traefik-letsencrypt-docker-compose&quot;&gt;GitHub&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;heyvaldemar/rocketchat-traefik-letsencrypt-docker-compose&quot;}&lt;/p&gt;
&lt;p&gt;:::note
We&apos;ll use &lt;a href=&quot;https://traefik.io/traefik/&quot;&gt;Traefik&lt;/a&gt; as our reverse proxy. It&apos;ll handle obtaining cryptographic certificates from &lt;a href=&quot;https://letsencrypt.org/&quot;&gt;Let&apos;s Encrypt&lt;/a&gt; for your domain names and route requests to the corresponding services based on those domains.
:::&lt;/p&gt;
&lt;p&gt;:::caution
To obtain cryptographic certificates, you will need A-type records in the external DNS zone, which point to the IP address of your server where Traefik is installed. If you have created these records recently, you should wait before starting the installation of the services. Full replication of these records between DNS servers can take from a few minutes to 48 hours or even longer in rare cases.
:::&lt;/p&gt;
&lt;p&gt;:::important
Docker Engine and Docker Compose must be installed on the server.&lt;/p&gt;
&lt;p&gt;For a step-by-step guide on installing Docker Engine on Ubuntu Server, see &lt;a href=&quot;/install-docker-engine-and-docker-compose-on-ubuntu-server/&quot;&gt;Install Docker Engine and Docker Compose on Ubuntu Server&lt;/a&gt;
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on the server you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to obtain a free cryptographic certificate through the Let&apos;s Encrypt certification center.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the Rocket.Chat web interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which Rocket.Chat is planned to be installed.&lt;/p&gt;
&lt;p&gt;Now it is necessary to create networks for your services.&lt;/p&gt;
&lt;p&gt;We create a network for Traefik using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create traefik-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-using-docker-compose-1.webp&quot; alt=&quot;Install Rocket.Chat Using Docker Compose - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;We create a network for Rocket.Chat using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create rocketchat-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-using-docker-compose-2.webp&quot; alt=&quot;Install Rocket.Chat Using Docker Compose - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to clone the repository that contains the configuration files, which include all the necessary conditions for Rocket.Chat to work.&lt;/p&gt;
&lt;p&gt;You can clone the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/heyvaldemar/rocketchat-traefik-letsencrypt-docker-compose.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-using-docker-compose-3.webp&quot; alt=&quot;Install Rocket.Chat Using Docker Compose - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Navigate to the directory with the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd rocketchat-traefik-letsencrypt-docker-compose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-using-docker-compose-4.webp&quot; alt=&quot;Install Rocket.Chat Using Docker Compose - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to change the variables in the &lt;code&gt;.env&lt;/code&gt; file according to your requirements.&lt;/p&gt;
&lt;p&gt;:::important
The &lt;code&gt;.env&lt;/code&gt; file should be in the same directory as &lt;code&gt;rocketchat-traefik-letsencrypt-docker-compose.yml&lt;/code&gt;.
:::&lt;/p&gt;
&lt;p&gt;Now let&apos;s start Rocket.Chat with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose -f rocketchat-traefik-letsencrypt-docker-compose.yml -p rocketchat up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-using-docker-compose-5.webp&quot; alt=&quot;Install Rocket.Chat Using Docker Compose - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Rocket.Chat management panel, go to &lt;code&gt;https://rocketchat.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;rocketchat.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik service, which will redirect the request to Rocket.Chat.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Next, we need to create a new user who will have administrator rights in Rocket.Chat.&lt;/p&gt;
&lt;p&gt;In the &quot;Full name&quot; field, enter the first and last name for the new Rocket.Chat user.&lt;/p&gt;
&lt;p&gt;In the &quot;Username&quot; field, specify a login for the new Rocket.Chat user.&lt;/p&gt;
&lt;p&gt;In the &quot;Email&quot; field, provide a current email address for the new Rocket.Chat user.&lt;/p&gt;
&lt;p&gt;In the &quot;Password&quot; field, set a secure password for the new Rocket.Chat user.&lt;/p&gt;
&lt;p&gt;Click the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-using-docker-compose-6.webp&quot; alt=&quot;Install Rocket.Chat Using Docker Compose - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now, you need to fill in the information about your organization.&lt;/p&gt;
&lt;p&gt;In the &quot;Organization name&quot; field, enter the name of your organization.&lt;/p&gt;
&lt;p&gt;In the &quot;Organization industry&quot; field, specify the profile or sector of your organization.&lt;/p&gt;
&lt;p&gt;In the &quot;Organization size&quot; field, indicate the number of employees in your organization.&lt;/p&gt;
&lt;p&gt;In the &quot;Country&quot; field, specify the country where your organization operates.&lt;/p&gt;
&lt;p&gt;Click the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-using-docker-compose-7.webp&quot; alt=&quot;Install Rocket.Chat Using Docker Compose - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now, you need to register your server to use services such as mobile push notifications, integration with external providers, and more.&lt;/p&gt;
&lt;p&gt;In the &quot;Cloud account email&quot; field, provide a current email address.&lt;/p&gt;
&lt;p&gt;Next, you should read and accept the terms of use for the provided services.&lt;/p&gt;
&lt;p&gt;Click the &quot;Register&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-using-docker-compose-8.webp&quot; alt=&quot;Install Rocket.Chat Using Docker Compose - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;You will receive an email at the address provided earlier with a link to register your Rocket.Chat server.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-using-docker-compose-9.webp&quot; alt=&quot;Install Rocket.Chat Using Docker Compose - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Find the email and click on the &quot;Verify registration&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-using-docker-compose-10.webp&quot; alt=&quot;Install Rocket.Chat Using Docker Compose - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;Your server has been successfully registered.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-using-docker-compose-11.webp&quot; alt=&quot;Install Rocket.Chat Using Docker Compose - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Rocket.Chat control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-using-docker-compose-12.webp&quot; alt=&quot;Install Rocket.Chat Using Docker Compose - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Traefik control panel, go to &lt;code&gt;https://traefik.rocketchat.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;traefik.rocketchat.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Enter the username and password previously set in the &lt;code&gt;.env&lt;/code&gt; file, and click the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-using-docker-compose-13.webp&quot; alt=&quot;Install Rocket.Chat Using Docker Compose - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Traefik control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-using-docker-compose-14.webp&quot; alt=&quot;Install Rocket.Chat Using Docker Compose - Step 14&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Self-Hosting</category><category>Rocket.Chat</category><category>Docker</category><category>Chat</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install GitLab Using Docker Compose</title><link>https://heyvaldemar.com/install-gitlab-using-docker-compose/</link><guid isPermaLink="true">https://heyvaldemar.com/install-gitlab-using-docker-compose/</guid><description>Step-by-step guide to install GitLab using Docker Compose and Traefik with Let&apos;s Encrypt SSL. Host your own GitLab server with CI/CD and SSH access.</description><pubDate>Tue, 22 Aug 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing GitLab using Docker Compose.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://gitlab.com/&quot;&gt;GitLab&lt;/a&gt; is an open-source end-to-end software development platform with built-in version control, issue tracking, code review, CI/CD, and more.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted GitLab when your organization requires on-premises source control with integrated CI/CD and compliance scanning. GitLab.com and GitHub provide managed alternatives that eliminate runner maintenance and infrastructure scaling. Self-hosting is justified when regulatory requirements prohibit cloud-hosted source code or when you need unlimited CI minutes without per-seat cost scaling.
:::&lt;/p&gt;
&lt;p&gt;💾 &lt;strong&gt;You can find the repository used in this guide on &lt;a href=&quot;https://github.com/heyvaldemar/gitlab-traefik-letsencrypt-docker-compose&quot;&gt;GitHub&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;heyvaldemar/gitlab-traefik-letsencrypt-docker-compose&quot;}&lt;/p&gt;
&lt;p&gt;:::note
We&apos;ll use &lt;a href=&quot;https://traefik.io/traefik/&quot;&gt;Traefik&lt;/a&gt; as our reverse proxy. It&apos;ll handle obtaining cryptographic certificates from &lt;a href=&quot;https://letsencrypt.org/&quot;&gt;Let&apos;s Encrypt&lt;/a&gt; for your domain names and route requests to the corresponding services based on those domains.
:::&lt;/p&gt;
&lt;p&gt;:::caution
To obtain cryptographic certificates, you will need A-type records in the external DNS zone, which point to the IP address of your server where Traefik is installed. If you have created these records recently, you should wait before starting the installation of the services. Full replication of these records between DNS servers can take from a few minutes to 48 hours or even longer in rare cases.
:::&lt;/p&gt;
&lt;p&gt;:::important
Docker Engine and Docker Compose must be installed on the server.&lt;/p&gt;
&lt;p&gt;For a step-by-step guide on installing Docker Engine on Ubuntu Server, see &lt;a href=&quot;/install-docker-engine-and-docker-compose-on-ubuntu-server/&quot;&gt;Install Docker Engine and Docker Compose on Ubuntu Server&lt;/a&gt;
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on the server you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to obtain a free cryptographic certificate through the Let&apos;s Encrypt certification center.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the GitLab web interface.&lt;/li&gt;
&lt;li&gt;TCP port 2222 - for secure SSH Git operations, user SSH key management, encrypted data transfer, and server administration tasks.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which GitLab is planned to be installed.&lt;/p&gt;
&lt;p&gt;Now it is necessary to create networks for your services.&lt;/p&gt;
&lt;p&gt;We create a network for Traefik using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create traefik-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-gitlab-using-docker-compose-1.webp&quot; alt=&quot;Install GitLab Using Docker Compose - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;We create a network for GitLab using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create gitlab-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-gitlab-using-docker-compose-2.webp&quot; alt=&quot;Install GitLab Using Docker Compose - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to clone the repository that contains the configuration files, which include all the necessary conditions for GitLab to work.&lt;/p&gt;
&lt;p&gt;You can clone the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/heyvaldemar/gitlab-traefik-letsencrypt-docker-compose.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-gitlab-using-docker-compose-3.webp&quot; alt=&quot;Install GitLab Using Docker Compose - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Navigate to the directory with the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd gitlab-traefik-letsencrypt-docker-compose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-gitlab-using-docker-compose-4.webp&quot; alt=&quot;Install GitLab Using Docker Compose - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to change the variables in the &lt;code&gt;.env&lt;/code&gt; file according to your requirements.&lt;/p&gt;
&lt;p&gt;:::important
The &lt;code&gt;.env&lt;/code&gt; file should be in the same directory as &lt;code&gt;gitlab-traefik-letsencrypt-docker-compose.yml&lt;/code&gt;.
:::&lt;/p&gt;
&lt;p&gt;Now let&apos;s start GitLab with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose -f gitlab-traefik-letsencrypt-docker-compose.yml -p gitlab up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-gitlab-using-docker-compose-5.webp&quot; alt=&quot;Install GitLab Using Docker Compose - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now, let&apos;s retrieve the password for the root user. This will allow you to log into the GitLab management panel.&lt;/p&gt;
&lt;p&gt;Use the following command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo docker exec -it $(sudo docker ps -aqf &quot;name=gitlab-gitlab-1&quot;) grep &apos;Password:&apos; /etc/gitlab/initial_root_password
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-gitlab-using-docker-compose-6.webp&quot; alt=&quot;Install GitLab Using Docker Compose - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;The password for the root user has been successfully retrieved.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-gitlab-using-docker-compose-7.webp&quot; alt=&quot;Install GitLab Using Docker Compose - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the GitLab management panel, go to &lt;code&gt;https://gitlab.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;gitlab.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik service, which will redirect the request to GitLab.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Use &lt;code&gt;root&lt;/code&gt; as the username and the previously obtained password, then click the &quot;Sign in&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-gitlab-using-docker-compose-8.webp&quot; alt=&quot;Install GitLab Using Docker Compose - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the GitLab control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-gitlab-using-docker-compose-9.webp&quot; alt=&quot;Install GitLab Using Docker Compose - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, let&apos;s retrieve the registration token for the GitLab Runner and register it to handle upcoming CI/CD jobs.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.gitlab.com/runner/&quot;&gt;GitLab Runner&lt;/a&gt; is the open-source project that is used to run your CI/CD jobs and send the results back to GitLab.&lt;/p&gt;
&lt;p&gt;To view the GitLab Runner&apos;s configuration, go to &lt;code&gt;https://gitlab.heyvaldemar.net/admin/runners&lt;/code&gt; from your workstation, where &lt;code&gt;gitlab.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik service, which will redirect the request to GitLab.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Click on the three dots on the right to access the menu, then copy the registration token.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-gitlab-using-docker-compose-10.webp&quot; alt=&quot;Install GitLab Using Docker Compose - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, let&apos;s register the GitLab Runner.&lt;/p&gt;
&lt;p&gt;Return to the Terminal emulator.&lt;/p&gt;
&lt;p&gt;:::caution
Remember to replace &lt;code&gt;REGISTRATION_TOKEN&lt;/code&gt; with the &quot;Registration token&quot; value you received in the previous step on the GitLab web interface.
:::&lt;/p&gt;
&lt;p&gt;To register the runner, use the following command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;REGISTRATION_TOKEN=LgcfPEKgawRTGR8P4uPQ &amp;amp;&amp;amp; \
docker exec -it $(sudo docker ps -aqf &quot;name=gitlab-runner-1&quot;) gitlab-runner register \
  --non-interactive \
  --url &quot;http://gitlab/&quot; \
  --registration-token &quot;$REGISTRATION_TOKEN&quot; \
  --executor &quot;docker&quot; \
  --docker-image docker:stable \
  --description &quot;docker-runner-1&quot; \
  --tag-list &quot;docker,linux&quot; \
  --run-untagged=&quot;true&quot; \
  --docker-privileged \
  --output-limit &quot;50000000&quot; \
  --access-level=&quot;not_protected&quot; \
  --docker-volumes &quot;/var/run/docker.sock:/var/run/docker.sock&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-gitlab-using-docker-compose-11.webp&quot; alt=&quot;Install GitLab Using Docker Compose - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;GitLab Runner has been successfully registered and is ready to work.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-gitlab-using-docker-compose-12.webp&quot; alt=&quot;Install GitLab Using Docker Compose - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;Return to the web interface and verify that the GitLab Runner is now online.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-gitlab-using-docker-compose-13.webp&quot; alt=&quot;Install GitLab Using Docker Compose - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Traefik control panel, go to &lt;code&gt;https://traefik.gitlab.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;traefik.gitlab.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Enter the username and password previously set in the &lt;code&gt;.env&lt;/code&gt; file, and click the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-gitlab-using-docker-compose-14.webp&quot; alt=&quot;Install GitLab Using Docker Compose - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Traefik control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-gitlab-using-docker-compose-15.webp&quot; alt=&quot;Install GitLab Using Docker Compose - Step 15&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Self-Hosting</category><category>GitLab</category><category>Docker</category><category>DevOps</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Docker Desktop&apos;s Performance Odyssey Over a Year of Innovations</title><link>https://heyvaldemar.com/docker-desktops-performance-odyssey-over-a-year-of-innovations/</link><guid isPermaLink="true">https://heyvaldemar.com/docker-desktops-performance-odyssey-over-a-year-of-innovations/</guid><description>A year of Docker Desktop releases, benchmarked — startup time, file-sharing throughput, and container-to-host networking, with the numbers that actually moved.</description><pubDate>Wed, 16 Aug 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Docker Desktop changed a lot over the past year. Most of it lands where you feel it day to day: startup time, file-sharing throughput, container-to-host networking. A slow Docker Desktop means more waiting and more context-switching while you work.&lt;/p&gt;
&lt;p&gt;So I went through a year of releases and ran the benchmarks myself. Then I pulled out the changes that actually moved the numbers. Here&apos;s what shifted, and by how much.&lt;/p&gt;
&lt;h2&gt;2023: Docker Desktop&apos;s Performance Revolution&lt;/h2&gt;
&lt;p&gt;The 2023 releases are more than a version bump. Here&apos;s what changed, area by area.&lt;/p&gt;
&lt;h3&gt;1. Docker Daemon Startup Time&lt;/h3&gt;
&lt;p&gt;Startup got noticeably faster this year. Some configurations now initialize in just over 5 seconds. You get into your containers without sitting around for the daemon.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;Mac amd64&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;Mac arm64&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;Win amd64&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;Linux amd64&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Time&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;7.84 s&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;5.24 s&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;19.1 s&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;9.50 s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;2. Container Operations with Hyperfine&lt;/h3&gt;
&lt;p&gt;I benchmarked Docker across versions with hyperfine. v4.22 beats v4.11 every time. Container operations got faster, plain and simple.&lt;/p&gt;
&lt;p&gt;To install Hyperfine you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;brew install hyperfine
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Using the hyperfine Tool&lt;/h4&gt;
&lt;p&gt;To benchmark Docker commands, we&apos;ll use the &lt;code&gt;hyperfine&lt;/code&gt; tool. Here&apos;s how you can execute it:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;hyperfine -i -p &apos;docker stop ubuntu || :&apos; &apos;docker run -it --rm ubuntu echo&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What the flags do:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;-i&lt;/code&gt; lets hyperfine run the benchmark in interactive mode, so you see results as they come in.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;-p&lt;/code&gt; sets the warmup and benchmark commands for hyperfine.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The warmup command, &lt;code&gt;docker stop ubuntu || :&lt;/code&gt;, tells Docker to stop the ubuntu container if it&apos;s running. If it isn&apos;t, it just moves on.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The benchmark command, &lt;code&gt;docker run -it --rm ubuntu echo&lt;/code&gt;, starts the ubuntu container interactively and prints the current date and time.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Results for Docker Desktop v4.22&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;First Attempt:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;hyperfine -i -p &apos;docker stop ubuntu || :&apos; &apos;docker run -it --rm ubuntu echo&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;Benchmark 1: docker run -it --rm ubuntu echo
Time (mean ± σ): 44.3 ms ± 3.3 ms [User: 29.5 ms, System: 12.7 ms]
Range (min … max): 39.7 ms … 49.6 ms 10 runs
Warning: Ignoring non-zero exit code.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Second Attempt:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;hyperfine -i -p &apos;docker stop ubuntu || :&apos; &apos;docker run -it --rm ubuntu echo&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;Benchmark 1: docker run -it --rm ubuntu echo
Time (mean ± σ): 46.3 ms ± 2.3 ms [User: 29.4 ms, System: 12.4 ms]
Range (min … max): 43.1 ms … 52.5 ms 28 runs
Warning: Ignoring non-zero exit code.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Third Attempt:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;hyperfine -i -p &apos;docker stop ubuntu || :&apos; &apos;docker run -it --rm ubuntu echo&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;Benchmark 1: docker run -it --rm ubuntu echo
Time (mean ± σ): 46.5 ms ± 5.3 ms [User: 29.5 ms, System: 12.1 ms]
Range (min … max): 39.0 ms … 63.5 ms 28 runs
Warning: Ignoring non-zero exit code.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The first attempt averaged 44.3 milliseconds, give or take 3.3 milliseconds. So most runs landed between 41.0 and 47.6 milliseconds. Fastest was 39.7, slowest 49.6.&lt;/p&gt;
&lt;p&gt;Second attempt: 46.3 milliseconds on average, deviation 2.3 milliseconds. Most runs sat between 44.0 and 48.6 milliseconds. The quickest hit 43.1, the longest 52.5.&lt;/p&gt;
&lt;p&gt;Third attempt was noisier. Average 46.5 milliseconds, but the deviation jumped to 5.3 milliseconds. That spreads the bulk of runs across 41.2 to 51.8 milliseconds. They ranged from 39.0 all the way up to 63.5.&lt;/p&gt;
&lt;h4&gt;Results for Docker Desktop v4.11&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;First Attempt:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;hyperfine -i -p &apos;docker stop ubuntu || :&apos; &apos;docker run -it --rm ubuntu echo&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;Benchmark 1: docker run -it --rm ubuntu echo
Time (mean ± σ): 59.7 ms ± 3.2 ms [User: 36.4 ms, System: 15.6 ms]
Range (min … max): 55.0 ms … 68.3 ms 13 runs
Warning: Ignoring non-zero exit code.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Second Attempt:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;hyperfine -i -p &apos;docker stop ubuntu || :&apos; &apos;docker run -it --rm ubuntu echo&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;Benchmark 1: docker run -it --rm ubuntu echo
Time (mean ± σ): 56.7 ms ± 2.7 ms [User: 36.3 ms, System: 15.3 ms]
Range (min … max): 51.7 ms … 62.5 ms 13 runs
Warning: Ignoring non-zero exit code.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Third Attempt:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;hyperfine -i -p &apos;docker stop ubuntu || :&apos; &apos;docker run -it --rm ubuntu echo&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;Benchmark 1: docker run -it --rm ubuntu echo
Time (mean ± σ): 59.8 ms ± 4.5 ms [User: 36.4 ms, System: 15.3 ms]
Range (min … max): 51.2 ms … 69.5 ms 21 runs
Warning: Ignoring non-zero exit code.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Older version, slower numbers. First attempt averaged 59.7 milliseconds with a 3.2 millisecond deviation, so most runs fell between 56.5 and 62.9 milliseconds. Quickest was 55.0, longest 68.3.&lt;/p&gt;
&lt;p&gt;Second attempt came in a bit better: 56.7 milliseconds on average, deviation 2.7 milliseconds. Most runs landed between 54.0 and 59.4 milliseconds. The spread ran from 51.7 to 62.5.&lt;/p&gt;
&lt;p&gt;Third attempt averaged 59.8 milliseconds, deviation 4.5 milliseconds. Most runs were between 55.3 and 64.3 milliseconds. Fastest 51.2, slowest 69.5.&lt;/p&gt;
&lt;h4&gt;Final Results (Docker Desktop 4.11 vs 4.22)&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;Docker Desktop v4.11&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;Docker Desktop v4.22&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;First Attempt&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;55.0 - 68.3 ms&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;39.7 - 49.6 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Second Attempt&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;51.7 - 62.5 ms&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;43.1 - 52.5 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Third Attempt&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;51.2 - 69.5 ms&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;39.0 - 63.5 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;3. Resource Efficiency&lt;/h3&gt;
&lt;p&gt;The new Resource Saver is a real win. It watches what Docker is doing and trims usage down to what&apos;s actually needed. Your Mac stays responsive even when the workload spikes.&lt;/p&gt;
&lt;p&gt;Want to see it work? Start Docker Desktop and leave it idle for 30 seconds with no containers running. An icon shows up in the whale menu and in the dashboard sidebar. That&apos;s Resource Saver kicking in.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./docker-desktops-performance-odyssey-over-a-year-of-innovations-1.webp&quot; alt=&quot;Docker Desktop&apos;s Performance Odyssey Over a Year of Innovations - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Resource Saver tracks container activity. If Docker Desktop sits idle with nothing running for 30 seconds, it drops its memory and CPU usage on its own.&lt;/p&gt;
&lt;p&gt;The chart below shows what Resource Saver does to the memory footprint of all Docker Desktop processes. I measured it with the footprint CLI command, which collects memory data for a process or a group of processes.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./docker-desktops-performance-odyssey-over-a-year-of-innovations-2.webp&quot; alt=&quot;Docker Desktop&apos;s Performance Odyssey Over a Year of Innovations - Step 2&quot;&gt;&lt;/p&gt;
&lt;h3&gt;4.1 File Sharing with VirtioFS&lt;/h3&gt;
&lt;p&gt;File sharing has always been the sore spot in containerized development. VirtioFS changes that. File I/O is much faster now. Builds finish sooner, data moves quicker, and the whole loop feels less sluggish.&lt;/p&gt;
&lt;h4&gt;Types of File Sharing Mechanism&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File Sharing Mechanism&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Additional Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VirtioFS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A native file sharing mechanism supported by Docker Desktop. It&apos;s the fastest as it doesn&apos;t need extra software.&lt;/td&gt;
&lt;td&gt;Default file-sharing mechanism in DD 4.22.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;gRPC FUSE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Uses the gRPC protocol for file sharing. While slower than VirtioFS, it&apos;s faster than other mechanisms.&lt;/td&gt;
&lt;td&gt;Default option in DD 2.4.0.0 (2020). Consumes less CPU than osxfs, especially with numerous file events on the host.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;qemu-grpcfuse&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Uses the qemu hypervisor for file sharing. It&apos;s the slowest mechanism but viable for building Redis images.&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;hyperkit-grpcfuse&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Employs the hyperkit hypervisor for file sharing. Its speed is comparable to qemu-grpcfuse.&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;osxfs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A file system driver bridging macOS file system and the Linux-based system used by Docker containers.&lt;/td&gt;
&lt;td&gt;Default file-sharing mechanism in Docker for Mac 1.12.x.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;Enable VirtioFS&lt;/h4&gt;
&lt;p&gt;Open Docker Desktop settings and go to the &quot;General&quot; tab. Find &quot;Choose file sharing implementation for your containers&quot; and pick &quot;VirtioFS&quot;. Then click &quot;Apply &amp;amp; Restart&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./docker-desktops-performance-odyssey-over-a-year-of-innovations-3.webp&quot; alt=&quot;Docker Desktop&apos;s Performance Odyssey Over a Year of Innovations - Step 3&quot;&gt;&lt;/p&gt;
&lt;h4&gt;Steps to Set Up and Test VirtioFS&lt;/h4&gt;
&lt;p&gt;Create a directory using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;mkdir data
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Populate the Directory with a Large Data File (1GB of random data) using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;dd if=/dev/zero of=data/data.img bs=1M count=1000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Next, let&apos;s build the Docker Image using the command:&lt;/p&gt;
&lt;p&gt;First, create a Dockerfile with the following content:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-docker&quot;&gt;FROM ubuntu:latest

VOLUME /data

CMD [&quot;bash&quot;]

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then, build the Docker image using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker build -t virtiofs-demo:latest .
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Run the Docker Container using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker run -it --rm -v &quot;$(pwd)/data:/data&quot; virtiofs-demo
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;List the Running Containers using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker ps
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Expected output:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e47eb4731c80 virtiofs-demo &quot;bash&quot; 5 minutes ago Up 5 minutes gifted_lichterman
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Next, measure File Copy Time into the Container&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;time docker cp gifted_lichterman:/data/data.img data/data.img
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Expected result:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;Successfully copied 1.05GB to /Users/ajeetsraina/july/virt/data/data.img
docker cp gifted_lichterman:/data/data.img data/data.img 0.61s user 1.84s system 36% cpu 6.750 total
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Performance Comparison&lt;/h4&gt;
&lt;p&gt;Comparing Docker Desktop 4.22 vs 4.11 (without VirtioFS enabled)&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Data Size: 10GB Data Transfer&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;Docker Desktop v4.11&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;Docker Desktop v4.22&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Run #1&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;7 min 13.21 s&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;5 min 11.10 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Run #2&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;6 min 47.89 s&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;5 min 04.08 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Run #3&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;7 min 04.75 s&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;5 min 02.08 s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Comparing Docker Desktop 4.22 vs 4.11 (with VirtioFS enabled)&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Data Size: 10GB Data Transfer&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;Docker Desktop v4.11&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;Docker Desktop v4.22&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Run #1&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;2 min 18.55 s&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1 min 04.44 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Run #2&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;2 min 20.23 s&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1 min 06.21 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Run #3&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;2 min 15.65 s&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1 min 05.39 s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;4.2 Evaluating Docker Desktop&apos;s File-Sharing Performance&lt;/h3&gt;
&lt;p&gt;Every upgrade is partly about performance. With Docker Desktop, moving between versions isn&apos;t only new features. It&apos;s also tightening what&apos;s already there. The switch from VPNKit to gVisor mattered here. Container-to-host networking on macOS got up to 5x faster, so the things that used to crawl, like package downloads, move quickly now.&lt;/p&gt;
&lt;p&gt;In this part I measure how long it takes to build a Redis image from source using Docker Desktop&apos;s file sharing. The source comes in over a bind mount. I time the build inside the container.&lt;/p&gt;
&lt;h4&gt;Redis Build Process&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# !/bin/bash

rm -rf /tmp/redis
docker run --rm -v /tmp:/tmp alpine sh -c \
 &apos;cd /tmp ; apk add git ; git clone https://github.com/redis/redis --depth 1&apos;

docker run --rm -v /tmp/redis:/tmp/redis ubuntu bash -c \
 &apos;cd /tmp/redis ; apt update &amp;amp;&amp;amp; apt install -y make gcc ; make distclean &amp;amp;&amp;amp; time make&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Redis Build Performance&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;VirtioFS&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;gRPC FUSE&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;qemu-grpcfuse&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;hyperkit-grpcfuse&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Redis Build&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;2.78 min&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;3.54 min&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;6.68 min&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;5.19 min&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img src=&quot;./docker-desktops-performance-odyssey-over-a-year-of-innovations-4.webp&quot; alt=&quot;Docker Desktop&apos;s Performance Odyssey Over a Year of Innovations - Step 4&quot;&gt;&lt;/p&gt;
&lt;h4&gt;Postgres Build Process&lt;/h4&gt;
&lt;p&gt;First, the setup. The script below creates a Postgres network, starts a server, and fires off a pgbench client.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# !/bin/bash

IMG=postgres:alpine
NET=postgresnet
TESTDIR=/tmp/postgrestest/data
PGNAME=postgrestest
PGPASS=postgrespass

docker network rm -q $NET &amp;amp;&amp;gt;/dev/null

echo &quot;Setting up postgres network...&quot;
docker network create $NET

rm -rf $TESTDIR
mkdir -p $TESTDIR

echo &quot;Initiating postgres server...&quot;
docker run --name=${PGNAME} -e POSTGRES_PASSWORD=postgrespass --network ${NET} -p 5432:5432 -v ${TESTDIR}:/var/lib/postgresql/data -d ${IMG}

echo &quot;Launching postgres pgbench client...&quot;
docker run --network ${NET} alpine sh -c \
 &apos;apk add postgresql ; export PGPASSWORD=postgrespass; \
 pgbench --host=postgrestest -U postgres -i -s 10 postgres ; \
 pgbench --host=postgrestest -U postgres -c 10 -t 10 postgres&apos;

docker stop ${PGNAME} &amp;amp;&amp;gt;/dev/null
docker rm ${PGNAME} &amp;amp;&amp;gt;/dev/null
docker network rm -q $NET &amp;amp;&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Postgres Build Performance&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;4.11.1&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;4.22&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Postgresql tps (transactions/s)&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1000 tps&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;2600 tps&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Version 4.22 leaves 4.11.1 behind on transactions per second. It hits 2600 tps, more than double the 1000 tps the older build managed.&lt;/p&gt;
&lt;p&gt;The file-sharing mechanism you pick really moves build times. For something like a Redis build, VirtioFS is the one to use.&lt;/p&gt;
&lt;p&gt;Postgres transactions also improved a lot in 4.22, which points to real work under the hood in this release.&lt;/p&gt;
&lt;p&gt;VirtioFS wins on Redis builds, but pick your mechanism around the project. Compatibility and your specific needs come first.&lt;/p&gt;
&lt;p&gt;That jump in Postgres throughput from 4.11.1 to 4.22 is the kind of thing that makes the upgrade pay for itself.&lt;/p&gt;
&lt;h3&gt;5. Container Networking Enhancements&lt;/h3&gt;
&lt;p&gt;The 2023 updates leaned hard on networking, especially on macOS. Containers talk to each other more smoothly now. Data moves faster, latency drops, and the whole setup runs tighter.&lt;/p&gt;
&lt;p&gt;The big change was swapping VPNKit for gVisor on container-to-host networking. That landed in Docker Desktop 4.19, released in March 2023.&lt;/p&gt;
&lt;p&gt;:::note
In Docker Desktop 4.19, container-to-host networking performance was boosted by 5x on macOS, achieved by replacing vpnkit with the TCP/IP stack from the gVisor project.
:::&lt;/p&gt;
&lt;p&gt;gVisor is a lightweight, sandboxed container runtime that runs in user space. It&apos;s built on the Linux kernel but implemented in user space, which gives it an edge over VPNKit, a kernel-based solution.&lt;/p&gt;
&lt;p&gt;If your containers reach out to external servers, say &lt;code&gt;npm install&lt;/code&gt; or &lt;code&gt;apt-get&lt;/code&gt; pulling packages, this speedup pays off immediately.&lt;/p&gt;
&lt;h4&gt;Enabling gVisor&lt;/h4&gt;
&lt;p&gt;To check that Docker Desktop is on gVisor by default, run:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cat ~/Library/Group\ Containers/group.com.docker/settings.json | grep -i network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you want VPNKit back, add &quot;networkType&quot;:&quot;vpnkit&quot; to your settings.json file.&lt;/p&gt;
&lt;p&gt;Why gVisor over VPNKit:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Performance:&lt;/strong&gt; gVisor is faster than VPNKit, so containers run quicker.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security:&lt;/strong&gt; It&apos;s sandboxed, which means better protection against vulnerabilities.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resource Efficiency:&lt;/strong&gt; It uses fewer resources than VPNKit, so your Mac has more to spare.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Networking Benchmarks&lt;/h4&gt;
&lt;p&gt;Container to Container&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Benchmarking Tool:&lt;/strong&gt; iperf3/netperf&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# !/bin/bash

IMG=dockerpinata/iperf3:2.1
NET=iperf3net
SERVER=iperf3server
CLIENT=iperf3client

docker rm -f $SERVER &amp;amp;&amp;gt;/dev/null
docker network rm -q $NET &amp;amp;&amp;gt;/dev/null

echo &quot;Creating iperf3 network...&quot;
docker network create $NET

echo &quot;Starting iperf3 server...&quot;
docker run --rm -d --name=${SERVER} --network=${NET} ${IMG} /usr/bin/iperf3 -s -1

echo &quot;Starting iperf3 client...&quot;
docker run --rm --name=${CLIENT} --network=${NET} ${IMG} /usr/bin/iperf3 -c ${SERVER}

docker rm -f $SERVER &amp;amp;&amp;gt;/dev/null
docker network rm -q $NET &amp;amp;&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;Speed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mac amd64&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;41.5 Gb/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mac arm64&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;81.7 Gb/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Win amd64&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;46.1 Gb/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Linux amd64&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;56.3 Gb/s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Container to Host&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Benchmarking Tool:&lt;/strong&gt; iperf3/netperf&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# !/bin/bash

IMG=dockerpinata/iperf3:2.1

# This can be used to remove previous hanging iperf3 servers

# pkill iperf3

echo &quot;Starting iperf3 server...&quot;
iperf3 -s -1 &amp;amp;
IPERF3_SERVER_PID=$!

echo &quot;Starting iperf3 client...&quot;
docker run --rm ${IMG} /usr/bin/iperf3 -c host.docker.internal

kill $IPERF3_SERVER_PID &amp;amp;&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;Speed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mac amd64&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;686 Mb/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mac arm64&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1.50 Gb/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Win amd64&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;596 Mb/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Linux amd64&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1.62 Gb/s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Host to Container&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Benchmarking Tool:&lt;/strong&gt; iperf3/netperf&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# !/bin/bash

IMG=dockerpinata/iperf3:2.1
SERVER=iperf3server
docker rm -f $SERVER &amp;amp;&amp;gt;/dev/null
echo &quot;Starting iperf3 server...&quot;
docker run --rm -d -p 5201:5201 --name=${SERVER} ${IMG} /usr/bin/iperf3 -s -1
echo &quot;Starting iperf3 client...&quot;
iperf3 -c localhost
docker rm -f $SERVER &amp;amp;&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;4.11.1&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;4.22&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Container to Container&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;60 Gb/s&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;72 Gb/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Host to Container&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;420 Mb/s&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1.4 Gb/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Container to Host/internet&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;930 Mb/s&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;18 Gb/s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;6. Hardware Compatibility: Embracing Apple Silicon and Rosetta&lt;/h3&gt;
&lt;p&gt;Docker added a Rosetta feature, and it&apos;s a smart move. It closes the gap between Intel and Apple Silicon, so you get the same experience whatever hardware you&apos;re on.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./docker-desktops-performance-odyssey-over-a-year-of-innovations-5.webp&quot; alt=&quot;Docker Desktop&apos;s Performance Odyssey Over a Year of Innovations - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;That means you can drop this command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker run --platform=linux/amd64
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Like with VirtioFS, Rosetta brought speedups too. Someone in our community clocked a 7x boost, most of it on a DB migration that used to crawl.&lt;/p&gt;
&lt;h2&gt;What this means in practice&lt;/h2&gt;
&lt;p&gt;Every release this year chipped at the same problem: the gap between running a container on your laptop and running it the way production does. On macOS, the gVisor networking switch alone justifies the upgrade. It brought up to 5x faster container-to-host networking.&lt;/p&gt;
&lt;p&gt;Still on an older version? The gap isn&apos;t cosmetic anymore. You can read it in the build and startup numbers above. Update, push your own workload through it, and compare against what you had before.&lt;/p&gt;
&lt;p&gt;Happy coding, and until next time, keep containerizing!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Opinion &amp; Culture</category><category>Docker</category><category>Performance</category><category>Apple</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Mattermost Using Docker Compose</title><link>https://heyvaldemar.com/install-mattermost-using-docker-compose/</link><guid isPermaLink="true">https://heyvaldemar.com/install-mattermost-using-docker-compose/</guid><description>Step-by-step guide to install Mattermost with Docker Compose. Set up secure team chat using Traefik, Let&apos;s Encrypt, and Docker on your own server.</description><pubDate>Sun, 13 Aug 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Mattermost using Docker Compose.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mattermost.com/&quot;&gt;Mattermost&lt;/a&gt; is an open-source, self-hostable online chat service with file sharing, search, and integrations. It is designed as an internal chat for organisations and companies, and mostly markets itself as an open-source alternative to Slack and Microsoft Teams.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted Mattermost when your organization requires on-premises team communication with full message data ownership and custom compliance retention policies. Slack provides a managed alternative with richer app integrations and lower operational overhead. Self-hosting is justified in regulated industries where message data must remain within your network perimeter.
:::&lt;/p&gt;
&lt;p&gt;💾 &lt;strong&gt;You can find the repository used in this guide on &lt;a href=&quot;https://github.com/heyvaldemar/mattermost-traefik-letsencrypt-docker-compose&quot;&gt;GitHub&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;heyvaldemar/mattermost-traefik-letsencrypt-docker-compose&quot;}&lt;/p&gt;
&lt;p&gt;:::note
We&apos;ll use &lt;a href=&quot;https://traefik.io/traefik/&quot;&gt;Traefik&lt;/a&gt; as our reverse proxy. It&apos;ll handle obtaining cryptographic certificates from &lt;a href=&quot;https://letsencrypt.org/&quot;&gt;Let&apos;s Encrypt&lt;/a&gt; for your domain names and route requests to the corresponding services based on those domains.
:::&lt;/p&gt;
&lt;p&gt;:::caution
To obtain cryptographic certificates, you will need A-type records in the external DNS zone, which point to the IP address of your server where Traefik is installed. If you have created these records recently, you should wait before starting the installation of the services. Full replication of these records between DNS servers can take from a few minutes to 48 hours or even longer in rare cases.
:::&lt;/p&gt;
&lt;p&gt;:::important
Docker Engine and Docker Compose must be installed on the server.&lt;/p&gt;
&lt;p&gt;For a step-by-step guide on installing Docker Engine on Ubuntu Server, see &lt;a href=&quot;/install-docker-engine-and-docker-compose-on-ubuntu-server/&quot;&gt;Install Docker Engine and Docker Compose on Ubuntu Server&lt;/a&gt;
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on the server you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to obtain a free cryptographic certificate through the Let&apos;s Encrypt certification center.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the Mattermost web interface.&lt;/li&gt;
&lt;li&gt;UDP port 8443 - for handling secure voice calls within Mattermost.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which Mattermost is planned to be installed.&lt;/p&gt;
&lt;p&gt;Now it is necessary to create networks for your services.&lt;/p&gt;
&lt;p&gt;We create a network for Traefik using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create traefik-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-mattermost-using-docker-compose-1.webp&quot; alt=&quot;Install Mattermost Using Docker Compose - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;We create a network for Mattermost using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create mattermost-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-mattermost-using-docker-compose-2.webp&quot; alt=&quot;Install Mattermost Using Docker Compose - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to clone the repository that contains the configuration files, which include all the necessary conditions for Mattermost to work.&lt;/p&gt;
&lt;p&gt;You can clone the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/heyvaldemar/mattermost-traefik-letsencrypt-docker-compose.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-mattermost-using-docker-compose-3.webp&quot; alt=&quot;Install Mattermost Using Docker Compose - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Navigate to the directory with the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd mattermost-traefik-letsencrypt-docker-compose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-mattermost-using-docker-compose-4.webp&quot; alt=&quot;Install Mattermost Using Docker Compose - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to change the variables in the &lt;code&gt;.env&lt;/code&gt; file according to your requirements.&lt;/p&gt;
&lt;p&gt;:::important
The &lt;code&gt;.env&lt;/code&gt; file should be in the same directory as &lt;code&gt;mattermost-traefik-letsencrypt-docker-compose.yml&lt;/code&gt;.
:::&lt;/p&gt;
&lt;p&gt;Now let&apos;s start Mattermost with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose -f mattermost-traefik-letsencrypt-docker-compose.yml -p mattermost up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-mattermost-using-docker-compose-5.webp&quot; alt=&quot;Install Mattermost Using Docker Compose - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Mattermost management panel, go to &lt;code&gt;https://mattermost.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;mattermost.heyvaldemar.ne&lt;/code&gt;t` is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik service, which will redirect the request to Mattermost.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Next, you need to register to start using the Mattermost dashboard.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-mattermost-using-docker-compose-6.webp&quot; alt=&quot;Install Mattermost Using Docker Compose - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Traefik control panel, go to &lt;code&gt;https://traefik.mattermost.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;traefik.mattermost.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Enter the username and password previously set in the &lt;code&gt;.env&lt;/code&gt; file, and click the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-mattermost-using-docker-compose-7.webp&quot; alt=&quot;Install Mattermost Using Docker Compose - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Traefik control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-mattermost-using-docker-compose-8.webp&quot; alt=&quot;Install Mattermost Using Docker Compose - Step 8&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Self-Hosting</category><category>Mattermost</category><category>Docker</category><category>Chat</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Outline and Keycloak Using Docker Compose</title><link>https://heyvaldemar.com/install-outline-and-keycloak-using-docker-compose/</link><guid isPermaLink="true">https://heyvaldemar.com/install-outline-and-keycloak-using-docker-compose/</guid><description>Deploy Outline with Keycloak SSO, Traefik, and MinIO on Ubuntu using Docker Compose. A complete, secure wiki setup with SSL, access control, and cloud storage.</description><pubDate>Wed, 09 Aug 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Outline and Keycloak using Docker Compose.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.getoutline.com/&quot;&gt;Outline&lt;/a&gt; is a free standalone wiki engine and a collaborative knowledge base for teams.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted Outline with Keycloak when you need a knowledge base with enterprise SSO and full data ownership. Notion or Confluence Cloud provide managed alternatives with richer integrations and zero infrastructure overhead. Self-hosting is justified when compliance requires on-premises documentation storage or when you need centralized identity management across multiple self-hosted services.
:::&lt;/p&gt;
&lt;p&gt;💾 &lt;strong&gt;You can find the repository used in this guide on &lt;a href=&quot;https://github.com/heyvaldemar/outline-keycloak-traefik-letsencrypt-docker-compose&quot;&gt;GitHub&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;heyvaldemar/outline-keycloak-traefik-letsencrypt-docker-compose&quot;}&lt;/p&gt;
&lt;p&gt;:::note
In this guide, Outline will use user accounts created in &lt;a href=&quot;https://www.keycloak.org/&quot;&gt;Keycloak&lt;/a&gt; for access to the Outline management panel, and &lt;a href=&quot;https://min.io/&quot;&gt;MinIO&lt;/a&gt; for storing documents uploaded through Outline.
:::&lt;/p&gt;
&lt;p&gt;:::note
We&apos;ll use &lt;a href=&quot;https://traefik.io/traefik/&quot;&gt;Traefik&lt;/a&gt; as our reverse proxy. It&apos;ll handle obtaining cryptographic certificates from &lt;a href=&quot;https://letsencrypt.org/&quot;&gt;Let&apos;s Encrypt&lt;/a&gt; for your domain names and route requests to the corresponding services based on those domains.
:::&lt;/p&gt;
&lt;p&gt;:::caution
Remember that without a secure connection, the services will not work.
:::&lt;/p&gt;
&lt;p&gt;:::caution
To obtain cryptographic certificates, you will need A-type records in the external DNS zone, which point to the IP address of your server where Traefik is installed. If you have created these records recently, you should wait before starting the installation of the services. Full replication of these records between DNS servers can take from a few minutes to 48 hours or even longer in rare cases.
:::&lt;/p&gt;
&lt;p&gt;:::important
MinIO has a known limitation: you can&apos;t use your domain or subdomain as the bucket name. For instance, if your wiki address is &lt;code&gt;outline.&amp;lt;your-domain&amp;gt;.&amp;lt;tld&amp;gt;&lt;/code&gt;, choose a different name for your bucket.
:::&lt;/p&gt;
&lt;p&gt;:::caution
Ensure that your &lt;code&gt;AWS_S3_UPLOAD_BUCKET_URL&lt;/code&gt; that is set in the &lt;code&gt;.env&lt;/code&gt; file is a publicly accessible URL that corresponds to your domain. This is crucial because the Outline server will redirect traffic directly to MinIO.
:::&lt;/p&gt;
&lt;p&gt;:::important
Docker Engine and Docker Compose must be installed on the server.&lt;/p&gt;
&lt;p&gt;For a step-by-step guide on installing Docker Engine on Ubuntu Server, see &lt;a href=&quot;/install-docker-engine-and-docker-compose-on-ubuntu-server/&quot;&gt;Install Docker Engine and Docker Compose on Ubuntu Server&lt;/a&gt;
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on the server you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to obtain a free cryptographic certificate through the Let&apos;s Encrypt certification center.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the Outline web interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which Outline is planned to be installed.&lt;/p&gt;
&lt;p&gt;Now it is necessary to create networks for your services.&lt;/p&gt;
&lt;p&gt;We create a network for Traefik using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create traefik-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-outline-and-keycloak-using-docker-compose-1.webp&quot; alt=&quot;Install Outline and Keycloak Using Docker Compose - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;We create a network for Keycloak using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create keycloak-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-outline-and-keycloak-using-docker-compose-2.webp&quot; alt=&quot;Install Outline and Keycloak Using Docker Compose - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;We create a network for Outline using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create outline-network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-outline-and-keycloak-using-docker-compose-3.webp&quot; alt=&quot;Install Outline and Keycloak Using Docker Compose - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to clone the repository that contains the configuration files, which include all the necessary conditions for Outline to work.&lt;/p&gt;
&lt;p&gt;You can clone the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/heyvaldemar/outline-keycloak-traefik-letsencrypt-docker-compose.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-outline-and-keycloak-using-docker-compose-4.webp&quot; alt=&quot;Install Outline and Keycloak Using Docker Compose - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Navigate to the directory with the repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd outline-keycloak-traefik-letsencrypt-docker-compose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-outline-and-keycloak-using-docker-compose-5.webp&quot; alt=&quot;Install Outline and Keycloak Using Docker Compose - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to change the variables in the &lt;code&gt;.env&lt;/code&gt; file according to your requirements.&lt;/p&gt;
&lt;p&gt;:::important
MinIO has a known limitation: you can&apos;t use your domain or subdomain as the bucket name. For instance, if your wiki address is &lt;code&gt;outline.&amp;lt;your-domain&amp;gt;.&amp;lt;tld&amp;gt;&lt;/code&gt;, choose a different name for your bucket.
:::&lt;/p&gt;
&lt;p&gt;:::caution
Ensure that your &lt;code&gt;AWS_S3_UPLOAD_BUCKET_URL&lt;/code&gt; that is set in the &lt;code&gt;.env&lt;/code&gt; file is a publicly accessible URL that corresponds to your domain. This is crucial because the Outline server will redirect traffic directly to MinIO.
:::&lt;/p&gt;
&lt;p&gt;:::important
The &lt;code&gt;.env&lt;/code&gt; file should be in the same directory as &lt;code&gt;01-traefik-outline-letsencrypt-docker-compose.yml&lt;/code&gt;, &lt;code&gt;02-keycloak-outline-docker-compose.yml&lt;/code&gt;, and &lt;code&gt;03-outline-minio-redis-docker-compose.yml&lt;/code&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::caution
The value for the &lt;code&gt;OUTLINE_OIDC_CLIENT_SECRET&lt;/code&gt; variable can be obtained after installing Keycloak using &lt;code&gt;02-keycloak-outline-docker-compose.yml&lt;/code&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::caution
Additionally, you need to specify your values for &lt;code&gt;OUTLINE_SECRET_KEY&lt;/code&gt; and &lt;code&gt;OUTLINE_UTILS_SECRET&lt;/code&gt;.
:::&lt;/p&gt;
&lt;p&gt;The values for &lt;code&gt;OUTLINE_SECRET_KEY&lt;/code&gt; and &lt;code&gt;OUTLINE_UTILS_SECRET&lt;/code&gt; can be generated using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;openssl rand -hex 32
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now we will start Traefik using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose -f 01-traefik-outline-letsencrypt-docker-compose.yml -p traefik up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-outline-and-keycloak-using-docker-compose-6.webp&quot; alt=&quot;Install Outline and Keycloak Using Docker Compose - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, we will start Keycloak using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose -f 02-keycloak-outline-docker-compose.yml -p keycloak up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-outline-and-keycloak-using-docker-compose-7.webp&quot; alt=&quot;Install Outline and Keycloak Using Docker Compose - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;From the workstation, navigate to the link &lt;code&gt;https://keycloak.outline.heyvaldemar.net&lt;/code&gt;, where &lt;code&gt;keycloak.outline.heyvaldemar.net&lt;/code&gt; is the name of my subdomain for accessing the Keycloak management panel. Accordingly, you need to specify your domain name, which points to the IP address of your server with the installed Traefik service, which will redirect the request to Keycloak.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Administration Console&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-outline-and-keycloak-using-docker-compose-8.webp&quot; alt=&quot;Install Outline and Keycloak Using Docker Compose - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Enter the username and password that you previously set in the &lt;code&gt;.env&lt;/code&gt; file, and click the &quot;Sign In&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-outline-and-keycloak-using-docker-compose-9.webp&quot; alt=&quot;Install Outline and Keycloak Using Docker Compose - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to create a new Realm and configure it correctly so that users can log into Outline using Keycloak.&lt;/p&gt;
&lt;p&gt;Click the &quot;Create Realm&quot; button in the upper left corner.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-outline-and-keycloak-using-docker-compose-10.webp&quot; alt=&quot;Install Outline and Keycloak Using Docker Compose - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Realm name&quot; field, enter &quot;outline-solid&quot; (in lowercase) and click the &quot;Create&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-outline-and-keycloak-using-docker-compose-11.webp&quot; alt=&quot;Install Outline and Keycloak Using Docker Compose - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, select &quot;Clients&quot; in the &quot;Manage&quot; section and click the &quot;Create client&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-outline-and-keycloak-using-docker-compose-12.webp&quot; alt=&quot;Install Outline and Keycloak Using Docker Compose - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Client type&quot; field, select &quot;OpenID Connect&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Client ID&quot; field, enter &quot;outline-solid&quot; (in lowercase) and click the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-outline-and-keycloak-using-docker-compose-13.webp&quot; alt=&quot;Install Outline and Keycloak Using Docker Compose - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to enable &quot;Client authentication&quot; and select &quot;Standard flow&quot; in the &quot;Authentication flow&quot; section.&lt;/p&gt;
&lt;p&gt;All other values should be disabled.&lt;/p&gt;
&lt;p&gt;Click the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-outline-and-keycloak-using-docker-compose-14.webp&quot; alt=&quot;Install Outline and Keycloak Using Docker Compose - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Root URL&quot; field, enter &lt;code&gt;https://outline.heyvaldemar.net/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Home URL&quot; field, enter &lt;code&gt;https://outline.heyvaldemar.net/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Valid redirect URIs&quot; field, enter &lt;code&gt;https://outline.heyvaldemar.net/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;:::note
&lt;code&gt;outline.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name, which points to the IP address of your server with the installed Traefik service, which will redirect the request to Outline.
:::&lt;/p&gt;
&lt;p&gt;Click the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-outline-and-keycloak-using-docker-compose-15.webp&quot; alt=&quot;Install Outline and Keycloak Using Docker Compose - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;Navigate to the &quot;Credentials&quot; tab and copy the contents of the &quot;Client secret&quot; field.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-outline-and-keycloak-using-docker-compose-16.webp&quot; alt=&quot;Install Outline and Keycloak Using Docker Compose - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;Paste the copied contents of the &quot;Client secret&quot; field into the &lt;code&gt;OUTLINE_OIDC_CLIENT_SECRET&lt;/code&gt; variable in the &lt;code&gt;.env&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-outline-and-keycloak-using-docker-compose-17.webp&quot; alt=&quot;Install Outline and Keycloak Using Docker Compose - Step 17&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s create a user who will be able to log into Outline using Keycloak.&lt;/p&gt;
&lt;p&gt;Select &quot;Users&quot; in the &quot;Manage&quot; section and click the &quot;Add user&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-outline-and-keycloak-using-docker-compose-18.webp&quot; alt=&quot;Install Outline and Keycloak Using Docker Compose - Step 18&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, you need to specify: username, email address, first name, last name, and password.&lt;/p&gt;
&lt;p&gt;:::note
If you provide an email address, the user will be able to log into Outline using not only the username but also the email.
:::&lt;/p&gt;
&lt;p&gt;Click the &quot;Create&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-outline-and-keycloak-using-docker-compose-19.webp&quot; alt=&quot;Install Outline and Keycloak Using Docker Compose - Step 19&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to set a password for the new user.&lt;/p&gt;
&lt;p&gt;Go to the &quot;Credentials&quot; tab and click the &quot;Set password&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-outline-and-keycloak-using-docker-compose-20.webp&quot; alt=&quot;Install Outline and Keycloak Using Docker Compose - Step 20&quot;&gt;&lt;/p&gt;
&lt;p&gt;Enter a strong password and click the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-outline-and-keycloak-using-docker-compose-21.webp&quot; alt=&quot;Install Outline and Keycloak Using Docker Compose - Step 21&quot;&gt;&lt;/p&gt;
&lt;p&gt;Certainly! Below is the translation of the provided text:&lt;/p&gt;
&lt;p&gt;Click the &quot;Save password&quot; button to confirm the assignment of a new password for the user.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-outline-and-keycloak-using-docker-compose-22.webp&quot; alt=&quot;Install Outline and Keycloak Using Docker Compose - Step 22&quot;&gt;&lt;/p&gt;
&lt;p&gt;The new password has been successfully set.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-outline-and-keycloak-using-docker-compose-23.webp&quot; alt=&quot;Install Outline and Keycloak Using Docker Compose - Step 23&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you can launch Outline with accompanying services and log into Outline using the previously created user.&lt;/p&gt;
&lt;p&gt;Let&apos;s launch Outline with the following command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose -f 03-outline-minio-redis-docker-compose.yml -p outline up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-outline-and-keycloak-using-docker-compose-24.webp&quot; alt=&quot;Install Outline and Keycloak Using Docker Compose - Step 24&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Outline management panel, go to &lt;code&gt;https://outline.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;outline.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik service, which will redirect the request to Outline.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Click the &quot;Continue with Keycloak&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-outline-and-keycloak-using-docker-compose-25.webp&quot; alt=&quot;Install Outline and Keycloak Using Docker Compose - Step 25&quot;&gt;&lt;/p&gt;
&lt;p&gt;Enter the username or email address and password previously set in Keycloak.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-outline-and-keycloak-using-docker-compose-26.webp&quot; alt=&quot;Install Outline and Keycloak Using Docker Compose - Step 26&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Outline control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-outline-and-keycloak-using-docker-compose-27.webp&quot; alt=&quot;Install Outline and Keycloak Using Docker Compose - Step 27&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the MinIO control panel, go to &lt;code&gt;https://console.minio.outline.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;console.minio.outline.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik service, which will redirect the request to MinIO.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Enter the username and password previously set in the &lt;code&gt;.env&lt;/code&gt; file, and click the &quot;Login&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-outline-and-keycloak-using-docker-compose-28.webp&quot; alt=&quot;Install Outline and Keycloak Using Docker Compose - Step 28&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Traefik control panel, go to &lt;code&gt;https://traefik.outline.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;traefik.outline.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Traefik.&lt;/p&gt;
&lt;p&gt;:::note
You need to specify the domain name of the service, previously defined in the &lt;code&gt;.env&lt;/code&gt; file.
:::&lt;/p&gt;
&lt;p&gt;Enter the username and password previously set in the &lt;code&gt;.env&lt;/code&gt; file, and click the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-outline-and-keycloak-using-docker-compose-29.webp&quot; alt=&quot;Install Outline and Keycloak Using Docker Compose - Step 29&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Traefik control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-outline-and-keycloak-using-docker-compose-30.webp&quot; alt=&quot;Install Outline and Keycloak Using Docker Compose - Step 30&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Self-Hosting</category><category>Outline</category><category>Keycloak</category><category>Docker</category><category>Wiki</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Mastering Docker Scout through Docker Desktop GUI and CLI</title><link>https://heyvaldemar.com/mastering-docker-scout-through-docker-desktop-gui-and-cli/</link><guid isPermaLink="true">https://heyvaldemar.com/mastering-docker-scout-through-docker-desktop-gui-and-cli/</guid><description>Master Docker Scout with hands-on GUI and CLI examples. Learn to scan, analyze, and secure container images using advanced techniques and real-world workflows.</description><pubDate>Sun, 16 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Docker Scout shows you direct and transitive dependencies in one place, across every image layer. That alone makes container security easier to reason about. I wrote about why it matters before, here: &lt;a href=&quot;/docker-scout-is-the-game-changer-in-container-security/&quot;&gt;Docker Scout is the Game-Changer in Container Security&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This one is about the how. I&apos;ll run Docker Scout in live use. Both the Docker Desktop GUI and the CLI.&lt;/p&gt;
&lt;p&gt;So what does it actually do? &lt;a href=&quot;https://docs.docker.com/scout/&quot;&gt;Docker Scout&lt;/a&gt; reads the contents of an image, reports the packages and vulnerabilities inside, and suggests a fix for each. It also flags updates for your base image, with the tags and digests it recommends. You can filter images by vulnerability data too.&lt;/p&gt;
&lt;h2&gt;Installing Docker Scout&lt;/h2&gt;
&lt;p&gt;You need &lt;a href=&quot;https://docs.docker.com/desktop/&quot;&gt;Docker Desktop&lt;/a&gt; to run &lt;a href=&quot;https://docs.docker.com/scout/&quot;&gt;Docker Scout&lt;/a&gt;. It works on &lt;a href=&quot;https://docs.docker.com/desktop/install/linux-install/&quot;&gt;Linux&lt;/a&gt;, &lt;a href=&quot;https://docs.docker.com/desktop/install/mac-install/&quot;&gt;macOS&lt;/a&gt;, and &lt;a href=&quot;https://docs.docker.com/desktop/install/windows-install/&quot;&gt;Windows&lt;/a&gt;. The Docker CLI ships with it, so you already have what you need.&lt;/p&gt;
&lt;p&gt;Don&apos;t have it yet? Grab Docker Desktop from the official Docker &lt;a href=&quot;https://www.docker.com/products/docker-desktop/&quot;&gt;website&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Installing Docker Scout on a server&lt;/h3&gt;
&lt;p&gt;To deploy Docker Scout on a server, run this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;curl -sSfL https://raw.githubusercontent.com/docker/scout-cli/main/install.sh | sh -s --
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Manual installation&lt;/h3&gt;
&lt;p&gt;Download the &lt;code&gt;docker-scout&lt;/code&gt; binary for your platform from the &lt;a href=&quot;https://github.com/docker/scout-cli/releases/latest&quot;&gt;latest&lt;/a&gt; or &lt;a href=&quot;https://github.com/docker/scout-cli/releases&quot;&gt;other&lt;/a&gt; releases.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uncompress Docker Scout as:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;docker-scout&lt;/code&gt; on &lt;em&gt;Linux&lt;/em&gt; and &lt;em&gt;macOS&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker-scout.exe&lt;/code&gt; on &lt;em&gt;Windows&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Copy Docker Scout in your local CLI plugin directory:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;$HOME/.docker/cli-plugins&lt;/code&gt; on &lt;em&gt;Linux&lt;/em&gt; and &lt;em&gt;macOS&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;%USERPROFILE%\.docker\cli-plugins&lt;/code&gt; on &lt;em&gt;Windows&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Make Docker Scout executable on &lt;em&gt;Linux&lt;/em&gt; and &lt;em&gt;macOS&lt;/em&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;chmod +x $HOME/.docker/cli-plugins/docker-scout&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Authorize the binary to be executable on &lt;em&gt;macOS&lt;/em&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;xattr -d com.apple.quarantine $HOME/.docker/cli-plugins/docker-scout&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Mastering Docker Scout via Docker Desktop GUI&lt;/h2&gt;
&lt;p&gt;Run the latest Docker Desktop. Then open the &quot;Images&quot; section in the menu.&lt;/p&gt;
&lt;p&gt;:::note
In this guide, we will conduct a thorough examination of the security vulnerabilities associated with the &lt;a href=&quot;https://mattermost.com/&quot;&gt;Mattermost&lt;/a&gt; image.
:::&lt;/p&gt;
&lt;p&gt;Want the full setup for that image? I walk through it in &lt;a href=&quot;/install-mattermost-using-docker-compose/&quot;&gt;Installing Mattermost with Docker Compose&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The &quot;Local&quot; tab lists every image on your system. Nothing there? Pull one with the &lt;a href=&quot;https://docs.docker.com/engine/reference/commandline/pull/&quot;&gt;docker pull&lt;/a&gt; command.&lt;/p&gt;
&lt;p&gt;Now click the image you want to check.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./mastering-docker-scout-through-docker-desktop-gui-and-cli-1.webp&quot; alt=&quot;Mastering Docker Scout through Docker Desktop GUI and CLI - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;The &quot;Vulnerabilities&quot; tab gives you a report on every security issue in the image.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./mastering-docker-scout-through-docker-desktop-gui-and-cli-2.webp&quot; alt=&quot;Mastering Docker Scout through Docker Desktop GUI and CLI - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, click &quot;Recommended fixes&quot; and pick &quot;Recommendations for base image&quot; to see what Scout suggests.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./mastering-docker-scout-through-docker-desktop-gui-and-cli-3.webp&quot; alt=&quot;Mastering Docker Scout through Docker Desktop GUI and CLI - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Here, refreshing the base image is one option.&lt;/p&gt;
&lt;p&gt;Check the &quot;Refresh base image&quot; tab for those recommendations.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./mastering-docker-scout-through-docker-desktop-gui-and-cli-4.webp&quot; alt=&quot;Mastering Docker Scout through Docker Desktop GUI and CLI - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Or swap the base image entirely.&lt;/p&gt;
&lt;p&gt;Check the &quot;Change base image&quot; tab for that.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./mastering-docker-scout-through-docker-desktop-gui-and-cli-5.webp&quot; alt=&quot;Mastering Docker Scout through Docker Desktop GUI and CLI - Step 5&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Mastering Docker Scout via CLI&lt;/h2&gt;
&lt;p&gt;Now the CLI. A few commands carry most of the weight:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;docker scout quickview&lt;/code&gt;: This command provides a succinct summary of an image, enabling you to get a quick understanding of its main features.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;docker scout cves&lt;/code&gt;: This command reveals the Common Vulnerabilities and Exposures (CVEs) detected for any software artifacts found within an image, keeping you informed about potential security risks.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;docker scout recommendations&lt;/code&gt;: With this command, you&apos;ll receive a list of all possible base image updates and remediation suggestions, guiding you on how to improve your container security and efficiency.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;docker scout compare&lt;/code&gt;: This command allows you to compare two distinct images, highlighting their differences. This feature is particularly useful when you&apos;re tracking changes or considering updates.&lt;/p&gt;
&lt;p&gt;Learn these four and you cover most of the day-to-day work.&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;We will conduct a thorough examination of the security vulnerabilities associated with the &lt;a href=&quot;https://mattermost.com/&quot;&gt;Mattermost&lt;/a&gt; image.&lt;/p&gt;
&lt;p&gt;Need the install steps first? See &lt;a href=&quot;/install-mattermost-using-docker-compose/&quot;&gt;Installing Mattermost with Docker Compose&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Start with a quick summary of the image:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker scout quickview mattermost/mattermost-team-edition:release-7.11
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./mastering-docker-scout-through-docker-desktop-gui-and-cli-6.webp&quot; alt=&quot;Mastering Docker Scout through Docker Desktop GUI and CLI - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, pull the CVEs found across the artifacts in the image:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker scout cves mattermost/mattermost-team-edition:release-7.11
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./mastering-docker-scout-through-docker-desktop-gui-and-cli-7.webp&quot; alt=&quot;Mastering Docker Scout through Docker Desktop GUI and CLI - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now list the base image updates and remediation suggestions:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker scout recommendations mattermost/mattermost-team-edition:release-7.11
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./mastering-docker-scout-through-docker-desktop-gui-and-cli-8.webp&quot; alt=&quot;Mastering Docker Scout through Docker Desktop GUI and CLI - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Scroll up for the rest.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./mastering-docker-scout-through-docker-desktop-gui-and-cli-9.webp&quot; alt=&quot;Mastering Docker Scout through Docker Desktop GUI and CLI - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now compare two images and see what differs. Here, two Mattermost releases.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker scout compare --to mattermost/mattermost-team-edition:release-7.11 mattermost/mattermost-team-edition:release-7.10
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./mastering-docker-scout-through-docker-desktop-gui-and-cli-10.webp&quot; alt=&quot;Mastering Docker Scout through Docker Desktop GUI and CLI - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;Scroll up for the rest.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./mastering-docker-scout-through-docker-desktop-gui-and-cli-11.webp&quot; alt=&quot;Mastering Docker Scout through Docker Desktop GUI and CLI - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./mastering-docker-scout-through-docker-desktop-gui-and-cli-12.webp&quot; alt=&quot;Mastering Docker Scout through Docker Desktop GUI and CLI - Step 12&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Mastering Docker Scout via CLI in the container&lt;/h2&gt;
&lt;p&gt;You don&apos;t always need the plugin installed. You can run Scout straight from a container.&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;We will conduct a thorough examination of the security vulnerabilities associated with the &lt;a href=&quot;https://mattermost.com/&quot;&gt;Mattermost&lt;/a&gt; image.&lt;/p&gt;
&lt;p&gt;Same as before, the install guide is here: &lt;a href=&quot;/install-mattermost-using-docker-compose/&quot;&gt;Installing Mattermost with Docker Compose&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Start with the quick summary:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker run -it \
  -e DOCKER_SCOUT_HUB_USER=YOUR_DOCKER_HUB_USER_NAME \
  -e DOCKER_SCOUT_HUB_PASSWORD=YOUR_DOCKER_HUB_PASSWORD_OR_ACCESS_TOKEN \
  docker/scout-cli quickview mattermost/mattermost-team-edition:release-7.11
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./mastering-docker-scout-through-docker-desktop-gui-and-cli-13.webp&quot; alt=&quot;Mastering Docker Scout through Docker Desktop GUI and CLI - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;Then the CVEs found across the artifacts in the image:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker run -it \
  -e DOCKER_SCOUT_HUB_USER=YOUR_DOCKER_HUB_USER_NAME \
  -e DOCKER_SCOUT_HUB_PASSWORD=YOUR_DOCKER_HUB_PASSWORD_OR_ACCESS_TOKEN \
  docker/scout-cli cves mattermost/mattermost-team-edition:release-7.11
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./mastering-docker-scout-through-docker-desktop-gui-and-cli-14.webp&quot; alt=&quot;Mastering Docker Scout through Docker Desktop GUI and CLI - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now the base image updates and remediation suggestions:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker run -it \
  -e DOCKER_SCOUT_HUB_USER=YOUR_DOCKER_HUB_USER_NAME \
  -e DOCKER_SCOUT_HUB_PASSWORD=YOUR_DOCKER_HUB_PASSWORD_OR_ACCESS_TOKEN \
  docker/scout-cli recommendations mattermost/mattermost-team-edition:release-7.11
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./mastering-docker-scout-through-docker-desktop-gui-and-cli-15.webp&quot; alt=&quot;Mastering Docker Scout through Docker Desktop GUI and CLI - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;And compare two releases, same as before:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker run -it \
  -e DOCKER_SCOUT_HUB_USER=YOUR_DOCKER_HUB_USER_NAME \
  -e DOCKER_SCOUT_HUB_PASSWORD=YOUR_DOCKER_HUB_PASSWORD_OR_ACCESS_TOKEN \
  docker/scout-cli compare \
    --to mattermost/mattermost-team-edition:release-7.11 \
    mattermost/mattermost-team-edition:release-7.10
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./mastering-docker-scout-through-docker-desktop-gui-and-cli-16.webp&quot; alt=&quot;Mastering Docker Scout through Docker Desktop GUI and CLI - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;Scroll up for the rest.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./mastering-docker-scout-through-docker-desktop-gui-and-cli-17.webp&quot; alt=&quot;Mastering Docker Scout through Docker Desktop GUI and CLI - Step 17&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./mastering-docker-scout-through-docker-desktop-gui-and-cli-18.webp&quot; alt=&quot;Mastering Docker Scout through Docker Desktop GUI and CLI - Step 18&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;That&apos;s the walkthrough. Docker Scout from the Desktop GUI and from the CLI, both. Container security should sit near the top of your list, and Scout earns a spot in the workflow fast. Wire it in. You get fewer surprises in your images, and a base you can actually trust.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>Docker</category><category>Security</category><category>Vulnerability Scanning</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Docker Scout is the Game-Changer in Container Security</title><link>https://heyvaldemar.com/docker-scout-is-the-game-changer-in-container-security/</link><guid isPermaLink="true">https://heyvaldemar.com/docker-scout-is-the-game-changer-in-container-security/</guid><description>Docker Scout simplifies container security, giving a unified view of direct and transitive dependencies across every image layer.</description><pubDate>Wed, 05 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Most container security tools feel like they were built by compliance auditors, not by anyone who ships images. Bloated UIs. Hourly scans that miss the window that matters. Remediation “advice” that boils down to “good luck.”&lt;/p&gt;
&lt;p&gt;Docker shipped something different. It&apos;s called &lt;strong&gt;Docker Scout&lt;/strong&gt;, and this one actually feels like it was built for the people running &lt;code&gt;docker build&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Scout gives you real-time security insights and a full view of every dependency in an image, including the transitive ones that hide three layers down. It hooks into the Docker workflow you already use. It isn&apos;t trying to be your whole security platform. It&apos;s trying to make &lt;strong&gt;container image security less painful and more useful&lt;/strong&gt;. That&apos;s the part nobody else got right.&lt;/p&gt;
&lt;h2&gt;Why Docker Scout Is a Big Deal&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.docker.com/scout/&quot;&gt;Docker Scout&lt;/a&gt; doesn&apos;t scan your layers and hand you a wall of CVEs. It gives you &lt;strong&gt;contextual intelligence&lt;/strong&gt;. What&apos;s vulnerable. Where it came from. How to fix it without rebuilding your entire image from scratch.&lt;/p&gt;
&lt;p&gt;That covers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Base image vulnerabilities&lt;/li&gt;
&lt;li&gt;App-layer dependencies (direct and transitive)&lt;/li&gt;
&lt;li&gt;Real-time CVE detection tied to your image&apos;s SBOM&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And it&apos;s event-driven. So &lt;strong&gt;no more “scheduled scans”&lt;/strong&gt; that flag a problem 12 hours after it was already exploitable. A new CVE drops, your image is affected, and Scout knows. It tells you &lt;em&gt;now&lt;/em&gt;.&lt;/p&gt;
&lt;h2&gt;What Makes Docker Scout Actually Useful&lt;/h2&gt;
&lt;p&gt;This is not another scanner bolted onto Docker Desktop. Scout works because it reads your images the way you read them.&lt;/p&gt;
&lt;h3&gt;Unified Image Intelligence&lt;/h3&gt;
&lt;p&gt;Scout doesn&apos;t just scan. It &lt;em&gt;maps&lt;/em&gt; the image. Every layer, every dependency, in one place.&lt;/p&gt;
&lt;p&gt;No jumping between tools. No guessing where that &lt;code&gt;log4j&lt;/code&gt; nightmare crept in. One clear view of the whole software stack inside your image.&lt;/p&gt;
&lt;h3&gt;Real-Time Vulnerability Correlation&lt;/h3&gt;
&lt;p&gt;When a new CVE lands, Scout checks it against your image. Not by layer digest alone. It uses your SBOM.&lt;/p&gt;
&lt;p&gt;In practice:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;New vulnerability found in openssl (transitive dep)
↓
Scout detects it in your image layer
↓
You get notified *before* prod gets burned
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Contextual Fix Suggestions&lt;/h3&gt;
&lt;p&gt;Scout doesn&apos;t scream “YOU HAVE A VULN” and walk off.&lt;/p&gt;
&lt;p&gt;It hands you something you can act on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“Update your base image to &lt;code&gt;python:3.11-slim&lt;/code&gt;”&lt;/li&gt;
&lt;li&gt;“Upgrade your &lt;code&gt;requests&lt;/code&gt; package to ≥2.31.0”&lt;/li&gt;
&lt;li&gt;“Rebuild with a patched upstream layer”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All of it lives in the Docker CLI, Desktop, and Hub. No context-switching.&lt;/p&gt;
&lt;h2&gt;The Interface: Clean, Focused, and Not Built by a Lawyer&lt;/h2&gt;
&lt;p&gt;Scout&apos;s UI isn&apos;t chasing design awards. It&apos;s showing you &lt;strong&gt;what matters&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CVEs prioritized by severity&lt;/li&gt;
&lt;li&gt;Clear SBOM-driven insights&lt;/li&gt;
&lt;li&gt;Easy navigation across image layers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It needs auth, because it&apos;s a cloud service. The upside: usage tracking, organizational access controls, and a managed backend that won&apos;t pin your CPU the way local scanners do.&lt;/p&gt;
&lt;h2&gt;Integration Without Lock-In&lt;/h2&gt;
&lt;p&gt;Docker didn&apos;t build Scout to rip out your security stack. It cooperates with the tools you&apos;ve got, &lt;strong&gt;Snyk&lt;/strong&gt; and &lt;strong&gt;Grype&lt;/strong&gt; included, plus whatever else you&apos;ve wired into CI/CD.&lt;/p&gt;
&lt;p&gt;So keep your third-party scanners in production if you have them. Run Scout for early visibility during dev. Catch the problem before it ever reaches CI.&lt;/p&gt;
&lt;h2&gt;Availability &amp;amp; Pricing&lt;/h2&gt;
&lt;p&gt;Scout is in &lt;strong&gt;early access&lt;/strong&gt; right now. Free to try, and Docker wants feedback from people who actually build images, not security gatekeepers.&lt;/p&gt;
&lt;p&gt;A tiered model will probably show up later. For now it&apos;s open season. Use it, break it, file issues, and push it toward whatever it should become.&lt;/p&gt;
&lt;h2&gt;What It Looks Like in Practice&lt;/h2&gt;
&lt;p&gt;Want the hands-on walkthrough, GUI screenshots and CLI output and all? I wrote that up:
👉 &lt;a href=&quot;/mastering-docker-scout-through-docker-desktop-gui-and-cli/&quot;&gt;Mastering Docker Scout through Docker Desktop GUI and CLI&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;That post walks through real workflows and shows how Scout surfaces useful information without wasting your afternoon.&lt;/p&gt;
&lt;h2&gt;Final Take&lt;/h2&gt;
&lt;p&gt;Docker Scout is what container security should have been from the start. Context-aware. Built for developers. Wired into the places you already work.&lt;/p&gt;
&lt;p&gt;It&apos;s not perfect yet. But it already feels far more usable than most of the “enterprise-grade” scanners I&apos;ve been stuck with in the field.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So try it.&lt;/strong&gt; Run a scan. See what Scout turns up. Fix something before your CI pipeline starts crying.&lt;/p&gt;
&lt;p&gt;Secure containers start at the CLI. Not after prod is already on fire.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>Docker</category><category>Security</category><category>DevSecOps</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Docker Init The Future of Easy Project Initialization</title><link>https://heyvaldemar.com/docker-init-the-future-of-easy-project-initialization/</link><guid isPermaLink="true">https://heyvaldemar.com/docker-init-the-future-of-easy-project-initialization/</guid><description>Learn how to use Docker Init to quickly generate Dockerfiles, .dockerignore, and Compose files. Simplify container setup for Go, Node, Python, and more.</description><pubDate>Sun, 02 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Docker changed how we ship software, giving us a lightweight, portable, consistent runtime that works the same across different infrastructures. One of its newer additions is Docker Init, a CLI command that simplifies adding Docker to any project.&lt;/p&gt;
&lt;h2&gt;Understanding Docker Init&lt;/h2&gt;
&lt;p&gt;The Docker Init feature should not be confused with the internally used &lt;code&gt;docker-init&lt;/code&gt; executable, which is triggered by Docker when using the &lt;code&gt;--init&lt;/code&gt; flag with the &lt;code&gt;docker run&lt;/code&gt; command. The Docker Init we&apos;re discussing here is a new feature in its beta phase that automates the creation of essential Docker-related assets like Dockerfiles, .dockerignore files, and compose.yaml files.&lt;/p&gt;
&lt;p&gt;The Docker Init feature presently supports Go, Node, and Python, with Docker&apos;s development team actively extending support to other languages and frameworks, including Java, Rust, and .NET. This progressive expansion promises to make Docker Init even more useful to a wide range of developers.&lt;/p&gt;
&lt;h2&gt;Working with Docker Init&lt;/h2&gt;
&lt;p&gt;To use Docker Init, you&apos;ll need Docker Desktop version 4.18 or later. Once this is set up, you can run the &lt;code&gt;docker init&lt;/code&gt; command in your project&apos;s target directory. Docker Init will detect the project&apos;s characteristics and automatically generate the necessary Docker files. This feature is particularly valuable for developers who are new to Docker, those learning about containerization, or developers looking to integrate Docker into their existing projects.&lt;/p&gt;
&lt;h2&gt;Docker Init in Action&lt;/h2&gt;
&lt;p&gt;Let&apos;s take a web server written in Go as an example.&lt;/p&gt;
&lt;p&gt;We execute the command to start the process of automatically generating the necessary files to run the application using Docker Compose:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker init
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./docker-init-the-future-of-easy-project-initialization-1.webp&quot; alt=&quot;Docker Init The Future of Easy Project Initialization - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to select the programming language in which your application is written.&lt;/p&gt;
&lt;p&gt;:::note
In this example, we are considering an application written in Go.
:::&lt;/p&gt;
&lt;p&gt;Select Go and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./docker-init-the-future-of-easy-project-initialization-2.webp&quot; alt=&quot;Docker Init The Future of Easy Project Initialization - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to specify the installed version of Go.&lt;/p&gt;
&lt;p&gt;:::note
In this example, we consider working with version 1.20.
:::&lt;/p&gt;
&lt;p&gt;You can check the installed version with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;go version
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Specify the installed version of Go and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./docker-init-the-future-of-easy-project-initialization-3.webp&quot; alt=&quot;Docker Init The Future of Easy Project Initialization - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to select the project directory in which &quot;main.go&quot; is located.&lt;/p&gt;
&lt;p&gt;:::note
In this example, &quot;main.go&quot; is in the root directory of the project.
:::&lt;/p&gt;
&lt;p&gt;Select the project directory in which &quot;main.go&quot; is located and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./docker-init-the-future-of-easy-project-initialization-4.webp&quot; alt=&quot;Docker Init The Future of Easy Project Initialization - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to specify the port on which the web server is running.&lt;/p&gt;
&lt;p&gt;:::note
In this example, the web server is using port 8081.
:::&lt;/p&gt;
&lt;p&gt;Select the port on which the web server is running and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./docker-init-the-future-of-easy-project-initialization-5.webp&quot; alt=&quot;Docker Init The Future of Easy Project Initialization - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;The necessary files to run the application using Docker Compose have been generated.&lt;/p&gt;
&lt;p&gt;We start the web server using Docker Compose:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose up --build
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./docker-init-the-future-of-easy-project-initialization-6.webp&quot; alt=&quot;Docker Init The Future of Easy Project Initialization - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;The web server has started and is using port 8081.&lt;/p&gt;
&lt;p&gt;Now you can go to &lt;code&gt;http://127.0.0.1:8081&lt;/code&gt; and check if the web server is working.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./docker-init-the-future-of-easy-project-initialization-7.webp&quot; alt=&quot;Docker Init The Future of Easy Project Initialization - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;The web server is running.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./docker-init-the-future-of-easy-project-initialization-8.webp&quot; alt=&quot;Docker Init The Future of Easy Project Initialization - Step 8&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Benefits of Docker Init&lt;/h2&gt;
&lt;p&gt;Docker Init plays a significant role in automating the creation of necessary Docker assets and standardizing the process across different projects. It allows developers to focus more on the development of their applications, reducing the risk of errors and inconsistencies, and thereby accelerating the adoption of Docker and containerization.&lt;/p&gt;
&lt;p&gt;After Docker Init has completed, there may be a need to modify the created files to align them with your project requirements. In such cases, you can refer back to the &lt;a href=&quot;https://docs.docker.com/engine/reference/commandline/init/&quot;&gt;Docker documentation&lt;/a&gt; for further information.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Even in beta, Docker Init already simplifies adding Docker support to a project. By automating the creation of Docker assets, it removes one more piece of manual setup. As Docker refines and expands the feature, it&apos;s likely to become a standard part of the toolkit.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>Docker</category><category>CLI</category><category>Development</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Transforming Development with Docker Compose Watch</title><link>https://heyvaldemar.com/transforming-development-with-docker-compose-watch/</link><guid isPermaLink="true">https://heyvaldemar.com/transforming-development-with-docker-compose-watch/</guid><description>Boost your dev workflow with Docker Compose&apos;s watch feature. Auto-sync or rebuild services on file changes for faster, hands-free local development.</description><pubDate>Thu, 15 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Building containers during dev is slow. Slow and repetitive. And it wastes a stupid amount of time, because you end up rebuilding the entire image over a three-line edit in &lt;code&gt;index.js&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Docker Compose Watch&lt;/strong&gt; fixes that. It&apos;s not some half-baked beta toy either. It does the job.&lt;/p&gt;
&lt;p&gt;You change a file, Docker reacts. Instantly. Your app syncs or rebuilds &lt;em&gt;automatically&lt;/em&gt;, and you never type &lt;code&gt;docker-compose up --build&lt;/code&gt; again just because you renamed a function.&lt;/p&gt;
&lt;p&gt;So here&apos;s how it works, plus why I rate it as the best thing to land in local Docker dev since bind mounts.&lt;/p&gt;
&lt;h2&gt;What Is &lt;code&gt;watch&lt;/code&gt; in Docker Compose?&lt;/h2&gt;
&lt;p&gt;It&apos;s a feature, still in alpha, that points Docker Compose at your &lt;strong&gt;local files&lt;/strong&gt; and lets it do two things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sync&lt;/strong&gt; them into running containers (great for JS, Python, anything with hot reload)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rebuild&lt;/strong&gt; the container when certain files change (like &lt;code&gt;package.json&lt;/code&gt;, &lt;code&gt;requirements.txt&lt;/code&gt;, etc.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So it&apos;s file-watching with intent. Not dumb mirroring. Every update is &lt;strong&gt;targeted and rule-driven&lt;/strong&gt;, which is the whole point.&lt;/p&gt;
&lt;h2&gt;Sync vs Rebuild: Know the Difference&lt;/h2&gt;
&lt;p&gt;Two actions live in your &lt;code&gt;compose.yaml&lt;/code&gt;. Here they are.&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;sync&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;- action: sync
  path: ./web
  target: /src/web
  ignore:
    - node_modules/
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Copies host changes into the container on save&lt;/li&gt;
&lt;li&gt;Doesn&apos;t restart or rebuild the container&lt;/li&gt;
&lt;li&gt;Perfect for JS/TS/React/Flask/Django/Express/etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Treat it as a cleaner, tighter replacement for bind mounts.&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;rebuild&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;- action: rebuild
  path: package.json
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Triggers a full image rebuild when the watched file changes&lt;/li&gt;
&lt;li&gt;Same as doing &lt;code&gt;docker compose up --build &amp;lt;svc&amp;gt;&lt;/code&gt; behind the scenes&lt;/li&gt;
&lt;li&gt;Ideal for dependency files or compiled languages&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Use both. Rebuild on config changes. Sync everything else.&lt;/p&gt;
&lt;h2&gt;How to Use Docker Compose Watch&lt;/h2&gt;
&lt;p&gt;The full loop is short:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Add a &lt;code&gt;x-develop.watch&lt;/code&gt; section to your &lt;code&gt;compose.yaml&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Start services with:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose up --build --wait
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose alpha watch
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now your app updates in real time. That&apos;s how development should feel.&lt;/p&gt;
&lt;h2&gt;Real Example: Node.js App with Hot Reload&lt;/h2&gt;
&lt;p&gt;Say your project looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;myproject/
├── web/
│   ├── App.jsx
│   └── index.js
├── Dockerfile
├── compose.yaml
└── package.json
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Your &lt;code&gt;compose.yaml&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;services:
  web:
    build: .
    command: npm start
    x-develop:
      watch:
        - action: sync
          path: ./web
          target: /src/web
          ignore:
            - node_modules/
        - action: rebuild
          path: package.json
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Start the service:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose up --build --wait
docker compose alpha watch
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now edit &lt;code&gt;App.jsx&lt;/code&gt;, save, and refresh the browser. Done.&lt;/p&gt;
&lt;h2&gt;Test It Yourself: Run a Live Demo&lt;/h2&gt;
&lt;p&gt;Clone the official demo:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/dockersamples/avatars.git
cd avatars
docker compose up -d
docker compose alpha watch
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then hit:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;http://localhost:5735
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Change something in &lt;code&gt;src/&lt;/code&gt; and watch it reload while you look at it.&lt;/p&gt;
&lt;h2&gt;Pro Tips&lt;/h2&gt;
&lt;h3&gt;1. Use Sync for Hot Reload, Rebuild for State Changes&lt;/h3&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sync: &lt;code&gt;./src&lt;/code&gt;, &lt;code&gt;./templates&lt;/code&gt;, &lt;code&gt;.env&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Rebuild: &lt;code&gt;Dockerfile&lt;/code&gt;, &lt;code&gt;package.json&lt;/code&gt;, &lt;code&gt;requirements.txt&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. Ignore What Doesn&apos;t Matter&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;ignore:
  - node_modules/
  - dist/
  - *.log
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Otherwise every temp file you touch kicks off a sync. You don&apos;t want that.&lt;/p&gt;
&lt;h3&gt;3. Optimize Your Dockerfile&lt;/h3&gt;
&lt;p&gt;Lean on multi-stage builds and cache your layers properly:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;COPY package.json .
RUN npm ci
COPY . .
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Copy too early and Docker throws out the cache on every change.&lt;/p&gt;
&lt;h2&gt;Not Just for Node.js&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;watch&lt;/code&gt; works far beyond Node. A few examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Python/Flask&lt;/strong&gt; → sync &lt;code&gt;.py&lt;/code&gt;, rebuild on &lt;code&gt;requirements.txt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Go&lt;/strong&gt; → rebuild on &lt;code&gt;.go&lt;/code&gt;, mount volume for &lt;code&gt;go run&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Java/Spring&lt;/strong&gt; → rebuild on &lt;code&gt;.java&lt;/code&gt; or &lt;code&gt;pom.xml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rust&lt;/strong&gt; → rebuild on &lt;code&gt;Cargo.toml&lt;/code&gt;, cache your target dir&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It&apos;s universal. The only real question is how you structure your watches.&lt;/p&gt;
&lt;h2&gt;Bonus: No More Bind Mount Weirdness&lt;/h2&gt;
&lt;p&gt;Bind mounts are fine, right up until they aren&apos;t. You hit OS quirks. You fight permissions. And on Windows, performance just falls off a cliff.&lt;/p&gt;
&lt;p&gt;Sync rules hand you &lt;strong&gt;precision&lt;/strong&gt;. Rebuild triggers hand you &lt;strong&gt;control&lt;/strong&gt;. No quirks attached.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;docker compose alpha watch&lt;/code&gt; = auto-sync + auto-rebuild&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;sync&lt;/code&gt; for live reload workflows&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;rebuild&lt;/code&gt; for dependency changes or compiled code&lt;/li&gt;
&lt;li&gt;Clean alternative to bind mounts&lt;/li&gt;
&lt;li&gt;Works with any language, any stack&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Final Take&lt;/h2&gt;
&lt;p&gt;Dev loops should be fast. Not &quot;wait 10 seconds for a container&quot; fast. Save-and-see-it-immediately fast.&lt;/p&gt;
&lt;p&gt;That&apos;s what Docker Compose Watch buys you. It&apos;s not production magic. It&apos;s dev-experience magic, and it holds up.&lt;/p&gt;
&lt;p&gt;You write code. Docker handles the rest.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>Docker</category><category>Development</category><category>Hot Reload</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Bitwarden on Ubuntu Server 22.04 LTS</title><link>https://heyvaldemar.com/install-bitwarden-on-ubuntu-server-22-04-lts/</link><guid isPermaLink="true">https://heyvaldemar.com/install-bitwarden-on-ubuntu-server-22-04-lts/</guid><description>Install Bitwarden on Ubuntu Server 22.04 LTS with Docker — step-by-step setup, SSL with Let&apos;s Encrypt, and secure password storage.</description><pubDate>Sun, 22 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Bitwarden on Ubuntu Server 22.04 LTS.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://bitwarden.com/&quot;&gt;Bitwarden&lt;/a&gt; is a free open-source password manager with the ability to sync your account information across all devices.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted Bitwarden when your organization requires on-premises credential management with full vault data control. Bitwarden Cloud or 1Password provide managed alternatives with polished enterprise features and zero server maintenance. Self-hosting is justified when security policy mandates that credentials never leave your infrastructure or when you need custom backup and recovery procedures.
:::&lt;/p&gt;
&lt;p&gt;:::important
Docker Engine and Docker Compose must be installed on the server.&lt;/p&gt;
&lt;p&gt;For a step-by-step guide on installing Docker Engine on Ubuntu Server, see &lt;a href=&quot;/install-docker-engine-and-docker-compose-on-ubuntu-server/&quot;&gt;Install Docker Engine and Docker Compose on Ubuntu Server&lt;/a&gt;
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on a server, you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to receive a free cryptographic certificate through the Let&apos;s Encrypt CA.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the Bitwarden dashboard.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;First, you need to request an installation ID and installation key to host Bitwarden on your server. You must use a unique ID and key for each Bitwarden installation.&lt;/p&gt;
&lt;p&gt;Go to the &lt;a href=&quot;https://bitwarden.com/host/&quot;&gt;Bitwarden hosting setup page&lt;/a&gt;, enter your email address in the &quot;Admin Email Address&quot; field, and then click the &quot;Submit&quot; button to continue.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitwarden-on-ubuntu-server-22-04-lts-1.webp&quot; alt=&quot;Install Bitwarden on Ubuntu Server 22.04 LTS - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Save the resulting &quot;Installation Id&quot; and &quot;Installation Key&quot;. These values will be required during Bitwarden installation.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitwarden-on-ubuntu-server-22-04-lts-2.webp&quot; alt=&quot;Install Bitwarden on Ubuntu Server 22.04 LTS - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;We connect to the server on which you plan to install Bitwarden.&lt;/p&gt;
&lt;p&gt;Download the Bitwarden installation script using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;curl -Lso bitwarden.sh https://go.btwrdn.co/bw-sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitwarden-on-ubuntu-server-22-04-lts-3.webp&quot; alt=&quot;Install Bitwarden on Ubuntu Server 22.04 LTS - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s enable the execution of the file &quot;bitwarden.sh&quot; using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;chmod +x bitwarden.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitwarden-on-ubuntu-server-22-04-lts-4.webp&quot; alt=&quot;Install Bitwarden on Ubuntu Server 22.04 LTS - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s start the Bitwarden installation using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo ./bitwarden.sh install
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitwarden-on-ubuntu-server-22-04-lts-5.webp&quot; alt=&quot;Install Bitwarden on Ubuntu Server 22.04 LTS - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to specify the domain name that you plan to use to access the Bitwarden dashboard.&lt;/p&gt;
&lt;p&gt;Specify the domain name to access Bitwarden and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitwarden-on-ubuntu-server-22-04-lts-6.webp&quot; alt=&quot;Install Bitwarden on Ubuntu Server 22.04 LTS - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;This tutorial walks you through obtaining a free cryptographic certificate through the Let&apos;s Encrypt CA.&lt;/p&gt;
&lt;p&gt;Press the &quot;y&quot; button, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitwarden-on-ubuntu-server-22-04-lts-7.webp&quot; alt=&quot;Install Bitwarden on Ubuntu Server 22.04 LTS - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;We indicate the email address to which Let&apos;s Encrypt will send notifications about the expiration of the certificate and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitwarden-on-ubuntu-server-22-04-lts-8.webp&quot; alt=&quot;Install Bitwarden on Ubuntu Server 22.04 LTS - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the database name for the Bitwarden instance and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitwarden-on-ubuntu-server-22-04-lts-9.webp&quot; alt=&quot;Install Bitwarden on Ubuntu Server 22.04 LTS - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the &quot;Installation Id&quot; obtained earlier and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitwarden-on-ubuntu-server-22-04-lts-10.webp&quot; alt=&quot;Install Bitwarden on Ubuntu Server 22.04 LTS - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;We indicate the &quot;Installation Key&quot; obtained earlier and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitwarden-on-ubuntu-server-22-04-lts-11.webp&quot; alt=&quot;Install Bitwarden on Ubuntu Server 22.04 LTS - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;Bitwarden installed successfully.&lt;/p&gt;
&lt;p&gt;Now let&apos;s start Bitwarden using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo ./bitwarden.sh start
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitwarden-on-ubuntu-server-22-04-lts-12.webp&quot; alt=&quot;Install Bitwarden on Ubuntu Server 22.04 LTS - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;Bitwarden launched successfully.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitwarden-on-ubuntu-server-22-04-lts-13.webp&quot; alt=&quot;Install Bitwarden on Ubuntu Server 22.04 LTS - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Bitwarden control panel, you need to go from the workstation to the link &lt;code&gt;https://bitwarden.heyvaldemar.net&lt;/code&gt;, where &lt;code&gt;bitwarden.heyvaldemar.net&lt;/code&gt; is the name of my server. Accordingly, you need to specify the name of your server with Bitwarden installed.&lt;/p&gt;
&lt;p&gt;Next, you need to register to start using the Bitwarden dashboard.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitwarden-on-ubuntu-server-22-04-lts-14.webp&quot; alt=&quot;Install Bitwarden on Ubuntu Server 22.04 LTS - Step 14&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Self-Hosting</category><category>Bitwarden</category><category>Security</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Wiki.js with Docker Compose</title><link>https://heyvaldemar.com/install-wikijs-with-docker-compose/</link><guid isPermaLink="true">https://heyvaldemar.com/install-wikijs-with-docker-compose/</guid><description>Step-by-step guide to install Wiki.js with Docker Compose on Ubuntu using Traefik, Let&apos;s Encrypt, and PostgreSQL. Secure setup with SSH and HTTPS.</description><pubDate>Sat, 21 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Wiki.js with Docker Compose.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://js.wiki/&quot;&gt;Wiki.js&lt;/a&gt; is a wiki engine running on Node.js and written in JavaScript. It is free software released under the Affero GNU General Public License.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted Wiki.js when you need a modern wiki with Markdown support, Git-backed storage, and no per-user licensing. Notion or Confluence Cloud provide managed alternatives with richer collaboration and lower maintenance. Self-hosting is justified when you need on-premises documentation with custom authentication, or when Git-based version control of documentation is an architectural requirement.
:::&lt;/p&gt;
&lt;p&gt;💾 &lt;strong&gt;You can find the repository used in this guide on &lt;a href=&quot;https://github.com/heyvaldemar/wikijs-traefik-letsencrypt-docker-compose&quot;&gt;GitHub&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;heyvaldemar/wikijs-traefik-letsencrypt-docker-compose&quot;}&lt;/p&gt;
&lt;p&gt;:::note
We&apos;ll use &lt;a href=&quot;https://traefik.io/traefik/&quot;&gt;Traefik&lt;/a&gt; as our reverse proxy. It&apos;ll handle obtaining cryptographic certificates from &lt;a href=&quot;https://letsencrypt.org/&quot;&gt;Let&apos;s Encrypt&lt;/a&gt; for your domain names and route requests to the corresponding services based on those domains.
:::&lt;/p&gt;
&lt;p&gt;:::important
Docker Engine and Docker Compose must be installed on the server.&lt;/p&gt;
&lt;p&gt;For a step-by-step guide on installing Docker Engine on Ubuntu Server, see &lt;a href=&quot;/install-docker-engine-and-docker-compose-on-ubuntu-server/&quot;&gt;Install Docker Engine and Docker Compose on Ubuntu Server&lt;/a&gt;
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on a server, you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to receive a free cryptographic certificate through the Let&apos;s Encrypt CA.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the Wiki.js web interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which you plan to install Docker Compose.&lt;/p&gt;
&lt;p&gt;Now you need to create a YAML configuration file that will contain all the necessary conditions for Docker Compose to work.&lt;/p&gt;
&lt;p&gt;Let&apos;s create a YAML configuration file using a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vim wikijs-traefik-letsencrypt-docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-wikijs-with-docker-compose-1.webp&quot; alt=&quot;Install Wiki.js with Docker Compose - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hit the &quot;i&quot; button to go into edit mode, then insert the following &lt;a href=&quot;https://github.com/heyvaldemar/wikijs-traefik-letsencrypt-docker-compose/blob/main/wikijs-traefik-letsencrypt-docker-compose.yml&quot;&gt;configuration&lt;/a&gt; for Wiki.js to work.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-wikijs-with-docker-compose-2.webp&quot; alt=&quot;Install Wiki.js with Docker Compose - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to make changes to the configuration so that the contents of the file match your conditions. Parameters that need to be checked or changed are marked &quot;(replace with yours)&quot;.&lt;/p&gt;
&lt;p&gt;:::note
In this guide, the &lt;code&gt;wikijs.heyvaldemar.net&lt;/code&gt; subdomain will be used to access Wiki.js from the Internet. You will need to specify your domain or subdomain by which your Wiki.js will be accessible from the Internet.
:::&lt;/p&gt;
&lt;p&gt;:::note
In this guide, Postgres will be used as a database management system, and Traefik will be used as a reverse proxy.
:::&lt;/p&gt;
&lt;p&gt;In the &lt;code&gt;traefik.http.middlewares.authtraefik.basicauth.users&lt;/code&gt; parameter, you must specify the username and password hash to access the Traefik dashboard.&lt;/p&gt;
&lt;p&gt;You can use this &lt;a href=&quot;https://hostingcanada.org/htpasswd-generator/&quot;&gt;service&lt;/a&gt; to get the password hash.&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-wikijs-with-docker-compose-3.webp&quot; alt=&quot;Install Wiki.js with Docker Compose - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s start Wiki.js with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose -f wikijs-traefik-letsencrypt-docker-compose.yml -p wikijs up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-wikijs-with-docker-compose-4.webp&quot; alt=&quot;Install Wiki.js with Docker Compose - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;To continue the XWiki installation process, you need to go from the workstation to the link &lt;code&gt;https://wikijs.heyvaldemar.net&lt;/code&gt;, where &lt;code&gt;wikijs.heyvaldemar.net&lt;/code&gt; is the name of my server. Accordingly, you need to provide the name of your Wiki.js. server.&lt;/p&gt;
&lt;p&gt;The next step is to provide: an email address and a password to create a Wiki.js administrator account.&lt;/p&gt;
&lt;p&gt;In the &quot;Site URL&quot; field, specify your domain or subdomain where your Wiki.js is. will be available on the Internet.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Install&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-wikijs-with-docker-compose-5.webp&quot; alt=&quot;Install Wiki.js with Docker Compose - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, specify the email address and password for the Wiki.js administrator account that was created earlier.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Log In&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-wikijs-with-docker-compose-6.webp&quot; alt=&quot;Install Wiki.js with Docker Compose - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Wiki.js control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-wikijs-with-docker-compose-7.webp&quot; alt=&quot;Install Wiki.js with Docker Compose - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Traefik control panel, go to the link &lt;code&gt;https://traefik.wikijs.heyvaldemar.net&lt;/code&gt; from the workstation, where &lt;code&gt;traefik.wikijs.heyvaldemar.net&lt;/code&gt; is the name of my server. Accordingly, you need to specify the name of your server with Traefik installed.&lt;/p&gt;
&lt;p&gt;Specify the username and password specified earlier in the YAML configuration file and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-wikijs-with-docker-compose-8.webp&quot; alt=&quot;Install Wiki.js with Docker Compose - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Traefik dashboard.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-wikijs-with-docker-compose-9.webp&quot; alt=&quot;Install Wiki.js with Docker Compose - Step 9&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Self-Hosting</category><category>Wiki.js</category><category>Docker</category><category>Wiki</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Git Cheat Sheet</title><link>https://heyvaldemar.com/git-cheat-sheet/</link><guid isPermaLink="true">https://heyvaldemar.com/git-cheat-sheet/</guid><description>Fast and practical Git cheat sheet for developers. Learn essential Git commands for setup, commits, branching, merging, and more in one convenient guide.</description><pubDate>Fri, 20 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Let&apos;s skip the Git theory lecture.&lt;/p&gt;
&lt;p&gt;This cheat sheet is for people who already know Git is a version control system and just want the damn commands. You&apos;ve got code to write, bugs to fix, and a production deploy in 6 minutes.&lt;/p&gt;
&lt;p&gt;So here it is: everything you need, nothing you don&apos;t.&lt;/p&gt;
&lt;h2&gt;Setup&lt;/h2&gt;
&lt;h3&gt;Set your name and email (commit author identity)&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git config --global user.name &quot;Ada Lovelace&quot;
git config --global user.email &quot;ada@computing.dev&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Creating Repos&lt;/h2&gt;
&lt;h3&gt;Start a new repo&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git init
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Clone an existing repo&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone &amp;lt;repo-url&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Making Changes&lt;/h2&gt;
&lt;h3&gt;Check what&apos;s changed&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git status
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Stage changes (individual or all)&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git add &amp;lt;file&amp;gt;   # just one
# or
git add .        # all changes
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Commit with a message&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git commit -m &quot;fix: patch infinite loop in login&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Unstage a file&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git reset HEAD &amp;lt;file&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;History &amp;amp; Diffs&lt;/h2&gt;
&lt;h3&gt;See commit history&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git log
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;See unstaged changes&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git diff
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;See staged changes&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git diff --staged
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Remotes&lt;/h2&gt;
&lt;h3&gt;Link to a remote repo&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git remote add origin &amp;lt;url&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Push/pull to/from remote&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git push origin &amp;lt;branch&amp;gt;
git pull origin &amp;lt;branch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Branching&lt;/h2&gt;
&lt;h3&gt;See, create, switch, and delete branches&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git branch              # list branches
git branch &amp;lt;name&amp;gt;       # create

# switch to a branch
git checkout &amp;lt;name&amp;gt;

# delete a branch
git branch -d &amp;lt;name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Merging&lt;/h2&gt;
&lt;h3&gt;Merge a branch into current one&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git merge &amp;lt;branch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Stashing&lt;/h2&gt;
&lt;h3&gt;Save, list, apply, and drop stashes&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git stash               # stash current changes
git stash list          # see all stashes
git stash apply         # reapply latest stash
git stash drop          # delete latest stash
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Tagging&lt;/h2&gt;
&lt;h3&gt;Add, delete, and push tags&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git tag &amp;lt;tag&amp;gt;
git tag -a &amp;lt;tag&amp;gt; -m &quot;msg&quot;
git tag -d &amp;lt;tag&amp;gt;
git push --tags
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Reverting &amp;amp; Resetting&lt;/h2&gt;
&lt;h3&gt;Revert a commit (safe)&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git revert HEAD              # undo last commit
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git revert &amp;lt;commit&amp;gt;          # revert specific commit
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Reset to a clean state (dangerous)&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git reset HEAD               # unstage

git reset --hard HEAD        # discard all local changes

git reset --hard &amp;lt;commit&amp;gt;    # nuke back to old commit
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Aliases&lt;/h2&gt;
&lt;h3&gt;Save yourself some keystrokes&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git config --global alias.co checkout
git config --global alias.st status
git config --global alias.ci commit
git config --global alias.br branch
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;That&apos;s It&lt;/h2&gt;
&lt;p&gt;Git can get deep, but you don&apos;t need to memorize plumbing commands to be dangerous.&lt;/p&gt;
&lt;p&gt;Pin this cheat sheet, use it daily, and add aliases for whatever slows you down.&lt;/p&gt;
&lt;p&gt;Now go commit something before someone force-pushes to &lt;code&gt;main&lt;/code&gt; again.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>Git</category><category>Version Control</category><category>CLI</category><category>Cheat Sheet</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Configure AWS CLI</title><link>https://heyvaldemar.com/configure-aws-cli/</link><guid isPermaLink="true">https://heyvaldemar.com/configure-aws-cli/</guid><description>Learn how to configure AWS CLI with IAM credentials. Step-by-step guide for setting up secure access, managing keys, and running AWS commands via terminal.</description><pubDate>Tue, 08 Nov 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on configuring AWS CLI.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://aws.amazon.com/cli/&quot;&gt;AWS CLI&lt;/a&gt; is a single tool for managing AWS services. With just one tool download, you can control many AWS services from the command line and automate them with scripts.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Named CLI profiles work for individual developers managing multiple AWS accounts. For teams, AWS IAM Identity Center (SSO) provides centralized credential management with temporary session tokens. Choose named profiles for personal workflows and SSO for any environment where multiple engineers share account access or where compliance requires credential rotation and audit trails.
:::&lt;/p&gt;
&lt;p&gt;:::important
In this guide, we will consider the case when you already have an operating system with AWS CLI installed on it.&lt;/p&gt;
&lt;p&gt;For detailed instructions on installing the AWS CLI on macOS, see my guide: &lt;a href=&quot;/install-aws-cli-on-macos/&quot;&gt;Install AWS CLI on macOS&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We need to create a new user and assign him an access policy. The user will be used to connect to AWS using AWS CLI.&lt;/p&gt;
&lt;p&gt;Log in under your root account on &lt;a href=&quot;https://aws.amazon.com/&quot;&gt;AWS&lt;/a&gt; and search for &quot;IAM&quot; in the main search bar on top of the AWS dashboard.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-aws-cli-1.webp&quot; alt=&quot;Configure AWS CLI - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Go to the &quot;Users&quot; section and click on the &quot;Add users&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-aws-cli-2.webp&quot; alt=&quot;Configure AWS CLI - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;User name&quot; field, specify the username for the new user and check &quot;Access key - Programmatic access&quot;.&lt;/p&gt;
&lt;p&gt;:::note
In this manual, &quot;vladimir_mikhalev&quot; will be used as the username.
:::&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next: Permissions&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-aws-cli-3.webp&quot; alt=&quot;Configure AWS CLI - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, select &quot;Attach existing policies directly&quot;.&lt;/p&gt;
&lt;p&gt;Select the &quot;AdministratorAccess&quot; policy and Click on the &quot;Next: Tags&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-aws-cli-4.webp&quot; alt=&quot;Configure AWS CLI - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, you do not have to make any changes.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next: Review&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-aws-cli-5.webp&quot; alt=&quot;Configure AWS CLI - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Everything is ready to create a new user.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Create user&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-aws-cli-6.webp&quot; alt=&quot;Configure AWS CLI - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;The user has been successfully created and has the necessary permissions.&lt;/p&gt;
&lt;p&gt;Now you need to save the received &quot;Access key ID&quot; and &quot;Secret access key&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Show&quot; button to display the contents of the &quot;Secret access key&quot; section and save the contents of the section to a safe place.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-aws-cli-7.webp&quot; alt=&quot;Configure AWS CLI - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s configure AWS CLI with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;aws configure
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./configure-aws-cli-8.webp&quot; alt=&quot;Configure AWS CLI - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;AWS Access Key ID&quot; field, specify the access key ID that you obtained earlier during user creation.&lt;/p&gt;
&lt;p&gt;Press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-aws-cli-9.webp&quot; alt=&quot;Configure AWS CLI - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;AWS Secret Access Key&quot; field, specify the secret access key that you obtained earlier during user creation.&lt;/p&gt;
&lt;p&gt;Press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-aws-cli-10.webp&quot; alt=&quot;Configure AWS CLI - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Default region name&quot; field, specify the AWS region in which you are planning to work.&lt;/p&gt;
&lt;p&gt;Press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-aws-cli-11.webp&quot; alt=&quot;Configure AWS CLI - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Default output format&quot; field, specify &quot;json&quot; as a format.&lt;/p&gt;
&lt;p&gt;Press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-aws-cli-12.webp&quot; alt=&quot;Configure AWS CLI - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;Everything is ready to use the AWS CLI.&lt;/p&gt;
&lt;p&gt;Let&apos;s list all EC2 instances with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;aws ec2 describe-instances
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./configure-aws-cli-13.webp&quot; alt=&quot;Configure AWS CLI - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;Please note that I have just one EC2 instance.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-aws-cli-14.webp&quot; alt=&quot;Configure AWS CLI - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;q&quot; button to close information about EC2 instances.&lt;/p&gt;
&lt;p&gt;For step-by-step instructions on installing &lt;code&gt;eksctl&lt;/code&gt; on macOS, see my guide: &lt;a href=&quot;/install-eksctl-on-macos/&quot;&gt;Install eksctl on macOS&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>AWS</category><category>CLI</category><category>IAM</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Terraform on macOS</title><link>https://heyvaldemar.com/install-terraform-on-macos/</link><guid isPermaLink="true">https://heyvaldemar.com/install-terraform-on-macos/</guid><description>Learn how to install Terraform on macOS using Homebrew. Step-by-step guide includes setup, version check, and usage tips for managing infrastructure as code.</description><pubDate>Tue, 08 Nov 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Terraform on macOS.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.hashicorp.com/terraform&quot;&gt;Terraform&lt;/a&gt; is HashiCorp&apos;s infrastructure as a code tool. It lets you define resources and infrastructure in human-readable, declarative configuration files, and manages your infrastructure&apos;s lifecycle. Using Terraform has several advantages over manually managing your infrastructure.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Local Terraform CLI is the standard for infrastructure-as-code development and testing. Terraform Cloud or Spacelift provide managed alternatives with remote state, policy enforcement, and team collaboration built in. Local CLI is sufficient for individual workflows, but teams should evaluate remote backends early to avoid state management complexity as infrastructure grows.
:::&lt;/p&gt;
&lt;p&gt;:::important
In this guide, we will consider the case when you already have the &lt;a href=&quot;https://brew.sh/&quot;&gt;Homebrew&lt;/a&gt; package manager installed.
:::&lt;/p&gt;
&lt;p&gt;To install Homebrew, you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;/bin/bash -c &quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;We connect the repository with formulas for Homebrew using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;brew tap hashicorp/tap
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-terraform-on-macos-1.webp&quot; alt=&quot;Install Terraform on macOS - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Run the Terraform installation with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;brew install hashicorp/tap/terraform
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-terraform-on-macos-2.webp&quot; alt=&quot;Install Terraform on macOS - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you can see the installed version of Terraform using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;terraform -version
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-terraform-on-macos-3.webp&quot; alt=&quot;Install Terraform on macOS - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Everything is ready to use Terraform.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-terraform-on-macos-4.webp&quot; alt=&quot;Install Terraform on macOS - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can read more about how to configure AWS CLI in my guide &lt;a href=&quot;/configure-aws-cli/&quot;&gt;Configure AWS CLI&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>Terraform</category><category>IaC</category><category>macOS</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install AWS CLI on macOS</title><link>https://heyvaldemar.com/install-aws-cli-on-macos/</link><guid isPermaLink="true">https://heyvaldemar.com/install-aws-cli-on-macos/</guid><description>Step-by-step guide to install AWS CLI on macOS using the terminal. Learn how to download, install, and verify AWS CLI in minutes for seamless cloud management.</description><pubDate>Fri, 16 Sep 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import VideoPlayer from &quot;@components/VideoPlayer.astro&quot;;&lt;/p&gt;
&lt;p&gt;&amp;lt;VideoPlayer videoId=&quot;0yumgihEL1I&quot; title=&quot;Install AWS CLI on macOS&quot; /&amp;gt;&lt;/p&gt;
&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing AWS CLI on macOS.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://aws.amazon.com/cli/&quot;&gt;AWS CLI&lt;/a&gt; is a single tool for managing AWS services. With just one tool download, you can control many AWS services from the command line and automate them with scripts.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
AWS CLI is essential for scripting and automation workflows that exceed what the AWS Console provides. For infrastructure provisioning, Terraform or CloudFormation offer declarative alternatives with state management and drift detection. CLI is the right choice for ad-hoc operations, debugging, and scripting — while IaC tools should handle repeatable infrastructure deployments.
:::&lt;/p&gt;
&lt;p&gt;:::note
We will be using the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator.
:::&lt;/p&gt;
&lt;p&gt;Download the AWS CLI installer using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;curl &quot;https://awscli.amazonaws.com/AWSCLIV2.pkg&quot; -o &quot;AWSCLIV2.pkg&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-aws-cli-on-macos-1.webp&quot; alt=&quot;Install AWS CLI on macOS - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s start the AWS CLI installation using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo installer -pkg AWSCLIV2.pkg -target /
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-aws-cli-on-macos-2.webp&quot; alt=&quot;Install AWS CLI on macOS - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the password for the account and press &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-aws-cli-on-macos-3.webp&quot; alt=&quot;Install AWS CLI on macOS - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you can see the location of the executable file with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;which aws
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-aws-cli-on-macos-4.webp&quot; alt=&quot;Install AWS CLI on macOS - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can now view the installed version of AWS CLI using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;aws --version
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-aws-cli-on-macos-5.webp&quot; alt=&quot;Install AWS CLI on macOS - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Everything is ready to use the AWS CLI.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-aws-cli-on-macos-6.webp&quot; alt=&quot;Install AWS CLI on macOS - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can read more about how to configure AWS CLI in my guide &lt;a href=&quot;/configure-aws-cli/&quot;&gt;Configure AWS CLI&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>AWS</category><category>CLI</category><category>macOS</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Kubernetes on Ubuntu Server 22.04 LTS</title><link>https://heyvaldemar.com/install-kubernetes-on-ubuntu-server-22-04-lts/</link><guid isPermaLink="true">https://heyvaldemar.com/install-kubernetes-on-ubuntu-server-22-04-lts/</guid><description>Step-by-step guide to install Kubernetes on Ubuntu Server 22.04 LTS using kubeadm. Learn how to set up master and worker nodes with containerd and Calico.</description><pubDate>Fri, 09 Sep 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Kubernetes on Ubuntu Server 22.04 LTS.&lt;/p&gt;
&lt;p&gt;Kubernetes is an open-source container orchestration system for automating software deployment, scaling, and management.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-managed Kubernetes when you need full control over the control plane, custom CNI plugins, or on-premises orchestration in air-gapped environments. Amazon EKS, Google GKE, or Azure AKS provide managed alternatives that eliminate control plane maintenance. Self-managed clusters are justified when cloud-managed Kubernetes does not meet compliance, customization, or multi-cloud portability requirements.
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on a server, you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;p&gt;Kubernetes Master (Control Plane):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 6443 - for the Kubernetes API to work.&lt;/li&gt;
&lt;li&gt;TCP port 2379-2380 - for the etcd server client API to work.&lt;/li&gt;
&lt;li&gt;TCP port 10250 - for the Kubelet API to work.&lt;/li&gt;
&lt;li&gt;TCP port 10259 - for kube-scheduler to work.&lt;/li&gt;
&lt;li&gt;TCP port 10257 - for kube-controller-manager to work.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kubernetes Worker:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 0250 - for the Kubelet API to work.&lt;/li&gt;
&lt;li&gt;TCP port 30000-32767 - for NodePort Services to work.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;:::important
We will consider installing one server with the Master role and one server with the Worker role. In the future, you can independently add the required number of servers to ensure high availability.
:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which we plan to install the Kubernetes Master role.&lt;/p&gt;
&lt;p&gt;Assign a name to the server using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo hostnamectl set-hostname kubernetes-master-1.heyvaldemar.net
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this tutorial, &lt;code&gt;kubernetes-master-1.heyvaldemar.net&lt;/code&gt; is used as the name of the server with the Master role.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-1.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;The server with the Worker role must resolve the name of the server with the Master role, and also the server with the Master role must resolve the name of the server with the Worker role.&lt;/p&gt;
&lt;p&gt;Next, add the IP address and name of the server with the Master role to the &quot;/etc/hosts&quot; file using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;echo &quot;10.0.5.140 kubernetes-master-1.heyvaldemar.net kubernetes-master-1&quot; | sudo tee -a /etc/hosts
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Having this entry will allow the server with the agent installed to resolve the Kubernetes server name even without a DNS entry.&lt;/p&gt;
&lt;p&gt;:::note
In this guide, the server name with the Master role is &lt;code&gt;kubernetes-master-1.heyvaldemar.net&lt;/code&gt;, and the IP address is 10.0.5.140.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-2.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Make sure that the name of the server with the Worker role has the correct DNS entry, and also update the &quot;/etc/hosts&quot; file on the server with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;echo &quot;10.0.6.19 kubernetes-worker-1.heyvaldemar.net kubernetes-worker-1&quot; | sudo tee -a /etc/hosts
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Having this entry will allow the server with the agent installed to resolve the Kubernetes server name even without a DNS entry.&lt;/p&gt;
&lt;p&gt;:::note
In this guide, the Master server name is &lt;code&gt;kubernetes-worker-1.heyvaldemar.net&lt;/code&gt; and the IP address is 10.0.6.19.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-3.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Restart the hostamed service for the server name changes to take effect using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl restart systemd-hostnamed
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-4.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Check the correctness of the server name using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;hostname
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-5.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s replace the current shell process with the new one using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;exec bash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-6.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to disable the paging file using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo swapoff -a
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-7.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;The command above disables the swap file until the system is rebooted. We have to make sure that it stays off even after a reboot. To do this, edit the &quot;fstab&quot; file by commenting out the &quot;/swapfile&quot; line with the &quot;#&quot; symbol.&lt;/p&gt;
&lt;p&gt;We execute the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo sed -i &apos;/ swap / s/^\(.*\)$/#\1/g&apos; /etc/fstab
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-8.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Load the kernel modules with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo tee /etc/modules-load.d/containerd.conf &amp;lt;&amp;lt;EOF
overlay
br_netfilter
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-9.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Load the &quot;overlay&quot; module with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo modprobe overlay
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-10.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;Load the &quot;br_netfilter&quot; module with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo modprobe br_netfilter
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-11.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;Set the kernel options for Kubernetes with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo tee /etc/sysctl.d/kubernetes.conf &amp;lt;&amp;lt;EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-12.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;Apply the changes made using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo sysctl --system
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-13.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s add the official Docker key with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-14.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, we connect the Docker repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo add-apt-repository &quot;deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-15.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;We press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-16.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;Update the local package index to the latest changes in the repositories using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt update
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-17.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 17&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s install the packages required for Kubernetes to work using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates containerd.io
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-18.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 18&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to configure containerd.&lt;/p&gt;
&lt;p&gt;containerd - an industry-standard container runtime with an emphasis on simplicity, robustness and portability&lt;/p&gt;
&lt;p&gt;We execute the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;containerd config default | sudo tee /etc/containerd/config.toml &amp;gt;/dev/null 2&amp;gt;&amp;amp;1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-19.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 19&quot;&gt;&lt;/p&gt;
&lt;p&gt;We execute the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo sed -i &apos;s/SystemdCgroup \= false/SystemdCgroup \= true/g&apos; /etc/containerd/config.toml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-20.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 20&quot;&gt;&lt;/p&gt;
&lt;p&gt;Restart containerd to apply the changes, using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl restart containerd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-21.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 21&quot;&gt;&lt;/p&gt;
&lt;p&gt;We enable autostart of the containerd service at the start of the operating system using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl enable containerd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-22.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 22&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s add the official Kubernetes key using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-23.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 23&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, we connect the Kubernetes repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt-add-repository &quot;deb http://apt.kubernetes.io/ kubernetes-xenial main&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
At the time of writing this guide, Xenial is the current Kubernetes repository, but when the repository is available for Ubuntu 22.04 (Jammy Jellyfish), you will need to change the word in the command above from &quot;xenial&quot; to &quot;jammy&quot;.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-24.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 24&quot;&gt;&lt;/p&gt;
&lt;p&gt;We press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-25.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 25&quot;&gt;&lt;/p&gt;
&lt;p&gt;Update the local package index to the latest changes in the repositories using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt update
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-26.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 26&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now install the kubelet, kubeadm and kubectl packages using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install -y kubelet kubeadm kubectl
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-27.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 27&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to disable automatic updates and removal of installed packages using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt-mark hold kubelet kubeadm kubectl
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-28.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 28&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to start the initialization of the Kubernetes cluster using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo kubeadm init --control-plane-endpoint=kubernetes-master-1.heyvaldemar.net
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this tutorial, &lt;code&gt;kubernetes-master-1.heyvaldemar.net&lt;/code&gt; is used as the name of the server with the Master role.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-29.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 29&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
To add another server to the cluster, you will need to do the same work of installing and configuring the server, and then run the &lt;strong&gt;kubeadm join&lt;/strong&gt; command with the appropriate token for the server with the Master or Worker role.
:::&lt;/p&gt;
&lt;p&gt;Next, you need to run a few commands to start interacting with the cluster.&lt;/p&gt;
&lt;p&gt;We execute the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;mkdir -p $HOME/.kube
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-30.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 30&quot;&gt;&lt;/p&gt;
&lt;p&gt;We execute the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-31.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 31&quot;&gt;&lt;/p&gt;
&lt;p&gt;We execute the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo chown $(id -u):$(id -g) $HOME/.kube/config
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-32.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 32&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you can see the addresses of the master and services using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl cluster-info
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-33.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 33&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you can see a list of all nodes in the cluster and the status of each node using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl get nodes
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-34.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 34&quot;&gt;&lt;/p&gt;
&lt;p&gt;We connect to the server on which we plan to install the Kubernetes Worker role.&lt;/p&gt;
&lt;p&gt;Assign a name to the server using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo hostnamectl set-hostname kubernetes-worker-1.heyvaldemar.net
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This tutorial uses &lt;code&gt;kubernetes-worker-1.heyvaldemar.net&lt;/code&gt; as the name of the server with the Worker role.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-35.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 35&quot;&gt;&lt;/p&gt;
&lt;p&gt;The server with the Worker role must resolve the name of the server with the Master role, and also the server with the Master role must resolve the name of the server with the Worker role.&lt;/p&gt;
&lt;p&gt;Next, add the IP address and name of the server with the Master role to the &quot;/etc/hosts&quot; file using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;echo &quot;10.0.6.19 kubernetes-worker-1.heyvaldemar.net kubernetes-worker-1&quot; | sudo tee -a /etc/hosts
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Having this entry will allow the server with the agent installed to resolve the Kubernetes server name even without a DNS entry.&lt;/p&gt;
&lt;p&gt;:::note
In this guide, the Master server name is &lt;code&gt;kubernetes-worker-1.heyvaldemar.net&lt;/code&gt; and the IP address is 10.0.6.19.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-36.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 36&quot;&gt;&lt;/p&gt;
&lt;p&gt;Make sure that the name of the server with the Worker role has the correct DNS entry, and also update the &quot;/etc/hosts&quot; file on the server with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;echo &quot;10.0.5.140 kubernetes-master-1.heyvaldemar.net kubernetes-master-1&quot; | sudo tee -a /etc/hosts
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Having this entry will allow the server with the agent installed to resolve the Kubernetes server name even without a DNS entry.&lt;/p&gt;
&lt;p&gt;:::note
In this guide, the server name with the Master role is &lt;code&gt;kubernetes-master-1.heyvaldemar.net&lt;/code&gt;, and the IP address is 10.0.5.140.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-37.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 37&quot;&gt;&lt;/p&gt;
&lt;p&gt;Restart the hostamed service for the server name changes to take effect using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl restart systemd-hostnamed
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-38.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 38&quot;&gt;&lt;/p&gt;
&lt;p&gt;Check the correctness of the server name using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;hostname
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-39.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 39&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s replace the current shell process with the new one using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;exec bash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-40.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 40&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to disable the paging file using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo swapoff -a
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-41.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 41&quot;&gt;&lt;/p&gt;
&lt;p&gt;The command above disables the swap file until the system is rebooted. We have to make sure that it stays off even after a reboot. To do this, edit the &quot;fstab&quot; file by commenting out the &quot;/swapfile&quot; line with the &quot;#&quot; symbol.&lt;/p&gt;
&lt;p&gt;We execute the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo sed -i &apos;/ swap / s/^\(.*\)$/#\1/g&apos; /etc/fstab
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-42.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 42&quot;&gt;&lt;/p&gt;
&lt;p&gt;Load the kernel modules with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo tee /etc/modules-load.d/containerd.conf &amp;lt;&amp;lt;EOF
overlay
br_netfilter
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-43.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 43&quot;&gt;&lt;/p&gt;
&lt;p&gt;Load the &quot;overlay&quot; module with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo modprobe overlay
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-44.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 44&quot;&gt;&lt;/p&gt;
&lt;p&gt;Load the &quot;br_netfilter&quot; module with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo modprobe br_netfilter
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-45.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 45&quot;&gt;&lt;/p&gt;
&lt;p&gt;Set the kernel options for Kubernetes with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo tee /etc/sysctl.d/kubernetes.conf &amp;lt;&amp;lt;EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-46.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 46&quot;&gt;&lt;/p&gt;
&lt;p&gt;Apply the changes made using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo sysctl --system
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-47.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 47&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s add the official Docker key with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-48.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 48&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, we connect the Docker repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo add-apt-repository &quot;deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-49.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 49&quot;&gt;&lt;/p&gt;
&lt;p&gt;We press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-50.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 50&quot;&gt;&lt;/p&gt;
&lt;p&gt;Update the local package index to the latest changes in the repositories using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt update
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-51.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 51&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s install the packages required for Kubernetes to work using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates containerd.io
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-52.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 52&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to configure containerd.&lt;/p&gt;
&lt;p&gt;containerd - an industry-standard container runtime with an emphasis on simplicity, robustness and portability&lt;/p&gt;
&lt;p&gt;We execute the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;containerd config default | sudo tee /etc/containerd/config.toml &amp;gt;/dev/null 2&amp;gt;&amp;amp;1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-53.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 53&quot;&gt;&lt;/p&gt;
&lt;p&gt;We execute the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo sed -i &apos;s/SystemdCgroup \= false/SystemdCgroup \= true/g&apos; /etc/containerd/config.toml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-54.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 54&quot;&gt;&lt;/p&gt;
&lt;p&gt;Restart containerd to apply the changes, using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl restart containerd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-55.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 55&quot;&gt;&lt;/p&gt;
&lt;p&gt;We enable autostart of the containerd service at the start of the operating system using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl enable containerd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-56.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 56&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s add the official Kubernetes key using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-57.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 57&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, we connect the Kubernetes repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt-add-repository &quot;deb http://apt.kubernetes.io/ kubernetes-xenial main&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
At the time of writing this guide, Xenial is the current Kubernetes repository, but when the repository is available for Ubuntu 22.04 (Jammy Jellyfish), you will need to change the word in the command above from &quot;xenial&quot; to &quot;jammy&quot;.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-58.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 58&quot;&gt;&lt;/p&gt;
&lt;p&gt;We press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-59.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 59&quot;&gt;&lt;/p&gt;
&lt;p&gt;Update the local package index to the latest changes in the repositories using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt update
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-60.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 60&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now install the kubelet, kubeadm and kubectl packages using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install -y kubelet kubeadm kubectl
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-61.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 61&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to disable automatic updates and removal of installed packages using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt-mark hold kubelet kubeadm kubectl
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-62.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 62&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to add a server with the Worker role to the Kubernetes cluster using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo kubeadm join kubernetes-master-1.heyvaldemar.net:6443 --token 5xuqag.tefxcfleieexwbos \
 --discovery-token-ca-cert-hash sha256:8c3e8eb9d95cd16496db9f65956e2ce1c2164fa64d17a487374bd906dbc0dcb3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-63.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 63&quot;&gt;&lt;/p&gt;
&lt;p&gt;The server with the Worker role has successfully joined the Kubernetes cluster.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-64.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 64&quot;&gt;&lt;/p&gt;
&lt;p&gt;We return to the server with the Kubernetes Master role.&lt;/p&gt;
&lt;p&gt;Now you can see a list of all nodes in the cluster and the status of each node using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl get nodes
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-65.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 65&quot;&gt;&lt;/p&gt;
&lt;p&gt;The nodes are in the &quot;NotReady&quot; status. To fix this, you need to install CNI (Container Network Interface) or network add-ons such as Calico, Flannel and Weave-net.&lt;/p&gt;
&lt;p&gt;Download the Calico manifest with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;curl https://projectcalico.docs.tigera.io/manifests/calico.yaml -O
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-66.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 66&quot;&gt;&lt;/p&gt;
&lt;p&gt;Install Calico with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl apply -f calico.yaml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-67.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 67&quot;&gt;&lt;/p&gt;
&lt;p&gt;Check the status of the pods in the kube-system namespace with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl get pods -n kube-system
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-68.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 68&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you can see a list of all nodes in the cluster and the status of each node using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl get nodes
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-69.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 69&quot;&gt;&lt;/p&gt;
&lt;p&gt;The nodes are in the &quot;Ready&quot; status and the Kubernetes cluster is ready to go.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-kubernetes-on-ubuntu-server-22-04-lts-70.webp&quot; alt=&quot;Install Kubernetes on Ubuntu Server 22.04 LTS - Step 70&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>Kubernetes</category><category>Kubeadm</category><category>Ubuntu</category><category>Containers</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Ubuntu Server 22.04 LTS</title><link>https://heyvaldemar.com/install-ubuntu-server-22-04-lts/</link><guid isPermaLink="true">https://heyvaldemar.com/install-ubuntu-server-22-04-lts/</guid><description>Step-by-step guide to install Ubuntu Server 22.04 LTS. Covers language, disk setup, OpenSSH, user creation, and system configuration for beginners.</description><pubDate>Thu, 08 Sep 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Ubuntu Server 22.04 LTS.&lt;/p&gt;
&lt;p&gt;After booting from the Ubuntu Server 22.04 installation USB stick or DVD, begin by selecting the desired language for the welcome menu.&lt;/p&gt;
&lt;p&gt;Select &quot;English&quot; and press &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-22-04-lts-1.webp&quot; alt=&quot;Install Ubuntu Server 22.04 LTS - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you can choose a keyboard layout.&lt;/p&gt;
&lt;p&gt;Select your desired keyboard layout and click &quot;Done&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-22-04-lts-2.webp&quot; alt=&quot;Install Ubuntu Server 22.04 LTS - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to specify the installation type.&lt;/p&gt;
&lt;p&gt;Choose &quot;Ubuntu Server&quot; and click &quot;Done&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-22-04-lts-3.webp&quot; alt=&quot;Install Ubuntu Server 22.04 LTS - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;The installer will try to retrieve network settings using DHCP. You can adjust the IP address now or later.&lt;/p&gt;
&lt;p&gt;Click &quot;Done&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-22-04-lts-4.webp&quot; alt=&quot;Install Ubuntu Server 22.04 LTS - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;For proxy settings, we&apos;ll skip this step in our guide.&lt;/p&gt;
&lt;p&gt;Simply click &quot;Done&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-22-04-lts-5.webp&quot; alt=&quot;Install Ubuntu Server 22.04 LTS - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can specify an alternate mirror address if necessary.&lt;/p&gt;
&lt;p&gt;For this guide, leave it as default and click &quot;Done&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-22-04-lts-6.webp&quot; alt=&quot;Install Ubuntu Server 22.04 LTS - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Determine the installation location. All available space will be used.&lt;/p&gt;
&lt;p&gt;Choose &quot;Use an entire disk&quot; and then select &quot;Set up this disk as an LVM group&quot;.&lt;/p&gt;
&lt;p&gt;Click &quot;Done&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-22-04-lts-7.webp&quot; alt=&quot;Install Ubuntu Server 22.04 LTS - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Verify the partitions and click &quot;Done&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-22-04-lts-8.webp&quot; alt=&quot;Install Ubuntu Server 22.04 LTS - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to confirm your changes.&lt;/p&gt;
&lt;p&gt;To continue, click &quot;Continue&quot; and press &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-22-04-lts-9.webp&quot; alt=&quot;Install Ubuntu Server 22.04 LTS - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Provide the full username, server name, login, and password.&lt;/p&gt;
&lt;p&gt;Click &quot;Done&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-22-04-lts-10.webp&quot; alt=&quot;Install Ubuntu Server 22.04 LTS - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;If you plan to use SSH, choose &quot;Install OpenSSH server&quot;.&lt;/p&gt;
&lt;p&gt;Optionally, you can import SSH keys from Launchpad or Github.&lt;/p&gt;
&lt;p&gt;Click &quot;Done&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-22-04-lts-11.webp&quot; alt=&quot;Install Ubuntu Server 22.04 LTS - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select any other desired services or components.&lt;/p&gt;
&lt;p&gt;Click &quot;Done&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-22-04-lts-12.webp&quot; alt=&quot;Install Ubuntu Server 22.04 LTS - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;Monitor the installation progress until completion.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-22-04-lts-13.webp&quot; alt=&quot;Install Ubuntu Server 22.04 LTS - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;Once the installation is complete, click &quot;Reboot&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-22-04-lts-14.webp&quot; alt=&quot;Install Ubuntu Server 22.04 LTS - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;Remove the installation media.&lt;/p&gt;
&lt;p&gt;Finally, enter the username and password you set up earlier during the installation for authentication.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-22-04-lts-15.webp&quot; alt=&quot;Install Ubuntu Server 22.04 LTS - Step 15&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Ubuntu</category><category>Linux</category><category>Server</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Docker Engine and Docker Compose on Ubuntu Server</title><link>https://heyvaldemar.com/install-docker-engine-and-docker-compose-on-ubuntu-server/</link><guid isPermaLink="true">https://heyvaldemar.com/install-docker-engine-and-docker-compose-on-ubuntu-server/</guid><description>Learn how to install Docker Engine and Docker Compose on Ubuntu Server. Follow a clear, step-by-step guide to get Docker running quickly and securely.</description><pubDate>Mon, 08 Aug 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Docker Engine and Docker Compose on Ubuntu Server.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.docker.com/&quot;&gt;Docker&lt;/a&gt; is a container management system that allows you to &quot;package&quot; an application or website with all its environment and dependencies into a container that you can easily manage. For example, transfer to another server, scale, or update.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-managed Docker Engine when you need full control over container runtime configuration, storage drivers, and network plugins. Amazon ECS, Google Cloud Run, or Azure Container Instances provide managed alternatives that eliminate host-level maintenance. Self-managed Docker is justified when you need custom runtime configuration, on-premises deployment, or want to avoid cloud vendor lock-in at the container runtime layer.
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on a server, you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which you plan to install the Docker Engine.&lt;/p&gt;
&lt;p&gt;Download the Docker Engine and Docker Compose installation script using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;curl -fsSL https://get.docker.com -o get-docker.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-docker-engine-and-docker-compose-on-ubuntu-server-1.webp&quot; alt=&quot;Install Docker Engine and Docker Compose on Ubuntu Server - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s start the Docker Engine and Docker Compose installation using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sh get-docker.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-docker-engine-and-docker-compose-on-ubuntu-server-2.webp&quot; alt=&quot;Install Docker Engine and Docker Compose on Ubuntu Server - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to make sure the Docker Engine is installed correctly. To do this, you need to run the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker version
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-docker-engine-and-docker-compose-on-ubuntu-server-3.webp&quot; alt=&quot;Install Docker Engine and Docker Compose on Ubuntu Server - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to make sure the Docker Compose is installed correctly. To do this, you need to run the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose version
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-docker-engine-and-docker-compose-on-ubuntu-server-4.webp&quot; alt=&quot;Install Docker Engine and Docker Compose on Ubuntu Server - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Based on the received messages, the Docker Engine and Docker Compose are installed correctly.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-docker-engine-and-docker-compose-on-ubuntu-server-5.webp&quot; alt=&quot;Install Docker Engine and Docker Compose on Ubuntu Server - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you can add a user to the &quot;docker&quot; group to run the Docker Engine without having to use &quot;sudo&quot;.&lt;/p&gt;
&lt;p&gt;Add the user &quot;ubuntu&quot; to the &quot;docker&quot; group using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo usermod -aG docker $USER
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-docker-engine-and-docker-compose-on-ubuntu-server-6.webp&quot; alt=&quot;Install Docker Engine and Docker Compose on Ubuntu Server - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;To apply changes you need to log out and log back in again, which will cause your new session to have the proper group.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>Docker</category><category>Ubuntu</category><category>Containers</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Rocket.Chat on Ubuntu Server</title><link>https://heyvaldemar.com/install-rocket-chat-on-ubuntu-server/</link><guid isPermaLink="true">https://heyvaldemar.com/install-rocket-chat-on-ubuntu-server/</guid><description>Step-by-step guide to install Rocket.Chat on Ubuntu Server using Nginx, MongoDB, and Let&apos;s Encrypt SSL. Ideal for secure self-hosted communication.</description><pubDate>Wed, 13 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Rocket.Chat on Ubuntu Server.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.rocket.chat/&quot;&gt;Rocket.Chat&lt;/a&gt; is an open-source fully customizable communications platform developed in JavaScript for organizations with high standards of data protection.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted Rocket.Chat when your organization requires on-premises team messaging with full message retention control and custom integrations. Slack provides a managed alternative with a richer app ecosystem and lower operational overhead. Self-hosting is justified in regulated industries where chat data must remain within your network perimeter or when you need unlimited message history without SaaS tier limits.
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on a server, you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to receive a free cryptographic certificate through the Let&apos;s Encrypt CA.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the Rocket.Chat web interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which you plan to install Rocket.Chat.&lt;/p&gt;
&lt;p&gt;:::note
To obtain and subsequently renew a free SSL certificate, we will use the Let&apos;s Encrypt certification authority, as well as the Certbot software client, which is designed to make it as easy as possible to obtain and renew a certificate through the Let&apos;s Encrypt certification authority.
:::&lt;/p&gt;
&lt;p&gt;:::note
This tutorial will use MongoDB as the database management system and Nginx as the webserver.
:::&lt;/p&gt;
&lt;p&gt;To install MongoDB, you need to import the MongoDB public key and add a new repository.&lt;/p&gt;
&lt;p&gt;Import the MongoDB public key using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;wget -qO - https://www.mongodb.org/static/pgp/server-5.0.asc | sudo apt-key add -
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-1.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s add the MongoDB repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;echo &quot;deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/5.0 multiverse&quot; | sudo tee /etc/apt/sources.list.d/mongodb-org-5.0.list
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-2.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Update the local package index to the latest changes in the repositories using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt update
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-3.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s make it possible to install Node.js through the package manager using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;curl -sL https://deb.nodesource.com/setup_14.x | sudo bash -
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-4.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s install the packages necessary for Rocket.Chat to work using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install -y nginx certbot python3-certbot-nginx nodejs build-essential mongodb-org graphicsmagick
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
This tutorial will use MongoDB as the database management system and Nginx as the web server.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-5.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;For Rocket.Chat to work correctly, it is recommended to use Node.js version 14.18.3.&lt;/p&gt;
&lt;p&gt;Let&apos;s install a tool called &quot;n&quot; so that we can change the version of Node.js with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo npm install -g inherits n
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-6.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, install Node.js version 14.18.3 using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo n 14.18.3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-7.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now, to increase the security level of the webserver, it is necessary to obtain a cryptographic certificate for the domain or subdomain, through which the Multicraft control panel will be accessible from the Internet.&lt;/p&gt;
&lt;p&gt;:::note
To obtain and subsequently renew a free SSL certificate, we will use the Let&apos;s Encrypt certification authority, as well as the Certbot software client, which is designed to make it as easy as possible to obtain and renew a certificate through the Let&apos;s Encrypt certification authority.
:::&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, the &lt;code&gt;rocketchat.heyvaldemar.net&lt;/code&gt; subdomain will be used to access Rocket.Chat from the Internet. You will need to specify your domain or subdomain by which your Rocket.Chat will be available from the Internet.
:::&lt;/p&gt;
&lt;p&gt;Request a cryptographic certificate using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo certbot --nginx -d rocketchat.heyvaldemar.net
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-8.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, specify the email address to which Let&apos;s Encrypt will send notifications about the expiration of the cryptographic certificate and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-9.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to read and accept the terms of use of the services provided.&lt;/p&gt;
&lt;p&gt;Press the &quot;a&quot; button, then &quot;Enter&quot; if you agree with the terms of use of the services provided.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-10.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to choose whether you want to share the email address you provided earlier with the Electronic Frontier Foundation to receive newsletters.&lt;/p&gt;
&lt;p&gt;Press the &quot;n&quot; button, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-11.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to choose whether you want the Nginx configuration file to have parameters automatically added to automatically redirect HTTP traffic to HTTPS.&lt;/p&gt;
&lt;p&gt;Press the &quot;1&quot; button, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-12.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
Cryptographic certificates obtained through the Let&apos;s Encrypt Certificate Authority are valid for ninety days. Certbot automatically adds a certificate renewal script to the task scheduler and the script runs twice a day, automatically renewing any cryptographic certificate that expires within thirty days.
:::&lt;/p&gt;
&lt;p&gt;You can check the operability of the cryptographic certificate renewal process using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo certbot renew --dry-run
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-13.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s configure Nginx for subsequent work with Rocket.Chat.&lt;/p&gt;
&lt;p&gt;First, you need to make changes to the Nginx configuration file by opening it in a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/nginx/nginx.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-14.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hit the &quot;i&quot; button to go into edit mode, find the parameter &quot;server_names_hash_bucket_size 64;&quot; and uncomment it by removing the &quot;#&quot; symbol.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-15.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-16.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to create a block (called virtual hosts in Apache), with which Rocket.Chat will work in the future.&lt;/p&gt;
&lt;p&gt;Let&apos;s create a virtual host file using a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/nginx/sites-available/rocketchat.heyvaldemar.net
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this tutorial, the &lt;code&gt;rocketchat.heyvaldemar.net&lt;/code&gt; subdomain will be used to access Rocket.Chat from the Internet. You will need to specify your domain or subdomain by which your Rocket.Chat will be available from the Internet.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-17.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 17&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hit the &quot;i&quot; button to go into edit mode, then insert the following configuration for the webserver to work.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-nginx&quot;&gt;upstream backend {
    server 127.0.0.1:3000;
}

server {
    listen [::]:443 ssl ipv6only=on;
    listen 443 ssl;
    server_name rocketchat.heyvaldemar.net;

    # You can increase the limit if your need to.
    client_max_body_size 200M;

    error_log /var/log/nginx/rocketchat.access.log;

    ssl on;
    ssl_certificate /etc/letsencrypt/live/rocketchat.heyvaldemar.net/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/rocketchat.heyvaldemar.net/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {
        proxy_pass http://backend/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection &quot;upgrade&quot;;
        proxy_set_header Host $http_host;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forward-Proto http;
        proxy_set_header X-Nginx-Proxy true;

        proxy_redirect off;
    }
}

server {
    if ($host = rocketchat.heyvaldemar.net) {
        return 301 https://$host$request_uri;
    }
        listen 80;
        listen [::]:80;
        server_name rocketchat.heyvaldemar.net;
        return 404;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this tutorial, the &lt;code&gt;rocketchat.heyvaldemar.net&lt;/code&gt; subdomain will be used to access Rocket.Chat from the Internet. You will need to specify your domain or subdomain by which your Rocket.Chat will be available from the Internet.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-18.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 18&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-19.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 19&quot;&gt;&lt;/p&gt;
&lt;p&gt;Activate the created block using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo ln -s /etc/nginx/sites-available/rocketchat.heyvaldemar.net /etc/nginx/sites-enabled/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-20.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 20&quot;&gt;&lt;/p&gt;
&lt;p&gt;Deactivate the block created by default using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo unlink /etc/nginx/sites-enabled/default
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-21.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 21&quot;&gt;&lt;/p&gt;
&lt;p&gt;Verify that there are no errors in the syntax of the new Nginx configuration file using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo nginx -t
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-22.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 22&quot;&gt;&lt;/p&gt;
&lt;p&gt;Restart Nginx to apply the changes, using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl restart nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-23.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 23&quot;&gt;&lt;/p&gt;
&lt;p&gt;Verify that Nginx has successfully started using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl status nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-24.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 24&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s download the archive &quot;rocket.chat.tgz&quot; containing the files for installing Rocket.Chat using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;curl -L https://releases.rocket.chat/latest/download -o /tmp/rocket.chat.tgz
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-25.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 25&quot;&gt;&lt;/p&gt;
&lt;p&gt;Unpack the downloaded archive &quot;rocket.chat.tgz&quot; using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;tar -xzf /tmp/rocket.chat.tgz -C /tmp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-26.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 26&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s delete the previously downloaded &quot;rocket.chat.tgz&quot; archive containing the files for installing Rocket.Chat using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;rm -f /tmp/rocket.chat.tgz
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-27.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 27&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s go to the &quot;server&quot; folder using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd /tmp/bundle/programs/server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-28.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 28&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s start the installation of Rocket.Chat using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;npm install
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-29.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 29&quot;&gt;&lt;/p&gt;
&lt;p&gt;Rename the &quot;bundle&quot; folder to &quot;Rocket.Chat&quot; using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo mv /tmp/bundle /opt/Rocket.Chat
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-30.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 30&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s create the &quot;rocket&quot; user, which will be used to launch Rocket.Chat, with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo useradd -M rocketchat
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-31.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 31&quot;&gt;&lt;/p&gt;
&lt;p&gt;Block the user with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo usermod -L rocketchat
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-32.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 32&quot;&gt;&lt;/p&gt;
&lt;p&gt;Assign the correct rights to the &quot;/opt/Rocket.Chat&quot; directory using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo chown -R rocketchat:rocketchat /opt/Rocket.Chat
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-33.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 33&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to configure the autostart of the Rocket.Chat service when the operating system starts.&lt;/p&gt;
&lt;p&gt;Let&apos;s create a unit that will contain the necessary configuration for the Rocket.Chat service in the &quot;/etc/systemd/system/&quot; directory using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /lib/systemd/system/rocketchat.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-34.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 34&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hit the &quot;i&quot; button to go into edit mode, then insert the following configuration for the webserver to work.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-ini&quot;&gt;[Unit]
Description=The Rocket.Chat server
After=network.target remote-fs.target nss-lookup.target nginx.target mongod.target

[Service]
ExecStart=/usr/bin/node /opt/Rocket.Chat/main.js
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=rocketchat
User=rocketchat
# Rocket.Chat URL (replace with yours)
Environment=MONGO_URL=mongodb://localhost:27017/rocketchat?replicaSet=rs01 MONGO_OPLOG_URL=mongodb://localhost:27017/local?replicaSet=rs01 ROOT_URL=https://rocketchat.heyvaldemar.net/ PORT=3000

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this tutorial, the &lt;code&gt;rocketchat.heyvaldemar.net&lt;/code&gt; subdomain will be used to access Rocket.Chat from the Internet. You will need to specify your domain or subdomain by which your Rocket.Chat will be available from the Internet.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-35.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 35&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-36.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 36&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s make changes to the MongoDB configuration using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo sed -i &quot;s/^# engine:/ engine: mmapv1/&quot; /etc/mongod.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-37.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 37&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, let&apos;s make one more change to the MongoDB configuration using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo sed -i &quot;s/^#replication:/replication:\n replSetName: rs01/&quot; /etc/mongod.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-38.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 38&quot;&gt;&lt;/p&gt;
&lt;p&gt;We enable autostart of the MongoDB service at operating system startup using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl enable mongod
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-39.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 39&quot;&gt;&lt;/p&gt;
&lt;p&gt;Start MongoDB with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl start mongod
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-40.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 40&quot;&gt;&lt;/p&gt;
&lt;p&gt;Check that MongoDB started successfully with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl status mongod
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-41.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 41&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s check that MongoDB is working correctly with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;mongo --eval &quot;printjson(rs.initiate())&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-42.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 42&quot;&gt;&lt;/p&gt;
&lt;p&gt;We enable autostart of the Rocket.Chat service when the operating system starts using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl enable rocketchat
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-43.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 43&quot;&gt;&lt;/p&gt;
&lt;p&gt;Launch Rocket.Chat with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl start rocketchat
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-44.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 44&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s check that Rocket.Chat has successfully launched using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl status rocketchat
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-45.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 45&quot;&gt;&lt;/p&gt;
&lt;p&gt;All necessary services have been successfully launched.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-46.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 46&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Rocket.Chat management panel, go to &lt;code&gt;https://rocketchat.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;rocketchat.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you need to specify your domain name that points to the IP address of your server with the installed Rocket.Chat service.&lt;/p&gt;
&lt;p&gt;Next, we need to create a new user who will have administrator rights in Rocket.Chat.&lt;/p&gt;
&lt;p&gt;In the &quot;Full name&quot; field, enter the first and last name for the new Rocket.Chat user.&lt;/p&gt;
&lt;p&gt;In the &quot;Username&quot; field, specify a login for the new Rocket.Chat user.&lt;/p&gt;
&lt;p&gt;In the &quot;Email&quot; field, provide a current email address for the new Rocket.Chat user.&lt;/p&gt;
&lt;p&gt;In the &quot;Password&quot; field, set a secure password for the new Rocket.Chat user.&lt;/p&gt;
&lt;p&gt;Click the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-47.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 47&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now, you need to fill in the information about your organization.&lt;/p&gt;
&lt;p&gt;In the &quot;Organization name&quot; field, enter the name of your organization.&lt;/p&gt;
&lt;p&gt;In the &quot;Organization industry&quot; field, specify the profile or sector of your organization.&lt;/p&gt;
&lt;p&gt;In the &quot;Organization size&quot; field, indicate the number of employees in your organization.&lt;/p&gt;
&lt;p&gt;In the &quot;Country&quot; field, specify the country where your organization operates.&lt;/p&gt;
&lt;p&gt;Click the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-48.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 48&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now, you need to register your server to use services such as mobile push notifications, integration with external providers, and more.&lt;/p&gt;
&lt;p&gt;In the &quot;Cloud account email&quot; field, provide a current email address.&lt;/p&gt;
&lt;p&gt;Next, you should read and accept the terms of use for the provided services.&lt;/p&gt;
&lt;p&gt;Click the &quot;Register&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-49.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 49&quot;&gt;&lt;/p&gt;
&lt;p&gt;You will receive an email at the address provided earlier with a link to register your Rocket.Chat server.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-50.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 50&quot;&gt;&lt;/p&gt;
&lt;p&gt;Find the email and click on the &quot;Verify registration&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-51.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 51&quot;&gt;&lt;/p&gt;
&lt;p&gt;Your server has been successfully registered.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-52.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 52&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Rocket.Chat control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-rocket-chat-on-ubuntu-server-53.webp&quot; alt=&quot;Install Rocket.Chat on Ubuntu Server - Step 53&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Self-Hosting</category><category>Rocket.Chat</category><category>Chat</category><category>Ubuntu</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Stand with Ukraine</title><link>https://heyvaldemar.com/stand-with-ukraine/</link><guid isPermaLink="true">https://heyvaldemar.com/stand-with-ukraine/</guid><description>Learn why standing with Ukraine matters. Explore the truth behind Russia&apos;s invasion, political repression, and how you can support Ukraine today.</description><pubDate>Thu, 24 Feb 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This blog is usually IT guides and advice. Not today. Today it stands as a voice against the lies and the injustice the bloody Russian regime has forced onto our world.&lt;/p&gt;
&lt;h2&gt;The Disinformation Landscape in Russia&lt;/h2&gt;
&lt;p&gt;Freedom of speech in Russia exists on paper. In practice, no. Reliable information is hard to find in Russian-language open sources. Most Russian media pass their reporting through the filter of state propaganda, and what comes out reflects the interests of the political leadership rather than the facts.&lt;/p&gt;
&lt;p&gt;Even so, the important information is out there. Anyone can reach it through &lt;a href=&quot;https://linktr.ee/ukraine_ua&quot;&gt;verified sources&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./stand-with-ukraine-1.webp&quot; alt=&quot;Ukrainian emergency workers respond after Russian missile attack on January 2, 2024&quot;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;The State Emergency Service continues to deal with the aftermath of Russia&apos;s massive missile attack on Ukraine on January 2, 2024. Photo from State Emergency Service of Ukraine&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Condemnation of the Invasion&lt;/h2&gt;
&lt;p&gt;As the founder and chief editor, I do more than condemn the Russian military invasion of Ukraine. I hold it in deep contempt. It is a blatant war crime. It has already taken hundreds of thousands of lives, children among them. The Russian government and President Vladimir Putin bear responsibility personally. So do the citizens of Russia, whose political indifference and inaction made another war possible.&lt;/p&gt;
&lt;h2&gt;The Suppression of Dissent in Russia&lt;/h2&gt;
&lt;p&gt;There was a time when Russians could speak more freely. The contrast with now is stark. Back in 2006, human rights activist Lev Ponomarev was arrested and held for three days after organizing a picket in Moscow. At the time, that counted as a relatively mild response.&lt;/p&gt;
&lt;p&gt;The years since changed everything. Legislation tightened the rules for holding protests, pushed fines far higher, and added criminal liability for repeat violations of the law on rallies. Since 2014, nine of the thirteen significant amendments to that law have been aimed at narrowing the right to peaceful assembly. The result is plain. In the eyes of the authorities, a peaceful street protest is now a crime, and for the Russians who still believe protest is their right, an act of heroism.&lt;/p&gt;
&lt;p&gt;Mass arrests of peaceful protesters, often with brutal treatment by the police, have become routine. And when the police use excessive force, as they did in January 2021, the authorities say nothing. That silence is what keeps the impunity going.&lt;/p&gt;
&lt;h2&gt;Legal Crackdown on Protests&lt;/h2&gt;
&lt;p&gt;The point of those examples is simple. When the rules were looser, Russian society had room to disagree with the authorities without fearing serious consequences. That room mattered. It is what lets political activism shift the public and political situation through peaceful demonstration.&lt;/p&gt;
&lt;h2&gt;Key Resources on Civil Liberties in Russia&lt;/h2&gt;
&lt;p&gt;These links go deeper on how the legal regulation of protest in Russia developed and changed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Freedom_of_assembly_in_Russia&quot;&gt;Wikipedia: Freedom of assembly in Russia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amnesty.org/en/latest/news/2021/08/russia-end-of-the-road-for-those-seeking-to-exercise-their-right-to-protest/&quot;&gt;Amnesty International: Russia: End of the road for those seeking to exercise their right to protest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.hrw.org/news/2022/03/07/russia-criminalizes-independent-war-reporting-anti-war-protests&quot;&gt;Human Rights Watch: Russia Criminalizes Independent War Reporting, Anti-War Protests&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Russia&apos;s Modern Military Conflicts&lt;/h2&gt;
&lt;p&gt;Since 1991, modern Russia has taken part in a long list of military conflicts. Some of the key wars:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;First Chechen War (1994-1996)&lt;/li&gt;
&lt;li&gt;Second Chechen War (1999-2009)&lt;/li&gt;
&lt;li&gt;Russo-Georgian War (2008)&lt;/li&gt;
&lt;li&gt;Annexation of Crimea and intervention in Ukraine (since 2014)&lt;/li&gt;
&lt;li&gt;Military intervention in Syria (since 2015)&lt;/li&gt;
&lt;li&gt;Invasion of Ukraine (since 2022)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;More detail on these and other conflicts is on the &lt;a href=&quot;https://en.wikipedia.org/wiki/List_of_wars_involving_Russia&quot;&gt;Wikipedia page listing wars involving Russia&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./stand-with-ukraine-2.webp&quot; alt=&quot;Ukrainian soldiers on patrol in frontline city of Avdiivka during Russian offensive&quot;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Two Ukrainian soldiers walk along the frontline city of Avdiivka in the Donetsk region. It is one of the hotspots nowadays after Russia launched a major offensive in mid-October 2023. Photo by Kostiantyn Liberov &amp;amp; Vlada Liberova / Getty Images&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;How You Can Help Ukraine&lt;/h2&gt;
&lt;p&gt;This is a historic moment, and I am asking you, our readers, to stand against this violence. What you do for Ukraine matters more than you think. Money, support for refugees, asylum, supplies: every one of those is a step toward peace and human dignity in a time that gives little of either. Solidarity and resolve can outlast cruelty and lawlessness. I believe that.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./stand-with-ukraine-3.webp&quot; alt=&quot;Civilian walks with bicycle through destroyed street in Avdiivka after Russian shelling&quot;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;A man with a bicycle goes through the city during a break between Russian shellings in the frontline Avdiivka, the Donetsk region. October 17, 2023. Photo by Ozge Elif Kizil / Anadolu Agency / Getty Images&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you want to help the people of Ukraine, use these official and verified resources:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://u24.gov.ua/&quot;&gt;UNITED24&lt;/a&gt;: This is the official platform for collecting charitable donations to support Ukraine, launched by the President of Ukraine, Volodymyr Zelenskyy. Here you can direct funds to defense, humanitarian demining, medical assistance, reconstruction of Ukraine, as well as education and science.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://eu-solidarity-ukraine.ec.europa.eu/index_ru&quot;&gt;EU Solidarity with Ukraine&lt;/a&gt;: This European Union initiative provides information on how to help Ukrainians who have fled the war or stayed in Ukraine. The website lists various organizations, including major international agencies and charitable organizations, providing assistance on the ground.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://help.unicef.org/ukraine-emergency-mv&quot;&gt;UNICEF assistance to Ukraine&lt;/a&gt;: This international organization urgently needs funds to assist children and their families in Ukraine. UNICEF provides assistance in safe water supply, healthcare, education, and protection.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Each of these sends aid where it is needed most, and each makes sure your contribution is used effectively and transparently.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./stand-with-ukraine-4.webp&quot; alt=&quot;Ukrainian soldier in trench near Kharkiv frontline pets a dog during combat duty&quot;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Artem, a serviceman of the infantry battalion of the 61st Mechanised Brigade, pets a dog in a trench at a position near the frontline in the Kharkiv region. Photo by Sofia Gatilova / Reuters&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Photos from the Frontline&lt;/h2&gt;
&lt;p&gt;View more &lt;a href=&quot;https://war.ukraine.ua/photos/&quot;&gt;photos of the war in Ukraine&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Words of Hope and Resolve&lt;/h2&gt;
&lt;p&gt;import VideoPlayer from &quot;@components/VideoPlayer.astro&quot;;&lt;/p&gt;
&lt;p&gt;&amp;lt;VideoPlayer videoId=&quot;9RtSN8hCz70?start=18&quot; title=&quot;Stand with Ukraine&quot; /&amp;gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Fight and you shall overcome!&lt;br&gt;
God helps you!&lt;br&gt;
With you are truth, glory&lt;br&gt;
And holy freedom!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;Taras Shevchenko, “Caucasus”, 1859&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In Ukrainian&lt;/strong&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Борітеся — поборете!&lt;br&gt;
Вам Бог помагає!&lt;br&gt;
За вас правда, за вас слава&lt;br&gt;
І воля святая!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;Тарас Шевченко, &quot;Кавказ&quot;, 1859&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>Opinion &amp; Culture</category><category>Politics</category><category>Ukraine</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>What is DevOps?</title><link>https://heyvaldemar.com/what-is-devops/</link><guid isPermaLink="true">https://heyvaldemar.com/what-is-devops/</guid><description>What is DevOps? Learn how it unites developers and IT with CI/CD, automation, and collaboration to ship software faster and more reliably.</description><pubDate>Fri, 28 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;There was a time when devs wrote code and threw it over the wall like a grenade. Ops teams caught it, if they were lucky, then duct-taped it into production and prayed nothing caught fire.&lt;/p&gt;
&lt;p&gt;Spoiler: stuff caught fire. Often.&lt;/p&gt;
&lt;p&gt;That broken model is what gave birth to &lt;strong&gt;DevOps&lt;/strong&gt;. Not some trendy buzzword. Not a fancy job title. It was a response to pain, the kind you only understand once you&apos;ve been paged at 3AM because someone&apos;s “worked on my machine” code just killed your live database.&lt;/p&gt;
&lt;p&gt;No fluff. Just facts.&lt;/p&gt;
&lt;h2&gt;Dev vs Ops: A Dysfunctional Relationship&lt;/h2&gt;
&lt;p&gt;Before DevOps, here&apos;s how it usually went down:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dev team&lt;/strong&gt;: Push new features as fast as humanly possible.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ops team&lt;/strong&gt;: Block new changes to keep uptime at 99.99%.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Same company. Totally different goals. Zero shared context.&lt;/p&gt;
&lt;p&gt;The result? Fragile handoffs, late-night deploy disasters, and finger-pointing marathons during postmortems.&lt;/p&gt;
&lt;p&gt;Here&apos;s the classic line:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“It worked on my machine.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Translation? “Not my problem.”&lt;/p&gt;
&lt;h2&gt;Enter DevOps: Collaboration by Necessity&lt;/h2&gt;
&lt;p&gt;DevOps exists because &lt;strong&gt;speed without stability is chaos&lt;/strong&gt;, and &lt;strong&gt;stability without speed is irrelevance&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;It&apos;s not just about tools. It&apos;s about mindset. A culture shift.&lt;/p&gt;
&lt;h3&gt;What DevOps really means&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Developers own more of production.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ops people get involved earlier in the lifecycle.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Everyone stops treating deployment like defusing a bomb.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DevOps unites developers, sysadmins, QA, and security under a shared mission: &lt;strong&gt;ship better software, faster, and keep it running.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;The DevOps Pillars (From People Who&apos;ve Been in the Trenches)&lt;/h2&gt;
&lt;p&gt;John Willis (co-author of &lt;em&gt;The DevOps Handbook&lt;/em&gt;) gave us the CAMS model:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Culture, Automation, Measurement, and Sharing&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That&apos;s the spine of real DevOps. Not Kubernetes. Not YAML. &lt;strong&gt;People first.&lt;/strong&gt; Then tools.&lt;/p&gt;
&lt;p&gt;Brian Dawson from CloudBees adds another lens:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;People and culture, process and practice, tools and technology&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Notice how “tools” is last? That&apos;s not an accident.&lt;/p&gt;
&lt;p&gt;Too many teams buy Jenkins and call it DevOps. That&apos;s like buying a guitar and calling yourself a musician.&lt;/p&gt;
&lt;h2&gt;DevOps in Practice: What It Looks Like When It Works&lt;/h2&gt;
&lt;p&gt;When DevOps clicks, you get:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CI/CD pipelines&lt;/strong&gt; that catch bugs before prod ever sees them&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automated tests&lt;/strong&gt; that run on every pull request&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deploys on demand&lt;/strong&gt;, not “Fridays only” horror shows&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monitoring and alerts&lt;/strong&gt; wired in from day one&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Blameless postmortems&lt;/strong&gt; that actually fix things instead of fixing blame&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And the numbers back it up. Companies doing DevOps right:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Deploy faster (daily, not quarterly)&lt;/li&gt;
&lt;li&gt;Fail less often, and recover quicker when they do&lt;/li&gt;
&lt;li&gt;Have happier engineers who don&apos;t live on pager duty&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./what-is-devops-1.webp&quot; alt=&quot;DevOps lifecycle diagram showing collaboration between Development, QA, and IT Operations with automated builds, tests, deploys, and monitoring&quot;&gt;&lt;/p&gt;
&lt;h2&gt;It&apos;s Not Optional Anymore&lt;/h2&gt;
&lt;p&gt;You don&apos;t “try” DevOps like a weekend side project. You do it because &lt;strong&gt;modern software delivery demands it&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;If you&apos;re deploying weekly by hand, praying nothing breaks, and manually SSHing into servers to debug? You&apos;re not just behind. You&apos;re building a future incident.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“DevOps is how successful companies industrialize software delivery.”
— &lt;strong&gt;Brian Dawson, CloudBees&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In other words: it&apos;s how grown-ups ship software now.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Devs and Ops used to be siloed. That broke everything.&lt;/li&gt;
&lt;li&gt;DevOps = shared ownership, faster feedback, and automation everywhere.&lt;/li&gt;
&lt;li&gt;Tools matter, but culture matters more.&lt;/li&gt;
&lt;li&gt;Done right, DevOps improves release speed &lt;em&gt;and&lt;/em&gt; system reliability.&lt;/li&gt;
&lt;li&gt;You&apos;re not &quot;too small&quot; for DevOps. You&apos;re just early.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Next Step&lt;/h2&gt;
&lt;p&gt;Want to start? Here&apos;s where to look:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Set up a real CI pipeline. Jenkins, GitHub Actions, GitLab, whatever.&lt;/li&gt;
&lt;li&gt;Make &lt;strong&gt;one&lt;/strong&gt; thing automatic: tests, builds, deploys, doesn&apos;t matter. Start somewhere.&lt;/li&gt;
&lt;li&gt;Run a postmortem without blaming anyone. Learn. Repeat.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And if you&apos;re still arguing about who owns uptime?
Congratulations — you&apos;re overdue for a DevOps intervention.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>CI/CD</category><category>Culture</category><category>Automation</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>What is the Cloud?</title><link>https://heyvaldemar.com/what-is-the-cloud/</link><guid isPermaLink="true">https://heyvaldemar.com/what-is-the-cloud/</guid><description>Explore the history of cloud computing and how SaaS, PaaS, and IaaS models from AWS, Azure, and GCP power today&apos;s digital infrastructure.</description><pubDate>Thu, 27 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Straight answer first.&lt;/p&gt;
&lt;p&gt;The cloud isn&apos;t magic. It&apos;s not a revolution, and it&apos;s definitely not new. It&apos;s &lt;strong&gt;rented computers&lt;/strong&gt;. Someone else&apos;s datacenter, wrapped in APIs and billing dashboards and enough marketing jargon to make your eyes bleed.&lt;/p&gt;
&lt;p&gt;Doesn&apos;t mean it doesn&apos;t matter.&lt;/p&gt;
&lt;p&gt;If you build, deploy, or run software today, you&apos;re in the cloud whether you like it or not. So here&apos;s the plain version, no Gartner-speak: what you&apos;re using, what you&apos;re paying for, and where the real complexity hides.&lt;/p&gt;
&lt;h2&gt;Flashback: the cloud is just the mainframe all over again&lt;/h2&gt;
&lt;p&gt;Back in the `60s, computing was a shared service. You didn&apos;t own a computer. You bought time on one. Batch jobs, punch cards, big centralized boxes.&lt;/p&gt;
&lt;p&gt;Then personal computers showed up. Then client-server. Then web apps. And eventually, surprise, we looped right back around.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“The Cloud” is just mainframes for the modern age — except this time it&apos;s running on someone else&apos;s rack, and you pay by the second.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It scales, too. And it usually works.&lt;/p&gt;
&lt;h2&gt;Cloud = renting what you used to buy&lt;/h2&gt;
&lt;p&gt;Say you want to deploy an app. In the pre-cloud world, you&apos;d:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Buy a physical server&lt;/li&gt;
&lt;li&gt;Rack it&lt;/li&gt;
&lt;li&gt;Install Linux&lt;/li&gt;
&lt;li&gt;Set up firewalls, monitoring, backups, etc.&lt;/li&gt;
&lt;li&gt;Wait 3 weeks for procurement&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now? You open AWS, click a few buttons (or better, run &lt;code&gt;terraform apply&lt;/code&gt;), and a server in Singapore is running your code inside of minutes.&lt;/p&gt;
&lt;p&gt;That&apos;s the whole idea: &lt;strong&gt;pay-as-you-go access to computing resources&lt;/strong&gt;. No upfront hardware. No maintenance contract. No yelling at procurement.&lt;/p&gt;
&lt;h2&gt;The three cloud models, minus the sales pitch&lt;/h2&gt;
&lt;p&gt;This is where the industry loves to chuck acronyms at you. SaaS, PaaS, IaaS. I&apos;ll walk them like an engineer would, not a vendor.&lt;/p&gt;
&lt;h3&gt;1. &lt;strong&gt;IaaS: Infrastructure as a Service&lt;/strong&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What you get:&lt;/strong&gt; VMs, storage, networks.
&lt;strong&gt;What you manage:&lt;/strong&gt; Everything above the OS.
&lt;strong&gt;Example:&lt;/strong&gt; AWS EC2, Azure VMs, GCP Compute Engine&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Think of it as a raw Linux box in the sky. You do the rest.&lt;/p&gt;
&lt;p&gt;Setting up your own PostgreSQL cluster on Ubuntu in AWS? That&apos;s IaaS.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Real-world use case:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;aws ec2 run-instances --image-id ami-xxxx --instance-type t2.medium
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Flexible. But the burden&apos;s all yours. You patch it. You scale it. You secure it.&lt;/p&gt;
&lt;h3&gt;2. &lt;strong&gt;PaaS: Platform as a Service&lt;/strong&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What you get:&lt;/strong&gt; A managed environment to run your code.
&lt;strong&gt;What you manage:&lt;/strong&gt; Just your app.
&lt;strong&gt;Example:&lt;/strong&gt; Heroku, OpenShift, Google App Engine&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is cloud with training wheels, and I mean that as a compliment. The OS and runtime aren&apos;t your problem anymore. You deploy your app and go.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Real-world example:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git push heroku main
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Boom. App deployed.&lt;/p&gt;
&lt;p&gt;Great when you want to ship fast. Less great when you need low-level control.&lt;/p&gt;
&lt;h3&gt;3. &lt;strong&gt;SaaS: Software as a Service&lt;/strong&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What you get:&lt;/strong&gt; Fully managed apps.
&lt;strong&gt;What you manage:&lt;/strong&gt; Nothing. Just your data and usage.
&lt;strong&gt;Example:&lt;/strong&gt; Google Workspace, GitHub, Dropbox, Jira&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You already live in SaaS. Your email runs on it. So does your ticketing system. That weird dashboard your CFO keeps exporting to Excel? SaaS, no question.&lt;/p&gt;
&lt;p&gt;You don&apos;t control the code. That&apos;s the entire point.&lt;/p&gt;
&lt;h2&gt;Who&apos;s responsible for what?&lt;/h2&gt;
&lt;p&gt;Memorize this chart.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./what-is-the-cloud-1.webp&quot; alt=&quot;Cloud service model responsibilities comparison chart showing the levels of management by user vs provider across On-Premises, IaaS, PaaS, and SaaS&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On-prem? You manage &lt;em&gt;everything&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;IaaS? You still manage OS and above.&lt;/li&gt;
&lt;li&gt;PaaS? Just your code.&lt;/li&gt;
&lt;li&gt;SaaS? Nothing but your login credentials.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wondering why your team spends all day patching EC2s? Congrats. You&apos;re in IaaS-land.&lt;/p&gt;
&lt;h2&gt;So… why bother with the cloud?&lt;/h2&gt;
&lt;p&gt;Three reasons.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Elasticity&lt;/strong&gt; - Scale up for Black Friday, scale down on Monday. Try doing that with a rack of Dell boxes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Speed&lt;/strong&gt; - From idea to deployment in minutes, not months.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Focus&lt;/strong&gt; - Spend less time babysitting hardware and more time shipping features.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Tools of the trade&lt;/h2&gt;
&lt;p&gt;Here&apos;s how cloud use shakes out across the stack:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./what-is-the-cloud-2.webp&quot; alt=&quot;Cloud service pyramid diagram illustrating SaaS, PaaS, and IaaS layers with examples like Microsoft Azure and AWS&quot;&gt;&lt;/p&gt;
&lt;p&gt;And here&apos;s how we &lt;em&gt;actually&lt;/em&gt; build on it:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./what-is-the-cloud-3.webp&quot; alt=&quot;Cloud service layer capabilities and tools chart highlighting SaaS enablement, PaaS management, and IaaS optimization with tools like Docker, Kubernetes, GitHub, and OpenStack&quot;&gt;&lt;/p&gt;
&lt;p&gt;Want portability? Use containers.
Need repeatability? Use Terraform.
Scaling headaches? Hand them to managed services.&lt;/p&gt;
&lt;h2&gt;Final thought: the cloud is someone else&apos;s problem… until it&apos;s yours&lt;/h2&gt;
&lt;p&gt;You don&apos;t have to love the cloud. But you should know where it helps you, and where it turns around and bites.&lt;/p&gt;
&lt;p&gt;Because every abstraction leaks. Every managed service eventually hands you a curveball. And “serverless” never meant &lt;em&gt;ops-less&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Know what you&apos;re &lt;em&gt;actually&lt;/em&gt; running. That&apos;s how much control you keep when things break.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Cloud = rented infrastructure with APIs and billing.&lt;/li&gt;
&lt;li&gt;IaaS = VMs and control, but with responsibility.&lt;/li&gt;
&lt;li&gt;PaaS = fast deploys, less control.&lt;/li&gt;
&lt;li&gt;SaaS = just use the app, don&apos;t ask how it works.&lt;/li&gt;
&lt;li&gt;The cloud isn&apos;t new — it&apos;s just better branded mainframes.&lt;/li&gt;
&lt;li&gt;Know your layer, know your risks, use the right tool for the job.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What next?&lt;/h2&gt;
&lt;p&gt;Deploying apps? Pick a platform that fits your team&apos;s skill and scale.
Teaching juniors? Walk them through the responsibility split across SaaS/PaaS/IaaS.
Building infra? Godspeed, and may your Terraform plans never fail in prod.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>Cloud Computing</category><category>AWS</category><category>Azure</category><category>GCP</category><category>IaaS</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install XWiki with Docker Compose</title><link>https://heyvaldemar.com/install-xwiki-with-docker-compose/</link><guid isPermaLink="true">https://heyvaldemar.com/install-xwiki-with-docker-compose/</guid><description>Step-by-step guide to install XWiki using Docker Compose with Traefik, Let&apos;s Encrypt, and PostgreSQL on Ubuntu Server. Perfect for self-hosted wikis.</description><pubDate>Thu, 12 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing XWiki with Docker Compose.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.xwiki.org/&quot;&gt;XWiki&lt;/a&gt; is an open-source collaboration platform that enables companies of all sizes to save time and money by enhancing collaboration at both the team and organization levels.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted XWiki when you need a structured wiki with application development capabilities, custom macros, and full data ownership. Confluence Cloud or Notion provide managed alternatives with modern UX and zero infrastructure overhead. Self-hosting XWiki is justified when you need on-premises documentation with advanced structured data features or wiki-as-application-platform capabilities.
:::&lt;/p&gt;
&lt;p&gt;💾 &lt;strong&gt;You can find the repository used in this guide on &lt;a href=&quot;https://github.com/heyvaldemar/xwiki-traefik-letsencrypt-docker-compose&quot;&gt;GitHub&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;heyvaldemar/xwiki-traefik-letsencrypt-docker-compose&quot;}&lt;/p&gt;
&lt;p&gt;:::note
We&apos;ll use &lt;a href=&quot;https://traefik.io/traefik/&quot;&gt;Traefik&lt;/a&gt; as our reverse proxy. It&apos;ll handle obtaining cryptographic certificates from &lt;a href=&quot;https://letsencrypt.org/&quot;&gt;Let&apos;s Encrypt&lt;/a&gt; for your domain names and route requests to the corresponding services based on those domains.
:::&lt;/p&gt;
&lt;p&gt;:::important
Docker Engine and Docker Compose must be installed on the server.&lt;/p&gt;
&lt;p&gt;For a step-by-step guide on installing Docker Engine on Ubuntu Server, see &lt;a href=&quot;/install-docker-engine-and-docker-compose-on-ubuntu-server/&quot;&gt;Install Docker Engine and Docker Compose on Ubuntu Server&lt;/a&gt;
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on a server, you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to receive a free cryptographic certificate through the Let&apos;s Encrypt CA.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the XWiki web interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which you plan to install XWiki.&lt;/p&gt;
&lt;p&gt;Now you need to create a YAML configuration file that will contain all the necessary conditions for XWiki to work.&lt;/p&gt;
&lt;p&gt;Let&apos;s create a YAML configuration file using a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vim xwiki-traefik-letsencrypt-docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-xwiki-with-docker-compose-1.webp&quot; alt=&quot;Install XWiki with Docker Compose - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hit the &quot;i&quot; button to go into edit mode, then insert the following &lt;a href=&quot;https://github.com/heyvaldemar/xwiki-traefik-letsencrypt-docker-compose/blob/main/xwiki-traefik-letsencrypt-docker-compose.yml&quot;&gt;configuration&lt;/a&gt; for XWiki to work.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-xwiki-with-docker-compose-2.webp&quot; alt=&quot;Install XWiki with Docker Compose - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to make changes to the configuration so that the contents of the file match your conditions. Parameters that need to be checked or changed are marked &quot;(replace with yours)&quot;.&lt;/p&gt;
&lt;p&gt;:::note
In this guide, the &lt;code&gt;xwiki.heyvaldemar.net&lt;/code&gt; subdomain will be used to access XWiki from the Internet. You will need to specify your domain or subdomain by which your XWiki will be accessible from the Internet.
:::&lt;/p&gt;
&lt;p&gt;:::note
In this guide, Postgres will be used as a database management system, and Traefik will be used as a reverse proxy.
:::&lt;/p&gt;
&lt;p&gt;In the &lt;code&gt;traefik.http.middlewares.authtraefik.basicauth.users&lt;/code&gt; parameter, you must specify the username and password hash to access the Traefik dashboard.&lt;/p&gt;
&lt;p&gt;:::note
You can use this &lt;a href=&quot;https://hostingcanada.org/htpasswd-generator/&quot;&gt;service&lt;/a&gt; to get the password hash.
:::&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-xwiki-with-docker-compose-3.webp&quot; alt=&quot;Install XWiki with Docker Compose - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s start XWiki with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose -f xwiki-traefik-letsencrypt-docker-compose.yml -p xwiki up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-xwiki-with-docker-compose-4.webp&quot; alt=&quot;Install XWiki with Docker Compose - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;To continue the XWiki installation process, you need to go from the workstation to the link &lt;code&gt;https://xwiki.heyvaldemar.net&lt;/code&gt;, where &lt;code&gt;xwiki.heyvaldemar.net&lt;/code&gt; is the name of my server. Accordingly, you need to provide the name of your XWiki server.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Continue&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-xwiki-with-docker-compose-5.webp&quot; alt=&quot;Install XWiki with Docker Compose - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to specify: first name, last name, login, password and email address to create an XWiki administrator account.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Register and login&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-xwiki-with-docker-compose-6.webp&quot; alt=&quot;Install XWiki with Docker Compose - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;The account has been successfully registered.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Continue&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-xwiki-with-docker-compose-7.webp&quot; alt=&quot;Install XWiki with Docker Compose - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to install a set of extensions for XWiki.&lt;/p&gt;
&lt;p&gt;Select &quot;XWiki Standard Flavor&quot; and click on the &quot;Install this flavor&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-xwiki-with-docker-compose-8.webp&quot; alt=&quot;Install XWiki with Docker Compose - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to confirm the installation of &quot;XWiki Standard Flavor&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Install&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-xwiki-with-docker-compose-9.webp&quot; alt=&quot;Install XWiki with Docker Compose - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Continue&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-xwiki-with-docker-compose-10.webp&quot; alt=&quot;Install XWiki with Docker Compose - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;Installation of &quot;XWiki Standard Flavor&quot; is complete.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Continue&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-xwiki-with-docker-compose-11.webp&quot; alt=&quot;Install XWiki with Docker Compose - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step will show the tree of XWiki pages.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Continue&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-xwiki-with-docker-compose-12.webp&quot; alt=&quot;Install XWiki with Docker Compose - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the XWiki control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-xwiki-with-docker-compose-13.webp&quot; alt=&quot;Install XWiki with Docker Compose - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Traefik control panel, go to the link &lt;code&gt;https://traefik.xwiki.heyvaldemar.net&lt;/code&gt; from the workstation, where &lt;code&gt;traefik.xwiki.heyvaldemar.net&lt;/code&gt; is the name of my server. Accordingly, you need to specify the name of your server with Traefik installed.&lt;/p&gt;
&lt;p&gt;Specify the username and password specified earlier in the YAML configuration file and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-xwiki-with-docker-compose-14.webp&quot; alt=&quot;Install XWiki with Docker Compose - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Traefik dashboard.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-xwiki-with-docker-compose-15.webp&quot; alt=&quot;Install XWiki with Docker Compose - Step 15&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Self-Hosting</category><category>XWiki</category><category>Docker</category><category>Wiki</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install OTRS on Ubuntu Server</title><link>https://heyvaldemar.com/install-otrs-on-ubuntu-server/</link><guid isPermaLink="true">https://heyvaldemar.com/install-otrs-on-ubuntu-server/</guid><description>Guide to installing OTRS Community Edition on Ubuntu Server — configure PostgreSQL, Apache, and SSL with Let&apos;s Encrypt, and launch OTRS securely.</description><pubDate>Tue, 27 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing OTRS on Ubuntu Server.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://otrscommunityedition.com/&quot;&gt;OTRS Community Edition&lt;/a&gt; - is a free open-source service management system that is often used by IT service management, customer service, and corporate security to structure their communications and tasks.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted OTRS Community Edition when you need a customizable helpdesk and ticketing system without per-agent licensing fees. Zendesk provides a managed alternative with modern UX, AI features, and built-in analytics. Self-hosting is justified when you need full control over ticket data, custom workflow automation, or operate in an environment where SaaS egress is restricted.
:::&lt;/p&gt;
&lt;p&gt;:::warning
The OTRS Community Edition is no longer supported by &lt;a href=&quot;https://otrs.com/&quot;&gt;OTRS AG&lt;/a&gt;, the company behind the original software. Its continued development has been taken over by &lt;a href=&quot;https://www.znuny.com&quot;&gt;Znuny&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::warning
You can install an older version of OTRS on Ubuntu Server by following this guide, or install a newer version from &lt;a href=&quot;https://www.znuny.org/en&quot;&gt;Znuny&lt;/a&gt; using my guide: &lt;a href=&quot;/install-otrs-using-docker-compose/&quot;&gt;Install OTRS Using Docker Compose&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on a server, you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to receive a free cryptographic certificate through the Let&apos;s Encrypt CA.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the OTRS web interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which you plan to install OTRS.&lt;/p&gt;
&lt;p&gt;Update the local package index to the latest changes in the repositories using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt update
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-1.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;This tutorial walks you through obtaining a free cryptographic certificate through the Let&apos;s Encrypt CA. To obtain and subsequently renew a free SSL certificate, we will use the Certbot software client, which is designed to make it as easy as possible to obtain and renew a certificate through the Let&apos;s Encrypt certification authority.&lt;/p&gt;
&lt;p&gt;Now we will install the packages required for OTRS to work using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install -y postgresql apache2 zip unzip build-essential bash-completion libapache2-mod-perl2 libdbd-pg-perl libtimedate-perl libnet-dns-perl libnet-ldap-perl libio-socket-ssl-perl libpdf-api2-perl libsoap-lite-perl libtext-csv-xs-perl libjson-xs-perl libapache-dbi-perl libxml-libxml-perl libxml-libxslt-perl libyaml-perl libarchive-zip-perl libcrypt-eksblowfish-perl libencode-hanextra-perl libmail-imapclient-perl libtemplate-perl libdigest-md5-perl libcrypt-ssleay-perl libdatetime-perl libauthen-ntlm-perl libpdf-api2-simple-perl libgd-text-perl libgd-graph-perl libyaml-libyaml-perl libmoo-perl apt-transport-https certbot python3-certbot-apache
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this tutorial, PostgreSQL will be used as a database management system, and Apache will be used as a webserver.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-2.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to create a database that will be used by OTRS in the future, as well as a user with the necessary rights in this database.&lt;/p&gt;
&lt;p&gt;Switch to the &quot;postgres&quot; user who has administrator rights in PostgreSQL using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo su - postgres
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-3.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, switch to the PostgreSQL command line using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;psql
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-4.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;We create a new user using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;CREATE USER otrsdbuser WITH PASSWORD &apos;dktLkEUvUWupy3Y7d9b&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For this tutorial, the username will be &quot;otrsdbuser&quot;, with the password &quot;dktLkEUvUWupy3Y7d9b&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-5.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;We create a new database and grant the rights to it to the previously created user using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;CREATE DATABASE &quot;otrsdb&quot; WITH OWNER &quot;otrsdbuser&quot; ENCODING &apos;UTF8&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
This tutorial will use &quot;otrsdb&quot; as the name for the database.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-6.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Exit the &quot;PostgreSQL&quot; command line using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;\q
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-7.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Log out as user &quot;postgres&quot; using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;exit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-8.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s download the &quot;rel-6_0.zip&quot; archive containing the files for OTRS using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;wget https://github.com/OTRS/otrs/archive/refs/heads/rel-6_0.zip
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-9.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Unpack the downloaded archive &quot;otrs-latest.tar.gz&quot; using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;unzip rel-6_0.zip
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-10.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now delete the previously downloaded archive &quot;otrs-latest.tar.gz&quot; containing the files for OTRS to work using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo rm -f rel-6_0.zip
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-11.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;Move and rename the directory with files for OTRS operation, obtained from the archive, using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo mv otrs-* /opt/otrs
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-12.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s create a user &quot;otrs&quot; that will be used to start OTRS using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo useradd -d /opt/otrs -c &apos;OTRS user&apos; otrs
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-13.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, add a new user to the &quot;www-data&quot; group using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo usermod -G www-data otrs
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-14.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s prepare the OTRS configuration file using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo cp /opt/otrs/Kernel/Config.pm.dist /opt/otrs/Kernel/Config.pm
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-15.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to make changes to the OTRS configuration file by opening it in a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /opt/otrs/Kernel/Config.pm
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-16.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;Press the &quot;i&quot; button to enter the edit mode, find the parameter &lt;code&gt;$Self-&amp;gt;{&apos;DatabaseDSN&apos;} = &quot;DBI:mysql:database=$Self-&amp;gt;{Database};host=$Self-&amp;gt;{DatabaseHost}&quot;;&lt;/code&gt; and comment it out by placing the &quot;#&quot; symbol in front of the parameter.&lt;/p&gt;
&lt;p&gt;Then we find the parameter &lt;code&gt;$Self-&amp;gt;{DatabaseDSN} = &quot;DBI:Pg:dbname=$Self-&amp;gt;{Database};&quot;;&lt;/code&gt; and uncomment it by removing the &quot;#&quot; symbol in front of the parameter.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-17.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 17&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-18.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 18&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to make changes to the Apache configuration file by opening it in a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /opt/otrs/scripts/apache2-perl-startup.pl
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-19.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 19&quot;&gt;&lt;/p&gt;
&lt;p&gt;Then we find the parameters &quot;use DBD::Pg ();&quot; and &quot;use Kernel::System::DB::postgresql;&quot;, and then uncomment them by removing the &quot;#&quot; symbol in front of the parameters.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-20.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 20&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-21.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 21&quot;&gt;&lt;/p&gt;
&lt;p&gt;Assign correct rights for the &quot;otrs&quot; user to files and directories using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo chown -R otrs:otrs /opt/otrs
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-22.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 22&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to check that all Perl modules required for OTRS to work are installed and do not need to be updated.&lt;/p&gt;
&lt;p&gt;Let&apos;s check the Perl modules required for OTRS to work using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo /opt/otrs/bin/otrs.CheckModules.pl
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-23.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 23&quot;&gt;&lt;/p&gt;
&lt;p&gt;All Perl modules required for OTRS to run are installed and do not need to be updated.&lt;/p&gt;
&lt;p&gt;Next, you need to do a few more checks for missing Perl dependencies and modules.&lt;/p&gt;
&lt;p&gt;We perform the first check for missing Perl dependencies and modules using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo perl -cw /opt/otrs/bin/cgi-bin/index.pl
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-24.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 24&quot;&gt;&lt;/p&gt;
&lt;p&gt;The first check for missing Perl dependencies and modules was successful.&lt;/p&gt;
&lt;p&gt;We perform a second check for missing Perl dependencies and modules using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo perl -cw /opt/otrs/bin/cgi-bin/customer.pl
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-25.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 25&quot;&gt;&lt;/p&gt;
&lt;p&gt;The second check for missing Perl dependencies and modules was successful.&lt;/p&gt;
&lt;p&gt;We perform the third check for missing Perl dependencies and modules using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo perl -cw /opt/otrs/bin/otrs.Console.pl
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-26.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 26&quot;&gt;&lt;/p&gt;
&lt;p&gt;The third check for missing Perl dependencies and modules was successful.&lt;/p&gt;
&lt;p&gt;Let&apos;s configure Apache for further work with the OTRS control panel.&lt;/p&gt;
&lt;p&gt;We enable the Apache webserver module called &quot;headers&quot; using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo a2enmod headers
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
The &quot;headers&quot; module can be used to add more specific &quot;Cache-Control&quot; parameters.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-27.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 27&quot;&gt;&lt;/p&gt;
&lt;p&gt;We enable the Apache webserver module called &quot;rewrite&quot; using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo a2enmod rewrite
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
The &quot;rewrite&quot; module is one of the most commonly used modules in the Apache webserver and provides a flexible and powerful way to manipulate URLs.
:::note&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-28.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 28&quot;&gt;&lt;/p&gt;
&lt;p&gt;For OTRS to work correctly, you still need Apache modules such as &quot;perl&quot;, &quot;deflate&quot; and &quot;filter&quot;. These modules should be enabled by default, but you can check this with the commands:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo a2enmod perl
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo a2enmod deflate
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo a2enmod filter
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now you need to create four virtual host files (called a block in Nginx), with which OTRS will work in the future.&lt;/p&gt;
&lt;p&gt;Two virtual host files are required to provide access to OTRS over HTTPS, as well as to redirect agents from the &lt;code&gt;otrs.heyvaldemar.net&lt;/code&gt; subdomain to the agent address &lt;code&gt;https://otrs.heyvaldemar.net/otrs/index.pl&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The other two virtual host files will be required to provide access to OTRS over HTTPS and to redirect customers from the &lt;code&gt;support.heyvaldemar.net&lt;/code&gt; subdomain to the customer service address &lt;code&gt;https://otrs.heyvaldemar.net/otrs/customer.pl&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;:::note
In this guide, agents will use the &lt;code&gt;otrs.heyvaldemar.net&lt;/code&gt; subdomain to access the OTRS web interface from the Internet, and the &lt;code&gt;support.heyvaldemar.net&lt;/code&gt; subdomain for client access. You will need to specify your domains or subdomains by which OTRS will be available from the Internet for agents and customers.
:::&lt;/p&gt;
&lt;p&gt;Let&apos;s create the first virtual host file using a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/apache2/sites-available/otrs.heyvaldemar.net.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-29.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 29&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hit the &quot;i&quot; button to go into edit mode, then insert the following configuration for the webserver to work.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-apache&quot;&gt;&amp;lt;VirtualHost *:80&amp;gt;
	ServerAdmin callvaldemar@gmail.com
	ServerName otrs.heyvaldemar.net
	
	RewriteEngine on
	RewriteCond %{SERVER_NAME} =otrs.heyvaldemar.net
	RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
	RedirectMatch permanent (.*)/$ https://otrs.heyvaldemar.net/otrs/index.pl
	
	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this guide, for agents to access the OTRS web interface from the Internet, the &lt;code&gt;otrs.heyvaldemar.net&lt;/code&gt; subdomain will be used, from which agents will be redirected to the address &lt;code&gt;https://otrs.heyvaldemar.net/otrs/index.pl&lt;/code&gt;. You will need to specify your domain or subdomain by which OTRS will be accessible from the Internet for agents.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-30.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 30&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-31.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 31&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s create a second virtual host file using a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/apache2/sites-available/otrs.heyvaldemar.net-ssl.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-32.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 32&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hit the &quot;i&quot; button to go into edit mode, then insert the following configuration for the webserver to work.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-apache&quot;&gt;&amp;lt;IfModule mod_ssl.c&amp;gt;
&amp;lt;VirtualHost *:443&amp;gt;
	ServerAdmin callvaldemar@gmail.com
	ServerName otrs.heyvaldemar.net
	
	RedirectMatch permanent (.*)/$ https://otrs.heyvaldemar.net/otrs/index.pl
	
	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined
	
	SSLCertificateFile /etc/letsencrypt/live/otrs.heyvaldemar.net/fullchain.pem
	SSLCertificateKeyFile /etc/letsencrypt/live/otrs.heyvaldemar.net/privkey.pem
	Include /etc/letsencrypt/options-ssl-apache.conf
&amp;lt;/VirtualHost&amp;gt;
&amp;lt;/IfModule&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this guide, for agents to access the OTRS web interface from the Internet, the &lt;code&gt;otrs.heyvaldemar.net&lt;/code&gt; subdomain will be used, from which agents will be redirected to the address &lt;code&gt;https://otrs.heyvaldemar.net/otrs/index.pl&lt;/code&gt;. You will need to specify your domain or subdomain by which OTRS will be accessible from the Internet for agents.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-33.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 33&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-34.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 34&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s create a third virtual host file using a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/apache2/sites-available/support.heyvaldemar.net.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-35.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 35&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hit the &quot;i&quot; button to go into edit mode, then insert the following configuration for the webserver to work.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-apache&quot;&gt;&amp;lt;VirtualHost *:80&amp;gt;
	ServerAdmin callvaldemar@gmail.com
	ServerName support.heyvaldemar.net
	
	RewriteEngine on
	RewriteCond %{SERVER_NAME} =otrs.heyvaldemar.net
	RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
	RedirectMatch permanent (.*)/$ https://otrs.heyvaldemar.net/otrs/customer.pl
	
	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this guide, customers will use the &lt;code&gt;support.heyvaldemar.net&lt;/code&gt; subdomain to access the OTRS web interface from the Internet, from which customers will be redirected to &lt;code&gt;https://otrs.heyvaldemar.net/otrs/customer.pl&lt;/code&gt;. You will need to specify your domain or subdomain by which OTRS will be accessible from the Internet for clients.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-36.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 36&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-37.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 37&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s create the fourth virtual host file using a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/apache2/sites-available/support.heyvaldemar.net-ssl.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-38.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 38&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hit the &quot;i&quot; button to go into edit mode, then insert the following configuration for the webserver to work.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-apache&quot;&gt;&amp;lt;IfModule mod_ssl.c&amp;gt;
&amp;lt;VirtualHost *:443&amp;gt;
	ServerAdmin callvaldemar@gmail.com
	ServerName support.heyvaldemar.net

	RedirectMatch permanent (.*)/$ https://otrs.heyvaldemar.net/otrs/customer.pl
	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined
	
	SSLCertificateFile /etc/letsencrypt/live/otrs.heyvaldemar.net/fullchain.pem
	SSLCertificateKeyFile /etc/letsencrypt/live/otrs.heyvaldemar.net/privkey.pem
	Include /etc/letsencrypt/options-ssl-apache.conf
&amp;lt;/VirtualHost&amp;gt;
&amp;lt;/IfModule&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this guide, customers will use the &lt;code&gt;support.heyvaldemar.net&lt;/code&gt; subdomain to access the OTRS web interface from the Internet, from which customers will be redirected to &lt;code&gt;https://otrs.heyvaldemar.net/otrs/customer.pl&lt;/code&gt;. You will need to specify your domain or subdomain by which OTRS will be accessible from the Internet for clients.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-39.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 39&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-40.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 40&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to assign the correct permissions to files and directories for the correct operation of OTRS. To do this, you need to use a special script.&lt;/p&gt;
&lt;p&gt;Let&apos;s go to the &quot;otrs&quot; folder using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd /opt/otrs
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-41.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 41&quot;&gt;&lt;/p&gt;
&lt;p&gt;Assign the correct permissions to files and directories for the correct operation of OTRS using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo bin/otrs.SetPermissions.pl --otrs-user=www-data --web-group=www-data
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-42.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 42&quot;&gt;&lt;/p&gt;
&lt;p&gt;We activate the first virtual host using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo a2ensite otrs.heyvaldemar.net.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-43.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 43&quot;&gt;&lt;/p&gt;
&lt;p&gt;We activate the second virtual host using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo a2ensite otrs.heyvaldemar.net-ssl.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-44.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 44&quot;&gt;&lt;/p&gt;
&lt;p&gt;We activate the third virtual host using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo a2ensite support.heyvaldemar.net.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-45.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 45&quot;&gt;&lt;/p&gt;
&lt;p&gt;We activate the fourth virtual host using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo a2ensite support.heyvaldemar.net-ssl.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-46.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 46&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to activate the virtual host for OTRS to work, which should be loaded after all other settings. To do this, you can use a symbolic link with the &quot;zzz&quot; prefix.&lt;/p&gt;
&lt;p&gt;We activate the virtual host for OTRS using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo ln -s /opt/otrs/scripts/apache2-httpd.include.conf /etc/apache2/sites-enabled/zzz_otrs.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-47.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 47&quot;&gt;&lt;/p&gt;
&lt;p&gt;Deactivate the default virtual host using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo a2dissite 000-default.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-48.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 48&quot;&gt;&lt;/p&gt;
&lt;p&gt;Verify that there are no errors in the syntax of the new Apache config file using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apache2ctl configtest
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-49.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 49&quot;&gt;&lt;/p&gt;
&lt;p&gt;Restart Apache to apply the changes made using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl restart apache2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-50.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 50&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s check that Apache has started successfully using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl status apache2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-51.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 51&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now, to increase the security level of the webserver, it is necessary to obtain a cryptographic certificate for the domain or subdomain, through which the OTRS web interface will be accessible from the Internet.&lt;/p&gt;
&lt;p&gt;:::note
To obtain and subsequently renew a free SSL certificate, we will use the Let&apos;s Encrypt certification authority, as well as the Certbot software client, which is designed to make it as easy as possible to obtain and renew a certificate through the Let&apos;s Encrypt certification authority.
:::&lt;/p&gt;
&lt;p&gt;:::note
In this guide, agents will use the &lt;code&gt;otrs.heyvaldemar.net&lt;/code&gt; subdomain to access the OTRS web interface from the Internet, and the &lt;code&gt;support.heyvaldemar.net&lt;/code&gt; subdomain will be used for client access. You will need to specify your domains or subdomains by which OTRS will be available from the Internet for agents and customers.
:::&lt;/p&gt;
&lt;p&gt;Request a cryptographic certificate using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo certbot --apache -d otrs.heyvaldemar.net -d support.heyvaldemar.net
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-52.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 52&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, we indicate the email address to which Let&apos;s Encrypt will send notifications about the expiration of the cryptographic certificate and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-53.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 53&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to read and accept the terms of use of the services provided.&lt;/p&gt;
&lt;p&gt;Press the button &quot;a&quot;, then &quot;Enter&quot;, if you agree with the terms of use of the services provided.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-54.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 54&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to choose whether you would like to share the above email address with the Electronic Frontier Foundation to receive newsletters.&lt;/p&gt;
&lt;p&gt;Press the &quot;n&quot; button, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-55.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 55&quot;&gt;&lt;/p&gt;
&lt;p&gt;At the next stage, you need to choose: do you want the parameters to be automatically added to the Apache configuration file for automatically redirecting HTTP traffic to HTTPS.&lt;/p&gt;
&lt;p&gt;Press the button &quot;1&quot;, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-56.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 56&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
Cryptographic certificates obtained through Let&apos;s Encrypt CA are valid for ninety days. Certbot automatically adds a script to renew the certificate to the task scheduler and the script runs twice a day, automatically renewing any cryptographic certificate that expires within thirty days.
:::&lt;/p&gt;
&lt;p&gt;You can check the functionality of the cryptographic certificate renewal process using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo certbot renew --dry-run
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-57.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 57&quot;&gt;&lt;/p&gt;
&lt;p&gt;To continue the OTRS installation process, you need to go from the workstation to the link &lt;code&gt;https://otrs.heyvaldemar.net/otrs/installer.pl&lt;/code&gt;, where &lt;code&gt;otrs.heyvaldemar.net&lt;/code&gt; is the name of my server. Accordingly, you need to specify the name or IP address of your server with OTRS installed.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-58.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 58&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to accept the license terms.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Accept license and continue&quot; button if you agree with the OTRS license agreement.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-59.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 59&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to specify the system for managing the databases and the previously created database that will be used to work with OTRS.&lt;/p&gt;
&lt;p&gt;In the &quot;Type&quot; field, select &quot;PostgreSQL&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Install Type&quot; section, select &quot;Use an existing database for OTRS&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-60.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 60&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, you need to specify the data for connecting to the previously created database.&lt;/p&gt;
&lt;p&gt;:::note
In this manual, &quot;otrsdbuser&quot; is used as the username with database rights for OTRS.
:::&lt;/p&gt;
&lt;p&gt;In the &quot;User&quot; field, enter &quot;otrsdbuser&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Password&quot; field, specify the password assigned to the &quot;otrsdbuser&quot; user.&lt;/p&gt;
&lt;p&gt;In the &quot;Host&quot; field, enter &quot;127.0.0.1&quot;.&lt;/p&gt;
&lt;p&gt;This tutorial uses &quot;otrsdb&quot; as the database name for OTRS.&lt;/p&gt;
&lt;p&gt;In the &quot;Database name&quot; field, specify &quot;otrsdb&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Check database settings&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-61.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 61&quot;&gt;&lt;/p&gt;
&lt;p&gt;The connection to the database has been successfully established.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-62.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 62&quot;&gt;&lt;/p&gt;
&lt;p&gt;The database has been successfully prepared to work with OTRS.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-63.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 63&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, you need to specify a few more parameters for the operation of OTRS.&lt;/p&gt;
&lt;p&gt;In the &quot;SystemID&quot; field, select the desired number, which will serve as the identifier of the OTRS system. This identifier will be part of the number for all OTRS tickets.&lt;/p&gt;
&lt;p&gt;In the &quot;System FQDN&quot; field, indicate the domain or subdomain by which OTRS is accessible from the Internet.&lt;/p&gt;
&lt;p&gt;:::note
In this manual, to access the OTRS web interface from the Internet, the &lt;code&gt;otrs.heyvaldemar.net&lt;/code&gt; subdomain will be used. You will need to specify your domain or subdomain through which OTRS will be available from the Internet.
:::&lt;/p&gt;
&lt;p&gt;In the &quot;AdminEmail&quot; field, indicate the current email address of the OTRS administrator.&lt;/p&gt;
&lt;p&gt;In the &quot;Organization&quot; field, enter the name of your organization.&lt;/p&gt;
&lt;p&gt;In the &quot;LogModule&quot; field, specify &quot;Syslog&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Default Language&quot; field, specify the language for your OTRS system.&lt;/p&gt;
&lt;p&gt;In the &quot;CheckMXRecord&quot; field, specify &quot;Yes&quot; to check the MX records for the email addresses specified in OTRS.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-64.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 64&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, you can specify the data that OTRS will use to send and receive emails. These settings are covered in the OTRS Configuration Guide and are best skipped for now.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Skip this step&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-65.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 65&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, you will receive the username and password of an account with OTRS administrator rights.&lt;/p&gt;
&lt;p&gt;Save this data in a safe place.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-66.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 66&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to start the OTRS daemon.&lt;/p&gt;
&lt;p&gt;We return to the terminal emulator and start the OTRS daemon using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo su - otrs -c &quot;/opt/otrs/bin/otrs.Daemon.pl start&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
The daemon will run under the &quot;otrs&quot; user.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-67.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 67&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now we need to activate two files that will be used by the cron task scheduler to verify that the OTRS daemon is running.&lt;/p&gt;
&lt;p&gt;Let&apos;s go to the &quot;cron&quot; folder using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd /opt/otrs/var/cron
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-68.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 68&quot;&gt;&lt;/p&gt;
&lt;p&gt;We activate the first file for the cron task scheduler using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo cp aaa_base.dist aaa_base
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-69.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 69&quot;&gt;&lt;/p&gt;
&lt;p&gt;We activate the second file for the cron task scheduler using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo cp otrs_daemon.dist otrs_daemon
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-70.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 70&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now, to schedule tasks in the cron task scheduler, you need to use the &quot;Cron.sh&quot; script using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo su - otrs -c &quot;/opt/otrs/bin/Cron.sh start&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
The scheduled tasks will run under the &quot;otrs&quot; user.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-71.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 71&quot;&gt;&lt;/p&gt;
&lt;p&gt;OTRS installation completed successfully.&lt;/p&gt;
&lt;p&gt;Now you need to make changes to the OTRS configuration to ensure that all internal links in OTRS will use HTTPS.&lt;/p&gt;
&lt;p&gt;From the workstation, go to the link &lt;code&gt;https://otrs.heyvaldemar.net/otrs/index.pl&lt;/code&gt;, where &lt;code&gt;otrs.heyvaldemar.net&lt;/code&gt; is the name of my server. Accordingly, you need to specify the name of your server with OTRS installed.&lt;/p&gt;
&lt;p&gt;Specify the username and password of an account with OTRS administrator rights, and click on the &quot;Login&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-72.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 72&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the OTRS agent web interface.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Admin&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-73.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 73&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now in the &quot;Administration&quot; section, select &quot;System Configuration&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-74.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 74&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the search bar, specify &quot;HttpType&quot; and in the presented search result, select &quot;HttpType&quot;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-75.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 75&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;HttpType&quot; section, specify &quot;https&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-76.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 76&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the checkmark to the right of the changed parameter to save the changes.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-77.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 77&quot;&gt;&lt;/p&gt;
&lt;p&gt;The changes made are saved. Now you need to apply them.&lt;/p&gt;
&lt;p&gt;Click on the notification &quot;You have undeployed settings, would you like to deploy it them?&quot;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-78.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 78&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Changes Overview&quot; section, select the change you want to apply and click on the &quot;Deploy selected changes&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-79.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 79&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Deploy now&quot; button to confirm the application of the previously made changes.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-80.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 80&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to change the time zone for the OTRS administrator account.&lt;/p&gt;
&lt;p&gt;Click on the notification &quot;Please select a time zone in your preferences and confirm it by clicking save button&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-81.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 81&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Time Zone&quot; field, select the appropriate time zone.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-82.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 82&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the checkmark to the right of the changed parameter to save the changes.&lt;/p&gt;
&lt;p&gt;Then click on the &quot;Dasboard&quot; button in the upper left corner of the screen to return to the OTRS agent home page.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-83.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 83&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-otrs-on-ubuntu-server-84.webp&quot; alt=&quot;Install OTRS on Ubuntu Server - Step 84&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>OTRS</category><category>Helpdesk</category><category>Ubuntu</category><category>ITIL</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Bitbucket on Ubuntu Server</title><link>https://heyvaldemar.com/install-bitbucket-on-ubuntu-server/</link><guid isPermaLink="true">https://heyvaldemar.com/install-bitbucket-on-ubuntu-server/</guid><description>Complete guide to install Bitbucket on Ubuntu Server with Apache, PostgreSQL, and SSL using Let&apos;s Encrypt. Ideal for secure Git-based team collaboration.</description><pubDate>Fri, 23 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Bitbucket on Ubuntu Server.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.atlassian.com/software/bitbucket&quot;&gt;Bitbucket&lt;/a&gt; is a Git-based source code repository hosting service owned by Atlassian. Bitbucket offers both commercial plans and free accounts with an unlimited number of private repositories.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted Bitbucket Data Center when your organization requires on-premises source control with Jira integration and compliance-mandated data residency. Bitbucket Cloud eliminates server maintenance and provides native CI/CD via Pipelines. Self-hosting is justified when regulatory frameworks require source code to remain within your network perimeter or when you need custom Git hooks at the server level.
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on a server, you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to get a free cryptographic certificate through Let&apos;s Encrypt CA.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the Bitbucket web interface.&lt;/li&gt;
&lt;li&gt;TCP port 7990 - to access the Bitbucket web interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which you plan to install Bitbucket.&lt;/p&gt;
&lt;p&gt;Update the local package index to the latest changes in the repositories using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt update
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-1.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;This tutorial walks you through obtaining a free cryptographic certificate through the Let&apos;s Encrypt CA. To obtain and subsequently renew a free SSL certificate, we will use the Certbot software client, which is designed to make it as easy as possible to obtain and renew a certificate through the Let&apos;s Encrypt certification authority.&lt;/p&gt;
&lt;p&gt;Now we will install the packages required for Bitbucket to work using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install -y postgresql apache2 apt-transport-https certbot python3-certbot-apache fontconfig
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this tutorial, PostgreSQL will be used as a database management system, and Apache will be used as a webserver.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-2.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s configure Apache for further work with Bitbucket.&lt;/p&gt;
&lt;p&gt;We enable the Apache webserver module called &quot;proxy_http&quot; using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo a2enmod proxy_http
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
The &quot;proxy_http&quot; module acts like a proxy server for the HTTP and HTTPS protocols.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-3.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;We enable the Apache webserver module called &quot;rewrite&quot; using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo a2enmod rewrite
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
The &quot;rewrite&quot; module is one of the most commonly used modules in the Apache webserver and provides a flexible and powerful way to manipulate URLs.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-4.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to create two virtual host files (called a block in Nginx), with which Bitbucket will work in the future.&lt;/p&gt;
&lt;p&gt;Two virtual host files are required to provide access to Bitbucket over HTTPS, and to enable Bitbucket to be used at &lt;code&gt;https://bitbucket.heyvaldemar.net&lt;/code&gt;, without specifying port 7990 in the browser address bar.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, the subdomain &lt;code&gt;bitbucket.heyvaldemar.net&lt;/code&gt; will be used to access Bitbucket from the Internet. You will need to specify your domain or subdomain under which your Bitbucket will be accessible from the Internet.
:::&lt;/p&gt;
&lt;p&gt;Let&apos;s create the first virtual host file using a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/apache2/sites-available/bitbucket.heyvaldemar.net.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-5.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hit the &quot;i&quot; button to go into edit mode, then insert the following configuration for the webserver to work.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-apache&quot;&gt;&amp;lt;VirtualHost *:80&amp;gt;
	ServerAdmin callvaldemar@gmail.com
	ServerName bitbucket.heyvaldemar.net
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this tutorial, the subdomain &lt;code&gt;bitbucket.heyvaldemar.net&lt;/code&gt; will be used to access Bitbucket from the Internet. You will need to specify your domain or subdomain under which your Bitbucket will be accessible from the Internet.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-6.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-7.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s create a second virtual host file using a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/apache2/sites-available/bitbucket.heyvaldemar.net-ssl.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-8.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hit the &quot;i&quot; button to go into edit mode, then insert the following configuration for the webserver to work.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-apache&quot;&gt;&amp;lt;IfModule mod_ssl.c&amp;gt;
&amp;lt;VirtualHost *:443&amp;gt;
	ServerAdmin callvaldemar@gmail.com
	ServerName bitbucket.heyvaldemar.net

	ProxyRequests Off

	&amp;lt;Proxy *&amp;gt;
		Require all granted
	&amp;lt;/Proxy&amp;gt;

	ProxyPass / http://localhost:7990/
	ProxyPassReverse / http://localhost:7990/

	SSLEngine On
	SSLCertificateFile /etc/letsencrypt/live/bitbucket.heyvaldemar.net/fullchain.pem
	SSLCertificateKeyFile /etc/letsencrypt/live/bitbucket.heyvaldemar.net/privkey.pem
	Include /etc/letsencrypt/options-ssl-apache.conf
&amp;lt;/VirtualHost&amp;gt;
&amp;lt;/IfModule&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this tutorial, the subdomain &lt;code&gt;bitbucket.heyvaldemar.net&lt;/code&gt; will be used to access Bitbucket from the Internet. You will need to specify your domain or subdomain under which your Bitbucket will be accessible from the Internet.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-9.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-10.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;We activate the first virtual host using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo a2ensite bitbucket.heyvaldemar.net.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-11.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;We activate the second virtual host using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo a2ensite bitbucket.heyvaldemar.net-ssl.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-12.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;Deactivate the default virtual host using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo a2dissite 000-default.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-13.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;Verify that there are no errors in the syntax of the new Apache config file using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apache2ctl configtest
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-14.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;Restart Apache to apply the changes made using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl restart apache2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-15.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s check that Apache has started successfully using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl status apache2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-16.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now, to improve the security of your webserver, you need to obtain a cryptographic certificate for the domain or subdomain through which the Bitbucket control panel will be accessible from the Internet.&lt;/p&gt;
&lt;p&gt;:::note
To obtain and subsequently renew a free SSL certificate, we will use the Let&apos;s Encrypt certification authority, as well as the Certbot software client, which is designed to make it as easy as possible to obtain and renew a certificate through the Let&apos;s Encrypt certification authority.
:::&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, the subdomain &lt;code&gt;bitbucket.heyvaldemar.net&lt;/code&gt; will be used to access Bitbucket from the Internet. You will need to specify your domain or subdomain under which your Bitbucket will be accessible from the Internet.
:::&lt;/p&gt;
&lt;p&gt;Request a cryptographic certificate using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo certbot --apache -d bitbucket.heyvaldemar.net
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-17.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 17&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, we indicate the email address to which Let&apos;s Encrypt will send notifications about the expiration of the cryptographic certificate and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-18.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 18&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to read and accept the terms of use of the services provided.&lt;/p&gt;
&lt;p&gt;Press the button &quot;a&quot;, then &quot;Enter&quot;, if you agree with the terms of use of the services provided.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-19.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 19&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to choose whether you would like to share the above email address with the Electronic Frontier Foundation to receive newsletters.&lt;/p&gt;
&lt;p&gt;Press the &quot;n&quot; button, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-20.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 20&quot;&gt;&lt;/p&gt;
&lt;p&gt;At the next stage, you need to choose: do you want the parameters to be automatically added to the Apache configuration file for automatically redirecting HTTP traffic to HTTPS.&lt;/p&gt;
&lt;p&gt;Press the button &quot;2&quot;, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-21.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 21&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
Cryptographic certificates obtained through Let&apos;s Encrypt CA are valid for ninety days. Certbot automatically adds a script to renew the certificate to the task scheduler and the script runs twice a day, automatically renewing any cryptographic certificate that expires within thirty days.
:::&lt;/p&gt;
&lt;p&gt;You can check the functionality of the cryptographic certificate renewal process using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo certbot renew --dry-run
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-22.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 22&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to create a database that Bitbucket will use in the future, as well as a user with the necessary rights in this database.&lt;/p&gt;
&lt;p&gt;Switch to the &quot;postgres&quot; user who has administrator rights in PostgreSQL using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo su - postgres
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-23.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 23&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, switch to the PostgreSQL command line using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;psql
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-24.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 24&quot;&gt;&lt;/p&gt;
&lt;p&gt;We create a new user using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;CREATE USER bitbucketdbuser WITH PASSWORD &apos;mU%g673b=6xa?8E6R9M3T&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this tutorial, &quot;bitbucketdbuser&quot; will be used as the username, with the password &quot;mU%g673b=6xa?8E6R9M3T&quot;.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-25.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 25&quot;&gt;&lt;/p&gt;
&lt;p&gt;We create a new database and grant the rights to it to the previously created user using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;CREATE DATABASE bitbucketdb WITH OWNER &quot;bitbucketdbuser&quot; ENCODING=&apos;UTF8&apos; CONNECTION LIMIT=-1;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
This tutorial will use &quot;bitbucketdb&quot; as the name for the database.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-26.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 26&quot;&gt;&lt;/p&gt;
&lt;p&gt;Exit the &quot;PostgreSQL&quot; command line using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;\q
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-27.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 27&quot;&gt;&lt;/p&gt;
&lt;p&gt;Log out as user &quot;postgres&quot; using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;exit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-28.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 28&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to download the Bitbucket installer using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;wget https://www.atlassian.com/software/stash/downloads/binary/atlassian-bitbucket-7.12.0-x64.bin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
The current version of Bitbucket can be found on the official Atlassian &lt;a href=&quot;https://www.atlassian.com/software/bitbucket/download&quot;&gt;website&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;This tutorial covers installing Bitbucket 7.12.0.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-29.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 29&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s execute the file &quot;atlassian-bitbucket-7.12.0-x64.bin&quot; using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo chmod +x atlassian-bitbucket-7.12.0-x64.bin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-30.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 30&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s start the Bitbucket installation using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo ./atlassian-bitbucket-7.12.0-x64.bin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
Your command will differ from the one specified in this article, as you will be installing the latest version of Bitbucket at the time of reading.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-31.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 31&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the first step, you can choose whether you want to install a new Bitbucket server or upgrade an existing one.&lt;/p&gt;
&lt;p&gt;This tutorial walks through the installation of a new Bitbucket server.&lt;/p&gt;
&lt;p&gt;Press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-32.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 32&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to select the Bitbucket edition.&lt;/p&gt;
&lt;p&gt;Select the &quot;Data Center&quot; edition and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-33.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 33&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, you can choose where to install Bitbucket.&lt;/p&gt;
&lt;p&gt;This tutorial covers installing Bitbucket in &quot;/opt/atlassian/bitbucket/7.12.0&quot;.&lt;/p&gt;
&lt;p&gt;Press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-34.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 34&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you can choose where to store your Bitbucket data.&lt;/p&gt;
&lt;p&gt;This tutorial covers installing Bitbucket in &quot;/var/atlassian/application-data/bitbucket&quot;.&lt;/p&gt;
&lt;p&gt;Press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-35.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 35&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you can select the port that Bitbucket will use.&lt;/p&gt;
&lt;p&gt;This tutorial walks you through installing Bitbucket using port 7990 for HTTP.&lt;/p&gt;
&lt;p&gt;Press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-36.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 36&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you will be offered the option to install Bitbucket as a service.&lt;/p&gt;
&lt;p&gt;Press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-37.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 37&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Enter&quot; button to start installing Bitbucket.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-38.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 38&quot;&gt;&lt;/p&gt;
&lt;p&gt;Bitbucket installation completed successfully.&lt;/p&gt;
&lt;p&gt;:::note
You do not need to run Bitbucket.
:::&lt;/p&gt;
&lt;p&gt;We indicate &quot;n&quot; and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-39.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 39&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to create a Bitbucket config file using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /var/atlassian/application-data/bitbucket/shared/bitbucket.properties
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-40.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 40&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hit the &quot;i&quot; button to go into edit mode, then insert the following configuration for the webserver to work.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-ini&quot;&gt;server.port=7990
server.secure=true
server.scheme=https
server.proxy-port=443
server.proxy-name=bitbucket.heyvaldemar.net
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this tutorial, the subdomain bitbucket.heyvaldemar.net will be used to access Bitbucket from the Internet. You will need to specify your domain or subdomain under which your Bitbucket will be accessible from the Internet.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-41.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 41&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-42.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 42&quot;&gt;&lt;/p&gt;
&lt;p&gt;Launch Bitbucket using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo service atlbitbucket start
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-43.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 43&quot;&gt;&lt;/p&gt;
&lt;p&gt;Open the Bitbucket log to check if Bitbucket is starting correctly using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo less /var/atlassian/application-data/bitbucket/log/atlassian-bitbucket.log
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-44.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 44&quot;&gt;&lt;/p&gt;
&lt;p&gt;On your keyboard, press the &quot;Shift&quot; and &quot;f&quot; keys to start monitoring the Bitbucket log in real-time.&lt;/p&gt;
&lt;p&gt;On the keyboard, press the key combination &quot;Ctrl&quot; and &quot;c&quot;, then &quot;q&quot; to close the Bitbucket log.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-45.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 45&quot;&gt;&lt;/p&gt;
&lt;p&gt;To continue the Bitbucket installation process, you need to go from the workstation to the link &lt;code&gt;https://bitbucket.heyvaldemar.net&lt;/code&gt;, where &lt;code&gt;bitbucket.heyvaldemar.net&lt;/code&gt; is the name of my server. Accordingly, you need to provide the name or IP address of your Bitbucket server.&lt;/p&gt;
&lt;p&gt;This tutorial walks you through installing Bitbucket for a production environment.&lt;/p&gt;
&lt;p&gt;In the &quot;Language&quot; field, select the language in which you plan to use Bitbucket.&lt;/p&gt;
&lt;p&gt;In the &quot;Database&quot; field, select &quot;External&quot;.&lt;/p&gt;
&lt;p&gt;Now you need to specify the system for managing the databases and the previously created database that will be used to run Bitbucket.&lt;/p&gt;
&lt;p&gt;In the &quot;Database Type&quot; field, select &quot;PostgreSQL&quot;.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, the database for running Bitbucket is on the same server as Bitbucket.
:::&lt;/p&gt;
&lt;p&gt;In the &quot;Hostname&quot; field, enter &quot;localhost&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Port&quot; field, specify the value &quot;5432&quot;.&lt;/p&gt;
&lt;p&gt;This tutorial uses &quot;bitbucketdb&quot; as the database name for Bitbucket.&lt;/p&gt;
&lt;p&gt;In the &quot;Database name&quot; field, enter &quot;bitbucketdb&quot;.&lt;/p&gt;
&lt;p&gt;This tutorial uses &quot;bitbucketdbuser&quot; as the database username for Bitbucket.&lt;/p&gt;
&lt;p&gt;In the &quot;Database username&quot; field, specify &quot;bitbucketdbuser&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Database password&quot; field, specify the password assigned to the &quot;bitbucketdbuser&quot; user.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Test&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-46.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 46&quot;&gt;&lt;/p&gt;
&lt;p&gt;The message &quot;Successfully established database connection.&quot; means that all data was entered correctly.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-47.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 47&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to provide the base URL and license key for Bitbucket.&lt;/p&gt;
&lt;p&gt;The &quot;Base URL&quot; field should indicate the domain or subdomain where your Bitbucket is accessible from the Internet.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, the subdomain &lt;code&gt;bitbucket.heyvaldemar.net&lt;/code&gt; will be used to access Bitbucket from the Internet. You will need to specify your domain or subdomain under which your Bitbucket will be accessible from the Internet.
:::&lt;/p&gt;
&lt;p&gt;If you do not already have a license key, you can request a temporary key to try Bitbucket.&lt;/p&gt;
&lt;p&gt;In the &quot;License key&quot; section, select &quot;I need an evaluation key&quot; and click on the &quot;Create an account&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-48.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 48&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to provide: email address, first name, last name, and password to create an Atlassian account.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Sign up&quot; button.&lt;/p&gt;
&lt;p&gt;:::note
You will receive an email to the email address specified during registration. In the letter, you will find a link to complete the registration.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-49.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 49&quot;&gt;&lt;/p&gt;
&lt;p&gt;If you already have an Atlassian account, enter the email address associated with your Atlassian account in the &quot;Enter email&quot; field and click on the &quot;Continue&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-50.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 50&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the password for the Atlassian account and click on the &quot;Log in&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-51.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 51&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, you need to specify for which product you need a temporary license key, as well as the name of your organization.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Generate License&quot; button to generate a temporary license key for Bitbucket.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-52.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 52&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to confirm that the temporary license key for Bitbucket will be installed on your server.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Yes&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-53.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 53&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Your License Key&quot; field, insert the previously received temporary license key and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-54.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 54&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, you need to specify: username, name, email address, and password to create a Bitbucket administrator account.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Go to Bitbucket&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-55.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 55&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can now log into your Bitbucket dashboard using your previously created Bitbucket administrator account.&lt;/p&gt;
&lt;p&gt;Specify the username and password of an account with Bitbucket administrator rights and click on the &quot;Log in&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-56.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 56&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Bitbucket dashboard.&lt;/p&gt;
&lt;p&gt;Now you can create a new project and repository.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Git on with it&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-57.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 57&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on &quot;Create project&quot; to start creating a new project.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-58.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 58&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Project name&quot; field, specify the name for the project and click on the &quot;Create project&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-59.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 59&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on &quot;Create repository&quot; to start creating a new repository.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-60.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 60&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Name&quot; field, specify the name for the repository and click on the &quot;Create repository&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-61.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 61&quot;&gt;&lt;/p&gt;
&lt;p&gt;Everything is ready to use Bitbucket.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitbucket-on-ubuntu-server-62.webp&quot; alt=&quot;Install Bitbucket on Ubuntu Server - Step 62&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Self-Hosting</category><category>Bitbucket</category><category>Git</category><category>Ubuntu</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Confluence on Ubuntu Server</title><link>https://heyvaldemar.com/install-confluence-on-ubuntu-server/</link><guid isPermaLink="true">https://heyvaldemar.com/install-confluence-on-ubuntu-server/</guid><description>Step-by-step guide to install Confluence on Ubuntu Server with Apache, PostgreSQL, and Let&apos;s Encrypt SSL. Perfect for secure, production-ready deployments.</description><pubDate>Fri, 23 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Confluence on Ubuntu Server.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.atlassian.com/software/confluence&quot;&gt;Confluence&lt;/a&gt; is a collaboration tool that helps teams collaborate and share knowledge effectively.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted Confluence Data Center when your organization requires on-premises documentation with custom authentication and data residency controls. Confluence Cloud eliminates patching, scaling, and database maintenance. Self-hosting is justified when compliance mandates on-premises data storage or when you need direct database access for custom reporting and integration with internal systems.
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on a server, you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to receive a free cryptographic certificate through the Let&apos;s Encrypt CA.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the Confluence web interface.&lt;/li&gt;
&lt;li&gt;TCP port 8090 - to access the Confluence web interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which you plan to install Confluence.&lt;/p&gt;
&lt;p&gt;Update the local package index to the latest changes in the repositories using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt update
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-1.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;This tutorial walks you through obtaining a free cryptographic certificate through the Let&apos;s Encrypt CA. To obtain and subsequently renew a free SSL certificate, we will use the Certbot software client, which is designed to make it as easy as possible to obtain and renew a certificate through the Let&apos;s Encrypt certification authority.&lt;/p&gt;
&lt;p&gt;Now let&apos;s install the packages required for Confluence to work using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install -y postgresql apache2 apt-transport-https certbot python3-certbot-apache fontconfig
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this tutorial, PostgreSQL will be used as a database management system, and Apache will be used as a webserver.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-2.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s configure Apache for further work with Confluence.&lt;/p&gt;
&lt;p&gt;We enable the Apache webserver module called &quot;proxy_http&quot; using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo a2enmod proxy_http
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
The &quot;proxy_http&quot; module acts like a proxy server for the HTTP and HTTPS protocols.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-3.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;We enable the Apache webserver module called &quot;rewrite&quot; using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo a2enmod rewrite
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
The &quot;rewrite&quot; module is one of the most commonly used modules in the Apache webserver and provides a flexible and powerful way to manipulate URLs.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-4.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to create two virtual host files (called a block in Nginx), with which Confluence will work in the future.&lt;/p&gt;
&lt;p&gt;You will need two virtual host files to provide HTTPS access to Confluence, and to enable Confluence at &lt;code&gt;https://confluence.heyvaldemar.net&lt;/code&gt;, without specifying port 8090 in your browser address bar.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, you will use the &lt;code&gt;confluence.heyvaldemar.net&lt;/code&gt; subdomain to access Confluence from the Internet. You will need to specify your domain or subdomain under which your Confluence will be accessible from the Internet.
:::&lt;/p&gt;
&lt;p&gt;Let&apos;s create the first virtual host file using a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/apache2/sites-available/confluence.heyvaldemar.net.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-5.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hit the &quot;i&quot; button to go into edit mode, then insert the following configuration for the webserver to work.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-apache&quot;&gt;&amp;lt;VirtualHost *:80&amp;gt;
	ServerAdmin callvaldemar@gmail.com
	ServerName confluence.heyvaldemar.net
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this tutorial, you will use the &lt;code&gt;confluence.heyvaldemar.net&lt;/code&gt; subdomain to access Confluence from the Internet. You will need to specify your domain or subdomain under which your Confluence will be accessible from the Internet.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-6.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-7.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s create a second virtual host file using a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/apache2/sites-available/confluence.heyvaldemar.net-ssl.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-8.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hit the &quot;i&quot; button to go into edit mode, then insert the following configuration for the webserver to work.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-apache&quot;&gt;&amp;lt;IfModule mod_ssl.c&amp;gt;
&amp;lt;VirtualHost *:443&amp;gt;
	ServerAdmin callvaldemar@gmail.com
	ServerName confluence.heyvaldemar.net
	ProxyRequests Off

&amp;lt;Proxy *&amp;gt;
	Require all granted
&amp;lt;/Proxy&amp;gt;

	SSLEngine On
	SSLCertificateFile /etc/letsencrypt/live/confluence.heyvaldemar.net/fullchain.pem
	SSLCertificateKeyFile /etc/letsencrypt/live/confluence.heyvaldemar.net/privkey.pem
	Include /etc/letsencrypt/options-ssl-apache.conf

	RewriteEngine On
	RewriteCond %{REQUEST_URI} !^/synchrony
	RewriteRule ^/(.*) http://confluence.heyvaldemar.net:8090/$1 [P]

&amp;lt;Location /&amp;gt;
	Require all granted
&amp;lt;/Location&amp;gt;

	ProxyPass /synchrony http://localhost:8091/synchrony

&amp;lt;Location /synchrony&amp;gt;
	Require all granted
	RewriteEngine on
	RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
	RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
	RewriteRule .* ws://localhost:8091%{REQUEST_URI} [P]
&amp;lt;/Location&amp;gt;
&amp;lt;/VirtualHost&amp;gt;
&amp;lt;/IfModule&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this tutorial, you will use the &lt;code&gt;confluence.heyvaldemar.net&lt;/code&gt; subdomain to access Confluence from the Internet. You will need to specify your domain or subdomain under which your Confluence will be accessible from the Internet.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-9.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-10.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;We activate the first virtual host using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo a2ensite confluence.heyvaldemar.net.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-11.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;We activate the second virtual host using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo a2ensite confluence.heyvaldemar.net-ssl.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-12.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;Deactivate the default virtual host using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo a2dissite 000-default.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-13.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;Verify that there are no errors in the syntax of the new Apache config file using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apache2ctl configtest
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-14.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;Restart Apache to apply the changes made using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl restart apache2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-15.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s check that Apache has started successfully using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl status apache2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-16.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now, to improve the security of your webserver, you need to obtain a cryptographic certificate for the domain or subdomain, through which the Confluence control panel will be accessible from the Internet.&lt;/p&gt;
&lt;p&gt;:::note
To obtain and subsequently renew a free SSL certificate, we will use the Let&apos;s Encrypt certification authority, as well as the Certbot software client, which is designed to make it as easy as possible to obtain and renew a certificate through the Let&apos;s Encrypt certification authority.
:::&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, you will use the &lt;code&gt;confluence.heyvaldemar.net&lt;/code&gt; subdomain to access Confluence from the Internet. You will need to specify your domain or subdomain under which your Confluence will be accessible from the Internet.
:::&lt;/p&gt;
&lt;p&gt;Request a cryptographic certificate using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo certbot --apache -d confluence.heyvaldemar.net
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-17.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 17&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, we indicate the email address to which Let&apos;s Encrypt will send notifications about the expiration of the cryptographic certificate and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-18.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 18&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to read and accept the terms of use of the services provided.&lt;/p&gt;
&lt;p&gt;Press the button &quot;a&quot;, then &quot;Enter&quot;, if you agree with the terms of use of the services provided.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-19.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 19&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to choose whether you would like to share the above email address with the Electronic Frontier Foundation to receive newsletters.&lt;/p&gt;
&lt;p&gt;Press the &quot;n&quot; button, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-20.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 20&quot;&gt;&lt;/p&gt;
&lt;p&gt;At the next stage, you need to choose: do you want the parameters to be automatically added to the Apache configuration file for automatically redirecting HTTP traffic to HTTPS.&lt;/p&gt;
&lt;p&gt;Press the button &quot;2&quot;, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-21.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 21&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
Cryptographic certificates obtained through Let&apos;s Encrypt CA are valid for ninety days. Certbot automatically adds a script to renew the certificate to the task scheduler and the script runs twice a day, automatically renewing any cryptographic certificate that expires within thirty days.
:::&lt;/p&gt;
&lt;p&gt;You can check the functionality of the cryptographic certificate renewal process using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo certbot renew --dry-run
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-22.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 22&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to create a database that Confluence will use in the future, as well as a user with the necessary rights in this database.&lt;/p&gt;
&lt;p&gt;Switch to the &quot;postgres&quot; user who has administrator rights in PostgreSQL using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo su - postgres
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-23.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 23&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, switch to the PostgreSQL command line using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;psql
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-24.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 24&quot;&gt;&lt;/p&gt;
&lt;p&gt;We create a new user using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;CREATE USER confluencedbuser WITH PASSWORD &apos;2n!sfa@423FdsC0fH$vL&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this tutorial, &quot;confluencedbuser&quot; will be used as the username, with the password &quot;2n!sfa@423FdsC0fH$vL&quot;.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-25.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 25&quot;&gt;&lt;/p&gt;
&lt;p&gt;We create a new database and grant the rights to it to the previously created user using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;CREATE DATABASE &quot;confluencedb&quot; WITH OWNER &quot;confluencedbuser&quot; ENCODING &apos;UTF8&apos; LC_COLLATE = &apos;en_US.UTF-8&apos; LC_CTYPE = &apos;en_US.UTF-8&apos; TEMPLATE template0 CONNECTION LIMIT = -1;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
This tutorial will use &quot;confluencedb&quot; as the name for the database.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-26.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 26&quot;&gt;&lt;/p&gt;
&lt;p&gt;Exit the &quot;PostgreSQL&quot; command line using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;\q
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-27.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 27&quot;&gt;&lt;/p&gt;
&lt;p&gt;Log out as user &quot;postgres&quot; using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;exit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-28.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 28&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to download the Confluence installer using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;wget https://www.atlassian.com/software/confluence/downloads/binary/atlassian-confluence-7.12.0-x64.bin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
The latest version of Confluence can be found on the official Atlassian &lt;a href=&quot;https://www.atlassian.com/software/confluence/download-archives&quot;&gt;website&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-29.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 29&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s enable execution of the file &quot;atlassian-confluence-7.12.0-x64.bin&quot; using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo chmod a+x atlassian-confluence-7.12.0-x64.bin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-30.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 30&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s start the Confluence installation using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo ./atlassian-confluence-7.12.0-x64.bin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
Your team will differ from the one listed in this article, as you will be installing the most current version of Confluence at the time of reading.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-31.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 31&quot;&gt;&lt;/p&gt;
&lt;p&gt;At the first stage, the installer will warn you that Confluence will be installed on your server.&lt;/p&gt;
&lt;p&gt;Press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-32.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 32&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, select &quot;Custom Install (recommended for advanced users)&quot;.&lt;/p&gt;
&lt;p&gt;Press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-33.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 33&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, you can choose where to install Confluence.&lt;/p&gt;
&lt;p&gt;This tutorial covers installing Confluence in &quot;/opt/atlassian/confluence&quot;.&lt;/p&gt;
&lt;p&gt;Press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-34.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 34&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you can choose where to store your Confluence data.&lt;/p&gt;
&lt;p&gt;This tutorial covers installing Confluence in &quot;/var/atlassian/application-data/confluence&quot;.&lt;/p&gt;
&lt;p&gt;Press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-35.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 35&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you can select the ports that Confluence will use.&lt;/p&gt;
&lt;p&gt;This tutorial walks you through installing Confluence using port 8090 for HTTP and port 8000 for Control.&lt;/p&gt;
&lt;p&gt;Press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-36.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 36&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you will be offered the opportunity to install Confluence as a service.&lt;/p&gt;
&lt;p&gt;Press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-37.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 37&quot;&gt;&lt;/p&gt;
&lt;p&gt;Confluence installation completed successfully.&lt;/p&gt;
&lt;p&gt;We indicate &quot;n&quot; and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-38.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 38&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to make changes to the Confluence configuration file by opening it in a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /opt/atlassian/confluence/conf/server.xml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-39.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 39&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hit the &quot;i&quot; button to go into edit mode, find the section &quot;DEFAULT - Direct connector with no proxy, for unproxied HTTP access to Confluence&quot; and comment it out by putting &lt;code&gt;&amp;lt;! --&lt;/code&gt; on the line above the section parameters and &lt;code&gt;--&amp;gt;&lt;/code&gt; below the section parameters that you want to comment out.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-40.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 40&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, find the section &quot;HTTPS - Proxying Confluence via Apache or Nginx over HTTPS&quot; and uncomment it by removing the &lt;code&gt;&amp;lt;! --&lt;/code&gt; on the line above the section parameters and &lt;code&gt;--&amp;gt;&lt;/code&gt; below the section parameters that you want to uncomment.&lt;/p&gt;
&lt;p&gt;Then set the &quot;proxyName&quot; parameter to &lt;code&gt;confluence.heyvaldemar.net&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, you will use the confluence.heyvaldemar.net subdomain to access Confluence from the Internet. You will need to specify your domain or subdomain under which your Confluence will be accessible from the Internet.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-41.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 41&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-42.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 42&quot;&gt;&lt;/p&gt;
&lt;p&gt;Launch Confluence using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo /etc/init.d/confluence start
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-43.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 43&quot;&gt;&lt;/p&gt;
&lt;p&gt;Open the Confluence log to check that Confluence has started correctly using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo less /opt/atlassian/confluence/logs/catalina.out
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-44.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 44&quot;&gt;&lt;/p&gt;
&lt;p&gt;On your keyboard, press the &quot;Shift&quot; and &quot;f&quot; keys to start monitoring the changes in the Confluence log in real-time.&lt;/p&gt;
&lt;p&gt;:::note
The message that says &quot;Server startup in 12,548 milliseconds&quot; indicates that Confluence has started successfully.
:::&lt;/p&gt;
&lt;p&gt;On the keyboard, press the key combination &quot;Ctrl&quot; and &quot;c&quot;, then &quot;q&quot; to close the Confluence log.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-45.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 45&quot;&gt;&lt;/p&gt;
&lt;p&gt;To continue the Confluence installation process, you need to go from the workstation to the link &lt;code&gt;https://confluence.heyvaldemar.net&lt;/code&gt;, where &lt;code&gt;confluence.heyvaldemar.net&lt;/code&gt; is the name of my server. Accordingly, you need to provide the name or IP address of your Confluence server.&lt;/p&gt;
&lt;p&gt;This guide walks you through installing Confluence for a production environment.&lt;/p&gt;
&lt;p&gt;Select &quot;Production Installation&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-46.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 46&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to provide a license key for Confluence.&lt;/p&gt;
&lt;p&gt;If you do not already have a license key, you can request a temporary key to try Confluence.&lt;/p&gt;
&lt;p&gt;Click on &quot;Get an evaluation license&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-47.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 47&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, click on the &quot;Sign up for an account&quot; button if you do not have an Atlassian account yet.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-48.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 48&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to provide: email address, first name, last name, and password to create an Atlassian account.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Sign up&quot; button.&lt;/p&gt;
&lt;p&gt;:::note
You will receive an email to the email address specified during registration. In the letter, you will find a link to complete the registration.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-49.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 49&quot;&gt;&lt;/p&gt;
&lt;p&gt;If you already have an Atlassian account, enter the email address associated with your Atlassian account in the &quot;Enter email&quot; field and click on the &quot;Continue&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-50.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 50&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the password for the Atlassian account and click on the &quot;Log in&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-51.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 51&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, you need to specify for which product you need a temporary license key, as well as the name of your organization.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Generate License&quot; button to generate a temporary license key for Confluence.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-52.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 52&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to confirm that the temporary license key for Confluence will be installed on your server.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Yes&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-53.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 53&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Confluence&quot; field, insert the previously received temporary license key and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-54.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 54&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to set up a connection to the previously created database.&lt;/p&gt;
&lt;p&gt;Select &quot;My own database&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-55.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 55&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to specify the system for database management and the previously created database that will be used to run Confluence.&lt;/p&gt;
&lt;p&gt;In the &quot;Database type&quot; field, select &quot;PostgreSQL&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Setup type&quot; section, select &quot;Simple&quot;.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, the database for Confluence is on the same server as Confluence.
:::&lt;/p&gt;
&lt;p&gt;In the &quot;Hostname&quot; field, enter &quot;localhost&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Database port&quot; field, specify the value &quot;5432&quot;.&lt;/p&gt;
&lt;p&gt;This tutorial uses &quot;confluencedb&quot; as the database name for Confluence.&lt;/p&gt;
&lt;p&gt;Specify &quot;confluencedb&quot; in the &quot;Database name&quot; field.&lt;/p&gt;
&lt;p&gt;This guide uses &quot;confluencedbuser&quot; as the username with database rights for Confluence.&lt;/p&gt;
&lt;p&gt;In the &quot;Username&quot; field, specify &quot;confluencedbuser&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Password&quot; field, specify the password assigned to the &quot;confluencedbuser&quot; user.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Test connection&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-56.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 56&quot;&gt;&lt;/p&gt;
&lt;p&gt;The message &quot;Success! Database connected successfully.&quot; means that all data was entered correctly.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-57.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 57&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, you will be able to choose from several options: download demo content, do not download any content and start filling Confluence yourself or restore data from a backup.&lt;/p&gt;
&lt;p&gt;This guide walks you through installing Confluence without importing any content.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Empty Site&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-58.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 58&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you can configure Confluence user management using Jira.&lt;/p&gt;
&lt;p&gt;This tutorial walks you through installing Confluence without Jira&apos;s user management capabilities.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Manage users and groups within Confluence&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-59.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 59&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, you need to provide: username, name, email address, and password to create a Confluence administrator account.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-60.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 60&quot;&gt;&lt;/p&gt;
&lt;p&gt;Everything is ready to use Confluence.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Start&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-61.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 61&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you can create the first space, for example, for the development team, where they will work on their projects.&lt;/p&gt;
&lt;p&gt;Specify a name for the first space and click on the &quot;Continue&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-62.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 62&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, the editor will open, in which you can create the first page in the new space.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Skip tutorial&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-63.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 63&quot;&gt;&lt;/p&gt;
&lt;p&gt;We fill the page with useful content so that we can later publish it in a new space.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Publish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-64.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 64&quot;&gt;&lt;/p&gt;
&lt;p&gt;The first page in the developer space has been successfully completed.&lt;/p&gt;
&lt;p&gt;:::note
You can restrict access for users, both to space and to certain pages within it.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-confluence-on-ubuntu-server-65.webp&quot; alt=&quot;Install Confluence on Ubuntu Server - Step 65&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Self-Hosting</category><category>Confluence</category><category>Atlassian</category><category>Ubuntu</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Foreman on Ubuntu Server</title><link>https://heyvaldemar.com/install-foreman-on-ubuntu-server/</link><guid isPermaLink="true">https://heyvaldemar.com/install-foreman-on-ubuntu-server/</guid><description>Learn how to install Foreman on Ubuntu Server to manage, provision, and monitor infrastructure with Puppet integration in a few simple steps.</description><pubDate>Tue, 20 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Foreman on Ubuntu Server.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://theforeman.org/&quot;&gt;Foreman&lt;/a&gt; is open-source software for deploying, configuring and monitoring physical and virtual servers. Foreman can integrate with Ansible, Puppet, Chef, Salt and other configuration management software products.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted Foreman when you need a unified provisioning and configuration management dashboard for bare-metal and virtual infrastructure. Ansible Automation Platform (Tower) or Spacelift provide managed alternatives with better cloud-native integration. Self-hosting Foreman is justified when you manage physical servers, need PXE boot provisioning, or require a single pane of glass across Puppet, Ansible, and Salt.
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on a server, you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - for the configuration deployment service.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the Foreman control panel.&lt;/li&gt;
&lt;li&gt;TCP port 8140 - for Puppet Agent to work.&lt;/li&gt;
&lt;li&gt;TCP port 5648 - for client and Smart Proxy operation.&lt;/li&gt;
&lt;li&gt;TCP port 9090 - for communication with Smart Proxy.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which you plan to install Foreman.&lt;/p&gt;
&lt;p&gt;Let&apos;s name the server using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo hostnamectl set-hostname foreman.heyvaldemar.net
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This tutorial uses &lt;code&gt;foreman.heyvaldemar.net&lt;/code&gt; as the Foreman server name.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-1.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;The server with the agent installed must resolve the name of the Foreman server, and also the Foreman server must resolve the name of the client-server.&lt;/p&gt;
&lt;p&gt;Make sure the server name has the correct DNS entry and also update the &quot;/etc/hosts&quot; file on the server with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;echo &quot;10.170.18.186 foreman.heyvaldemar.net puppet.heyvaldemar.net foreman puppet&quot; | sudo tee -a /etc/hosts
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This tutorial uses &lt;code&gt;foreman.heyvaldemar.net&lt;/code&gt; as the Foreman server name.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-2.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Restart the hostamed service for the changes to the server name to take effect using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl restart systemd-hostnamed
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-3.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s check the correctness of the server name using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;hostname
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-4.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s replace the current shell process with a new one using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;exec bash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-5.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to download and install the Puppet Server repository configuration package.&lt;/p&gt;
&lt;p&gt;Download the Puppet Server repository configuration package using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;wget https://apt.puppetlabs.com/puppet6-release-bionic.deb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-6.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Install the Puppet Server repository configuration package using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo dpkg -i puppet6-release-bionic.deb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-7.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, we connect the Foreman repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;echo &quot;deb http://deb.theforeman.org/ bionic 2.4&quot; | sudo tee /etc/apt/sources.list.d/foreman.list
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-8.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, connect the Foreman plugin repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;echo &quot;deb http://deb.theforeman.org/ plugins 2.4&quot; | sudo tee -a /etc/apt/sources.list.d/foreman.list
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-9.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s add the official Foreman key using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;wget -q https://deb.theforeman.org/pubkey.gpg -O- | sudo apt-key add -
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-10.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;Update the local package index to the latest changes in the repositories using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt update
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-11.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now install Foreman Installer using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt -y install foreman-installer
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-12.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now install Foreman using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo foreman-installer
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-13.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, you will receive the username and password of an account with Foreman administrator rights.&lt;/p&gt;
&lt;p&gt;Save this data in a safe place.&lt;/p&gt;
&lt;p&gt;Puppet binaries are located in the &quot;/opt/puppetlabs/bin/&quot; directory, which is not in the &quot;PATH&quot; environment variable by default and in the &quot;secure_path&quot; variable that is used for &quot;sudo&quot; operations.&lt;/p&gt;
&lt;p&gt;:::note
The path to the executable files is irrelevant for the Puppet services since the start of the services does not depend on the &quot;PATH&quot; and &quot;secure_path&quot;.
:::&lt;/p&gt;
&lt;p&gt;By adding the path to executable files to variables, you can use:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo puppet agent -t
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Instead:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo /opt/puppetlabs/bin/puppet agent -t
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Add the path to the Puppet executable files to the &quot;secure_path&quot; variable.&lt;/p&gt;
&lt;p&gt;Open the &quot;sudoers&quot; configuration file in a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo visudo
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-14.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;Find the variable &quot;secure_path&quot;, and at the end of the line, before the closing quote, add the path to the Puppet executable files &lt;code&gt;:/opt/puppetlabs/bin&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;To save the changes in the &quot;sudoers&quot; file, press &quot;Ctrl + x&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-15.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to confirm the changes in the file.&lt;/p&gt;
&lt;p&gt;Click on the &quot;y&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-16.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;Press the &quot;Enter&quot; button to confirm saving the file.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-17.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 17&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s add the path to the Puppet executables to the &quot;PATH&quot; environment variable.&lt;/p&gt;
&lt;p&gt;Open the &quot;environment&quot; configuration file in a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/environment
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-18.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 18&quot;&gt;&lt;/p&gt;
&lt;p&gt;Press the &quot;i&quot; button to enter edit mode, and at the end of the line, before the closing quote, add the path to the Puppet executable files &lt;code&gt;:/opt/puppetlabs/bin&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-19.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 19&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-20.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 20&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can now install the NTP module to help you install, configure, and manage the NTP service on client operating systems.&lt;/p&gt;
&lt;p&gt;Install the NTP module using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo puppet module install puppetlabs-ntp -i /etc/puppetlabs/code/modules/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-21.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 21&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to import the NTP module into your Foreman control panel.&lt;/p&gt;
&lt;p&gt;From the workstation, go to the link &lt;code&gt;https://foreman.heyvaldemar.net&lt;/code&gt;, where &lt;code&gt;foreman.heyvaldemar.net&lt;/code&gt; is the name of my subdomain to access the Foreman control panel. You will need to specify your domain or subdomain through which your Foreman control panel will be accessible from the Internet.&lt;/p&gt;
&lt;p&gt;This guide uses Mozilla Firefox as the web browser to connect to the Foreman Control Panel.&lt;/p&gt;
&lt;p&gt;In the next step, you can see the warning &quot;Warning: Potential Security Risk Ahead&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Advanced&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-22.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 22&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, click on the &quot;Accept the Risk and Continue&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-23.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 23&quot;&gt;&lt;/p&gt;
&lt;p&gt;Default login for Foreman administrator account: admin&lt;/p&gt;
&lt;p&gt;:::note
The password for the administrator account was generated after the Foreman installation was completed.
:::&lt;/p&gt;
&lt;p&gt;Specify the username and password of an account with Foreman administrator rights, and click on the &quot;Log in&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-24.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 24&quot;&gt;&lt;/p&gt;
&lt;p&gt;From the menu on the left, select &quot;Configure&quot;, then &quot;Classes&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-25.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 25&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, click on the button &quot;Import environments from &lt;code&gt;foreman.heyvaldemar.net&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This tutorial uses &lt;code&gt;foreman.heyvaldemar.net&lt;/code&gt; as the Foreman server name.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-26.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 26&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the environment for which you want to import the module, and click on the &quot;Update&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-27.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 27&quot;&gt;&lt;/p&gt;
&lt;p&gt;The module has been successfully imported into the selected environment.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-28.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 28&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, we connect to the server on which you plan to install Puppet Agent.&lt;/p&gt;
&lt;p&gt;Let&apos;s name the server using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo hostnamectl set-hostname puppet-agent.heyvaldemar.net
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This tutorial uses &lt;code&gt;puppet-agent.heyvaldemar.net&lt;/code&gt; as the name of the server with the Puppet agent installed.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-29.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 29&quot;&gt;&lt;/p&gt;
&lt;p&gt;The server with the agent installed must resolve the name of the Foreman server, and also the Foreman server must resolve the name of the client-server.&lt;/p&gt;
&lt;p&gt;Make sure the server name has the correct DNS entry and also update the &quot;/etc/hosts&quot; file with the IP address and client-server name using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;echo &quot;10.170.18.152 puppet-agent.heyvaldemar.net puppet-agent&quot; | sudo tee -a /etc/hosts
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This tutorial uses &lt;code&gt;puppet-agent.heyvaldemar.net&lt;/code&gt; as the name of the server with the Puppet agent installed.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-30.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 30&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, add the IP address and name of the Foreman server to the &quot;/etc/ hosts&quot; file using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;echo &quot;10.170.18.186 foreman.heyvaldemar.net puppet.heyvaldemar.net foreman puppet&quot; | sudo tee -a /etc/hosts
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The presence of this record will allow the server with the agent installed to resolve the Foreman server name even without a DNS record.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-31.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 31&quot;&gt;&lt;/p&gt;
&lt;p&gt;Restart the hostamed service for the changes to the server name to take effect using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl restart systemd-hostnamed
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-32.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 32&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s check the correctness of the server name using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;hostname
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-33.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 33&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s replace the current shell process with a new one using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;exec bash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-34.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 34&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to download and install the Puppet Agent repository configuration package.&lt;/p&gt;
&lt;p&gt;Download the Puppet Agent repository configuration package using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;wget https://apt.puppetlabs.com/puppet6-release-bionic.deb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-35.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 35&quot;&gt;&lt;/p&gt;
&lt;p&gt;Install the Puppet Agent repository configuration package using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo dpkg -i puppet6-release-bionic.deb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-36.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 36&quot;&gt;&lt;/p&gt;
&lt;p&gt;Update the local package index to the latest changes in the repositories using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt update
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-37.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 37&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now install Puppet Agent using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install -y puppet-agent
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-38.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 38&quot;&gt;&lt;/p&gt;
&lt;p&gt;Puppet binaries are located in the &quot;/opt/puppetlabs/bin/&quot; directory, which is not in the &quot;PATH&quot; environment variable by default and in the &quot;secure_path&quot; variable that is used for &quot;sudo&quot; operations.&lt;/p&gt;
&lt;p&gt;:::note
The path to the executable files is irrelevant for the Puppet services since the start of the services does not depend on the &quot;PATH&quot; and &quot;secure_path&quot;.
:::&lt;/p&gt;
&lt;p&gt;By adding the path to executable files to variables, you can use:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo puppet agent -t
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Instead:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo /opt/puppetlabs/bin/puppet agent -t
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Add the path to the Puppet executable files to the &quot;secure_path&quot; variable.&lt;/p&gt;
&lt;p&gt;Open the &quot;sudoers&quot; configuration file in a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo visudo
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-39.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 39&quot;&gt;&lt;/p&gt;
&lt;p&gt;Find the variable &quot;secure_path&quot;, and at the end of the line, before the closing quote, add the path to the Puppet executable files &lt;code&gt;:/opt/puppetlabs/bin&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-40.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 40&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to confirm the changes in the file.&lt;/p&gt;
&lt;p&gt;Click on the &quot;y&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-41.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 41&quot;&gt;&lt;/p&gt;
&lt;p&gt;Press the &quot;Enter&quot; button to confirm saving the file.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-42.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 42&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s add the path to the Puppet executables to the &quot;PATH&quot; environment variable.&lt;/p&gt;
&lt;p&gt;Open the &quot;environment&quot; configuration file in a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/environment
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-43.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 43&quot;&gt;&lt;/p&gt;
&lt;p&gt;Press the &quot;i&quot; button to enter edit mode, and at the end of the line, before the closing quote, add the path to the Puppet executable files &lt;code&gt;:/opt/puppetlabs/bin&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-44.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 44&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-45.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 45&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to make changes to the Puppet configuration file by opening it in a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/puppetlabs/puppet/puppet.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-46.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 46&quot;&gt;&lt;/p&gt;
&lt;p&gt;Press the &quot;i&quot; button to switch to edit mode, add a new section &lt;code&gt;[main]&lt;/code&gt; with the following parameters:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;[main]
certname    = puppet-agent.heyvaldemar.net
server      = foreman.heyvaldemar.net
environment = production
runinterval = 15m
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this tutorial, Puppet Agent is installed on the &lt;code&gt;puppet-agent.heyvaldemar.net&lt;/code&gt; server. You will need to specify your server through which your Puppet Agent will be accessible from the Internet or on the local network of your organization.
:::&lt;/p&gt;
&lt;p&gt;Foreman is also installed on the &lt;code&gt;foreman.heyvaldemar.net&lt;/code&gt; server. You will need to specify your server through which your Foreman will be accessible from the Internet or from the local network of your organization.&lt;/p&gt;
&lt;p&gt;:::note
The &quot;runinterval&quot; parameter specifies the time interval between agent requests to the Foreman server.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-47.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 47&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-48.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 48&quot;&gt;&lt;/p&gt;
&lt;p&gt;Launch Puppet Agent and enable it to autostart when the operating system starts up using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo puppet resource service puppet ensure=running enable=true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-49.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 49&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to approve the certificate request for the server on which the Puppet Agent is installed so that the client can subsequently receive the configuration from the Foreman server.&lt;/p&gt;
&lt;p&gt;Return to the Foreman control panel and select &quot;Infrastructure&quot; from the menu on the left, then &quot;Smart Proxies&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-50.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 50&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, find the Foreman server, and in the &quot;Actions&quot; section, in the drop-down list, select &quot;Certificates&quot;.&lt;/p&gt;
&lt;p&gt;This tutorial uses &lt;code&gt;foreman.heyvaldemar.net&lt;/code&gt; as the Foreman server name.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-51.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 51&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now we find the client-server and in the &quot;Actions&quot; section, select &quot;Sign&quot;.&lt;/p&gt;
&lt;p&gt;This tutorial uses &lt;code&gt;puppet-agent.heyvaldemar.net&lt;/code&gt; as the name of the server with the Puppet agent installed.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-52.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 52&quot;&gt;&lt;/p&gt;
&lt;p&gt;The certificate for the client-server has been successfully approved.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-53.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 53&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can now configure automatic certificate approval.&lt;/p&gt;
&lt;p&gt;Go to the &quot;Autosign entries&quot; section and click on the &quot;Create Autosign Entry&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-54.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 54&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you can specify the domain for which Foreman will automatically approve certificates.&lt;/p&gt;
&lt;p&gt;:::note
You must specify &lt;code&gt;*&lt;/code&gt; Before the domain, so that all members of the specified domain will automatically approve certificates.
:::&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-55.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 55&quot;&gt;&lt;/p&gt;
&lt;p&gt;Automatic certificate approval is configured.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-56.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 56&quot;&gt;&lt;/p&gt;
&lt;p&gt;We return to the server with the Puppet Agent installed.&lt;/p&gt;
&lt;p&gt;Now you need to get the configuration for the client from the Puppet server using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo puppet agent -t
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-57.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 57&quot;&gt;&lt;/p&gt;
&lt;p&gt;The configuration for the client from the Foreman server was successfully received.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-foreman-on-ubuntu-server-58.webp&quot; alt=&quot;Install Foreman on Ubuntu Server - Step 58&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Foreman</category><category>Automation</category><category>Provisioning</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Zabbix on Ubuntu Server</title><link>https://heyvaldemar.com/install-zabbix-on-ubuntu-server/</link><guid isPermaLink="true">https://heyvaldemar.com/install-zabbix-on-ubuntu-server/</guid><description>Install Zabbix on Ubuntu Server 22.04 with Apache, MySQL, and SSL. Full step-by-step guide with Certbot, secure configs, and database setup.</description><pubDate>Tue, 20 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Zabbix on Ubuntu Server.&lt;/p&gt;
&lt;p&gt;Zabbix is an open-source, enterprise-class distributed monitoring solution.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted Zabbix when you need agentless infrastructure monitoring with full data retention control and no per-host licensing fees. Datadog or New Relic provide managed alternatives with richer APM, log management, and integrations. Self-hosting Zabbix is justified when monitoring data must remain on-premises or when host count makes per-unit SaaS pricing prohibitive.
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on a server, you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to get a free cryptographic certificate through Let&apos;s Encrypt CA.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the Zabbix frontend.&lt;/li&gt;
&lt;li&gt;TCP port 10050 - for Zabbix Agent to work.&lt;/li&gt;
&lt;li&gt;TCP port 10051 - for Zabbix Trapper to work.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which you plan to install Zabbix.&lt;/p&gt;
&lt;p&gt;:::note
To obtain and subsequently renew a free SSL certificate, we will use the Let&apos;s Encrypt certification authority, as well as the Certbot software client, which is designed to make it as easy as possible to obtain and renew a certificate through the Let&apos;s Encrypt certification authority.
:::&lt;/p&gt;
&lt;p&gt;Now you need to download and install the Zabbix repository configuration package.&lt;/p&gt;
&lt;p&gt;Download the Zabbix repository configuration package using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;wget https://repo.zabbix.com/zabbix/6.4/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.4-1+ubuntu22.04_all.deb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-1.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Install the Zabbix repository configuration package using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo dpkg -i zabbix-release_6.4-1+ubuntu22.04_all.deb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-2.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Update the local package index to the latest changes in the repositories using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt update
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-3.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s install the packages required for Multicraft to work using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install -y apache2 apt-transport-https certbot python3-certbot-apache mysql-server zabbix-server-mysql zabbix-frontend-php zabbix-apache-conf zabbix-sql-scripts zabbix-agent
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this tutorial, MySQL will be used as a database management system, and Apache will be used as a webserver.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-4.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;We enable the Apache webserver module called &quot;rewrite&quot; using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo a2enmod rewrite
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
The &quot;rewrite&quot; module is one of the most commonly used modules in the Apache webserver and provides a flexible and powerful way to manipulate URLs.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-5.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to create a virtual host file (called a block in Nginx), with which Zabbix will work in the future.&lt;/p&gt;
&lt;p&gt;Let&apos;s create a virtual host file using a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/apache2/sites-available/zabbix.heyvaldemar.net.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this tutorial, the &lt;code&gt;zabbix.heyvaldemar.net&lt;/code&gt; subdomain will be used to access the Zabbix control panel from the Internet. You will need to specify your domain or subdomain by which your Zabbix will be accessible from the Internet.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-6.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hit the &quot;i&quot; button to go into edit mode, then insert the following configuration for the webserver to work.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-apache&quot;&gt;&amp;lt;VirtualHost *:80&amp;gt;
	ServerAdmin callvaldemar@gmail.com
	ServerName zabbix.heyvaldemar.net
	DocumentRoot /usr/share/zabbix
	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this tutorial, the &lt;code&gt;zabbix.heyvaldemar.net&lt;/code&gt; subdomain will be used to access Zabbix from the Internet. You will need to specify your domain or subdomain by which your Zabbix will be accessible from the Internet.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-7.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-8.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;We activate the created virtual host using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo a2ensite zabbix.heyvaldemar.net.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this tutorial, the &lt;code&gt;zabbix.heyvaldemar.net&lt;/code&gt; subdomain will be used to access the Zabbix control panel from the Internet. You will need to specify your domain or subdomain by which your Zabbix will be accessible from the Internet.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-9.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Deactivate the default virtual host using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo a2dissite 000-default.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-10.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;Verify that there are no errors in the syntax of the new Apache config file using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apache2ctl configtest
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-11.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;Restart Apache to apply the changes made using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl restart apache2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-12.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s check that Apache has started successfully using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl status apache2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-13.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now, to increase the security level of the webserver, you need to obtain a cryptographic certificate for the domain or subdomain through which your Zabbix will be accessible from the Internet.&lt;/p&gt;
&lt;p&gt;:::note
To obtain and subsequently renew a free SSL certificate, we will use the Let&apos;s Encrypt certification authority, as well as the Certbot software client, which is designed to make it as easy as possible to obtain and renew a certificate through the Let&apos;s Encrypt certification authority.
:::&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, the &lt;code&gt;zabbix.heyvaldemar.net&lt;/code&gt; subdomain will be used to access the Zabbix control panel from the Internet. You will need to specify your domain or subdomain by which your Zabbix will be accessible from the Internet.
:::&lt;/p&gt;
&lt;p&gt;Request a cryptographic certificate using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo certbot --apache -d zabbix.heyvaldemar.net
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-14.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, we indicate the email address to which Let&apos;s Encrypt will send notifications about the expiration of the cryptographic certificate and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-15.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to read and accept the terms of use of the services provided.&lt;/p&gt;
&lt;p&gt;Press the button &quot;a&quot;, then &quot;Enter&quot;, if you agree with the terms of use of the services provided.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-16.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to choose whether you would like to share the above email address with the Electronic Frontier Foundation to receive newsletters.&lt;/p&gt;
&lt;p&gt;Press the &quot;n&quot; button, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-17.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 17&quot;&gt;&lt;/p&gt;
&lt;p&gt;At the next stage, you need to choose: do you want the parameters to be automatically added to the Apache configuration file for automatically redirecting HTTP traffic to HTTPS.&lt;/p&gt;
&lt;p&gt;Press the button &quot;2&quot;, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-18.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 18&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
Cryptographic certificates obtained through Let&apos;s Encrypt CA are valid for ninety days. Certbot automatically adds a script to renew the certificate to the task scheduler and the script runs twice a day, automatically renewing any cryptographic certificate that expires within thirty days.
:::&lt;/p&gt;
&lt;p&gt;You can check the functionality of the cryptographic certificate renewal process using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo certbot renew --dry-run
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-19.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 19&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s configure MySQL for further work with Zabbix.&lt;/p&gt;
&lt;p&gt;First, you need to run the &quot;mysql_secure_installation&quot; script, which is designed to provide a basic level of MySQL security.&lt;/p&gt;
&lt;p&gt;Run the script using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo mysql_secure_installation
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-20.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 20&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to answer a few questions to ensure a basic level of MySQL security.&lt;/p&gt;
&lt;p&gt;The first question is whether you want to use the password strength plugin, which will need to be set later for the &quot;root&quot; user who has administrator rights in MySQL.&lt;/p&gt;
&lt;p&gt;Press the &quot;y&quot; button, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-21.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 21&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to select the level of password complexity checking, which will need to be set later for the &quot;root&quot; user who has administrator rights in MySQL.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, we will look at the highest level of password strength checking for the &quot;root&quot; user.
:::&lt;/p&gt;
&lt;p&gt;Press the button &quot;2&quot;, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-22.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 22&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to provide a strong password for the &quot;root&quot; user who has administrator rights in MySQL.&lt;/p&gt;
&lt;p&gt;Specify a strong password for the &quot;root&quot; user and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-23.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 23&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, specify the password for the &quot;root&quot; user again and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-24.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 24&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next question is if you would like to proceed to the next step in setting up a basic MySQL security level with the obtained password strength value.&lt;/p&gt;
&lt;p&gt;:::note
If the password you specified will have a value of &quot;Estimated strength of the password&quot; less than 100, it means that the password you specified earlier for the &quot;root&quot; user is not strong enough, and you need to specify a stronger password.
:::&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, the &quot;Estimated strength of the password&quot; value is 100, which indicates that the previously specified password is strong enough.
:::&lt;/p&gt;
&lt;p&gt;Press the &quot;y&quot; button, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-25.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 25&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next question is if you want to delete anonymous users.&lt;/p&gt;
&lt;p&gt;Press the &quot;y&quot; button, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-26.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 26&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next question is if you want to disable remote MySQL connectivity for the &quot;root&quot; user.&lt;/p&gt;
&lt;p&gt;Press the &quot;y&quot; button, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-27.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 27&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next question is if you want to drop the test databases.&lt;/p&gt;
&lt;p&gt;Press the &quot;y&quot; button, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-28.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 28&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to apply the changes you made.&lt;/p&gt;
&lt;p&gt;Press the &quot;y&quot; button, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-29.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 29&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to create a database that Zabbix will use in the future, as well as a user with the necessary rights to this database.&lt;/p&gt;
&lt;p&gt;We connect to the MySQL management console using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo mysql -u root -p
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-30.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 30&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the password for the &quot;root&quot; account, set it earlier, and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-31.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 31&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
This tutorial will use &quot;zabbixdb&quot; as the database name for Zabbix.
:::&lt;/p&gt;
&lt;p&gt;Let&apos;s create a database that Zabbix will use in the future using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;CREATE DATABASE zabbixdb CHARACTER SET utf8 COLLATE utf8mb4_bin;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-32.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 32&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, &quot;zabbixdbuser&quot; with the password &quot;c@e3wY88nx63c^4w^43r&quot; will be used as the username with database rights to run Zabbix.
:::&lt;/p&gt;
&lt;p&gt;Create a user and assign a password to it using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;CREATE USER &apos;zabbixdbuser&apos;@&apos;localhost&apos; IDENTIFIED BY &apos;c@e3wY88nx63c^4w^43r&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-33.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 33&quot;&gt;&lt;/p&gt;
&lt;p&gt;We grant the new user rights to the previously created database using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;GRANT ALL ON zabbixdb.* TO &apos;zabbixdbuser&apos;@&apos;localhost&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-34.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 34&quot;&gt;&lt;/p&gt;
&lt;p&gt;Apply the changes made using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;FLUSH PRIVILEGES;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-35.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 35&quot;&gt;&lt;/p&gt;
&lt;p&gt;Disconnect from the MySQL Management Console using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;quit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-36.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 36&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to configure the schema and import the data into the previously created database for Zabbix to work.&lt;/p&gt;
&lt;p&gt;This tutorial uses &quot;zabbixdb&quot; as the database name for the Zabbix operation.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, &quot;zabbixdbuser&quot; is used as the username with database rights to run Zabbix.
:::&lt;/p&gt;
&lt;p&gt;Let&apos;s configure the schema and import the data into the previously created database using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;zcat /usr/share/doc/zabbix-server-mysql/create.sql.gz | mysql --default-character-set=utf8mb4 -u zabbixdbuser -p zabbixdb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-37.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 37&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the password for the &quot;zabbixdbuser&quot; account specified earlier and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-38.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 38&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to make changes to the Zabbix configuration file by opening it in a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/zabbix/zabbix_server.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-39.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 39&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, the database for Zabbix to work is on the same server as Zabbix.
:::&lt;/p&gt;
&lt;p&gt;Press the &quot;i&quot; button to switch to edit mode, find the &quot;DBHost&quot; parameter and uncomment it by removing the &quot;#&quot; symbol. Then we specify the value &quot;localhost&quot; for the parameter.&lt;/p&gt;
&lt;p&gt;This tutorial uses &quot;zabbixdb&quot; as the database name for Zabbix operation.&lt;/p&gt;
&lt;p&gt;Find the &quot;DBName&quot; parameter and specify the value &quot;zabbixdb&quot; for the parameter.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, &quot;zabbixdbuser&quot; is used as the username with database rights to run Zabbix.
:::&lt;/p&gt;
&lt;p&gt;Find the &quot;DBUser&quot; parameter and specify the value &quot;zabbixdbuser&quot; for the parameter.&lt;/p&gt;
&lt;p&gt;Find the &quot;DBPassword&quot; parameter and uncomment it by removing the &quot;#&quot; symbol. Then, as the value for the parameter, we specify the password assigned to the &quot;zabbixdbuser&quot; user.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-40.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 40&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-41.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 41&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to make changes to the Apache configuration file by opening it in a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/zabbix/apache.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-42.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 42&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, find the &quot;php_value date.timezone Europe/Riga&quot; parameter in the &quot;IfModule mod_php7.c&quot; section and uncomment it by removing the &quot;#&quot; symbol. Then we indicate instead of &quot;Europe/Riga&quot;, the time zone in which your Zabbix server is located.&lt;/p&gt;
&lt;p&gt;You can view the full list of supported time zones in the &lt;a href=&quot;https://www.php.net/manual/en/timezones.php&quot;&gt;official PHP documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-43.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 43&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-44.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 44&quot;&gt;&lt;/p&gt;
&lt;p&gt;Restart Zabbix, Zabbix Agent, and Apache to apply the changes, using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl restart zabbix-server zabbix-agent apache2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-45.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 45&quot;&gt;&lt;/p&gt;
&lt;p&gt;Check that Zabbix has started successfully using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl status zabbix-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-46.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 46&quot;&gt;&lt;/p&gt;
&lt;p&gt;Check that Zabbix Agent has started successfully using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl status zabbix-agent
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-47.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 47&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s check that Apache has started successfully using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl status apache2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-48.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 48&quot;&gt;&lt;/p&gt;
&lt;p&gt;Enable autorun of Zabbix, Zabbix Agent, and Apache when starting the operating system using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl enable zabbix-server zabbix-agent apache2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-49.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 49&quot;&gt;&lt;/p&gt;
&lt;p&gt;To continue the Zabbix installation process, you need to go from the workstation to the link &lt;code&gt;https://zabbix.heyvaldemar.net/setup.php&lt;/code&gt;, where &lt;code&gt;zabbix.heyvaldemar.net&lt;/code&gt; is the name of my server. Accordingly, you need to specify the name or IP address of your Zabbix server.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next step&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-50.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 50&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, the installer will check that all the requirements for the correct installation of Zabbix are met.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next step&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-51.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 51&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to specify the system for managing the databases and the previously created database that will be used to run Zabbix.&lt;/p&gt;
&lt;p&gt;In the &quot;Database type&quot; field, select &quot;MySQL&quot;.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, the database for Zabbix to work is on the same server as Zabbix.
:::&lt;/p&gt;
&lt;p&gt;In the &quot;Database host&quot; field, specify &quot;localhost&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Database port&quot; field, specify the value &quot;0&quot; to use the default port for connecting the database.&lt;/p&gt;
&lt;p&gt;This tutorial uses &quot;zabbixdb&quot; as the database name for the Zabbix operation.&lt;/p&gt;
&lt;p&gt;In the &quot;Database name&quot; field, specify &quot;zabbixdb&quot;.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, &quot;zabbixdbuser&quot; is used as the username with database rights to run Zabbix.
:::&lt;/p&gt;
&lt;p&gt;In the &quot;User&quot; field, specify &quot;zabbixdbuser&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Password&quot; field, specify the password assigned to the &quot;zabbixdbuser&quot; user.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next step&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-52.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 52&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to specify information about your Zabbix server.&lt;/p&gt;
&lt;p&gt;In the &quot;Host&quot; field, specify &quot;localhost&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Port&quot; field, enter &quot;10051&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next step&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-53.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 53&quot;&gt;&lt;/p&gt;
&lt;p&gt;We check that the time zone is set correctly and click on the &quot;Next step&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-54.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 54&quot;&gt;&lt;/p&gt;
&lt;p&gt;Then click on the &quot;Next step&quot; button to save the changes.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-55.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 55&quot;&gt;&lt;/p&gt;
&lt;p&gt;Everything is ready to use Zabbix.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-56.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 56&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you can log into the Zabbix dashboard as a Zabbix administrator.&lt;/p&gt;
&lt;p&gt;Login for Zabbix administrator account by default: Admin&lt;/p&gt;
&lt;p&gt;The default password for Zabbix administrator account: zabbix&lt;/p&gt;
&lt;p&gt;Specify the username and password of an account with Zabbix administrator rights and click on the &quot;Sign in&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-57.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 57&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Zabbix dashboard.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-zabbix-on-ubuntu-server-58.webp&quot; alt=&quot;Install Zabbix on Ubuntu Server - Step 58&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>Zabbix</category><category>Monitoring</category><category>Observability</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install PuppetDB on Ubuntu Server</title><link>https://heyvaldemar.com/install-puppetdb-on-ubuntu-server/</link><guid isPermaLink="true">https://heyvaldemar.com/install-puppetdb-on-ubuntu-server/</guid><description>Learn how to install and configure PuppetDB on Ubuntu Server with PostgreSQL. Complete setup guide for integrating with Puppet for infrastructure data.</description><pubDate>Mon, 19 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing PuppetDB on Ubuntu Server.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.puppet.com/&quot;&gt;PuppetDB&lt;/a&gt; is a scalable and reliable data store for Puppet. PuppetDB collects data generated by Puppet and also provides advanced functionality based on a powerful API.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
PuppetDB stores node facts, catalogs, and reports for querying and reporting across your Puppet infrastructure. At scale, evaluate whether the Puppet pull model with PuppetDB provides better state enforcement than Ansible&apos;s agentless push model. PuppetDB is essential when you need real-time infrastructure queries, exported resources, or compliance reporting across large fleets.
:::&lt;/p&gt;
&lt;p&gt;:::important
The Puppet Server must be installed on the server.&lt;/p&gt;
&lt;p&gt;For step-by-step instructions on installing Puppet on Ubuntu Server, see &lt;a href=&quot;/install-puppet-on-ubuntu-server/&quot;&gt;Install Puppet на Ubuntu Server&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on a server, you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 8081 - for Puppet Agent to work.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;This tutorial uses &lt;code&gt;puppet.heyvaldemar.net&lt;/code&gt; as the Puppet server name.&lt;/p&gt;
&lt;p&gt;The server with the agent installed must resolve the Puppet server name not only by the base name &lt;code&gt;puppet.heyvaldemar.net&lt;/code&gt; but also by the name &lt;code&gt;puppetdb.heyvaldemar.net&lt;/code&gt;. Also, the Puppet server has to resolve the name of the client-server.&lt;/p&gt;
&lt;p&gt;Make sure the Puppet server and client-server have the correct DNS records and update the &quot;/etc/hosts&quot; file if necessary.&lt;/p&gt;
&lt;p&gt;Puppet binaries are located in the &quot;/opt/puppetlabs/bin/&quot; directory, which is not in the &quot;PATH&quot; environment variable by default and in the &quot;secure_path&quot; variable that is used for &quot;sudo&quot; operations.&lt;/p&gt;
&lt;p&gt;By adding the path to executable files to variables, you can use:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo puppet agent -t
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Instead:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo /opt/puppetlabs/bin/puppet agent -t
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can learn how to properly prepare the Puppet server to install PuppetDB and add the path to the Puppet executables to variables by reading &lt;a href=&quot;/install-puppet-on-ubuntu-server/&quot;&gt;Install Puppet on Ubuntu Server&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We connect to the Puppet server on which you plan to install PuppetDB.&lt;/p&gt;
&lt;p&gt;Update the local package index to the latest changes in the repositories using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt update
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-1.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now install PostgreSQL using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install -y postgresql
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
This tutorial will use PostgreSQL as a database management system.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-2.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to create a database that PuppetDB will use in the future, as well as a user with the necessary rights in this database.&lt;/p&gt;
&lt;p&gt;Switch to the &quot;postgres&quot; user who has administrator rights in PostgreSQL using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo su - postgres
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-3.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;We create a new user using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;createuser -DRSP puppetdb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this tutorial, &quot;puppetdb&quot; will be used as the username, with the password &lt;code&gt;sqhrgX8G*RCaYURftzoG89b&lt;/code&gt;.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-4.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify a strong password for the new user and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-5.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Enter the password again and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-6.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;We create a new database and grant the rights to it to the previously created user using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;createdb -E UTF8 -O puppetdb puppetdb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-7.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to install the &quot;pg_trgm&quot; index extension optimized for RegExp using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;psql puppetdb -c &apos;create extension pg_trgm&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-8.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Log out as user &quot;postgres&quot; using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;exit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-9.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now install PuppetDB using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo puppet resource package puppetdb ensure=latest
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-10.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, install additional Ruby plugins to use PuppetDB using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo puppet resource package puppetdb-termini ensure=latest
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-11.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to make changes to the PuppetDB configuration file by opening it in a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/puppetlabs/puppetdb/conf.d/database.ini
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-12.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, the database for PuppetDB is on the same server as Puppet.
:::&lt;/p&gt;
&lt;p&gt;Press the &quot;i&quot; button to switch to edit mode, find the &quot;subname&quot; parameter and uncomment it by removing the &quot;#&quot; symbol.&lt;/p&gt;
&lt;p&gt;This tutorial uses &quot;puppetdb&quot; as the database name for PuppetDB.&lt;/p&gt;
&lt;p&gt;Next, add new parameters &quot;classname&quot; and &quot;subprotocol&quot; with the following values:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-properties&quot;&gt;classname    = org.postgresql.Driver
subprotocol  = postgresql
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This tutorial uses &quot;puppetdb&quot; as the database username for PuppetDB.&lt;/p&gt;
&lt;p&gt;Find the &quot;username&quot; parameter and uncomment it by removing the &quot;#&quot; symbol. Then we set the parameter to &quot;puppetdb&quot;.&lt;/p&gt;
&lt;p&gt;Find the &quot;password&quot; parameter and uncomment it by removing the &quot;#&quot; symbol. Then, as a value for the parameter, specify the password assigned to the &quot;puppetdb&quot; user.&lt;/p&gt;
&lt;p&gt;Next, add a new parameter &quot;log-slow-statements&quot; with the following value:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;log-slow-statements = 10
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-13.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-14.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;Check that the certificates that will be used by PuppetDB are generated and the configuration file &quot;jetty.ini&quot; contains the correct values using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo puppetdb ssl-setup
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-15.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to create a configuration file for PuppetDB to work correctly using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/puppetlabs/puppet/puppetdb.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-16.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;Press the &quot;i&quot; button to switch to edit mode, and add a new section &lt;code&gt;[main]&lt;/code&gt; with the following parameters:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;[main]
server_urls = https://puppet.heyvaldemar.net:8081
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this tutorial, the Puppet Server is installed on the &lt;code&gt;puppet.heyvaldemar.net&lt;/code&gt; server. You will need to specify your server through which your Puppet Server will be accessible from the Internet or on the local network of your organization.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-17.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 17&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-18.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 18&quot;&gt;&lt;/p&gt;
&lt;p&gt;By default, PuppetDB JVM is configured to use 192 MB of RAM. This value can be changed in the PuppetDB config file by opening it in a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/default/puppetdb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-19.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 19&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hit the &quot;i&quot; button to go into edit mode, find the line &lt;code&gt;JAVA_ARGS=&quot;-Xmx192m&quot;&lt;/code&gt; and change the &lt;code&gt;Xmx&lt;/code&gt; parameter in accordance with the requirements for your PuppetDB server.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial the &lt;code&gt;Xmx&lt;/code&gt; parameter will be 256 MB.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-20.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 20&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-21.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 21&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to make changes to the Puppet configuration file by opening it in a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/puppetlabs/puppet/puppet.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-22.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 22&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hit the &quot;i&quot; button to go into edit mode, find the &lt;code&gt;[master]&lt;/code&gt; section, and add new parameters for PuppetDB to work correctly:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;[master]
storeconfigs         = true
storeconfigs_backend = puppetdb
reports              = store,puppetdb
reportstore          = /var/log/puppetlabs/puppet
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-23.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 23&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-24.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 24&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s create a configuration file &quot;routes.yaml&quot; so that information from PuppetDB can be used in Puppet using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/puppetlabs/puppet/routes.yaml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-25.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 25&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hit the &quot;i&quot; button to go into edit mode, then insert the following configuration:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;[master]
facts_terminus = puppetdb
facts_cache    = yaml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-26.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 26&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-27.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 27&quot;&gt;&lt;/p&gt;
&lt;p&gt;Assign the correct permissions to files and directories for Puppet to work correctly using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo chown -R puppet:puppet `sudo puppet config print confdir`
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-28.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 28&quot;&gt;&lt;/p&gt;
&lt;p&gt;Launch PuppetDB and enable it to autostart when the operating system starts up using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo puppet resource service puppetdb ensure=running enable=true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-29.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 29&quot;&gt;&lt;/p&gt;
&lt;p&gt;Restart Puppet Server to apply the changes made using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl restart puppetserver
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-30.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 30&quot;&gt;&lt;/p&gt;
&lt;p&gt;Check that Puppet Server has started successfully using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl status puppetserver
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-31.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 31&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, we connect to the server on which the Puppet Agent is installed.&lt;/p&gt;
&lt;p&gt;Now you need to make changes to the Puppet configuration file by opening it in a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/puppetlabs/puppet/puppet.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-32.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 32&quot;&gt;&lt;/p&gt;
&lt;p&gt;Press the &quot;i&quot; button to switch to edit mode and add a new &lt;code&gt;[agent]&lt;/code&gt; section with the following parameters:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;[agent]
report     = true
pluginsync = true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-33.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 33&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-34.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 34&quot;&gt;&lt;/p&gt;
&lt;p&gt;Restart Puppet to apply the changes, using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl restart puppet
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-35.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 35&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s check that Puppet has started successfully using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl status puppet
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-36.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 36&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to check that the Puppet Agent will receive the configuration from the Puppet server and correctly connect to PuppetDB using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo puppet agent -t
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-37.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 37&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Puppet Agent ran without errors and successfully received the configuration from the Puppet server and also successfully connected to PuppetDB.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-38.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 38&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you can check that PuppetDB is actually receiving data from the client-server.&lt;/p&gt;
&lt;p&gt;We return to the server with Puppet Server and PuppetDB installed.&lt;/p&gt;
&lt;p&gt;Open the Puppet Server log to check the correctness of Puppet and PuppetDB using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo less /var/log/puppetlabs/puppetserver/puppetserver.log
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-39.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 39&quot;&gt;&lt;/p&gt;
&lt;p&gt;On the keyboard, press the &quot;Shift&quot; and &quot;f&quot; keys to start monitoring changes in the Puppet log in real-time.&lt;/p&gt;
&lt;p&gt;The Puppet log should show a record that the information has been sent and saved.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial Puppet Agent is installed on the &lt;code&gt;puppet-agent.heyvaldemar.net&lt;/code&gt; server.
:::&lt;/p&gt;
&lt;p&gt;On the keyboard, press the key combination &quot;Ctrl&quot; and &quot;c&quot;, then &quot;q&quot; to close the Puppet log.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-40.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 40&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, open the PuppetDB log to check the correctness of Puppet and PuppetDB using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo less /var/log/puppetlabs/puppetdb/puppetdb.log
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-41.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 41&quot;&gt;&lt;/p&gt;
&lt;p&gt;On the keyboard, press the key combination &quot;Shift&quot; and &quot;f&quot; to start monitoring changes in the PuppetDB log in real-time.&lt;/p&gt;
&lt;p&gt;The PuppetDB log should show a record that the information has been sent and saved.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial Puppet Agent is installed on the &lt;code&gt;puppet-agent.heyvaldemar.net&lt;/code&gt; server.
:::&lt;/p&gt;
&lt;p&gt;On the keyboard, press the key combination &quot;Ctrl&quot; and &quot;c&quot;, then &quot;q&quot; to close the PuppetDB log.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-42.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 42&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you can verify that the data from the client-server has been successfully transferred to the &quot;puppetdb&quot; database.&lt;/p&gt;
&lt;p&gt;This tutorial uses &quot;puppetdb&quot; as the database username for PuppetDB.&lt;/p&gt;
&lt;p&gt;This tutorial uses &quot;puppetdb&quot; as the database name for PuppetDB.&lt;/p&gt;
&lt;p&gt;Connect to the &quot;puppetdb&quot; database using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;psql -h localhost puppetdb puppetdb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-43.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 43&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the password assigned to the user &quot;puppetdb&quot; and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-44.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 44&quot;&gt;&lt;/p&gt;
&lt;p&gt;Turn on the expanded table output mode using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;\x
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-45.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 45&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s extract data from the &quot;catalogs&quot; table to make sure that information about the client-server is present in the table using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;select * from catalogs;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-46.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 46&quot;&gt;&lt;/p&gt;
&lt;p&gt;The client-server information is indeed present in the database.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppetdb-on-ubuntu-server-47.webp&quot; alt=&quot;Install PuppetDB on Ubuntu Server - Step 47&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>Puppet</category><category>PuppetDB</category><category>Monitoring</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Puppet on Ubuntu Server</title><link>https://heyvaldemar.com/install-puppet-on-ubuntu-server/</link><guid isPermaLink="true">https://heyvaldemar.com/install-puppet-on-ubuntu-server/</guid><description>Step-by-step guide to install and configure Puppet Server and Agent on Ubuntu Server. Learn certificate setup, NTP, manifests, and system integration.</description><pubDate>Sun, 18 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Puppet on Ubuntu Server.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.puppet.com/&quot;&gt;Puppet&lt;/a&gt; is a cross-platform client-server application that allows you to centrally manage the configuration of operating systems and programs installed on multiple computers.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted Puppet when you need declarative configuration management with drift detection and enforcement across a large server fleet. Puppet Enterprise Cloud or Ansible provide managed alternatives with lower learning curves. Self-hosted Puppet is justified when you manage hundreds of nodes requiring consistent state enforcement, or when your team already has Puppet module expertise.
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on a server, you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 8140 - for Puppet Agent to work.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which you plan to install Puppet Server.&lt;/p&gt;
&lt;p&gt;Let&apos;s name the server using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo hostnamectl set-hostname puppet.heyvaldemar.net
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This tutorial uses &lt;code&gt;puppet.heyvaldemar.net&lt;/code&gt; as the Puppet server name.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-1.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;The server with the agent installed must resolve the name of the Puppet server and also the Puppet server must resolve the name of the client-server.&lt;/p&gt;
&lt;p&gt;Make sure the server name has the correct DNS entry and also update the &quot;/etc/hosts&quot; file on the server with the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;echo &quot;10.170.19.82 puppet.heyvaldemar.net puppetdb.heyvaldemar.net puppet puppetdb&quot; | sudo tee -a /etc/hosts
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This tutorial uses &lt;code&gt;puppet.heyvaldemar.net&lt;/code&gt; as the Puppet server name.&lt;/p&gt;
&lt;p&gt;:::note
The entry &lt;code&gt;puppetdb.heyvaldemar.net&lt;/code&gt; is useful if you plan to install PuppetDB in the future. This name must also have a valid DNS record.
:::&lt;/p&gt;
&lt;p&gt;You can find out how to install PuppetDB on Ubuntu Server by reading &lt;a href=&quot;/install-puppetdb-on-ubuntu-server/&quot;&gt;Install PuppetDB on Ubuntu Server&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-2.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Restart the hostamed service for the changes to the server name to take effect using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl restart systemd-hostnamed
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-3.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s check the correctness of the server name using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;hostname
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-4.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s replace the current shell process with a new one using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;exec bash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-5.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;The correct time must be set on the Puppet server, as it will act as a CA for signing certificates from clients.&lt;/p&gt;
&lt;p&gt;To set the time correctly, you will need to install the NTP package and synchronize the time with the upstream NTP servers.&lt;/p&gt;
&lt;p&gt;Update the local package index to the latest changes in the repositories using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt update
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-6.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Install NTP and ntpdate using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install -y ntp ntpdate
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
ntpdate allows you to manually check the configuration of your connection to the NTP server.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-7.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Synchronize time with upstream NTP servers using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo ntpdate -u 0.ubuntu.pool.ntp.org
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-8.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s check the correctness of the date and time on the server using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;date
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
This tutorial is based on a server located in Berlin.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-9.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s see a list of time zone values for all locations using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo timedatectl list-timezones
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-10.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;We select the value suitable for your location and change the time zone using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo timedatectl set-timezone Europe/Berlin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
This tutorial is based on a server located in Berlin.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-11.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;We again check the correctness of the date and time on the server using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;date
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-12.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to download and install the Puppet Server repository configuration package.&lt;/p&gt;
&lt;p&gt;Download the Puppet Server repository configuration package using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;wget https://apt.puppetlabs.com/puppet7-release-jammy.deb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-13.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;Install the Puppet Server repository configuration package using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo dpkg -i puppet7-release-jammy.deb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-14.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;Update the local package index to the latest changes in the repositories using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt update
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-15.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now install Puppet Server using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install -y puppetserver
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-16.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;Puppet binaries are located in the &quot;/opt/puppetlabs/bin/&quot; directory, which is not in the &quot;PATH&quot; environment variable by default and in the &quot;secure_path&quot; variable that is used for &quot;sudo&quot; operations.&lt;/p&gt;
&lt;p&gt;:::note
The path to the executable files is irrelevant for the Puppet services since the start of the services does not depend on the &quot;PATH&quot; and &quot;secure_path&quot;.
:::&lt;/p&gt;
&lt;p&gt;By adding the path to executable files to variables, you can use:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo puppet agent -t
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Instead:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo /opt/puppetlabs/bin/puppet agent -t
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Add the path to the Puppet executable files to the &quot;secure_path&quot; variable.&lt;/p&gt;
&lt;p&gt;Open the &quot;sudoers&quot; configuration file in a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo visudo
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-17.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 17&quot;&gt;&lt;/p&gt;
&lt;p&gt;Find the variable &quot;secure_path&quot;, and at the end of the line, before the closing quote, add the path to the Puppet executable files &lt;code&gt;:/opt/puppetlabs/bin&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;To save the changes in the &quot;sudoers&quot; file, press &quot;Ctrl + x&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-18.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 18&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to confirm the changes in the file.&lt;/p&gt;
&lt;p&gt;Click on the &quot;y&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-19.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 19&quot;&gt;&lt;/p&gt;
&lt;p&gt;Press the &quot;Enter&quot; button to confirm saving the file.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-20.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 20&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s add the path to the Puppet executables to the &quot;PATH&quot; environment variable.&lt;/p&gt;
&lt;p&gt;Open the &quot;environment&quot; configuration file in a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/environment
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-21.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 21&quot;&gt;&lt;/p&gt;
&lt;p&gt;Press the &quot;i&quot; button to enter edit mode, and at the end of the line, before the closing quote, add the path to the Puppet executable files &lt;code&gt;:/opt/puppetlabs/bin&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-22.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 22&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-23.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 23&quot;&gt;&lt;/p&gt;
&lt;p&gt;By default, the Puppet Server JVM is configured to use 2 GB of RAM. This value can be changed in the Puppet config file by opening it in a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/default/puppetserver
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-24.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 24&quot;&gt;&lt;/p&gt;
&lt;p&gt;Press the &quot;i&quot; button to enter edit mode, find the line &lt;code&gt;JAVA_ARGS=&quot;-Xms2g -Xmx2g -Djruby.logger.class=com.puppetlabs.jruby_utils.jruby.Slf4jLogger&quot;&lt;/code&gt; and change the &lt;code&gt;Xms&lt;/code&gt; parameters and &lt;code&gt;Xmx&lt;/code&gt; according to your Puppet server requirements.&lt;/p&gt;
&lt;p&gt;:::note
In this manual the &lt;code&gt;Xms&lt;/code&gt; and &lt;code&gt;Xmx&lt;/code&gt; parameters will be set to 1 GB.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-25.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 25&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-26.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 26&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to make changes to another Puppet configuration file by opening it in a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/puppetlabs/puppet/puppet.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-27.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 27&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hit the &quot;i&quot; button to go into edit mode, find the &lt;code&gt;[master]&lt;/code&gt; section and add a new line with the alternative names of the Puppet server:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;dns_alt_names = puppet,puppetdb,puppet.heyvaldemar.net,puppetdb.heyvaldemar.net
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Next, add a new section &lt;code&gt;[main]&lt;/code&gt; with the following parameters:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;[main]
certname    = puppet.heyvaldemar.net
server      = puppet.heyvaldemar.net
environment = production
runinterval = 15m
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this tutorial, the Puppet Server is installed on the &lt;code&gt;puppet.heyvaldemar.net&lt;/code&gt; server. You will need to specify your server through which your Puppet Server will be accessible from the Internet or on the local network of your organization.
:::&lt;/p&gt;
&lt;p&gt;:::note
The entries puppetdb and &lt;code&gt;puppetdb.heyvaldemar.net&lt;/code&gt; will come in handy if you plan to install PuppetDB in the future. This name must also have a valid DNS record.
:::&lt;/p&gt;
&lt;p&gt;You can find out how to install PuppetDB on Ubuntu Server by reading &lt;a href=&quot;/install-puppetdb-on-ubuntu-server/&quot;&gt;Install PuppetDB on Ubuntu Server&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;:::note
The &quot;runinterval&quot; parameter specifies the time interval between agent requests to the Puppet server.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-28.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 28&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-29.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 29&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s create the root and intermediate CA signature for Puppet Server using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo puppetserver ca setup
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-30.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 30&quot;&gt;&lt;/p&gt;
&lt;p&gt;We start Puppet Server using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl start puppetserver
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-31.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 31&quot;&gt;&lt;/p&gt;
&lt;p&gt;Check that Puppet Server has started successfully using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl status puppetserver
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-32.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 32&quot;&gt;&lt;/p&gt;
&lt;p&gt;We enable Puppet Server autorun when starting the operating system using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl enable puppetserver
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-33.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 33&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, we connect to the server on which you plan to install Puppet Agent.&lt;/p&gt;
&lt;p&gt;Let&apos;s name the server using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo hostnamectl set-hostname puppet-agent.heyvaldemar.net
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This tutorial uses &lt;code&gt;puppet-agent.heyvaldemar.net&lt;/code&gt; as the name of the server with the Puppet agent installed.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-34.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 34&quot;&gt;&lt;/p&gt;
&lt;p&gt;The server with the agent installed must resolve the name of the Puppet server and also the Puppet server must resolve the name of the client-server.&lt;/p&gt;
&lt;p&gt;Make sure the server name has the correct DNS entry and also update the &quot;/etc/hosts&quot; file with the IP address and client-server name using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;echo &quot;10.170.19.3 puppet-agent.heyvaldemar.net puppet-agent&quot; | sudo tee -a /etc/hosts
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This tutorial uses &lt;code&gt;puppet-agent.heyvaldemar.net&lt;/code&gt; as the name of the server with the Puppet agent installed.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-35.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 35&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, add the IP address and the name of the Puppet server to the &quot;/etc/hosts&quot; file using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;echo &quot;10.170.19.82 puppet.heyvaldemar.net puppetdb.heyvaldemar.net puppet puppetdb&quot; | sudo tee -a /etc/hosts
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Having this record will allow the server with the agent installed to resolve the Puppet server name even without a DNS record.&lt;/p&gt;
&lt;p&gt;:::note
The entry &lt;code&gt;puppetdb.heyvaldemar.net&lt;/code&gt; is useful if you plan to install PuppetDB in the future. This name must also have a valid DNS record.
:::&lt;/p&gt;
&lt;p&gt;You can find out how to install PuppetDB on Ubuntu Server by reading &lt;a href=&quot;/install-puppetdb-on-ubuntu-server/&quot;&gt;Install PuppetDB on Ubuntu Server&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-36.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 36&quot;&gt;&lt;/p&gt;
&lt;p&gt;Restart the hostamed service for the changes to the server name to take effect using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl restart systemd-hostnamed
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-37.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 37&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s check the correctness of the server name using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;hostname
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-38.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 38&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s replace the current shell process with a new one using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;exec bash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-39.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 39&quot;&gt;&lt;/p&gt;
&lt;p&gt;The correct time must be set on the server with Puppet Agent.&lt;/p&gt;
&lt;p&gt;To set the time correctly, you will need to install the NTP package and synchronize the time with the upstream NTP servers.&lt;/p&gt;
&lt;p&gt;Update the local package index to the latest changes in the repositories using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt update
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-40.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 40&quot;&gt;&lt;/p&gt;
&lt;p&gt;Install NTP and ntpdate using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install -y ntp ntpdate
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
ntpdate allows you to manually check the configuration of your connection to the NTP server.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-41.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 41&quot;&gt;&lt;/p&gt;
&lt;p&gt;Synchronize time with upstream NTP servers using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo ntpdate -u 0.ubuntu.pool.ntp.org
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-42.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 42&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s check the correctness of the date and time on the server using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;date
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
This tutorial is based on a server located in Berlin.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-43.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 43&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s see a list of time zone values for all locations using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo timedatectl list-timezones
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-44.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 44&quot;&gt;&lt;/p&gt;
&lt;p&gt;We select the value suitable for your location and change the time zone using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo timedatectl set-timezone Europe/Berlin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
This tutorial is based on a server located in Berlin.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-45.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 45&quot;&gt;&lt;/p&gt;
&lt;p&gt;We again check the correctness of the date and time on the server using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;date
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-46.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 46&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to download and install the Puppet Agent repository configuration package.&lt;/p&gt;
&lt;p&gt;Download the Puppet Agent repository configuration package using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;wget https://apt.puppetlabs.com/puppet7-release-jammy.deb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-47.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 47&quot;&gt;&lt;/p&gt;
&lt;p&gt;Install the Puppet Agent repository configuration package using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo dpkg -i puppet7-release-jammy.deb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-48.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 48&quot;&gt;&lt;/p&gt;
&lt;p&gt;Update the local package index to the latest changes in the repositories using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt update
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-49.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 49&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now install Puppet Agent using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install -y puppet-agent
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-50.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 50&quot;&gt;&lt;/p&gt;
&lt;p&gt;Puppet binaries are located in the &quot;/opt/puppetlabs/bin/&quot; directory, which is not in the &quot;PATH&quot; environment variable by default and in the &quot;secure_path&quot; variable that is used for &quot;sudo&quot; operations.&lt;/p&gt;
&lt;p&gt;:::note
The path to the executable files is irrelevant for the Puppet services, since the start of the services does not depend on the &quot;PATH&quot; and &quot;secure_path&quot;.
:::&lt;/p&gt;
&lt;p&gt;By adding the path to executable files to variables, you can use:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo puppet agent -t
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Instead:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo /opt/puppetlabs/bin/puppet agent -t
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Add the path to the Puppet executable files to the &quot;secure_path&quot; variable.&lt;/p&gt;
&lt;p&gt;Open the &quot;sudoers&quot; configuration file in a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo visudo
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-51.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 51&quot;&gt;&lt;/p&gt;
&lt;p&gt;Find the variable &quot;secure_path&quot;, and at the end of the line, before the closing quote, add the path to the Puppet executable files &lt;code&gt;:/opt/puppetlabs/bin&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-52.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 52&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to confirm the changes in the file.&lt;/p&gt;
&lt;p&gt;Click on the &quot;y&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-53.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 53&quot;&gt;&lt;/p&gt;
&lt;p&gt;Press the &quot;Enter&quot; button to confirm saving the file.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-54.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 54&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s add the path to the Puppet executables to the &quot;PATH&quot; environment variable.&lt;/p&gt;
&lt;p&gt;Open the &quot;environment&quot; configuration file in a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/environment
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-55.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 55&quot;&gt;&lt;/p&gt;
&lt;p&gt;Press the &quot;i&quot; button to enter edit mode, and at the end of the line, before the closing quote, add the path to the Puppet executable files &lt;code&gt;:/opt/puppetlabs/bin&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-56.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 56&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-57.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 57&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to make changes to the Puppet configuration file by opening it in a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/puppetlabs/puppet/puppet.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-58.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 58&quot;&gt;&lt;/p&gt;
&lt;p&gt;Press the &quot;i&quot; button to switch to edit mode, add a new section &lt;code&gt;[main]&lt;/code&gt; with the following parameters:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;[main]
certname    = puppet-agent.heyvaldemar.net
server      = puppet.heyvaldemar.net
environment = production
runinterval = 15m
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-59.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 59&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, Puppet Agent is installed on the &lt;code&gt;puppet-agent.heyvaldemar.net&lt;/code&gt; server. You will need to specify your server through which your Puppet Agent will be accessible from the Internet or on the local network of your organization.&lt;/p&gt;
&lt;p&gt;Also, the Puppet Server is installed on the &lt;code&gt;puppet.heyvaldemar.net&lt;/code&gt; server. You will need to specify your server through which your Puppet Server will be accessible from the Internet or on the local network of your organization.
:::&lt;/p&gt;
&lt;p&gt;:::note
The &quot;runinterval&quot; parameter specifies the time interval between agent requests to the Puppet server.
:::&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, and then type &quot;: x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-60.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 60&quot;&gt;&lt;/p&gt;
&lt;p&gt;Launch Puppet Agent and enable it to autostart when the operating system starts up using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo puppet resource service puppet ensure=running enable=true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-61.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 61&quot;&gt;&lt;/p&gt;
&lt;p&gt;We return to the server with Puppet Server installed.&lt;/p&gt;
&lt;p&gt;Now you need to approve the certificate request for the server on which the Puppet Agent is installed so that later the client can receive the configuration from the Puppet server.&lt;/p&gt;
&lt;p&gt;Let&apos;s look at the client requests in the queue using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo puppetserver ca list
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-62.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 62&quot;&gt;&lt;/p&gt;
&lt;p&gt;We sign the client request using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo puppetserver ca sign --certname puppet-agent.heyvaldemar.net
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this tutorial, Puppet Agent is installed on the &lt;code&gt;puppet-agent.heyvaldemar.net&lt;/code&gt; server. You will need to specify your server through which your Puppet Agent will be accessible from the Internet or on the local network of your organization.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-63.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 63&quot;&gt;&lt;/p&gt;
&lt;p&gt;The client request has been successfully signed.&lt;/p&gt;
&lt;p&gt;Next, you can view all signed and unsigned client requests using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo puppetserver ca list --all
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-64.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 64&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can sign all client requests in the queue using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo puppetserver ca sign --all
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can revoke a client certificate using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo puppetserver ca revoke --certname puppet-agent.heyvaldemar.net
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this tutorial, Puppet Agent is installed on the &lt;code&gt;puppet-agent.heyvaldemar.net&lt;/code&gt; server. You will need to specify your server through which your Puppet Agent will be accessible from the Internet or on the local network of your organization.
:::&lt;/p&gt;
&lt;p&gt;Now you can create a manifest to test Puppet&apos;s functionality.&lt;/p&gt;
&lt;p&gt;A manifest is a data file containing client configuration written in Puppet or Ruby DSL.&lt;/p&gt;
&lt;p&gt;Let&apos;s create a manifest using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/puppetlabs/code/environments/production/manifests/site.pp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-65.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 65&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hit the &quot;i&quot; button to go into edit mode, then insert the following configuration:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-puppet&quot;&gt;node &apos;puppet-agent.heyvaldemar.net&apos; {
  file { &apos;/tmp/puppetfile&apos;:
    ensure  =&amp;gt; &apos;present&apos;,
    owner   =&amp;gt; &apos;root&apos;,
    group   =&amp;gt; &apos;root&apos;,
    mode    =&amp;gt; &apos;0644&apos;,
    content =&amp;gt; &quot;This File is created by Puppet Server\n&quot;,
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this tutorial, Puppet Agent is installed on the &lt;code&gt;puppet-agent.heyvaldemar.net&lt;/code&gt; server. You will need to specify your server through which your Puppet Agent will be accessible from the Internet or on the local network of your organization.
:::&lt;/p&gt;
&lt;p&gt;:::note
A &quot;puppetfile&quot; file will be created in the &quot;/tmp&quot; directory containing the text &quot;This File is created by Puppet Server&quot;. The user &quot;root&quot; will be the owner of the file.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-66.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 66&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-67.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 67&quot;&gt;&lt;/p&gt;
&lt;p&gt;We return to the server with the Puppet Agent installed.&lt;/p&gt;
&lt;p&gt;Now you need to get the configuration for the client from the Puppet server using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo puppet agent -t
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-68.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 68&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you can check that the file was successfully created and contains the text specified earlier in the manifest using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cat /tmp/puppetfile
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-69.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 69&quot;&gt;&lt;/p&gt;
&lt;p&gt;The file was successfully created and contains the text specified in the manifest.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-puppet-on-ubuntu-server-70.webp&quot; alt=&quot;Install Puppet on Ubuntu Server - Step 70&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>Puppet</category><category>Configuration Management</category><category>Terraform</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Restore Windows Firewall Defaults</title><link>https://heyvaldemar.com/restore-windows-firewall-defaults/</link><guid isPermaLink="true">https://heyvaldemar.com/restore-windows-firewall-defaults/</guid><description>Learn how to restore Windows Firewall to its default settings using GUI, Command Prompt, or PowerShell. Step-by-step guide for Windows system admins.</description><pubDate>Fri, 16 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and clear guide on how to restore Windows Firewall defaults.&lt;/p&gt;
&lt;p&gt;This guide will cover several ways to restore the default Windows Firewall settings.&lt;/p&gt;
&lt;p&gt;We go into the system under an account with administrator rights.&lt;/p&gt;
&lt;p&gt;Open Server Manager, click on the &quot;Tools&quot; button in the upper right corner of the screen, and select &quot;Windows Defender Firewall with Advanced Security&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./restore-windows-firewall-defaults-1.webp&quot; alt=&quot;Restore Windows Firewall Defaults - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can now export the current settings from Windows Firewall and, if necessary, return to them after restoring the default settings.&lt;/p&gt;
&lt;p&gt;Right-click on &quot;Windows Firewall with Advanced Security on Local Computer&quot; and select &quot;Export Policy&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./restore-windows-firewall-defaults-2.webp&quot; alt=&quot;Restore Windows Firewall Defaults - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Assign a name and save the file with Windows Firewall settings.&lt;/p&gt;
&lt;p&gt;:::note
In this manual, the settings file will be saved in the &quot;Documents&quot; folder.
:::&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./restore-windows-firewall-defaults-3.webp&quot; alt=&quot;Restore Windows Firewall Defaults - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Windows Firewall settings exported successfully.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./restore-windows-firewall-defaults-4.webp&quot; alt=&quot;Restore Windows Firewall Defaults - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you can restore the default settings in Windows Firewall.&lt;/p&gt;
&lt;p&gt;In the &quot;Actions&quot; section, select &quot;Restore Default Policy&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./restore-windows-firewall-defaults-5.webp&quot; alt=&quot;Restore Windows Firewall Defaults - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to confirm the restoration of the default settings.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Yes&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./restore-windows-firewall-defaults-6.webp&quot; alt=&quot;Restore Windows Firewall Defaults - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Windows Firewall defaults have been restored successfully.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./restore-windows-firewall-defaults-7.webp&quot; alt=&quot;Restore Windows Firewall Defaults - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;In addition, you can restore the default settings in Windows Firewall using the command line.&lt;/p&gt;
&lt;p&gt;Press &quot;Start&quot;, specify &quot;cmd&quot; in the search bar, and select &quot;Command Prompt&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./restore-windows-firewall-defaults-8.webp&quot; alt=&quot;Restore Windows Firewall Defaults - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;We export the current settings from Windows Firewall to return to them if necessary after restoring the default settings.&lt;/p&gt;
&lt;p&gt;:::note
In this manual, the configuration file will be saved to the &quot;C&quot; drive.
:::&lt;/p&gt;
&lt;p&gt;We export the current settings from Windows Firewall using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;netsh advfirewall export C:\Firewall-Config.wfw
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./restore-windows-firewall-defaults-9.webp&quot; alt=&quot;Restore Windows Firewall Defaults - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you can restore the default settings in Windows Firewall.&lt;/p&gt;
&lt;p&gt;Restore the default settings in Windows Firewall using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;netsh advfirewall reset
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./restore-windows-firewall-defaults-10.webp&quot; alt=&quot;Restore Windows Firewall Defaults - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;Windows Firewall defaults have been restored successfully.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./restore-windows-firewall-defaults-11.webp&quot; alt=&quot;Restore Windows Firewall Defaults - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can also restore the default settings in Windows Firewall using Windows PowerShell.&lt;/p&gt;
&lt;p&gt;On the keyboard, press the key combination &quot;Win&quot; and &quot;x&quot; and in the menu that opens, select &quot;Windows PowerShell (Admin)&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./restore-windows-firewall-defaults-12.webp&quot; alt=&quot;Restore Windows Firewall Defaults - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;Restore the default settings in Windows Firewall using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;(New-Object -ComObject HNetCfg.FwPolicy2).RestoreLocalFirewallDefaults()

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./restore-windows-firewall-defaults-13.webp&quot; alt=&quot;Restore Windows Firewall Defaults - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;Windows Firewall defaults have been restored successfully.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./restore-windows-firewall-defaults-14.webp&quot; alt=&quot;Restore Windows Firewall Defaults - Step 14&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Windows</category><category>Firewall</category><category>Security</category><category>Networking</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Jenkins on Ubuntu Server</title><link>https://heyvaldemar.com/install-jenkins-on-ubuntu-server/</link><guid isPermaLink="true">https://heyvaldemar.com/install-jenkins-on-ubuntu-server/</guid><description>Step-by-step guide to install Jenkins on Ubuntu Server with Apache, SSL via Let&apos;s Encrypt, and system hardening. Ideal for secure CI/CD deployment.</description><pubDate>Sat, 10 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Jenkins on Ubuntu Server.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/&quot;&gt;Jenkins&lt;/a&gt; is an open-source Java software system designed to provide a continuous software integration process.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted Jenkins when you need a fully customizable CI/CD platform with unlimited build minutes and custom plugin requirements. GitHub Actions, GitLab CI, or CircleCI provide managed alternatives with lower operational overhead. Self-hosting Jenkins is justified when build pipelines require on-premises resources, custom hardware, or when SaaS CI minute costs exceed the cost of maintaining your own build infrastructure.
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on a server, you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to receive a free cryptographic certificate through the Let&apos;s Encrypt CA.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access Jenkins web interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which you plan to install Jenkins.&lt;/p&gt;
&lt;p&gt;:::note
To obtain and subsequently renew a free SSL certificate, we will use the Let&apos;s Encrypt certification authority, as well as the Certbot software client, which is designed to make it as easy as possible to obtain and renew a certificate through the Let&apos;s Encrypt certification authority.
:::&lt;/p&gt;
&lt;p&gt;Update the local package index to the latest changes in the repositories using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt update
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-1.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now we will install the packages required for Jenkins to work using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install -y apache2 apt-transport-https certbot python3-certbot-apache openjdk-11-jdk
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
Supported Java versions can be found in the Jenkins documentation on the &lt;a href=&quot;https://jenkins.io/doc/administration/requirements/java/&quot;&gt;requirements page&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-2.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Many programs written using Java use the &quot;JAVA_HOME&quot; environment variable to determine where Java is installed. Therefore, you need to define this variable and assign it a value containing the path to the Java installation location.&lt;/p&gt;
&lt;p&gt;Let&apos;s define the path to the Java installation location using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo update-alternatives --config java
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-3.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;In this example, the path to the Java installation location looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;/usr/lib/jvm/java-11-openjdk-amd64/bin/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To define an environment variable and assign a value to it, you need to make changes to the &quot;environment&quot; file by opening it in a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/environment
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-4.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Press the &quot;i&quot; button to switch to edit mode, then at the end of the file define a new variable &quot;JAVA_HOME&quot; and assign it a value containing the path to the Java installation location obtained earlier.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;JAVA_HOME=&quot;/usr/lib/jvm/java-11-openjdk-amd64/bin/&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
The path to the Java installation location must be specified up to and including the &quot;bin&quot; folder.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-5.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, and then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-6.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to apply the changes made to the current session using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;source /etc/environment
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-7.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s make sure that the environment variable has the correct value using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;echo $JAVA_HOME
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-8.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Based on the message received, the environment variable has the correct value.&lt;/p&gt;
&lt;p&gt;Let&apos;s configure Apache for further work with the Jenkins dashboard.&lt;/p&gt;
&lt;p&gt;We enable the Apache webserver module called &quot;headers&quot; using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo a2enmod headers
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
The &quot;headers&quot; module can be used to add more specific &quot;Cache-Control&quot; parameters.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-9.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;We enable the Apache webserver module called &quot;proxy_http&quot; using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo a2enmod proxy_http
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
The &quot;proxy_http&quot; module acts like a proxy server for the HTTP and HTTPS protocols.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-10.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;We enable the Apache webserver module called &quot;rewrite&quot; using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo a2enmod rewrite
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
The &quot;rewrite&quot; module is one of the most commonly used modules in the Apache webserver and provides a flexible and powerful way to manipulate URLs.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-11.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to create two virtual host files (called a block in Nginx), which Jenkins will work with in the future.&lt;/p&gt;
&lt;p&gt;Two virtual host files will be required to provide access to Jenkins over HTTPS, as well as to enable Jenkins to be used at &lt;code&gt;https://jenkins.heyvaldemar.net&lt;/code&gt;, without specifying port 8080 in the browser address bar.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, you will use the &lt;code&gt;jenkins.heyvaldemar.net&lt;/code&gt; subdomain to access Jenkins from the Internet. You will need to specify your domain or subdomain by which your Jenkins will be accessible from the Internet.
:::&lt;/p&gt;
&lt;p&gt;Let&apos;s create the first virtual host file using a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/apache2/sites-available/jenkins.heyvaldemar.net.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-12.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hit the &quot;i&quot; button to go into edit mode, then insert the following configuration for the webserver to work.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-apache&quot;&gt;&amp;lt;VirtualHost *:80&amp;gt;
	ServerAdmin callvaldemar@gmail.com
	ServerName jenkins.heyvaldemar.net
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this tutorial, you will use the &lt;code&gt;jenkins.heyvaldemar.net&lt;/code&gt; subdomain to access Jenkins from the Internet. You will need to specify your domain or subdomain by which your Jenkins will be accessible from the Internet.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-13.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, and then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.
&lt;img src=&quot;./install-jenkins-on-ubuntu-server-14.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s create a second virtual host file using a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/apache2/sites-available/jenkins.heyvaldemar.net-ssl.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-15.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hit the &quot;i&quot; button to go into edit mode, then insert the following configuration for the webserver to work.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-apache&quot;&gt;&amp;lt;IfModule mod_ssl.c&amp;gt;
&amp;lt;VirtualHost *:443&amp;gt;
	ServerAdmin callvaldemar@gmail.com
	ServerName jenkins.heyvaldemar.net

	ProxyRequests     Off
	ProxyPreserveHost On
	AllowEncodedSlashes NoDecode

	&amp;lt;Proxy *&amp;gt;
		Order deny,allow
		Allow from all
	&amp;lt;/Proxy&amp;gt;
	
	ProxyPass         /  http://localhost:8080/ nocanon
	ProxyPassReverse  /  http://localhost:8080/
	ProxyPassReverse  /  http://jenkins.heyvaldemar.net/
	RequestHeader set X-Forwarded-Proto &quot;https&quot;
	RequestHeader set X-Forwarded-Port &quot;443&quot;

	SSLEngine On
	SSLCertificateFile /etc/letsencrypt/live/jenkins.heyvaldemar.net/fullchain.pem
	SSLCertificateKeyFile /etc/letsencrypt/live/jenkins.heyvaldemar.net/privkey.pem
	Include /etc/letsencrypt/options-ssl-apache.conf
&amp;lt;/VirtualHost&amp;gt;
&amp;lt;/IfModule&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this tutorial, you will use the &lt;code&gt;jenkins.heyvaldemar.net&lt;/code&gt; subdomain to access Jenkins from the Internet. You will need to specify your domain or subdomain by which your Jenkins will be accessible from the Internet.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-16.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, and then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-17.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 17&quot;&gt;&lt;/p&gt;
&lt;p&gt;We activate the first virtual host using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo a2ensite jenkins.heyvaldemar.net.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-18.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 18&quot;&gt;&lt;/p&gt;
&lt;p&gt;We activate the second virtual host using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo a2ensite jenkins.heyvaldemar.net-ssl.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-19.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 19&quot;&gt;&lt;/p&gt;
&lt;p&gt;Deactivate the default virtual host using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo a2dissite 000-default.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-20.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 20&quot;&gt;&lt;/p&gt;
&lt;p&gt;Verify that there are no errors in the syntax of the new Apache config file using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apache2ctl configtest
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-21.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 21&quot;&gt;&lt;/p&gt;
&lt;p&gt;Restart Apache to apply the changes, using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl restart apache2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-22.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 22&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s check that Apache has started successfully using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl status apache2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-23.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 23&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now, to increase the security level of the webserver, you need to obtain a cryptographic certificate for the domain or subdomain, through which the Jenkins dashboard will be accessible from the Internet.&lt;/p&gt;
&lt;p&gt;:::note
To obtain and subsequently renew a free SSL certificate, we will use the Let&apos;s Encrypt certification authority, as well as the Certbot software client, which is designed to make it as easy as possible to obtain and renew a certificate through the Let&apos;s Encrypt certification authority.
:::&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, you will use the &lt;code&gt;jenkins.heyvaldemar.net&lt;/code&gt; subdomain to access Jenkins from the Internet. You will need to specify your domain or subdomain by which your Jenkins will be accessible from the Internet.
:::&lt;/p&gt;
&lt;p&gt;Let&apos;s request a cryptographic certificate using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo certbot --apache -d jenkins.heyvaldemar.net
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-24.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 24&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, we specify the email address to which Let&apos;s Encrypt will send notifications about the expiration of the cryptographic certificate and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-25.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 25&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to read and accept the terms of use of the services provided.&lt;/p&gt;
&lt;p&gt;Press the button &quot;a&quot;, then &quot;Enter&quot;, if you agree with the terms of use of the services provided.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-26.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 26&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to choose: do you want to share the above email address with the Electronic Frontier Foundation to receive newsletters.&lt;/p&gt;
&lt;p&gt;Press the &quot;n&quot; button, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-27.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 27&quot;&gt;&lt;/p&gt;
&lt;p&gt;At the next stage, you need to choose: do you want the parameters to be automatically added to the Apache configuration file for automatically redirecting HTTP traffic to HTTPS.&lt;/p&gt;
&lt;p&gt;Press the button &quot;2&quot;, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-28.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 28&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
Cryptographic certificates obtained through Let&apos;s Encrypt CA are valid for ninety days. Certbot automatically adds a script to renew the certificate to the task scheduler, and the script runs twice a day, automatically renewing any cryptographic certificate that expires within thirty days.
:::&lt;/p&gt;
&lt;p&gt;You can check the functionality of the cryptographic certificate renewal process using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo certbot renew --dry-run
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-29.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 29&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s add the official Jenkins key using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-30.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 30&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, we connect the Jenkins repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo sh -c &apos;echo deb http://pkg.jenkins.io/debian-stable binary/ &amp;gt; /etc/apt/sources.list.d/jenkins.list&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-31.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 31&quot;&gt;&lt;/p&gt;
&lt;p&gt;Update the local package index to the latest changes in the repositories using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt update
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-32.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 32&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s install Jenkins using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install -y jenkins
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-33.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 33&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to make changes to the Jenkins configuration file by opening it in a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/default/jenkins
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-34.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 34&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hit the &quot;i&quot; button to enter edit mode, find the line &lt;code&gt;JENKINS_ARGS=&quot;--webroot=/var/cache/$NAME/war --httpPort=$HTTP_PORT&quot;&lt;/code&gt; and add the parameter &lt;code&gt;--httpListenAddress=127.0.0.1&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-35.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 35&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, and then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-36.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 36&quot;&gt;&lt;/p&gt;
&lt;p&gt;Restart Jenkins to apply the changes made using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl restart jenkins
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-37.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 37&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s check that Jenkins has started successfully using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl status jenkins
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-38.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 38&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to get the password that you need to unlock Jenkins.&lt;/p&gt;
&lt;p&gt;You can get the password using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo cat /var/lib/jenkins/secrets/initialAdminPassword
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-39.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 39&quot;&gt;&lt;/p&gt;
&lt;p&gt;Save the resulting password as you will need it in the next step.&lt;/p&gt;
&lt;p&gt;To continue the Jenkins installation process, you need to go from the workstation to the link &lt;code&gt;https://jenkins.heyvaldemar.net&lt;/code&gt;, where &lt;code&gt;jenkins.heyvaldemar.net&lt;/code&gt; is the name of my server. Accordingly, you need to provide the name or IP address of your Jenkins server.&lt;/p&gt;
&lt;p&gt;Next, you need to provide a password to unlock Jenkins.&lt;/p&gt;
&lt;p&gt;In the &quot;Administrator password&quot; field, specify the previously received password to unlock Jenkins and click on the &quot;Continue&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-40.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 40&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you can choose which plugins to install for Jenkins.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, we will be looking at installing the suggested plugins for Jenkins.
:::&lt;/p&gt;
&lt;p&gt;Click on the &quot;Install suggested plugins&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-41.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 41&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of installing plugins has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-42.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 42&quot;&gt;&lt;/p&gt;
&lt;p&gt;At the next step, you need to specify: login, password, name, and email address to create a Jenkins administrator account.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save and Continue&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-43.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 43&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Jenkins URL&quot; field, specify the domain or subdomain by which your Jenkins is accessible from the Internet.&lt;/p&gt;
&lt;p&gt;:::note
This tutorial will use the &lt;code&gt;jenkins.heyvaldemar.net&lt;/code&gt; subdomain to access Jenkins from the Internet. You will need to specify your domain or subdomain by which your Jenkins will be accessible from the Internet.
:::&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save and Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-44.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 44&quot;&gt;&lt;/p&gt;
&lt;p&gt;Jenkins installation completed successfully.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Start using Jenkins&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-45.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 45&quot;&gt;&lt;/p&gt;
&lt;p&gt;Everything is ready to use Jenkins.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-jenkins-on-ubuntu-server-46.webp&quot; alt=&quot;Install Jenkins on Ubuntu Server - Step 46&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>Jenkins</category><category>CI/CD</category><category>Automation</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Run a Minecraft Server with Multicraft</title><link>https://heyvaldemar.com/run-a-minecraft-server-with-multicraft/</link><guid isPermaLink="true">https://heyvaldemar.com/run-a-minecraft-server-with-multicraft/</guid><description>Learn how to run your own Minecraft server using Multicraft on Ubuntu Server. Step-by-step setup guide for managing players, ports, memory, and Spigot.</description><pubDate>Sat, 10 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and clear guide on how to run a Minecraft Server with Multicraft.&lt;/p&gt;
&lt;p&gt;:::important
Multicraft must be installed on the server, and Spigot must be updated to the latest version.&lt;/p&gt;
&lt;p&gt;For detailed instructions on installing Multicraft on Ubuntu Server, see &lt;a href=&quot;/install-multicraft-on-ubuntu-server/&quot;&gt;Install Multicraft на Ubuntu Server&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
For instructions on upgrading Spigot on Ubuntu Server using Multicraft, see my guide: &lt;a href=&quot;/upgrade-spigot-on-ubuntu-server-with-multicraft/&quot;&gt;Upgrade Spigot on Ubuntu Server with Multicraft&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;Open the Multicraft control panel and click on the &quot;Login&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./run-a-minecraft-server-with-multicraft-1.webp&quot; alt=&quot;Run a Minecraft Server with Multicraft - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to specify the username and password of an account with administrator rights in the Multicraft control panel.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Login&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./run-a-minecraft-server-with-multicraft-2.webp&quot; alt=&quot;Run a Minecraft Server with Multicraft - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;To create a new server, click on the &quot;Create Server&quot; button on the &quot;Servers&quot; tab.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./run-a-minecraft-server-with-multicraft-3.webp&quot; alt=&quot;Run a Minecraft Server with Multicraft - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Name&quot; field, specify the desired name for the new Minecraft server.&lt;/p&gt;
&lt;p&gt;In the field &quot;Player Slots&quot; we indicate the maximum number of places for players on the Minecraft server.&lt;/p&gt;
&lt;p&gt;In the &quot;Port&quot; field, specify the port for the Minecraft client to access the Minecraft server.&lt;/p&gt;
&lt;p&gt;:::warning
Port 25565 is used by default to connect a Minecraft client to a Minecraft server, but you can use other ports to run multiple Minecraft servers. For example, the first Minecraft server launched with Multicraft will use port 25581; the second server, launched with Multicraft, will use port 25582, and so on.&lt;/p&gt;
&lt;p&gt;In this case, in the Minecraft client, you will need to specify not only the IP address or name of the Minecraft server but also the port through which to connect to the server. For example &lt;code&gt;minecraft.heyvaldemar.net:25581&lt;/code&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, the Minecraft server will be started using port 25581.
:::&lt;/p&gt;
&lt;p&gt;In the &quot;Memory&quot; field, indicate the maximum allowable size of RAM allocated for the Minecraft server.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Create&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./run-a-minecraft-server-with-multicraft-4.webp&quot; alt=&quot;Run a Minecraft Server with Multicraft - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;The server has been successfully created.&lt;/p&gt;
&lt;p&gt;Now you need to select the JAR file that will be used when starting the Minecraft server.&lt;/p&gt;
&lt;p&gt;:::note
This tutorial will use Spigot, a modified Minecraft server built on top of the CraftBukkit core. Spigot is known for its stability, performance, support for a large number of plugins and is intended to replace CraftBukkit.
:::&lt;/p&gt;
&lt;p&gt;:::important
Spigot needs to be updated in order for it to start correctly.
:::&lt;/p&gt;
&lt;p&gt;:::note
For instructions on upgrading Spigot on Ubuntu Server using Multicraft, see my guide: &lt;a href=&quot;/upgrade-spigot-on-ubuntu-server-with-multicraft/&quot;&gt;Upgrade Spigot on Ubuntu Server with Multicraft&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;In the &quot;JAR File&quot; field, select &quot;Spigot&quot; and click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./run-a-minecraft-server-with-multicraft-5.webp&quot; alt=&quot;Run a Minecraft Server with Multicraft - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, click on the &quot;Accept EULA&quot; button if you agree with the Minecraft license agreement.&lt;/p&gt;
&lt;p&gt;:::note
Additional details about the Minecraft license agreement can be found on the &lt;a href=&quot;https://www.minecraft.net/en-us/eula&quot;&gt;official EULA page&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;Everything is ready to start the Minecraft server.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Start&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./run-a-minecraft-server-with-multicraft-6.webp&quot; alt=&quot;Run a Minecraft Server with Multicraft - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Minecraft server will start to start.&lt;/p&gt;
&lt;p&gt;Next, you need to make sure that the server has started successfully.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Console&quot; button in the left menu.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./run-a-minecraft-server-with-multicraft-7.webp&quot; alt=&quot;Run a Minecraft Server with Multicraft - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;After a few minutes, you should see a &quot;Startup Done&quot; message, which indicates that the Minecraft server is running.&lt;/p&gt;
&lt;p&gt;Now, in the Minecraft client, you will need to specify not only the IP address or name of the Minecraft server but also the port through which to connect to the server. For example &lt;code&gt;minecraft.heyvaldemar.net:25581&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./run-a-minecraft-server-with-multicraft-8.webp&quot; alt=&quot;Run a Minecraft Server with Multicraft - Step 8&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Minecraft</category><category>Multicraft</category><category>Gaming</category><category>Server</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Upgrade Spigot on Ubuntu Server with Multicraft</title><link>https://heyvaldemar.com/upgrade-spigot-on-ubuntu-server-with-multicraft/</link><guid isPermaLink="true">https://heyvaldemar.com/upgrade-spigot-on-ubuntu-server-with-multicraft/</guid><description>Learn how to upgrade Spigot on Ubuntu Server with Multicraft. Step-by-step tutorial for building the latest Spigot version and integrating it with Multicraft.</description><pubDate>Mon, 05 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and clear guide on how to upgrade spigot on Ubuntu Server with Multicraft.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.spigotmc.org/&quot;&gt;Spigot&lt;/a&gt; is a modified Minecraft server built on top of the CraftBukkit core. Spigot is known for its stability, performance, support for a large number of plugins and is intended to replace CraftBukkit.&lt;/p&gt;
&lt;p&gt;:::important
The server must have Multicraft, OpenJDK and Git installed.&lt;/p&gt;
&lt;p&gt;You can find out how to install Multicraft on Ubuntu Server by reading &lt;a href=&quot;/install-multicraft-on-ubuntu-server/&quot;&gt;Install Multicraft on Ubuntu Server&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;To install OpenJDK and Git on the server, you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install -y default-jdk git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on a server, you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;We connect to the Multicraft server on which we plan to update Spigot.&lt;/p&gt;
&lt;p&gt;Let&apos;s create a new directory that we need to create a new version of Spigot using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo mkdir BuildTools
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./upgrade-spigot-on-ubuntu-server-with-multicraft-1.webp&quot; alt=&quot;Upgrade Spigot on Ubuntu Server with Multicraft - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Go to the new directory using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd BuildTools
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./upgrade-spigot-on-ubuntu-server-with-multicraft-2.webp&quot; alt=&quot;Upgrade Spigot on Ubuntu Server with Multicraft - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Load the &quot;BuildTools.jar&quot; file using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo wget https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &quot;BuildTools.jar&quot; file is required to create a new version of Spigot.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./upgrade-spigot-on-ubuntu-server-with-multicraft-3.webp&quot; alt=&quot;Upgrade Spigot on Ubuntu Server with Multicraft - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s make changes to the Git configuration using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo git config --global --unset core.autocrlf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./upgrade-spigot-on-ubuntu-server-with-multicraft-4.webp&quot; alt=&quot;Upgrade Spigot on Ubuntu Server with Multicraft - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;We start creating a new version of Spigot using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo java -jar BuildTools.jar
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./upgrade-spigot-on-ubuntu-server-with-multicraft-5.webp&quot; alt=&quot;Upgrade Spigot on Ubuntu Server with Multicraft - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;The new version of Spigot has been successfully created and is available in the previously created &quot;BuildTools&quot; directory.&lt;/p&gt;
&lt;p&gt;Now you need to replace the old version of Spigot with the new one so that Spigot starts correctly with Multicraft.&lt;/p&gt;
&lt;p&gt;Find the location of the old version of Spigot using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo find / -name &apos;spigot*.jar&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./upgrade-spigot-on-ubuntu-server-with-multicraft-6.webp&quot; alt=&quot;Upgrade Spigot on Ubuntu Server with Multicraft - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;The old version is in the directory:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;/home/minecraft/multicraft/jar/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Let&apos;s create a backup copy of the old version of Spigot using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo mv /home/minecraft/multicraft/jar/spigot.jar /home/minecraft/multicraft/jar/spigot.jar.old
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./upgrade-spigot-on-ubuntu-server-with-multicraft-7.webp&quot; alt=&quot;Upgrade Spigot on Ubuntu Server with Multicraft - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s copy the new version of Spigot to the place of the old version using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo cp /home/ubuntu/BuildTools/spigot-* /home/minecraft/multicraft/jar/spigot.jar
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./upgrade-spigot-on-ubuntu-server-with-multicraft-8.webp&quot; alt=&quot;Upgrade Spigot on Ubuntu Server with Multicraft - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s enable execution of the &quot;spigot.jar&quot; file using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo chmod +x /home/minecraft/multicraft/jar/spigot.jar
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./upgrade-spigot-on-ubuntu-server-with-multicraft-9.webp&quot; alt=&quot;Upgrade Spigot on Ubuntu Server with Multicraft - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s adjust the owner and group for the &quot;spigot.jar&quot; file using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo chown -R minecraft:minecraft /home/minecraft/multicraft/jar/spigot.jar
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
By default Multicraft runs as &quot;minecraft&quot; username. Therefore, the owner of the new version of Spigot must be the user &quot;minecraft&quot;.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./upgrade-spigot-on-ubuntu-server-with-multicraft-10.webp&quot; alt=&quot;Upgrade Spigot on Ubuntu Server with Multicraft - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Spigot update has been successfully completed and you can now correctly launch the modified Minecraft server using Multicraft.&lt;/p&gt;
&lt;p&gt;:::note
For a step-by-step guide on starting a Minecraft server with Multicraft, see my tutorial: &lt;a href=&quot;/run-a-minecraft-server-with-multicraft/&quot;&gt;Run a Minecraft Server with Multicraft&lt;/a&gt;.
:::&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Minecraft</category><category>Spigot</category><category>Multicraft</category><category>Gaming</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Multicraft on Ubuntu Server</title><link>https://heyvaldemar.com/install-multicraft-on-ubuntu-server/</link><guid isPermaLink="true">https://heyvaldemar.com/install-multicraft-on-ubuntu-server/</guid><description>Step-by-step guide to installing Multicraft on Ubuntu Server. Set up a secure Minecraft server hosting panel with Apache, MySQL, and Let&apos;s Encrypt SSL.</description><pubDate>Sun, 04 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Multicraft on Ubuntu Server.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.multicraft.org/&quot;&gt;Multicraft&lt;/a&gt; is a complete Minecraft server hosting solution.&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on a server, you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to get a free cryptographic certificate through Let&apos;s Encrypt CA.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the Multicraft control panel.&lt;/li&gt;
&lt;li&gt;TCP port 25565 - for Minecraft client access to the Minecraft server.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;:::warning
Port 25565 is used by default to connect a Minecraft client to a Minecraft server, but you can use other ports to run multiple Minecraft servers. For example, the first Minecraft server launched with Multicraft will use port 25581; the second server, launched with Multicraft, will use port 25582, and so on.&lt;/p&gt;
&lt;p&gt;In this case, in the Minecraft client, you will need to specify not only the IP address or name of the Minecraft server but also the port through which to connect to the server. For example &lt;code&gt;minecraft.heyvaldemar.net:25581&lt;/code&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
To obtain and subsequently renew a free SSL certificate, we will use the Let&apos;s Encrypt certification authority, as well as the Certbot software client, which is designed to make it as easy as possible to obtain and renew a certificate through the Let&apos;s Encrypt certification authority.
:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which you plan to install Multicraft.&lt;/p&gt;
&lt;p&gt;Update the local package index to the latest changes in the repositories using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt update
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-1.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s install the packages required for Multicraft to work using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install -y apache2 apt-transport-https certbot python3-certbot-apache mysql-server php libapache2-mod-php php-mysql php-gd php-cli php-common php-mbstring php-ldap php-odbc php-pear php-xml php-xmlrpc php-bcmath php-pdo default-jdk git zip unzip
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this tutorial, MySQL will be used as a database management system, and Apache will be used as a webserver.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-2.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s configure Apache for further work with the Multicraft control panel.&lt;/p&gt;
&lt;p&gt;We enable the Apache webserver module called &quot;rewrite&quot; using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo a2enmod rewrite
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
The &quot;rewrite&quot; module is one of the most commonly used modules in the Apache webserver and provides a flexible and powerful way to manipulate URLs.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-3.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to make changes to the Apache configuration file by opening it in a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/apache2/apache2.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-4.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Press the &quot;i&quot; button to switch to edit mode, find the &quot;AllowOverride&quot; parameter for the &quot;/var/www/&quot; directory, and set the &quot;All&quot; value for the parameter.&lt;/p&gt;
&lt;p&gt;:::note
&quot;AllowOverride All&quot; - indicates that &quot;.htaccess&quot; should be used for the root directory of the virtual host and all subfolders.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-5.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-6.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to create a virtual host file (called a block in Nginx), with which the Multicraft control panel will work in the future.&lt;/p&gt;
&lt;p&gt;Let&apos;s create a virtual host file using a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/apache2/sites-available/multicraft.heyvaldemar.net.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this manual, the &lt;code&gt;multicraft.heyvaldemar.net&lt;/code&gt; subdomain will be used to access the Multicraft control panel from the Internet. You will need to specify your domain or subdomain by which your Multicraft control panel will be available from the Internet.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-7.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hit the &quot;i&quot; button to go into edit mode, then insert the following configuration for the webserver to work.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-apache&quot;&gt;&amp;lt;VirtualHost *:80&amp;gt;
	ServerAdmin callvaldemar@gmail.com
	ServerName multicraft.heyvaldemar.net
	DocumentRoot /var/www/html/multicraft
	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-8.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-9.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;We activate the created virtual host using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo a2ensite multicraft.heyvaldemar.net.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-10.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;Deactivate the default virtual host using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo a2dissite 000-default.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-11.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;Verify that there are no errors in the syntax of the new Apache config file using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apache2ctl configtest
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-12.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;Restart Apache to apply the changes made using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl restart apache2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-13.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s check that Apache has started successfully using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl status apache2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-14.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now, to increase the security level of the webserver, it is necessary to obtain a cryptographic certificate for the domain or subdomain, through which the Multicraft control panel will be accessible from the Internet.&lt;/p&gt;
&lt;p&gt;:::note
To obtain and subsequently renew a free SSL certificate, we will use the Let&apos;s Encrypt certification authority, as well as the Certbot software client, which is designed to make it as easy as possible to obtain and renew a certificate through the Let&apos;s Encrypt certification authority.
:::&lt;/p&gt;
&lt;p&gt;:::note
In this manual, the &lt;code&gt;multicraft.heyvaldemar.net&lt;/code&gt; subdomain will be used to access the Multicraft control panel from the Internet. You will need to specify your domain or subdomain by which your Multicraft control panel will be available from the Internet.
:::&lt;/p&gt;
&lt;p&gt;Request a cryptographic certificate using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo certbot --apache -d multicraft.heyvaldemar.net
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-15.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, we indicate the email address to which Let&apos;s Encrypt will send notifications about the expiration of the cryptographic certificate and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-16.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to read and accept the terms of use of the services provided.&lt;/p&gt;
&lt;p&gt;Press the button &quot;a&quot;, then &quot;Enter&quot;, if you agree with the terms of use of the services provided.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-17.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 17&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to choose whether you would like to share the above email address with the Electronic Frontier Foundation to receive newsletters.&lt;/p&gt;
&lt;p&gt;Press the &quot;n&quot; button, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-18.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 18&quot;&gt;&lt;/p&gt;
&lt;p&gt;At the next stage, you need to choose: do you want the parameters to be automatically added to the Apache configuration file for automatically redirecting HTTP traffic to HTTPS.&lt;/p&gt;
&lt;p&gt;Press the button &quot;2&quot;, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-19.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 19&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
Cryptographic certificates obtained through Let&apos;s Encrypt CA are valid for ninety days. Certbot automatically adds a script to renew the certificate to the task scheduler and the script runs twice a day, automatically renewing any cryptographic certificate that expires within thirty days.
:::&lt;/p&gt;
&lt;p&gt;You can check the functionality of the cryptographic certificate renewal process using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo certbot renew --dry-run
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-20.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 20&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s configure MySQL for further work with the Multicraft control panel.&lt;/p&gt;
&lt;p&gt;First, you need to run the &quot;mysql_secure_installation&quot; script, which is designed to provide a basic level of MySQL security.&lt;/p&gt;
&lt;p&gt;Run the script using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo mysql_secure_installation
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-21.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 21&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to answer a few questions to ensure a basic level of MySQL security.&lt;/p&gt;
&lt;p&gt;The first question is whether you want to use the password strength plugin, which will need to be set later for the &quot;root&quot; user who has administrator rights in MySQL.&lt;/p&gt;
&lt;p&gt;Press the &quot;y&quot; button, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-22.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 22&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to select the level of password complexity checking, which will need to be set later for the &quot;root&quot; user who has administrator rights in MySQL.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, we will look at the highest level of password strength checking for the &quot;root&quot; user.
:::&lt;/p&gt;
&lt;p&gt;Press the button &quot;2&quot;, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-23.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 23&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to provide a strong password for the &quot;root&quot; user who has administrator rights in MySQL.&lt;/p&gt;
&lt;p&gt;Specify a strong password for the &quot;root&quot; user and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-24.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 24&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, specify the password for the &quot;root&quot; user again and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-25.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 25&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next question is if you would like to proceed to the next step in setting up a basic MySQL security level with the obtained password strength value.&lt;/p&gt;
&lt;p&gt;:::note
If the password you specified will have a value of &quot;Estimated strength of the password&quot; less than 100, it means that the password you specified earlier for the &quot;root&quot; user is not strong enough, and you need to specify a stronger password.
:::&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, the &quot;Estimated strength of the password&quot; value is 100, which indicates that the previously specified password is strong enough.
:::&lt;/p&gt;
&lt;p&gt;Press the &quot;y&quot; button, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-26.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 26&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next question is if you want to delete anonymous users.&lt;/p&gt;
&lt;p&gt;Press the &quot;y&quot; button, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-27.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 27&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next question is if you want to disable remote MySQL connectivity for the &quot;root&quot; user.&lt;/p&gt;
&lt;p&gt;Press the &quot;y&quot; button, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-28.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 28&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next question is if you want to drop the test databases.&lt;/p&gt;
&lt;p&gt;Press the &quot;y&quot; button, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-29.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 29&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to apply the changes you made.&lt;/p&gt;
&lt;p&gt;Press the &quot;y&quot; button, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-30.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 30&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to create databases that will be used by the Multicraft control panel and the Multicraft daemon in the future, as well as users with the necessary rights in these databases.&lt;/p&gt;
&lt;p&gt;We connect to the MySQL management console using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo mysql -u root -p
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-31.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 31&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the password for the &quot;root&quot; account specified earlier and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-32.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 32&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
In this manual, &quot;multicraft_panel&quot; will be used as the database name for the Multicraft control panel.
:::&lt;/p&gt;
&lt;p&gt;Let&apos;s create a database, which will be used by the Multicraft control panel in the future, using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;CREATE DATABASE multicraft_panel CHARACTER SET utf8 COLLATE utf8_general_ci;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-33.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 33&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
In this manual, &quot;multicraftpaneldbuser&quot; with the password &quot;c7_Qm,A+;eq}=UHq5yW&quot; will be used as the username with rights to the database for the Multicraft control panel.
:::&lt;/p&gt;
&lt;p&gt;Create a user and assign a password to it using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;CREATE USER &apos;multicraftpaneldbuser&apos;@&apos;localhost&apos; IDENTIFIED BY &apos;c7_Qm,A+;eq}=UHq5yW&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-34.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 34&quot;&gt;&lt;/p&gt;
&lt;p&gt;We grant the new user rights to the previously created database using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;GRANT ALL ON multicraft_panel.* TO &apos;multicraftpaneldbuser&apos;@&apos;localhost&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-35.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 35&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
This tutorial will use &quot;multicraft_daemon&quot; as the database name for the Multicraft daemon.
:::&lt;/p&gt;
&lt;p&gt;Let&apos;s create a database that will be used by the Multicraft daemon in the future using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;CREATE DATABASE multicraft_daemon CHARACTER SET utf8 COLLATE utf8_general_ci;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-36.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 36&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
In this manual, &quot;multicraftdaemondbuser&quot; with the password &quot;zkJ3Xpr7f&amp;gt;/TLSYw6Zk&quot; will be used as the username with rights to the database for the Multicraft daemon.
:::&lt;/p&gt;
&lt;p&gt;Create a user and assign a password to it using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;CREATE USER &apos;multicraftdaemondbuser&apos;@&apos;localhost&apos; IDENTIFIED BY &apos;zkJ3Xpr7f&amp;gt;/TLSYw6Zk&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-37.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 37&quot;&gt;&lt;/p&gt;
&lt;p&gt;We grant the new user rights to the previously created database using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;GRANT ALL ON multicraft_daemon.* TO &apos;multicraftdaemondbuser&apos;@&apos;localhost&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-38.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 38&quot;&gt;&lt;/p&gt;
&lt;p&gt;Apply the changes made using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;FLUSH PRIVILEGES;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-39.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 39&quot;&gt;&lt;/p&gt;
&lt;p&gt;Disconnect from the MySQL Management Console using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;quit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-40.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 40&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now download the &quot;multicraft.tar.gz&quot; archive containing the files for installing Multicraft using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo wget http://www.multicraft.org/download/linux64 -O multicraft.tar.gz
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-41.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 41&quot;&gt;&lt;/p&gt;
&lt;p&gt;Unpack the downloaded archive &quot;multicraft.tar.gz&quot; using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo tar xvzf multicraft.tar.gz
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-42.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 42&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s go to the &quot;multicraft&quot; folder using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd multicraft
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-43.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 43&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s run the Multicraft installation script using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo ./setup.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-44.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 44&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to answer a few questions from the Multicraft installer.&lt;/p&gt;
&lt;p&gt;The first question is whether you need to run each Minecraft server using a separate user.&lt;/p&gt;
&lt;p&gt;Press the &quot;y&quot; button, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-45.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 45&quot;&gt;&lt;/p&gt;
&lt;p&gt;At the next stage, you need to specify the user that will be used to launch the Multicraft control panel.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, the user &quot;minecraft&quot; will be used to launch the Multicraft control panel.
:::&lt;/p&gt;
&lt;p&gt;Leave the default value and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-46.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 46&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next question is whether it is worth creating a new user &quot;minecraft&quot; for the subsequent launch of the Multicraft control panel under this user.&lt;/p&gt;
&lt;p&gt;Press the &quot;y&quot; button, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-47.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 47&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, you can select the directory where the Multicraft control panel should be installed.&lt;/p&gt;
&lt;p&gt;Leave the default value and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-48.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 48&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, you can specify the Multicraft license key.&lt;/p&gt;
&lt;p&gt;:::note
Running a single Minecraft server with the Multicraft control panel does not require a license key. For details on Multicraft license pricing, visit the &lt;a href=&quot;https://www.multicraft.org/site/page/pricing&quot;&gt;official pricing page&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, the Multicraft dashboard will be used to run one Minecraft server.
:::&lt;/p&gt;
&lt;p&gt;Leave the default value and press the &quot;Enter&quot; button&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-49.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 49&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next question is about managing multiple servers using the Multicraft control panel. If you have multiple servers for web management, you must assign a unique number to each management server daemon.&lt;/p&gt;
&lt;p&gt;:::note
In this guide, the Multicraft control panel will control one server.
:::&lt;/p&gt;
&lt;p&gt;Leave the default value and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-50.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 50&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next question is whether the Multicraft control panel will work on the current server.&lt;/p&gt;
&lt;p&gt;Press the &quot;y&quot; button, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-51.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 51&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to specify the webserver user.&lt;/p&gt;
&lt;p&gt;Leave the default value and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-52.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 52&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, you can select the directory where the files of the Multicraft web panel should be installed.&lt;/p&gt;
&lt;p&gt;Leave the default value and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-53.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 53&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to provide a strong password for the daemon.&lt;/p&gt;
&lt;p&gt;:::note
The password for the daemon set at this stage will need to be specified later at the final stage of installing the Multicraft control panel.
:::&lt;/p&gt;
&lt;p&gt;Specify a strong password for the daemon and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-54.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 54&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next question is whether you need to enable the built-in FTP server.&lt;/p&gt;
&lt;p&gt;Enabling the built-in FTP server can come in handy for uploading the files required to run Minecraft servers.&lt;/p&gt;
&lt;p&gt;Press the &quot;y&quot; button, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-55.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 55&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to specify the IP address of the server that will run the built-in FTP server.&lt;/p&gt;
&lt;p&gt;Leave the default value and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-56.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 56&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, you need to specify the port on which the built-in FTP server will be available.&lt;/p&gt;
&lt;p&gt;Leave the default value and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-57.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 57&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next question is whether to block the download of files with the &quot;.jar&quot; extension and other executable files downloaded using the built-in FTP server.&lt;/p&gt;
&lt;p&gt;Press the &quot;n&quot; button, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-58.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 58&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to specify a database management system that will be used to work with the Multicraft daemon.&lt;/p&gt;
&lt;p&gt;:::note
This tutorial will use MySQL as the database management system.
:::&lt;/p&gt;
&lt;p&gt;Specify &quot;mysql&quot;, then press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-59.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 59&quot;&gt;&lt;/p&gt;
&lt;p&gt;At the next stage, you need to specify the IP address of the server on which the database for the Multicraft daemon is located.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, the database for the Multicraft daemon is located on the same server as the Multicraft control panel.
:::&lt;/p&gt;
&lt;p&gt;Leave the default value and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-60.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 60&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, you need to specify the name assigned to the database for the Multicraft daemon, which was created earlier.&lt;/p&gt;
&lt;p&gt;This tutorial uses &quot;multicraft_daemon&quot; as the database name for the Multicraft daemon.&lt;/p&gt;
&lt;p&gt;Leave the default value and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-61.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 61&quot;&gt;&lt;/p&gt;
&lt;p&gt;At the next stage, you need to specify the name assigned to the user who was created earlier and to whom the rights to the database were granted for the Multicraft daemon to work.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, &quot;multicraftdaemondbuser&quot; is used as the database username for the Multicraft daemon.
:::&lt;/p&gt;
&lt;p&gt;Specify &quot;multicraftdaemondbuser&quot;, then press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-62.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 62&quot;&gt;&lt;/p&gt;
&lt;p&gt;At the next stage, you need to specify the password assigned to the user who was granted rights to the database for the Multicraft daemon to work.&lt;/p&gt;
&lt;p&gt;Specify the password assigned to the user &quot;multicraftdaemondbuser&quot;, then press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-63.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 63&quot;&gt;&lt;/p&gt;
&lt;p&gt;Everything is ready to start installing the Multicraft control panel.&lt;/p&gt;
&lt;p&gt;Press the &quot;y&quot; button, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-64.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 64&quot;&gt;&lt;/p&gt;
&lt;p&gt;The first stage of the installation has been completed successfully.&lt;/p&gt;
&lt;p&gt;Press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-65.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 65&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next question is whether you need to keep all of the above values to install the Multicraft control panel.&lt;/p&gt;
&lt;p&gt;Press the &quot;y&quot; button, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-66.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 66&quot;&gt;&lt;/p&gt;
&lt;p&gt;To continue the process of installing the Multicraft control panel, you need to go from the workstation to the link &lt;code&gt;https://multicraft.heyvaldemar.net/install.php&lt;/code&gt;, where &lt;code&gt;multicraft.heyvaldemar.net&lt;/code&gt; is the name of my server. Accordingly, you need to specify the name or IP address of your server with the Multicraft control panel installed.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Start Installation&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-67.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 67&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, the installer will check that all the requirements for the correct installation of the Multicraft control panel are met.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Continue&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-68.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 68&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, the installer will copy the Multicraft control panel configuration file to the directory with files for the Multicraft web panel.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Continue&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-69.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 69&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to specify the system for managing the databases and the previously created database that will be used to work with the Multicraft control panel.&lt;/p&gt;
&lt;p&gt;In the &quot;Database Type&quot; field, select &quot;MySQL&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-70.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 70&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
In this manual, the database for the Multicraft control panel is located on the same server as the Multicraft control panel.
:::&lt;/p&gt;
&lt;p&gt;In the &quot;Database Host&quot; field, enter &quot;127.0.0.1&quot;.&lt;/p&gt;
&lt;p&gt;:::note
In this manual, &quot;multicraft_panel&quot; is used as the database name for the Multicraft control panel.
:::&lt;/p&gt;
&lt;p&gt;In the &quot;Database Name&quot; field, specify &quot;multicraft_panel&quot;.&lt;/p&gt;
&lt;p&gt;:::note
In this manual, &quot;multicraftpaneldbuser&quot; is used as the username with rights to the database for the Multicraft control panel.
:::&lt;/p&gt;
&lt;p&gt;In the &quot;Database Username&quot; field, specify &quot;multicraftpaneldbuser&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Database Password&quot; field, specify the password assigned to the &quot;multicraftpaneldbuser&quot; user.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-71.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 71&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to initialize the database.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Initialize Database&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-72.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 72&quot;&gt;&lt;/p&gt;
&lt;p&gt;The database has been initialized successfully.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Continue&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-73.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 73&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to log into the Multicraft control panel under the Multicraft administrator account and complete the installation process.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Login&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-74.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 74&quot;&gt;&lt;/p&gt;
&lt;p&gt;Default login for Multicraft administrator account: admin&lt;/p&gt;
&lt;p&gt;The default password for the Multicraft administrator account is admin&lt;/p&gt;
&lt;p&gt;Specify the username and password of an account that has administrator rights Multicraft, and click on the &quot;Login&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-75.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 75&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, a message will appear stating that the connection to the Multicraft control panel database has been successfully established.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Continue&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-76.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 76&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to specify the database management system that will be used to work with the Multicraft daemon.&lt;/p&gt;
&lt;p&gt;In the &quot;Database Type&quot; field, select &quot;MySQL&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-77.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 77&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, the database for the Multicraft daemon is located on the same server as the Multicraft control panel.
:::&lt;/p&gt;
&lt;p&gt;In the &quot;Database Host&quot; field, enter &quot;127.0.0.1&quot;.&lt;/p&gt;
&lt;p&gt;This tutorial uses &quot;multicraft_daemon&quot; as the database name for the Multicraft daemon.&lt;/p&gt;
&lt;p&gt;In the &quot;Database Name&quot; field, specify &quot;multicraft_daemon&quot;.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, &quot;multicraftdaemondbuser&quot; is used as the database username for the Multicraft daemon.
:::&lt;/p&gt;
&lt;p&gt;In the &quot;Database Username&quot; field, specify &quot;multicraftdaemondbuser&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Database Password&quot; field, specify the password assigned to the user &quot;multicraftdaemondbuser&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-78.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 78&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to initialize the database.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Initialize Database&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-79.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 79&quot;&gt;&lt;/p&gt;
&lt;p&gt;The database has been initialized successfully.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Continue&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-80.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 80&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Administrator contact Email&quot; field, you must specify an email address where you can contact the administrator of the Multicraft control panel.&lt;/p&gt;
&lt;p&gt;In the &quot;Password for daemon connections&quot; field, you must specify the password that was set for the daemon earlier at the stage of using the installation script in the terminal emulator.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-81.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 81&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now we need to start the Multicraft daemon.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-82.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 82&quot;&gt;&lt;/p&gt;
&lt;p&gt;We return to the terminal emulator and start the Multicraft daemon using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo /home/minecraft/multicraft/bin/multicraft -v start
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-83.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 83&quot;&gt;&lt;/p&gt;
&lt;p&gt;Return to the Multicraft control panel and click on the &quot;Refresh&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-84.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 84&quot;&gt;&lt;/p&gt;
&lt;p&gt;The daemon started successfully.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Continue&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-85.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 85&quot;&gt;&lt;/p&gt;
&lt;p&gt;Installation of the Multicraft Control Panel has been completed successfully.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Continue to Multicraft&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-86.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 86&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now, for security reasons, you need to delete the &quot;install.php&quot; file that was used during the installation of Multicraft.&lt;/p&gt;
&lt;p&gt;Return to the terminal emulator and delete the &quot;install.php&quot; file using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo rm -f /var/www/html/multicraft/install.php
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-87.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 87&quot;&gt;&lt;/p&gt;
&lt;p&gt;Exit the &quot;multicraft&quot; directory using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd ..
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-88.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 88&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now delete the &quot;multicraft&quot; directory containing the files for installing Multicraft using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo rm -rf multicraft
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-89.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 89&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now delete the previously downloaded archive &quot;multicraft.tar.gz&quot; containing the files for installing Multicraft using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo rm -f multicraft.tar.gz
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-90.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 90&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to configure the autorun of the Multicraft service when the operating system starts.&lt;/p&gt;
&lt;p&gt;Load the unit prepared in advance by the Multicraft developers with the parameters for starting the Multicraft service into the &quot;/etc/systemd/system/&quot; directory using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo wget http://www.multicraft.org/files/multicraft.service -O /etc/systemd/system/multicraft.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-91.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 91&quot;&gt;&lt;/p&gt;
&lt;p&gt;Assign correct rights to the &quot;multicraft.service&quot; unit using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo chmod 644 /etc/systemd/system/multicraft.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-92.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 92&quot;&gt;&lt;/p&gt;
&lt;p&gt;We enable the autorun of the Multicraft service when the operating system starts using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl enable multicraft
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-93.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 93&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to provide a valid email address and set a new password for the Multicraft administrator account.&lt;/p&gt;
&lt;p&gt;Return to the Multicraft control panel and go to the &quot;Users&quot; tab, then click on the &quot;My Profile&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-94.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 94&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Email&quot; field, indicate the current email address of the Multicraft administrator.&lt;/p&gt;
&lt;p&gt;In the &quot;Current Password&quot; field, specify the current Multicraft administrator password.&lt;/p&gt;
&lt;p&gt;In the &quot;New Password&quot; and &quot;Confirm Password&quot; fields, specify the new Multicraft administrator password.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-95.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 95&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button to save the changes.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-96.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 96&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to log into the Multicraft control panel with the Multicraft administrator account using the new password.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Login&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-97.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 97&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to specify the username and password of an account that has administrator rights Multicraft and click on the &quot;Login&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-98.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 98&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Close&quot; button if you agree to the Minecraft license agreement.&lt;/p&gt;
&lt;p&gt;For more information, refer to the Minecraft End User License Agreement available on the &lt;a href=&quot;https://www.minecraft.net/en-us/eula&quot;&gt;official EULA page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Close&quot; button if you agree to the Minecraft license agreement.&lt;/p&gt;
&lt;p&gt;Additional information about the Minecraft license agreement is available on the &lt;a href=&quot;https://www.minecraft.net&quot;&gt;official Minecraft website&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-99.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 99&quot;&gt;&lt;/p&gt;
&lt;p&gt;Everything is ready to use the Multicraft control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-multicraft-on-ubuntu-server-100.webp&quot; alt=&quot;Install Multicraft on Ubuntu Server - Step 100&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you may need to update Spigot.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.spigotmc.org/&quot;&gt;Spigot&lt;/a&gt; is a modified Minecraft server built on top of the CraftBukkit core. Spigot is known for its stability, performance, support for a large number of plugins and is intended to replace CraftBukkit.&lt;/p&gt;
&lt;p&gt;:::note
For instructions on upgrading Spigot on Ubuntu Server using Multicraft, see my guide: &lt;a href=&quot;/upgrade-spigot-on-ubuntu-server-with-multicraft/&quot;&gt;Upgrade Spigot on Ubuntu Server with Multicraft&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
For a step-by-step guide on starting a Minecraft server with Multicraft, see my tutorial: &lt;a href=&quot;/run-a-minecraft-server-with-multicraft/&quot;&gt;Run a Minecraft Server with Multicraft&lt;/a&gt;.
:::&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Multicraft</category><category>Minecraft</category><category>Ubuntu</category><category>Gaming</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Disable Server Manager Autostart in Windows Server 2019</title><link>https://heyvaldemar.com/disable-server-manager-autostart-in-windows-server-2019/</link><guid isPermaLink="true">https://heyvaldemar.com/disable-server-manager-autostart-in-windows-server-2019/</guid><description>Learn how to disable Server Manager autostart in Windows Server 2019 using Server Manager settings, Task Scheduler, CMD, and PowerShell.</description><pubDate>Sun, 28 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and clear guide on how to disable Server Manager autostart in Windows Server 2019.&lt;/p&gt;
&lt;p&gt;:::note
For instructions on disabling Server Manager autostart in Windows Server 2012 R2, see: &lt;a href=&quot;/disable-server-manager-autostart-in-windows-server-2012-r2/&quot;&gt;Disable Server Manager Autostart in Windows Server 2012 R2&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;We go into the system under an account with administrator rights.&lt;/p&gt;
&lt;p&gt;Open Server Manager, click on the &quot;Manage&quot; button in the upper right corner of the screen, and select &quot;Server Manager Properties&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./disable-server-manager-autostart-in-windows-server-2019-1.webp&quot; alt=&quot;Disable Server Manager Autostart in Windows Server 2019 - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Check the box &quot;Do not start Server Manager automatically at logon&quot; and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./disable-server-manager-autostart-in-windows-server-2019-2.webp&quot; alt=&quot;Disable Server Manager Autostart in Windows Server 2019 - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Server Manager will no longer start automatically.&lt;/p&gt;
&lt;p&gt;You can also disable the automatic start of &quot;Server Manager&quot; through the task scheduler. To do this, you must disable the task that is responsible for the automatic start of &quot;Server Manager&quot;.&lt;/p&gt;
&lt;p&gt;In Server Manager, click on the &quot;Tools&quot; button in the upper right corner of the screen and select &quot;Task Scheduler&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./disable-server-manager-autostart-in-windows-server-2019-3.webp&quot; alt=&quot;Disable Server Manager Autostart in Windows Server 2019 - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Task Scheduler Library&quot; go to the &quot;Microsoft&quot; section, then to &quot;Windows&quot;, and in the &quot;Server Manager&quot; subsection, select the &quot;Server Manager&quot; task.&lt;/p&gt;
&lt;p&gt;In the &quot;Actions&quot; menu, click on the &quot;Disable&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./disable-server-manager-autostart-in-windows-server-2019-4.webp&quot; alt=&quot;Disable Server Manager Autostart in Windows Server 2019 - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Server Manager will no longer start automatically.&lt;/p&gt;
&lt;p&gt;In addition, you can disable the task that is responsible for automatically starting Server Manager using the command line.&lt;/p&gt;
&lt;p&gt;Press &quot;Start&quot;, specify &quot;cmd&quot; in the search bar, and select &quot;Command Prompt&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./disable-server-manager-autostart-in-windows-server-2019-5.webp&quot; alt=&quot;Disable Server Manager Autostart in Windows Server 2019 - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Disable Server Manager autostart using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;schtasks /Change /TN &quot;Microsoft\Windows\Server Manager\ServerManager&quot; /Disable
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./disable-server-manager-autostart-in-windows-server-2019-6.webp&quot; alt=&quot;Disable Server Manager Autostart in Windows Server 2019 - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Server Manager will no longer start automatically.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./disable-server-manager-autostart-in-windows-server-2019-7.webp&quot; alt=&quot;Disable Server Manager Autostart in Windows Server 2019 - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can also disable the task that is responsible for automatically starting Server Manager using Windows PowerShell.&lt;/p&gt;
&lt;p&gt;On the keyboard, press the key combination &quot;Win&quot; and &quot;x&quot; and in the menu that opens, select &quot;Windows PowerShell (Admin)&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./disable-server-manager-autostart-in-windows-server-2019-8.webp&quot; alt=&quot;Disable Server Manager Autostart in Windows Server 2019 - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Disable Server Manager autostart using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Get-ScheduledTask -TaskName ServerManager | Disable-ScheduledTask
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./disable-server-manager-autostart-in-windows-server-2019-9.webp&quot; alt=&quot;Disable Server Manager Autostart in Windows Server 2019 - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Server Manager will no longer start automatically.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./disable-server-manager-autostart-in-windows-server-2019-10.webp&quot; alt=&quot;Disable Server Manager Autostart in Windows Server 2019 - Step 10&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Windows Server</category><category>Server Manager</category><category>Group Policy</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Bitwarden on Ubuntu Server 20.04 LTS</title><link>https://heyvaldemar.com/install-bitwarden-on-ubuntu-server-20-04-lts/</link><guid isPermaLink="true">https://heyvaldemar.com/install-bitwarden-on-ubuntu-server-20-04-lts/</guid><description>Step-by-step guide to install Bitwarden on Ubuntu Server 20.04 LTS using Docker and Let&apos;s Encrypt. Secure your passwords with this open-source solution.</description><pubDate>Mon, 01 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Bitwarden on Ubuntu Server 20.04 LTS.&lt;/p&gt;
&lt;p&gt;For step-by-step instructions on installing Bitwarden on Ubuntu Server 22.04 LTS, see &lt;a href=&quot;/install-bitwarden-on-ubuntu-server-22-04-lts/&quot;&gt;Install Bitwarden on Ubuntu Server 22.04 LTS&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://bitwarden.com/&quot;&gt;Bitwarden&lt;/a&gt; is a free open-source password manager with the ability to sync your account information across all devices.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted Bitwarden when your organization requires on-premises credential management with full vault data control. Bitwarden Cloud or 1Password provide managed alternatives with polished enterprise features and zero server maintenance. Self-hosting is justified when security policy mandates that credentials never leave your infrastructure or when you need custom backup and recovery procedures.
:::&lt;/p&gt;
&lt;p&gt;:::important
Docker Engine and Docker Compose must be installed on the server.&lt;/p&gt;
&lt;p&gt;For a step-by-step guide on installing Docker Engine on Ubuntu Server, see &lt;a href=&quot;/install-docker-engine-and-docker-compose-on-ubuntu-server/&quot;&gt;Install Docker Engine and Docker Compose on Ubuntu Server&lt;/a&gt;
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on a server, you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to receive a free cryptographic certificate through the Let&apos;s Encrypt CA.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the Bitwarden dashboard.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;First, you need to request an installation ID and installation key to host Bitwarden on your server. You must use a unique ID and key for each Bitwarden installation.&lt;/p&gt;
&lt;p&gt;Visit the &lt;a href=&quot;https://bitwarden.com/host/&quot;&gt;Bitwarden hosting page&lt;/a&gt;, fill in your email address in the &quot;Admin Email Address&quot; field, and click the &quot;Submit&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitwarden-on-ubuntu-server-20-04-lts-1.webp&quot; alt=&quot;Install Bitwarden on Ubuntu Server 20.04 LTS - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Save the resulting &quot;Installation Id&quot; and &quot;Installation Key&quot;. These values will be required during Bitwarden installation.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitwarden-on-ubuntu-server-20-04-lts-2.webp&quot; alt=&quot;Install Bitwarden on Ubuntu Server 20.04 LTS - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;We connect to the server on which you plan to install Bitwarden.&lt;/p&gt;
&lt;p&gt;Download the Bitwarden installation script using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;curl -Lso bitwarden.sh https://go.btwrdn.co/bw-sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitwarden-on-ubuntu-server-20-04-lts-3.webp&quot; alt=&quot;Install Bitwarden on Ubuntu Server 20.04 LTS - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s enable the execution of the file &quot;bitwarden.sh&quot; using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;chmod +x bitwarden.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitwarden-on-ubuntu-server-20-04-lts-4.webp&quot; alt=&quot;Install Bitwarden on Ubuntu Server 20.04 LTS - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s start the Bitwarden installation using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo ./bitwarden.sh install
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitwarden-on-ubuntu-server-20-04-lts-5.webp&quot; alt=&quot;Install Bitwarden on Ubuntu Server 20.04 LTS - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to specify the domain name that you plan to use to access the Bitwarden dashboard.&lt;/p&gt;
&lt;p&gt;Specify the domain name to access Bitwarden and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitwarden-on-ubuntu-server-20-04-lts-6.webp&quot; alt=&quot;Install Bitwarden on Ubuntu Server 20.04 LTS - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;This tutorial walks you through obtaining a free cryptographic certificate through the Let&apos;s Encrypt CA.&lt;/p&gt;
&lt;p&gt;Press the &quot;y&quot; button, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitwarden-on-ubuntu-server-20-04-lts-7.webp&quot; alt=&quot;Install Bitwarden on Ubuntu Server 20.04 LTS - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;We indicate the email address to which Let&apos;s Encrypt will send notifications about the expiration of the certificate and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;Specify the database name for the Bitwarden instance and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitwarden-on-ubuntu-server-20-04-lts-8.webp&quot; alt=&quot;Install Bitwarden on Ubuntu Server 20.04 LTS - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the &quot;Installation Id&quot; obtained earlier and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitwarden-on-ubuntu-server-20-04-lts-9.webp&quot; alt=&quot;Install Bitwarden on Ubuntu Server 20.04 LTS - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;We indicate the &quot;Installation Key&quot; obtained earlier and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitwarden-on-ubuntu-server-20-04-lts-10.webp&quot; alt=&quot;Install Bitwarden on Ubuntu Server 20.04 LTS - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;Bitwarden installed successfully.&lt;/p&gt;
&lt;p&gt;Now let&apos;s start Bitwarden using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo ./bitwarden.sh start
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitwarden-on-ubuntu-server-20-04-lts-11.webp&quot; alt=&quot;Install Bitwarden on Ubuntu Server 20.04 LTS - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;Bitwarden launched successfully.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitwarden-on-ubuntu-server-20-04-lts-12.webp&quot; alt=&quot;Install Bitwarden on Ubuntu Server 20.04 LTS - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;To access the Bitwarden control panel, you need to go from the workstation to the link &lt;code&gt;https://bitwarden.heyvaldemar.net&lt;/code&gt;, where &lt;code&gt;bitwarden.heyvaldemar.net&lt;/code&gt; is the name of my server. Accordingly, you need to specify the name of your server with Bitwarden installed.&lt;/p&gt;
&lt;p&gt;Next, you need to register to start using the Bitwarden dashboard.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-bitwarden-on-ubuntu-server-20-04-lts-13.webp&quot; alt=&quot;Install Bitwarden on Ubuntu Server 20.04 LTS - Step 13&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Self-Hosting</category><category>Bitwarden</category><category>Security</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install OpenJDK on Ubuntu Server</title><link>https://heyvaldemar.com/install-openjdk-on-ubuntu-server/</link><guid isPermaLink="true">https://heyvaldemar.com/install-openjdk-on-ubuntu-server/</guid><description>Step-by-step guide to installing OpenJDK on Ubuntu Server. Learn how to configure Java, set JAVA_HOME, and verify your environment for Java development.</description><pubDate>Mon, 01 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing OpenJDK on Ubuntu Server.&lt;/p&gt;
&lt;p&gt;:::note
With the release of Java 11, Oracle JDK became commercial and is no longer free.
:::&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://openjdk.org/&quot;&gt;OpenJDK&lt;/a&gt; is an open-source implementation of the Java Standard Edition platform with contributions from Oracle and the Java open community. The Oracle JDK build process is built from the OpenJDK source, so there isn&apos;t much difference between Oracle JDK and OpenJDK.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose OpenJDK when you need a free, community-supported Java runtime for production workloads. Amazon Corretto, Eclipse Temurin, or Azul Zulu provide vendor-backed alternatives with LTS support and performance optimizations. For containerized deployments, consider using a JDK base image instead of host-level installation to improve portability and reproducibility across environments.
:::&lt;/p&gt;
&lt;p&gt;:::note
OpenJDK is free but will need to be updated every 6 months.
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on a server, you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which you plan to install OpenJDK.&lt;/p&gt;
&lt;p&gt;Update the local package index to the latest changes in the repositories using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt update
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-openjdk-on-ubuntu-server-1.webp&quot; alt=&quot;Install OpenJDK on Ubuntu Server - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;You may need a Java Development Kit (JDK) in addition to the JRE to compile and run certain Java-based software.&lt;/p&gt;
&lt;p&gt;To install the JDK, run the following command, which will also install the JRE:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt-get install -y default-jdk
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-openjdk-on-ubuntu-server-2.webp&quot; alt=&quot;Install OpenJDK on Ubuntu Server - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to make sure that OpenJDK is installed correctly. To do this, you need to run the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;java -version
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-openjdk-on-ubuntu-server-3.webp&quot; alt=&quot;Install OpenJDK on Ubuntu Server - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Based on the message received, OpenJDK is installed correctly.&lt;/p&gt;
&lt;p&gt;Many programs written with Java use the &quot;JAVA_HOME&quot; environment variable to determine where Java is installed. Therefore, you need to define this variable and assign it a value containing the path to the Java installation location.&lt;/p&gt;
&lt;p&gt;Let&apos;s define the path to the Java installation location using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo update-alternatives --config java
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-openjdk-on-ubuntu-server-4.webp&quot; alt=&quot;Install OpenJDK on Ubuntu Server - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;In this example, the path to the Java installation location looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;/usr/lib/jvm/java-11-openjdk-amd64/bin/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To define an environment variable and assign a value to it, you need to make changes to the &quot;environment&quot; file by opening it in a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/environment
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-openjdk-on-ubuntu-server-5.webp&quot; alt=&quot;Install OpenJDK on Ubuntu Server - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Press the &quot;i&quot; button to switch to edit mode, then at the end of the file define a new variable &quot;JAVA_HOME&quot; and assign it a value containing the path to the Java installation location obtained earlier.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;JAVA_HOME=&quot;/usr/lib/jvm/java-11-openjdk-amd64/bin/&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
The path to the Java installation location must be specified up to and including the &quot;bin&quot; folder.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-openjdk-on-ubuntu-server-6.webp&quot; alt=&quot;Install OpenJDK on Ubuntu Server - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-openjdk-on-ubuntu-server-7.webp&quot; alt=&quot;Install OpenJDK on Ubuntu Server - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to apply the changes made to the current session using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;source /etc/environment
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-openjdk-on-ubuntu-server-8.webp&quot; alt=&quot;Install OpenJDK on Ubuntu Server - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s make sure that the environment variable has the correct value using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;echo $JAVA_HOME
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-openjdk-on-ubuntu-server-9.webp&quot; alt=&quot;Install OpenJDK on Ubuntu Server - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Based on the message received, the environment variable has the correct value.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-openjdk-on-ubuntu-server-10.webp&quot; alt=&quot;Install OpenJDK on Ubuntu Server - Step 10&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Java</category><category>OpenJDK</category><category>Ubuntu</category><category>Linux</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Enable Logging in Windows Firewall</title><link>https://heyvaldemar.com/enable-logging-in-windows-firewall/</link><guid isPermaLink="true">https://heyvaldemar.com/enable-logging-in-windows-firewall/</guid><description>Learn how to enable logging in Windows Firewall on Windows Server to monitor blocked connections and troubleshoot network issues using GUI or PowerShell.</description><pubDate>Thu, 18 Feb 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing enable logging in Windows Firewall.&lt;/p&gt;
&lt;p&gt;:::warning
For security reasons, it is not recommended to disable Windows Firewall unless you are using a complete antivirus solution that includes a different firewall. In the case when Windows Firewall blocks the operation of an application, you need to study this event in detail using a file with logs and make an allowing rule for this application in Windows Firewall, if it is really necessary.
:::&lt;/p&gt;
&lt;p&gt;:::note
This tutorial will cover several ways to enable logging in to Windows Firewall.
:::&lt;/p&gt;
&lt;p&gt;We go into the system under an account with administrator rights.&lt;/p&gt;
&lt;p&gt;Open Server Manager, click on the &quot;Tools&quot; button in the upper right corner of the screen and select &quot;Windows Firewall with Advanced Security&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./enable-logging-in-windows-firewall-1.webp&quot; alt=&quot;Enable Logging in Windows Firewall - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, right-click on &quot;Windows Firewall with Advanced Security on Local Computer&quot; and select &quot;Properties&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./enable-logging-in-windows-firewall-2.webp&quot; alt=&quot;Enable Logging in Windows Firewall - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
In this guide, logging in Windows Firewall for a domain profile will be configured. Similarly, you can configure logging for other profiles.
:::&lt;/p&gt;
&lt;p&gt;On the &quot;Domain Profile&quot; tab, in the &quot;Logging&quot; section, select &quot;Customize&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./enable-logging-in-windows-firewall-3.webp&quot; alt=&quot;Enable Logging in Windows Firewall - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Further, in the &quot;Name&quot; field, you can specify where the file with the Windows Firewall logs will be stored.&lt;/p&gt;
&lt;p&gt;In the &quot;Size Limit&quot; field, specify the maximum size of the file with logs.&lt;/p&gt;
&lt;p&gt;To enable logging of dropped packets, select &quot;Yes&quot; in the &quot;Log dropped packets&quot; section.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./enable-logging-in-windows-firewall-4.webp&quot; alt=&quot;Enable Logging in Windows Firewall - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can also enable logging in to Windows Firewall using Windows PowerShell.&lt;/p&gt;
&lt;p&gt;On the keyboard, press the key combination &quot;Win&quot; and &quot;x&quot; and in the menu that opens, select &quot;Windows PowerShell (Admin)&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./enable-logging-in-windows-firewall-5.webp&quot; alt=&quot;Enable Logging in Windows Firewall - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
In this guide, logging in Windows Firewall for a domain profile will be configured. Similarly, you can configure logging for other profiles.
:::&lt;/p&gt;
&lt;p&gt;We enable logging using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Set-NetFireWallProfile -Profile Domain -LogBlocked True -LogMaxSize 4096 -LogFileName &quot;%systemroot%\system32\LogFiles\Firewall\pfirewall.log&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./enable-logging-in-windows-firewall-6.webp&quot; alt=&quot;Enable Logging in Windows Firewall - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now, looking at the file with the logs, you can examine in detail which application was blocked using Windows Firewall, and make an allow rule for it if it is really necessary.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./enable-logging-in-windows-firewall-7.webp&quot; alt=&quot;Enable Logging in Windows Firewall - Step 7&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Windows Server</category><category>Security</category><category>Firewall</category><category>Networking</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Optimal Active Directory Structure</title><link>https://heyvaldemar.com/optimal-active-directory-structure/</link><guid isPermaLink="true">https://heyvaldemar.com/optimal-active-directory-structure/</guid><description>Learn how large enterprises design scalable and secure Active Directory structures. Explore best practices for organizing domains, OUs, users, and servers.</description><pubDate>Sat, 13 Feb 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Here&apos;s a proven Active Directory (AD) structure commonly used by large organizations, including enterprises with over 10,000 employees globally. Such environments typically implement a domain tree structured by country or continent.&lt;/p&gt;
&lt;h2&gt;Example domain hierarchy&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Root domain: &lt;code&gt;heyvaldemar.net&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Child domains: &lt;code&gt;canada.heyvaldemar.net&lt;/code&gt;, &lt;code&gt;ireland.heyvaldemar.net&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each domain in the tree follows a consistent internal structure.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./optimal-active-directory-structure-1.webp&quot; alt=&quot;Active Directory OU structure showing grouped organizational units for a domain in Toronto&quot;&gt;&lt;/p&gt;
&lt;h3&gt;Domain-Level Organization by City&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Toronto&lt;/strong&gt; (City of Toronto)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;City-Level OUs by Object Type&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Groups&lt;/strong&gt; - All security and distribution groups&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Servers&lt;/strong&gt; - All server objects&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Service&lt;/strong&gt; - Service accounts used to run applications&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Users&lt;/strong&gt; - End user accounts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Workstations&lt;/strong&gt; - User endpoints&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Groups - Organized by Scope&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Local&lt;/strong&gt; - Domain-local groups&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Global&lt;/strong&gt; - Global groups&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Universal&lt;/strong&gt; - Universal groups&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Distribution&lt;/strong&gt; - Non-security mail groups&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Servers - Organized by Service Role&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Disabled&lt;/strong&gt; - Decommissioned or inactive servers&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Exchange&lt;/strong&gt; - Microsoft Exchange servers&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;File&lt;/strong&gt; - File servers with shared resources&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Normal&lt;/strong&gt; - General-purpose servers&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Print&lt;/strong&gt; - Print servers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;(More categories can be added based on operational needs.)&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Service Accounts - Organized by Role&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Disabled&lt;/strong&gt; - Inactive service accounts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Normal&lt;/strong&gt; - Active service accounts used in production&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;User Accounts - Organized by Role&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Admins&lt;/strong&gt; - Elevated-privilege accounts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disabled&lt;/strong&gt; - Former employees or inactive accounts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;External&lt;/strong&gt; - Contractors or third-party users&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Normal&lt;/strong&gt; - Standard user accounts&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;(Expand categories as needed for your organization.)&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Workstations - Organized by User Role&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Admins&lt;/strong&gt; - Devices used by admin accounts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disabled&lt;/strong&gt; - Retired or unused machines&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Normal&lt;/strong&gt; - Standard user workstations&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Final Note&lt;/h2&gt;
&lt;p&gt;This structure provides a &lt;strong&gt;scalable, secure, and easily manageable&lt;/strong&gt; AD layout — ideal for delegation, policy application, and compliance.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Active Directory</category><category>Best Practices</category><category>Security</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Windows Server 2019</title><link>https://heyvaldemar.com/install-windows-server-2019/</link><guid isPermaLink="true">https://heyvaldemar.com/install-windows-server-2019/</guid><description>Step-by-step guide to install Windows Server 2019 with Desktop Experience. Learn how to set up a secure and stable Windows Server environment from scratch..</description><pubDate>Thu, 11 Feb 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Windows Server 2019.&lt;/p&gt;
&lt;p&gt;:::note
I strongly recommend that you never use any third-party builds of Windows. Use only original installation images. This will help you avoid a lot of problems and get maximum performance and stability.
:::&lt;/p&gt;
&lt;p&gt;After successfully booting from the Windows Server 2019 installation flash drive or DVD, the first step is to select the language options.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2019-1.webp&quot; alt=&quot;Install Windows Server 2019 - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Install now&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2019-2.webp&quot; alt=&quot;Install Windows Server 2019 - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
If you need to install Windows Server 2019 in Server Core mode (no GUI), then you need to select &quot;Windows Server 2019 Standard Evaluation&quot; or &quot;Windows Server 2019 Datacenter Evaluation&quot;.
:::&lt;/p&gt;
&lt;p&gt;This example is for installing Windows Server 2019 Datacenter Evaluation (Desktop Experience).&lt;/p&gt;
&lt;p&gt;Select &quot;Windows Server 2019 Datacenter Evaluation (Desktop Experience)&quot; and click &quot;Next&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2019-3.webp&quot; alt=&quot;Install Windows Server 2019 - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to accept the license terms.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2019-4.webp&quot; alt=&quot;Install Windows Server 2019 - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;This step offers two installation options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&quot;Upgrade&quot;. This is not the best option. As practice shows, numerous programs may not be compatible with the new operating system, and after the update, you will not be able to work with them, in addition, there is a possibility of dragging problems from the old operating system to the new one, thus losing all stability.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&quot;Custom&quot;. This is the best option for installing any version of the Windows operating system. It allows you to start working with the system &quot;from scratch&quot;, so after installation, you will get maximum performance and stability. All that remains is to install the drivers and the software familiar to work.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2019-5.webp&quot; alt=&quot;Install Windows Server 2019 - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to choose which disk the new operating system will be installed on and allocate space for installation.&lt;/p&gt;
&lt;p&gt;If you have more than one disk installed or the disk already has several partitions, all this will be displayed at this stage. Care must be taken to understand in advance which partition you want to install the operating system on.&lt;/p&gt;
&lt;p&gt;:::note
In this example, one 50 GB disk is installed.
:::&lt;/p&gt;
&lt;p&gt;Click on the &quot;New&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2019-6.webp&quot; alt=&quot;Install Windows Server 2019 - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;In this case, all free disk space will be allocated for the system, so we leave the value in the &quot;Size&quot; section by default.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Apply&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2019-7.webp&quot; alt=&quot;Install Windows Server 2019 - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;The operating system notifies that it may need to create additional partitions on the disk to store system files.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2019-8.webp&quot; alt=&quot;Install Windows Server 2019 - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Thus, all free disk space was allocated for the operating system, but at the same time, the system reserved a small partition for itself.&lt;/p&gt;
&lt;p&gt;Now you need to select the partition on which the operating system is supposed to be installed and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2019-9.webp&quot; alt=&quot;Install Windows Server 2019 - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of installing the operating system has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2019-10.webp&quot; alt=&quot;Install Windows Server 2019 - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;The computer will automatically restart.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2019-11.webp&quot; alt=&quot;Install Windows Server 2019 - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to provide a strong password for the &quot;Administrator&quot; account.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2019-12.webp&quot; alt=&quot;Install Windows Server 2019 - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;After completing the settings, you will be greeted by the Windows Server 2019 lock screen.&lt;/p&gt;
&lt;p&gt;Press &quot;Ctrl + Alt + Delete&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2019-13.webp&quot; alt=&quot;Install Windows Server 2019 - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to log into the system under the &quot;Administrator&quot; account.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2019-14.webp&quot; alt=&quot;Install Windows Server 2019 - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you will be able to turn on network discovery so that the server is visible to other computers on the network.&lt;/p&gt;
&lt;p&gt;:::note
Network discovery is not recommended to be enabled on public networks.
:::&lt;/p&gt;
&lt;p&gt;Click on the &quot;Yes&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2019-15.webp&quot; alt=&quot;Install Windows Server 2019 - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;Windows Server 2019 installation is complete.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2019-16.webp&quot; alt=&quot;Install Windows Server 2019 - Step 16&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Windows Server</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Windows Server 2019 Server Core</title><link>https://heyvaldemar.com/install-windows-server-2019-server-core/</link><guid isPermaLink="true">https://heyvaldemar.com/install-windows-server-2019-server-core/</guid><description>Step-by-step guide to install Windows Server 2019 Server Core. Learn how to set up a minimal, secure, and efficient Windows Server environment.</description><pubDate>Thu, 11 Feb 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Windows Server 2019 Server Core.&lt;/p&gt;
&lt;p&gt;:::note
I strongly recommend that you never use any third-party builds of Windows. Use only original installation images. This will help you avoid a lot of problems and get maximum performance and stability.
:::&lt;/p&gt;
&lt;p&gt;After successfully booting from a Windows Server 2019 Server Core installation USB stick or DVD, the first step is to select your language options.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2019-server-core-1.webp&quot; alt=&quot;Install Windows Server 2019 Server Core - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Install now&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2019-server-core-2.webp&quot; alt=&quot;Install Windows Server 2019 Server Core - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
If you need to install Windows Server 2019 with a GUI, then you need to select &quot;Windows Server 2019 Standard Evaluation (Desktop Experience)&quot; or &quot;Windows Server 2019 Datacenter Evaluation (Desktop Experience)&quot;.
:::&lt;/p&gt;
&lt;p&gt;This example is for installing Windows Server 2019 Datacenter Evaluation (Server Core).&lt;/p&gt;
&lt;p&gt;Select &quot;Windows Server 2019 Datacenter Evaluation&quot; and click &quot;Next&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2019-server-core-3.webp&quot; alt=&quot;Install Windows Server 2019 Server Core - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to accept the terms of the license.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2019-server-core-4.webp&quot; alt=&quot;Install Windows Server 2019 Server Core - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;This step offers two installation options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&quot;Upgrade&quot;. This is not the best option. As practice shows, numerous programs may not be compatible with the new operating system, and after the update, you will not be able to work with them, in addition, there is a possibility of dragging problems from the old operating system to the new one, thus losing all stability.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&quot;Custom&quot;. This is the best option for installing any version of the Windows operating system. It allows you to start from scratch with the system, so after installation, you will get maximum performance and stability. All that remains is to install the drivers and software familiar to work.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2019-server-core-5.webp&quot; alt=&quot;Install Windows Server 2019 Server Core - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to select which disk the new operating system will be installed on and allocate space for installation.&lt;/p&gt;
&lt;p&gt;If you have more than one disk installed or the disk already has several partitions, all this will be displayed at this stage. You need to be careful and understand in advance which partition you want to install the operating system on.&lt;/p&gt;
&lt;p&gt;:::note
In this example, there is one 50 GB disk installed.
:::&lt;/p&gt;
&lt;p&gt;Click on the &quot;New&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2019-server-core-6.webp&quot; alt=&quot;Install Windows Server 2019 Server Core - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;In this case, all free disk space will be allocated for the system, so we leave the value in the &quot;Size&quot; section by default.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Apply&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2019-server-core-7.webp&quot; alt=&quot;Install Windows Server 2019 Server Core - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;The operating system notifies that it may need to create additional partitions on the disk to store system files.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2019-server-core-8.webp&quot; alt=&quot;Install Windows Server 2019 Server Core - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Thus, all free disk space was allocated for the operating system, but at the same time, the system reserved a small partition for itself.&lt;/p&gt;
&lt;p&gt;Now you need to select the partition on which you intend to install the operating system and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2019-server-core-9.webp&quot; alt=&quot;Install Windows Server 2019 Server Core - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of installing the operating system has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2019-server-core-10.webp&quot; alt=&quot;Install Windows Server 2019 Server Core - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;The computer will automatically restart.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2019-server-core-11.webp&quot; alt=&quot;Install Windows Server 2019 Server Core - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to provide a strong password for the &quot;Administrator&quot; account.&lt;/p&gt;
&lt;p&gt;Select &quot;Ok&quot; and press the &quot;Tab&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2019-server-core-12.webp&quot; alt=&quot;Install Windows Server 2019 Server Core - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify a strong password and click on the &quot;Tab&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2019-server-core-13.webp&quot; alt=&quot;Install Windows Server 2019 Server Core - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;We indicate the previously entered password again and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2019-server-core-14.webp&quot; alt=&quot;Install Windows Server 2019 Server Core - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;The password for the &quot;Administrator&quot; account has been set.&lt;/p&gt;
&lt;p&gt;Press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2019-server-core-15.webp&quot; alt=&quot;Install Windows Server 2019 Server Core - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;Windows Server 2019 Server Core installation is complete.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2019-server-core-16.webp&quot; alt=&quot;Install Windows Server 2019 Server Core - Step 16&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Windows Server</category><category>PowerShell</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Export Drivers Using Windows PowerShell</title><link>https://heyvaldemar.com/export-drivers-using-windows-powershell/</link><guid isPermaLink="true">https://heyvaldemar.com/export-drivers-using-windows-powershell/</guid><description>Learn how to export Windows drivers using PowerShell with the Export-WindowsDriver cmdlet. Step-by-step guide for automation and IT pros.</description><pubDate>Wed, 10 Feb 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and clear guide on how to export drivers using Windows PowerShell.&lt;/p&gt;
&lt;p&gt;The ability to export third-party drivers using PowerShell using the Export-WindowsDriver cmdlet was first introduced with Update 1 for Windows 8.1 and Windows Server 2012 R2. This great feature is also present on later operating systems from Microsoft.&lt;/p&gt;
&lt;p&gt;Exported drivers can be useful for manual installation on new computers or using automated solutions. In addition, drivers can be added to the Windows installation image.&lt;/p&gt;
&lt;p&gt;:::note
The guide will discuss the export of drivers with their description.
:::&lt;/p&gt;
&lt;p&gt;We go into the system under an account with administrator rights.&lt;/p&gt;
&lt;p&gt;On the keyboard, press the key combination &quot;Win&quot; and &quot;x&quot; and in the menu that opens, select &quot;Windows PowerShell (Admin)&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./export-drivers-using-windows-powershell-1.webp&quot; alt=&quot;Export Drivers Using Windows PowerShell - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Yes&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./export-drivers-using-windows-powershell-2.webp&quot; alt=&quot;Export Drivers Using Windows PowerShell - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
In this manual, the drivers and their descriptions will be exported to the &quot;Temp&quot; folder on the &quot;C&quot; drive. The description of the exported drivers will be saved to the &quot;drivers.txt&quot; file.
:::&lt;/p&gt;
&lt;p&gt;Let&apos;s prepare the variable using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;$drivers = Export-WindowsDriver -Online -Destination C:\Temp\drivers
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./export-drivers-using-windows-powershell-3.webp&quot; alt=&quot;Export Drivers Using Windows PowerShell - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;We export the drivers using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;$drivers | ft ProviderName, ClassName, Date, Version -auto | Out-File C:\Temp\Drivers\drivers.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./export-drivers-using-windows-powershell-4.webp&quot; alt=&quot;Export Drivers Using Windows PowerShell - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;The drivers and their descriptions have been successfully exported to the &quot;Temp&quot; folder on the &quot;C&quot; drive.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./export-drivers-using-windows-powershell-5.webp&quot; alt=&quot;Export Drivers Using Windows PowerShell - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./export-drivers-using-windows-powershell-6.webp&quot; alt=&quot;Export Drivers Using Windows PowerShell - Step 6&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Windows</category><category>PowerShell</category><category>Drivers</category><category>Automation</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Windows 10</title><link>https://heyvaldemar.com/install-windows-10/</link><guid isPermaLink="true">https://heyvaldemar.com/install-windows-10/</guid><description>Complete guide to installing Windows 10 safely. Step-by-step instructions with screenshots, license key setup, offline account creation, and post-install tips.</description><pubDate>Wed, 10 Feb 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Windows 10.&lt;/p&gt;
&lt;p&gt;:::note
I strongly recommend that you never use any third-party builds of Windows. Use only original installation images. This will help you avoid a lot of problems and get maximum performance and stability.
:::&lt;/p&gt;
&lt;p&gt;Be sure to copy all personal data to a safe place. For example, to an external hard drive.&lt;/p&gt;
&lt;p&gt;After successfully booting from the Windows 10 installation flash drive or DVD, the first step is to select the language options.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-10-1.webp&quot; alt=&quot;Install Windows 10 - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Install now&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-10-2.webp&quot; alt=&quot;Install Windows 10 - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to specify the product license key.&lt;/p&gt;
&lt;p&gt;We indicate the license key and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-10-3.webp&quot; alt=&quot;Install Windows 10 - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;This example is for installing Windows 10 Pro.&lt;/p&gt;
&lt;p&gt;Select &quot;Windows 10 Pro&quot; and click &quot;Next&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-10-4.webp&quot; alt=&quot;Install Windows 10 - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to accept the license terms.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-10-5.webp&quot; alt=&quot;Install Windows 10 - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;This step offers two installation options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&quot;Upgrade&quot;. This is not the best option. As practice shows, numerous programs may not be compatible with the new operating system, and after the update, you will not be able to work with them, in addition, there is a possibility of dragging problems from the old operating system to the new one, thus losing all stability.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&quot;Custom&quot;. This is the best option for installing any version of the Windows operating system. It allows you to start working with the system &quot;from scratch&quot;, so after installation, you will get maximum performance and stability. All that remains is to install the drivers and the software familiar to work. Before choosing the &quot;Custom installation&quot; option, be sure to make sure that all personal data has been transferred to a safe place.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-10-6.webp&quot; alt=&quot;Install Windows 10 - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to choose which disk the new operating system will be installed on and allocate space for installation.&lt;/p&gt;
&lt;p&gt;If you have more than one disk installed or the disk already has several partitions, all this will be displayed at this stage. Care must be taken to understand in advance which partition you want to install the operating system on.&lt;/p&gt;
&lt;p&gt;:::note
In this example, one 50 GB disk is installed.
:::&lt;/p&gt;
&lt;p&gt;Click on the &quot;New&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-10-7.webp&quot; alt=&quot;Install Windows 10 - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;In this case, all free disk space will be allocated for the system, so we leave the value in the &quot;Size&quot; section by default.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Apply&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-10-8.webp&quot; alt=&quot;Install Windows 10 - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;The operating system notifies that it may need to create additional partitions on the disk to store system files.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-10-9.webp&quot; alt=&quot;Install Windows 10 - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Thus, all free disk space was allocated for the operating system, but at the same time, the system reserved a small partition for itself.&lt;/p&gt;
&lt;p&gt;Now you need to select the partition on which the operating system is supposed to be installed and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-10-10.webp&quot; alt=&quot;Install Windows 10 - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of installing the operating system has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-10-11.webp&quot; alt=&quot;Install Windows 10 - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;The computer will automatically restart.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-10-12.webp&quot; alt=&quot;Install Windows 10 - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the installation is complete, the operating system will begin to prepare the computer for work.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-10-13.webp&quot; alt=&quot;Install Windows 10 - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;After rebooting, you must select the region in which your computer is located.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Yes&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-10-14.webp&quot; alt=&quot;Install Windows 10 - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to select a keyboard layout.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Yes&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-10-15.webp&quot; alt=&quot;Install Windows 10 - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, you can add a second keyboard layout.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Skip&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-10-16.webp&quot; alt=&quot;Install Windows 10 - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to choose who owns the computer.&lt;/p&gt;
&lt;p&gt;:::note
In this example, we consider a computer that belongs to a home user, not an organization.
:::&lt;/p&gt;
&lt;p&gt;Select &quot;Set up for personal use&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-10-17.webp&quot; alt=&quot;Install Windows 10 - Step 17&quot;&gt;&lt;/p&gt;
&lt;p&gt;This step offers two types of accounts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&quot;Microsoft account&quot;. This option will fully integrate into the Microsoft ecosystem. All your Windows Store apps featured links, mail, color scheme, and more will always be linked to your Microsoft account. Thus, by logging into this account on another computer, you can get all the same settings as on your personal computer. To take advantage of your Microsoft account, you need to enter your email address and click Next. If you do not already have an email address, you can create one by clicking on the &quot;Create account&quot; button.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&quot;Offline account&quot;. This option is more suitable in cases where you do not need all your settings to be stored on Microsoft servers and synchronized on all Windows devices. This solution is more suitable for a PC that is planned to be used in an enterprise.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::note
In this example, we will create an offline account.
:::&lt;/p&gt;
&lt;p&gt;Click on the &quot;Offline account&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-10-18.webp&quot; alt=&quot;Install Windows 10 - Step 18&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, click on the &quot;Limited experience&quot; button to opt-out of creating a Microsoft account.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-10-19.webp&quot; alt=&quot;Install Windows 10 - Step 19&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to provide a username, password, and a password hint, in case you forget it.&lt;/p&gt;
&lt;p&gt;Specify the username and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-10-20.webp&quot; alt=&quot;Install Windows 10 - Step 20&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify a strong password and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-10-21.webp&quot; alt=&quot;Install Windows 10 - Step 21&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the previously entered password again and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-10-22.webp&quot; alt=&quot;Install Windows 10 - Step 22&quot;&gt;&lt;/p&gt;
&lt;p&gt;We indicate the first security question and the answer to it.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-10-23.webp&quot; alt=&quot;Install Windows 10 - Step 23&quot;&gt;&lt;/p&gt;
&lt;p&gt;We indicate the second security question and the answer to it.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-10-24.webp&quot; alt=&quot;Install Windows 10 - Step 24&quot;&gt;&lt;/p&gt;
&lt;p&gt;We indicate the third security question and the answer to it.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-10-25.webp&quot; alt=&quot;Install Windows 10 - Step 25&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, select &quot;No&quot; at all points so that no reports are sent to Microsoft.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Accept&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-10-26.webp&quot; alt=&quot;Install Windows 10 - Step 26&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, click on the &quot;Not now&quot; button to refuse to enable Cortana.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-10-27.webp&quot; alt=&quot;Install Windows 10 - Step 27&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, the final part of preparing Windows 10 for work will begin.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-10-28.webp&quot; alt=&quot;Install Windows 10 - Step 28&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-10-29.webp&quot; alt=&quot;Install Windows 10 - Step 29&quot;&gt;&lt;/p&gt;
&lt;p&gt;Windows 10 installation is complete.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-10-30.webp&quot; alt=&quot;Install Windows 10 - Step 30&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to install the drivers. They can always be downloaded from the device manufacturer&apos;s website, in the technical support section. On the manufacturer&apos;s website, you need to find exactly your device, and also indicate that you need drivers for Windows 10. Without the appropriate drivers, your device will not function correctly.&lt;/p&gt;
&lt;p&gt;Below are links to websites of popular equipment manufacturers. In the section &quot;Technical support&quot; you can find drivers for a specific model of your computer or for individual components:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.samsung.com/en/support/&quot;&gt;Samsung Support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.lenovo.com/us/en/&quot;&gt;Lenovo Support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.dell.com/support/&quot;&gt;Dell Support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.asus.com/support/&quot;&gt;Asus Support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.acer.com/worldwide/support/&quot;&gt;Acer Support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.msi.com/support/&quot;&gt;MSI Support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.hp.com&quot;&gt;HP Support&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Windows</category><category>Windows 10</category><category>Operating Systems</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Auto-run Scripts when macOS Boots</title><link>https://heyvaldemar.com/auto-run-scripts-when-macos-boots/</link><guid isPermaLink="true">https://heyvaldemar.com/auto-run-scripts-when-macos-boots/</guid><description>Learn how to create and run startup scripts on macOS using Cron. Step-by-step guide for automating tasks at boot with shell scripting and iTerm2.</description><pubDate>Tue, 09 Feb 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing auto-run scripts when macOS boots.&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;We go into the system under an account with administrator rights and start the terminal emulator.&lt;/p&gt;
&lt;p&gt;Now let&apos;s create a script that will contain the scripts required to execute when macOS boots, using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /Users/valdemar/Documents/Scripts/run-service.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this tutorial, a script called &quot;run-service.sh&quot; is created in the user&apos;s home directory. You can create a script in any convenient place for permanent storage.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./auto-run-scripts-when-macos-boots-1.webp&quot; alt=&quot;Auto-run Scripts when macOS Boots - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the password for the account and press &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./auto-run-scripts-when-macos-boots-2.webp&quot; alt=&quot;Auto-run Scripts when macOS Boots - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hit the &quot;i&quot; button to go into edit mode, then add the scripts you need to execute when you boot macOS.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./auto-run-scripts-when-macos-boots-3.webp&quot; alt=&quot;Auto-run Scripts when macOS Boots - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./auto-run-scripts-when-macos-boots-4.webp&quot; alt=&quot;Auto-run Scripts when macOS Boots - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s enable the execution of the file &quot;run-service.sh&quot; using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo chmod +x /Users/valdemar/Documents/Scripts/run-service.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./auto-run-scripts-when-macos-boots-5.webp&quot; alt=&quot;Auto-run Scripts when macOS Boots - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to use the Cron Task Scheduler to schedule the script to run after the operating system starts up.&lt;/p&gt;
&lt;p&gt;Open the task scheduler using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo crontab -e
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./auto-run-scripts-when-macos-boots-6.webp&quot; alt=&quot;Auto-run Scripts when macOS Boots - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hit the &quot;i&quot; button to switch to edit mode, then add a line with the &quot;@reboot&quot; parameter and specify the full path to the previously created script:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;@reboot /Users/valdemar/Documents/Scripts/run-service.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./auto-run-scripts-when-macos-boots-7.webp&quot; alt=&quot;Auto-run Scripts when macOS Boots - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./auto-run-scripts-when-macos-boots-8.webp&quot; alt=&quot;Auto-run Scripts when macOS Boots - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;The script will now automatically run when macOS boots, even before the user logs in.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>macOS</category><category>Automation</category><category>Shell Scripting</category><category>Startup</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Minimize Programs on Windows 10 Startup</title><link>https://heyvaldemar.com/minimize-programs-on-windows-10-startup/</link><guid isPermaLink="true">https://heyvaldemar.com/minimize-programs-on-windows-10-startup/</guid><description>Learn how to automatically start programs minimized on Windows 10 startup. Step-by-step guide using Task Manager, Startup folder, and shortcut settings.</description><pubDate>Mon, 08 Feb 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and clear guide on how to minimize programs on Windows 10 startup.&lt;/p&gt;
&lt;p&gt;:::note
For this example, we will be working with Microsoft Edge.
:::&lt;/p&gt;
&lt;p&gt;Right-click on the shortcut of the program that you want to automatically launch when the system boots, then select &quot;Copy&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./minimize-programs-on-windows-10-startup-1.webp&quot; alt=&quot;Minimize Programs on Windows 10 Startup - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;On the keyboard, press the key combination &quot;Win&quot; and &quot;r&quot;, then enter:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
If you want the program to automatically start for all users, then you must enter:
:::&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./minimize-programs-on-windows-10-startup-2.webp&quot; alt=&quot;Minimize Programs on Windows 10 Startup - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Right-click on an empty space in the folder and select &quot;Paste&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./minimize-programs-on-windows-10-startup-3.webp&quot; alt=&quot;Minimize Programs on Windows 10 Startup - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now the specified program will automatically start at system boot, and the program window will appear on top of the Windows desktop. This is not very convenient, so we will make the program run minimized.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./minimize-programs-on-windows-10-startup-4.webp&quot; alt=&quot;Minimize Programs on Windows 10 Startup - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the desired program shortcut and click on it with the right mouse button, then select &quot;Properties&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./minimize-programs-on-windows-10-startup-5.webp&quot; alt=&quot;Minimize Programs on Windows 10 Startup - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;In order for Microsoft Edge to start minimized, you must select &quot;Minimized&quot; in the &quot;Run&quot; section.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./minimize-programs-on-windows-10-startup-6.webp&quot; alt=&quot;Minimize Programs on Windows 10 Startup - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Microsoft Edge will now automatically launch minimized when Windows boots up and thus won&apos;t get in the way by appearing on top of the desktop.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Windows 10</category><category>Performance</category><category>Task Manager</category><category>Startup</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Docker Swarm on Ubuntu Server</title><link>https://heyvaldemar.com/install-docker-swarm-on-ubuntu-server/</link><guid isPermaLink="true">https://heyvaldemar.com/install-docker-swarm-on-ubuntu-server/</guid><description>Step-by-step guide to install Docker Swarm on Ubuntu Server. Learn how to configure a Swarm cluster, open required ports, and verify setup success.</description><pubDate>Sat, 26 Dec 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This is a straight, detailed walkthrough for getting Docker Swarm running on Ubuntu Server. No filler.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.docker.com/engine/swarm/&quot;&gt;Docker Swarm&lt;/a&gt; is Docker&apos;s own clustering tool. It takes a set of Docker servers and turns them into one cluster. The point is availability and performance: Swarm spreads the load across every Docker server in the cluster.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose Docker Swarm when you need simple container orchestration with minimal operational complexity and built-in Docker integration. Amazon ECS, EKS, or GKE provide managed alternatives with richer ecosystem support. Swarm is justified for small-to-medium deployments where Kubernetes complexity is not warranted, or when your team&apos;s Docker Compose expertise should transfer directly to orchestration.
:::&lt;/p&gt;
&lt;p&gt;:::important
Docker Engine and Docker Compose must be installed on the server.&lt;/p&gt;
&lt;p&gt;For a step-by-step guide on installing Docker Engine on Ubuntu Server, see &lt;a href=&quot;/install-docker-engine-and-docker-compose-on-ubuntu-server/&quot;&gt;Install Docker Engine and Docker Compose on Ubuntu Server&lt;/a&gt;
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;Need OpenSSH? Install it with:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP and UDP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 2377 - for cluster management and Raft synchronization.&lt;/li&gt;
&lt;li&gt;TCP and UDP port 7946 - for communication between all Docker Swarm servers.&lt;/li&gt;
&lt;li&gt;UDP port 4789 - for network traffic (inbound container network).&lt;/li&gt;
&lt;li&gt;IP Protocol 50 (ESP) - if you plan to use an encrypted network.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;First, connect to the server where Swarm will live.&lt;/p&gt;
&lt;p&gt;Find the server&apos;s IP address:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;ip a
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-docker-swarm-on-ubuntu-server-1.webp&quot; alt=&quot;Install Docker Swarm on Ubuntu Server - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now initialize Swarm:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker swarm init --advertise-addr 10.170.18.13
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-docker-swarm-on-ubuntu-server-2.webp&quot; alt=&quot;Install Docker Swarm on Ubuntu Server - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
10.170.18.13 is the IP address of my server. Accordingly, you need to specify the IP address of your server.
:::&lt;/p&gt;
&lt;p&gt;That&apos;s it. Swarm is up.&lt;/p&gt;
&lt;p&gt;The output prints a command. Run that command on another server and it joins the cluster as a worker.&lt;/p&gt;
&lt;p&gt;:::note
To prepare another server for the Docker Swarm cluster, you need to install only the Docker Engine on the new server and run the &lt;code&gt;docker swarm join&lt;/code&gt; command with the appropriate token.
:::&lt;/p&gt;
&lt;p&gt;:::note
For a step-by-step guide on installing Docker Engine on Ubuntu Server, see &lt;a href=&quot;/install-docker-engine-and-docker-compose-on-ubuntu-server/&quot;&gt;Install Docker Engine and Docker Compose on Ubuntu Server&lt;/a&gt;
:::&lt;/p&gt;
&lt;p&gt;Workers are one thing. You also want to be able to add more managers. Grab the manager join token:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker swarm join-token manager
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-docker-swarm-on-ubuntu-server-3.webp&quot; alt=&quot;Install Docker Swarm on Ubuntu Server - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Same idea as before. The printed command joins another server to the cluster, this time with the manager role.&lt;/p&gt;
&lt;p&gt;:::note
To prepare another server for the Docker Swarm cluster, you need to install only the Docker Engine on the new server and run the &lt;code&gt;docker swarm join&lt;/code&gt; command with the appropriate token.
:::&lt;/p&gt;
&lt;p&gt;One last check. Confirm Swarm is actually running:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker info
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-docker-swarm-on-ubuntu-server-4.webp&quot; alt=&quot;Install Docker Swarm on Ubuntu Server - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;The message back confirms it. Swarm is installed and working.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>Docker</category><category>Orchestration</category><category>Ubuntu</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install ServiceDesk Plus on Ubuntu Server</title><link>https://heyvaldemar.com/install-servicedesk-plus-on-ubuntu-server/</link><guid isPermaLink="true">https://heyvaldemar.com/install-servicedesk-plus-on-ubuntu-server/</guid><description>Comprehensive guide to installing ServiceDesk Plus on Ubuntu Server 22.04 LTS. Covers setup, port config, auto-start service, and admin login.</description><pubDate>Fri, 02 Oct 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing ServiceDesk Plus on Ubuntu Server.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.manageengine.com/products/service-desk/on-premises/&quot;&gt;ServiceDesk Plus&lt;/a&gt; is support services software with an integrated asset management system. This solution allows you to manage incidents, assets, requests, has a service catalog, and also provides an IT Project Management module for project management with support for the collaboration mode.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted ServiceDesk Plus when you need an ITIL-aligned helpdesk with asset management, change management, and on-premises data control. ServiceNow or Jira Service Management provide managed alternatives with richer automation and ecosystem integrations. Self-hosting is justified when ITSM data must remain on-premises or when licensing models favor perpetual over subscription pricing.
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on a server, you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports to access your server:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 8080 - to access the ServiceDesk Plus web interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which you plan to install ServiceDesk Plus.&lt;/p&gt;
&lt;p&gt;Update the local package index to the latest changes in the repositories using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt update
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-servicedesk-plus-on-ubuntu-server-1.webp&quot; alt=&quot;Install ServiceDesk Plus on Ubuntu Server - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s install the packages required for ServiceDesk Plus to work using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install fonts-dejavu fontconfig
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-servicedesk-plus-on-ubuntu-server-2.webp&quot; alt=&quot;Install ServiceDesk Plus on Ubuntu Server - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Switch to the &quot;root&quot; user, who has administrator rights in the operating system, using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo -i
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-servicedesk-plus-on-ubuntu-server-3.webp&quot; alt=&quot;Install ServiceDesk Plus on Ubuntu Server - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Download the ServiceDesk Plus installer using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;wget https://www.manageengine.com/products/service-desk/91677414/ManageEngine_ServiceDesk_Plus_64bit.bin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-servicedesk-plus-on-ubuntu-server-4.webp&quot; alt=&quot;Install ServiceDesk Plus on Ubuntu Server - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s enable execution of the file &quot;ManageEngine_ServiceDesk_Plus_64bit.bin&quot; using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;chmod +x ManageEngine_ServiceDesk_Plus_64bit.bin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-servicedesk-plus-on-ubuntu-server-5.webp&quot; alt=&quot;Install ServiceDesk Plus on Ubuntu Server - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s start the ServiceDesk Plus installation using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;./ManageEngine_ServiceDesk_Plus_64bit.bin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-servicedesk-plus-on-ubuntu-server-6.webp&quot; alt=&quot;Install ServiceDesk Plus on Ubuntu Server - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to answer a few questions from the ServiceDesk Plus installer.&lt;/p&gt;
&lt;p&gt;First, you must read and accept the terms of use of the services provided.&lt;/p&gt;
&lt;p&gt;Press the &quot;Enter&quot; button to move down through the text and familiarize yourself with the terms of use of the services provided.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-servicedesk-plus-on-ubuntu-server-7.webp&quot; alt=&quot;Install ServiceDesk Plus on Ubuntu Server - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Press the &quot;y&quot; button, then &quot;Enter&quot;, if you agree with the terms of use of the services provided.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-servicedesk-plus-on-ubuntu-server-8.webp&quot; alt=&quot;Install ServiceDesk Plus on Ubuntu Server - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to select the ServiceDesk Plus edition.&lt;/p&gt;
&lt;p&gt;For a detailed comparison of ServiceDesk Plus editions, visit the &lt;a href=&quot;https://www.manageengine.com/products/service-desk/sdp-editions.html&quot;&gt;official comparison page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This guide will walk you through the installation of the &quot;Enterprise Edition&quot;.&lt;/p&gt;
&lt;p&gt;Specify the desired ServiceDesk Plus edition for installation and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-servicedesk-plus-on-ubuntu-server-9.webp&quot; alt=&quot;Install ServiceDesk Plus on Ubuntu Server - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to choose whether you want to register for ServiceDesk Plus technical support.&lt;/p&gt;
&lt;p&gt;Press the &quot;n&quot; button, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-servicedesk-plus-on-ubuntu-server-10.webp&quot; alt=&quot;Install ServiceDesk Plus on Ubuntu Server - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, you can select the folder where ServiceDesk Plus should be installed.&lt;/p&gt;
&lt;p&gt;:::note
This tutorial will walk you through installing ServiceDesk Plus into the &quot;/opt&quot; folder.
:::&lt;/p&gt;
&lt;p&gt;Specify the desired folder for installing ServiceDesk Plus and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-servicedesk-plus-on-ubuntu-server-11.webp&quot; alt=&quot;Install ServiceDesk Plus on Ubuntu Server - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to confirm the installation of ServiceDesk Plus in the previously specified folder.&lt;/p&gt;
&lt;p&gt;Press the &quot;y&quot; button, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-servicedesk-plus-on-ubuntu-server-12.webp&quot; alt=&quot;Install ServiceDesk Plus on Ubuntu Server - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to select the port on which ServiceDesk Plus will be available.&lt;/p&gt;
&lt;p&gt;Leave the default value and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;I highly recommend leaving the default port value.&lt;/p&gt;
&lt;p&gt;:::note
The port can be changed later in the ServiceDesk Plus control panel.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-servicedesk-plus-on-ubuntu-server-13.webp&quot; alt=&quot;Install ServiceDesk Plus on Ubuntu Server - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;By default, ServiceDesk Plus uses PostgreSQL as its database management system.&lt;/p&gt;
&lt;p&gt;:::note
If you need to use a different system to manage your databases, after installing ServiceDesk Plus, you can use the prepared script (changeDBServer.sh) in the &quot;bin&quot; folder.
:::&lt;/p&gt;
&lt;p&gt;Press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-servicedesk-plus-on-ubuntu-server-14.webp&quot; alt=&quot;Install ServiceDesk Plus on Ubuntu Server - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step will show the disk space available and required to install ServiceDesk Plus.&lt;/p&gt;
&lt;p&gt;Press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-servicedesk-plus-on-ubuntu-server-15.webp&quot; alt=&quot;Install ServiceDesk Plus on Ubuntu Server - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;Everything is ready to start installing ServiceDesk Plus.&lt;/p&gt;
&lt;p&gt;Press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-servicedesk-plus-on-ubuntu-server-16.webp&quot; alt=&quot;Install ServiceDesk Plus on Ubuntu Server - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;ServiceDesk Plus installation completed successfully.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;Problem in Initializing Postgres !!.. Kindly check logs…&lt;/code&gt; message should be ignored as initialization will occur the first time ServiceDesk Plus is started.&lt;/p&gt;
&lt;p&gt;More information is available on the &lt;a href=&quot;https://pitstop.manageengine.com/portal/en/community/topic/bundled-postgres-role-not-created-by-installer&quot;&gt;ManageEngine community post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-servicedesk-plus-on-ubuntu-server-17.webp&quot; alt=&quot;Install ServiceDesk Plus on Ubuntu Server - Step 17&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to run ServiceDesk Plus for the first time.&lt;/p&gt;
&lt;p&gt;Go to the &quot;bin&quot; folder using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd /opt/ServiceDesk/bin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-servicedesk-plus-on-ubuntu-server-18.webp&quot; alt=&quot;Install ServiceDesk Plus on Ubuntu Server - Step 18&quot;&gt;&lt;/p&gt;
&lt;p&gt;Launch ServiceDesk Plus using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sh run.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-servicedesk-plus-on-ubuntu-server-19.webp&quot; alt=&quot;Install ServiceDesk Plus on Ubuntu Server - Step 19&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to wait a few minutes, then you need to go from the workstation to the link &lt;code&gt;http://sdp.heyvaldemar.net:8080&lt;/code&gt;, where &lt;code&gt;sdp.heyvaldemar.net&lt;/code&gt; is the name of my server. Accordingly, you need to provide the name or IP address of your server with ServiceDesk Plus installed.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-servicedesk-plus-on-ubuntu-server-20.webp&quot; alt=&quot;Install ServiceDesk Plus on Ubuntu Server - Step 20&quot;&gt;&lt;/p&gt;
&lt;p&gt;The default login for the ServiceDesk Plus administrator account is administrator&lt;/p&gt;
&lt;p&gt;The default password for the ServiceDesk Plus administrator account is administrator&lt;/p&gt;
&lt;p&gt;Specify the username and password of an account with ServiceDesk Plus administrator rights and click on the &quot;Log in&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-servicedesk-plus-on-ubuntu-server-21.webp&quot; alt=&quot;Install ServiceDesk Plus on Ubuntu Server - Step 21&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the ServiceDesk Plus dashboard.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-servicedesk-plus-on-ubuntu-server-22.webp&quot; alt=&quot;Install ServiceDesk Plus on Ubuntu Server - Step 22&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to configure the service Autostart ServiceDesk Plus when the operating system starts.&lt;/p&gt;
&lt;p&gt;Return to the terminal emulator and press the &quot;Ctrl&quot; and &quot;c&quot; keys on the keyboard to stop all ServiceDesk Plus services.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-servicedesk-plus-on-ubuntu-server-23.webp&quot; alt=&quot;Install ServiceDesk Plus on Ubuntu Server - Step 23&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s create a script that will contain the necessary configuration for the ServiceDesk Plus service in the &quot;/etc/init.d/&quot; folder using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vim /etc/init.d/servicedesk
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-servicedesk-plus-on-ubuntu-server-24.webp&quot; alt=&quot;Install ServiceDesk Plus on Ubuntu Server - Step 24&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hit the &quot;i&quot; button to go into edit mode, then insert the configuration.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash

### BEGIN INIT INFO
# Provides:          servicedesk
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: ServiceDesk Plus
# Description:       ServiceDesk Plus init script
### END INIT INFO

INITLOG_ARGS=&quot;&quot;

prog=&quot;servicedesk&quot;
progname=&quot;AdventNet ManageEngine ServiceDesk-Plus&quot;
RETVAL=0
# ServiceDesk Plus install folder (replace with yours)
MDIR=/opt/ServiceDesk/bin

if [ ! -d &quot;$MDIR&quot; ]
then
 echo &quot;Invalid directory $MDIR&quot;
    exit 1
fi

start()
{
        mv -f /var/log/servicedesk-plus.log /var/log/servicedesk-plus1.log
        echo &quot;Starting $progname&quot;
        cd $MDIR
        nohup sh run.sh &amp;gt;/var/log/servicedesk-plus.log 2&amp;gt;&amp;amp;1 &amp;amp;
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] &amp;amp;&amp;amp; touch /var/lock/subsys/servicedesk
}

stop()
{
        echo &quot;Stopping $progname&quot;
        cd $MDIR
        sh shutdown.sh -S &amp;gt;&amp;gt;/var/log/servicedesk-plus.log 2&amp;gt;&amp;amp;1
}

case &quot;$1&quot; in
 start)
       start
         ;;
 stop)
      stop
        ;;
    *)
     echo &quot;Usage: $prog {start|stop}&quot;
     exit 1
     ;;
esac

exit $RETVAL
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Next, we find the &quot;MDIR&quot; parameter and check its value.&lt;/p&gt;
&lt;p&gt;:::note
In the &quot;MDIR&quot; parameter you must specify the folder where ServiceDesk Plus was installed.
:::&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, ServiceDesk Plus was installed in the &quot;/opt&quot; folder.
:::&lt;/p&gt;
&lt;p&gt;An example of the value for the &quot;MDIR&quot; parameter when installing ServiceDesk Plus in the &quot;/opt/&quot; folder:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;MDIR=/opt/ServiceDesk/bin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-servicedesk-plus-on-ubuntu-server-25.webp&quot; alt=&quot;Install ServiceDesk Plus on Ubuntu Server - Step 25&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-servicedesk-plus-on-ubuntu-server-26.webp&quot; alt=&quot;Install ServiceDesk Plus on Ubuntu Server - Step 26&quot;&gt;&lt;/p&gt;
&lt;p&gt;Assign correct permissions for the script &quot;/etc/init.d/servicedesk&quot; using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;chmod 755 /etc/init.d/servicedesk
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-servicedesk-plus-on-ubuntu-server-27.webp&quot; alt=&quot;Install ServiceDesk Plus on Ubuntu Server - Step 27&quot;&gt;&lt;/p&gt;
&lt;p&gt;Add a script to startup when the operating system starts using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;update-rc.d servicedesk defaults
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-servicedesk-plus-on-ubuntu-server-28.webp&quot; alt=&quot;Install ServiceDesk Plus on Ubuntu Server - Step 28&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, create a file to store the ServiceDesk Plus log using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;touch /var/log/servicedesk-plus.log
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-servicedesk-plus-on-ubuntu-server-29.webp&quot; alt=&quot;Install ServiceDesk Plus on Ubuntu Server - Step 29&quot;&gt;&lt;/p&gt;
&lt;p&gt;Launch ServiceDesk Plus using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;systemctl start servicedesk
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-servicedesk-plus-on-ubuntu-server-30.webp&quot; alt=&quot;Install ServiceDesk Plus on Ubuntu Server - Step 30&quot;&gt;&lt;/p&gt;
&lt;p&gt;Open the ServiceDesk Plus log to check that all ServiceDesk Plus services have started correctly using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;less /var/log/servicedesk-plus.log
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-servicedesk-plus-on-ubuntu-server-31.webp&quot; alt=&quot;Install ServiceDesk Plus on Ubuntu Server - Step 31&quot;&gt;&lt;/p&gt;
&lt;p&gt;On the keyboard, press the &quot;Shift&quot; and &quot;f&quot; keys to start monitoring changes in the ServiceDesk Plus log in real-time.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-servicedesk-plus-on-ubuntu-server-32.webp&quot; alt=&quot;Install ServiceDesk Plus on Ubuntu Server - Step 32&quot;&gt;&lt;/p&gt;
&lt;p&gt;All necessary services have been successfully launched.&lt;/p&gt;
&lt;p&gt;On the keyboard, press the key combination &quot;Ctrl&quot; and &quot;c&quot;, then &quot;q&quot; to close the ServiceDesk Plus log.&lt;/p&gt;
&lt;p&gt;From the workstation, go to the link &lt;code&gt;http://sdp.heyvaldemar.net:8080&lt;/code&gt;, where &lt;code&gt;sdp.heyvaldemar.net&lt;/code&gt; is the name of my server. Accordingly, you need to provide the name or IP address of your server with ServiceDesk Plus installed.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-servicedesk-plus-on-ubuntu-server-33.webp&quot; alt=&quot;Install ServiceDesk Plus on Ubuntu Server - Step 33&quot;&gt;&lt;/p&gt;
&lt;p&gt;The default login for the ServiceDesk Plus administrator account is administrator&lt;/p&gt;
&lt;p&gt;The default password for the ServiceDesk Plus administrator account is administrator&lt;/p&gt;
&lt;p&gt;Specify the username and password of an account with ServiceDesk Plus administrator rights and click on the &quot;Log in&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-servicedesk-plus-on-ubuntu-server-34.webp&quot; alt=&quot;Install ServiceDesk Plus on Ubuntu Server - Step 34&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can now start working with ServiceDesk Plus.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-servicedesk-plus-on-ubuntu-server-35.webp&quot; alt=&quot;Install ServiceDesk Plus on Ubuntu Server - Step 35&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>ServiceDesk Plus</category><category>Helpdesk</category><category>ITIL</category><category>Ubuntu</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Ubuntu Server 20.04 LTS</title><link>https://heyvaldemar.com/install-ubuntu-server-20-04-lts/</link><guid isPermaLink="true">https://heyvaldemar.com/install-ubuntu-server-20-04-lts/</guid><description>Guide to install Ubuntu Server 20.04 LTS — disk setup, network configuration, OpenSSH, and user creation for a reliable Linux server deployment.</description><pubDate>Thu, 16 Jul 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Ubuntu Server 20.04 LTS.&lt;/p&gt;
&lt;p&gt;After successfully booting from the Ubuntu Server 20.04 installation USB stick or DVD, the first step is to choose which language the welcome menu will be displayed in.&lt;/p&gt;
&lt;p&gt;Select &quot;English&quot; and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-20-04-lts-1.webp&quot; alt=&quot;Install Ubuntu Server 20.04 LTS - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you can choose a keyboard layout.&lt;/p&gt;
&lt;p&gt;Select the keyboard layout you need and click on the &quot;Done&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-20-04-lts-2.webp&quot; alt=&quot;Install Ubuntu Server 20.04 LTS - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, the installer will try to automatically obtain the settings for the network connection using DHCP.&lt;/p&gt;
&lt;p&gt;You can set the IP address manually or configure the network connection after installation.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Done&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-20-04-lts-3.webp&quot; alt=&quot;Install Ubuntu Server 20.04 LTS - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, the system prompts you to specify information about the proxy server.&lt;/p&gt;
&lt;p&gt;This guide does not use a proxy server.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Done&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-20-04-lts-4.webp&quot; alt=&quot;Install Ubuntu Server 20.04 LTS - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you can specify an alternative mirror address for downloading packages.&lt;/p&gt;
&lt;p&gt;Leave the &quot;Mirror address&quot; field unchanged and click on the &quot;Done&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-20-04-lts-5.webp&quot; alt=&quot;Install Ubuntu Server 20.04 LTS - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;At the next step, you need to choose which disk the new operating system will be installed on and allocate space for installation.&lt;/p&gt;
&lt;p&gt;:::note
All free disk space will be allocated for the system.
:::&lt;/p&gt;
&lt;p&gt;Select &quot;Use an entire disk&quot;, then &quot;Set up this disk as an LVM group.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Done&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-20-04-lts-6.webp&quot; alt=&quot;Install Ubuntu Server 20.04 LTS - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, you can see what partitions will be created on the disk.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Done&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-20-04-lts-7.webp&quot; alt=&quot;Install Ubuntu Server 20.04 LTS - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to confirm your changes.&lt;/p&gt;
&lt;p&gt;Select &quot;Continue&quot; and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-20-04-lts-8.webp&quot; alt=&quot;Install Ubuntu Server 20.04 LTS - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you will need to specify the full username for the administrator account, the server name, then the login and password for the new account.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Done&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-20-04-lts-9.webp&quot; alt=&quot;Install Ubuntu Server 20.04 LTS - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;If you plan to connect to the server via SSH, then you need to select &quot;Install OpenSSH server&quot;.&lt;/p&gt;
&lt;p&gt;:::note
You can also import SSH keys from Launchpad or Github.
:::&lt;/p&gt;
&lt;p&gt;Click on the &quot;Done&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-20-04-lts-10.webp&quot; alt=&quot;Install Ubuntu Server 20.04 LTS - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, you can select additional services and components for installation from the operating system.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Done&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-20-04-lts-11.webp&quot; alt=&quot;Install Ubuntu Server 20.04 LTS - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you can watch the installation process of Ubuntu Server 20.04.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-20-04-lts-12.webp&quot; alt=&quot;Install Ubuntu Server 20.04 LTS - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Ubuntu Server 20.04 installation is now complete.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Reboot&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-20-04-lts-13.webp&quot; alt=&quot;Install Ubuntu Server 20.04 LTS - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to remove the installation USB stick or Ubuntu Server 20.04 disk from the CD/DVD drive.&lt;/p&gt;
&lt;p&gt;Next, you need to specify the username and password for authentication in Ubuntu, which was specified earlier during the installation of the system.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-20-04-lts-14.webp&quot; alt=&quot;Install Ubuntu Server 20.04 LTS - Step 14&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Ubuntu</category><category>Linux</category><category>Server</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Grafana on Ubuntu Server</title><link>https://heyvaldemar.com/install-grafana-on-ubuntu-server/</link><guid isPermaLink="true">https://heyvaldemar.com/install-grafana-on-ubuntu-server/</guid><description>Step-by-step guide to install Grafana on Ubuntu Server with Apache and Let&apos;s Encrypt SSL. Secure and visualize data using this open-source monitoring tool.</description><pubDate>Tue, 21 Apr 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Grafana on Ubuntu Server.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://grafana.com/&quot;&gt;Grafana&lt;/a&gt; is an open-source platform for data visualization, monitoring, and analysis.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose self-hosted Grafana when you need full control over dashboards, data sources, and alerting with no per-user licensing. Grafana Cloud or Datadog provide managed alternatives with built-in log aggregation and APM. Self-hosting is justified when monitoring data must remain on-premises, when you need unlimited users, or when custom plugin requirements exceed SaaS platform capabilities.
:::&lt;/p&gt;
&lt;p&gt;:::important
OpenSSH must be installed on the server, and port 22 must be open to be able to connect to the server using the SSH protocol.
:::&lt;/p&gt;
&lt;p&gt;To install OpenSSH on a server, you can use the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
To connect to the server from a Windows system, you can use tools like &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt; or &lt;a href=&quot;https://mobaxterm.mobatek.net/&quot;&gt;MobaXterm&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
This guide walks you through connecting to a server with the &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; terminal emulator on macOS.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You will need to open the following TCP ports for access to the services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP port 80 - to get a free cryptographic certificate through Let&apos;s Encrypt CA.&lt;/li&gt;
&lt;li&gt;TCP port 443 - to access the Grafana web interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which you plan to install Grafana.&lt;/p&gt;
&lt;p&gt;This tutorial walks you through obtaining a free cryptographic certificate through the Let&apos;s Encrypt CA. To obtain and subsequently renew a free SSL certificate, we will use the Certbot software client, which is designed to make it as easy as possible to obtain and renew a certificate through the Let&apos;s Encrypt certification authority.&lt;/p&gt;
&lt;p&gt;Update the local package index to the latest changes in the repositories using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt update
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-1.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s install the packages required for Grafana to work using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install -y apache2 apt-transport-https certbot python3-certbot-apache
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-2.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s configure Apache for further work with Grafana.&lt;/p&gt;
&lt;p&gt;We enable the Apache webserver module called &quot;proxy_http&quot; using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo a2enmod proxy_http
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
The &quot;proxy_http&quot; module acts like a proxy server for the HTTP and HTTPS protocols.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-3.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;We enable the Apache webserver module called &quot;rewrite&quot; using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo a2enmod rewrite
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
The &quot;rewrite&quot; module is one of the most commonly used modules in the Apache webserver and provides a flexible and powerful way to manipulate URLs.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-4.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to create two virtual host files (called a block in Nginx), with which Grafana will work in the future.&lt;/p&gt;
&lt;p&gt;Two virtual host files are required to provide access to Grafana over HTTPS, and to enable Grafana to be used at &lt;code&gt;https://grafana.heyvaldemar.net&lt;/code&gt;, without specifying port 3000 in the browser address bar.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, the &lt;code&gt;grafana.heyvaldemar.net&lt;/code&gt; subdomain will be used to access Grafana from the Internet. You will need to specify your domain or subdomain by which your Grafana will be available from the Internet.
:::&lt;/p&gt;
&lt;p&gt;Let&apos;s create the first virtual host file using a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/apache2/sites-available/grafana.heyvaldemar.net.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-5.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hit the &quot;i&quot; button to go into edit mode, then insert the following configuration for the webserver to work.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-apache&quot;&gt;&amp;lt;VirtualHost *:80&amp;gt;
	ServerAdmin callvaldemar@gmail.com
	ServerName grafana.heyvaldemar.net
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this tutorial, the &lt;code&gt;grafana.heyvaldemar.net&lt;/code&gt; subdomain will be used to access Grafana from the Internet. You will need to specify your domain or subdomain by which your Grafana will be available from the Internet.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-6.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-7.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s create a second virtual host file using a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/apache2/sites-available/grafana.heyvaldemar.net-ssl.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-8.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hit the &quot;i&quot; button to go into edit mode, then insert the following configuration for the webserver to work.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-apache&quot;&gt;&amp;lt;IfModule mod_ssl.c&amp;gt;
&amp;lt;VirtualHost *:443&amp;gt;
	ServerAdmin callvaldemar@gmail.com
	ServerName grafana.heyvaldemar.net
	ProxyPreserveHost On

	ProxyPass / http://localhost:3000/
	ProxyPassReverse / http://localhost:3000/

	SSLEngine On
	SSLCertificateFile /etc/letsencrypt/live/grafana.heyvaldemar.net/fullchain.pem
	SSLCertificateKeyFile /etc/letsencrypt/live/grafana.heyvaldemar.net/privkey.pem
	Include /etc/letsencrypt/options-ssl-apache.conf
&amp;lt;/VirtualHost&amp;gt;
&amp;lt;/IfModule&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this tutorial, the &lt;code&gt;grafana.heyvaldemar.net&lt;/code&gt; subdomain will be used to access Grafana from the Internet. You will need to specify your domain or subdomain by which your Grafana will be available from the Internet.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-9.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-10.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;We activate the first virtual host using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo a2ensite grafana.heyvaldemar.net.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-11.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;We activate the second virtual host using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo a2ensite grafana.heyvaldemar.net-ssl.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-12.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;Deactivate the default virtual host using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo a2dissite 000-default.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-13.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;Verify that there are no errors in the syntax of the new Apache config file using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apache2ctl configtest
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-14.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;Restart Apache to apply the changes made using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl restart apache2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-15.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s check that Apache has started successfully using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl status apache2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-16.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now, to increase the security level of the webserver, you need to obtain a cryptographic certificate for the domain or subdomain, through which the Grafana control panel will be available from the Internet.&lt;/p&gt;
&lt;p&gt;:::note
To obtain and subsequently renew a free SSL certificate, we will use the Let&apos;s Encrypt certification authority, as well as the Certbot software client, which is designed to make it as easy as possible to obtain and renew a certificate through the Let&apos;s Encrypt certification authority.
:::&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, the &lt;code&gt;grafana.heyvaldemar.net&lt;/code&gt; subdomain will be used to access Grafana from the Internet. You will need to specify your domain or subdomain by which your Grafana will be available from the Internet.
:::&lt;/p&gt;
&lt;p&gt;Request a cryptographic certificate using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo certbot --apache -d grafana.heyvaldemar.net
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-17.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 17&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, we indicate the email address to which Let&apos;s Encrypt will send notifications about the expiration of the cryptographic certificate and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-18.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 18&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to read and accept the terms of use of the services provided.&lt;/p&gt;
&lt;p&gt;Press the button &quot;a&quot;, then &quot;Enter&quot;, if you agree with the terms of use of the services provided.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-19.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 19&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to choose whether you want to share the above email address with the Electronic Frontier Foundation to receive newsletters.&lt;/p&gt;
&lt;p&gt;Press the &quot;n&quot; button, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-20.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 20&quot;&gt;&lt;/p&gt;
&lt;p&gt;At the next stage, you need to choose: do you want the parameters to be automatically added to the Apache configuration file for automatically redirecting HTTP traffic to HTTPS.&lt;/p&gt;
&lt;p&gt;Press the button &quot;2&quot;, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-21.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 21&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
Cryptographic certificates obtained through Let&apos;s Encrypt CA are valid for ninety days. Certbot automatically adds a script to renew the certificate to the task scheduler and the script runs twice a day, automatically renewing any cryptographic certificate that expires within thirty days.
:::&lt;/p&gt;
&lt;p&gt;You can check the functionality of the cryptographic certificate renewal process using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo certbot renew --dry-run
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-22.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 22&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s add the official Grafana key using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-23.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 23&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, we connect the Grafana repository using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo add-apt-repository &quot;deb https://packages.grafana.com/oss/deb stable main&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-24.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 24&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s install Grafana using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install -y grafana
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-25.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 25&quot;&gt;&lt;/p&gt;
&lt;p&gt;Restart &quot;systemd&quot; to search for changed or new units using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl daemon-reload
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-26.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 26&quot;&gt;&lt;/p&gt;
&lt;p&gt;Launch Grafana using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl start grafana-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-27.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 27&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s check that Grafana has started successfully using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl status grafana-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-28.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 28&quot;&gt;&lt;/p&gt;
&lt;p&gt;We enable the autostart of the Grafana service when the operating system starts using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl enable grafana-server.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-29.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 29&quot;&gt;&lt;/p&gt;
&lt;p&gt;From the workstation, go to the link &lt;code&gt;https://grafana.heyvaldemar.net&lt;/code&gt;, where &lt;code&gt;grafana.heyvaldemar.net&lt;/code&gt; is the name of my subdomain to access the Grafana control panel. You will need to specify your domain or subdomain by which your Grafana control panel will be accessible from the Internet.&lt;/p&gt;
&lt;p&gt;The default username and password for the Grafana administrator account is &quot;admin&quot;.&lt;/p&gt;
&lt;p&gt;Specify the username and password of an account with Grafana administrator rights and click on the &quot;Log in&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-30.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 30&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to change the password for the Grafana administrator account.&lt;/p&gt;
&lt;p&gt;Specify a new password for the Grafana administrator account and click on the &quot;Submit&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-31.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 31&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Grafana dashboard.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-32.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 32&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to make changes to the Grafana configuration file to disable the ability to register users without the knowledge of the Grafana administrator and to log in for anonymous users.&lt;/p&gt;
&lt;p&gt;Open the Grafana configuration file in a text editor using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo vim /etc/grafana/grafana.ini
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-33.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 33&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hit the &quot;i&quot; button to switch to edit mode, in the &quot;users&quot; section, find the &quot;allow_sign_up = false&quot; parameter and uncomment it by removing the &quot;;&quot; symbol.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-34.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 34&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;auth.anonymous&quot; section, find the &quot;enabled = false&quot; parameter and uncomment it by removing the &quot;;&quot; symbol.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-35.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 35&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now press the &quot;Esc&quot; button to exit edit mode, then type &quot;:x&quot; and press the &quot;Enter&quot; button to save your changes and exit the editor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-36.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 36&quot;&gt;&lt;/p&gt;
&lt;p&gt;Restart Grafana to apply the changes made using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl restart grafana-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-37.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 37&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s check that Grafana has started successfully using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl status grafana-server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-38.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 38&quot;&gt;&lt;/p&gt;
&lt;p&gt;Everything is ready to use Grafana.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-grafana-on-ubuntu-server-39.webp&quot; alt=&quot;Install Grafana on Ubuntu Server - Step 39&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>Grafana</category><category>Monitoring</category><category>Observability</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Configure Exchange Server 2019</title><link>https://heyvaldemar.com/configure-exchange-server-2019/</link><guid isPermaLink="true">https://heyvaldemar.com/configure-exchange-server-2019/</guid><description>Learn how to configure Exchange Server 2019 with step-by-step instructions for mailbox databases, DNS records, certificates, send connectors, and more.</description><pubDate>Fri, 29 Nov 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and clear guide on how to configure Exchange Server 2019.&lt;/p&gt;
&lt;p&gt;:::important
We will consider the case when you already have two servers with the Windows Server 2019 operating system installed on them. In addition, one of the servers must have the Active Directory Domain Services role installed, and the second server must have Exchange Server 2019 installed.
:::&lt;/p&gt;
&lt;p&gt;:::note
For step-by-step instructions on installing Exchange Server 2019 on Windows Server 2019, refer to my guide: &lt;a href=&quot;/install-exchange-server-2019-on-windows-server-2019/&quot;&gt;Install Exchange Server 2019 on Windows Server 2019&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
To learn how to install Active Directory Domain Services on Windows Server 2019, read: &lt;a href=&quot;/install-active-directory-domain-services-on-windows-server-2019/&quot;&gt;Install Active Directory Domain Services on Windows Server 2019&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;Open the Exchange Admin Center control panel, which is located at the link &lt;code&gt;https://heva-server-2/ecp&lt;/code&gt;, where &lt;code&gt;heva-server-2&lt;/code&gt; is the name of my Exchange server. Accordingly, you need to provide the name or IP address of your server.&lt;/p&gt;
&lt;p&gt;To access the Exchange Admin Center Control Panel, you will need to provide a username and password for an account that has Exchange Administrator rights.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-1.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s create a mailbox database.&lt;/p&gt;
&lt;p&gt;In the &quot;Servers&quot; section, select the &quot;Databases&quot; subsection and click on the &quot;+&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-2.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to specify a name for the new database and select an Exchange server with the &quot;Mailbox&quot; role.&lt;/p&gt;
&lt;p&gt;Specify the name of the database and click on the &quot;Browse&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-3.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the Exchange server with the &quot;Mailbox&quot; role and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-4.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to specify in which folder the mailbox database and its logs will be stored.&lt;/p&gt;
&lt;p&gt;:::note
You need to first create folders on the server in which you plan to store the database and its logs. In addition, it is better to store the database on a disk specially allocated for this task.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-5.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Database file path&quot; field, specify the folder where the database will be stored.&lt;/p&gt;
&lt;p&gt;In the &quot;Log folder path&quot; field, specify the folder in which the database logs will be stored.&lt;/p&gt;
&lt;p&gt;Check the &quot;Mount this database&quot; box and click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-6.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to restart the Microsoft Exchange Information Store service on the Exchange server.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-7.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Open &quot;Server Manager&quot; on the server with Exchange Server 2019 installed, then click on the &quot;Tools&quot; button in the upper right corner of the screen and select &quot;Services&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-8.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Right-click on the &quot;Microsoft Exchange Information Store&quot; service and select &quot;Restart&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-9.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;The service has restarted successfully and the new database is ready to go.&lt;/p&gt;
&lt;p&gt;Further, in the &quot;Servers&quot; section, select the &quot;Databases&quot; subsection, and then select a new database and double-click on it with the left mouse button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-10.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Limits&quot; section, you can configure the retention time for deleted mailboxes and letters.&lt;/p&gt;
&lt;p&gt;Specify the required values and click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-11.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s create a database for shared folders.&lt;/p&gt;
&lt;p&gt;In the &quot;Servers&quot; section, select the &quot;Databases&quot; subsection and click on the &quot;+&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-12.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify a name for the shared folder database and click the Browse button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-13.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the Exchange server with the &quot;Mailbox&quot; role and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-14.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to specify in which folder the database for public folders and its logs will be stored.&lt;/p&gt;
&lt;p&gt;:::note
You need to first create folders on the server in which you plan to store the database and its logs. In addition, it is better to store the database on a disk specially allocated for this task.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-15.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Database file path&quot; field, specify the folder where the database will be stored.&lt;/p&gt;
&lt;p&gt;In the &quot;Log folder path&quot; field, specify the folder in which the database logs will be stored.&lt;/p&gt;
&lt;p&gt;Check the &quot;Mount this database&quot; box and click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-16.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to restart the Microsoft Exchange Information Store service on the Exchange server.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-17.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 17&quot;&gt;&lt;/p&gt;
&lt;p&gt;We return to the &quot;Server Manager&quot; on the server with Exchange Server 2019 installed, click on the &quot;Tools&quot; button in the upper right corner of the screen, and select &quot;Services&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-18.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 18&quot;&gt;&lt;/p&gt;
&lt;p&gt;Right-click on the &quot;Microsoft Exchange Information Store&quot; service and select &quot;Restart&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-19.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 19&quot;&gt;&lt;/p&gt;
&lt;p&gt;The service has restarted successfully and the new database is ready to go.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-20.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 20&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, go to the &quot;Public Folders&quot; section.&lt;/p&gt;
&lt;p&gt;In the &quot;Public Folders&quot; section, select the &quot;Public Folder Mailboxes&quot; subsection and click on the &quot;+&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-21.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 21&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify a name for the public folder mailbox and in the &quot;Mailbox database&quot; section click on the &quot;Browse&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-22.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 22&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the database for shared folders and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-23.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 23&quot;&gt;&lt;/p&gt;
&lt;p&gt;Nothing can be changed in the &quot;Organization unit&quot; section.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-24.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 24&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the public folder mailbox is created, it appears under the Public Folder Mailboxes subsection.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-25.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 25&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s add the trusted domain.&lt;/p&gt;
&lt;p&gt;In the &quot;Mail Flow&quot; section, select the &quot;Accepted Domains&quot; subsection and click on the &quot;+&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-26.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 26&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Name&quot; and &quot;Accepted Domain&quot; fields, specify the domain that you want to add to the trusted ones, then select &quot;Authoritative Domain: E-mail is delivered only to valid recipients in this Exchange organization&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-27.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 27&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the domain is added to the trusted ones, it will appear in the &quot;Accepted Domains&quot; section.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-28.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 28&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to create a policy for generating mailing addresses.&lt;/p&gt;
&lt;p&gt;In the &quot;Mail Flow&quot; section, select the &quot;Email Address Policies&quot; subsection and click on the &quot;+&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-29.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 29&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to specify a name for the new policy and choose who it will be applied to, as well as determine how mail addresses will be generated in your organization.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, mailing addresses will be based on &quot;Alias&quot;.
:::&lt;/p&gt;
&lt;p&gt;Specify a name for the policy for generating postal addresses and click the &quot;+&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-30.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 30&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the main domain and select &quot;alias@contoso.com&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-31.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 31&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s add a second domain so that users can receive mail using the second domain name as well.&lt;/p&gt;
&lt;p&gt;Click on the &quot;+&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-32.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 32&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the second domain and select &quot;alias@contoso.com&quot;.&lt;/p&gt;
&lt;p&gt;Click the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-33.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 33&quot;&gt;&lt;/p&gt;
&lt;p&gt;After you have determined how mail addresses will be formed in your organization, click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-34.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 34&quot;&gt;&lt;/p&gt;
&lt;p&gt;Pay attention to the warning. In order for the policy to take effect, you must click on the &quot;Apply&quot; button in the &quot;E-mail Address Policies&quot; subsection.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-35.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 35&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the policy is added, it will appear in the &quot;E-mail Address Policies&quot; subsection with the &quot;Unapplied&quot; status.&lt;/p&gt;
&lt;p&gt;To apply a policy, select it and click on the &quot;Apply&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-36.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 36&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, a warning will appear stating that applying the policy may take a long time and you will not be able to perform other tasks while the policy is being applied.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Yes&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-37.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 37&quot;&gt;&lt;/p&gt;
&lt;p&gt;The policy for generating postal addresses has been successfully applied.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-38.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 38&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the policy is applied, it will appear in the &quot;E-mail Address Policies&quot; subsection with the &quot;Applied&quot; status.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-39.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 39&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to create a send connector: to be able to send mail outside the organization.&lt;/p&gt;
&lt;p&gt;In the &quot;Mail Flow&quot; section, select the &quot;Send Connectors&quot; subsection and click on the &quot;+&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-40.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 40&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify a name for the new Send Connector and select &quot;Internet&quot; in the &quot;Type&quot; section.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-41.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 41&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
In this example, mail will be sent according to MX records.
:::&lt;/p&gt;
&lt;p&gt;Select &quot;MX record associated with recipient domain&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-42.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 42&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to specify for which domains the new connector will work.&lt;/p&gt;
&lt;p&gt;Click on the &quot;+&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-43.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 43&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Full Qualified Domain Name (FQDN)&quot; field, enter &lt;code&gt;*&lt;/code&gt;. This way, the new Send Connector will handle all domains except yours.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-44.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 44&quot;&gt;&lt;/p&gt;
&lt;p&gt;After you have specified for which domains the new connector will work, click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-45.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 45&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to specify on which Exchange server the Send connector will be created.&lt;/p&gt;
&lt;p&gt;Click on the &quot;+&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-46.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 46&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the Exchange server on which the Send Connector will be created and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-47.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 47&quot;&gt;&lt;/p&gt;
&lt;p&gt;Everything is ready to create a send connector.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-48.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 48&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, in the &quot;Mail Flow&quot; section, select the &quot;Send Connectors&quot; subsection, then select a new send connector and double-click on it with the left mouse button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-49.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 49&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;General&quot; section of the &quot;Maximum send message size (MB)&quot; menu, you can configure the maximum size of mail attachments to be sent.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-50.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 50&quot;&gt;&lt;/p&gt;
&lt;p&gt;Further, in the &quot;Scoping&quot; section, in the &quot;Specify the FQDN this connector will provide in response to HELO or EHLO&quot; field, specify the name by which your mail server is accessible from the Internet.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-51.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 51&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Mail Flow&quot; section, select the &quot;Send Connectors&quot; subsection. Then click on the &quot;...&quot; button and select &quot;Organization transport settings&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-52.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 52&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Limits&quot; section, you can configure the maximum size of mail attachments for sending and receiving.&lt;/p&gt;
&lt;p&gt;Specify the required values and click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-53.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 53&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to provide your Exchange Server 2019 license key.&lt;/p&gt;
&lt;p&gt;In the &quot;Servers&quot; section, select the &quot;Servers&quot; subsection and click on the &quot;Edit&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-54.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 54&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;General&quot; section, specify the Exchange Server 2019 license key and click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-55.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 55&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to configure DNS records for the domain. To do this, you need to open a web browser and go to the control panel for external DNS records for your domain.&lt;/p&gt;
&lt;p&gt;This tutorial uses Amazon Route 53 to manage external DNS records for a domain.&lt;/p&gt;
&lt;p&gt;Go to the &lt;a href=&quot;https://console.aws.amazon.com&quot;&gt;AWS Management Console&lt;/a&gt;, sign in with an administrator account if prompted, and then click the &quot;Services&quot; button located in the upper-left corner of the screen.&lt;/p&gt;
&lt;p&gt;Next, in the &quot;Networking &amp;amp; Content Delivery&quot; section, select &quot;Route 53&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-56.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 56&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, select &quot;Hosted zones&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-57.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 57&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the domain for which you want to configure DNS records.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-58.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 58&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to create several DNS records to access the Exchange services.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Create Record Set&quot; button to create a new DNS record.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-59.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 59&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify &quot;mail&quot; in the &quot;Name&quot; field.&lt;/p&gt;
&lt;p&gt;In the &quot;Type&quot; field, select &quot;A - IPv4 address&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;TTL&quot; field, enter &quot;300&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Value&quot; field, indicate the IP address by which your mail server is accessible from the Internet and click on the &quot;Create&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-60.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 60&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Create Record Set&quot; button to create another DNS record.&lt;/p&gt;
&lt;p&gt;In the &quot;Name&quot; field, enter &quot;mx01&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Type&quot; field, select &quot;A - IPv4 address&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;TTL&quot; field, enter &quot;300&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Value&quot; field, indicate the IP address by which your mail server is accessible from the Internet and click on the &quot;Create&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-61.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 61&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Create Record Set&quot; button to create another DNS record.&lt;/p&gt;
&lt;p&gt;Specify &quot;autodiscover&quot; in the &quot;Name&quot; field.&lt;/p&gt;
&lt;p&gt;In the &quot;Type&quot; field, select &quot;A - IPv4 address&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;TTL&quot; field, enter &quot;300&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Value&quot; field, indicate the IP address by which your mail server is accessible from the Internet and click on the &quot;Create&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-62.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 62&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Create Record Set&quot; button to create another DNS record.&lt;/p&gt;
&lt;p&gt;Leave the &quot;Name&quot; field blank.&lt;/p&gt;
&lt;p&gt;In the &quot;Type&quot; field, select &quot;MX - Mail exchange&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;TTL&quot; field, enter &quot;300&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Value&quot; field, specify the priority &quot;10&quot;, then indicate the previously created A-record with the name &quot;mx01&quot; and click on the &quot;Create&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-63.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 63&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to make a request to your ISP to create a PTR record for your external IP address, where your mail server is accessible from the Internet. This is necessary in order for your IP address to resolve to a name.&lt;/p&gt;
&lt;p&gt;:::note
In this example, the IP 188.244.46.91 is translated to the name &lt;code&gt;mail.heyvaldemar.net&lt;/code&gt;.
:::&lt;/p&gt;
&lt;p&gt;Now you need to create an SPF (Sender Policy Framework). Thanks to SPF, you can check if the sender&apos;s domain has been tampered with. SPF allows you to specify a list of servers capable of sending mail messages on behalf of your domain.&lt;/p&gt;
&lt;p&gt;You can get parameters for SPF recording using the &lt;a href=&quot;https://dmarcly.com/tools/spf-dkim-dmarc-wizard/#intro&quot;&gt;SPF Wizard&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;SPF example: &lt;code&gt;v=spf1 mx a ip4:188.244.46.91 include:heyvaldemar.com -all&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Leave the &quot;Name&quot; field blank.&lt;/p&gt;
&lt;p&gt;In the &quot;Type&quot; field, select &quot;SPF - Sender Policy Framework&quot;.&lt;/p&gt;
&lt;p&gt;:::note
If there is no &quot;SPF&quot; record type in your control panel for external DNS records, then you need to select the &quot;TXT&quot; record type.
:::&lt;/p&gt;
&lt;p&gt;In the &quot;TTL&quot; field, enter &quot;300&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Value&quot; field, specify the SPF parameters obtained using the &lt;a href=&quot;https://dmarcly.com/tools/spf-dkim-dmarc-wizard/#intro&quot;&gt;SPF Wizard&lt;/a&gt; and click on the &quot;Create&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-64.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 64&quot;&gt;&lt;/p&gt;
&lt;p&gt;DNS records for the domain have been configured successfully.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-65.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 65&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to register the A-record on the internal DNS server.&lt;/p&gt;
&lt;p&gt;Open &quot;Server Manager&quot; on the domain controller, then click on the &quot;Tools&quot; button in the upper right corner of the screen and select &quot;DNS&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-66.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 66&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Forward Lookup Zones&quot; section, select the main domain and right-click on it, then select &quot;New Host (A or AAAA)&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-67.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 67&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Name (uses parent domain name if blank)&quot; field, specify &quot;Mail&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;IP address&quot; field, specify the IP address of the server on which Exchange Server 2019 is installed and click on the &quot;Add Host&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-68.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 68&quot;&gt;&lt;/p&gt;
&lt;p&gt;A record has been successfully added.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-69.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 69&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the A-record is added, it will appear in the list with the rest of the records.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-70.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 70&quot;&gt;&lt;/p&gt;
&lt;p&gt;For further configuration, you need a certification authority.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, the Active Directory Certificate Services role will be installed on a domain controller.
:::&lt;/p&gt;
&lt;p&gt;Go back to the &quot;Server Manager&quot; on the domain controller, then click on the &quot;Manage&quot; button in the upper right corner of the screen and select &quot;Add Roles and Features&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-71.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 71&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-72.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 72&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the installation type &quot;Role-based or feature-based installation&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-73.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 73&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, select the server on which the role will be installed.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-74.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 74&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the Active Directory Certificate Services role.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-75.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 75&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, the Role Installation Wizard will warn you that several components need to be installed to install the Active Directory Certificate Services role.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Add Features&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-76.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 76&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-77.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 77&quot;&gt;&lt;/p&gt;
&lt;p&gt;At the stage of adding components, we leave all the default values.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-78.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 78&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, the Role Installation Wizard invites you to learn more about the Active Directory Certificate Services role.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-79.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 79&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to select the required services.&lt;/p&gt;
&lt;p&gt;We select &quot;Certification Authority Web Enrollment&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-80.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 80&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, the Install Roles Wizard will warn you that several components need to be installed to install the Certification Authority Web Enrollment.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Add Features&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-81.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 81&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, select &quot;Online Responder&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-82.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 82&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Role Installation Wizard will warn you that several components need to be installed to install Online Responder.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Add Features&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-83.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 83&quot;&gt;&lt;/p&gt;
&lt;p&gt;After all the necessary services are selected, click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-84.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 84&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, the &quot;Role Installation Wizard&quot; will warn you that the &quot;Internet Information Services&quot; webserver role will be additionally installed for the &quot;Active Directory Certificate Services&quot; role.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-85.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 85&quot;&gt;&lt;/p&gt;
&lt;p&gt;At the stage of adding components, we leave all the default values.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-86.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 86&quot;&gt;&lt;/p&gt;
&lt;p&gt;To start the installation of the selected role, click on the &quot;Install&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-87.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 87&quot;&gt;&lt;/p&gt;
&lt;p&gt;The installation of the selected role and the components required for it has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-88.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 88&quot;&gt;&lt;/p&gt;
&lt;p&gt;Installation of the Active Directory Domain Services role is now complete.&lt;/p&gt;
&lt;p&gt;Now you need to configure the role.&lt;/p&gt;
&lt;p&gt;Click on the button &quot;Configure Active Directory Certificate Services on the destination server&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-89.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 89&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-90.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 90&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to select the services that you want to configure.&lt;/p&gt;
&lt;p&gt;Select &quot;Certification Authority&quot;, &quot;Certification Authority Web Enrollment&quot; and &quot;Online Responder&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-91.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 91&quot;&gt;&lt;/p&gt;
&lt;p&gt;The server is a member of the domain, so select &quot;Enterprise CA&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-92.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 92&quot;&gt;&lt;/p&gt;
&lt;p&gt;There are no other servers with the Active Directory Certificate Services role in the domain, so select &quot;Root CA&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-93.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 93&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to create a new private key.&lt;/p&gt;
&lt;p&gt;Select &quot;Create a new private key&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-94.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 94&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you can select the cryptography settings.&lt;/p&gt;
&lt;p&gt;Leave the settings unchanged and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-95.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 95&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Common name for this CA&quot; field, specify the name for the new certification authority and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-96.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 96&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now we select the validity period of the certificate and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-97.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 97&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you can specify where the certificate database and its logs will be stored.&lt;/p&gt;
&lt;p&gt;Leave the settings unchanged and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-98.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 98&quot;&gt;&lt;/p&gt;
&lt;p&gt;Everything is ready to configure the role.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Configure&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-99.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 99&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Active Directory Certificate Services role is now configured.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-100.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 100&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Close&quot; button to close the role installation window.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-101.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 101&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to enable the SAN (Subject Alternative Name) function on the CA server. This feature is useful when publishing the &quot;Autodiscover&quot; service.&lt;/p&gt;
&lt;p&gt;On the keyboard, press the key combination &quot;Win&quot; and &quot;x&quot; and in the menu that opens, select &quot;Windows PowerShell (Admin)&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-102.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 102&quot;&gt;&lt;/p&gt;
&lt;p&gt;We enable the SAN function using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;certutil -setreg policy\EditFlags +EDITF_ATTRIBUTESUBJECTALTNAME2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-103.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 103&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to restart the &quot;CertSvc&quot; service.&lt;/p&gt;
&lt;p&gt;Stop the &quot;CertSvc&quot; service using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;net stop certsvc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-104.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 104&quot;&gt;&lt;/p&gt;
&lt;p&gt;We start the &quot;CertSvc&quot; service using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;net start certsvc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-105.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 105&quot;&gt;&lt;/p&gt;
&lt;p&gt;Service &quot;CertSvc&quot; restarted successfully.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-106.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 106&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s make a request to create a new Exchange certificate.&lt;/p&gt;
&lt;p&gt;We return to the Exchange Admin Center control panel.&lt;/p&gt;
&lt;p&gt;In the &quot;Servers&quot; section, select the &quot;Certificates&quot; subsection and click on the &quot;+&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-107.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 107&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;Create a request for a certificate from a certification authority&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-108.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 108&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify a name for the new certificate and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-109.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 109&quot;&gt;&lt;/p&gt;
&lt;p&gt;Then leave the settings unchanged and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-110.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 110&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to specify the Exchange server where the certificate request will be stored.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Browse&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-111.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 111&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the Exchange server where the certificate request will be stored and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-112.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 112&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the Exchange server is specified, click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-113.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 113&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to specify the domain names that need to be included in the certificate for all types of access.&lt;/p&gt;
&lt;p&gt;Select &quot;Outlook Web App (when accessed from the Internet)&quot; and click on the &quot;Edit&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-114.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 114&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the name by which your mail server is accessible from the Internet for the &quot;Outlook Web App&quot; access type, and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-115.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 115&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select OAB (when accessed from the Internet) &quot;, and click on the&quot; Edit &quot;(Pencil) button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-116.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 116&quot;&gt;&lt;/p&gt;
&lt;p&gt;We indicate the name by which your mail server is accessible from the Internet for the access type &quot;OAB&quot;, and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-117.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 117&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;Exchange Web Services (when accessed from the Internet)&quot;, and click on the &quot;Edit&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-118.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 118&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the name by which your mail server is accessible from the Internet for the &quot;Exchange Web Services&quot; access type, and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-119.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 119&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;Exchange ActiveSync (when accessed from the Internet)&quot; and click on the &quot;Edit&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-120.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 120&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the name by which your mail server is accessible from the Internet for the &quot;Exchange ActiveSync&quot; access type, and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-121.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 121&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;POP&quot; and click on the &quot;Edit&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-122.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 122&quot;&gt;&lt;/p&gt;
&lt;p&gt;We indicate the name by which your mail server is accessible from the Internet for the &quot;POP&quot; access type, and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-123.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 123&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;IMAP&quot; and click on the &quot;Edit&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-124.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 124&quot;&gt;&lt;/p&gt;
&lt;p&gt;We indicate the name by which your mail server is accessible from the Internet for the type of access &quot;IMAP&quot;, and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-125.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 125&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;Outlook Anywhere&quot; and click on the &quot;Edit&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-126.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 126&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the name by which your mail server is accessible from the Internet for the &quot;Outlook Anywhere&quot; access type and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-127.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 127&quot;&gt;&lt;/p&gt;
&lt;p&gt;The domain names that must be included in the certificate for all types of access are indicated.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-128.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 128&quot;&gt;&lt;/p&gt;
&lt;p&gt;Below is a list of domains that will be included in the certificate.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-129.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 129&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you must specify the name of the organization, department, and geographic location of the company.&lt;/p&gt;
&lt;p&gt;This guide is based on an organization based in Los Angeles, USA.&lt;/p&gt;
&lt;p&gt;We indicate the necessary information and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-130.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 130&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to specify the folder where the Exchange certificate request will be saved.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, the certificate request will be saved to the local &quot;C&quot; drive on the Exchange server.
:::&lt;/p&gt;
&lt;p&gt;Specify where the Exchange certificate request will be saved and click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-131.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 131&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the certificate request is created, it will appear in the &quot;Certificates&quot; subsection with the &quot;Pending request&quot; status.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-132.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 132&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to validate your Exchange certificate with a CA.&lt;/p&gt;
&lt;p&gt;On the Exchange server, go to the link &lt;code&gt;http://heva-server-1/certsrv&lt;/code&gt;, where &lt;code&gt;heva-server-1&lt;/code&gt; is the name of my certification authority server. Accordingly, you need to specify the name of your server.&lt;/p&gt;
&lt;p&gt;We go under an account with administrator rights and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-133.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 133&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s add the address of the certification server to &quot;Trusted sites&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Add&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-134.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 134&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Add this website to the zone&quot; field, specify the address of the certification server and click on the &quot;Add&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-135.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 135&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-136.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 136&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now select &quot;Request a certificate&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-137.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 137&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, select &quot;Advanced certificate request&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-138.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 138&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now select &quot;Submit a certificate request by using a base-64-encoded CMC or PKCS #10 file, or submit a renewal request by using a base-64-encoded PKCS #7 file&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-139.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 139&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, open &quot;Explorer&quot; and go to the local drive &quot;C&quot; where the Exchange certificate request was saved.&lt;/p&gt;
&lt;p&gt;Click on the certificate request file twice with the left mouse button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-140.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 140&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Try an app on this PC&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-141.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 141&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;Notepad&quot; and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-142.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 142&quot;&gt;&lt;/p&gt;
&lt;p&gt;Copy the contents of the request file.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-143.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 143&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, insert the contents of the request file into the &quot;Saved Request&quot; field, then in the &quot;Certificate Template&quot; section, select &quot;Web Server&quot; and click on the &quot;Submit&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-144.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 144&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;DER encoded&quot; and click on the &quot;Download certificate&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-145.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 145&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Save&quot; menu, select &quot;Save as&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-146.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 146&quot;&gt;&lt;/p&gt;
&lt;p&gt;Assign a name and save the Exchange certificate to the Downloads folder.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-147.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 147&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to download the CA certificate.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Home&quot; button in the upper right corner of the screen.&lt;/p&gt;
&lt;p&gt;Select &quot;Download a CA certificate, certificate chain, or CRL&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-148.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 148&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Encoding method&quot; section, select &quot;DER&quot; and click on the &quot;Download CA certificate&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-149.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 149&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Save&quot; menu, select &quot;Save as&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-150.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 150&quot;&gt;&lt;/p&gt;
&lt;p&gt;We assign a name and save the certificate of the certification authority in the &quot;Downloads&quot; folder.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-151.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 151&quot;&gt;&lt;/p&gt;
&lt;p&gt;To successfully validate your Exchange certificate request, you must import the CA certificate into the Trusted Root Certification Authorities on the Exchange server.&lt;/p&gt;
&lt;p&gt;On the keyboard, press the key combination &quot;Win&quot; and &quot;R&quot;, then enter &quot;certlm.msc&quot; and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-152.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 152&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Certificates (Local Computer)&quot; section, select the &quot;Trusted Root Certification Authorities&quot; subsection, then right-click on the &quot;Certificates&quot; subsection and select &quot;All Tasks&quot;, then &quot;Import&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-153.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 153&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-154.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 154&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to specify the path to the certificate of the certification authority.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Browse&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-155.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 155&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the certificate of the certification authority and click on the &quot;Open&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-156.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 156&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the path to the certificate of the certification authority is indicated, click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-157.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 157&quot;&gt;&lt;/p&gt;
&lt;p&gt;Then leave the settings unchanged and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-158.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 158&quot;&gt;&lt;/p&gt;
&lt;p&gt;Everything is ready to import the certificate into the &quot;Trusted Root Certification Authorities&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-159.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 159&quot;&gt;&lt;/p&gt;
&lt;p&gt;The CA certificate has been successfully imported.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-160.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 160&quot;&gt;&lt;/p&gt;
&lt;p&gt;We return to the Exchange Admin Center control panel.&lt;/p&gt;
&lt;p&gt;In the &quot;Servers&quot; section, select the &quot;Certificates&quot; subsection. Then select the new Exchange certificate and click on the &quot;Complete&quot; button on the right.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-161.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 161&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to specify the path to the Exchange certificate.&lt;/p&gt;
&lt;p&gt;Specify the path to the Exchange certificate and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-162.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 162&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the certificate is confirmed, it will appear in the &quot;Certificates&quot; subsection with the &quot;Valid&quot; status.&lt;/p&gt;
&lt;p&gt;Now you need to assign a new Exchange certificate for SMTP and IIS services.&lt;/p&gt;
&lt;p&gt;Select a new certificate and double-click on it with the left mouse button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-163.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 163&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Services&quot; section, check the boxes for &quot;SMTP&quot;, &quot;IMAP&quot;, &quot;POP&quot;, and &quot;IIS&quot;, then click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-164.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 164&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, a warning will appear asking you to overwrite the existing certificate for SMTP.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-165.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 165&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the Exchange certificate is assigned to the services, the list of services in the &quot;Assigned to services&quot; field is updated.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-166.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 166&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, the Outlook Web App settings.&lt;/p&gt;
&lt;p&gt;In the &quot;Servers&quot; section, select the &quot;Virtual Directories&quot; subsection and select the &quot;owa (Default Web Site)&quot; virtual folder, and then double-click on it with the left mouse button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-167.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 167&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;General&quot; section, in the &quot;External URL&quot; field, specify the name by which your mail server is accessible from the Internet, and also specify &quot;/owa&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-168.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 168&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s configure user authorization by login without having to specify a domain.&lt;/p&gt;
&lt;p&gt;In the &quot;Authentication&quot; section in the &quot;Use forms-based authentication&quot; section, select &quot;User name only&quot;.&lt;/p&gt;
&lt;p&gt;Next, you need to select the main domain, click on the &quot;Browse&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-169.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 169&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the main domain and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-170.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 170&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the domain is specified, click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-171.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 171&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, a warning will appear asking you to restart IIS.&lt;/p&gt;
&lt;p&gt;IIS will restart later.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-172.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 172&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s write the address where your mail server is accessible from the Internet in the Exchange server configuration.&lt;/p&gt;
&lt;p&gt;In the &quot;Servers&quot; section, select the &quot;Virtual Directories&quot; subsection and select the &quot;ecp (Default Web Site)&quot; virtual folder, and then double-click on it with the left mouse button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-173.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 173&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;General&quot; section, in the &quot;External URL&quot; field, specify the name by which your mail server is accessible from the Internet, and also specify &quot;/ecp&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-174.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 174&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Servers&quot; section, select the &quot;Virtual Directories&quot; subsection and select the &quot;EWS (Default Web Site)&quot; virtual folder, and then double-click on it with the left mouse button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-175.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 175&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;General&quot; section, in the &quot;External URL&quot; field, specify the name by which your mail server is accessible from the Internet, and also specify &quot;/EWS/Exchange.asmx&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-176.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 176&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Servers&quot; section, select the &quot;Virtual Directories&quot; subsection and select the &quot;mapi (Default Web Site)&quot; virtual folder, and then double-click on it with the left mouse button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-177.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 177&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;General&quot; section, in the &quot;External URL&quot; field, specify the name by which your mail server is accessible from the Internet, and also specify &quot;/mapi&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-178.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 178&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Servers&quot; section, select the &quot;Virtual Directories&quot; subsection and select the &quot;Microsoft-Server-ActiveSync (Default Web Site)&quot; virtual folder, and then double-click on it with the left mouse button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-179.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 179&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;General&quot; section, in the &quot;External URL&quot; field, specify the name by which your mail server is accessible from the Internet, and also specify &quot;/Microsoft-Server-ActiveSync&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-180.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 180&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Servers&quot; section, select the &quot;Virtual Directories&quot; subsection and select the &quot;OAB (Default Web Site)&quot; virtual folder, and then double-click on it with the left mouse button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-181.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 181&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;General&quot; section, in the &quot;External URL&quot; field, specify the name by which your mail server is accessible from the Internet, and also specify &quot;/OAB&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-182.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 182&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Servers&quot; section, select the &quot;Virtual Directories&quot; subsection and select the &quot;PowerShell (Default Web Site)&quot; virtual folder, and then double-click on it with the left mouse button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-183.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 183&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;General&quot; section, in the &quot;External URL&quot; field, specify the name by which your mail server is accessible from the Internet, and also specify &quot;/powershell&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-184.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 184&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s configure the Outlook Anywhere service. This service is used to connect to the Exchange server via the Internet using &quot;Outlook&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Servers&quot; section, select the &quot;Servers&quot; subsection, select the Exchange server, and double-click on it with the left mouse button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-185.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 185&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, in the &quot;Specify the external hostname such as contoso.com that users will use to connect to your organization&quot; field, specify the name by which your mail server is accessible from the Internet. Then, in the &quot;Specify the authentication method for external clients to use when connecting to your organization&quot; menu, select &quot;NTLM&quot; and uncheck the &quot;Allow SSL offloading&quot; checkbox.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-186.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 186&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s restart IIS.&lt;/p&gt;
&lt;p&gt;On the keyboard, press the key combination &quot;Win&quot; and &quot;x&quot; and in the menu that opens, select &quot;Windows PowerShell (Admin)&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-187.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 187&quot;&gt;&lt;/p&gt;
&lt;p&gt;Restart IIS using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;iisreset /noforce
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-188.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 188&quot;&gt;&lt;/p&gt;
&lt;p&gt;IIS restarted successfully.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-189.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 189&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s configure the ability to receive mail.&lt;/p&gt;
&lt;p&gt;In the &quot;Mail Flow&quot; section, select the &quot;Receive Connectors&quot; subsection, select the &quot;Default Frontend HEVA-SERVER-2&quot; receive connector, where &lt;code&gt;HEVA-SERVER-2&lt;/code&gt; is the name of my Exchange server. Then click on it twice with the left mouse button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-190.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 190&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;General&quot; section, in the &quot;Maximum receive message size&quot; field, you can configure the maximum allowable size of mail attachments for receiving.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-191.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 191&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Security&quot; section, check for a checkmark on the &quot;Anonymous users&quot; item.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-192.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 192&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s create a new user with a mailbox.&lt;/p&gt;
&lt;p&gt;In the &quot;Recipients&quot; section, select the &quot;Mailboxes&quot; subsection.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-193.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 193&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;+&quot; button and select &quot;User mailbox&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-194.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 194&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now we specify the alias, first, and the last name for the new user.&lt;/p&gt;
&lt;p&gt;Then you need to select the organization unit in which you plan to create a new user.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Browse&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-195.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 195&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the OU in which you want to place the new user, and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-196.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 196&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;User logon name&quot; field, specify the login for the new user.&lt;/p&gt;
&lt;p&gt;Next, specify a strong password and click on the &quot;More options&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-197.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 197&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to select the database in which the mailbox will be created for the new user.&lt;/p&gt;
&lt;p&gt;In the &quot;Mailbox database&quot; section, click on the &quot;Browse&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-198.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 198&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the mailbox database and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-199.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 199&quot;&gt;&lt;/p&gt;
&lt;p&gt;Everything is ready to create a user with a mailbox.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-200.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 200&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the user with the mailbox is created, it will appear in the &quot;Mailboxes&quot; section.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-201.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 201&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to import the Exchange certificate into Trusted Root Certification Authorities on all computers in the domain.&lt;/p&gt;
&lt;p&gt;Go to the domain controller, create a folder and copy the Exchange certificate into it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-202.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 202&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, the certificate was copied to the &quot;ExchangeCertificate&quot; folder on the &quot;C&quot; drive.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-203.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 203&quot;&gt;&lt;/p&gt;
&lt;p&gt;Go back to &quot;Server Manager&quot; on the domain controller, then click on the &quot;Tools&quot; button in the upper right corner of the screen and select &quot;Group Policy Management&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-204.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 204&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s create a new Group Policy to import the certificate into Trusted Root Certification Authorities on all computers in the domain.&lt;/p&gt;
&lt;p&gt;Right-click on the domain name and select &quot;Create a GPO in this domain, and Link it here&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-205.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 205&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify a name for the new group policy and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-206.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 206&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, click on the new policy with the right mouse button and select &quot;Edit&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-207.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 207&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the Group Policy Editor, go to the &quot;Computer Configuration&quot; section, then to the &quot;Windows Settings&quot; subsection, then find the &quot;Security Settings&quot; section and select &quot;Public Key Policies&quot;, now right-click on &quot;Trusted Root Certification Authorities&quot; and select &quot; Import &quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-208.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 208&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-209.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 209&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to specify the path to the Exchange certificate.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Browse&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-210.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 210&quot;&gt;&lt;/p&gt;
&lt;p&gt;Go to the folder with the Exchange certificate and click on the &quot;Open&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-211.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 211&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the path to the certificate is specified, click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-212.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 212&quot;&gt;&lt;/p&gt;
&lt;p&gt;Then leave the settings unchanged and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-213.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 213&quot;&gt;&lt;/p&gt;
&lt;p&gt;Everything is ready to import the certificate into the &quot;Trusted Root Certification Authorities&quot; for all computers in the domain.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-214.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 214&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Exchange certificate has been successfully imported into Group Policy settings.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-215.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 215&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the certificate is imported into Group Policy settings, it will appear in the &quot;Trusted Root Certification Authorities&quot; section.&lt;/p&gt;
&lt;p&gt;The Exchange certificate will now be imported to all computers covered by this policy.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2019-216.webp&quot; alt=&quot;Configure Exchange Server 2019 - Step 216&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Exchange Server</category><category>Microsoft</category><category>Email</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Exchange Server 2019 on Windows Server 2019</title><link>https://heyvaldemar.com/install-exchange-server-2019-on-windows-server-2019/</link><guid isPermaLink="true">https://heyvaldemar.com/install-exchange-server-2019-on-windows-server-2019/</guid><description>Step-by-step guide to install Exchange Server 2019 on Windows Server 2019, including prerequisites, Active Directory setup, and admin tips.</description><pubDate>Mon, 25 Nov 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Exchange Server 2019 on Windows Server 2019.&lt;/p&gt;
&lt;p&gt;:::warning
This guide walks you through installing Exchange Server 2016 without implementing failover.
:::&lt;/p&gt;
&lt;p&gt;:::note
The official hardware requirements for Exchange 2019 are detailed on &lt;a href=&quot;https://docs.microsoft.com/en-us/Exchange/plan-and-deploy/system-requirements?view=exchserver-2019&quot;&gt;Microsoft&apos;s website&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::important
We will consider the case when you already have two servers with the Windows Server 2019 operating system installed on them. In addition, one of the servers must have the Active Directory Domain Services role installed.&lt;/p&gt;
&lt;p&gt;For details on installing Windows Server 2019, read my guide: &lt;a href=&quot;/install-windows-server-2019/&quot;&gt;Install Windows Server 2019&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::important
In addition, one of the servers must have the Active Directory Domain Services role installed, and the second server must be domain joined.&lt;/p&gt;
&lt;p&gt;To learn how to install Active Directory Domain Services on Windows Server 2019, read: &lt;a href=&quot;/install-active-directory-domain-services-on-windows-server-2019/&quot;&gt;Install Active Directory Domain Services on Windows Server 2019&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
After installing Exchange Server 2019, follow my guide to complete the configuration: &lt;a href=&quot;/configure-exchange-server-2019/&quot;&gt;Configure Exchange Server 2019&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::important
This guide covers the installation of Exchange Server 2019 Cumulative Update 3 (Exchange 2019 CU3, released: September 2019). You need to download the current Cumulative Update at the time of reading the article. Each CU is a complete Exchange installation that includes updates and changes from all previous CUs. You don&apos;t need to install previous CUs or Exchange 2019 RTM.
:::&lt;/p&gt;
&lt;p&gt;:::warning
Windows Server 2019 requires all available updates to be installed before installing Exchange Server 2019.
:::&lt;/p&gt;
&lt;p&gt;On the future Exchange server, go to the system under an account that consists of the following groups: Enterprise Admins, Schema Admins, and Domain Admins.&lt;/p&gt;
&lt;p&gt;Before preparing Active Directory and installing Exchange Server 2019, you need to install additional software on the future Exchange server:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Visual C++ Redistributable Package for Visual Studio 2012&lt;/li&gt;
&lt;li&gt;Visual C++ Redistributable Package for Visual Studio 2013&lt;/li&gt;
&lt;li&gt;Unified Communications Managed API 4.0&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Install Visual C++ Redistributable Package for Visual Studio 2012.&lt;/p&gt;
&lt;p&gt;Go to the &lt;a href=&quot;https://www.microsoft.com/en-us/download/details.aspx?id=30679&quot;&gt;Microsoft download page&lt;/a&gt; and select the &quot;Download&quot; button to begin the process.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-1.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;VSU_4\vcredist_x64.exe&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-2.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Run the downloaded Visual C++ Redistributable Package for Visual Studio 2012 installer file.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-3.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you must accept the license terms, if you agree with them, and click on the &quot;Install&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-4.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Installation of Visual C++ Redistributable Package for Visual Studio 2012 completed successfully.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-5.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s install Visual C++ Redistributable Package for Visual Studio 2013.&lt;/p&gt;
&lt;p&gt;Navigate to the &lt;a href=&quot;https://www.microsoft.com/en-us/download/details.aspx?id=40784&quot;&gt;official download page&lt;/a&gt; and click the &quot;Download&quot; button to get started.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-6.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;vcredist_x64.exe&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-7.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Run the downloaded Visual C++ Redistributable Package for Visual Studio 2013 installer file.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-8.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you must accept the license terms, if you agree with them, and click on the &quot;Install&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-9.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Installation of Visual C++ Redistributable Package for Visual Studio 2013 completed successfully.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-10.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s install Unified Communications Managed API 4.0.&lt;/p&gt;
&lt;p&gt;Visit the &lt;a href=&quot;https://www.microsoft.com/en-us/download/details.aspx?id=34992&quot;&gt;Microsoft download page&lt;/a&gt; and click the &quot;Download&quot; button to proceed.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-11.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;Run the downloaded Unified Communications Managed API 4.0 installer file.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-12.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;The &quot;Unified Communications Managed API 4.0 Installation Wizard&quot; will open.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-13.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you must accept the license terms, if you agree with them, and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-14.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;The installation process for &quot;Unified Communications Managed API 4.0&quot; has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-15.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;Installation of &quot;Unified Communications Managed API 4.0&quot; completed successfully.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-16.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to install the remote administration tools to prepare Active Directory for the Exchange Serve 2019 installation, as well as other components required for the Exchange server to work.&lt;/p&gt;
&lt;p&gt;On the keyboard, press the key combination &quot;Win&quot; and &quot;x&quot; and in the menu that opens, select &quot;Windows PowerShell (Admin)&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-17.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 17&quot;&gt;&lt;/p&gt;
&lt;p&gt;Install the remote administration tools for the subsequent preparation of Active Directory for the installation of Exchange Server 2019 using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Install-WindowsFeature RSAT-ADDS
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-18.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 18&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of installing the remote administration tools has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-19.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 19&quot;&gt;&lt;/p&gt;
&lt;p&gt;The installation process for the remote administration tools has completed successfully.&lt;/p&gt;
&lt;p&gt;Next, you need to install the prerequisites for Lync Server or Skype for Business Server using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Install-WindowsFeature Server-Media-Foundation
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-20.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 20&quot;&gt;&lt;/p&gt;
&lt;p&gt;The prerequisites installation process for Lync Server or Skype for Business has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-21.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 21&quot;&gt;&lt;/p&gt;
&lt;p&gt;Installation of prerequisites for Lync Server or Skype for Business completed successfully.&lt;/p&gt;
&lt;p&gt;Now you need to install additional components required for the Exchange server using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Install-WindowsFeature NET-Framework-45-Features, RPC-over-HTTP-proxy, RSAT-Clustering, RSAT-Clustering-CmdInterface, RSAT-Clustering-Mgmt, RSAT-Clustering-PowerShell, WAS-Process-Model, Web-Asp-Net45, Web-Basic-Auth, Web-Client-Auth, Web-Digest-Auth, Web-Dir-Browsing, Web-Dyn-Compression, Web-Http-Errors, Web-Http-Logging, Web-Http-Redirect, Web-Http-Tracing, Web-ISAPI-Ext, Web-ISAPI-Filter, Web-Lgcy-Mgmt-Console, Web-Metabase, Web-Mgmt-Console, Web-Mgmt-Service, Web-Net-Ext45, Web-Request-Monitor, Web-Server, Web-Stat-Compression, Web-Static-Content, Web-Windows-Auth, Web-WMI, Windows-Identity-Foundation, RSAT-ADDS
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-22.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 22&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of installing additional components required for the Exchange Server has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-23.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 23&quot;&gt;&lt;/p&gt;
&lt;p&gt;The installation of the additional components required for the Exchange Server has been completed successfully.&lt;/p&gt;
&lt;p&gt;Now you need to reboot the server.&lt;/p&gt;
&lt;p&gt;On the keyboard, press the key combination &quot;Win&quot; and &quot;x&quot;, in the menu that opens, select &quot;Shut down or sign out&quot;, then &quot;Restart&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-24.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 24&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the window that opens, select &quot;Other (Planned)&quot; and click on the &quot;Continue&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-25.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 25&quot;&gt;&lt;/p&gt;
&lt;p&gt;The server will start to reboot.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-26.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 26&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to prepare Active Directory to work with Exchange Server.&lt;/p&gt;
&lt;p&gt;On the future Exchange server, go to the system under an account that consists of the following groups: Enterprise Admins, Schema Admins, and Domain Admins.&lt;/p&gt;
&lt;p&gt;On the keyboard, press the key combination &quot;Win&quot; and &quot;x&quot; and in the menu that opens, select &quot;Windows PowerShell (Admin)&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-27.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 27&quot;&gt;&lt;/p&gt;
&lt;p&gt;Go to drive &quot;D&quot; (virtual drive), where the Exchange Server 2019 installation files are located, using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;cd D:\
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-28.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 28&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s prepare the Active Directory schema to work with Exchange Server using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;E:\Setup.exe /IAcceptExchangeServerLicenseTerms_DiagnosticDataON /PrepareSchema

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-29.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 29&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of preparing the Active Directory schema has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-30.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 30&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Active Directory schema preparation process completed successfully.&lt;/p&gt;
&lt;p&gt;Now you need to prepare containers, objects, and other Active Directory components and create the Exchange organization.&lt;/p&gt;
&lt;p&gt;:::note
After &quot;OrganizationName&quot; you must indicate the name of your organization in English.
:::&lt;/p&gt;
&lt;p&gt;Let&apos;s prepare containers, objects, and other Active Directory components, as well as create an Exchange organization, using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;E:\Setup.exe /IAcceptExchangeServerLicenseTerms_DiagnosticDataON /PrepareAD /OrganizationName:&quot;heyvaldemar&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
This manual uses the organization&apos;s name &quot;heyvaldemar&quot;.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-31.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 31&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of preparing containers, objects, and other Active Directory components has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-32.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 32&quot;&gt;&lt;/p&gt;
&lt;p&gt;The preparation process for containers, objects, and other Active Directory components has been completed successfully.&lt;/p&gt;
&lt;p&gt;Now you need to prepare the domain for the Exchange Server installation.&lt;/p&gt;
&lt;p&gt;Prepare a domain for installing Exchange Server using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;E:\Setup.exe /IAcceptExchangeServerLicenseTerms_DiagnosticDataON /PrepareDomain:heyvaldemar.net
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
This tutorial uses the &lt;code&gt;heyvaldemar.net&lt;/code&gt; domain.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-33.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 33&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of preparing the domain has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-34.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 34&quot;&gt;&lt;/p&gt;
&lt;p&gt;The domain preparation process has completed successfully.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-35.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 35&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you can start installing Exchange Server 2019.&lt;/p&gt;
&lt;p&gt;Go to drive &quot;D&quot; (virtual drive) where the Exchange Server 2019 installation files are located and run &quot;Setup.exe&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-36.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 36&quot;&gt;&lt;/p&gt;
&lt;p&gt;At this point, you can check for updates to Exchange Server 2019.&lt;/p&gt;
&lt;p&gt;Select &quot;Connect to the Internet and check for updates&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-37.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 37&quot;&gt;&lt;/p&gt;
&lt;p&gt;There are currently no updates for Exchange Server 2019.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-38.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 38&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, the &quot;Exchange Server Setup Wizard&quot; invites you to familiarize yourself with information regarding Exchange Server 2019.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-39.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 39&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you must accept the license terms, if you agree with them, and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-40.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 40&quot;&gt;&lt;/p&gt;
&lt;p&gt;We select &quot;Don&apos;t use recommended settings&quot; so that the Exchange server does not automatically send error reports and other information on the use of the Exchange server to Microsoft.&lt;/p&gt;
&lt;p&gt;Click &quot;Next&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-41.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 41&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to choose which roles will be installed on your server.&lt;/p&gt;
&lt;p&gt;Select &quot;Mailbox role&quot;, then select &quot;Automatically install Windows Server roles and features that are required to install Exchange Server&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-42.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 42&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you can select the directory where Exchange Server 2019 should be installed.&lt;/p&gt;
&lt;p&gt;Leave the settings unchanged and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-43.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 43&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can now configure your anti-malware settings.&lt;/p&gt;
&lt;p&gt;In the &quot;Disable malware scanning&quot; item, select &quot;No&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-44.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 44&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, the process of checking readiness for installation will begin, after it is completed, you can start the installation process for Exchange Server 2019.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Install&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-45.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 45&quot;&gt;&lt;/p&gt;
&lt;p&gt;The installation process for Exchange Server 2019 has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-46.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 46&quot;&gt;&lt;/p&gt;
&lt;p&gt;Exchange Server 2019 installation completed successfully.&lt;/p&gt;
&lt;p&gt;Select &quot;Launch Exchange Administration Center after finishing Exchange setup&quot; and click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-47.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 47&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
The Exchange Administration Center is used to administer the Exchange server, available at &lt;code&gt;https://heva-server-2/ecp&lt;/code&gt;, where &lt;code&gt;heva-server-2&lt;/code&gt; is the name of my Exchange server. Accordingly, you need to specify the name or IP address of your server with Exchange Server 2019 installed.
:::&lt;/p&gt;
&lt;p&gt;To display the Exchange Administration Center Control Panel correctly, you must add the Exchange Server address to Trusted Sites in Internet Explorer.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Add&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-48.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 48&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Add this website to the zone&quot; field, specify the address of the Exchange server and click on the &quot;Add&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-49.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 49&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Exchange server address has been added to the list of trusted sites.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-50.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 50&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to specify the username and password of an account with Exchange administrator rights and click on the &quot;Sign in&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-51.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 51&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Exchange Admin Center Control Panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-52.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 52&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can now check the status of the Exchange Server services.&lt;/p&gt;
&lt;p&gt;From the Start menu, find &quot;Microsoft Exchange Server 2019&quot; and select &quot;Exchange Management Shell&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-53.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 53&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s check the status of the Exchange Server services using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Test-ServiceHealth
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-54.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 54&quot;&gt;&lt;/p&gt;
&lt;p&gt;Service check completed successfully.&lt;/p&gt;
&lt;p&gt;A &quot;True&quot; value in &quot;RequireServiceRunning&quot; indicates that the services are running.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2019-on-windows-server-2019-55.webp&quot; alt=&quot;Install Exchange Server 2019 on Windows Server 2019 - Step 55&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Exchange Server</category><category>Windows Server</category><category>Email</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Configure Amazon S3 for Rocket.Chat File Sharing</title><link>https://heyvaldemar.com/configure-amazon-s3-for-rocket-chat-file-sharing/</link><guid isPermaLink="true">https://heyvaldemar.com/configure-amazon-s3-for-rocket-chat-file-sharing/</guid><description>Step-by-step guide to integrate Amazon S3 with Rocket.Chat for secure file sharing. Learn bucket setup, IAM policies, and S3 configuration best practices.</description><pubDate>Mon, 18 Nov 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and clear guide on how to configure Amazon S3 for Rocket.Chat file sharing.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.rocket.chat/&quot;&gt;Rocket.Chat&lt;/a&gt; is an open-source fully customizable communications platform developed in JavaScript for organizations with high standards of data protection.&lt;/p&gt;
&lt;p&gt;:::tip[Architecture Context]
Choose S3 for Rocket.Chat file storage when you need scalable, durable object storage with fine-grained IAM policies. MinIO provides a self-hosted S3-compatible alternative for on-premises deployments. S3 is the right choice when your infrastructure already runs on AWS. MinIO is justified when data residency requires on-premises storage or when you need to avoid cloud egress costs.
:::&lt;/p&gt;
&lt;p&gt;:::note
For details on installing Rocket.Chat on Ubuntu Server, read my guide: &lt;a href=&quot;/install-rocket-chat-on-ubuntu-server/&quot;&gt;Install Rocket.Chat on Ubuntu Server&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::important
You must have an account with administrator rights to Amazon Web Services.
:::&lt;/p&gt;
&lt;p&gt;:::important
To set up file sharing, you need to have administrator rights in Rocket.Chat.
:::&lt;/p&gt;
&lt;p&gt;First, let&apos;s create a bucket using Amazon S3. It will allow you to store files that Rocket.Chat users will exchange.&lt;/p&gt;
&lt;p&gt;Go to the &lt;a href=&quot;https://console.aws.amazon.com/s3/&quot;&gt;Amazon S3 Console&lt;/a&gt;, sign in with an account that has administrator rights (if necessary), and click the &quot;Create bucket&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-amazon-s3-for-rocket-chat-file-sharing-1.webp&quot; alt=&quot;Configure Amazon S3 for Rocket.Chat File Sharing - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Bucket name&quot; field, specify a unique DNS-compatible name for the bucket.&lt;/p&gt;
&lt;p&gt;Note a few important things when creating a new bucket name:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The bucket name must be unique across all existing buckets in Amazon S3.&lt;/li&gt;
&lt;li&gt;Once the basket is created, you cannot change its name.&lt;/li&gt;
&lt;li&gt;Choose a bucket name that reflects the purpose of the items you plan to store in it. This is important because the bucket name appears in the URL that points to the items in it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::note
This tutorial will use &quot;rocketchat-heyvaldemar&quot; as the bucket name.
:::&lt;/p&gt;
&lt;p&gt;In the &quot;Region&quot; field, indicate the desired region in which the basket will be created.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Create&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-amazon-s3-for-rocket-chat-file-sharing-2.webp&quot; alt=&quot;Configure Amazon S3 for Rocket.Chat File Sharing - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;The cart has been successfully created.&lt;/p&gt;
&lt;p&gt;Now you need to configure the access rights to the basket so that Rocket.Chat users can share files using this basket.&lt;/p&gt;
&lt;p&gt;We select the previously created basket.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-amazon-s3-for-rocket-chat-file-sharing-3.webp&quot; alt=&quot;Configure Amazon S3 for Rocket.Chat File Sharing - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Go to the &quot;Permissions&quot; tab, then select &quot;CORS configuration&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-amazon-s3-for-rocket-chat-file-sharing-4.webp&quot; alt=&quot;Configure Amazon S3 for Rocket.Chat File Sharing - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, we insert the following configuration for the basket to work.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;CORSConfiguration xmlns=&quot;http://s3.amazonaws.com/doc/2006-03-01/&quot;&amp;gt;
&amp;lt;CORSRule&amp;gt;
	&amp;lt;AllowedOrigin&amp;gt;https://rocketchat.heyvaldemar.net&amp;lt;/AllowedOrigin&amp;gt;
	&amp;lt;AllowedMethod&amp;gt;PUT&amp;lt;/AllowedMethod&amp;gt;
	&amp;lt;AllowedMethod&amp;gt;POST&amp;lt;/AllowedMethod&amp;gt;
	&amp;lt;AllowedMethod&amp;gt;GET&amp;lt;/AllowedMethod&amp;gt;
	&amp;lt;AllowedMethod&amp;gt;HEAD&amp;lt;/AllowedMethod&amp;gt;
	&amp;lt;MaxAgeSeconds&amp;gt;3000&amp;lt;/MaxAgeSeconds&amp;gt;
	&amp;lt;AllowedHeader&amp;gt;*&amp;lt;/AllowedHeader&amp;gt;
&amp;lt;/CORSRule&amp;gt;
&amp;lt;/CORSConfiguration&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
In this guide, you will use the &lt;code&gt;rocketchat.heyvaldemar.net&lt;/code&gt; subdomain to access Rocket.Chat from the Internet. You will need to specify your domain or subdomain by which Rocket.Chat will be accessible from the Internet.
:::&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-amazon-s3-for-rocket-chat-file-sharing-5.webp&quot; alt=&quot;Configure Amazon S3 for Rocket.Chat File Sharing - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;The changes were saved successfully.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-amazon-s3-for-rocket-chat-file-sharing-6.webp&quot; alt=&quot;Configure Amazon S3 for Rocket.Chat File Sharing - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to create a policy to access the previously created S3 bucket.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Services&quot; button and select &quot;IAM&quot; in the &quot;Security, Identity &amp;amp; Compliance&quot; section.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-amazon-s3-for-rocket-chat-file-sharing-7.webp&quot; alt=&quot;Configure Amazon S3 for Rocket.Chat File Sharing - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, go to the &quot;Policies&quot; section and click on the &quot;Create policy&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-amazon-s3-for-rocket-chat-file-sharing-8.webp&quot; alt=&quot;Configure Amazon S3 for Rocket.Chat File Sharing - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Go to the &quot;JSON&quot; tab.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-amazon-s3-for-rocket-chat-file-sharing-9.webp&quot; alt=&quot;Configure Amazon S3 for Rocket.Chat File Sharing - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Insert the following parameters for the policy.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
    &quot;Version&quot;: &quot;2012-10-17&quot;,
    &quot;Statement&quot;: [
        {
            &quot;Effect&quot;: &quot;Allow&quot;,
            &quot;Action&quot;: [
                &quot;s3:ListAllMyBuckets&quot;
            ],
            &quot;Resource&quot;: &quot;arn:aws:s3:::*&quot;
        },
        {
            &quot;Effect&quot;: &quot;Allow&quot;,
            &quot;Action&quot;: [
                &quot;s3:ListBucket&quot;,
                &quot;s3:GetBucketLocation&quot;
            ],
            &quot;Resource&quot;: &quot;arn:aws:s3:::rocketchat-heyvaldemar&quot;
        },
        {
            &quot;Effect&quot;: &quot;Allow&quot;,
            &quot;Action&quot;: [
                &quot;s3:PutObject&quot;,
                &quot;s3:PutObjectAcl&quot;,
                &quot;s3:GetObject&quot;,
                &quot;s3:GetObjectAcl&quot;,
                &quot;s3:DeleteObject&quot;
            ],
            &quot;Resource&quot;: &quot;arn:aws:s3:::rocketchat-heyvaldemar/*&quot;
        }
    ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This guide uses &quot;rocketchat-heyvaldemar&quot; as the bucket name. You will need to provide your cart name.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Review policy&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-amazon-s3-for-rocket-chat-file-sharing-10.webp&quot; alt=&quot;Configure Amazon S3 for Rocket.Chat File Sharing - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Name&quot; field, specify the name for the new policy and click on the &quot;Create Policy&quot; button.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, &quot;RocketChatFileUpload&quot; will be used as the policy name to access the previously created bucket.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-amazon-s3-for-rocket-chat-file-sharing-11.webp&quot; alt=&quot;Configure Amazon S3 for Rocket.Chat File Sharing - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;The policy has been successfully created.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-amazon-s3-for-rocket-chat-file-sharing-12.webp&quot; alt=&quot;Configure Amazon S3 for Rocket.Chat File Sharing - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to create a new user and assign him the previously created basket access policy. This user will be required to connect Rocket.Chat to S3 bucket.&lt;/p&gt;
&lt;p&gt;Go to the &quot;Users&quot; section and click on the &quot;Add users&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-amazon-s3-for-rocket-chat-file-sharing-13.webp&quot; alt=&quot;Configure Amazon S3 for Rocket.Chat File Sharing - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;User name&quot; field, specify the name for the new user and click on the &quot;Next: Permissions&quot; button.&lt;/p&gt;
&lt;p&gt;:::note
In this manual, &quot;rocketchat-upload&quot; will be used as the username.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-amazon-s3-for-rocket-chat-file-sharing-14.webp&quot; alt=&quot;Configure Amazon S3 for Rocket.Chat File Sharing - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, select &quot;Attach existing policies directly&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-amazon-s3-for-rocket-chat-file-sharing-15.webp&quot; alt=&quot;Configure Amazon S3 for Rocket.Chat File Sharing - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the search bar, specify the name of the previously created policy and in the search result, select the desired policy.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, &quot;RocketChatFileUpload&quot; is used as the name of the policy to access the previously created bucket.
:::&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next: Tags&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-amazon-s3-for-rocket-chat-file-sharing-16.webp&quot; alt=&quot;Configure Amazon S3 for Rocket.Chat File Sharing - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, you do not have to make any changes.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next: Review&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-amazon-s3-for-rocket-chat-file-sharing-17.webp&quot; alt=&quot;Configure Amazon S3 for Rocket.Chat File Sharing - Step 17&quot;&gt;&lt;/p&gt;
&lt;p&gt;Everything is ready to create a new user.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Create user&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-amazon-s3-for-rocket-chat-file-sharing-18.webp&quot; alt=&quot;Configure Amazon S3 for Rocket.Chat File Sharing - Step 18&quot;&gt;&lt;/p&gt;
&lt;p&gt;The user has been successfully created and has the necessary permissions to access the previously created S3 bucket.&lt;/p&gt;
&lt;p&gt;Now you need to save the received &quot;Access key ID&quot; and &quot;Secret access key&quot;. This data will be needed to connect Rocket.Chat to a previously created basket.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Show&quot; button to display the contents of the &quot;Secret access key&quot; section and save the contents of the section to a safe place.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-amazon-s3-for-rocket-chat-file-sharing-19.webp&quot; alt=&quot;Configure Amazon S3 for Rocket.Chat File Sharing - Step 19&quot;&gt;&lt;/p&gt;
&lt;p&gt;The new user will appear in the &quot;Users&quot; section.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-amazon-s3-for-rocket-chat-file-sharing-20.webp&quot; alt=&quot;Configure Amazon S3 for Rocket.Chat File Sharing - Step 20&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now we need to find the code for the region in which the cart was created.&lt;/p&gt;
&lt;p&gt;Visit the &lt;a href=&quot;https://docs.aws.amazon.com/general/latest/gr/rande.html&quot;&gt;AWS documentation page&lt;/a&gt; and locate the appropriate region code in the &quot;Region&quot; column next to the &quot;Region Name.&quot; Make sure it matches the region where the bucket was created.&lt;/p&gt;
&lt;p&gt;:::note
In this manual, the bucket was created in the &quot;EU (Frankfurt)&quot; region, so the required region code value is &quot;eu-central-1&quot;.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-amazon-s3-for-rocket-chat-file-sharing-21.webp&quot; alt=&quot;Configure Amazon S3 for Rocket.Chat File Sharing - Step 21&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to specify the parameters for connecting Rocket.Chat to the previously created basket.&lt;/p&gt;
&lt;p&gt;Go to Rocket.Chat under an account with administrator rights, click on the icon with three dots in the upper left corner of the screen and select &quot;Administration&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-amazon-s3-for-rocket-chat-file-sharing-22.webp&quot; alt=&quot;Configure Amazon S3 for Rocket.Chat File Sharing - Step 22&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, we find the &quot;File Upload&quot; section.&lt;/p&gt;
&lt;p&gt;File Uploads Enabled must be set to True.&lt;/p&gt;
&lt;p&gt;Protect Uploaded Files must be set to True.&lt;/p&gt;
&lt;p&gt;File Uploads Enabled must be set to True.&lt;/p&gt;
&lt;p&gt;The &quot;Enable Json Web Tokens protection to file uploads&quot; parameter must be set to &quot;True&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Storage Type&quot; field, select &quot;AmazonS3&quot;.&lt;/p&gt;
&lt;p&gt;File Uploads Enabled in Direct Messages must be set to True.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save Changes&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-amazon-s3-for-rocket-chat-file-sharing-23.webp&quot; alt=&quot;Configure Amazon S3 for Rocket.Chat File Sharing - Step 23&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to specify the parameters in the &quot;Amazon S3&quot; subsection.&lt;/p&gt;
&lt;p&gt;In the &quot;Bucket name&quot; field, specify the name of the previously created bucket.&lt;/p&gt;
&lt;p&gt;In the &quot;Access Key&quot; field, specify the &quot;Access key ID&quot; obtained earlier after creating a user.&lt;/p&gt;
&lt;p&gt;In the &quot;Secret Key&quot; field, enter the &quot;Secret access key&quot; obtained earlier after creating the user.&lt;/p&gt;
&lt;p&gt;Enter the bucket region code, retrieved earlier from the &lt;a href=&quot;https://docs.aws.amazon.com/general/latest/gr/rande.html&quot;&gt;AWS region list&lt;/a&gt;, into the &quot;Region&quot; field.&lt;/p&gt;
&lt;p&gt;The &quot;Proxy Avatars&quot; parameter must be set to &quot;True&quot;.&lt;/p&gt;
&lt;p&gt;Proxy Uploads must be True.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save Changes&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-amazon-s3-for-rocket-chat-file-sharing-24.webp&quot; alt=&quot;Configure Amazon S3 for Rocket.Chat File Sharing - Step 24&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s upload a file from a computer to a common channel called IT to check the correctness of uploading files to Rocket.Chat using the Amazon S3 service.&lt;/p&gt;
&lt;p&gt;Open a channel in Rocket.Chat, then in the lower right corner of the screen, click on the plus icon and select &quot;Computer&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-amazon-s3-for-rocket-chat-file-sharing-25.webp&quot; alt=&quot;Configure Amazon S3 for Rocket.Chat File Sharing - Step 25&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the file you want to upload.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-amazon-s3-for-rocket-chat-file-sharing-26.webp&quot; alt=&quot;Configure Amazon S3 for Rocket.Chat File Sharing - Step 26&quot;&gt;&lt;/p&gt;
&lt;p&gt;The file is ready to upload.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Send&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-amazon-s3-for-rocket-chat-file-sharing-27.webp&quot; alt=&quot;Configure Amazon S3 for Rocket.Chat File Sharing - Step 27&quot;&gt;&lt;/p&gt;
&lt;p&gt;The file has been uploaded successfully and is available to all members of the IT channel in Rocket.Chat.&lt;/p&gt;
&lt;p&gt;Rocket.Chat users can now share files using the Amazon S3 service.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-amazon-s3-for-rocket-chat-file-sharing-28.webp&quot; alt=&quot;Configure Amazon S3 for Rocket.Chat File Sharing - Step 28&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>DevOps &amp; Cloud</category><category>AWS</category><category>S3</category><category>Rocket.Chat</category><category>Cloud Storage</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Rocket.Chat in Slack Color</title><link>https://heyvaldemar.com/rocket-chat-in-slack-color/</link><guid isPermaLink="true">https://heyvaldemar.com/rocket-chat-in-slack-color/</guid><description>Customize Rocket.Chat to look like Slack with this step-by-step guide. Learn how to apply Slack&apos;s color palette using Rocket.Chat&apos;s admin layout settings.</description><pubDate>Tue, 12 Nov 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and clear guide on how to make Rocket.Chat in Slack Color.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./rocket-chat-in-slack-color-1.webp&quot; alt=&quot;Rocket.Chat in Slack Color - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.rocket.chat/&quot;&gt;Rocket.Chat&lt;/a&gt; is an open-source fully customizable communications platform developed in JavaScript for organizations with high standards of data protection.&lt;/p&gt;
&lt;p&gt;:::note
For details on installing Rocket.Chat on Ubuntu Server, read my guide: &lt;a href=&quot;/install-rocket-chat-on-ubuntu-server/&quot;&gt;Install Rocket.Chat on Ubuntu Server&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::important
You need to have administrator rights in Rocket.Chat to change the color palette.
:::&lt;/p&gt;
&lt;p&gt;Click on the icon with three dots in the upper left corner of the screen and select &quot;Administration&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./rocket-chat-in-slack-color-2.webp&quot; alt=&quot;Rocket.Chat in Slack Color - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, find the &quot;Layout&quot; section and open the &quot;Colors&quot; subsection.&lt;/p&gt;
&lt;p&gt;Change the colors to the ones below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Primary: #3F0E40&lt;/li&gt;
&lt;li&gt;Primary Darkest: #350D36&lt;/li&gt;
&lt;li&gt;Primary Dark: #1164A3&lt;/li&gt;
&lt;li&gt;Primary Light: #FFFFFF&lt;/li&gt;
&lt;li&gt;Link Active: #1164A3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Click on the &quot;Save Changes&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./rocket-chat-in-slack-color-3.webp&quot; alt=&quot;Rocket.Chat in Slack Color - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Rocket.Chat will now look more like Slack.&lt;/p&gt;
&lt;p&gt;To update the color palette in the web interface and in the Rocket.Chat client for Windows and Linux, use the keyboard shortcut &quot;Ctrl&quot; and &quot;R&quot;.&lt;/p&gt;
&lt;p&gt;To update the color palette in the Rocket.Chat client for macOS, you must use the keyboard shortcut &quot;Command&quot; and &quot;R&quot;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>Self-Hosting</category><category>Rocket.Chat</category><category>Slack</category><category>CSS</category><category>Customization</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Windows Admin Center on Windows Server 2019 Server Core</title><link>https://heyvaldemar.com/install-windows-admin-center-on-windows-server-2019-server-core/</link><guid isPermaLink="true">https://heyvaldemar.com/install-windows-admin-center-on-windows-server-2019-server-core/</guid><description>Install Windows Admin Center on Windows Server 2019 Server Core — a PowerShell guide covering domain setup, secure access, and server management.</description><pubDate>Wed, 23 Oct 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Windows Admin Center on Windows Server 2019 Server Core.&lt;/p&gt;
&lt;p&gt;:::important
We will consider the case when you already have two servers with the Windows Server 2019 Server Core operating system installed on them.&lt;/p&gt;
&lt;p&gt;You can read more about how to install Windows Server 2019 in my guide &lt;a href=&quot;/install-windows-server-2019-server-core/&quot;&gt;Install Windows Server 2019 Server Core&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::important
In addition, one of the servers must have the Active Directory Domain Services role installed, and the second server must be domain joined.&lt;/p&gt;
&lt;p&gt;To learn how to install Active Directory Domain Services on Windows Server 2019, read: &lt;a href=&quot;/install-active-directory-domain-services-on-windows-server-2019/&quot;&gt;Install Active Directory Domain Services on Windows Server 2019&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To learn how to install Active Directory Domain Services on Windows Server 2019 Server Core (without a GUI), see my guide: &lt;a href=&quot;/install-active-directory-domain-services-on-windows-server-2019-server-core/&quot;&gt;Install Active Directory Domain Services on Windows Server 2019 Server Core&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
In this guide, &lt;code&gt;heva-server-2.heyvaldemar.net&lt;/code&gt; will be used as the name of the server on which Windows Admin Center is installed.
:::&lt;/p&gt;
&lt;p&gt;We go into the system under an account with administrator rights and start Windows PowerShell using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;powershell
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-admin-center-on-windows-server-2019-server-core-1.webp&quot; alt=&quot;Install Windows Admin Center on Windows Server 2019 Server Core - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Download the Windows Admin Center installer to the Temp folder using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Start-BitsTransfer -Source http://aka.ms/WACDownload -Destination C:\Windows\Temp\wac.msi
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-admin-center-on-windows-server-2019-server-core-2.webp&quot; alt=&quot;Install Windows Admin Center on Windows Server 2019 Server Core - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Windows Admin Center Installer download process has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-admin-center-on-windows-server-2019-server-core-3.webp&quot; alt=&quot;Install Windows Admin Center on Windows Server 2019 Server Core - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;The installer has been successfully downloaded to the &quot;Temp&quot; folder.&lt;/p&gt;
&lt;p&gt;Now let&apos;s start the Windows Admin Center installation using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;msiexec /i C:\Windows\Temp\wac.msi /qn /L*v log.txt SME_PORT=443 SSL_CERTIFICATE-OPTION=generate
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-admin-center-on-windows-server-2019-server-core-4.webp&quot; alt=&quot;Install Windows Admin Center on Windows Server 2019 Server Core - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Windows Admin Center has been successfully installed.&lt;/p&gt;
&lt;p&gt;To access the Windows Admin Center control panel, you need to go to the link &lt;code&gt;https://heva-server-2.heyvaldemar.net&lt;/code&gt; from a workstation, where &lt;code&gt;heva-server-2.heyvaldemar.net&lt;/code&gt; is the name of my server. Accordingly, you need to specify the name or IP address of your server with Windows Admin Center installed.&lt;/p&gt;
&lt;p&gt;:::note
In this manual, Google Chrome is used as the web browser to connect to the &quot;Windows Admin Center&quot;.
:::&lt;/p&gt;
&lt;p&gt;In the next step, you can see the warning &quot;Your connection is not private&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-admin-center-on-windows-server-2019-server-core-5.webp&quot; alt=&quot;Install Windows Admin Center on Windows Server 2019 Server Core - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the button &quot;Proceed to heva-server-2.heyvaldemar.net (unsafe)&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-admin-center-on-windows-server-2019-server-core-6.webp&quot; alt=&quot;Install Windows Admin Center on Windows Server 2019 Server Core - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to specify the username and password of an account with administrator rights on the server with Windows Admin Center installed.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Sign in&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-admin-center-on-windows-server-2019-server-core-7.webp&quot; alt=&quot;Install Windows Admin Center on Windows Server 2019 Server Core - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Windows Admin Center Control Panel.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Skip tour&quot; button to immediately start working with Windows Admin Center.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-admin-center-on-windows-server-2019-server-core-8.webp&quot; alt=&quot;Install Windows Admin Center on Windows Server 2019 Server Core - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s add the server that we plan to manage using Windows Admin Center.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Add&quot; button located in the upper left corner of the screen.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-admin-center-on-windows-server-2019-server-core-9.webp&quot; alt=&quot;Install Windows Admin Center on Windows Server 2019 Server Core - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the menu that opens, select &quot;Servers&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-admin-center-on-windows-server-2019-server-core-10.webp&quot; alt=&quot;Install Windows Admin Center on Windows Server 2019 Server Core - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to go to the &quot;Search Active Directory&quot; tab to add a server that is included in the domain.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-admin-center-on-windows-server-2019-server-core-11.webp&quot; alt=&quot;Install Windows Admin Center on Windows Server 2019 Server Core - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Server name&quot; field, specify the name of the server and click on the &quot;Search&quot; button.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, &lt;code&gt;heva-server-1.heyvaldemar.net&lt;/code&gt; will be used as the server that you plan to add to the Windows Admin Center.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-admin-center-on-windows-server-2019-server-core-12.webp&quot; alt=&quot;Install Windows Admin Center on Windows Server 2019 Server Core - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the found server and click on the &quot;Add&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-admin-center-on-windows-server-2019-server-core-13.webp&quot; alt=&quot;Install Windows Admin Center on Windows Server 2019 Server Core - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;The server has been successfully added to Windows Admin Center.&lt;/p&gt;
&lt;p&gt;Now you can connect to it and control it.&lt;/p&gt;
&lt;p&gt;We click once with the left mouse button on the server you plan to manage to connect to it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-admin-center-on-windows-server-2019-server-core-14.webp&quot; alt=&quot;Install Windows Admin Center on Windows Server 2019 Server Core - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to select &quot;Use another account for this connection&quot; and specify the username and password of an account with administrator rights on the server that you plan to manage.&lt;/p&gt;
&lt;p&gt;You can also check the box &quot;Use these credentials for all connections&quot; to use the specified account for other connections.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Continue&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-admin-center-on-windows-server-2019-server-core-15.webp&quot; alt=&quot;Install Windows Admin Center on Windows Server 2019 Server Core - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;The connection to the server has been successfully established.&lt;/p&gt;
&lt;p&gt;You can now manage the server using Windows Admin Center.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-admin-center-on-windows-server-2019-server-core-16.webp&quot; alt=&quot;Install Windows Admin Center on Windows Server 2019 Server Core - Step 16&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Windows Server</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Firmware for Kernel Drivers on Ubuntu</title><link>https://heyvaldemar.com/install-firmware-for-kernel-drivers-on-ubuntu/</link><guid isPermaLink="true">https://heyvaldemar.com/install-firmware-for-kernel-drivers-on-ubuntu/</guid><description>Learn how to install firmware for kernel drivers on Ubuntu using .deb packages to ensure hardware compatibility and system stability.</description><pubDate>Mon, 21 Oct 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing firmware for kernel drivers on Ubuntu.&lt;/p&gt;
&lt;p&gt;Visit the &lt;a href=&quot;https://mirrors.edge.kernel.org/ubuntu/pool/main/l/linux-firmware/&quot;&gt;linux-firmware directory&lt;/a&gt;, then locate and copy the URL of the latest &lt;code&gt;.deb&lt;/code&gt; file for the &quot;linux-firmware&quot; package.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-firmware-for-kernel-drivers-on-ubuntu-1.webp&quot; alt=&quot;Install Firmware for Kernel Drivers on Ubuntu - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Create a new directory for the &quot;linux-firmware&quot; package using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;mkdir /tmp/linux-firmware
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-firmware-for-kernel-drivers-on-ubuntu-2.webp&quot; alt=&quot;Install Firmware for Kernel Drivers on Ubuntu - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Go to the new directory using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd /tmp/linux-firmware
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-firmware-for-kernel-drivers-on-ubuntu-3.webp&quot; alt=&quot;Install Firmware for Kernel Drivers on Ubuntu - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Download the new version of the &quot;linux-headers&quot; package with the &quot;.deb&quot; extension using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;wget https://mirrors.edge.kernel.org/ubuntu/pool/main/l/linux-firmware/linux-firmware_1.183_all.deb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-firmware-for-kernel-drivers-on-ubuntu-4.webp&quot; alt=&quot;Install Firmware for Kernel Drivers on Ubuntu - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to install the downloaded package using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo dpkg -i *.deb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-firmware-for-kernel-drivers-on-ubuntu-5.webp&quot; alt=&quot;Install Firmware for Kernel Drivers on Ubuntu - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the password for the account and press &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-firmware-for-kernel-drivers-on-ubuntu-6.webp&quot; alt=&quot;Install Firmware for Kernel Drivers on Ubuntu - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;We reboot the operating system using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo reboot
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-firmware-for-kernel-drivers-on-ubuntu-7.webp&quot; alt=&quot;Install Firmware for Kernel Drivers on Ubuntu - Step 7&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Ubuntu</category><category>Linux</category><category>Kernel</category><category>Drivers</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Join Windows Server 2019 Server Core to a Domain</title><link>https://heyvaldemar.com/join-windows-server-2019-server-core-to-a-domain/</link><guid isPermaLink="true">https://heyvaldemar.com/join-windows-server-2019-server-core-to-a-domain/</guid><description>Step-by-step guide to joining Windows Server 2019 Server Core to a domain using PowerShell. Ideal for IT pros managing Active Directory environments.</description><pubDate>Fri, 06 Sep 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and clear guide on how to join Windows Server 2019 Server Core to a Domain.&lt;/p&gt;
&lt;p&gt;:::important
We will consider the case when you already have two servers with the Windows Server 2019 operating system installed on them. In addition, one of the servers must have the Active Directory Domain Services role installed.&lt;/p&gt;
&lt;p&gt;You can read more about how to install Windows Server 2019 in my guide &lt;a href=&quot;/install-windows-server-2019-server-core/&quot;&gt;Install Windows Server 2019 Server Core&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::important
To learn how to install Active Directory Domain Services on Windows Server 2019, read: &lt;a href=&quot;/install-active-directory-domain-services-on-windows-server-2019/&quot;&gt;Install Active Directory Domain Services on Windows Server 2019&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To learn how to install Active Directory Domain Services on Windows Server 2019 Server Core (without a GUI), see my guide: &lt;a href=&quot;/install-active-directory-domain-services-on-windows-server-2019-server-core/&quot;&gt;Install Active Directory Domain Services on Windows Server 2019 Server Core&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::important
Before joining a server to a domain, you must give the server a correct name according to your organization&apos;s standards, and then assign a static IP address, subnet mask, gateway, and the IP address of the domain controller as a DNS server in the network interface settings.
:::&lt;/p&gt;
&lt;p&gt;We go into the system under an account with administrator rights and start Windows PowerShell using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;powershell
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./join-windows-server-2019-server-core-to-a-domain-1.webp&quot; alt=&quot;Join Windows Server 2019 Server Core to a Domain - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
In this guide, the server joins the &lt;code&gt;heyvaldemar.net&lt;/code&gt; domain using an Administrator account that has domain administrator rights.
:::&lt;/p&gt;
&lt;p&gt;Join the server to the domain using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Add-Computer -DomainName heyvaldemar.net -Credential heyvaldemar\Administrator -Restart -Force
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./join-windows-server-2019-server-core-to-a-domain-2.webp&quot; alt=&quot;Join Windows Server 2019 Server Core to a Domain - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the password for an account with domain administrator rights and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./join-windows-server-2019-server-core-to-a-domain-3.webp&quot; alt=&quot;Join Windows Server 2019 Server Core to a Domain - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;After a reboot, the server will apply the security policies used in your domain.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./join-windows-server-2019-server-core-to-a-domain-4.webp&quot; alt=&quot;Join Windows Server 2019 Server Core to a Domain - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;After applying the security policies, the server will be ready to work.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./join-windows-server-2019-server-core-to-a-domain-5.webp&quot; alt=&quot;Join Windows Server 2019 Server Core to a Domain - Step 5&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Active Directory</category><category>Windows Server</category><category>PowerShell</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Active Directory Domain Services on Windows Server 2019</title><link>https://heyvaldemar.com/install-active-directory-domain-services-on-windows-server-2019/</link><guid isPermaLink="true">https://heyvaldemar.com/install-active-directory-domain-services-on-windows-server-2019/</guid><description>Step-by-step guide to install and configure Active Directory Domain Services (AD DS) on Windows Server 2019 using Server Manager.</description><pubDate>Fri, 30 Aug 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Active Directory Domain Services on Windows Server 2019.&lt;/p&gt;
&lt;p&gt;:::important
In this guide, we will consider the case when you already have a server with the Windows Server 2019 operating system installed on it.&lt;/p&gt;
&lt;p&gt;For details on installing Windows Server 2019, read my guide: &lt;a href=&quot;/install-windows-server-2019/&quot;&gt;Install Windows Server 2019&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
To learn how to install Active Directory Domain Services on Windows Server 2019 Server Core (without a GUI), read: &lt;a href=&quot;/install-active-directory-domain-services-on-windows-server-2019-server-core/&quot;&gt;Install Active Directory Domain Services on Windows Server 2019 Server Core&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::caution
Before installing the Active Directory Domain Services role, make sure to assign the server a proper name according to your organization&apos;s standards. Then, configure a static IP address, subnet mask, gateway, and DNS server address.
:::&lt;/p&gt;
&lt;p&gt;We go into the system under an account with administrator rights and on the keyboard press the combination of keys &quot;Win&quot; and &quot;X&quot;, then select &quot;System&quot; in the menu that opens.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-1.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Choose &quot;Rename this PC&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-2.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;I highly recommend that you think ahead about the name of the servers in your organization.&lt;/p&gt;
&lt;p&gt;Next, specify the new server name and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-3.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now the system will offer to restart the server for the new settings to take effect.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Restart now&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-4.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;Operating System: Reconfiguration (Planned)&quot; as the reason for the server reboot and click on the &quot;Continue&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-5.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, the server will start to reboot.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-6.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to register a static IP address in the network connection settings.&lt;/p&gt;
&lt;p&gt;We go into the system under an account with administrator rights and on the keyboard press the combination of keys &quot;Win&quot; and &quot;X&quot;, then select &quot;Network Connections&quot; in the menu that opens.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-7.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, select &quot;Change adapter options&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-8.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now right-click on the &quot;Ethernet&quot; network connection and select &quot;Properties&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-9.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;Internet Protocol Version 4&quot; and click on the &quot;Properties&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-10.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, select the &quot;Use the following IP address&quot; item and specify a free IP address, subnet mask, and gateway.&lt;/p&gt;
&lt;p&gt;:::note
You must understand in advance how your network works and know which IP addresses are available.
:::&lt;/p&gt;
&lt;p&gt;In the &quot;Preferred DNS server&quot; field, specify the IP address of this server, since your server will have the &quot;DNS Server&quot; role, which is installed together with the &quot;Active Directory Domain Services&quot; role.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-11.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Ethernet Properties&quot; window, click on the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-12.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can now begin installing the Active Directory Domain Services role.&lt;/p&gt;
&lt;p&gt;Open the &quot;Server Manager&quot;, click on the &quot;Manage&quot; button in the upper right corner of the screen and select &quot;Add Roles and Features&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-13.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-14.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the installation type &quot;Role-based or feature-based installation&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-15.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, select the server on which the role will be installed.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-16.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the &quot;Active Directory Domain Services&quot; role.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-17.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 17&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, the Role Installation Wizard will warn you that several components need to be installed to install the Active Directory Domain Services role.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Add Features&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-18.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 18&quot;&gt;&lt;/p&gt;
&lt;p&gt;It is not necessary to select the DNS Server role at this point. It will be installed later.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-19.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 19&quot;&gt;&lt;/p&gt;
&lt;p&gt;At the stage of adding components, we leave all the default values.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-20.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 20&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, the &quot;Role Installation Wizard&quot; invites you to familiarize yourself with additional information regarding the &quot;Active Directory Domain Services&quot; role.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-21.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 21&quot;&gt;&lt;/p&gt;
&lt;p&gt;To start the installation of the selected role, click on the &quot;Install&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-22.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 22&quot;&gt;&lt;/p&gt;
&lt;p&gt;The installation of the selected role and the components required for it has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-23.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 23&quot;&gt;&lt;/p&gt;
&lt;p&gt;Installation of the Active Directory Domain Services role is now complete.&lt;/p&gt;
&lt;p&gt;Now click on the &quot;Promote this server to a domain controller&quot; button to promote your server to the domain controller level.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-24.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 24&quot;&gt;&lt;/p&gt;
&lt;p&gt;I highly recommend that you think ahead about which domain name you will use when adding a new forest.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, we will add a new forest, so in the &quot;Active Directory Domain Services Configuration Wizard&quot; window, select the &quot;Add a new forest&quot; item and in the &quot;Root domain name&quot; field, specify the desired name for the root domain.
:::&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-25.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 25&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to select the functional level of the new forest and root domain. If you are adding a new forest and plan to use servers based on the Windows Server 2019 operating system in the future, you do not have to change the functional level of the forest and root domain.&lt;/p&gt;
&lt;p&gt;Specify the password for DSRM (Directory Service Restore Mode) and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-26.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 26&quot;&gt;&lt;/p&gt;
&lt;p&gt;At this point, the AD DS Configuration Wizard will warn you that a delegation for this DNS server cannot be created.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-27.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 27&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you can change the NetBIOS name that was assigned to your domain. I recommend leaving the default NetBIOS value.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-28.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 28&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can now change the paths for the AD DS database directories, log files and the SYSVOL folder. I recommend leaving these default values.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-29.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 29&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step displays a summary of the server configuration.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-30.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 30&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, the &quot;AD DS Configuration Wizard&quot; will check if all prerequisites have been met and display a report.&lt;/p&gt;
&lt;p&gt;All prerequisite checks are passed successfully means all prerequisite checks are passed.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Install&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-31.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 31&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of promoting the server to a domain controller has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-32.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 32&quot;&gt;&lt;/p&gt;
&lt;p&gt;After your server is promoted to a domain controller, the server will automatically reboot.&lt;/p&gt;
&lt;p&gt;Before the server starts to reboot, you will see a warning.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-33.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 33&quot;&gt;&lt;/p&gt;
&lt;p&gt;The promotion of the server to the domain controller is completed.&lt;/p&gt;
&lt;p&gt;You can use the Active Directory Administrative Center or the Active Directory Users and Computers snap-in to manage users, groups, and other Active Directory objects.&lt;/p&gt;
&lt;p&gt;We go into the system under an account with domain administrator rights.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-34.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 34&quot;&gt;&lt;/p&gt;
&lt;p&gt;Open Server Manager, click on the &quot;Tools&quot; button in the upper right corner of the screen, and select &quot;Active Directory Administrative Center&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-35.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 35&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Active Directory Administrative Center will open.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-36.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 36&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can also use the Active Directory Users and Computers snap-in to manage users, groups, and other objects in the Active Directory.&lt;/p&gt;
&lt;p&gt;In Server Manager, click on the &quot;Tools&quot; button in the upper right corner of the screen and select &quot;Active Directory Users and Computers&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-37.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 37&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Active Directory Users and Computers snap-in opens.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-38.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 - Step 38&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Active Directory</category><category>Windows Server</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Active Directory Domain Services on Windows Server 2019 Server Core</title><link>https://heyvaldemar.com/install-active-directory-domain-services-on-windows-server-2019-server-core/</link><guid isPermaLink="true">https://heyvaldemar.com/install-active-directory-domain-services-on-windows-server-2019-server-core/</guid><description>Learn how to install and configure Active Directory Domain Services on Windows Server 2019 Server Core using PowerShell. Step-by-step setup for your AD DS role.</description><pubDate>Fri, 30 Aug 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Active Directory Domain Services on Windows Server 2019 Server Core.&lt;/p&gt;
&lt;p&gt;:::important
In this guide, we will consider the case when you already have a server with the Windows Server 2019 Server Core operating system installed on it.&lt;/p&gt;
&lt;p&gt;For details on installing Windows Server 2019, read my guide: &lt;a href=&quot;/install-windows-server-2019/&quot;&gt;Install Windows Server 2019&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
To learn how to install Active Directory Domain Services on Windows Server 2019, read: &lt;a href=&quot;/install-active-directory-domain-services-on-windows-server-2019/&quot;&gt;Install Active Directory Domain Services on Windows Server 2019&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::caution
Before installing the Active Directory Domain Services role, make sure to assign the server a proper name according to your organization&apos;s standards. Then, configure a static IP address, subnet mask, gateway, and DNS server address.
:::&lt;/p&gt;
&lt;p&gt;We go into the system under an account with administrator rights and start Windows PowerShell using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;powershell
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-1.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;I highly recommend that you think ahead about the name of the servers in your organization.&lt;/p&gt;
&lt;p&gt;:::note
This tutorial will use &quot;heyvaldemar-server-1&quot; as the new server name.
:::&lt;/p&gt;
&lt;p&gt;We give the server a new name, and then reboot it for the changes to take effect using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Rename-Computer -NewName heyvaldemar-server-1 -Restart
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-2.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Since the selected server name contains more than 15 characters, the system notifies that the NetBIOS name for the server will be truncated to 15 characters.&lt;/p&gt;
&lt;p&gt;Press the &quot;y&quot; button, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-3.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;After restarting the server, log in again under an account with administrator rights and start Windows PowerShell using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;powershell
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-4.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to assign a static IP address, subnet mask, gateway, and DNS server address to the server.&lt;/p&gt;
&lt;p&gt;To configure a network interface, you need to find out its index using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Get-NetIPAddress
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-5.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;In this case, the network interface is indexed &quot;4&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-6.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
In this guide, the server will be assigned an IP address of 192.168.1.10, a subnet mask of 255.255.255.0 (24), and a gateway of 192.168.1.1.
:::&lt;/p&gt;
&lt;p&gt;:::note
You must understand in advance how your network works and know which IP addresses are available.
:::&lt;/p&gt;
&lt;p&gt;We assign the server an IP address, mask, and gateway, specifying the previously obtained index of the network interface, using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;New-NetIPAddress -InterfaceIndex 4 -IPAddress 192.168.1.10 -PrefixLength 24 -DefaultGateway 192.168.1.1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-7.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;As the DNS server, you must specify the IP address of the current server, since it will have the DNS Server role, which is installed with the Active Directory Domain Services role.&lt;/p&gt;
&lt;p&gt;We register the IP address of the DNS server using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Set-DnsClientServerAddress -InterfaceIndex 4 -ServerAddresses 192.168.1.10
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-8.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Check that the server is assigned the correct IP address, subnet mask, gateway, and DNS server address using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;ipconfig /all
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-9.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;The server has been assigned the correct IP address, subnet mask, gateway, and DNS server address.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-10.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s connect to the server from a personal computer using Windows PowerShell remote management tools.&lt;/p&gt;
&lt;p&gt;:::note
In this guide, Windows 10 is used as the operating system on a personal computer. For installation instructions, refer to &lt;a href=&quot;/install-windows-10/&quot;&gt;Install Windows 10&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
To enable Windows PowerShell Remote Management, the user must have local administrator rights on their computer.
:::&lt;/p&gt;
&lt;p&gt;On the keyboard, press the key combination &quot;Win&quot; and &quot;x&quot;, then select &quot;Windows PowerShell (Admin)&quot; in the menu that opens.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-11.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;To connect to the server from a personal computer, you need to change the network category from &quot;Public&quot; to &quot;Private&quot;. To do this, you need to find out the index of the network interface using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Get-NetConnectionProfile
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-12.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;In this case, the network interface is indexed &quot;6&quot;.&lt;/p&gt;
&lt;p&gt;Let&apos;s change the network category from &quot;Public&quot; to &quot;Private&quot; by specifying the previously obtained index of the network interface using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Set-NetConnectionProfile -InterfaceIndex 6 -NetworkCategory Private
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-13.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s enable the tools for remote administration using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Enable-PSRemoting -force
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-14.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;To trust any computer on the network to make a remote connection, run the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Set-Item WSMan:\localhost\Client\TrustedHosts -Value *
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-15.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;At the next step, the system will notify that the entered command will make changes to the list of trusted hosts.&lt;/p&gt;
&lt;p&gt;Press the &quot;y&quot; button, then &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-16.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
In this guide, the server is assigned the IP address 192.168.1.10 and the name heyvaldemar-server-1, and uses the Administrator account to manage the operating system on the server.
:::&lt;/p&gt;
&lt;p&gt;We connect to the server using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Enter-PSSession -ComputerName 192.168.1.10 -Credential heyvaldemar-server-1\Administrator
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-17.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 17&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the password for an account with administrator rights and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-18.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 18&quot;&gt;&lt;/p&gt;
&lt;p&gt;The connection to the server has been established.&lt;/p&gt;
&lt;p&gt;You are now ready to install the Active Directory Domain Services role.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Install-WindowsFeature -Name AD-Domain-Services -IncludeManagementTools
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-19.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 19&quot;&gt;&lt;/p&gt;
&lt;p&gt;The installation of the selected role and the components required for it has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-20.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 20&quot;&gt;&lt;/p&gt;
&lt;p&gt;To increase the role of your server to the level of a domain controller, run the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Install-ADDSForest -DomainName &quot;heyvaldemar.net&quot; -CreateDnsDelegation:$false -DatabasePath &quot;C:\Windows\NTDS&quot; -DomainMode &quot;7&quot; -DomainNetbiosName &quot;HEYVALDEMAR&quot; -ForestMode &quot;7&quot; -InstallDns:$true -LogPath &quot;C:\Windows\NTDS&quot; -NoRebootOnCompletion:$True -SysvolPath &quot;C:\Windows\SYSVOL&quot; -Force:$true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-21.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 21&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the password for DSRM (Directory Service Restore Mode) and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-22.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 22&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the previously entered password again and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-23.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 23&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of promoting the server to a domain controller has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-24.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 24&quot;&gt;&lt;/p&gt;
&lt;p&gt;Server promotion to a domain controller is complete.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-25.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 25&quot;&gt;&lt;/p&gt;
&lt;p&gt;We return to the server and reload it using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;shutdown -r
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-26.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 26&quot;&gt;&lt;/p&gt;
&lt;p&gt;Before the server starts to reboot, you will see a warning.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-27.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 27&quot;&gt;&lt;/p&gt;
&lt;p&gt;We will now reconnect to the server from our personal computer using the Windows PowerShell remote management tools to confirm the successful installation of the services.&lt;/p&gt;
&lt;p&gt;:::note
In this manual, the server is assigned the IP address 192.168.1.10, in addition, the server is a domain controller &lt;code&gt;heyvaldemar.net&lt;/code&gt;, and the Administrator account is used to manage the operating system on the server.
:::&lt;/p&gt;
&lt;p&gt;We connect to the server using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Enter-PSSession -ComputerName 192.168.1.10 -Credential heyvaldemar\Administrator
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-28.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 28&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the password for an account with domain administrator rights and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-29.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 29&quot;&gt;&lt;/p&gt;
&lt;p&gt;The connection to the server has been established.&lt;/p&gt;
&lt;p&gt;Check the status of the services required for the domain controller to work using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Get-Service adws,kdc,netlogon,dns
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-30.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 30&quot;&gt;&lt;/p&gt;
&lt;p&gt;The services required for the domain controller are running.&lt;/p&gt;
&lt;p&gt;To view detailed information about configuring a domain controller, you can run the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Get-ADDomainController
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-31.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 31&quot;&gt;&lt;/p&gt;
&lt;p&gt;To view detailed information about the Active Directory domain, you can run the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Get-ADDomain heyvaldemar.net
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-32.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 32&quot;&gt;&lt;/p&gt;
&lt;p&gt;To view detailed information about the Active Directory forest, you can run the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Get-ADForest heyvaldemar.net
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-33.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 33&quot;&gt;&lt;/p&gt;
&lt;p&gt;To check the availability of the SYSVOL shared folder, you can run the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Get-smbshare SYSVOL
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-34.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 34&quot;&gt;&lt;/p&gt;
&lt;p&gt;The shared folder &quot;SYSVOL&quot; is available. It is used to provide clients with Group Policy settings and logon and logon scripts.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-35.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 35&quot;&gt;&lt;/p&gt;
&lt;p&gt;We return to the workstation.&lt;/p&gt;
&lt;p&gt;Now you can install the remote administration tools on your personal computer to manage the roles available on the server using a graphical interface.&lt;/p&gt;
&lt;p&gt;:::note
In Windows 10 (version 1903), the installation of the RSAT (Remote Server Administration Tools) components can be performed through the Windows graphical interface.
:::&lt;/p&gt;
&lt;p&gt;For earlier versions of Windows 10, the RSAT installer must be downloaded from the &lt;a href=&quot;https://www.microsoft.com/en-us/download/details.aspx?id=45520&quot;&gt;Microsoft download page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;On the keyboard, press the key combination &quot;Win&quot; and &quot;x&quot;, then select &quot;Apps and Features&quot; in the menu that opens.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-36.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 36&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, select &quot;Optional Features&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-37.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 37&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now choose &quot;Add a feature&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-38.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 38&quot;&gt;&lt;/p&gt;
&lt;p&gt;To install Active Directory remote administration tools, select &quot;RSAT: Active Directory Domain Services and Lightweight Directory Services Tools&quot; and click on the &quot;Install&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-39.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 39&quot;&gt;&lt;/p&gt;
&lt;p&gt;To install the remote DNS administration tools, select &quot;RSAT: DNS Server Tools&quot; and click on the &quot;Install&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-40.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 40&quot;&gt;&lt;/p&gt;
&lt;p&gt;To install the Group Policy remote administration tools, select &quot;RSAT: Group Policy Management Tools&quot; and click on the &quot;Install&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-41.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 41&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you will be able to manage the roles available on the server using a graphical interface.&lt;/p&gt;
&lt;p&gt;Installed remote administration tools can be found in the Start menu under Windows Administrative Tools.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2019-server-core-42.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2019 Server Core - Step 42&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Active Directory</category><category>Windows Server</category><category>PowerShell</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Update Kernel in Ubuntu</title><link>https://heyvaldemar.com/update-kernel-in-ubuntu/</link><guid isPermaLink="true">https://heyvaldemar.com/update-kernel-in-ubuntu/</guid><description>Learn how to safely update the Linux kernel in Ubuntu using Terminal and .deb packages. Step-by-step guide for system administrators and Linux users.</description><pubDate>Wed, 28 Aug 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and clear guide on how to update kernel in Ubuntu.&lt;/p&gt;
&lt;p&gt;Let&apos;s check the current version of the kernel. Open Terminal and execute the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;uname -r
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./update-kernel-in-ubuntu-1.webp&quot; alt=&quot;Update Kernel in Ubuntu - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Create a new directory that will be needed for Ubuntu kernel update packages using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;mkdir /tmp/kernel
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./update-kernel-in-ubuntu-2.webp&quot; alt=&quot;Update Kernel in Ubuntu - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Go to the new directory using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cd /tmp/kernel
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./update-kernel-in-ubuntu-3.webp&quot; alt=&quot;Update Kernel in Ubuntu - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, visit the &lt;a href=&quot;https://kernel.ubuntu.com/~kernel-ppa/mainline/&quot;&gt;Ubuntu mainline kernel archive&lt;/a&gt; and choose the version you wish to update your kernel to.&lt;/p&gt;
&lt;p&gt;Next, you need to download the &quot;generic&quot; or &quot;low latency&quot; packages.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Packages &quot;generic&quot; are intended for operating systems used for typical tasks.&lt;/li&gt;
&lt;li&gt;Packages &quot;low latency&quot; are intended for operating systems used to work with audio and video.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The operating system used for typical tasks will require the following packages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The package that contains &quot;linux-headers&quot; and &quot;all&quot; in the name, located in the section corresponding to your processor architecture.&lt;/li&gt;
&lt;li&gt;The package that contains &quot;linux-headers&quot; and &quot;generic&quot; in the name, located in the section corresponding to your processor architecture.&lt;/li&gt;
&lt;li&gt;The package that contains &quot;linux-image-unsigned&quot; and &quot;generic&quot; in the name, found in the section corresponding to your processor architecture.&lt;/li&gt;
&lt;li&gt;The package that contains &quot;linux-modules&quot; and &quot;generic&quot; in the name, located in the section corresponding to your processor architecture.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./update-kernel-in-ubuntu-4.webp&quot; alt=&quot;Update Kernel in Ubuntu - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Download the package, which contains &quot;linux-headers&quot; and &quot;all&quot; in the name, and is located in the section corresponding to your processor architecture, using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.2.10/linux-headers-5.2.10-050210_5.2.10-050210.201908251538_all.deb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./update-kernel-in-ubuntu-5.webp&quot; alt=&quot;Update Kernel in Ubuntu - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Download the package, which contains &quot;linux-headers&quot; and &quot;generic&quot; in the name, and is located in the section corresponding to your processor architecture, using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.2.10/linux-headers-5.2.10-050210-generic_5.2.10-050210.201908251538_amd64.deb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./update-kernel-in-ubuntu-6.webp&quot; alt=&quot;Update Kernel in Ubuntu - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Download the package, which contains &quot;linux-image-unsigned&quot; and &quot;generic&quot; in the name, and is located in the section corresponding to your processor architecture, using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.2.10/linux-image-unsigned-5.2.10-050210-generic_5.2.10-050210.201908251538_amd64.deb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./update-kernel-in-ubuntu-7.webp&quot; alt=&quot;Update Kernel in Ubuntu - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Download the package, which contains &quot;linux-modules&quot; and &quot;generic&quot; in the name, and is located in the section corresponding to your processor architecture, using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.2.10/linux-modules-5.2.10-050210-generic_5.2.10-050210.201908251538_amd64.deb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./update-kernel-in-ubuntu-8.webp&quot; alt=&quot;Update Kernel in Ubuntu - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to install all downloaded packages using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo dpkg -i *.deb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./update-kernel-in-ubuntu-9.webp&quot; alt=&quot;Update Kernel in Ubuntu - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the password for the account and press &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./update-kernel-in-ubuntu-10.webp&quot; alt=&quot;Update Kernel in Ubuntu - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;We reboot the operating system using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo reboot
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./update-kernel-in-ubuntu-11.webp&quot; alt=&quot;Update Kernel in Ubuntu - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s check the kernel version.&lt;/p&gt;
&lt;p&gt;Open Terminal and execute the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;uname -r
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./update-kernel-in-ubuntu-12.webp&quot; alt=&quot;Update Kernel in Ubuntu - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;You should see a new version of the kernel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./update-kernel-in-ubuntu-13.webp&quot; alt=&quot;Update Kernel in Ubuntu - Step 13&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Ubuntu</category><category>Linux</category><category>Kernel</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Minecraft on Windows</title><link>https://heyvaldemar.com/install-minecraft-on-windows/</link><guid isPermaLink="true">https://heyvaldemar.com/install-minecraft-on-windows/</guid><description>Step-by-step guide on how to install Minecraft Java Edition on Windows. Learn how to download, install, and launch Minecraft quickly and easily.</description><pubDate>Fri, 19 Jul 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Minecraft on Windows.&lt;/p&gt;
&lt;p&gt;If you&apos;ve purchased a license, you can begin downloading and installing the game. Visit the &lt;a href=&quot;https://www.minecraft.net/en-us/download&quot;&gt;Minecraft download page&lt;/a&gt; and click the &quot;Download&quot; button under the &quot;Download Minecraft: Java Edition for Windows&quot; section.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-minecraft-on-windows-1.webp&quot; alt=&quot;Install Minecraft on Windows - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Go to &quot;Downloads&quot; and run &quot;MinecraftInstaller.msi&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-minecraft-on-windows-2.webp&quot; alt=&quot;Install Minecraft on Windows - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-minecraft-on-windows-3.webp&quot; alt=&quot;Install Minecraft on Windows - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you can choose where to install Minecraft.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-minecraft-on-windows-4.webp&quot; alt=&quot;Install Minecraft on Windows - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can begin the Minecraft installation process.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Install&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-minecraft-on-windows-5.webp&quot; alt=&quot;Install Minecraft on Windows - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Minecraft installation completed successfully.&lt;/p&gt;
&lt;p&gt;Check the box &quot;Start Minecraft after closing the installer&quot; and click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-minecraft-on-windows-6.webp&quot; alt=&quot;Install Minecraft on Windows - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Login&quot; button.&lt;/p&gt;
&lt;p&gt;I wish you all a pleasant game!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-minecraft-on-windows-7.webp&quot; alt=&quot;Install Minecraft on Windows - Step 7&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Minecraft</category><category>Gaming</category><category>Windows</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Ubuntu Server 18.04 LTS</title><link>https://heyvaldemar.com/install-ubuntu-server-18-04-lts/</link><guid isPermaLink="true">https://heyvaldemar.com/install-ubuntu-server-18-04-lts/</guid><description>Step-by-step guide to install Ubuntu Server 18.04 LTS — disk setup, OpenSSH, user configuration, and post-installation steps for deployment.</description><pubDate>Fri, 12 Jul 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Ubuntu Server 18.04 LTS.&lt;/p&gt;
&lt;p&gt;After successfully booting from the Ubuntu Server 18.04 installation USB stick or DVD, the first step is to choose which language the welcome menu will be displayed in.&lt;/p&gt;
&lt;p&gt;Select &quot;English&quot; and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-18-04-lts-1.webp&quot; alt=&quot;Install Ubuntu Server 18.04 LTS - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you can choose a keyboard layout.&lt;/p&gt;
&lt;p&gt;Select the keyboard layout you need and click on the &quot;Done&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-18-04-lts-2.webp&quot; alt=&quot;Install Ubuntu Server 18.04 LTS - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to select the option to install Ubuntu Server.&lt;/p&gt;
&lt;p&gt;:::note
This tutorial does not cover the installation of MAAS (Metal as a Service). If you plan to use MAAS, I recommend that you read the &lt;a href=&quot;https://old-docs.maas.io/2.5/en/&quot;&gt;documentation&lt;/a&gt; for more information.
:::&lt;/p&gt;
&lt;p&gt;Select &quot;Install Ubuntu&quot; and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-18-04-lts-3.webp&quot; alt=&quot;Install Ubuntu Server 18.04 LTS - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, the installer will try to automatically obtain the settings for the network connection using DHCP.&lt;/p&gt;
&lt;p&gt;You can set the IP address manually or configure the network connection after installation.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Done&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-18-04-lts-4.webp&quot; alt=&quot;Install Ubuntu Server 18.04 LTS - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, the system prompts you to specify information about the proxy server.&lt;/p&gt;
&lt;p&gt;This guide does not use a proxy server.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Done&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-18-04-lts-5.webp&quot; alt=&quot;Install Ubuntu Server 18.04 LTS - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you can specify an alternative mirror address for downloading packages.&lt;/p&gt;
&lt;p&gt;Leave the &quot;Mirror address&quot; field unchanged and click on the &quot;Done&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-18-04-lts-6.webp&quot; alt=&quot;Install Ubuntu Server 18.04 LTS - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;At the next step, you need to choose which disk the new operating system will be installed on and allocate space for installation.&lt;/p&gt;
&lt;p&gt;:::note
All free disk space will be allocated for the system.
:::&lt;/p&gt;
&lt;p&gt;Select &quot;Use An Entire Disk&quot; and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-18-04-lts-7.webp&quot; alt=&quot;Install Ubuntu Server 18.04 LTS - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to choose which disk the operating system will be installed on.&lt;/p&gt;
&lt;p&gt;:::note
In this example, one 10Gb disk is installed.
:::&lt;/p&gt;
&lt;p&gt;Select the disk on which you want to install the system and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-18-04-lts-8.webp&quot; alt=&quot;Install Ubuntu Server 18.04 LTS - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, you can see what partitions will be created on the disk.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Done&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-18-04-lts-9.webp&quot; alt=&quot;Install Ubuntu Server 18.04 LTS - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to confirm your changes.&lt;/p&gt;
&lt;p&gt;Select &quot;Continue&quot; and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-18-04-lts-10.webp&quot; alt=&quot;Install Ubuntu Server 18.04 LTS - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you will need to specify the full username for the administrator account, the server name, then the login and password for the new account.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Done&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-18-04-lts-11.webp&quot; alt=&quot;Install Ubuntu Server 18.04 LTS - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;If you plan to connect to the server via SSH, then you need to select &quot;Install OpenSSH server&quot;.&lt;/p&gt;
&lt;p&gt;:::note
You can also import SSH keys from Launchpad or Github.
:::&lt;/p&gt;
&lt;p&gt;Click on the &quot;Done&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-18-04-lts-12.webp&quot; alt=&quot;Install Ubuntu Server 18.04 LTS - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;At this stage, you can take the opportunity to select additional components to install.&lt;/p&gt;
&lt;p&gt;This tutorial walks you through installing Ubuntu Server without additional components.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Done&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-18-04-lts-13.webp&quot; alt=&quot;Install Ubuntu Server 18.04 LTS - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you can watch the installation process of Ubuntu Server 18.04.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-18-04-lts-14.webp&quot; alt=&quot;Install Ubuntu Server 18.04 LTS - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Ubuntu Server 18.04 installation is complete.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Reboot Now&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-18-04-lts-15.webp&quot; alt=&quot;Install Ubuntu Server 18.04 LTS - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to remove the Ubuntu Server 18.04 installation disc from the CD/DVD drive.&lt;/p&gt;
&lt;p&gt;Press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-18-04-lts-16.webp&quot; alt=&quot;Install Ubuntu Server 18.04 LTS - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to specify the username and password for authorization in Ubuntu, which was specified earlier during the installation of the system.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-ubuntu-server-18-04-lts-17.webp&quot; alt=&quot;Install Ubuntu Server 18.04 LTS - Step 17&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Ubuntu</category><category>Linux</category><category>Server</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Configure Exchange Server 2016</title><link>https://heyvaldemar.com/configure-exchange-server-2016/</link><guid isPermaLink="true">https://heyvaldemar.com/configure-exchange-server-2016/</guid><description>Step-by-step guide to configure Exchange Server 2019 — mailbox databases, public folders, DNS, certificates, and send/receive connectors.</description><pubDate>Wed, 12 Dec 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and clear guide on how to configure Exchange Server 2016.&lt;/p&gt;
&lt;p&gt;You can read more about how to configure Exchange Server 2019 in my guide &lt;a href=&quot;/configure-exchange-server-2019/&quot;&gt;Configure Exchange Server 2019&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;:::important
We will consider the case when you already have two servers with the Windows Server 2012 R2 operating system installed on them. In addition, one of the servers must have the Active Directory Domain Services role installed, and the second server must have Exchange Server 2016 installed.
:::&lt;/p&gt;
&lt;p&gt;:::note
For details on installing Exchange Server 2016 on Windows Server 2012 R2, refer to my guide: &lt;a href=&quot;/install-exchange-server-2016-on-windows-server-2012-r2/&quot;&gt;Install Exchange Server 2016 on Windows Server 2012 R2&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
To learn how to install Active Directory Domain Services on Windows Server 2012 R2, see my guide: &lt;a href=&quot;/install-active-directory-domain-services-on-windows-server-2012-r2/&quot;&gt;Install Active Directory Domain Services on Windows Server 2012 R2&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;Open the Exchange Admin Center control panel, which is located at the link &lt;code&gt;https://us-boston-ex-01/ecp&lt;/code&gt;, where &lt;code&gt;us-boston-ex-01&lt;/code&gt; is the name of my Exchange server. Accordingly, you need to provide the name or IP address of your server.&lt;/p&gt;
&lt;p&gt;Specify the username and password of an account with Exchange administrator rights and click on the &quot;Sign in&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-1.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the &quot;Exchange Administration Center&quot;.&lt;/p&gt;
&lt;p&gt;You can start working with the Exchange server.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-2.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s create a mailbox database.&lt;/p&gt;
&lt;p&gt;In the &quot;Servers&quot; section, select the &quot;Databases&quot; subsection and click on the &quot;+&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-3.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to specify a name for the new database and select an Exchange server with the &quot;Mailbox&quot; role.&lt;/p&gt;
&lt;p&gt;Specify the name of the database and click on the &quot;Browse&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-4.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the Exchange server with the &quot;Mailbox&quot; role and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-5.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to specify in which folder the mailbox database and its logs will be stored.&lt;/p&gt;
&lt;p&gt;:::note
You need to first create folders on the server in which you plan to store the database and its logs. In addition, it is better to store the database on a disk specially allocated for this task.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-6.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Database file path&quot; field, specify the folder in which the database will be stored.&lt;/p&gt;
&lt;p&gt;In the &quot;Log folder path&quot; field, specify the folder in which the database logs will be stored.&lt;/p&gt;
&lt;p&gt;Check the &quot;Mount this database&quot; box and click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-7.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to restart the Microsoft Exchange Information Store service on the Exchange server.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-8.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Open &quot;Server Manager&quot; on the server with Exchange Server 2016 installed, then click on the &quot;Tools&quot; button in the upper right corner of the screen and select &quot;Services&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-9.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Right-click on the &quot;Microsoft Exchange Information Store&quot; service and select &quot;Restart&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-10.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;The service has restarted successfully and the new database is ready to go.&lt;/p&gt;
&lt;p&gt;Next, in the &quot;Servers&quot; section, select the &quot;Databases&quot; subsection, then select a new database and double-click on it with the left mouse button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-11.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Limits&quot; section, you can configure the retention time for deleted mailboxes and letters.&lt;/p&gt;
&lt;p&gt;Specify the required values and click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-12.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s create a database for shared folders.&lt;/p&gt;
&lt;p&gt;In the &quot;Servers&quot; section, select the &quot;Databases&quot; subsection and click on the &quot;+&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-13.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify a name for the shared folder database and click the Browse button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-14.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the Exchange server with the &quot;Mailbox&quot; role and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-15.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to specify in which folder the database for public folders and its logs will be stored.&lt;/p&gt;
&lt;p&gt;:::note
You need to first create folders on the server in which you plan to store the database and its logs. In addition, it is better to store the database on a disk specially allocated for this task.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-16.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Database file path&quot; field, specify the folder in which the database will be stored.&lt;/p&gt;
&lt;p&gt;In the &quot;Log folder path&quot; field, specify the folder in which the database logs will be stored.&lt;/p&gt;
&lt;p&gt;Check the &quot;Mount this database&quot; box and click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-17.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 17&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to restart the Microsoft Exchange Information Store service on the Exchange server.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-18.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 18&quot;&gt;&lt;/p&gt;
&lt;p&gt;Return to &quot;Server Manager&quot; on the server with Exchange Server 2016 installed, click on the &quot;Tools&quot; button in the upper right corner of the screen, and select &quot;Services&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-19.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 19&quot;&gt;&lt;/p&gt;
&lt;p&gt;Right-click on the &quot;Microsoft Exchange Information Store&quot; service and select &quot;Restart&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-20.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 20&quot;&gt;&lt;/p&gt;
&lt;p&gt;The service has restarted successfully and the new database is ready to go.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-21.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 21&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, go to the &quot;Public Folders&quot; section.&lt;/p&gt;
&lt;p&gt;In the &quot;Public Folders&quot; section, select the &quot;Public Folder Mailboxes&quot; subsection and click on the &quot;+&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-22.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 22&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify a name for the public folder mailbox and in the &quot;Mailbox database&quot; section click on the &quot;Browse&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-23.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 23&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the database for shared folders and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-24.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 24&quot;&gt;&lt;/p&gt;
&lt;p&gt;Nothing can be changed in the &quot;Organization unit&quot; section.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-25.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 25&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the public folder mailbox is created, it appears under the Public Folder Mailboxes subsection.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-26.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 26&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s add the trusted domain.&lt;/p&gt;
&lt;p&gt;In the &quot;Mail Flow&quot; section, select the &quot;Accepted Domains&quot; subsection and click on the &quot;+&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-27.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 27&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Name&quot; and &quot;Accepted Domain&quot; fields, specify the domain that you want to add to the trusted ones, then select &quot;Authoritative Domain: E-mail is delivered only to valid recipients in this Exchange organization&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-28.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 28&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the domain is added to the trusted ones, it will appear in the &quot;Accepted Domains&quot; section.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-29.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 29&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to create a policy for generating mailing addresses.&lt;/p&gt;
&lt;p&gt;In the &quot;Mail Flow&quot; section, select the &quot;Email Address Policies&quot; subsection and click on the &quot;+&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-30.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 30&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to specify a name for the new policy and choose who it will be applied to, and then determine how mail addresses will be generated in your organization.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, mailing addresses will be based on &quot;Alias&quot;.
:::&lt;/p&gt;
&lt;p&gt;Specify a name for the policy for generating postal addresses and click the &quot;+&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-31.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 31&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the main domain and select &quot;alias@contoso.com&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-32.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 32&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s add a second domain so that users can receive mail using the second domain name as well.&lt;/p&gt;
&lt;p&gt;Click on the &quot;+&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-33.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 33&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the second domain and select &quot;alias@contoso.com&quot;.&lt;/p&gt;
&lt;p&gt;Click the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-34.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 34&quot;&gt;&lt;/p&gt;
&lt;p&gt;After you have determined how mail addresses will be formed in your organization, click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-35.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 35&quot;&gt;&lt;/p&gt;
&lt;p&gt;Pay attention to the warning. In order for the policy to take effect, you must click on the &quot;Apply&quot; button in the &quot;E-mail Address Policies&quot; subsection.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-36.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 36&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the policy is added, it will appear in the &quot;E-mail Address Policies&quot; subsection with the &quot;Unapplied&quot; status.&lt;/p&gt;
&lt;p&gt;To apply a policy, select it and click on the &quot;Apply&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-37.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 37&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, a warning will appear stating that applying the policy may take a long time and you will not be able to perform other tasks while the policy is being applied.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Yes&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-38.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 38&quot;&gt;&lt;/p&gt;
&lt;p&gt;The policy for generating postal addresses has been successfully applied.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-39.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 39&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the policy is applied, it will appear in the &quot;E-mail Address Policies&quot; subsection with the &quot;Applied&quot; status.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-40.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 40&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to create a send connector: to be able to send mail outside the organization.&lt;/p&gt;
&lt;p&gt;In the &quot;Mail Flow&quot; section, select the &quot;Send Connectors&quot; subsection and click on the &quot;+&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-41.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 41&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify a name for the new Send Connector and select &quot;Internet&quot; in the &quot;Type&quot; section.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-42.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 42&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
In this example, mail will be sent according to MX records.
:::&lt;/p&gt;
&lt;p&gt;Select &quot;MX record associated with recipient domain&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-43.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 43&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to specify for which domains the new connector will work.&lt;/p&gt;
&lt;p&gt;Click on the &quot;+&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-44.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 44&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Full Qualified Domain Name (FQDN)&quot; field, enter &lt;code&gt;*&lt;/code&gt;. This way, the new Send Connector will handle all domains except yours.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-45.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 45&quot;&gt;&lt;/p&gt;
&lt;p&gt;After you have specified for which domains the new connector will work, click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-46.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 46&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to specify on which Exchange server the Send connector will be created.&lt;/p&gt;
&lt;p&gt;Click on the &quot;+&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-47.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 47&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the Exchange server on which the Send Connector will be created and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-48.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 48&quot;&gt;&lt;/p&gt;
&lt;p&gt;Everything is ready to create a send connector.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-49.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 49&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, in the &quot;Mail Flow&quot; section, select the &quot;Send Connectors&quot; subsection, then select a new send connector and double-click on it with the left mouse button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-50.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 50&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;General&quot; section of the &quot;Maximum send message size (MB)&quot; menu, you can configure the maximum size of mail attachments to be sent.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-51.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 51&quot;&gt;&lt;/p&gt;
&lt;p&gt;Further, in the &quot;Scoping&quot; section, in the &quot;Specify the FQDN this connector will provide in response to HELO or EHLO&quot; field, specify the name by which your mail server is accessible from the Internet.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-52.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 52&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s see the transport settings.&lt;/p&gt;
&lt;p&gt;In the &quot;Mail Flow&quot; section, select the &quot;Send Connectors&quot; subsection. Then click on the &quot;...&quot; button and select &quot;Organization transport settings&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-53.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 53&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Limits&quot; section, you can configure the maximum size of mail attachments for sending and receiving.&lt;/p&gt;
&lt;p&gt;Specify the required values and click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-54.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 54&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to provide your Exchange Server 2016 license key.&lt;/p&gt;
&lt;p&gt;In the &quot;Servers&quot; section, select the &quot;Servers&quot; subsection and click on the &quot;Edit&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-55.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 55&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;General&quot; section, specify the Exchange Server 2016 license key and click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-56.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 56&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to configure DNS records for the domain. To do this, you need to open a web browser and go to the control panel for external DNS records for your domain.&lt;/p&gt;
&lt;p&gt;This tutorial uses &quot;cPanel&quot; to manage external DNS records for a domain.&lt;/p&gt;
&lt;p&gt;Enter the login and password you received when purchasing hosting.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-57.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 57&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Domains&quot; section, select the &quot;Advanced DNS Zone Editor&quot; item.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-58.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 58&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the domain for which you want to configure DNS records.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-59.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 59&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s add an A record.&lt;/p&gt;
&lt;p&gt;In the &quot;Name&quot; field, enter &quot;mail&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;TTL&quot; field, enter &quot;14400&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Type&quot; field, select &quot;A&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Address&quot; field, indicate the IP address by which your mail server is accessible from the Internet and click on the &quot;Add record&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-60.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 60&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s add one more A-record.&lt;/p&gt;
&lt;p&gt;In the &quot;Name&quot; field, specify &quot;autodiscover&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;TTL&quot; field, enter &quot;14400&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Type&quot; field, select &quot;A&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Address&quot; field, indicate the IP address by which your mail server is accessible from the Internet and click on the &quot;Add record&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-61.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 61&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s add one more A-record.&lt;/p&gt;
&lt;p&gt;In the &quot;Name&quot; field, enter &quot;mx01&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;TTL&quot; field, enter &quot;14400&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Type&quot; field, select &quot;A&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Address&quot; field, indicate the IP address by which your mail server is accessible from the Internet and click on the &quot;Add record&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-62.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 62&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to register MX records in the hosting control panel.&lt;/p&gt;
&lt;p&gt;We return to the hosting control panel.&lt;/p&gt;
&lt;p&gt;In the &quot;Mail&quot; section, select the &quot;MX Record&quot; item.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-63.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 63&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, in the domain field, you must specify the domain for which the MX records will be configured. Then in the item &quot;Email Routing&quot; you need to select &quot;Remote Mail Exchanger&quot; and click on the &quot;Change&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-64.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 64&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now delete all the old MX records in the MX Records section.&lt;/p&gt;
&lt;p&gt;Select the entry and click on the &quot;Delete&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-65.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 65&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Priority&quot; field, enter &quot;1&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Destination&quot; field, specify the previously created A-record with the name &quot;mx01&quot; and click on the &quot;Add New Record&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-66.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 66&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to make a request to your ISP to create a PTR record for your external IP address, where your mail server is accessible from the Internet. This is necessary in order for your IP address to resolve to a name.&lt;/p&gt;
&lt;p&gt;:::note
In this example, IP 188.244.46.91 is being converted to the name mail.vmkh.org.
:::&lt;/p&gt;
&lt;p&gt;Now you need to create an SPF (Sender Policy Framework) and write its value to the TXT record.&lt;/p&gt;
&lt;p&gt;Thanks to SPF, you can check if the sender&apos;s domain has been tampered with. SPF allows you to specify a list of servers capable of sending mail messages on behalf of your domain.&lt;/p&gt;
&lt;p&gt;You can get the parameters for recording SPF using the &lt;a href=&quot;https://dmarcly.com/tools/spf-dkim-dmarc-wizard/#intro&quot;&gt;SPF Wizard&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;SPF example: &lt;code&gt;v=spf1 mx ptr:mail.vmkh.org mx:mx01.vmkh.org ip4:188.244.46.91 -all&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Return to the &quot;Advanced DNS Zone Editor&quot; section.&lt;/p&gt;
&lt;p&gt;In the &quot;Domains&quot; section, select the &quot;Advanced DNS Zone Editor&quot; item.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-67.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 67&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, in the domain field, you must specify the domain for which the A-records will be configured.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-68.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 68&quot;&gt;&lt;/p&gt;
&lt;p&gt;Add TXT record.&lt;/p&gt;
&lt;p&gt;In the &quot;Name&quot; field, specify the domain.&lt;/p&gt;
&lt;p&gt;In the &quot;TTL&quot; field, enter &quot;14400&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Type&quot; field, select &quot;TXT&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;TXT Data&quot; field, specify the SPF parameters obtained using the &lt;a href=&quot;https://dmarcly.com/tools/spf-dkim-dmarc-wizard/#intro&quot;&gt;SPF Wizard&lt;/a&gt; and click on the &quot;Add Record&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-69.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 69&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to register the A-record on the internal DNS server.&lt;/p&gt;
&lt;p&gt;Open &quot;Server Manager&quot; on the domain controller, then click on the &quot;Tools&quot; button in the upper right corner of the screen and select &quot;DNS&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-70.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 70&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Forward Lookup Zones&quot; section, select the main domain and right-click on it, then select &quot;New Host (A or AAAA)&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-71.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 71&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Name (uses parent domain name if blank)&quot; field, specify &quot;Mail&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;IP address&quot; field, specify the IP address of the server on which Exchange Server 2016 is installed and click on the &quot;Add Host&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-72.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 72&quot;&gt;&lt;/p&gt;
&lt;p&gt;A record has been successfully added.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-73.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 73&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the A-record is added, it will appear in the list with the rest of the records.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-74.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 74&quot;&gt;&lt;/p&gt;
&lt;p&gt;For further configuration, you need a certification authority.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, the Active Directory Certificate Services role will be installed on a domain controller.
:::&lt;/p&gt;
&lt;p&gt;Go back to the &quot;Server Manager&quot; on the domain controller, then click on the &quot;Manage&quot; button in the upper right corner of the screen and select &quot;Add Roles and Features&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-75.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 75&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-76.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 76&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the installation type &quot;Role-based or feature-based installation&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-77.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 77&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, select the server on which the role will be installed.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-78.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 78&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the Active Directory Certificate Services role.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-79.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 79&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, the Role Installation Wizard will warn you that several components need to be installed to install the Active Directory Certificate Services role.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Add Features&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-80.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 80&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-81.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 81&quot;&gt;&lt;/p&gt;
&lt;p&gt;At the stage of adding components, we leave all the default values.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-82.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 82&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, the Role Installation Wizard invites you to learn more about the Active Directory Certificate Services role.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-83.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 83&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to select the required services.&lt;/p&gt;
&lt;p&gt;We select &quot;Certification Authority Web Enrollment&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-84.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 84&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, the Install Roles Wizard will warn you that several components need to be installed to install the Certification Authority Web Enrollment.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Add Features&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-85.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 85&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, select &quot;Online Responder&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-86.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 86&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Role Installation Wizard will warn you that several components need to be installed to install Online Responder.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Add Features&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-87.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 87&quot;&gt;&lt;/p&gt;
&lt;p&gt;After all the necessary services are selected, click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-88.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 88&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, the Role Installation Wizard will warn you that the Internet Information Services webserver role will be additionally installed for the Active Directory Certificate Services role.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-89.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 89&quot;&gt;&lt;/p&gt;
&lt;p&gt;At the stage of adding components, we leave all the default values.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-90.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 90&quot;&gt;&lt;/p&gt;
&lt;p&gt;To start the installation of the selected role, click on the &quot;Install&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-91.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 91&quot;&gt;&lt;/p&gt;
&lt;p&gt;The installation of the selected role and the components required for it began.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-92.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 92&quot;&gt;&lt;/p&gt;
&lt;p&gt;Installation of the Active Directory Domain Services role is now complete.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-93.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 93&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to reboot the server.&lt;/p&gt;
&lt;p&gt;On the keyboard, press the key combination &quot;Win&quot; and &quot;x&quot;, in the menu that opens, select &quot;Shut down or sign out&quot;, then &quot;Restart&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-94.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 94&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, the server will start to reboot.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-95.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 95&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to configure the role.&lt;/p&gt;
&lt;p&gt;Open the &quot;Server Manager&quot;, in the upper right corner of the screen, click on the plug and select &quot;Settings&quot;. Then select &quot;Configure Active Directory Certificate Services on the destination server&quot; to configure the role.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-96.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 96&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-97.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 97&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to select the services that you want to configure.&lt;/p&gt;
&lt;p&gt;Select &quot;Certification Authority&quot;, &quot;Certification Authority Web Enrollment&quot; and &quot;Online Responder&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-98.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 98&quot;&gt;&lt;/p&gt;
&lt;p&gt;The server is a member of the domain, so select &quot;Enterprise CA&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-99.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 99&quot;&gt;&lt;/p&gt;
&lt;p&gt;There are no other servers with the Active Directory Certificate Services role in the domain, so select &quot;Root CA&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-100.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 100&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to create a new private key.&lt;/p&gt;
&lt;p&gt;Select &quot;Create a new private key&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-101.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 101&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you can select the cryptography settings.&lt;/p&gt;
&lt;p&gt;Leave the settings unchanged and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-102.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 102&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify a name for the new certification authority and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-103.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 103&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now we select the validity period of the certificate and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-104.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 104&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you can specify where the certificate database and its logs will be stored.&lt;/p&gt;
&lt;p&gt;Leave the settings unchanged and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-105.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 105&quot;&gt;&lt;/p&gt;
&lt;p&gt;Everything is ready to configure the role.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Configure&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-106.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 106&quot;&gt;&lt;/p&gt;
&lt;p&gt;The configuration for the Active Directory Certificate Services role has been completed successfully.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-107.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 107&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to enable the SAN (Subject Alternative Name) function on the CA server. This feature is useful when publishing the &quot;Autodiscover&quot; service.&lt;/p&gt;
&lt;p&gt;On the certification authority server, on the &quot;Taskbar&quot;, right-click on &quot;Windows PowerShell&quot; and select &quot;Run as administrator&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-108.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 108&quot;&gt;&lt;/p&gt;
&lt;p&gt;We enable the SAN function using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;certutil -setreg policy\EditFlags +EDITF_ATTRIBUTESUBJECTALTNAME2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-109.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 109&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to restart the &quot;CertSvc&quot; service.&lt;/p&gt;
&lt;p&gt;Stop the &quot;CertSvc&quot; service using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;net stop certsvc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-110.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 110&quot;&gt;&lt;/p&gt;
&lt;p&gt;We start the &quot;CertSvc&quot; service using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;net start certsvc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-111.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 111&quot;&gt;&lt;/p&gt;
&lt;p&gt;Service &quot;CertSvc&quot; restarted successfully.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-112.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 112&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s make a request to create a new Exchange certificate.&lt;/p&gt;
&lt;p&gt;We return to the Exchange Admin Center control panel.&lt;/p&gt;
&lt;p&gt;In the &quot;Servers&quot; section, select the &quot;Certificates&quot; subsection and click on the &quot;+&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-113.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 113&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;Create a request for a certificate from a certification authority&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-114.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 114&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify a name for the new certificate and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-115.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 115&quot;&gt;&lt;/p&gt;
&lt;p&gt;Then leave the settings unchanged and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-116.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 116&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to specify the Exchange server where the certificate request will be stored.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Browse&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-117.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 117&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the Exchange server where the certificate request will be stored and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-118.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 118&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the Exchange server is specified, click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-119.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 119&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to specify the domain names that need to be included in the certificate for all types of access.&lt;/p&gt;
&lt;p&gt;Select &quot;Outlook Web App (when accessed from the Internet)&quot; and click on the &quot;Edit&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-120.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 120&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the name by which your mail server is accessible from the Internet for the &quot;Outlook Web App&quot; access type, and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-121.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 121&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select OAB (when accessed from the Internet) &quot;and click on the&quot; Edit &quot;(Pencil) button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-122.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 122&quot;&gt;&lt;/p&gt;
&lt;p&gt;We indicate the name by which your mail server is accessible from the Internet for the &quot;OAB&quot; access type and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-123.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 123&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;Exchange Web Services (when accessed from the Internet)&quot; and click on the &quot;Edit&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-124.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 124&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the name by which your mail server is accessible from the Internet for the &quot;Exchange Web Services&quot; access type, and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-125.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 125&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;Exchange ActiveSync (when accessed from the Internet)&quot; and click on the &quot;Edit&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-126.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 126&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the name by which your mail server is accessible from the Internet for the &quot;Exchange ActiveSync&quot; access type, and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-127.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 127&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;POP&quot; and click on the &quot;Edit&quot; button (Pencil).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-128.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 128&quot;&gt;&lt;/p&gt;
&lt;p&gt;We indicate the name by which your mail server is accessible from the Internet for the &quot;POP&quot; access type, and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-129.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 129&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;IMAP&quot; and click on the &quot;Edit&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-130.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 130&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the name by which your mail server is accessible from the Internet for the &quot;IMAP&quot; access type, and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-131.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 131&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;Outlook Anywhere&quot; and click on the &quot;Edit&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-132.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 132&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the name by which your mail server is accessible from the Internet for the &quot;Outlook Anywhere&quot; access type, and click on the &quot;OK&quot; button. Then click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-133.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 133&quot;&gt;&lt;/p&gt;
&lt;p&gt;Below is a list of domains that will be included in the certificate.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-134.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 134&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you must specify the name of the organization, department, and geographic location of the company.&lt;/p&gt;
&lt;p&gt;This guide deals with an organization located in Russia, in the city of Moscow.&lt;/p&gt;
&lt;p&gt;We indicate the necessary information and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-135.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 135&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to specify the folder where the Exchange certificate request will be saved.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, the certificate request will be saved to the local &quot;C&quot; drive on the Exchange server.
:::&lt;/p&gt;
&lt;p&gt;Specify where the Exchange certificate request will be saved and click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-136.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 136&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the certificate request is created, it will appear in the &quot;Certificates&quot; subsection with the &quot;Pending request&quot; status.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-137.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 137&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to validate your Exchange certificate with a CA.&lt;/p&gt;
&lt;p&gt;On the Exchange server, go to the link &lt;code&gt;http://us-boston-dc-01/certsrv&lt;/code&gt;, where &lt;code&gt;us-boston-dc-01&lt;/code&gt; is the name of my certification authority server. Accordingly, you need to specify the name of your server.&lt;/p&gt;
&lt;p&gt;We go under an account with administrator rights and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-138.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 138&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s add the address of the certification server to &quot;Trusted sites&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Add&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-139.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 139&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Add this website to the zone&quot; field, specify the address of the certification server and click on the &quot;Add&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-140.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 140&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-141.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 141&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now select &quot;Request a certificate&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-142.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 142&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, select &quot;Advanced certificate request&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-143.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 143&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now select &quot;Submit a certificate request by using a base-64-encoded CMC or PKCS #10 file, or submit a renewal request by using a base-64-encoded PKCS #7 file&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-144.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 144&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, open &quot;Explorer&quot; and go to the local drive &quot;C&quot; where the Exchange certificate request was saved.&lt;/p&gt;
&lt;p&gt;Click on the certificate request file twice with the left mouse button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-145.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 145&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;More option&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-146.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 146&quot;&gt;&lt;/p&gt;
&lt;p&gt;We select &quot;Notepad&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-147.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 147&quot;&gt;&lt;/p&gt;
&lt;p&gt;Copy the contents of the request file.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-148.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 148&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, insert the contents of the request file into the &quot;Saved Request&quot; field, then in the &quot;Certificate Template&quot; section, select &quot;Web Server&quot; and click on the &quot;Submit&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-149.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 149&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Save&quot; menu, select &quot;Save as&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-150.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 150&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;DER encoded&quot; and click on the &quot;Download certificate&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-151.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 151&quot;&gt;&lt;/p&gt;
&lt;p&gt;Assign a name and save the Exchange certificate to the Downloads folder.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-152.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 152&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to download the certificate of the certification authority.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Home&quot; button in the upper right corner of the screen.&lt;/p&gt;
&lt;p&gt;Select &quot;Download a CA certificate, certificate chain, or CRL&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-153.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 153&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Encoding method&quot; section, select &quot;DER&quot; and click on the &quot;Download CA certificate&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-154.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 154&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Save&quot; menu, select &quot;Save as&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-155.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 155&quot;&gt;&lt;/p&gt;
&lt;p&gt;We assign a name and save the certificate of the certification authority in the &quot;Downloads&quot; folder.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-156.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 156&quot;&gt;&lt;/p&gt;
&lt;p&gt;To successfully validate your Exchange certificate request, you must import the CA certificate into the Trusted Root Certification Authorities on the Exchange server.&lt;/p&gt;
&lt;p&gt;Press &quot;Start&quot;, specify &quot;mmc&quot; in the search bar.&lt;/p&gt;
&lt;p&gt;Launch Microsoft Management Console.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-157.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 157&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s add the Certificates snap-in.&lt;/p&gt;
&lt;p&gt;Next, in the &quot;File&quot; menu, select &quot;Add/Remove Snap-in&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-158.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 158&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Available snap-ins&quot; section, select &quot;Certificates&quot; and click on the &quot;Add&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-159.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 159&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, select &quot;Computer account&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-160.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 160&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;Local computer&quot; and click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-161.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 161&quot;&gt;&lt;/p&gt;
&lt;p&gt;The snap-in has been added successfully.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-162.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 162&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Certificates (Local Computer)&quot; section, select the &quot;Trusted Root Certification Authorities&quot; subsection, then right-click on the &quot;Certificates&quot; subsection and select &quot;All Tasks&quot;, then &quot;Import&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-163.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 163&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-164.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 164&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to specify the path to the certificate of the certification authority.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Browse&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-165.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 165&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the certificate of the certification authority and click on the &quot;Open&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-166.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 166&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the path to the certificate of the certification authority is indicated, click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-167.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 167&quot;&gt;&lt;/p&gt;
&lt;p&gt;Then leave the settings unchanged and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-168.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 168&quot;&gt;&lt;/p&gt;
&lt;p&gt;Everything is ready to import the certificate into the &quot;Trusted Root Certification Authorities&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-169.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 169&quot;&gt;&lt;/p&gt;
&lt;p&gt;The CA certificate has been successfully imported.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-170.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 170&quot;&gt;&lt;/p&gt;
&lt;p&gt;We return to the Exchange Admin Center control panel.&lt;/p&gt;
&lt;p&gt;In the &quot;Servers&quot; section, select the &quot;Certificates&quot; subsection. Then select the new Exchange certificate and click on the &quot;Complete&quot; button on the right.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-171.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 171&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to specify the path to the Exchange certificate.&lt;/p&gt;
&lt;p&gt;Specify the path to the Exchange certificate and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-172.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 172&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the certificate is confirmed, it will appear in the &quot;Certificates&quot; subsection with the &quot;Valid&quot; status.&lt;/p&gt;
&lt;p&gt;Now you need to assign a new Exchange certificate for SMTP and IIS services.&lt;/p&gt;
&lt;p&gt;Select a new certificate and double-click on it with the left mouse button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-173.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 173&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Services&quot; section, check the boxes for &quot;SMTP&quot;, &quot;IMAP&quot;, &quot;POP&quot;, and &quot;IIS&quot;, then click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-174.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 174&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, a warning will appear asking you to overwrite the existing certificate for SMTP.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Yes&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-175.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 175&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the Exchange certificate is assigned to the services, the list of services in the &quot;Assigned to services&quot; field is updated.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-176.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 176&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, the Outlook Web App settings.&lt;/p&gt;
&lt;p&gt;In the &quot;Servers&quot; section, select the &quot;Virtual Directories&quot; subsection and select the &quot;owa (Default Web Site)&quot; virtual folder, and then double-click on it with the left mouse button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-177.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 177&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;General&quot; section, in the &quot;External URL&quot; field, specify the name by which your mail server is accessible from the Internet, and also specify &quot;/owa&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-178.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 178&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s configure user authorization by login without having to specify a domain.&lt;/p&gt;
&lt;p&gt;In the &quot;Authentication&quot; section in the &quot;Use forms-based authentication&quot; section, select &quot;User name only&quot;.&lt;/p&gt;
&lt;p&gt;Next, you need to select the main domain, click on the &quot;Browse&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-179.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 179&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the main domain and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-180.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 180&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the domain is specified, click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-181.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 181&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, a warning will appear asking you to restart IIS.&lt;/p&gt;
&lt;p&gt;IIS will restart later.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-182.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 182&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s write the address where your mail server is accessible from the Internet into the Exchange server configuration.&lt;/p&gt;
&lt;p&gt;In the &quot;Servers&quot; section, select the &quot;Virtual Directories&quot; subsection and select the &quot;ecp (Default Web Site)&quot; virtual folder, and then double-click on it with the left mouse button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-183.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 183&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;General&quot; section, in the &quot;External URL&quot; field, specify the name by which your mail server is accessible from the Internet, and also specify &quot;/ecp&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-184.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 184&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Servers&quot; section, select the &quot;Virtual Directories&quot; subsection and select the &quot;EWS (Default Web Site)&quot; virtual folder, and then double-click on it with the left mouse button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-185.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 185&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;General&quot; section, in the &quot;External URL&quot; field, specify the name by which your mail server is accessible from the Internet, and also specify &quot;/EWS/Exchange.asmx&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-186.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 186&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Servers&quot; section, select the &quot;Virtual Directories&quot; subsection and select the &quot;mapi (Default Web Site)&quot; virtual folder, and then double-click on it with the left mouse button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-187.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 187&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;General&quot; section, in the &quot;External URL&quot; field, specify the name by which your mail server is accessible from the Internet, and also specify &quot;/mapi&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-188.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 188&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Servers&quot; section, select the &quot;Virtual Directories&quot; subsection and select the &quot;Microsoft-Server-ActiveSync (Default Web Site)&quot; virtual folder, and then double-click on it with the left mouse button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-189.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 189&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;General&quot; section, in the &quot;External URL&quot; field, specify the name by which your mail server is accessible from the Internet, and also specify &quot;/Microsoft-Server-ActiveSync&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-190.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 190&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Servers&quot; section, select the &quot;Virtual Directories&quot; subsection and select the &quot;OAB (Default Web Site)&quot; virtual folder, and then double-click on it with the left mouse button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-191.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 191&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;General&quot; section, in the &quot;External URL&quot; field, specify the name by which your mail server is accessible from the Internet, and also specify &quot;/OAB&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-192.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 192&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Servers&quot; section, select the &quot;Virtual Directories&quot; subsection and select the &quot;PowerShell (Default Web Site)&quot; virtual folder, and then double-click on it with the left mouse button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-193.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 193&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;General&quot; section, in the &quot;External URL&quot; field, specify the name by which your mail server is accessible from the Internet, and also specify &quot;/powershell&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-194.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 194&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s configure the Outlook Anywhere service. This service is used to connect to the Exchange server via the Internet using &quot;Outlook&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Servers&quot; section, select the &quot;Servers&quot; subsection, select the Exchange server, and double-click on it with the left mouse button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-195.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 195&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, in the &quot;Specify the external hostname such as contoso.com that users will use to connect to your organization&quot; field, specify the name by which your mail server is accessible from the Internet. Then, in the &quot;Specify the authentication method for external clients to use when connecting to your organization&quot; menu, select &quot;NTLM&quot; and uncheck the &quot;Allow SSL offloading&quot; checkbox.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-196.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 196&quot;&gt;&lt;/p&gt;
&lt;p&gt;Pay attention to the warning.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-197.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 197&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s restart IIS.&lt;/p&gt;
&lt;p&gt;On the Exchange server, on the &quot;Taskbar&quot; select &quot;Windows PowerShell&quot; and after clicking the right mouse button click on &quot;Run as administrator&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-198.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 198&quot;&gt;&lt;/p&gt;
&lt;p&gt;Restart IIS using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;iisreset /noforce
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-199.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 199&quot;&gt;&lt;/p&gt;
&lt;p&gt;IIS restarted successfully.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-200.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 200&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s configure the ability to receive mail.&lt;/p&gt;
&lt;p&gt;In the &quot;Mail Flow&quot; section, select the &quot;Receive Connectors&quot; subsection, select the &quot;Default Frontend us-boston-ex-01&quot; receive connector, where &lt;code&gt;us-boston-ex-01&lt;/code&gt; is the name of my Exchange server. Then click on it twice with the left mouse button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-201.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 201&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;General&quot; section, in the &quot;Maximum receive message size&quot; field, you can configure the maximum allowable size of mail attachments for receiving.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-202.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 202&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Security&quot; section, check for a checkmark on the &quot;Anonymous users&quot; item.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-203.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 203&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s create a new user with a mailbox.&lt;/p&gt;
&lt;p&gt;In the &quot;Recipients&quot; section, select the &quot;Mailboxes&quot; subsection and click on the &quot;+&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-204.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 204&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now we specify the alias, first and last name for the new user.&lt;/p&gt;
&lt;p&gt;Then you need to select the organization unit in which you plan to create a new user.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Browse&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-205.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 205&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the OU in which you want to place the new user, and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-206.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 206&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;User logon name&quot; field, specify the login for the new user.&lt;/p&gt;
&lt;p&gt;Next, specify a strong password and click on the &quot;More options&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-207.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 207&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to select the database in which the mailbox for the new user will be created.&lt;/p&gt;
&lt;p&gt;In the &quot;Mailbox database&quot; section, click on the &quot;Browse&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-208.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 208&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the mailbox database and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-209.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 209&quot;&gt;&lt;/p&gt;
&lt;p&gt;Everything is ready to create a user with a mailbox.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-210.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 210&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the user with the mailbox is created, it will appear in the &quot;Mailboxes&quot; section.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-211.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 211&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to import the Exchange certificate into Trusted Root Certification Authorities on all computers in the domain.&lt;/p&gt;
&lt;p&gt;Go to the domain controller, create a folder and copy the Exchange certificate into it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-212.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 212&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, the certificate was copied to the &quot;ExchangeCertificate&quot; folder on the &quot;C&quot; drive.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-213.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 213&quot;&gt;&lt;/p&gt;
&lt;p&gt;Go back to &quot;Server Manager&quot; on the domain controller, then click on the &quot;Tools&quot; button in the upper right corner of the screen and select &quot;Group Policy Management&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-214.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 214&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s create a new Group Policy to import the certificate into Trusted Root Certification Authorities on all computers in the domain.&lt;/p&gt;
&lt;p&gt;Right-click on the domain name and select &quot;Create a GPO in this domain, and Link it here&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-215.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 215&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify a name for the new group policy and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-216.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 216&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, click on the new policy with the right mouse button and select &quot;Edit&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-217.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 217&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the Group Policy Editor, go to the &quot;Computer Configuration&quot; section, then to the &quot;Windows Settings&quot; subsection, then find the &quot;Security Settings&quot; section and select &quot;Public Key Policies&quot;, now right-click on &quot;Trusted Root Certification Authorities&quot; and select &quot; Import &quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-218.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 218&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-219.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 219&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to specify the path to the Exchange certificate.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Browse&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-220.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 220&quot;&gt;&lt;/p&gt;
&lt;p&gt;Go to the folder with the Exchange certificate and click on the &quot;Open&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-221.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 221&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the path to the certificate is specified, click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-222.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 222&quot;&gt;&lt;/p&gt;
&lt;p&gt;Then leave the settings unchanged and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-223.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 223&quot;&gt;&lt;/p&gt;
&lt;p&gt;Everything is ready to import the certificate into the &quot;Trusted Root Certification Authorities&quot; for all computers in the domain.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-224.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 224&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Exchange certificate has been successfully imported into Group Policy settings.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-225.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 225&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the certificate is imported into Group Policy settings, it will appear in the &quot;Trusted Root Certification Authorities&quot; section.&lt;/p&gt;
&lt;p&gt;The Exchange certificate will now be imported to all computers covered by this policy.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-226.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 226&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to restart your mail server.&lt;/p&gt;
&lt;p&gt;We return to the server with Exchange Server 2016 installed.&lt;/p&gt;
&lt;p&gt;On the keyboard, press the key combination &quot;Win&quot; and &quot;x&quot;, in the menu that opens, select &quot;Shut down or sign out&quot;, then &quot;Restart&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2016-227.webp&quot; alt=&quot;Configure Exchange Server 2016 - Step 227&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Exchange Server</category><category>Microsoft</category><category>Email</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Exchange Server 2016 on Windows Server 2012 R2</title><link>https://heyvaldemar.com/install-exchange-server-2016-on-windows-server-2012-r2/</link><guid isPermaLink="true">https://heyvaldemar.com/install-exchange-server-2016-on-windows-server-2012-r2/</guid><description>Step-by-step guide to install Exchange Server 2016 on Windows Server 2012 R2, including prerequisites, AD setup, and post-installation configuration.</description><pubDate>Sat, 03 Nov 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Exchange Server 2016 on Windows Server 2012 R2.&lt;/p&gt;
&lt;p&gt;:::note
For step-by-step instructions on installing Exchange Server 2019 on Windows Server 2019, refer to my guide: &lt;a href=&quot;/install-exchange-server-2019-on-windows-server-2019/&quot;&gt;Install Exchange Server 2019 on Windows Server 2019&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::warning
This guide walks you through installing Exchange Server 2016 without implementing failover.
:::&lt;/p&gt;
&lt;p&gt;:::note
The hardware requirements for Exchange 2016 are outlined in the official &lt;a href=&quot;https://docs.microsoft.com/en-us/Exchange/plan-and-deploy/system-requirements?view=exchserver-2016&quot;&gt;Microsoft documentation&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::important
We will consider the case when you already have two servers with the Windows Server 2012 R2 operating system installed on them. In addition, the Active Directory Domain Services role must be installed on one of the servers.&lt;/p&gt;
&lt;p&gt;For details on installing Windows Server 2012 R2, read my guide: &lt;a href=&quot;/install-windows-server-2012-r2/&quot;&gt;Install Windows Server 2012 R2&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::important
In addition, one of the servers must have the Active Directory Domain Services role installed, and the second server must be domain joined.&lt;/p&gt;
&lt;p&gt;You can learn how to install Active Directory Domain Services on Windows Server 2012 R2 by reading &lt;a href=&quot;/install-active-directory-domain-services-on-windows-server-2012-r2/&quot;&gt;Install Active Directory Domain Services on Windows Server 2012 R2&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
After installing Exchange Server 2016, follow my guide to complete the configuration: &lt;a href=&quot;/configure-exchange-server-2016/&quot;&gt;Configure Exchange Server 2016&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;The current version of Exchange Server 2016 can be downloaded from the &lt;a href=&quot;https://docs.microsoft.com/en-us/exchange/new-features/updates?view=exchserver-2016&quot;&gt;Microsoft updates page&lt;/a&gt;. After downloading, mount the ISO image to a virtual drive.&lt;/p&gt;
&lt;p&gt;:::important
This guide covers the installation of Exchange Server 2016 Cumulative Update 2 (Exchange 2016 CU2, released: June 2016). You need to download the current Cumulative Update at the time of reading the article. Each CU is a complete Exchange installation that includes updates and changes from all previous CUs. You don&apos;t need to install previous CUs or Exchange 2016 RTM.
:::&lt;/p&gt;
&lt;p&gt;On Windows Server 2012 R2, you must install all available updates before installing Exchange Server 2016.&lt;/p&gt;
&lt;p&gt;On the future Exchange server, go to the system under an account that consists of the following groups: Enterprise Admins, Schema Admins, and Domain Admins.&lt;/p&gt;
&lt;p&gt;On the &quot;Taskbar&quot;, right-click on &quot;Windows PowerShell&quot; and select &quot;Run as Administrator&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-1.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s install the remote administration tools for the subsequent preparation of Active Directory for the installation of Exchange Server 2016 using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Install-WindowsFeature RSAT-ADDS
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-2.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of installing the remote administration tools has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-3.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Installation of Remote Administration Tools completed successfully.&lt;/p&gt;
&lt;p&gt;Now you need to install additional components required for the Exchange server using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Install-WindowsFeature AS-HTTP-Activation, Server-Media-Foundation, NET-Framework-45-Features, RPC-over-HTTP-proxy, RSAT-Clustering, RSAT-Clustering-CmdInterface, RSAT-Clustering-Mgmt, RSAT-Clustering-PowerShell, WAS-Process-Model, Web-Asp-Net45, Web-Basic-Auth, Web-Client-Auth, Web-Digest-Auth, Web-Dir-Browsing, Web-Dyn-Compression, Web-Http-Errors, Web-Http-Logging, Web-Http-Redirect, Web-Http-Tracing, Web-ISAPI-Ext, Web-ISAPI-Filter, Web-Lgcy-Mgmt-Console, Web-Metabase, Web-Mgmt-Console, Web-Mgmt-Service, Web-Net-Ext45, Web-Request-Monitor, Web-Server, Web-Stat-Compression, Web-Static-Content, Web-Windows-Auth, Web-WMI, Windows-Identity-Foundation
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-4.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of installing additional components required for the Exchange Server has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-5.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;The installation of the additional components required for the Exchange Server has been completed successfully.&lt;/p&gt;
&lt;p&gt;Now you need to reboot the server.&lt;/p&gt;
&lt;p&gt;On the keyboard, press the key combination &quot;Win&quot; and &quot;x&quot;, in the menu that opens, select &quot;Shut down or sign out&quot;, then &quot;Restart&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-6.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;The server will start to reboot.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-7.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;On the future Exchange server, go to the system under an account that consists of the following groups: Enterprise Admins, Schema Admins, and Domain Admins.&lt;/p&gt;
&lt;p&gt;Before preparing Active Directory and installing Exchange Server 2019, you need to install additional software on the future Exchange server:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Unified Communications Managed API 4.0&lt;/li&gt;
&lt;li&gt;Visual C++ Redistributable Package for Visual Studio 2012&lt;/li&gt;
&lt;li&gt;Visual C++ Redistributable Package for Visual Studio 2013&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let&apos;s install Unified Communications Managed API 4.0&lt;/p&gt;
&lt;p&gt;Head over to the &lt;a href=&quot;https://www.microsoft.com/en-us/download/details.aspx?id=34992&quot;&gt;Microsoft download page&lt;/a&gt; and click the &quot;Download&quot; button to begin.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-8.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Run the downloaded Unified Communications Managed API 4.0 installer file.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-9.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;The &quot;Unified Communications Managed API 4.0 Installation Wizard&quot; will open.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-10.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you must accept the license terms, if you agree with them, and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-11.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;The installation process for &quot;Unified Communications Managed API 4.0&quot; has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-12.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;Installation of &quot;Unified Communications Managed API 4.0&quot; is complete.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-13.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s install Visual C++ Redistributable Package for Visual Studio 2012.&lt;/p&gt;
&lt;p&gt;Visit the &lt;a href=&quot;https://www.microsoft.com/en-us/download/details.aspx?id=30679&quot;&gt;Microsoft download page&lt;/a&gt; and click the &quot;Download&quot; button to start the download.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-14.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;VSU_4\vcredist_x64.exe&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-15.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;Run the downloaded Visual C ++ Redistributable Package for Visual Studio 2012 installer file.&lt;/p&gt;
&lt;p&gt;Next, you must accept the license terms, if you agree with them, and click on the &quot;Install&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-16.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;Installation of Visual C ++ Redistributable Package for Visual Studio 2012 completed successfully.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-17.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 17&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s install Visual C++ Redistributable Package for Visual Studio 2013.&lt;/p&gt;
&lt;p&gt;Go to the &lt;a href=&quot;https://www.microsoft.com/en-us/download/details.aspx?id=40784&quot;&gt;Microsoft download page&lt;/a&gt; and click the &quot;Download&quot; button to initiate the download.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-18.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 18&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;vcredist_x64.exe&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-19.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 19&quot;&gt;&lt;/p&gt;
&lt;p&gt;Run the downloaded Visual C ++ Redistributable Package for Visual Studio 2013 installer file.&lt;/p&gt;
&lt;p&gt;Next, you must accept the license terms, if you agree with them, and click on the &quot;Install&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-20.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 20&quot;&gt;&lt;/p&gt;
&lt;p&gt;Installation of Visual C++ Redistributable Package for Visual Studio 2013 completed successfully.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-21.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 21&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to prepare Active Directory to work with Exchange Server.&lt;/p&gt;
&lt;p&gt;Click &quot;Start&quot;, point to &quot;cmd&quot; in the search bar, then right-click on &quot;Command Prompt&quot; and select &quot;Run as administrator&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-22.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 22&quot;&gt;&lt;/p&gt;
&lt;p&gt;Go to drive &quot;D&quot; (virtual drive) where the Exchange Server 2016 installation files are located using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;cd D:\
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-23.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 23&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s prepare the Active Directory schema to work with Exchange Server using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;E:\Setup.exe /IAcceptExchangeServerLicenseTerms_DiagnosticDataON /PrepareSchema
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-24.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 24&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of preparing the Active Directory schema has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-25.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 25&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Active Directory schema preparation process completed successfully.&lt;/p&gt;
&lt;p&gt;Now you need to prepare containers, objects, and other Active Directory components and create the Exchange organization.&lt;/p&gt;
&lt;p&gt;:::note
After &quot;OrganizationName&quot; you must indicate the name of your organization in English.
:::&lt;/p&gt;
&lt;p&gt;Let&apos;s prepare containers, objects, and other Active Directory components, as well as create an Exchange organization, using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;E:\Setup.exe /IAcceptExchangeServerLicenseTerms_DiagnosticDataON /PrepareAD /OrganizationName:&quot;VMKH&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
This manual uses the organization&apos;s name &quot;VMKH&quot;.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-26.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 26&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of preparing containers, objects, and other Active Directory components has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-27.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 27&quot;&gt;&lt;/p&gt;
&lt;p&gt;The preparation process for containers, objects, and other Active Directory components has been completed successfully.&lt;/p&gt;
&lt;p&gt;Now you need to prepare the domain for the Exchange Server installation.&lt;/p&gt;
&lt;p&gt;Prepare a domain for installing Exchange Server using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;E:\Setup.exe /IAcceptExchangeServerLicenseTerms_DiagnosticDataON /PrepareDomain:vmkh.org
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
This tutorial uses the &quot;vmkh.org&quot; domain.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-28.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 28&quot;&gt;&lt;/p&gt;
&lt;p&gt;The domain preparation process has completed successfully.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-29.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 29&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you can start installing Exchange Server 2016.&lt;/p&gt;
&lt;p&gt;Go to drive &quot;D&quot; (virtual drive) where the Exchange Server 2016 installation files are located and run &quot;Setup.exe&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-30.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 30&quot;&gt;&lt;/p&gt;
&lt;p&gt;At this point, you can check for updates to Exchange Server 2016.&lt;/p&gt;
&lt;p&gt;Select &quot;Connect to the Internet and check for updates&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-31.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 31&quot;&gt;&lt;/p&gt;
&lt;p&gt;There are currently no updates for Exchange Server 2016.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-32.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 32&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, the &quot;Exchange Server Setup Wizard&quot; invites you to read the information regarding Exchange Server 2016.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-33.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 33&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you must accept the license terms, if you agree with them, and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-34.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 34&quot;&gt;&lt;/p&gt;
&lt;p&gt;We select &quot;Don&apos;t use recommended settings&quot; so that the Exchange server does not automatically send error reports and other information on the use of the Exchange server to Microsoft.&lt;/p&gt;
&lt;p&gt;Click &quot;Next&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-35.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 35&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to choose which roles will be installed on your server.&lt;/p&gt;
&lt;p&gt;Select &quot;Mailbox role&quot;, then select &quot;Automatically install Windows Server roles and features that are required to install Exchange Server&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-36.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 36&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you can select the directory where you want to install Exchange Server 2016.&lt;/p&gt;
&lt;p&gt;Leave the settings unchanged and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-37.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 37&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can now configure your anti-malware settings.&lt;/p&gt;
&lt;p&gt;In the &quot;Disable malware scanning&quot; item, select &quot;No&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-38.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 38&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, the process of checking readiness for installation will begin, after it is completed, you can start the installation process of Exchange Server 2016.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Install&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-39.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 39&quot;&gt;&lt;/p&gt;
&lt;p&gt;The installation process for Exchange Server 2016 has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-40.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 40&quot;&gt;&lt;/p&gt;
&lt;p&gt;Exchange Server 2016 installation completed successfully.&lt;/p&gt;
&lt;p&gt;Select &quot;Launch Exchange Administration Center after finishing Exchange setup&quot; and click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-41.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 41&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
The Exchange Administration Center is used to administer the Exchange server, available at &lt;code&gt;https://us-boston-ex-01/ecp&lt;/code&gt;, where &lt;code&gt;us-boston-ex-01&lt;/code&gt; is the name of my Exchange server. Accordingly, you need to specify the name or IP address of your server with Exchange Server 2016 installed.
:::&lt;/p&gt;
&lt;p&gt;To display the Exchange Administration Center Control Panel correctly, you must add the Exchange Server address to Trusted Sites in Internet Explorer.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Add&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-42.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 42&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Add this website to the zone&quot; field, specify the address of the Exchange server and click on the &quot;Add&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-43.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 43&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Exchange server address has been added to the list of trusted sites.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-44.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 44&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to specify the username and password of an account with Exchange administrator rights and click on the &quot;Sign in&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-45.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 45&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to select the language in which further information will be displayed, as well as the time zone.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-46.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 46&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Exchange Admin Center Control Panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-47.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 47&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can now check the status of the Exchange Server services.&lt;/p&gt;
&lt;p&gt;Click &quot;Start&quot;, point to &quot;Exchange Management Shell&quot; in the search bar, then right-click on &quot;Exchange Management Shell&quot; and select &quot;Run as administrator&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-48.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 48&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s check the status of the Exchange Server services using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Test-ServiceHealth
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-49.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 49&quot;&gt;&lt;/p&gt;
&lt;p&gt;Service check completed successfully.&lt;/p&gt;
&lt;p&gt;A &quot;True&quot; value in &quot;RequireServiceRunning&quot; indicates that the services are running.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2016-on-windows-server-2012-r2-50.webp&quot; alt=&quot;Install Exchange Server 2016 on Windows Server 2012 R2 - Step 50&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Exchange Server</category><category>Windows Server</category><category>Email</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Exchange Server 2013</title><link>https://heyvaldemar.com/install-exchange-server-2013/</link><guid isPermaLink="true">https://heyvaldemar.com/install-exchange-server-2013/</guid><description>Step-by-step guide to install Exchange Server 2013 on Windows Server 2012 R2, including prerequisites, AD preparation, and full installation walkthrough.</description><pubDate>Thu, 01 Nov 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Exchange Server 2013.&lt;/p&gt;
&lt;p&gt;:::note
For details on installing Exchange Server 2016 on Windows Server 2012 R2, read my guide: &lt;a href=&quot;/install-exchange-server-2016-on-windows-server-2012-r2/&quot;&gt;Install Exchange Server 2016 on Windows Server 2012 R2&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::warning
This guide walks you through installing Exchange Server 2013 without implementing fault tolerance.
:::&lt;/p&gt;
&lt;p&gt;:::note
The hardware requirements for Exchange 2013 are outlined in the official &lt;a href=&quot;https://docs.microsoft.com/en-us/Exchange/exchange-2013-prerequisites-exchange-2013-help&quot;&gt;Microsoft documentation&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::important
We will consider the case when you already have two servers with the Windows Server 2012 R2 operating system installed on them. In addition, the Active Directory Domain Services role must be installed on one of the servers.&lt;/p&gt;
&lt;p&gt;For details on installing Windows Server 2012 R2, read my guide: &lt;a href=&quot;/install-windows-server-2012-r2/&quot;&gt;Install Windows Server 2012 R2&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::important
In addition, one of the servers must have the Active Directory Domain Services role installed, and the second server must be domain joined.&lt;/p&gt;
&lt;p&gt;You can learn how to install Active Directory Domain Services on Windows Server 2012 R2 by reading &lt;a href=&quot;/install-active-directory-domain-services-on-windows-server-2012-r2/&quot;&gt;Install Active Directory Domain Services on Windows Server 2012 R2&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
After installing Exchange Server 2016, follow my guide to complete the configuration: &lt;a href=&quot;/configure-exchange-server-2016/&quot;&gt;Configure Exchange Server 2016&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
The latest version of Exchange Server 2013 can be downloaded from the &lt;a href=&quot;https://docs.microsoft.com/en-us/exchange/updates-for-exchange-2013-exchange-2013-help&quot;&gt;Microsoft updates page&lt;/a&gt;. After downloading, mount the ISO image to a virtual drive.
:::&lt;/p&gt;
&lt;p&gt;:::important
This guide covers the installation of Exchange Server 2013 Cumulative Update 14 (Exchange 2013 CU14, released: September 2016 Quarterly Exchange Updates). You need to download the current Cumulative Update at the time of reading the article. Each CU is a complete Exchange installation that includes updates and changes from all previous CUs. You don&apos;t need to install previous CUs or Exchange 2013 RTM.
:::&lt;/p&gt;
&lt;p&gt;On Windows Server 2012 R2, you must install all available updates before installing Exchange Server 2013.&lt;/p&gt;
&lt;p&gt;On the future Exchange server, go to the system under an account that consists of the following groups: Enterprise Admins, Schema Admins, and Domain Admins.&lt;/p&gt;
&lt;p&gt;On the &quot;Taskbar&quot;, right-click on &quot;Windows PowerShell&quot; and select &quot;Run as Administrator&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-1.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Install the remote administration tools for the subsequent preparation of Active Directory for the installation of Exchange Server 2013 using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Install-WindowsFeature RSAT-ADDS
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-2.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of installing the remote administration tools has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-3.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Installation of Remote Administration Tools completed successfully.&lt;/p&gt;
&lt;p&gt;Now you need to install additional components required for the Exchange server using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Install-WindowsFeature AS-HTTP-Activation, Desktop-Experience, NET-Framework-45-Features, RPC-over-HTTP-proxy, RSAT-Clustering, RSAT-Clustering-CmdInterface, RSAT-Clustering-Mgmt, RSAT-Clustering-PowerShell, Web-Mgmt-Console, WAS-Process-Model, Web-Asp-Net45, Web-Basic-Auth, Web-Client-Auth, Web-Digest-Auth, Web-Dir-Browsing, Web-Dyn-Compression, Web-Http-Errors, Web-Http-Logging, Web-Http-Redirect, Web-Http-Tracing, Web-ISAPI-Ext, Web-ISAPI-Filter, Web-Lgcy-Mgmt-Console, Web-Metabase, Web-Mgmt-Console, Web-Mgmt-Service, Web-Net-Ext45, Web-Request-Monitor, Web-Server, Web-Stat-Compression, Web-Static-Content, Web-Windows-Auth, Web-WMI, Windows-Identity-Foundation, RSAT-ADDS
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-4.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of installing additional components required for the Exchange Server has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-5.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;The installation of the additional components required for the Exchange Server has been completed successfully.&lt;/p&gt;
&lt;p&gt;Now you need to reboot the server.&lt;/p&gt;
&lt;p&gt;On the keyboard, press the key combination &quot;Win&quot; and &quot;x&quot;, in the menu that opens, select &quot;Shut down or sign out&quot;, then &quot;Restart&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-6.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, the server will start to reboot.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-7.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;On the future Exchange server, go to the system under an account that consists of the following groups: Enterprise Admins, Schema Admins, and Domain Admins.&lt;/p&gt;
&lt;p&gt;Before preparing Active Directory and installing Exchange Server 2019, you need to install additional software on the future Exchange server:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Unified Communications Managed API 4.0&lt;/li&gt;
&lt;li&gt;Visual C++ Redistributable Package for Visual Studio 2012&lt;/li&gt;
&lt;li&gt;Visual C++ Redistributable Package for Visual Studio 2013&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let&apos;s install Unified Communications Managed API 4.0&lt;/p&gt;
&lt;p&gt;Visit the &lt;a href=&quot;https://www.microsoft.com/en-us/download/details.aspx?id=34992&quot;&gt;Microsoft download page&lt;/a&gt; and select the &quot;Download&quot; button to begin the download.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-8.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Run the downloaded Unified Communications Managed API 4.0 installer file.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-9.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;The &quot;Unified Communications Managed API 4.0 Installation Wizard&quot; will open.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-10.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you must accept the license terms, if you agree with them, and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-11.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;The installation process for &quot;Unified Communications Managed API 4.0&quot; has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-12.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;Installation of &quot;Unified Communications Managed API 4.0&quot; is complete.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-13.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s install Visual C++ Redistributable Package for Visual Studio 2012.&lt;/p&gt;
&lt;p&gt;Go to the &lt;a href=&quot;https://www.microsoft.com/en-us/download/details.aspx?id=30679&quot;&gt;Microsoft download page&lt;/a&gt; and click the &quot;Download&quot; button to start the process.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-14.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;VSU_4\vcredist_x64.exe&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-15.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;Run the downloaded Visual C++ Redistributable Package for Visual Studio 2012 installer file.&lt;/p&gt;
&lt;p&gt;Next, you must accept the license terms, if you agree with them, and click on the &quot;Install&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-16.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;Installation of Visual C++ Redistributable Package for Visual Studio 2012 completed successfully.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-17.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 17&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s install Visual C++ Redistributable Package for Visual Studio 2013.&lt;/p&gt;
&lt;p&gt;Navigate to the &lt;a href=&quot;https://www.microsoft.com/en-us/download/details.aspx?id=40784&quot;&gt;Microsoft download page&lt;/a&gt; and click the &quot;Download&quot; button to initiate the process.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-18.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 18&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;vcredist_x64.exe&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-19.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 19&quot;&gt;&lt;/p&gt;
&lt;p&gt;Run the downloaded Visual C++ Redistributable Package for Visual Studio 2013 installer file.&lt;/p&gt;
&lt;p&gt;Next, you must accept the license terms, if you agree with them, and click on the &quot;Install&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-20.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 20&quot;&gt;&lt;/p&gt;
&lt;p&gt;Installation of Visual C++ Redistributable Package for Visual Studio 2013 completed successfully.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-21.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 21&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now, run the Exchange Server 2013 installer file we downloaded earlier.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-22.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 22&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify in which directory you want to unpack the Exchange Server 2013 installation files and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-23.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 23&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of unpacking Exchange Server 2013 to the specified directory has started.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-24.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 24&quot;&gt;&lt;/p&gt;
&lt;p&gt;The unpacking of Exchange Server 2013 is now complete.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-25.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 25&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to prepare Active Directory to work with Exchange Server.&lt;/p&gt;
&lt;p&gt;On the &quot;Taskbar&quot;, right-click on &quot;Windows PowerShell&quot; and select &quot;Run as Administrator&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-26.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 26&quot;&gt;&lt;/p&gt;
&lt;p&gt;Go to the directory with Exchange installation files using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;cd C:\Exchange
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-27.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 27&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s prepare the Active Directory schema to work with Exchange Server using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;.\setup.exe /PrepareSchema /IAcceptExchangeServerLicenseTerms
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-28.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 28&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of preparing the Active Directory schema has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-29.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 29&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Active Directory schema preparation process completed successfully.&lt;/p&gt;
&lt;p&gt;Now you need to prepare containers, objects, and other Active Directory components and create the Exchange organization.&lt;/p&gt;
&lt;p&gt;:::note
After &quot;OrganizationName&quot; you must indicate the name of your organization in English.
:::&lt;/p&gt;
&lt;p&gt;Let&apos;s prepare containers, objects, and other Active Directory components, as well as create an Exchange organization, using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;.\setup.exe /PrepareAD /OrganizationName:&quot;VMKH&quot; /IAcceptExchangeServerLicenseTerms
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
This manual uses the organization&apos;s name &quot;VMKH&quot;.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-30.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 30&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of preparing containers, objects, and other Active Directory components has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-31.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 31&quot;&gt;&lt;/p&gt;
&lt;p&gt;The preparation process for containers, objects, and other Active Directory components has been completed successfully.&lt;/p&gt;
&lt;p&gt;Now you need to prepare the domain for the Exchange Server installation.&lt;/p&gt;
&lt;p&gt;Prepare a domain for installing Exchange Server using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;.\setup.exe /PrepareDomain:vmkh.org /IAcceptExchangeServerLicenseTerms
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
This tutorial uses the &quot;vmkh.org&quot; domain.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-32.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 32&quot;&gt;&lt;/p&gt;
&lt;p&gt;The domain preparation process has completed successfully.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-33.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 33&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you can start installing Exchange Server 2013.&lt;/p&gt;
&lt;p&gt;Go to the directory with Exchange installation files and run &quot;setup.exe&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-34.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 34&quot;&gt;&lt;/p&gt;
&lt;p&gt;At this point, you can check for updates to Exchange Server 2013.&lt;/p&gt;
&lt;p&gt;Select &quot;Connect to the Internet and check for updates&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-35.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 35&quot;&gt;&lt;/p&gt;
&lt;p&gt;There are currently no updates for Exchange Server 2013.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-36.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 36&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, the &quot;Exchange Server Setup Wizard&quot; invites you to read information about Exchange Server 2013.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-37.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 37&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you must accept the license terms, if you agree with them, and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-38.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 38&quot;&gt;&lt;/p&gt;
&lt;p&gt;We select &quot;Don&apos;t use recommended settings&quot; so that the Exchange server does not automatically send error reports and other information on the use of the Exchange server to Microsoft.&lt;/p&gt;
&lt;p&gt;Click &quot;Next&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-39.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 39&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to choose which roles will be installed on your server.&lt;/p&gt;
&lt;p&gt;Select &quot;Mailbox role&quot; and &quot;Client Access role&quot;, then select &quot;Automatically install Windows Server roles and features that are required to install Exchange Server&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-40.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 40&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you can select the directory where you want to install Exchange Server 2013.&lt;/p&gt;
&lt;p&gt;Leave the settings unchanged and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-41.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 41&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can now configure your anti-malware settings.&lt;/p&gt;
&lt;p&gt;In the &quot;Disable malware scanning&quot; item, select &quot;No&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-42.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 42&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, the readiness to install process will begin, after it is completed, you can start the Exchange Server 2013 installation process.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Install&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-43.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 43&quot;&gt;&lt;/p&gt;
&lt;p&gt;The installation process for Exchange Server 2013 has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-44.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 44&quot;&gt;&lt;/p&gt;
&lt;p&gt;Exchange Server 2013 installation completed successfully.&lt;/p&gt;
&lt;p&gt;Select &quot;Launch Exchange Administration Center after finishing Exchange setup&quot; and click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-45.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 45&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
The Exchange Administration Center is used to administer the Exchange server, available at &lt;code&gt;https://us-boston-ex-01/ecp&lt;/code&gt;, where &lt;code&gt;us-boston-ex-01&lt;/code&gt; is the name of my Exchange server. Accordingly, you need to specify the name or IP address of your server with Exchange Server 2013 installed.
:::&lt;/p&gt;
&lt;p&gt;To display the Exchange Administration Center Control Panel correctly, you must add the Exchange Server address to Trusted Sites in Internet Explorer.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Add&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-46.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 46&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Add this website to the zone&quot; field, specify the address of the Exchange server and click on the &quot;Add&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-47.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 47&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Exchange server address has been added to the list of trusted sites.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-48.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 48&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to specify the username and password of an account with Exchange administrator rights and click on the &quot;Sign in&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-49.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 49&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to select the language in which further information will be displayed, as well as the time zone.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-50.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 50&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Exchange Admin Center Control Panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-51.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 51&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can now check the status of the Exchange Server services.&lt;/p&gt;
&lt;p&gt;Click &quot;Start&quot;, point to &quot;Exchange Management Shell&quot; in the search bar, then right-click on &quot;Exchange Management Shell&quot; and select &quot;Run as administrator&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-52.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 52&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s check the status of the Exchange Server services using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Test-ServiceHealth

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-53.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 53&quot;&gt;&lt;/p&gt;
&lt;p&gt;Service check completed successfully.&lt;/p&gt;
&lt;p&gt;A &quot;True&quot; value in &quot;RequireServiceRunning&quot; indicates that the services are running.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2013-54.webp&quot; alt=&quot;Install Exchange Server 2013 - Step 54&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Exchange Server</category><category>Microsoft</category><category>Email</category><category>Windows Server</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Basic Setup of Windows Server 2012 R2</title><link>https://heyvaldemar.com/basic-setup-of-windows-server-2012-r2/</link><guid isPermaLink="true">https://heyvaldemar.com/basic-setup-of-windows-server-2012-r2/</guid><description>Step-by-step guide to setting up Windows Server 2012 R2 - hostname, RDP access, time zone, static IP, domain join, and system locale configuration.</description><pubDate>Sun, 21 Oct 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and clear guide on how to basic setup Windows Server 2012 R2.&lt;/p&gt;
&lt;p&gt;:::important
We will consider the case when you already have a server with the Windows Server 2012 R2 operating system installed on it.&lt;/p&gt;
&lt;p&gt;For details on installing Windows Server 2012 R2, read my guide: &lt;a href=&quot;/install-windows-server-2012-r2/&quot;&gt;Install Windows Server 2012 R2&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
To learn how to install Active Directory Domain Services on Windows Server 2012 R2, read: &lt;a href=&quot;/install-active-directory-domain-services-on-windows-server-2012-r2/&quot;&gt;Install Active Directory Domain Services on Windows Server 2012 R2&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;Let&apos;s give the server the correct name according to your organization&apos;s standards.&lt;/p&gt;
&lt;p&gt;We go into the system under an account with administrator rights.&lt;/p&gt;
&lt;p&gt;On the keyboard, press the key combination &quot;Win&quot; and &quot;x&quot;, then select &quot;System&quot; in the menu that opens.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-1.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, in the &quot;System&quot; window in the &quot;Computer name, domain, and workgroup settings&quot; section, click on the &quot;Change settings&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-2.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;System Properties&quot; window on the &quot;Computer Name&quot; tab, click on the &quot;Change&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-3.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;I highly recommend that you think ahead about the name of the servers in your organization.&lt;/p&gt;
&lt;p&gt;Next, specify the new server name in the &quot;Computer Name&quot; field and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-4.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;The system will warn you that you need to restart the server to apply the new settings.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-5.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s allow access to the server desktop via the RDP protocol.&lt;/p&gt;
&lt;p&gt;Go to the &quot;Remote&quot; tab and select &quot;Allow remote connections to this computer&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-6.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-7.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Apply&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-8.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now the system will offer to restart the server for the new settings to take effect.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Restart Now&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-9.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;We will indicate the correct time zone.&lt;/p&gt;
&lt;p&gt;We go into the system under an account with administrator rights.&lt;/p&gt;
&lt;p&gt;On the keyboard, press the key combination &quot;Win&quot; and &quot;x&quot;, then select &quot;Control Panel&quot; in the menu that opens.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-10.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;We select &quot;Set the time and date&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-11.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, click on the &quot;Change time zone&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-12.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the time zone in which the server is located and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-13.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Date and Time&quot; window, click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-14.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now we will indicate the regional standards.&lt;/p&gt;
&lt;p&gt;Go back to the &quot;Control Panel&quot; and choose &quot;Change date, time, or number formats&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-15.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Format&quot; menu, select the country where the server is located, and go to the &quot;Location&quot; tab.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-16.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Home location&quot; field, select the country where the server is located, and go to the &quot;Administrative&quot; tab.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-17.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 17&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, click on the &quot;Copy settings&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-18.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 18&quot;&gt;&lt;/p&gt;
&lt;p&gt;We put a tick on the item &quot;Welcome screen and system accounts&quot; and on the item &quot;New user accounts&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-19.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 19&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, click on the &quot;Change system locale&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-20.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 20&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Current system locale&quot; field, select the country where the server is located and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-21.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 21&quot;&gt;&lt;/p&gt;
&lt;p&gt;The system will offer to restart the server for the new settings to take effect.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Restart Now&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-22.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 22&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, the server will start to reboot.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-23.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 23&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to register a static IP address in the network connection settings.&lt;/p&gt;
&lt;p&gt;After rebooting the server, go to the system under an account with administrator rights.&lt;/p&gt;
&lt;p&gt;On the keyboard, press the key combination &quot;Win&quot; and &quot;x&quot;, then select &quot;Network Connections&quot; in the menu that opens.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-24.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 24&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now right-click on the &quot;Ethernet&quot; network connection and select &quot;Properties&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-25.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 25&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;Internet Protocol Version 4&quot; and click on the &quot;Properties&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-26.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 26&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, select the &quot;Use the following IP address&quot; item and specify a free IP address, subnet mask, and gateway.&lt;/p&gt;
&lt;p&gt;:::note
You must understand in advance how your network works and know which IP addresses are available.
:::&lt;/p&gt;
&lt;p&gt;In the &quot;Preferred DNS server&quot; field, enter the IP address of your DNS server.&lt;/p&gt;
&lt;p&gt;This guide specifies the DNS server that is located on the domain controller.&lt;/p&gt;
&lt;p&gt;:::note
To learn how to install Active Directory Domain Services on Windows Server 2012 R2, read: &lt;a href=&quot;/install-active-directory-domain-services-on-windows-server-2012-r2/&quot;&gt;Install Active Directory Domain Services on Windows Server 2012 R2&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;Click the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-27.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 27&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Ethernet Properties&quot; window, click on the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-28.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 28&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s add the server to the domain.&lt;/p&gt;
&lt;p&gt;On the keyboard, press the key combination &quot;Win&quot; and &quot;x&quot;, then select &quot;System&quot; in the menu that opens.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-29.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 29&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, in the &quot;System&quot; window in the &quot;Computer name, domain, and workgroup settings&quot; section, click on the &quot;Change settings&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-30.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 30&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;System Properties&quot; window on the &quot;Computer Name&quot; tab, click on the &quot;Change&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-31.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 31&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, in the &quot;Domain&quot; field, indicate the domain to which you want to add the server, and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-32.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 32&quot;&gt;&lt;/p&gt;
&lt;p&gt;We specify the login and password for an account that has the right to add computers to the domain.&lt;/p&gt;
&lt;p&gt;For example, a domain administrator has such rights.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-33.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 33&quot;&gt;&lt;/p&gt;
&lt;p&gt;The server was successfully added to the domain.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-34.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 34&quot;&gt;&lt;/p&gt;
&lt;p&gt;The system will warn you that you need to restart the server to apply the new settings.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-35.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 35&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;System Properties&quot; window, click on the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-36.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 36&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now the system will offer to restart the server for the new settings to take effect.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Restart Now&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-37.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 37&quot;&gt;&lt;/p&gt;
&lt;p&gt;On the domain controller in the Active Directory Users and Computers snap-in, you can see the server that you added to the domain. It will appear in the &quot;Computers&quot; container.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./basic-setup-of-windows-server-2012-r2-38.webp&quot; alt=&quot;Basic Setup of Windows Server 2012 R2 - Step 38&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Windows Server</category><category>Networking</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install and Configure Windows Server Update Services on Windows Server 2012 R2</title><link>https://heyvaldemar.com/install-and-configure-windows-server-update-services-on-windows-server-2012-r2/</link><guid isPermaLink="true">https://heyvaldemar.com/install-and-configure-windows-server-update-services-on-windows-server-2012-r2/</guid><description>Learn how to install and configure WSUS on Windows Server 2012 R2 for centralized patch management. Step-by-step guide with screenshots and best practices.</description><pubDate>Fri, 19 Oct 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing and configure Windows Server Update Services on Windows Server 2012 R2.&lt;/p&gt;
&lt;p&gt;:::important
In this guide, we will consider the case when you already have a server with the Windows Server 2012 R2 operating system installed on it.
:::&lt;/p&gt;
&lt;p&gt;:::note
For details on installing Windows Server 2012 R2, read my guide: &lt;a href=&quot;/install-windows-server-2012-r2/&quot;&gt;Install Windows Server 2012 R2&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;You can learn how to install Active Directory Domain Services on Windows Server 2012 R2 by reading &lt;a href=&quot;/install-active-directory-domain-services-on-windows-server-2012-r2/&quot;&gt;Install Active Directory Domain Services on Windows Server 2012 R2&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Before starting the installation of the Windows Server Update Services role, you must give the server the correct name according to your organization&apos;s standards, and then specify a static IP address in the network connection settings. In addition, the server must be added to the domain.&lt;/p&gt;
&lt;p&gt;In my &lt;a href=&quot;/basic-setup-of-windows-server-2012-r2/&quot;&gt;Basic Setup of Windows Server 2012 R2&lt;/a&gt; guide, you can read about how to perform basic Windows Server 2012 R2 configuration and add a server to a domain.&lt;/p&gt;
&lt;p&gt;:::note
Before installing updates on production servers, you must test the installation of updates on test servers.
:::&lt;/p&gt;
&lt;p&gt;Go to the future update server and log into the system under an account with administrator rights.&lt;/p&gt;
&lt;p&gt;The first step is to think over which folder the updates will be downloaded to. It is best to use a folder on a separate local drive to store downloaded updates. The amount of free space on the dedicated disk must be at least 10 Gb.&lt;/p&gt;
&lt;p&gt;Let&apos;s create a new folder for updates.&lt;/p&gt;
&lt;p&gt;Go to an additional local disk and right-click on the free space, in the menu that opens, select &quot;New&quot;, then &quot;Folder&quot;.&lt;/p&gt;
&lt;p&gt;Specify a name for the new folder and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-1.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;The new update folder is ready.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-2.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can now begin installing the Windows Server Update Services role.&lt;/p&gt;
&lt;p&gt;Open &quot;Server Manager&quot;, click on the &quot;Manage&quot; button in the upper right corner of the screen, and select &quot;Add Roles and Features&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-3.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-4.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the installation type &quot;Role-based or feature-based installation&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-5.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, select the server on which the role will be installed.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-6.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the &quot;Windows Server Update Services&quot; role.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-7.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, the Role Installation Wizard will warn you that several components need to be installed to install the Windows Server Update Services role.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Add Features&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-8.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-9.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;At the stage of adding components, we leave all the default values.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-10.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, the &quot;Role Installation Wizard&quot; invites you to familiarize yourself with additional information regarding the &quot;Windows Server Update Services&quot; role.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-11.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to choose where the update service will store its service data. To do this, you can use SQL Server or store the data in the Windows Internal Database (WID). WID has no database size limit and does not require an additional license to use.&lt;/p&gt;
&lt;p&gt;This manual will use the Windows Internal Database for data storage.&lt;/p&gt;
&lt;p&gt;We select &quot;WID Database&quot; and &quot;WSUS Services&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-12.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;We indicate the path to the previously created folder where you plan to store the downloaded updates.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-13.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, the &quot;Role Installation Wizard&quot; will warn you that the &quot;Internet Information Services&quot; webserver role will be additionally installed for the &quot;Windows Server Update Services&quot; role.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-14.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;At the stage of adding components, we leave all the default values.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-15.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;To start the installation of the selected role, click on the &quot;Install&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-16.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;The installation of the selected role and the components required for it has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-17.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 17&quot;&gt;&lt;/p&gt;
&lt;p&gt;The installation of the Windows Server Update Services role is now complete.&lt;/p&gt;
&lt;p&gt;Now click on the &quot;Launch Post-Installation tasks&quot; button in order for the &quot;Role Installation Wizard&quot; to launch the tasks for the initial configuration of the new role.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-18.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 18&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of performing tasks on the initial configuration of the new role has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-19.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 19&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of performing tasks for the initial configuration of a new role is now complete.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-20.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 20&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to do some basic configuration of the Windows Server Update Services role.&lt;/p&gt;
&lt;p&gt;Go back to the &quot;Server Manager&quot;, click on the &quot;Tools&quot; button in the upper right corner of the screen and select &quot;Windows Server Update Services&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-21.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 21&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-22.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 22&quot;&gt;&lt;/p&gt;
&lt;p&gt;Further, it is proposed to participate in the quality improvement program.&lt;/p&gt;
&lt;p&gt;Uncheck &quot;Yes, I would like to join the Microsoft Update Improvement Program&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-23.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 23&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to select the source from where your server will download updates for their further distribution on the local network. To do this, you can use Microsoft servers or download updates from another server with the Windows Server Update Services role on your local network.&lt;/p&gt;
&lt;p&gt;:::note
In this guide, the server will download updates over the Internet from Microsoft&apos;s servers.
:::&lt;/p&gt;
&lt;p&gt;Select &quot;Synchronize from Microsoft Update&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-24.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 24&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you can specify the settings for connecting to the Internet through a proxy server.&lt;/p&gt;
&lt;p&gt;This manual does not use a proxy server.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-25.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 25&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to connect to the update source to get information about available updates.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Start Connecting&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-26.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 26&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of connecting to the update source is now complete.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-27.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 27&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to select which languages you want to download updates.&lt;/p&gt;
&lt;p&gt;Select the required languages and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-28.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 28&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to choose which products you want to download updates.&lt;/p&gt;
&lt;p&gt;This guide will install updates for the Windows Server 2012 R2 operating system.&lt;/p&gt;
&lt;p&gt;Select which products you plan to install updates, and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-29.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 29&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to select the desired updates by classification.&lt;/p&gt;
&lt;p&gt;We select all classifications except &quot;Drivers&quot; and &quot;Update Rollups&quot;.&lt;/p&gt;
&lt;p&gt;:::note
Updates that belong to the &quot;Drivers&quot; and &quot;Update Rollups&quot; classifications are not recommended to be installed using the update server to be able to fully control the installation process and, thus, to minimize errors during the update.
:::&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-30.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 30&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to select a schedule according to which your server will download updates for their further distribution on the local network.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, the server will download updates every day automatically.
:::&lt;/p&gt;
&lt;p&gt;We select &quot;Synchronize automatically&quot; and specify a convenient time for you to download updates to your server.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-31.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 31&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can now start the initial synchronization process with Microsoft servers.&lt;/p&gt;
&lt;p&gt;We put a tick on the &quot;Begin initial synchronization&quot; item and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-32.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 32&quot;&gt;&lt;/p&gt;
&lt;p&gt;Further, I will give recommendations for further configuring the Windows Server Update Services role.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-33.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 33&quot;&gt;&lt;/p&gt;
&lt;p&gt;The basic configuration of the Windows Server Update Services role is now complete.&lt;/p&gt;
&lt;p&gt;Now you need to create a group policy that will distribute information about your update server to computers for subsequent download of updates from your server.&lt;/p&gt;
&lt;p&gt;This guide will look at a single group policy for servers and workstations.&lt;/p&gt;
&lt;p&gt;:::note
In a production environment, it is recommended to use individual group policies for each type of computer.
:::&lt;/p&gt;
&lt;p&gt;Go to the domain controller and log into the system under an account with domain administrator rights.&lt;/p&gt;
&lt;p&gt;Open &quot;Server Manager&quot;, click on the &quot;Tools&quot; button in the upper right corner of the screen, and select &quot;Group Policy Management&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-34.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 34&quot;&gt;&lt;/p&gt;
&lt;p&gt;Right-click on the domain name and select &quot;Create a GPO in this domain, and Link it here&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-35.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 35&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify a name for the new group policy and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-36.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 36&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, click on the new policy with the right mouse button and select &quot;Edit&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-37.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 37&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the Group Policy Editor, go to the &quot;Computer Configuration&quot; section, then to the &quot;Policies&quot; subsection, then find the &quot;Administrative Templates&quot; section and select &quot;Windows Components&quot;, then &quot;Windows Update&quot;.&lt;/p&gt;
&lt;p&gt;Next, double-click the left mouse button on the item &quot;Enabling Windows Update Power Management to automatically wake up the system to install scheduled updates&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-38.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 38&quot;&gt;&lt;/p&gt;
&lt;p&gt;This setting allows you to wake up the system from sleep mode to install updates.&lt;/p&gt;
&lt;p&gt;We select &quot;Enabled&quot;.&lt;/p&gt;
&lt;p&gt;:::note
If the group policy is designed only for servers, then this setting can be omitted.
:::&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-39.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 39&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, double-click the left mouse button on the &quot;Configure Automatic Updates&quot; item.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-40.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 40&quot;&gt;&lt;/p&gt;
&lt;p&gt;This setting allows you to select the settings for installing updates and the schedule according to which they will be installed.&lt;/p&gt;
&lt;p&gt;We select &quot;Enabled&quot;.&lt;/p&gt;
&lt;p&gt;:::note
In this guide, updates will be automatically downloaded and installed every day at 4:00 pm on all computers.
:::&lt;/p&gt;
&lt;p&gt;:::note
In a production environment, for important servers, it is not recommended to use automatic installation of updates to be able to fully control the installation process and, thus, to minimize receiving errors during the update.
:::&lt;/p&gt;
&lt;p&gt;In the &quot;Configure automatic updating&quot; section, select &quot;Auto download and schedule the install&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Scheduled install day&quot; section, select a convenient schedule for installing updates. &quot;&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-41.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 41&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, double-click the left mouse button on the item &quot;Specify intranet Microsoft update service location&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-42.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 42&quot;&gt;&lt;/p&gt;
&lt;p&gt;This setting allows you to specify the address of your update server.&lt;/p&gt;
&lt;p&gt;We select &quot;Enabled&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Set the intranet update service for detecting updates&quot; field, specify the address where your update server is available in the local network via the HTTP protocol, and port 8530.&lt;/p&gt;
&lt;p&gt;In the &quot;Set the intranet statistics server&quot; field, specify the address where your update server is available in the local network via the HTTP protocol, and port 8530.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-43.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 43&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, double-click the left mouse button on the &quot;Automatic Updates detection frequency&quot; item.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-44.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 44&quot;&gt;&lt;/p&gt;
&lt;p&gt;This setting allows you to set the interval for checking for new updates on your update server.&lt;/p&gt;
&lt;p&gt;We select &quot;Enabled&quot;.&lt;/p&gt;
&lt;p&gt;This guide will check for new updates once an hour.&lt;/p&gt;
&lt;p&gt;In the &quot;Interval (hours)&quot; field, specify a convenient interval for installing updates.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-45.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 45&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, double-click the left mouse button on the &quot;Allow Automatic Updates immediate installation&quot; item.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-46.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 46&quot;&gt;&lt;/p&gt;
&lt;p&gt;This setting allows you to immediately start installing updates after they have been downloaded and prepared for installation on target computers.&lt;/p&gt;
&lt;p&gt;We select &quot;Enabled&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-47.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 47&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, double-click the left mouse button on the item &quot;Turn on recommended updates via Automatic Updates&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-48.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 48&quot;&gt;&lt;/p&gt;
&lt;p&gt;This setting allows you to install on computers not only important updates but also recommended ones.&lt;/p&gt;
&lt;p&gt;We select &quot;Enabled&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-49.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 49&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, double-click the left mouse button on the item &quot;No auto-restart with logged on users for scheduled automatic updates installation&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-50.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 50&quot;&gt;&lt;/p&gt;
&lt;p&gt;This setting allows you to prohibit the automatic restart of the computer if the user is logged on to it.&lt;/p&gt;
&lt;p&gt;We select &quot;Enabled&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-51.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 51&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s check the application of Group Policy.&lt;/p&gt;
&lt;p&gt;To do this, you need to run the Group Policy update on a computer that is subject to the new Group Policy and on which you want to install the updates.&lt;/p&gt;
&lt;p&gt;:::note
In this guide, the computer on which the updates will be installed will be a server running Windows Server 2012 R2 operating as a domain controller.
:::&lt;/p&gt;
&lt;p&gt;Click &quot;Start&quot;, point to &quot;cmd&quot; in the search bar, then right-click on &quot;Command Prompt&quot; and select &quot;Run as administrator&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-52.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 52&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s speed up the application of the new policy to the server using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;gpupdate /force
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-53.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 53&quot;&gt;&lt;/p&gt;
&lt;p&gt;Group Policy update completed successfully.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-54.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 54&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s check that the server has received the necessary settings to download updates from the server on which the Windows Server Update Services role is installed.&lt;/p&gt;
&lt;p&gt;Go to the &quot;Start&quot; menu and click the &quot;Control Panel&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-55.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 55&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, go to the &quot;System and Security&quot; section.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-56.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 56&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the &quot;Windows Update&quot; section.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-57.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 57&quot;&gt;&lt;/p&gt;
&lt;p&gt;If you did everything correctly, then the &quot;Windows Update&quot; section under &quot;You receive updates&quot; should display &quot;Managed by your system administrator&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-58.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 58&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to create a new group of computers, allow the installation of certain updates on this group, and add computers to this group on which you plan to install updates.&lt;/p&gt;
&lt;p&gt;We return to the server on which the Windows Server Update Services role is installed.&lt;/p&gt;
&lt;p&gt;We go into the system under an account with administrator rights.&lt;/p&gt;
&lt;p&gt;Open &quot;Server Manager&quot;, click on the &quot;Tools&quot; button in the upper right corner of the screen and select &quot;Windows Server Update Services&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-59.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 59&quot;&gt;&lt;/p&gt;
&lt;p&gt;Go to the &quot;Computers&quot; section and right-click on the &quot;All Computers&quot; subsection. In the menu that opens, select &quot;Add Computer Group&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-60.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 60&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, the &quot;Servers&quot; group will be used, where servers will be added to which updates need to be installed.
:::&lt;/p&gt;
&lt;p&gt;Specify a name for the new group of computers and click on the &quot;Add&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-61.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 61&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to add computers to the new group on which you want to install updates.&lt;/p&gt;
&lt;p&gt;:::note
In this guide, a server that acts as a domain controller is used as the computer where updates will be installed.
:::&lt;/p&gt;
&lt;p&gt;Go to the &quot;Computers&quot; section, then to the &quot;Unassigned Computers&quot; subsection. In the &quot;Status&quot; menu, select &quot;Any&quot; and click on the &quot;Refresh&quot; button.&lt;/p&gt;
&lt;p&gt;This subsection displays all computers to which information about your update server has been propagated.&lt;/p&gt;
&lt;p&gt;Right-click on the computer on which you want to install updates, and in the menu that opens, select &quot;Change Membership&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-62.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 62&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the group of computers to which you want to add the computer and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-63.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 63&quot;&gt;&lt;/p&gt;
&lt;p&gt;Go to the &quot;Computers&quot; section, then to the &quot;Servers&quot; subsection. In the &quot;Status&quot; menu, select &quot;Any&quot; and click on the &quot;Refresh&quot; button.&lt;/p&gt;
&lt;p&gt;The computer has been successfully added to the &quot;Servers&quot; group.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-64.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 64&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to allow the installation of updates to the new group of computers.&lt;/p&gt;
&lt;p&gt;In the &quot;Updates&quot; section, go to the &quot;All Updates&quot; subsection and select the updates required to install on the right side of the screen.&lt;/p&gt;
&lt;p&gt;This guide will authorize all updates to the Windows Server 2012 R2 operating system.&lt;/p&gt;
&lt;p&gt;Select the updates that need to be allowed for installation and click on the &quot;Approve&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-65.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 65&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to select a group of computers on which you want to allow the installation of the selected updates.&lt;/p&gt;
&lt;p&gt;Select &quot;Servers&quot; and select &quot;Approved for Install&quot; in the menu that opens.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-66.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 66&quot;&gt;&lt;/p&gt;
&lt;p&gt;Everything is ready for permission to install the selected updates to the &quot;Servers&quot; group.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-67.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 67&quot;&gt;&lt;/p&gt;
&lt;p&gt;Updates were successfully allowed to be installed on the selected computer group.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;Now you need to wait, and after a while, only those updates that were allowed will be downloaded and installed on the specified group of computers.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-68.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 68&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you can create a rule to automatically allow new updates.&lt;/p&gt;
&lt;p&gt;:::note
In a production environment for critical servers, it is not recommended to use rules for automatically allowing updates to be able to fully control the installation process and, thus, to minimize errors during the update.
:::&lt;/p&gt;
&lt;p&gt;In the &quot;Options&quot; section, select &quot;Automatic Approvals&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-69.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 69&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;New Rule&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-70.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 70&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Step 1: Select properties&quot; section, put a checkmark on the &quot;When an update is in a specific classification&quot; item to indicate for which classifications updates will be allowed automatically.&lt;/p&gt;
&lt;p&gt;Then we tick the box &quot;When an update is in a specific product&quot; to indicate for which products updates will be automatically allowed.&lt;/p&gt;
&lt;p&gt;In the &quot;Step 2: Edit the properties&quot; section, select &quot;Any classification&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-71.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 71&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to select the desired updates by classification.&lt;/p&gt;
&lt;p&gt;We select all classifications except &quot;Drivers&quot; and &quot;Update Rollups&quot;.&lt;/p&gt;
&lt;p&gt;:::note
Updates that belong to the &quot;Drivers&quot; and &quot;Update Rollups&quot; classifications are not recommended to be installed using the update server to be able to fully control the installation process and, thus, to minimize errors during the update.
:::&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-72.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 72&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to select for which products you want to automatically allow updates.&lt;/p&gt;
&lt;p&gt;In the &quot;Step 2: Edit the properties&quot; section, select &quot;Any product&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-73.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 73&quot;&gt;&lt;/p&gt;
&lt;p&gt;This guide will automatically allow updates for the Windows Server 2012 R2 operating system.&lt;/p&gt;
&lt;p&gt;Select the products on which you plan to install updates, and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-74.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 74&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to choose for which group of computers you want to automatically allow updates.&lt;/p&gt;
&lt;p&gt;In the &quot;Step 2: Edit the properties&quot; section, select &quot;All computers&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-75.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 75&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, the &quot;Servers&quot; group is used as the group to which you want to automatically allow updates.
:::&lt;/p&gt;
&lt;p&gt;Select a group of computers for which you want to automatically allow updates, and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-76.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 76&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to provide a name for the new rule.&lt;/p&gt;
&lt;p&gt;In the &quot;Step 3: Specify a name&quot; section, specify a name for the new rule and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-77.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 77&quot;&gt;&lt;/p&gt;
&lt;p&gt;The creation of a rule to automatically allow new updates is complete.&lt;/p&gt;
&lt;p&gt;Check the box on the new rule and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-78.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 78&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s check if the updates have been installed.&lt;/p&gt;
&lt;p&gt;In a day we return to the computer on which the updates should have been installed.&lt;/p&gt;
&lt;p&gt;:::note
In this guide, we used a domain controller as the computer to which the updates were installed.
:::&lt;/p&gt;
&lt;p&gt;We log into the system under an account with domain administrator rights and go to the &quot;Start&quot; menu.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-79.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 79&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now go to the &quot;System and Security&quot; section.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-80.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 80&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the &quot;Windows Update&quot; section.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-81.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 81&quot;&gt;&lt;/p&gt;
&lt;p&gt;The updates were successfully installed on the server.&lt;/p&gt;
&lt;p&gt;To complete the installation of updates, you must restart the server.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Restart now&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-windows-server-update-services-on-windows-server-2012-r2-82.webp&quot; alt=&quot;Install and Configure Windows Server Update Services on Windows Server 2012 R2 - Step 82&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Windows Server</category><category>WSUS</category><category>Patch Management</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install and Configure DHCP Server on Windows Server 2012 R2</title><link>https://heyvaldemar.com/install-and-configure-dhcp-server-on-windows-server-2012-r2/</link><guid isPermaLink="true">https://heyvaldemar.com/install-and-configure-dhcp-server-on-windows-server-2012-r2/</guid><description>Step-by-step guide to install and configure a DHCP server on Windows Server 2012 R2. Learn to assign IPs, set exclusions, and reserve addresses with ease.</description><pubDate>Mon, 15 Oct 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing and configure DHCP Server on Windows Server 2012 R2.&lt;/p&gt;
&lt;p&gt;:::important
In this guide, we will consider the case when you already have a server with the Windows Server 2012 R2 operating system installed on it.&lt;/p&gt;
&lt;p&gt;For details on installing Windows Server 2012 R2, read my guide: &lt;a href=&quot;/install-windows-server-2012-r2/&quot;&gt;Install Windows Server 2012 R2&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
To learn how to install Active Directory Domain Services on Windows Server 2012 R2, read: &lt;a href=&quot;/install-active-directory-domain-services-on-windows-server-2012-r2/&quot;&gt;Install Active Directory Domain Services on Windows Server 2012 R2&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::important
Before starting the installation of the DHCP Server role, you must give the server the correct name in accordance with your organization&apos;s standards, and then specify a static IP address in the network connection settings. In addition, the server must be added to the domain.&lt;/p&gt;
&lt;p&gt;In my guide &lt;a href=&quot;/basic-setup-of-windows-server-2012-r2/&quot;&gt;Basic Setup of Windows Server 2012 R2&lt;/a&gt; you can read about how to make basic Windows Server 2012 R2 settings and add a server to a domain.
:::&lt;/p&gt;
&lt;p&gt;We go into the system under an account with domain administrator rights.&lt;/p&gt;
&lt;p&gt;Open the &quot;Server Manager&quot;, click on the &quot;Manage&quot; button in the upper right corner of the screen and select &quot;Add Roles and Features&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-1.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-2.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the installation type &quot;Role-based or feature-based installation&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-3.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, select the server on which the role will be installed.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-4.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;We select the role &quot;DHCP Server&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-5.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, the &quot;Role Installation Wizard&quot; will warn you that several components need to be installed to install the &quot;DHCP Server&quot; role.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Add Features&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-6.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-7.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;At the stage of adding components, we leave all the default values.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-8.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, the &quot;Role Installation Wizard&quot; invites you to familiarize yourself with additional information regarding the &quot;DHCP Server&quot; role.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-9.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;To start the installation of the selected role, click on the &quot;Install&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-10.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;The installation of the selected role and the components required for it has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-11.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;Installation of the DHCP Server role is complete.&lt;/p&gt;
&lt;p&gt;Now click on the &quot;Complete DHCP configuration&quot; button to configure the DHCP server.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-12.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;You are notified that the next two local security groups will be created to control access to the DHCP server, and then the DHCP server will be authorized in Active Directory.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-13.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Use the following user&apos;s credentials&quot; section, specify an account with domain administrator rights.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Commit&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-14.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Use the following user&apos;s credentials&quot; section, specify an account with domain administrator rights.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-15.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;Return to the &quot;Role Installation Wizard&quot; and click on the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-16.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to check that the two security groups were created successfully.&lt;/p&gt;
&lt;p&gt;On the keyboard, press the key combination &quot;Win&quot; and &quot;x&quot;, then select &quot;Computer Management&quot; in the menu that opens.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-17.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 17&quot;&gt;&lt;/p&gt;
&lt;p&gt;Further in the section &quot;Local Users and Groups&quot; we find &quot;Groups&quot;.&lt;/p&gt;
&lt;p&gt;All local security groups are displayed on the right side of the screen. These should include the DHCP Administrators group, whose members have full access to DHCP management, and the DHCP Users group, whose members have access only to view DHCP settings.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-18.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 18&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s configure the DHCP server so that it distributes network settings (IP address, subnet mask, gateway, DNS) for all devices that will connect to the local network.&lt;/p&gt;
&lt;p&gt;In Server Manager, click on the &quot;Tools&quot; button in the upper right corner of the screen and select &quot;DHCP&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-19.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 19&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s specify the range of addresses from which the DHCP server will distribute IP addresses for devices on the local network.&lt;/p&gt;
&lt;p&gt;Right-click on &quot;IPv4&quot; and select &quot;New Scope&quot; in the menu that opens.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-20.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 20&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-21.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 21&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Name&quot; field, specify the name for the new address range.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-22.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 22&quot;&gt;&lt;/p&gt;
&lt;p&gt;We indicate the subnet mask and the range of addresses from which the DHCP server will distribute IP addresses for devices on the local network.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-23.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 23&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you can specify a range for which the DHCP server will not distribute settings.&lt;/p&gt;
&lt;p&gt;This can be useful if you know that there are servers, printers, or other devices in a certain range of addresses that have already been assigned a static IP address. In this case, you need to exclude this part of the range, since the IP addresses from it are already in use. You also need to exclude the IP address that is assigned to the gateway.&lt;/p&gt;
&lt;p&gt;:::note
To exclude one IP address, it is enough to fill in only the &quot;Start IP address&quot; field.
:::&lt;/p&gt;
&lt;p&gt;Specify the part of the range to be excluded and click on the &quot;Add&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-24.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 24&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the part of the range to be excluded is added, click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-25.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 25&quot;&gt;&lt;/p&gt;
&lt;p&gt;Then you can choose for how long IP addresses will be leased to devices.&lt;/p&gt;
&lt;p&gt;Leave the settings unchanged and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-26.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 26&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to specify the network settings (gateway, DNS) that the DHCP server will distribute to devices on the local network.&lt;/p&gt;
&lt;p&gt;We select &quot;Yes, I want to configure these options now&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-27.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 27&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;IP address&quot; field, specify the IP address of your gateway and click on the &quot;Add&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-28.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 28&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the IP address is added, click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-29.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 29&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, in the &quot;Parent domain&quot; field, specify the domain name.&lt;/p&gt;
&lt;p&gt;In the &quot;IP address&quot; field, specify the IP address of the DNS server.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-30.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 30&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
The WINS server is not used in this guide.
:::&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-31.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 31&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to activate the selected address range.&lt;/p&gt;
&lt;p&gt;Select &quot;Yes, I want to activate this scope now&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-32.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 32&quot;&gt;&lt;/p&gt;
&lt;p&gt;The DHCP server configuration is complete. Now all devices connected to the local network will receive network settings (IP address, subnet mask, gateway, DNS) and will be able to communicate with each other.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-33.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 33&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you can reserve a specific IP address for a specific device so that the device is always given the same IP address.&lt;/p&gt;
&lt;p&gt;In the &quot;Address Leases&quot; section, you can see all devices and IP addresses that the devices received from your DHCP server.&lt;/p&gt;
&lt;p&gt;To reserve an IP address for a device, in the &quot;Address Leases&quot; section, right-click on one of the devices that has already received an IP address, and select &quot;Add to Reservation&quot; in the menu that opens.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-34.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 34&quot;&gt;&lt;/p&gt;
&lt;p&gt;The IP address obtained by it has been successfully reserved for the specified device.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-35.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 35&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can also add a reservation manually by specifying the required IP address and MAC address of the device&apos;s network card.&lt;/p&gt;
&lt;p&gt;Right-click on the &quot;Reservations&quot; section and select &quot;New Reservation&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-36.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 36&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Reservation name&quot; field, specify the name of the device for which you want to make a reservation for the IP address.&lt;/p&gt;
&lt;p&gt;In the &quot;IP address&quot; field, specify the IP address that must be reserved for the device.&lt;/p&gt;
&lt;p&gt;In the &quot;MAC address&quot; field, specify the MAC address (Physical Address) of the device&apos;s network card for which you want to make a reservation for the IP address.&lt;/p&gt;
&lt;p&gt;:::note
In fact, it is for the MAC address of the network card that the IP address is reserved. The MAC address on any device can be viewed in the properties of the network adapter. On Windows, you can run the &lt;code&gt;ipconfig /all&lt;/code&gt; command at a command prompt to view the MAC address of a network adapter. On Linux, run the &lt;code&gt;ifconfig&lt;/code&gt; command on the command line.
:::&lt;/p&gt;
&lt;p&gt;In the &quot;Supported types&quot; section, select &quot;Both&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Add&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-37.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 37&quot;&gt;&lt;/p&gt;
&lt;p&gt;Reservation of the IP address for the specified MAC address of the device has been successfully added.&lt;/p&gt;
&lt;p&gt;In the &quot;Reservations&quot; section, you can see all devices for which IP addresses have been reserved.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-38.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 38&quot;&gt;&lt;/p&gt;
&lt;p&gt;The DHCP server database and logs can be found in the &quot;%systemroot%\system32\dhcp&quot; directory. We recommend that you back up this directory.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-and-configure-dhcp-server-on-windows-server-2012-r2-39.webp&quot; alt=&quot;Install and Configure DHCP Server on Windows Server 2012 R2 - Step 39&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;dhcp.mdb - DHCP server database file&lt;/li&gt;
&lt;li&gt;j50.log - Log of all database transactions. This file is used by the DHCP database to restore data in case of need&lt;/li&gt;
&lt;li&gt;j50.chk - Checkpoint file&lt;/li&gt;
&lt;li&gt;tmp.edb - DHCP server temporary working file&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Windows Server</category><category>DHCP</category><category>Networking</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Windows Server 2016</title><link>https://heyvaldemar.com/install-windows-server-2016/</link><guid isPermaLink="true">https://heyvaldemar.com/install-windows-server-2016/</guid><description>Learn how to install Windows Server 2016 step by step using official media. Get a stable, secure setup with the Desktop Experience.</description><pubDate>Sun, 12 Aug 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Windows Server 2016.&lt;/p&gt;
&lt;p&gt;:::note
I strongly recommend that you never use any third-party builds of Windows. Use only original installation images. This will help you avoid a lot of problems and get maximum performance and stability.
:::&lt;/p&gt;
&lt;p&gt;After successfully booting from the Windows Server 2016 installation flash drive or DVD, the first step is to select the language options.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2016-1.webp&quot; alt=&quot;Install Windows Server 2016 - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Install now&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2016-2.webp&quot; alt=&quot;Install Windows Server 2016 - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
If you need to install Windows Server 2016 in Server Core mode (no GUI), then you need to select &quot;Windows Server 2016 Standard Evaluation&quot; or &quot;Windows Server 2016 Datacenter Evaluation&quot;.
:::&lt;/p&gt;
&lt;p&gt;This example is for installing Windows Server 2016 Datacenter Evaluation (Desktop Experience).&lt;/p&gt;
&lt;p&gt;Select &quot;Windows Server 2016 Datacenter Evaluation (Desktop Experience)&quot; and click &quot;Next&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2016-3.webp&quot; alt=&quot;Install Windows Server 2016 - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to accept the terms of the license.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2016-4.webp&quot; alt=&quot;Install Windows Server 2016 - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;This step offers two installation options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&quot;Upgrade&quot;. This is not the best option. As practice shows, numerous programs may not be compatible with the new operating system, and after the update, you will not be able to work with them, in addition, there is a possibility of dragging problems from the old operating system to the new one, thus losing all stability.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&quot;Custom&quot;. This is the best option for installing any version of the Windows operating system. It allows you to start from scratch with the system, so after installation, you will get maximum performance and stability. All that remains is to install the drivers and software familiar to work.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2016-5.webp&quot; alt=&quot;Install Windows Server 2016 - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to select which disk the new operating system will be installed on and allocate space for installation.&lt;/p&gt;
&lt;p&gt;If you have more than one disk installed or the disk already has several partitions, all this will be displayed at this stage. You need to be careful and understand in advance which partition you want to install the operating system on.&lt;/p&gt;
&lt;p&gt;:::note
In this example, one 60 GB disk is installed.
:::&lt;/p&gt;
&lt;p&gt;Click on the &quot;New&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2016-6.webp&quot; alt=&quot;Install Windows Server 2016 - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;In this case, all free disk space will be allocated for the system, so we leave the value in the &quot;Size&quot; section by default.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Apply&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2016-7.webp&quot; alt=&quot;Install Windows Server 2016 - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;The operating system notifies that it may need to create additional partitions on the disk to store system files.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2016-8.webp&quot; alt=&quot;Install Windows Server 2016 - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Thus, all free disk space was allocated for the operating system, but at the same time, the system reserved a small partition for itself.&lt;/p&gt;
&lt;p&gt;Now you need to select the partition on which you intend to install the operating system and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2016-9.webp&quot; alt=&quot;Install Windows Server 2016 - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of installing the operating system has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2016-10.webp&quot; alt=&quot;Install Windows Server 2016 - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;The computer will automatically restart.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2016-11.webp&quot; alt=&quot;Install Windows Server 2016 - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to provide a strong password for the &quot;Administrator&quot; account.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2016-12.webp&quot; alt=&quot;Install Windows Server 2016 - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;After completing the settings, you will be greeted by the Windows Server 2016 lock screen.&lt;/p&gt;
&lt;p&gt;Press &quot;Ctrl + Alt + Delete&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2016-13.webp&quot; alt=&quot;Install Windows Server 2016 - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to log into the system under the &quot;Administrator&quot; account.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2016-14.webp&quot; alt=&quot;Install Windows Server 2016 - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you will be able to turn on network discovery so that the server is visible to other computers on the network.&lt;/p&gt;
&lt;p&gt;:::note
Network discovery is not recommended to be enabled on public networks.
:::&lt;/p&gt;
&lt;p&gt;Click on the &quot;Yes&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2016-15.webp&quot; alt=&quot;Install Windows Server 2016 - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;Windows Server 2016 installation is complete.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2016-16.webp&quot; alt=&quot;Install Windows Server 2016 - Step 16&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Windows Server</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install CentOS 7 Minimal</title><link>https://heyvaldemar.com/install-centos-7-minimal/</link><guid isPermaLink="true">https://heyvaldemar.com/install-centos-7-minimal/</guid><description>Step-by-step guide to install CentOS 7 Minimal with screenshots. Learn how to configure language, network, partitions, and users for a clean Linux setup.</description><pubDate>Wed, 20 Jul 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing CentOS 7 Minimal.&lt;/p&gt;
&lt;p&gt;After successfully booting from a CentOS 7 installation flash drive or DVD, the first step is to select in which language the welcome menu will be displayed.&lt;/p&gt;
&lt;p&gt;Select &quot;Install CentOS 7&quot; from the welcome menu.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-centos-7-minimal-1.webp&quot; alt=&quot;Install CentOS 7 Minimal - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to choose in which language the installation process of CentOS 7 will be displayed. I highly recommend using English.&lt;/p&gt;
&lt;p&gt;Select &quot;English&quot; and click on the &quot;Continue&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-centos-7-minimal-2.webp&quot; alt=&quot;Install CentOS 7 Minimal - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to enable the network adapter and provide a name for the new server.&lt;/p&gt;
&lt;p&gt;In the &quot;System&quot; section, select &quot;Network &amp;amp; Host Name&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-centos-7-minimal-3.webp&quot; alt=&quot;Install CentOS 7 Minimal - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the network adapter that you want to enable, and click on the power button in the upper right corner of the screen.&lt;/p&gt;
&lt;p&gt;If you need to assign a static IP address to the server, then select a network adapter and click on the &quot;Configure&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-centos-7-minimal-4.webp&quot; alt=&quot;Install CentOS 7 Minimal - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to assign a name to the new server.&lt;/p&gt;
&lt;p&gt;In the &quot;Host name&quot; field, specify the full name of the server.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-centos-7-minimal-5.webp&quot; alt=&quot;Install CentOS 7 Minimal - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to choose which disk the new operating system will be installed on.&lt;/p&gt;
&lt;p&gt;In the &quot;System&quot; section, select &quot;Installation Destination&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-centos-7-minimal-6.webp&quot; alt=&quot;Install CentOS 7 Minimal - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
In this example, one 20 GB disk is installed.
:::&lt;/p&gt;
&lt;p&gt;:::note
All free disk space will be allocated for the system.
:::&lt;/p&gt;
&lt;p&gt;Leave the default settings and click on the &quot;Done&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-centos-7-minimal-7.webp&quot; alt=&quot;Install CentOS 7 Minimal - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to specify the geographic location of your server on which the system is being installed.&lt;/p&gt;
&lt;p&gt;In the &quot;Localization&quot; section, select &quot;Date &amp;amp; Time&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-centos-7-minimal-8.webp&quot; alt=&quot;Install CentOS 7 Minimal - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
In this guide, we consider a server located in Russia, in the city of Moscow.
:::&lt;/p&gt;
&lt;p&gt;Select the region, city and click on the &quot;Done&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-centos-7-minimal-9.webp&quot; alt=&quot;Install CentOS 7 Minimal - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;If you need to specify additionally the repository and proxy server settings, you can do this in the &quot;Software&quot; section by selecting &quot;Installation Source&quot;.&lt;/p&gt;
&lt;p&gt;This guide does not use a proxy server.&lt;/p&gt;
&lt;p&gt;Next, you need to select a security policy for your server.&lt;/p&gt;
&lt;p&gt;In the &quot;Security&quot; section, select &quot;Security Policy&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-centos-7-minimal-10.webp&quot; alt=&quot;Install CentOS 7 Minimal - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;Standard System Security Profile&quot; and click on the &quot;Select Profile&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-centos-7-minimal-11.webp&quot; alt=&quot;Install CentOS 7 Minimal - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Done&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-centos-7-minimal-12.webp&quot; alt=&quot;Install CentOS 7 Minimal - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you can start the process of installing the system.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Begin Installation&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-centos-7-minimal-13.webp&quot; alt=&quot;Install CentOS 7 Minimal - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of installing the system has begun.&lt;/p&gt;
&lt;p&gt;Next, you need to set a password for the &quot;root&quot; administrator account and create a user account.&lt;/p&gt;
&lt;p&gt;Let&apos;s change the password for the &quot;root&quot; account.&lt;/p&gt;
&lt;p&gt;In the &quot;User Settings&quot; section, select &quot;Root Password&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-centos-7-minimal-14.webp&quot; alt=&quot;Install CentOS 7 Minimal - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;We provide a strong password for the &quot;root&quot; account.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Done&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-centos-7-minimal-15.webp&quot; alt=&quot;Install CentOS 7 Minimal - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s create a new user.&lt;/p&gt;
&lt;p&gt;In the &quot;User Settings&quot; section, select &quot;User Creation&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-centos-7-minimal-16.webp&quot; alt=&quot;Install CentOS 7 Minimal - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;We indicate the name, surname, login, and strong password for the new user.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Done&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-centos-7-minimal-17.webp&quot; alt=&quot;Install CentOS 7 Minimal - Step 17&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to wait for the completion of the system installation process.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-centos-7-minimal-18.webp&quot; alt=&quot;Install CentOS 7 Minimal - Step 18&quot;&gt;&lt;/p&gt;
&lt;p&gt;The system installation process is complete.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Reboot&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-centos-7-minimal-19.webp&quot; alt=&quot;Install CentOS 7 Minimal - Step 19&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to specify the login credentials that were specified earlier during the installation of the system.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-centos-7-minimal-20.webp&quot; alt=&quot;Install CentOS 7 Minimal - Step 20&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>CentOS</category><category>Linux</category><category>Virtualization</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Disable Server Manager Autostart in Windows Server 2012 R2</title><link>https://heyvaldemar.com/disable-server-manager-autostart-in-windows-server-2012-r2/</link><guid isPermaLink="true">https://heyvaldemar.com/disable-server-manager-autostart-in-windows-server-2012-r2/</guid><description>Learn how to disable Server Manager autostart in Windows Server 2012 R2 using Server Manager settings, Task Scheduler, CMD, and PowerShell.</description><pubDate>Fri, 23 Oct 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and clear guide on how to disable Server Manager autostart in Windows Server 2012 R2.&lt;/p&gt;
&lt;p&gt;:::note
To learn how to disable Server Manager autostart in Windows Server 2019, read: &lt;a href=&quot;/disable-server-manager-autostart-in-windows-server-2019/&quot;&gt;Disable Server Manager Autostart in Windows Server 2019&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;We go into the system under an account with administrator rights.&lt;/p&gt;
&lt;p&gt;Open Server Manager, click on the &quot;Manage&quot; button in the upper right corner of the screen and select &quot;Server Manager Properties&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./disable-server-manager-autostart-in-windows-server-2012-r2-1.webp&quot; alt=&quot;Disable Server Manager Autostart in Windows Server 2012 R2 - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Check the box &quot;Do not start Server Manager automatically at logon&quot; and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./disable-server-manager-autostart-in-windows-server-2012-r2-2.webp&quot; alt=&quot;Disable Server Manager Autostart in Windows Server 2012 R2 - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Server Manager will no longer start automatically.&lt;/p&gt;
&lt;p&gt;You can also disable the automatic start of &quot;Server Manager&quot; through the task scheduler. To do this, you must disable the task that is responsible for the automatic start of &quot;Server Manager&quot;.&lt;/p&gt;
&lt;p&gt;In Server Manager, click on the &quot;Tools&quot; button in the upper right corner of the screen and select &quot;Task Scheduler&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./disable-server-manager-autostart-in-windows-server-2012-r2-3.webp&quot; alt=&quot;Disable Server Manager Autostart in Windows Server 2012 R2 - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Task Scheduler Library&quot; go to the &quot;Microsoft&quot; section, then to &quot;Windows&quot;, and in the &quot;Server Manager&quot; subsection, select the &quot;Server Manager&quot; task.&lt;/p&gt;
&lt;p&gt;In the &quot;Actions&quot; menu, click on the &quot;Disable&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./disable-server-manager-autostart-in-windows-server-2012-r2-4.webp&quot; alt=&quot;Disable Server Manager Autostart in Windows Server 2012 R2 - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Server Manager will no longer start automatically.&lt;/p&gt;
&lt;p&gt;In addition, you can disable the task that is responsible for automatically starting Server Manager using the command line.&lt;/p&gt;
&lt;p&gt;Click &quot;Start&quot;, point to &quot;cmd&quot; in the search bar, then right-click on &quot;Command Prompt&quot; and select &quot;Run as administrator&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./disable-server-manager-autostart-in-windows-server-2012-r2-5.webp&quot; alt=&quot;Disable Server Manager Autostart in Windows Server 2012 R2 - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Disable Server Manager autostart using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;schtasks /Change /TN &quot;Microsoft\Windows\Server Manager\ServerManager&quot; /Disable
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./disable-server-manager-autostart-in-windows-server-2012-r2-6.webp&quot; alt=&quot;Disable Server Manager Autostart in Windows Server 2012 R2 - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Server Manager will no longer start automatically.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./disable-server-manager-autostart-in-windows-server-2012-r2-7.webp&quot; alt=&quot;Disable Server Manager Autostart in Windows Server 2012 R2 - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can also disable the task that is responsible for automatically starting Server Manager using Windows PowerShell.&lt;/p&gt;
&lt;p&gt;On the &quot;Taskbar&quot;, right-click on &quot;Windows PowerShell&quot; and select &quot;Run as administrator&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./disable-server-manager-autostart-in-windows-server-2012-r2-8.webp&quot; alt=&quot;Disable Server Manager Autostart in Windows Server 2012 R2 - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Disable Server Manager autostart using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Get-ScheduledTask -TaskName ServerManager | Disable-ScheduledTask
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./disable-server-manager-autostart-in-windows-server-2012-r2-9.webp&quot; alt=&quot;Disable Server Manager Autostart in Windows Server 2012 R2 - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Server Manager will no longer start automatically.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./disable-server-manager-autostart-in-windows-server-2012-r2-10.webp&quot; alt=&quot;Disable Server Manager Autostart in Windows Server 2012 R2 - Step 10&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Windows Server</category><category>Server Manager</category><category>Group Policy</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Enable the Active Directory Recycle Bin in Windows Server 2012 R2</title><link>https://heyvaldemar.com/enable-the-active-directory-recycle-bin-in-windows-server-2012-r2/</link><guid isPermaLink="true">https://heyvaldemar.com/enable-the-active-directory-recycle-bin-in-windows-server-2012-r2/</guid><description>Learn how to enable the Active Directory Recycle Bin in Windows Server 2012 R2 to easily recover deleted AD objects. Step-by-step admin guide.</description><pubDate>Sat, 26 Sep 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and clear guide on how to enable the Active Directory Recycle Bin in Windows Server 2012 R2.&lt;/p&gt;
&lt;p&gt;The Active Directory Recycle Bin is designed to recover deleted Active Directory objects and can be of great help to an administrator if he accidentally deleted a large number of user accounts.&lt;/p&gt;
&lt;p&gt;:::important
In this guide, we will consider the case when you already have a server with the Windows Server 2012 R2 operating system installed on it.&lt;/p&gt;
&lt;p&gt;For details on installing Windows Server 2012 R2, read my guide: &lt;a href=&quot;/install-windows-server-2012-r2/&quot;&gt;Install Windows Server 2012 R2&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
To learn how to install Active Directory Domain Services on Windows Server 2012 R2, read: &lt;a href=&quot;/install-active-directory-domain-services-on-windows-server-2012-r2/&quot;&gt;Install Active Directory Domain Services on Windows Server 2012 R2&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;By default, the Active Directory Recycle Bin is disabled.&lt;/p&gt;
&lt;p&gt;To enable the Active Directory Recycle Bin, open &quot;Server Manager&quot;, click on &quot;Tools&quot; in the upper right corner of the screen and select &quot;Active Directory Administrative Center&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./enable-the-active-directory-recycle-bin-in-windows-server-2012-r2-1.webp&quot; alt=&quot;Enable the Active Directory Recycle Bin in Windows Server 2012 R2 - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the menu on the left, select the section with your domain, then in the menu on the right, click on the &quot;Enable Recycle Bin&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./enable-the-active-directory-recycle-bin-in-windows-server-2012-r2-2.webp&quot; alt=&quot;Enable the Active Directory Recycle Bin in Windows Server 2012 R2 - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to confirm enabling the Active Directory Recycle Bin.&lt;/p&gt;
&lt;p&gt;:::note
It will not be possible to disable the Active Directory Recycle Bin in the future.
:::&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./enable-the-active-directory-recycle-bin-in-windows-server-2012-r2-3.webp&quot; alt=&quot;Enable the Active Directory Recycle Bin in Windows Server 2012 R2 - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Active Directory Recycle Bin process has started.&lt;/p&gt;
&lt;p&gt;Next, you need to update the information in the &quot;Server Manager&quot; and wait for a little while all the domain controllers in the Active Directory forest get the information about enabling the Active Directory Recycle Bin.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./enable-the-active-directory-recycle-bin-in-windows-server-2012-r2-4.webp&quot; alt=&quot;Enable the Active Directory Recycle Bin in Windows Server 2012 R2 - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Server Manager&quot; click on the arrow icon in the upper right corner of the screen and wait for the information to be updated in the section with your domain.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./enable-the-active-directory-recycle-bin-in-windows-server-2012-r2-5.webp&quot; alt=&quot;Enable the Active Directory Recycle Bin in Windows Server 2012 R2 - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;After updating the information in the &quot;Server Manager&quot; in the section with your domain, a new container &quot;Deleted Objects&quot; will appear.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./enable-the-active-directory-recycle-bin-in-windows-server-2012-r2-6.webp&quot; alt=&quot;Enable the Active Directory Recycle Bin in Windows Server 2012 R2 - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s delete the user account and try to restore it from the Active Directory Recycle Bin.&lt;/p&gt;
&lt;p&gt;Go to the &quot;Users&quot; container and select a user account, then click on the &quot;Delete&quot; button in the menu on the right.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./enable-the-active-directory-recycle-bin-in-windows-server-2012-r2-7.webp&quot; alt=&quot;Enable the Active Directory Recycle Bin in Windows Server 2012 R2 - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to confirm the deletion of the user account.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./enable-the-active-directory-recycle-bin-in-windows-server-2012-r2-8.webp&quot; alt=&quot;Enable the Active Directory Recycle Bin in Windows Server 2012 R2 - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;To restore a deleted user account, you need to go to the &quot;Deleted Objects&quot; container and select the user account that you want to restore, then click on the &quot;Restore&quot; button in the menu on the right.&lt;/p&gt;
&lt;p&gt;:::note
Objects can only be restored during their lifetime, which by default is 180 days.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./enable-the-active-directory-recycle-bin-in-windows-server-2012-r2-9.webp&quot; alt=&quot;Enable the Active Directory Recycle Bin in Windows Server 2012 R2 - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;The user account was successfully restored and reappeared in the Users container.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./enable-the-active-directory-recycle-bin-in-windows-server-2012-r2-10.webp&quot; alt=&quot;Enable the Active Directory Recycle Bin in Windows Server 2012 R2 - Step 10&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Active Directory</category><category>Windows Server</category><category>PowerShell</category><category>Security</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Update the Offline Address Book in Exchange Server 2013</title><link>https://heyvaldemar.com/update-the-offline-address-book-in-exchange-server-2013/</link><guid isPermaLink="true">https://heyvaldemar.com/update-the-offline-address-book-in-exchange-server-2013/</guid><description>Step-by-step guide to manually update the Offline Address Book (OAB) in Exchange Server 2013 using PowerShell. Ideal for Exchange admins.</description><pubDate>Thu, 30 Jul 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and clear guide on how to update the offline address book in Exchange Server 2013.&lt;/p&gt;
&lt;p&gt;The offline address book is designed so that Microsoft Outlook users can view the address book even when they are not connected to the Exchange server. In addition, offline address books can help reduce the load on Exchange servers.&lt;/p&gt;
&lt;p&gt;:::note
To learn how to create offline address books in Exchange Server 2013, read my guide: &lt;a href=&quot;/create-an-offline-address-book-in-exchange-server-2013/&quot;&gt;Create an Offline Address Book in Exchange Server 2013&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;Click &quot;Start&quot;, point to &quot;Exchange&quot; in the search bar, then right-click on &quot;Exchange Management Shell&quot; and select &quot;Run as administrator&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./update-the-offline-address-book-in-exchange-server-2013-1.webp&quot; alt=&quot;Update the Offline Address Book in Exchange Server 2013 - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s see the existing schedule for updating address books using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Get-OfflineAddressBook | fl Name,Schedule
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./update-the-offline-address-book-in-exchange-server-2013-2.webp&quot; alt=&quot;Update the Offline Address Book in Exchange Server 2013 - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s check when a specific OAB was last updated using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Get-OfflineAddressBook &quot;VMKH Offline Address Book&quot; | fl Name,LastTouch *
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
This manual uses the &quot;VMKH Offline Address Book&quot; as the main offline address book.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./update-the-offline-address-book-in-exchange-server-2013-3.webp&quot; alt=&quot;Update the Offline Address Book in Exchange Server 2013 - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;The following commands must be run on all Exchange servers.&lt;/p&gt;
&lt;p&gt;Let&apos;s update the global address list using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Get-GlobalAddressList | Update-GlobalAddressList
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./update-the-offline-address-book-in-exchange-server-2013-4.webp&quot; alt=&quot;Update the Offline Address Book in Exchange Server 2013 - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Update the Exchange OAB using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Get-OfflineAddressBook | Update-OfflineAddressBook
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./update-the-offline-address-book-in-exchange-server-2013-5.webp&quot; alt=&quot;Update the Offline Address Book in Exchange Server 2013 - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can update a specific offline address book using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Update-OfflineAddressBook -Identity &quot;VMKH Offline Address Book&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
This manual uses the &quot;VMKH Offline Address Book&quot; as the main offline address book.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./update-the-offline-address-book-in-exchange-server-2013-6.webp&quot; alt=&quot;Update the Offline Address Book in Exchange Server 2013 - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;If you have Exchange Server 2010 installed, then to force the update of the offline address book, you will need to run one more command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Get-ClientAccessServer | Update-FileDistributionService
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Exchange Server</category><category>PowerShell</category><category>OAB</category><category>Email</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Create an Offline Address Book in Exchange Server 2013</title><link>https://heyvaldemar.com/create-an-offline-address-book-in-exchange-server-2013/</link><guid isPermaLink="true">https://heyvaldemar.com/create-an-offline-address-book-in-exchange-server-2013/</guid><description>Learn how to create and configure an offline address book (OAB) in Exchange Server 2013 using PowerShell and the Exchange Admin Center.</description><pubDate>Sat, 18 Jul 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and clear guide on how to create an offline address book in Exchange Server 2013.&lt;/p&gt;
&lt;p&gt;The offline address book is designed so that Microsoft Outlook users can view the address book even when they are not connected to the Exchange server. In addition, offline address books can help reduce the load on Exchange servers.&lt;/p&gt;
&lt;p&gt;Click &quot;Start&quot;, point to &quot;Exchange&quot; in the search bar, then right-click on &quot;Exchange Management Shell&quot; and select &quot;Run as administrator&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./create-an-offline-address-book-in-exchange-server-2013-1.webp&quot; alt=&quot;Create an Offline Address Book in Exchange Server 2013 - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s see the existing address books using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Get-OfflineAddressBook
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./create-an-offline-address-book-in-exchange-server-2013-2.webp&quot; alt=&quot;Create an Offline Address Book in Exchange Server 2013 - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
Installing the Mailbox server role creates a default offline address book named &quot;Default Offline Address Book&quot;.
:::&lt;/p&gt;
&lt;p&gt;Let&apos;s create a new offline address book using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;New-OfflineAddressBook -Name &quot;VMKH Offline Address Book&quot; -AddressLists &quot;\Default Global Address List&quot; -VirtualDirectories &quot;us-boston-vmkh-002\OAB (Default Web Site)&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./create-an-offline-address-book-in-exchange-server-2013-3.webp&quot; alt=&quot;Create an Offline Address Book in Exchange Server 2013 - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;To view existing address books and their main parameters, you can run the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Get-OfflineAddressBook | fl Name,Server, PublicFolderDistributionEnabled,WebDistributionEnabled,VirtualDirectories
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./create-an-offline-address-book-in-exchange-server-2013-4.webp&quot; alt=&quot;Create an Offline Address Book in Exchange Server 2013 - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;The new offline address book was created successfully, and you can then set it as the default offline address book. Thus, it will be associated with all created mailbox databases.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Set-OfflineAddressBook -Identity &quot;VMKH Offline Address Book&quot; -IsDefault $true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./create-an-offline-address-book-in-exchange-server-2013-5.webp&quot; alt=&quot;Create an Offline Address Book in Exchange Server 2013 - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now we go to the server with Exchange Server 2013 installed and go to the Exchange Admin Center, which is located at the link &lt;code&gt;https://us-boston-vmkh-002/ecp&lt;/code&gt;, where &lt;code&gt;us-boston-vmkh-002&lt;/code&gt; is the name of my Exchange server.&lt;/p&gt;
&lt;p&gt;Specify the username and password to enter the &quot;Exchange Administration Center&quot; and click the &quot;Sign in&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./create-an-offline-address-book-in-exchange-server-2013-6.webp&quot; alt=&quot;Create an Offline Address Book in Exchange Server 2013 - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Go to the &quot;Servers&quot; section, select the &quot;Databases&quot; subsection, then select the database and double-click on it with the left mouse button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./create-an-offline-address-book-in-exchange-server-2013-7.webp&quot; alt=&quot;Create an Offline Address Book in Exchange Server 2013 - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the Client Settings section, you must specify the new Exchange OAB.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Browse&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./create-an-offline-address-book-in-exchange-server-2013-8.webp&quot; alt=&quot;Create an Offline Address Book in Exchange Server 2013 - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the new Exchange OAB and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./create-an-offline-address-book-in-exchange-server-2013-9.webp&quot; alt=&quot;Create an Offline Address Book in Exchange Server 2013 - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;The new Exchange OAB is listed.&lt;/p&gt;
&lt;p&gt;:::note
If you have multiple Exchange databases, you need to specify a new OAB for each database.
:::&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./create-an-offline-address-book-in-exchange-server-2013-10.webp&quot; alt=&quot;Create an Offline Address Book in Exchange Server 2013 - Step 10&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Exchange Server</category><category>PowerShell</category><category>OAB</category><category>Email</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Lync Server 2010</title><link>https://heyvaldemar.com/install-lync-server-2010/</link><guid isPermaLink="true">https://heyvaldemar.com/install-lync-server-2010/</guid><description>Learn how to install Lync Server 2010 step-by-step on Windows Server 2008 R2. Set up unified communications without failover, including DNS and certificates.</description><pubDate>Sun, 24 Aug 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Lync Server 2010.&lt;/p&gt;
&lt;p&gt;:::warning
This guide covers installing Lync Server 2010 without implementing failover. This will install all the core Lync Server roles on one server. The Archiving, Monitoring, and EDGE roles will not be used.
:::&lt;/p&gt;
&lt;p&gt;:::important
We will consider the case when you already have two servers running Windows Server 2008 R2. In addition, the Active Directory Domain Services role must be installed on one of the servers.&lt;/p&gt;
&lt;p&gt;For details on installing Windows Server 2008 R2, read my guide: &lt;a href=&quot;/install-windows-server-2008-r2/&quot;&gt;Install Windows Server 2008 R2&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
To learn how to install Active Directory Domain Services on Windows Server 2008 R2, read: &lt;a href=&quot;/install-active-directory-domain-services-on-windows-server-2008-r2/&quot;&gt;Install Active Directory Domain Services on Windows Server 2008 R2&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;Let&apos;s create a new user who will use the Lync server functionality in the future.&lt;/p&gt;
&lt;p&gt;Go to the domain controller and in the &quot;Start&quot; menu and select the &quot;Administrative Tools&quot; item, then select &quot;Active Directory Users and Computers&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-1.webp&quot; alt=&quot;Install Lync Server 2010 - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Right-click on the &quot;Users&quot; container. Next, select &quot;New&quot;, then &quot;User&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-2.webp&quot; alt=&quot;Install Lync Server 2010 - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;We specify the first name, last name, and login for the new Lync user.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-3.webp&quot; alt=&quot;Install Lync Server 2010 - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to provide a password for the new Lync user.&lt;/p&gt;
&lt;p&gt;Uncheck the box &quot;User must change password at next logon&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-4.webp&quot; alt=&quot;Install Lync Server 2010 - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-5.webp&quot; alt=&quot;Install Lync Server 2010 - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;The user has been created.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-6.webp&quot; alt=&quot;Install Lync Server 2010 - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to create DNS records.&lt;/p&gt;
&lt;p&gt;On the domain controller in the &quot;Start&quot; menu and select the &quot;Administrative Tools&quot; item, then select &quot;DNS&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-7.webp&quot; alt=&quot;Install Lync Server 2010 - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s create an SRV record that is required for the automatic discovery of the Lync server.&lt;/p&gt;
&lt;p&gt;In the &quot;Forward Lookup Zones&quot; section, select the zone with the domain name and click on it with the right mouse button, then select &quot;Other New Records&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-8.webp&quot; alt=&quot;Install Lync Server 2010 - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, in the &quot;Select a resource record type&quot; section, select &quot;Service Location (SRV)&quot; and click on the &quot;Create Record&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-9.webp&quot; alt=&quot;Install Lync Server 2010 - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Service&quot; field, specify &quot;_sipinternaltls&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Protocol&quot; field, specify &quot;_tcp&quot;.&lt;/p&gt;
&lt;p&gt;Enter &quot;0&quot; in the &quot;Priority&quot; field.&lt;/p&gt;
&lt;p&gt;In the &quot;Weight&quot; field, enter &quot;0&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Port number&quot; field, enter &quot;5061&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Host offering this service&quot; field, we indicate the IP address of the Lync server.&lt;/p&gt;
&lt;p&gt;After the free fields are filled in, click on the &quot;OK&quot; button&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-10.webp&quot; alt=&quot;Install Lync Server 2010 - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;The creation of the SRV record is complete.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Done&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-11.webp&quot; alt=&quot;Install Lync Server 2010 - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now we will create the A records that we need to work with the Lync server.&lt;/p&gt;
&lt;p&gt;In the &quot;Forward Lookup Zones&quot; section, select the zone with the domain name and click on it with the right mouse button, then select &quot;New Host (A or AAAA)&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-12.webp&quot; alt=&quot;Install Lync Server 2010 - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Name&quot; field, enter &quot;sip&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;IP address&quot; field, enter the IP address of the Lync server.&lt;/p&gt;
&lt;p&gt;After the free fields are filled in, click on the &quot;Add Host&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-13.webp&quot; alt=&quot;Install Lync Server 2010 - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-14.webp&quot; alt=&quot;Install Lync Server 2010 - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;Enter &quot;admin&quot; in the &quot;Name&quot; field.&lt;/p&gt;
&lt;p&gt;In the &quot;IP address&quot; field, enter the IP address of the Lync server.&lt;/p&gt;
&lt;p&gt;After the free fields are filled in, click on the &quot;Add Host&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-15.webp&quot; alt=&quot;Install Lync Server 2010 - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-16.webp&quot; alt=&quot;Install Lync Server 2010 - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Name&quot; field, specify &quot;meet&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;IP address&quot; field, enter the IP address of the Lync server.&lt;/p&gt;
&lt;p&gt;After the free fields are filled in, click on the &quot;Add Host&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-17.webp&quot; alt=&quot;Install Lync Server 2010 - Step 17&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-18.webp&quot; alt=&quot;Install Lync Server 2010 - Step 18&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Name&quot; field, specify &quot;dialin&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;IP address&quot; field, enter the IP address of the Lync server.&lt;/p&gt;
&lt;p&gt;After the free fields are filled in, click on the &quot;Add Host&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-19.webp&quot; alt=&quot;Install Lync Server 2010 - Step 19&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-20.webp&quot; alt=&quot;Install Lync Server 2010 - Step 20&quot;&gt;&lt;/p&gt;
&lt;p&gt;The creation of A-records is complete.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Done&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-21.webp&quot; alt=&quot;Install Lync Server 2010 - Step 21&quot;&gt;&lt;/p&gt;
&lt;p&gt;DNS records have been created.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-22.webp&quot; alt=&quot;Install Lync Server 2010 - Step 22&quot;&gt;&lt;/p&gt;
&lt;p&gt;For further configuration, you need a certification authority.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, the Active Directory Certificate Services role will be installed on a domain controller.
:::&lt;/p&gt;
&lt;p&gt;Launch &quot;Server Manager&quot; on the domain controller.&lt;/p&gt;
&lt;p&gt;In the &quot;Roles&quot; section, click on the &quot;Add Roles&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-23.webp&quot; alt=&quot;Install Lync Server 2010 - Step 23&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-24.webp&quot; alt=&quot;Install Lync Server 2010 - Step 24&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the Active Directory Certificate Services role and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-25.webp&quot; alt=&quot;Install Lync Server 2010 - Step 25&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, the Role Installation Wizard invites you to learn more about the Active Directory Certificate Services role.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-26.webp&quot; alt=&quot;Install Lync Server 2010 - Step 26&quot;&gt;&lt;/p&gt;
&lt;p&gt;We select &quot;Certification Authority Web Enrollment&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-27.webp&quot; alt=&quot;Install Lync Server 2010 - Step 27&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, the Install Roles Wizard will warn you that several components need to be installed to install the Certification Authority Web Enrollment.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Add Required Role Services&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-28.webp&quot; alt=&quot;Install Lync Server 2010 - Step 28&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, select &quot;Online Responder&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-29.webp&quot; alt=&quot;Install Lync Server 2010 - Step 29&quot;&gt;&lt;/p&gt;
&lt;p&gt;The server is a member of the domain, so select &quot;Enterprise&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-30.webp&quot; alt=&quot;Install Lync Server 2010 - Step 30&quot;&gt;&lt;/p&gt;
&lt;p&gt;There are no other servers with the Active Directory Certificate Services role in the domain, so select &quot;Root CA&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-31.webp&quot; alt=&quot;Install Lync Server 2010 - Step 31&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to create a new private key.&lt;/p&gt;
&lt;p&gt;Select &quot;Create a new private key&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-32.webp&quot; alt=&quot;Install Lync Server 2010 - Step 32&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you can select the encryption settings.&lt;/p&gt;
&lt;p&gt;Leave the settings unchanged and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-33.webp&quot; alt=&quot;Install Lync Server 2010 - Step 33&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify a name for the new certification authority and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-34.webp&quot; alt=&quot;Install Lync Server 2010 - Step 34&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now we select the validity period of the certificate and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-35.webp&quot; alt=&quot;Install Lync Server 2010 - Step 35&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you can specify where the certificate database and its logs will be stored.&lt;/p&gt;
&lt;p&gt;Leave the settings unchanged and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-36.webp&quot; alt=&quot;Install Lync Server 2010 - Step 36&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Role Installation Wizard now prompts you to install the IIS components.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-37.webp&quot; alt=&quot;Install Lync Server 2010 - Step 37&quot;&gt;&lt;/p&gt;
&lt;p&gt;Leave the settings unchanged and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-38.webp&quot; alt=&quot;Install Lync Server 2010 - Step 38&quot;&gt;&lt;/p&gt;
&lt;p&gt;To start the installation of the selected role, click on the &quot;Install&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-39.webp&quot; alt=&quot;Install Lync Server 2010 - Step 39&quot;&gt;&lt;/p&gt;
&lt;p&gt;The installation of the selected role and the components required for it has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-40.webp&quot; alt=&quot;Install Lync Server 2010 - Step 40&quot;&gt;&lt;/p&gt;
&lt;p&gt;Installation of the Active Directory Certificate Services role is complete.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-41.webp&quot; alt=&quot;Install Lync Server 2010 - Step 41&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to enable the SAN (Subject Alternative Name) function on the CA server.&lt;/p&gt;
&lt;p&gt;On the CA server, on the &quot;Taskbar&quot; select &quot;Windows PowerShell&quot; and after clicking the right mouse button select &quot;Run as administrator&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-42.webp&quot; alt=&quot;Install Lync Server 2010 - Step 42&quot;&gt;&lt;/p&gt;
&lt;p&gt;We execute the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;certutil -setreg policy\EditFlags +EDITF_ATTRIBUTESUBJECTALTNAME2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-43.webp&quot; alt=&quot;Install Lync Server 2010 - Step 43&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s restart the certification authority.&lt;/p&gt;
&lt;p&gt;We execute the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;net stop certsvc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-44.webp&quot; alt=&quot;Install Lync Server 2010 - Step 44&quot;&gt;&lt;/p&gt;
&lt;p&gt;We execute the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;net start certsvc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-45.webp&quot; alt=&quot;Install Lync Server 2010 - Step 45&quot;&gt;&lt;/p&gt;
&lt;p&gt;The certification authority has restarted successfully.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-46.webp&quot; alt=&quot;Install Lync Server 2010 - Step 46&quot;&gt;&lt;/p&gt;
&lt;p&gt;Silverlight must now be installed on the future Lync server.&lt;/p&gt;
&lt;p&gt;Go to the &lt;a href=&quot;https://learn.microsoft.com/en-us/lifecycle/products/silverlight-5&quot;&gt;website&lt;/a&gt; (Microsoft Silverlight) and click on the &quot;Download Now&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-47.webp&quot; alt=&quot;Install Lync Server 2010 - Step 47&quot;&gt;&lt;/p&gt;
&lt;p&gt;Copy the installer to the future Lync server and run the Silverlight installation.&lt;/p&gt;
&lt;p&gt;In the &quot;Install Silverlight&quot; window, click on the &quot;Install now&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-48.webp&quot; alt=&quot;Install Lync Server 2010 - Step 48&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Enable Update&quot; window, select &quot;Enable Microsoft Update&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-49.webp&quot; alt=&quot;Install Lync Server 2010 - Step 49&quot;&gt;&lt;/p&gt;
&lt;p&gt;Silverlight installation is complete.&lt;/p&gt;
&lt;p&gt;In the &quot;Installation successful&quot; window, click on the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-50.webp&quot; alt=&quot;Install Lync Server 2010 - Step 50&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s install the necessary components.&lt;/p&gt;
&lt;p&gt;Launch &quot;Server Manager&quot; on the future Lync server.&lt;/p&gt;
&lt;p&gt;In the &quot;Roles&quot; section, click on the &quot;Add Roles&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-51.webp&quot; alt=&quot;Install Lync Server 2010 - Step 51&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, select &quot;.NET Framework 3.5.1. Features&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-52.webp&quot; alt=&quot;Install Lync Server 2010 - Step 52&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Add Required Features&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-53.webp&quot; alt=&quot;Install Lync Server 2010 - Step 53&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, in the &quot;Message Queuing&quot; section, in the &quot;Message Queuing Services&quot; subsection, select &quot;Directory Service Integration&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-54.webp&quot; alt=&quot;Install Lync Server 2010 - Step 54&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Add Required Features&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-55.webp&quot; alt=&quot;Install Lync Server 2010 - Step 55&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, in the &quot;Remote Server Administrative Tools&quot; section, in the &quot;Role Administration Tools&quot; subsection, select &quot;AD DS and AD LDS Tools&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-56.webp&quot; alt=&quot;Install Lync Server 2010 - Step 56&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-57.webp&quot; alt=&quot;Install Lync Server 2010 - Step 57&quot;&gt;&lt;/p&gt;
&lt;p&gt;Then leave the settings unchanged and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-58.webp&quot; alt=&quot;Install Lync Server 2010 - Step 58&quot;&gt;&lt;/p&gt;
&lt;p&gt;To start the installation of the selected components, click on the &quot;Install&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-59.webp&quot; alt=&quot;Install Lync Server 2010 - Step 59&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of installing the components has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-60.webp&quot; alt=&quot;Install Lync Server 2010 - Step 60&quot;&gt;&lt;/p&gt;
&lt;p&gt;You will need to reboot the server to complete the installation.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-61.webp&quot; alt=&quot;Install Lync Server 2010 - Step 61&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, the system will offer to restart the server for the new settings to take effect.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Yes&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-62.webp&quot; alt=&quot;Install Lync Server 2010 - Step 62&quot;&gt;&lt;/p&gt;
&lt;p&gt;The installation of the components is complete.&lt;/p&gt;
&lt;p&gt;After rebooting, a window with the results of component installation will open.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-63.webp&quot; alt=&quot;Install Lync Server 2010 - Step 63&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to install Windows Media Format Runtime.&lt;/p&gt;
&lt;p&gt;Click &quot;Start&quot;, select &quot;All Programs&quot;, then &quot;Accessories&quot;, then right-click on &quot;Command Prompt&quot; and select &quot;Run as administrator&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-64.webp&quot; alt=&quot;Install Lync Server 2010 - Step 64&quot;&gt;&lt;/p&gt;
&lt;p&gt;We execute the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;%systemroot%\system32\dism.exe /online /add-package /packagepath:%windir%\servicing\Packages\Microsoft-Windows-Media-Format-Package~31bf3856ad364e35~amd64~~6.1.7601.17514.mum /ignorecheck
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-65.webp&quot; alt=&quot;Install Lync Server 2010 - Step 65&quot;&gt;&lt;/p&gt;
&lt;p&gt;Windows Media Format Runtime installation is complete.&lt;/p&gt;
&lt;p&gt;The system will then prompt you to restart the Lync server for the new settings to take effect.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Y&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-66.webp&quot; alt=&quot;Install Lync Server 2010 - Step 66&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s install the IIS (Internet Information Services) components.&lt;/p&gt;
&lt;p&gt;Click &quot;Start&quot;, select &quot;All Programs&quot;, then &quot;Accessories&quot;, then right-click on &quot;Command Prompt&quot; and select &quot;Run as administrator&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-67.webp&quot; alt=&quot;Install Lync Server 2010 - Step 67&quot;&gt;&lt;/p&gt;
&lt;p&gt;We execute the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;ServerManagerCmd.exe -Install Web-Server Web-Http-Redirect Web-Scripting-Tools Web-Windows-Auth Web-Client-Auth Web-Asp-Net Web-Log-Libraries Web-Http-Tracing Web-Basic-Auth
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-68.webp&quot; alt=&quot;Install Lync Server 2010 - Step 68&quot;&gt;&lt;/p&gt;
&lt;p&gt;The installation of the IIS components is complete.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-69.webp&quot; alt=&quot;Install Lync Server 2010 - Step 69&quot;&gt;&lt;/p&gt;
&lt;p&gt;You are now ready to begin installing Lync Server 2010.&lt;/p&gt;
&lt;p&gt;Go to the folder with the Lync Server 2010 installer and run &quot;Setup.exe&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-70.webp&quot; alt=&quot;Install Lync Server 2010 - Step 70&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to confirm the installation of Microsoft Visual C ++ 2008.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Yes&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-71.webp&quot; alt=&quot;Install Lync Server 2010 - Step 71&quot;&gt;&lt;/p&gt;
&lt;p&gt;Leave the settings unchanged and click &quot;Install&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-72.webp&quot; alt=&quot;Install Lync Server 2010 - Step 72&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to accept the terms of the license.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-73.webp&quot; alt=&quot;Install Lync Server 2010 - Step 73&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to prepare Active Directory to install Lync Server 2010.&lt;/p&gt;
&lt;p&gt;Select the &quot;Prepare Active Directory&quot; section.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-74.webp&quot; alt=&quot;Install Lync Server 2010 - Step 74&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s prepare the Active Directory schema.&lt;/p&gt;
&lt;p&gt;Select &quot;Prepare Schema&quot; and click on the &quot;Run&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-75.webp&quot; alt=&quot;Install Lync Server 2010 - Step 75&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-76.webp&quot; alt=&quot;Install Lync Server 2010 - Step 76&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of preparing the Active Directory schema has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-77.webp&quot; alt=&quot;Install Lync Server 2010 - Step 77&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Active Directory schema preparation process is complete.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-78.webp&quot; alt=&quot;Install Lync Server 2010 - Step 78&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can now test the replication of the schema.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-79.webp&quot; alt=&quot;Install Lync Server 2010 - Step 79&quot;&gt;&lt;/p&gt;
&lt;p&gt;Go to the domain controller, then click &quot;Start&quot; and select &quot;Administrative Tools&quot;, then &quot;ADSI Edit&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-80.webp&quot; alt=&quot;Install Lync Server 2010 - Step 80&quot;&gt;&lt;/p&gt;
&lt;p&gt;Right-click on &quot;ADSI Edit&quot; and select &quot;Connect to&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-81.webp&quot; alt=&quot;Install Lync Server 2010 - Step 81&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Select a well known Naming Context&quot; menu, select &quot;Schema&quot; and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-82.webp&quot; alt=&quot;Install Lync Server 2010 - Step 82&quot;&gt;&lt;/p&gt;
&lt;p&gt;Find the object &quot;CN=ms=RTC-SIP-SchemaVersion&quot; and click on it with the right mouse button and select &quot;Properties&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-83.webp&quot; alt=&quot;Install Lync Server 2010 - Step 83&quot;&gt;&lt;/p&gt;
&lt;p&gt;Find the attribute &quot;rangeLower&quot; and &quot;rangeUpper&quot;.&lt;/p&gt;
&lt;p&gt;The &quot;rangeLower&quot; value must be &quot;14&quot;.&lt;/p&gt;
&lt;p&gt;The &quot;rangeUpper&quot; value must be &quot;1100&quot;.&lt;/p&gt;
&lt;p&gt;These values indicate that the schema preparation was successful.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-84.webp&quot; alt=&quot;Install Lync Server 2010 - Step 84&quot;&gt;&lt;/p&gt;
&lt;p&gt;Moving on to a future Lync server to prepare an Active Directory forest.&lt;/p&gt;
&lt;p&gt;Select &quot;Prepare Current Forest&quot; and click on the &quot;Run&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-85.webp&quot; alt=&quot;Install Lync Server 2010 - Step 85&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-86.webp&quot; alt=&quot;Install Lync Server 2010 - Step 86&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of preparing the Active Directory forest has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-87.webp&quot; alt=&quot;Install Lync Server 2010 - Step 87&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Active Directory forest preparation process is complete.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-88.webp&quot; alt=&quot;Install Lync Server 2010 - Step 88&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you can test the replication of the global catalog.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-89.webp&quot; alt=&quot;Install Lync Server 2010 - Step 89&quot;&gt;&lt;/p&gt;
&lt;p&gt;Go to the domain controller, then click &quot;Start&quot; and select &quot;Administrative Tools&quot;, then &quot;Active Directory Users and Computers&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-90.webp&quot; alt=&quot;Install Lync Server 2010 - Step 90&quot;&gt;&lt;/p&gt;
&lt;p&gt;Groups should appear in the &quot;Users&quot; container:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CSAdministrator&lt;/li&gt;
&lt;li&gt;CSArchivingAdministrator&lt;/li&gt;
&lt;li&gt;CSHelpDesk&lt;/li&gt;
&lt;li&gt;CSLocationAdministrator&lt;/li&gt;
&lt;li&gt;CSResponseGroupAdministrator&lt;/li&gt;
&lt;li&gt;CSServerAdministrator&lt;/li&gt;
&lt;li&gt;CSUserAdministrator&lt;/li&gt;
&lt;li&gt;CSViewOnlyAdministrator&lt;/li&gt;
&lt;li&gt;CSVoiceAdministrator&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The presence of these groups in Active Directory indicates that the forest preparation was successful.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-91.webp&quot; alt=&quot;Install Lync Server 2010 - Step 91&quot;&gt;&lt;/p&gt;
&lt;p&gt;Moving on to the future Lync server to prepare the Active Directory domain.&lt;/p&gt;
&lt;p&gt;Select &quot;Prepare Current Domain&quot; and click on the &quot;Run&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-92.webp&quot; alt=&quot;Install Lync Server 2010 - Step 92&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-93.webp&quot; alt=&quot;Install Lync Server 2010 - Step 93&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of preparing the Active Directory domain has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-94.webp&quot; alt=&quot;Install Lync Server 2010 - Step 94&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Active Directory domain preparation process is complete.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-95.webp&quot; alt=&quot;Install Lync Server 2010 - Step 95&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s check the replication in the domain.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-96.webp&quot; alt=&quot;Install Lync Server 2010 - Step 96&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click &quot;Start&quot; and in the search bar indicate &quot;Lync&quot;.&lt;/p&gt;
&lt;p&gt;Right-click on &quot;Lync Server Management Shell&quot; and select &quot;Run as administrator&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-97.webp&quot; alt=&quot;Install Lync Server 2010 - Step 97&quot;&gt;&lt;/p&gt;
&lt;p&gt;We execute the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Get-CsAdDomain -Domain vmkh.org -GlobalSettingsDomainController vmkh-s-0000001.vmkh.org
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;vmkh.org - domain.&lt;/p&gt;
&lt;p&gt;vmkh-s-0000001.vmkh.org is the fully qualified name of the domain controller.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-98.webp&quot; alt=&quot;Install Lync Server 2010 - Step 98&quot;&gt;&lt;/p&gt;
&lt;p&gt;The message &quot;LC_DOMAINSETTINGS_STATE_READY&quot; indicates that domain preparation was successful.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-99.webp&quot; alt=&quot;Install Lync Server 2010 - Step 99&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to add the Lync 2010 Server administrator to the CSAdministrator group.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-100.webp&quot; alt=&quot;Install Lync Server 2010 - Step 100&quot;&gt;&lt;/p&gt;
&lt;p&gt;Go to the domain controller, then click &quot;Start&quot; and select &quot;Administrative Tools&quot;, then &quot;Active Directory Users and Computers&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-101.webp&quot; alt=&quot;Install Lync Server 2010 - Step 101&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Users&quot; container, find the new &quot;CSAdministrators&quot; group and right-click on it.&lt;/p&gt;
&lt;p&gt;Next, select &quot;Properties&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-102.webp&quot; alt=&quot;Install Lync Server 2010 - Step 102&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the group properties, go to the &quot;Members&quot; tab.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Add&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-103.webp&quot; alt=&quot;Install Lync Server 2010 - Step 103&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the Lync 2010 server administrator login and click on the &quot;Check Names&quot; button.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-104.webp&quot; alt=&quot;Install Lync Server 2010 - Step 104&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-105.webp&quot; alt=&quot;Install Lync Server 2010 - Step 105&quot;&gt;&lt;/p&gt;
&lt;p&gt;Active Directory preparation is complete.&lt;/p&gt;
&lt;p&gt;We return to the &quot;Deployment Wizard&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Back&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-106.webp&quot; alt=&quot;Install Lync Server 2010 - Step 106&quot;&gt;&lt;/p&gt;
&lt;p&gt;We choose &quot;Prepare first Standard Edition server&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-107.webp&quot; alt=&quot;Install Lync Server 2010 - Step 107&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-108.webp&quot; alt=&quot;Install Lync Server 2010 - Step 108&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of preparing the server has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-109.webp&quot; alt=&quot;Install Lync Server 2010 - Step 109&quot;&gt;&lt;/p&gt;
&lt;p&gt;The server preparation process is complete.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-110.webp&quot; alt=&quot;Install Lync Server 2010 - Step 110&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to install Topology Builder for topology settings.&lt;/p&gt;
&lt;p&gt;Choose &quot;Install Topology Builder&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-111.webp&quot; alt=&quot;Install Lync Server 2010 - Step 111&quot;&gt;&lt;/p&gt;
&lt;p&gt;Installation of Topology Builder is complete.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-112.webp&quot; alt=&quot;Install Lync Server 2010 - Step 112&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to set up a new topology.&lt;/p&gt;
&lt;p&gt;Click Start, select All Programs, then Microsoft Lync Server 2010, then right-click on Lync Server Topology Builder and select Run as administrator.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-113.webp&quot; alt=&quot;Install Lync Server 2010 - Step 113&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, select &quot;New Topology&quot; and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-114.webp&quot; alt=&quot;Install Lync Server 2010 - Step 114&quot;&gt;&lt;/p&gt;
&lt;p&gt;We name it and save the topology to a separate folder on the Lync server.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-115.webp&quot; alt=&quot;Install Lync Server 2010 - Step 115&quot;&gt;&lt;/p&gt;
&lt;p&gt;We indicate the main SIP domain.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-116.webp&quot; alt=&quot;Install Lync Server 2010 - Step 116&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you can specify additional SIP domains.&lt;/p&gt;
&lt;p&gt;:::note
Additional SIP domains are not used in this guide.
:::&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-117.webp&quot; alt=&quot;Install Lync Server 2010 - Step 117&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the name of the Lync site and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-118.webp&quot; alt=&quot;Install Lync Server 2010 - Step 118&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to specify the geographic location of your server and the country code.&lt;/p&gt;
&lt;p&gt;After the free fields are filled in, click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-119.webp&quot; alt=&quot;Install Lync Server 2010 - Step 119&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;Open the New Front End Wizard when this wizard closes&quot; and click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-120.webp&quot; alt=&quot;Install Lync Server 2010 - Step 120&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, it is proposed to create a Front End pool.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-121.webp&quot; alt=&quot;Install Lync Server 2010 - Step 121&quot;&gt;&lt;/p&gt;
&lt;p&gt;This tutorial uses one Lync server.&lt;/p&gt;
&lt;p&gt;Specify the full name of the Lync server and select &quot;Standard Edition Server&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-122.webp&quot; alt=&quot;Install Lync Server 2010 - Step 122&quot;&gt;&lt;/p&gt;
&lt;p&gt;Then you can select the desired functionality.&lt;/p&gt;
&lt;p&gt;Select &quot;Conferencing, which includes audio, video, and application sharing&quot;, &quot;Enterprise Voice&quot;, &quot;Call Admission Control&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-123.webp&quot; alt=&quot;Install Lync Server 2010 - Step 123&quot;&gt;&lt;/p&gt;
&lt;p&gt;Leave the settings unchanged and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-124.webp&quot; alt=&quot;Install Lync Server 2010 - Step 124&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
The Archiving, Monitoring, and EDGE roles will not be used in this tutorial.
:::&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-125.webp&quot; alt=&quot;Install Lync Server 2010 - Step 125&quot;&gt;&lt;/p&gt;
&lt;p&gt;Leave the settings unchanged and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-126.webp&quot; alt=&quot;Install Lync Server 2010 - Step 126&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to create a folder and provide read access to it for all users.&lt;/p&gt;
&lt;p&gt;On the Lync server, create a folder and right-click on it, then select Properties.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-127.webp&quot; alt=&quot;Install Lync Server 2010 - Step 127&quot;&gt;&lt;/p&gt;
&lt;p&gt;Go to the &quot;Sharing&quot; tab and click on the &quot;Share&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-128.webp&quot; alt=&quot;Install Lync Server 2010 - Step 128&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the &quot;Everyone&quot; group and click on the &quot;Add&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-129.webp&quot; alt=&quot;Install Lync Server 2010 - Step 129&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, click on the &quot;Share&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-130.webp&quot; alt=&quot;Install Lync Server 2010 - Step 130&quot;&gt;&lt;/p&gt;
&lt;p&gt;The folder has been granted.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Done&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-131.webp&quot; alt=&quot;Install Lync Server 2010 - Step 131&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-132.webp&quot; alt=&quot;Install Lync Server 2010 - Step 132&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;Define a new file share&quot; and enter the full name of the Lync server in the &quot;File Server FQDN&quot; field.&lt;/p&gt;
&lt;p&gt;In the &quot;File Share&quot; field, specify the name of the new folder to which you have given read access to all users.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-133.webp&quot; alt=&quot;Install Lync Server 2010 - Step 133&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, in the &quot;External Base URL&quot; field, specify the name by which your Lync server is accessible from the Internet.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-134.webp&quot; alt=&quot;Install Lync Server 2010 - Step 134&quot;&gt;&lt;/p&gt;
&lt;p&gt;Leave the settings unchanged and click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-135.webp&quot; alt=&quot;Install Lync Server 2010 - Step 135&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to make a few more topology changes.&lt;/p&gt;
&lt;p&gt;From the &quot;Actions&quot; menu choose &quot;Edit Properties&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-136.webp&quot; alt=&quot;Install Lync Server 2010 - Step 136&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Administrative access URL&quot; field, enter &lt;code&gt;https://admin.vmkh.org&lt;/code&gt; and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;In the &quot;Front End server to install Central Management Server on&quot; menu, select the Lync server.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-137.webp&quot; alt=&quot;Install Lync Server 2010 - Step 137&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to publish your topology.&lt;/p&gt;
&lt;p&gt;Select Publish Topology from the Actions menu.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-138.webp&quot; alt=&quot;Install Lync Server 2010 - Step 138&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-139.webp&quot; alt=&quot;Install Lync Server 2010 - Step 139&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Select the Front End pool that will host the Central Management Store&quot; menu, select the Lync server.&lt;/p&gt;
&lt;p&gt;Click the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-140.webp&quot; alt=&quot;Install Lync Server 2010 - Step 140&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of publishing the topology has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-141.webp&quot; alt=&quot;Install Lync Server 2010 - Step 141&quot;&gt;&lt;/p&gt;
&lt;p&gt;The topology has been published.&lt;/p&gt;
&lt;p&gt;Click the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-142.webp&quot; alt=&quot;Install Lync Server 2010 - Step 142&quot;&gt;&lt;/p&gt;
&lt;p&gt;We return to the &quot;Deployment Wizard&quot;.&lt;/p&gt;
&lt;p&gt;Select the &quot;Install or Update Lync Server System&quot; section.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-143.webp&quot; alt=&quot;Install Lync Server 2010 - Step 143&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now Install &quot;Local Configuration Store&quot;.&lt;/p&gt;
&lt;p&gt;Select &quot;Install Local Configuration&quot; and click on the &quot;Run&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-144.webp&quot; alt=&quot;Install Lync Server 2010 - Step 144&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;Retrieve directly from the Central Management Store (Requires read access to the Central Management Store)&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-145.webp&quot; alt=&quot;Install Lync Server 2010 - Step 145&quot;&gt;&lt;/p&gt;
&lt;p&gt;The installation process for the &quot;Local Configuration Store&quot; has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-146.webp&quot; alt=&quot;Install Lync Server 2010 - Step 146&quot;&gt;&lt;/p&gt;
&lt;p&gt;The &quot;Local Configuration Store&quot; installation process is complete.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-147.webp&quot; alt=&quot;Install Lync Server 2010 - Step 147&quot;&gt;&lt;/p&gt;
&lt;p&gt;Install the Lync Server 2010 components.&lt;/p&gt;
&lt;p&gt;Select &quot;Setup or Remove Lync Server Components&quot; and click on the &quot;Run&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-148.webp&quot; alt=&quot;Install Lync Server 2010 - Step 148&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-149.webp&quot; alt=&quot;Install Lync Server 2010 - Step 149&quot;&gt;&lt;/p&gt;
&lt;p&gt;The installation process for Lync Server 2010 components has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-150.webp&quot; alt=&quot;Install Lync Server 2010 - Step 150&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Lync Server 2010 component installation process is complete.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-151.webp&quot; alt=&quot;Install Lync Server 2010 - Step 151&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to request a certificate for the Lync server.&lt;/p&gt;
&lt;p&gt;Select &quot;Request, Install or Assign Certificate&quot; and click on the &quot;Run&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-152.webp&quot; alt=&quot;Install Lync Server 2010 - Step 152&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Request&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-153.webp&quot; alt=&quot;Install Lync Server 2010 - Step 153&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-154.webp&quot; alt=&quot;Install Lync Server 2010 - Step 154&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;Send the request immediately to an online certification authority&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-155.webp&quot; alt=&quot;Install Lync Server 2010 - Step 155&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Select a CA from the list detected in your environment&quot; menu, select the server on which the &quot;Active Directory Certificate Services&quot; role was previously installed.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-156.webp&quot; alt=&quot;Install Lync Server 2010 - Step 156&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you can provide credentials to connect to the certification authority.&lt;/p&gt;
&lt;p&gt;Leave the settings unchanged and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-157.webp&quot; alt=&quot;Install Lync Server 2010 - Step 157&quot;&gt;&lt;/p&gt;
&lt;p&gt;Leave the settings unchanged and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-158.webp&quot; alt=&quot;Install Lync Server 2010 - Step 158&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify a name for the new certificate and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-159.webp&quot; alt=&quot;Install Lync Server 2010 - Step 159&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you must specify the name of the organization.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-160.webp&quot; alt=&quot;Install Lync Server 2010 - Step 160&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to specify the geographic location of your Lync server.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-161.webp&quot; alt=&quot;Install Lync Server 2010 - Step 161&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the main domain and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-162.webp&quot; alt=&quot;Install Lync Server 2010 - Step 162&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you can add additional names to the certificate.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-163.webp&quot; alt=&quot;Install Lync Server 2010 - Step 163&quot;&gt;&lt;/p&gt;
&lt;p&gt;The certificate request has been prepared.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-164.webp&quot; alt=&quot;Install Lync Server 2010 - Step 164&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of requesting a certificate has started.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-165.webp&quot; alt=&quot;Install Lync Server 2010 - Step 165&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-166.webp&quot; alt=&quot;Install Lync Server 2010 - Step 166&quot;&gt;&lt;/p&gt;
&lt;p&gt;The certificate request process has completed.&lt;/p&gt;
&lt;p&gt;Now let&apos;s assign the certificate to the Lync server.&lt;/p&gt;
&lt;p&gt;Select &quot;Assign this certificate to Lync Server certificate usage&quot; and click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-167.webp&quot; alt=&quot;Install Lync Server 2010 - Step 167&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-168.webp&quot; alt=&quot;Install Lync Server 2010 - Step 168&quot;&gt;&lt;/p&gt;
&lt;p&gt;You are ready to assign the certificate to the Lync server.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-169.webp&quot; alt=&quot;Install Lync Server 2010 - Step 169&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of assigning a certificate to the Lync Server has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-170.webp&quot; alt=&quot;Install Lync Server 2010 - Step 170&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of assigning a certificate to the Lync Server is complete.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-171.webp&quot; alt=&quot;Install Lync Server 2010 - Step 171&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-172.webp&quot; alt=&quot;Install Lync Server 2010 - Step 172&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s start the Lync Server 2010 services.&lt;/p&gt;
&lt;p&gt;Select &quot;Start Services&quot; and click on the &quot;Run&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-173.webp&quot; alt=&quot;Install Lync Server 2010 - Step 173&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-174.webp&quot; alt=&quot;Install Lync Server 2010 - Step 174&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Lync Server 2010 services start the process has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-175.webp&quot; alt=&quot;Install Lync Server 2010 - Step 175&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Lync Server 2010 service startup process has completed.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-176.webp&quot; alt=&quot;Install Lync Server 2010 - Step 176&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s check that all the necessary services are running.&lt;/p&gt;
&lt;p&gt;Select &quot;Service Status (optional)&quot; and click on the &quot;Run&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-177.webp&quot; alt=&quot;Install Lync Server 2010 - Step 177&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the Services window that opens, you can verify that all Lync services have started successfully.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-178.webp&quot; alt=&quot;Install Lync Server 2010 - Step 178&quot;&gt;&lt;/p&gt;
&lt;p&gt;Lync Server 2010 installation is complete.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Exit&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-179.webp&quot; alt=&quot;Install Lync Server 2010 - Step 179&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now we will provide the user with the opportunity to use the functionality of the Lync server.&lt;/p&gt;
&lt;p&gt;Click &quot;Start&quot;, select &quot;All Programs&quot;, then &quot;Microsoft Lync Server 2010&quot;, then right-click on &quot;Lync Server Control Panel&quot; and select &quot;Run as administrator&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-180.webp&quot; alt=&quot;Install Lync Server 2010 - Step 180&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-181.webp&quot; alt=&quot;Install Lync Server 2010 - Step 181&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the username and password of the Lync administrator account and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-182.webp&quot; alt=&quot;Install Lync Server 2010 - Step 182&quot;&gt;&lt;/p&gt;
&lt;p&gt;Welcome to Microsoft Lync Server 2010 Control Panel.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Enable users for Lync Server&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-183.webp&quot; alt=&quot;Install Lync Server 2010 - Step 183&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Add&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-184.webp&quot; alt=&quot;Install Lync Server 2010 - Step 184&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now we indicate the username and click on the &quot;Find&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-185.webp&quot; alt=&quot;Install Lync Server 2010 - Step 185&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, select &quot;Use the user principal name (UPN)&quot; and click on the &quot;Enable&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-186.webp&quot; alt=&quot;Install Lync Server 2010 - Step 186&quot;&gt;&lt;/p&gt;
&lt;p&gt;The user is given the opportunity to use the functionality of the Lync server.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-lync-server-2010-187.webp&quot; alt=&quot;Install Lync Server 2010 - Step 187&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Lync Server</category><category>Microsoft</category><category>Unified Communications</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Active Directory Domain Services on Windows Server 2012 R2</title><link>https://heyvaldemar.com/install-active-directory-domain-services-on-windows-server-2012-r2/</link><guid isPermaLink="true">https://heyvaldemar.com/install-active-directory-domain-services-on-windows-server-2012-r2/</guid><description>Learn how to install and configure Active Directory Domain Services (AD DS) on Windows Server 2012 R2 step-by-step using Server Manager. Ideal for sysadmins.</description><pubDate>Wed, 06 Aug 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Active Directory Domain Services on Windows Server 2012 R2.&lt;/p&gt;
&lt;p&gt;:::important
In this guide, we will consider the case when you already have a server with the Windows Server 2012 R2 operating system installed on it.&lt;/p&gt;
&lt;p&gt;For details on installing Windows Server 2012 R2, read my guide: &lt;a href=&quot;/install-windows-server-2012-r2/&quot;&gt;Install Windows Server 2012 R2&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
To learn how to install Active Directory Domain Services on Windows Server 2019, read: &lt;a href=&quot;/install-active-directory-domain-services-on-windows-server-2019/&quot;&gt;Install Active Directory Domain Services on Windows Server 2019&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::caution
Before installing the Active Directory Domain Services role, make sure to assign the server a proper name according to your organization&apos;s standards. Then, configure a static IP address, subnet mask, gateway, and DNS server address.
:::&lt;/p&gt;
&lt;p&gt;We go into the system under an account with administrator rights and on the keyboard press the combination of keys &quot;Win&quot; and &quot;x&quot;, then select &quot;System&quot; in the menu that opens.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-1.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, in the &quot;System&quot; window in the &quot;Computer name, domain, and workgroup settings&quot; section, click on the &quot;Change settings&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-2.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;System Properties&quot; window on the &quot;Computer Name&quot; tab, click on the &quot;Change&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-3.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;I highly recommend that you think ahead about the name of the servers in your organization.&lt;/p&gt;
&lt;p&gt;Next, specify the new server name in the &quot;Computer Name&quot; field and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-4.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;The system will warn you that you need to restart the server to apply the new settings.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-5.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;System Properties&quot; window, click on the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-6.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now the system will offer to restart the server for the new settings to take effect.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Restart Now&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-7.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, the server will start to reboot.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-8.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to register a static IP address in the network connection settings.&lt;/p&gt;
&lt;p&gt;We go into the system under an account with administrator rights and press the &quot;Win&quot; and &quot;x&quot; keys on the keyboard, then select &quot;Network Connections&quot; in the menu that opens.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-9.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now right-click on the &quot;Ethernet&quot; network connection and select &quot;Properties&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-10.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;Internet Protocol Version 4&quot; and click on the &quot;Properties&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-11.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, select the item &quot;Use the following IP address&quot; and specify a free IP address, subnet mask, and gateway.&lt;/p&gt;
&lt;p&gt;:::note
You must understand in advance how your network works and know which IP addresses are available.
:::&lt;/p&gt;
&lt;p&gt;In the &quot;Preferred DNS server&quot; field, specify the IP address of this server, since your server will have the &quot;DNS Server&quot; role, which is installed together with the &quot;Active Directory Domain Services&quot; role.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-12.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Ethernet Properties&quot; window, click on the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-13.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;You are now ready to install the Active Directory Domain Services role.&lt;/p&gt;
&lt;p&gt;Open the &quot;Server Manager&quot;, click on the &quot;Manage&quot; button in the upper right corner of the screen and select &quot;Add Roles and Features&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-14.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-15.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the installation type &quot;Role-based or feature-based installation&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-16.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, select the server on which the role will be installed.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-17.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 17&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the &quot;Active Directory Domain Services&quot; role.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-18.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 18&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, the Role Installation Wizard will warn you that several components need to be installed to install the Active Directory Domain Services role.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Add Features&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-19.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 19&quot;&gt;&lt;/p&gt;
&lt;p&gt;It is not necessary to select the DNS Server role at this point. It will be installed later.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-20.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 20&quot;&gt;&lt;/p&gt;
&lt;p&gt;At the stage of adding components, we leave all the default values.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-21.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 21&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, the &quot;Role Installation Wizard&quot; invites you to familiarize yourself with additional information regarding the &quot;Active Directory Domain Services&quot; role.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-22.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 22&quot;&gt;&lt;/p&gt;
&lt;p&gt;To start the installation of the selected role, click on the &quot;Install&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-23.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 23&quot;&gt;&lt;/p&gt;
&lt;p&gt;The installation of the selected role and the components required for it has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-24.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 24&quot;&gt;&lt;/p&gt;
&lt;p&gt;Installation of the Active Directory Domain Services role is now complete.&lt;/p&gt;
&lt;p&gt;Now click on the &quot;Promote this server to a domain controller&quot; button to promote your server to the domain controller level.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-25.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 25&quot;&gt;&lt;/p&gt;
&lt;p&gt;I highly recommend that you think ahead about which domain name you will use when adding a new forest.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, we will add a new forest, so in the &quot;Active Directory Domain Services Configuration Wizard&quot; window, select the &quot;Add a new forest&quot; item and in the &quot;Root domain name&quot; field, specify the desired name for the root domain.
:::&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-26.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 26&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to select the functional level of the new forest and root domain. If you are adding a new forest and plan to use servers based on the Windows Server 2012 R2 operating system in the future, you do not have to change the functional level of the forest and the root domain.&lt;/p&gt;
&lt;p&gt;Specify the password for DSRM (Directory Service Restore Mode) and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-27.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 27&quot;&gt;&lt;/p&gt;
&lt;p&gt;At this point, the AD DS Configuration Wizard will warn you that a delegation for this DNS server cannot be created.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-28.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 28&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you can change the NetBIOS name that was assigned to your domain. I recommend leaving the default NetBIOS value.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-29.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 29&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can now change the paths for the AD DS database directories, log files and the SYSVOL folder. I recommend leaving these default values.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-30.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 30&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step displays a summary of the server configuration.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-31.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 31&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, the &quot;AD DS Configuration Wizard&quot; will check if all prerequisites are met and display a report.&lt;/p&gt;
&lt;p&gt;All prerequisite checks are passed successfully means all prerequisite checks are passed.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Install&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-32.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 32&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of promoting the server to the domain controller has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-33.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 33&quot;&gt;&lt;/p&gt;
&lt;p&gt;After your server is promoted to a domain controller, the server will automatically reboot.&lt;/p&gt;
&lt;p&gt;Before the server starts to reboot, you will see a warning.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-34.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 34&quot;&gt;&lt;/p&gt;
&lt;p&gt;Server promotion to a domain controller is complete.&lt;/p&gt;
&lt;p&gt;You can use the Active Directory Administrative Center or the Active Directory Users and Computers snap-in to manage users, groups, and other Active Directory objects.&lt;/p&gt;
&lt;p&gt;We go into the system under an account with domain administrator rights.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-35.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 35&quot;&gt;&lt;/p&gt;
&lt;p&gt;Open Server Manager, click on the &quot;Tools&quot; button in the upper right corner of the screen, and select &quot;Active Directory Administrative Center&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-36.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 36&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Active Directory Administrative Center will open.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-37.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 37&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can also use the Active Directory Users and Computers snap-in to manage users, groups, and other objects in the Active Directory.&lt;/p&gt;
&lt;p&gt;In Server Manager, click on the &quot;Tools&quot; button in the upper right corner of the screen and select &quot;Active Directory Users and Computers&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-38.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 38&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Active Directory Users and Computers snap-in opens.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2012-r2-39.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2012 R2 - Step 39&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Active Directory</category><category>Windows Server</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Windows Server 2012 R2</title><link>https://heyvaldemar.com/install-windows-server-2012-r2/</link><guid isPermaLink="true">https://heyvaldemar.com/install-windows-server-2012-r2/</guid><description>Step-by-step guide to install Windows Server 2012 R2 using official media with a GUI setup. Get a clean, secure server installation.</description><pubDate>Sat, 02 Aug 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Windows Server 2012 R2.&lt;/p&gt;
&lt;p&gt;:::note
I strongly recommend that you never use any third-party builds of Windows. Use only original installation images. This will help you avoid a lot of problems and get maximum performance and stability.
:::&lt;/p&gt;
&lt;p&gt;After successfully booting from a Windows Server 2012 R2 installation flash drive or DVD, the first step is to select your language options.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2012-r2-1.webp&quot; alt=&quot;Install Windows Server 2012 R2 - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Install now&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2012-r2-2.webp&quot; alt=&quot;Install Windows Server 2012 R2 - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to specify the product license key.&lt;/p&gt;
&lt;p&gt;We indicate the license key and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2012-r2-3.webp&quot; alt=&quot;Install Windows Server 2012 R2 - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
If you need to install Windows Server 2012 R2 in Server Core mode, then you need to select &quot;Windows Server 2012 Standard Evaluation (Server Core Installation)&quot;.
:::&lt;/p&gt;
&lt;p&gt;This example shows the installation of Windows Server 2012 Standard Evaluation (Server with a GUI).&lt;/p&gt;
&lt;p&gt;Select &quot;Windows Server 2012 Standard Evaluation (Server with a GUI)&quot; and click &quot;Next&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2012-r2-4.webp&quot; alt=&quot;Install Windows Server 2012 R2 - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to accept the license terms.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2012-r2-5.webp&quot; alt=&quot;Install Windows Server 2012 R2 - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;This step offers two installation options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&quot;Upgrade&quot;. This is not the best option. As practice shows, numerous programs may not be compatible with the new operating system, and after the update, you will not be able to work with them, in addition, there is a possibility of dragging problems from the old operating system to the new one, thus losing all stability.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&quot;Custom&quot;. This is the best option for installing any version of the Windows operating system. It allows you to start from scratch with the system, so after installation, you will get maximum performance and stability. All that remains is to install the drivers and software familiar to work.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2012-r2-6.webp&quot; alt=&quot;Install Windows Server 2012 R2 - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to choose which disk the new operating system will be installed on and allocate space for installation.&lt;/p&gt;
&lt;p&gt;If you have more than one disk installed or the disk already has several partitions, all this will be displayed at this stage. You need to be careful and understand in advance which partition you want to install the operating system on.&lt;/p&gt;
&lt;p&gt;:::note
In this example, one 60 GB disk is installed.
:::&lt;/p&gt;
&lt;p&gt;Click on the &quot;New&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2012-r2-7.webp&quot; alt=&quot;Install Windows Server 2012 R2 - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;In this case, all free disk space will be allocated for the system, so we leave the value in the &quot;Size&quot; section by default.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Apply&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2012-r2-8.webp&quot; alt=&quot;Install Windows Server 2012 R2 - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;The operating system notifies that it may need to create additional partitions on the disk to store system files.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2012-r2-9.webp&quot; alt=&quot;Install Windows Server 2012 R2 - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Thus, all free disk space was allocated for the operating system, but at the same time, the system reserved a small partition for itself.&lt;/p&gt;
&lt;p&gt;Now you need to select the partition on which you intend to install the operating system and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2012-r2-10.webp&quot; alt=&quot;Install Windows Server 2012 R2 - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of installing the operating system has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2012-r2-11.webp&quot; alt=&quot;Install Windows Server 2012 R2 - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;The computer will automatically restart.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2012-r2-12.webp&quot; alt=&quot;Install Windows Server 2012 R2 - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the installation is complete, the operating system will begin to prepare the server for work.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2012-r2-13.webp&quot; alt=&quot;Install Windows Server 2012 R2 - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to provide a strong password for the &quot;Administrator&quot; account.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2012-r2-14.webp&quot; alt=&quot;Install Windows Server 2012 R2 - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;After completing the settings, you will be greeted by the Windows Server 2012 R2 lock screen.&lt;/p&gt;
&lt;p&gt;Press &quot;Ctrl + Alt + Delete&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2012-r2-15.webp&quot; alt=&quot;Install Windows Server 2012 R2 - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to log in under the &quot;Administrator&quot; account.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2012-r2-16.webp&quot; alt=&quot;Install Windows Server 2012 R2 - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;Windows Server 2012 R2 installation is complete.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2012-r2-17.webp&quot; alt=&quot;Install Windows Server 2012 R2 - Step 17&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Windows Server</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Configure Exchange Server 2010</title><link>https://heyvaldemar.com/configure-exchange-server-2010/</link><guid isPermaLink="true">https://heyvaldemar.com/configure-exchange-server-2010/</guid><description>Complete guide to configuring Exchange Server 2010. Learn mailbox setup, certificates, DNS, email policies, and secure mail delivery—step by step.</description><pubDate>Wed, 30 Jul 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and clear guide on how to configure Exchange Server 2010.&lt;/p&gt;
&lt;p&gt;:::note
For details on configuring Exchange Server 2016, read my guide: &lt;a href=&quot;/configure-exchange-server-2016/&quot;&gt;Configure Exchange Server 2016&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::warning
This guide walks you through configure Exchange Server 2010 without implementing fault tolerance. This way, all the core Exchange Server roles are installed on one server. The Unified Messaging and Edge Transport roles will not be used.
:::&lt;/p&gt;
&lt;p&gt;:::caution
You must already have a domain name and paid for hosting, as well as the hosting DNS servers are already specified in the domain settings.
:::&lt;/p&gt;
&lt;p&gt;:::important
We will consider the case when you already have two servers with the Windows Server 2008 R2 operating system installed on them. In addition, one of the servers must have the Active Directory Domain Services role installed, and the second server must have Exchange Server 2010 with primary roles installed.&lt;/p&gt;
&lt;p&gt;For details on installing Exchange Server 2010, read my guide: &lt;a href=&quot;/install-exchange-server-2010/&quot;&gt;Install Exchange Server 2010&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To learn how to install Active Directory Domain Services on Windows Server 2008 R2, read: &lt;a href=&quot;/install-active-directory-domain-services-on-windows-server-2008-r2/&quot;&gt;Install Active Directory Domain Services on Windows Server 2008 R2&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;Go to the server with Exchange Server 2010 installed and launch the Exchange Management Console.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-1.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s create a mailbox database.&lt;/p&gt;
&lt;p&gt;In the &quot;Organization Configuration&quot; section, go to the &quot;Mailbox&quot; subsection and select the &quot;Database Management&quot; tab. Then on the right, we click on the &quot;New Mailbox Database&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-2.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to specify a name for the new database and select an Exchange server with the &quot;Mailbox&quot; role.&lt;/p&gt;
&lt;p&gt;Specify a name for the database and click on the &quot;Browse&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-3.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the Exchange server with the &quot;Mailbox&quot; role and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-4.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the free fields are filled in, click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-5.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to specify in which folder the mailbox database and its logs will be stored.&lt;/p&gt;
&lt;p&gt;:::note
You need to first create folders on the server in which you plan to store the database and its logs. In addition, it is better to store the database on a disk specially allocated for this task.
:::&lt;/p&gt;
&lt;p&gt;In the &quot;Database file path&quot; field, specify the folder in which the database will be stored.&lt;/p&gt;
&lt;p&gt;In the &quot;Log folder path&quot; field, specify the folder in which the database logs will be stored.&lt;/p&gt;
&lt;p&gt;Check the &quot;Mount this database&quot; box and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-6.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Everything is ready to create a new mailbox database.&lt;/p&gt;
&lt;p&gt;Click on the &quot;New&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-7.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;The creation of the mailbox database is now complete.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-8.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Organization Configuration&quot; section, go to the &quot;Mailbox&quot; subsection and select the &quot;Database Management&quot; tab.&lt;/p&gt;
&lt;p&gt;Next, select the new database and click on the &quot;Properties&quot; button on the right.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-9.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Go to the &quot;Limits&quot; tab. In the &quot;Storage Limits&quot; section, you can configure the maximum allowed mailbox size, as well as the retention time for deleted mailboxes and letters.&lt;/p&gt;
&lt;p&gt;Specify the required values and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-10.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s set up the public folder database.&lt;/p&gt;
&lt;p&gt;In the &quot;Organization Configuration&quot; section, go to the &quot;Mailbox&quot; subsection and select the &quot;Database Management&quot; tab.&lt;/p&gt;
&lt;p&gt;Next, select the public folder database and click on the &quot;Properties&quot; button on the right.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-11.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;On the General tab, specify the new name for the public folder database.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-12.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;Go to the &quot;Limits&quot; tab. In the &quot;Storage Limits&quot; section, you can configure the maximum allowed size of shared folders, as well as the storage time for deleted messages.&lt;/p&gt;
&lt;p&gt;Specify the required values and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-13.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s move the public folder database and its logs to a separate folder.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-14.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
You need to first create folders on the server in which you plan to store the public folder database and its logs. In addition, it is better to store the database on a disk specially allocated for this task.
:::&lt;/p&gt;
&lt;p&gt;In the &quot;Database file path&quot; field, specify the folder in which the database will be stored.&lt;/p&gt;
&lt;p&gt;In the &quot;Log folder path&quot; field, specify the folder in which the database logs will be stored.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Move&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-15.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, Exchange Server will ask for confirmation to temporarily dismount the public folder database. Thus, the database will be temporarily unavailable to users.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Yes to All&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-16.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;The move of the public folder database and its logs is complete.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-17.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 17&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s add the trusted domain.&lt;/p&gt;
&lt;p&gt;In the &quot;Organization Configuration&quot; section, go to the &quot;Hub Transport&quot; subsection and select the &quot;Accepted Domains&quot; tab. Then, on the right, click on the &quot;New Accepted Domain&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-18.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 18&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the domain and select &quot;Authoritative Domain. E-mail is delivered to a recipient in this Exchange organization&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;New&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-19.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 19&quot;&gt;&lt;/p&gt;
&lt;p&gt;The trusted domain has been added.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-20.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 20&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the domain is added, it will appear on the &quot;Accepted Domains&quot; tab.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-21.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 21&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to create a policy for generating mailing addresses.&lt;/p&gt;
&lt;p&gt;In the &quot;Organization Configuration&quot; section, go to the &quot;Hub Transport&quot; subsection and select the &quot;E-mail Address Policies&quot; tab, then click on the &quot;New E-mail Address Policy&quot; button on the right.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-22.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 22&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to specify a name for the new policy and select to whom it will be applied.&lt;/p&gt;
&lt;p&gt;Specify a name for the policy for generating mail addresses and click on the &quot;Browse&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-23.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 23&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
In this guide, the policy for generating mail addresses will be applied to the entire domain.
:::&lt;/p&gt;
&lt;p&gt;Select a domain and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-24.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 24&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the free fields are filled in, select &quot;All recipient types&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-25.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 25&quot;&gt;&lt;/p&gt;
&lt;p&gt;Then leave the settings unchanged and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-26.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 26&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to determine how mailing addresses will be formed in your organization.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, mailing addresses will be based on &quot;Alias&quot;.
:::&lt;/p&gt;
&lt;p&gt;Click on the &quot;Add&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-27.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 27&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;Use alias&quot;, then in the &quot;Select the accepted domain for the e-mail address&quot; section, click on the &quot;Browse&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-28.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 28&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the main domain and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-29.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 29&quot;&gt;&lt;/p&gt;
&lt;p&gt;The main domain is selected, press the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-30.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 30&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s add a second domain so that users can receive mail using the second domain name.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Add&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-31.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 31&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;Use alias&quot;, then in the &quot;Select the accepted domain for the e-mail address&quot; section, click on the &quot;Browse&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-32.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 32&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the second domain and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-33.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 33&quot;&gt;&lt;/p&gt;
&lt;p&gt;The second domain is selected, click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-34.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 34&quot;&gt;&lt;/p&gt;
&lt;p&gt;After you have determined how mail addresses will be generated in your organization, click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-35.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 35&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to select when the policy will run.&lt;/p&gt;
&lt;p&gt;Select &quot;Immediately&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-36.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 36&quot;&gt;&lt;/p&gt;
&lt;p&gt;Everything is ready to create a policy for the formation of postal addresses.&lt;/p&gt;
&lt;p&gt;Click on the &quot;New&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-37.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 37&quot;&gt;&lt;/p&gt;
&lt;p&gt;The creation of a policy for generating postal addresses has been completed.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-38.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 38&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the policy is added, it will appear on the &quot;E-mail Address Policies&quot; tab.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-39.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 39&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to create a Send connector to be able to send mail outside of your organization.&lt;/p&gt;
&lt;p&gt;In the &quot;Organization Configuration&quot; section, go to the &quot;Hub Transport&quot; subsection and select the &quot;Send Connectors&quot; tab. Then on the right, we click on the &quot;New Send Connector&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-40.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 40&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify a name for the new Send connector and in the &quot;Select the intended use for this Send connector&quot; section, select &quot;Internet&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-41.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 41&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to specify for which domains the new connector will work.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Add&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-42.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 42&quot;&gt;&lt;/p&gt;
&lt;p&gt;Enter &lt;code&gt;*&lt;/code&gt; in the &quot;Address space&quot; field. This way, the new Send Connector will handle all domains except yours.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-43.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 43&quot;&gt;&lt;/p&gt;
&lt;p&gt;After you have specified for which domains the new connector will work, click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-44.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 44&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
In this example, mail will be sent according to MX records.
:::&lt;/p&gt;
&lt;p&gt;Select &quot;Use domain name system (DNS)&quot; MX &quot;records to route mail automatically&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-45.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 45&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to specify on which Exchange server the Send connector will be created.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-46.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 46&quot;&gt;&lt;/p&gt;
&lt;p&gt;Everything is ready to create a send connector.&lt;/p&gt;
&lt;p&gt;Click the &quot;New&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-47.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 47&quot;&gt;&lt;/p&gt;
&lt;p&gt;The send connector is now complete.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-48.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 48&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, select the new send connector and click on the &quot;Properties&quot; button on the right.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-49.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 49&quot;&gt;&lt;/p&gt;
&lt;p&gt;On the &quot;General&quot; tab, in the &quot;Specify the FQDN this connector will provide in response to HELO or EHLO&quot; field, specify the name by which your mail server is accessible from the Internet.&lt;/p&gt;
&lt;p&gt;In the &quot;Maximum message size&quot; field, you can configure the maximum size of mail attachments to be sent.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-50.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 50&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s see the transport settings.&lt;/p&gt;
&lt;p&gt;In the &quot;Organization Configuration&quot; section, go to the &quot;Hub Transport&quot; subsection and select the &quot;Global Settings&quot; tab.&lt;/p&gt;
&lt;p&gt;Next, select &quot;Transport Settings&quot; and click on the &quot;Properties&quot; button on the right.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-51.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 51&quot;&gt;&lt;/p&gt;
&lt;p&gt;On the &quot;General&quot; tab, in the &quot;Transport Limits&quot; section, you can configure the maximum size of mail attachments for sending and receiving.&lt;/p&gt;
&lt;p&gt;Specify the required values and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-52.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 52&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to provide your Exchange Server 2010 license key.&lt;/p&gt;
&lt;p&gt;In the &quot;Server Configuration&quot; section, select the Exchange server and click on the &quot;Enter Product Key&quot; button on the right.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-53.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 53&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the Exchange Server 2010 license key and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-54.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 54&quot;&gt;&lt;/p&gt;
&lt;p&gt;Exchange Server 2010 license key accepted.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-55.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 55&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to open a web browser and go to the hosting control panel to which your domain name is linked. This tutorial uses &quot;cPanel&quot; as the hosting control panel.&lt;/p&gt;
&lt;p&gt;Enter the login and password you received when purchasing hosting.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-56.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 56&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to register A-records in the hosting control panel.&lt;/p&gt;
&lt;p&gt;Go to the hosting control panel, to which your domain name is linked.&lt;/p&gt;
&lt;p&gt;In the &quot;Domains&quot; section, select the &quot;Advanced DNS Zones Editor&quot; item.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-57.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 57&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, in the domain field, you must specify the domain for which the A-records will be configured.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-58.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 58&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Add Record&quot; section, specify the name, TTL, type, and IP address. Pay attention to the field &quot;IP-address&quot; you need to specify the IP by which your mail server is accessible from the Internet.&lt;/p&gt;
&lt;p&gt;After the fields are filled in, click on the &quot;Add record&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-59.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 59&quot;&gt;&lt;/p&gt;
&lt;p&gt;Add another A record.&lt;/p&gt;
&lt;p&gt;In the &quot;Add Record&quot; section, specify the name, TTL, type, and IP address. Pay attention to the field &quot;IP-address&quot; you need to specify the IP by which your mail server is accessible from the Internet.&lt;/p&gt;
&lt;p&gt;After the fields are filled in, click on the &quot;Add record&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-60.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 60&quot;&gt;&lt;/p&gt;
&lt;p&gt;Add another A record.&lt;/p&gt;
&lt;p&gt;In the &quot;Add Record&quot; section, specify the name, TTL, type, and IP address. Pay attention to the field &quot;IP-address&quot; you need to specify the IP by which your mail server is accessible from the Internet.&lt;/p&gt;
&lt;p&gt;After the fields are filled in, click on the &quot;Add record&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-61.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 61&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to register MX records in the hosting control panel.&lt;/p&gt;
&lt;p&gt;We return to the hosting control panel.&lt;/p&gt;
&lt;p&gt;In the &quot;Mail&quot; section, select the &quot;MX Record&quot; item.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-62.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 62&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, in the domain field, you must specify the domain for which the MX records will be configured. Then in the item &quot;Email Routing&quot; you need to select &quot;Remote Mail Exchanger&quot; and click on the &quot;Change&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-63.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 63&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now delete all the old MX records in the MX Records section.&lt;/p&gt;
&lt;p&gt;Select the entry and click on the &quot;Delete&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-64.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 64&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to make a request to your ISP to create a PTR record for your external IP address, where your mail server is accessible from the Internet. This is necessary in order for your IP address to resolve to a name.&lt;/p&gt;
&lt;p&gt;:::note
In this example, IP 188.244.46.91 is being converted to the name mail.vmkh.org.
:::&lt;/p&gt;
&lt;p&gt;Now you need to create an SPF (Sender Policy Framework) and write its value to the TXT record.&lt;/p&gt;
&lt;p&gt;Thanks to SPF, you can check if the sender&apos;s domain has been tampered with. SPF allows you to specify a list of servers capable of sending mail messages on behalf of your domain.&lt;/p&gt;
&lt;p&gt;You can create an SPF using the &quot;SPF Wizard&quot;.&lt;/p&gt;
&lt;p&gt;Return to the &quot;Advanced DNS Zone Editor&quot; section.&lt;/p&gt;
&lt;p&gt;In the &quot;Domains&quot; section, select the &quot;Advanced DNS Zones Editor&quot; item.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-65.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 65&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, in the domain field, you must specify the domain for which the A-records will be configured.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-66.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 66&quot;&gt;&lt;/p&gt;
&lt;p&gt;Add TXT record.&lt;/p&gt;
&lt;p&gt;In the &quot;Add Record&quot; section, specify the name, TTL, type, and TXT data.&lt;/p&gt;
&lt;p&gt;:::note
In the &quot;TXT Data&quot; field you need to specify the value of the SPF record that you received using the &quot;Sender ID Framework SPF Record Wizard&quot;.
:::&lt;/p&gt;
&lt;p&gt;SPF example: &lt;code&gt;v=spf1 mx ptr:mail.vmkh.org mx:mx01.vmkh.org ip4:188.244.46.91 -all&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-67.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 67&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to register an A-record on the internal DNS server.&lt;/p&gt;
&lt;p&gt;Go to the domain controller, then click &quot;Start&quot; and select &quot;Administrative Tools&quot;, then &quot;DNS&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-68.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 68&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Forward Lookup Zones&quot; section, select the main domain and right-click on it, then select &quot;New Host (A or AAAA)&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-69.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 69&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, in the &quot;Name (uses parent domain name if blank)&quot; field, specify the name of the A-record, then in the &quot;IP address&quot; section, specify the IP address of the server on which Exchange Server 2010 is installed.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-70.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 70&quot;&gt;&lt;/p&gt;
&lt;p&gt;A record has been successfully added.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-71.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 71&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the A record is added, it will appear in the list with the rest of the DNS records.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-72.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 72&quot;&gt;&lt;/p&gt;
&lt;p&gt;For further configuration, you need a certification authority.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, the Active Directory Certificate Services role will be installed on a domain controller.
:::&lt;/p&gt;
&lt;p&gt;Launch &quot;Server Manager&quot; on the domain controller.&lt;/p&gt;
&lt;p&gt;In the &quot;Roles&quot; section, click on the &quot;Add Roles&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-73.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 73&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-74.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 74&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the Active Directory Certificate Services role and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-75.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 75&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, the Role Installation Wizard invites you to learn more about the Active Directory Certificate Services role.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-76.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 76&quot;&gt;&lt;/p&gt;
&lt;p&gt;We select &quot;Certification Authority Web Enrollment&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-77.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 77&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, the Install Roles Wizard will warn you that several components need to be installed to install the Certification Authority Web Enrollment.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Add Required Role Services&quot; button.
More about this source text&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-78.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 78&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, select &quot;Online Responder&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-79.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 79&quot;&gt;&lt;/p&gt;
&lt;p&gt;The server is a member of the domain, so select &quot;Enterprise&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-80.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 80&quot;&gt;&lt;/p&gt;
&lt;p&gt;There are no other servers with the Active Directory Certificate Services role in the domain, so select &quot;Root CA&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-81.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 81&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to create a new private key.&lt;/p&gt;
&lt;p&gt;Select &quot;Create a new private key&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-83.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 83&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you can select the encryption settings.&lt;/p&gt;
&lt;p&gt;Leave the settings unchanged and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-84.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 84&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify a name for the new certification authority and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-85.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 85&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now we select the validity period of the certificate and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-86.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 86&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you can specify where the certificate database and its logs will be stored.&lt;/p&gt;
&lt;p&gt;Leave the settings unchanged and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-87.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 87&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Role Installation Wizard now prompts you to install the IIS components.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-88.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 88&quot;&gt;&lt;/p&gt;
&lt;p&gt;Leave the settings unchanged and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-89.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 89&quot;&gt;&lt;/p&gt;
&lt;p&gt;To start the installation of the selected role, click on the &quot;Install&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-90.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 90&quot;&gt;&lt;/p&gt;
&lt;p&gt;The installation of the selected role and the components required for it has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-91.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 91&quot;&gt;&lt;/p&gt;
&lt;p&gt;Installation of the Active Directory Certificate Services role is complete.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-92.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 92&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to enable the SAN (Subject Alternative Name) function on the CA server. This function will be useful for you when publishing the &quot;Autodiscover&quot; service.&lt;/p&gt;
&lt;p&gt;On the CA server, on the &quot;Taskbar&quot; select &quot;Windows PowerShell&quot; and after clicking the right mouse button select &quot;Run as administrator&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-93.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 93&quot;&gt;&lt;/p&gt;
&lt;p&gt;We execute the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;certutil -setreg policy\EditFlags +EDITF_ATTRIBUTESUBJECTALTNAME2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-94.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 94&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s restart the certification authority.&lt;/p&gt;
&lt;p&gt;We execute the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;net stop certsvc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-95.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 95&quot;&gt;&lt;/p&gt;
&lt;p&gt;We execute the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;net start certsvc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-96.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 96&quot;&gt;&lt;/p&gt;
&lt;p&gt;The certification authority has restarted successfully.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-97.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 97&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s make a request to create a new Exchange certificate.&lt;/p&gt;
&lt;p&gt;We return to the server with Exchange Server 2010 installed.&lt;/p&gt;
&lt;p&gt;In the Exchange Management Console, in the &quot;Server Configuration&quot; section, select the Exchange server and click on the &quot;New Exchange Certificate&quot; button on the right.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-98.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 98&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify a name for the new certificate and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-99.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 99&quot;&gt;&lt;/p&gt;
&lt;p&gt;Then leave the settings unchanged and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-100.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 100&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to specify the domain names that need to be included in the certificate for all types of access.&lt;/p&gt;
&lt;p&gt;In the &quot;Client Access server (Outlook Web App)&quot; section, select &quot;Outlook Web App is on the Intranet&quot; and in the &quot;Domain name you use to access Outlook Web App internally&quot; field, specify the full name of the Exchange server. In the &quot;Outlook Web App is on the Internet&quot; field, specify the name by which your mail server is accessible from the Internet.&lt;/p&gt;
&lt;p&gt;In the &quot;Client Access server (Exchange ActiveSync)&quot; section, select &quot;Exchange Active Sync is enabled&quot; and in the &quot;Domain name, you use to access Exchange ActiveSync&quot; field, specify the name by which your mail server is accessible from the Internet.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-101.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 101&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Client Access server (Web Services, Outlook Anywhere, and Autodiscover)&quot; section, select &quot;Exchange Web Services is enabled&quot; and &quot;Outlook Anywhere is enabled&quot;, then in the &quot;External host name for your organization&quot; field, specify the name by which your mail the server is accessible from the Internet.&lt;/p&gt;
&lt;p&gt;Select &quot;Autodiscover used on the Internet&quot;, then select &quot;Long URL&quot; and in the &quot;Autodiscover URL to use&quot; field specify the name by which your mail server is accessible from the Internet for the &quot;Autodiscover&quot; service.&lt;/p&gt;
&lt;p&gt;:::note
In this manual, the name &quot;autodiscover.vmkh.org&quot; is used for the &quot;Autodiscover&quot; service.
:::&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-102.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 102&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now we select the main name by which your mail server is accessible from the Internet and click on the &quot;Set as common name&quot; button.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-103.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 103&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to specify the name of the organization, its geographic location, and specify the folder where the request for the Exchange certificate will be saved.&lt;/p&gt;
&lt;p&gt;This guide deals with an organization located in Russia, in the city of Moscow.&lt;/p&gt;
&lt;p&gt;Specify the necessary information and click on the &quot;Browse&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-104.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 104&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s save the request to the desktop.&lt;/p&gt;
&lt;p&gt;Specify a name for the request and click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-105.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 105&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the name of the organization, its geographic location, and folders where the certificate request will be saved, click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-106.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 106&quot;&gt;&lt;/p&gt;
&lt;p&gt;Everything is ready to create an Exchange certificate request.&lt;/p&gt;
&lt;p&gt;Click on the &quot;New&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-107.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 107&quot;&gt;&lt;/p&gt;
&lt;p&gt;The creation of a new Exchange certificate request is complete.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-108.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 108&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the certificate request is generated, it appears on the Exchange Certificates tab.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-109.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 109&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to validate your Exchange certificate with a certification authority.&lt;/p&gt;
&lt;p&gt;Follow the link &lt;code&gt;http://vmkh-s-0000001.vmkh.org/certsrv&lt;/code&gt;, where &lt;code&gt;vmkh-s-0000001.vmkh.org&lt;/code&gt; is the full name of my certification authority server. Accordingly, you need to provide the fully qualified name of your CA server.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-110.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 110&quot;&gt;&lt;/p&gt;
&lt;p&gt;We go under an account with administrator rights and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-111.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 111&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s add the address of the certification server to the &quot;Local intranet&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Tools&quot; menu, select &quot;Internet Options&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-112.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 112&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, go to the &quot;Security&quot; tab.&lt;/p&gt;
&lt;p&gt;Select &quot;Local intranet&quot; and click on the &quot;Sites&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-113.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 113&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Add this website to the zone&quot; field, specify the address of the certification server and click on the &quot;Add&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-114.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 114&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-115.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 115&quot;&gt;&lt;/p&gt;
&lt;p&gt;The certification server address has been successfully added to the Local Intranet.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-116.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 116&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now select &quot;Request a certificate&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-117.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 117&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, select &quot;Advanced certificate request&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-118.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 118&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now select &quot;Submit a certificate request by using a base-64-encoded CMC or PKCS # 10 file, or submit a renewal request by using a base-64-encoded PKCS # 7 file&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-119.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 119&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, open &quot;Explorer&quot; and go to the desktop where the Exchange certificate request was saved.&lt;/p&gt;
&lt;p&gt;Click on the certificate request file twice with the left mouse button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-120.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 120&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;Select a program from a list of installed programs&quot; and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-121.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 121&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, select &quot;Notepad&quot;, uncheck &quot;Always use the selected program to open this kind of file&quot; and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-122.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 122&quot;&gt;&lt;/p&gt;
&lt;p&gt;Copy the contents of the request file.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-123.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 123&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, insert the contents of the request file into the &quot;Saved Request&quot; field, then in the &quot;Certificate Template&quot; section, select &quot;Web Server&quot; and click on the &quot;Submit&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-124.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 124&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;DER encoded&quot; and click &quot;Download certificate&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-125.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 125&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-126.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 126&quot;&gt;&lt;/p&gt;
&lt;p&gt;Assign a name and save the Exchange certificate to the Downloads folder.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-127.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 127&quot;&gt;&lt;/p&gt;
&lt;p&gt;Exchange certificate saved successfully.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-128.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 128&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to download the certificate of the certification authority.&lt;/p&gt;
&lt;p&gt;Follow the link &lt;code&gt;http://vmkh-s-0000001.vmkh.org/certsrv&lt;/code&gt;, where &lt;code&gt;vmkh-s-0000001.vmkh.org&lt;/code&gt; is the full name of my certification authority server. Accordingly, you need to provide the fully qualified name of your CA server.&lt;/p&gt;
&lt;p&gt;Select &quot;Download a CA certificate, certificate chain, or CRL&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-129.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 129&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Encoding method&quot; section, select &quot;DER&quot; and click &quot;Download CA certificate&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-130.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 130&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-131.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 131&quot;&gt;&lt;/p&gt;
&lt;p&gt;We assign a name and save the certificate of the certification authority in the &quot;Downloads&quot; folder.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Save&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-132.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 132&quot;&gt;&lt;/p&gt;
&lt;p&gt;The certificate was successfully saved.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-133.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 133&quot;&gt;&lt;/p&gt;
&lt;p&gt;To successfully validate your Exchange certificate request, you must import the CA certificate into the Trusted Root Certification Authorities on the Exchange server.&lt;/p&gt;
&lt;p&gt;On the Exchange server, click on the &quot;Start&quot; button and specify &quot;mmc&quot; in the search bar and press the &quot;Enter&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-134.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 134&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s add the Certificates snap-in.&lt;/p&gt;
&lt;p&gt;Next, in the &quot;File&quot; menu, select &quot;Add/Remove Snap-in&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-135.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 135&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Available snap-ins&quot; section, select &quot;Certificates&quot; and click on the &quot;Add&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-136.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 136&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, select &quot;Computer account&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-137.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 137&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;Local computer&quot; and click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-138.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 138&quot;&gt;&lt;/p&gt;
&lt;p&gt;The snap-in has been added successfully.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-139.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 139&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Certificates (Local Computer)&quot; section, select the &quot;Trusted Root Certification Authorities&quot; subsection, then right-click on the &quot;Certificates&quot; subsection and select &quot;All Tasks&quot;, then &quot;Import&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-140.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 140&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-141.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 141&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to specify the path to the certificate of the certification authority.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Browse&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-142.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 142&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the certificate of the certification authority and click on the &quot;Open&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-143.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 143&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the path to the certificate of the certification authority is indicated, click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-144.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 144&quot;&gt;&lt;/p&gt;
&lt;p&gt;Then leave the settings unchanged and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-145.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 145&quot;&gt;&lt;/p&gt;
&lt;p&gt;Everything is ready to import the certificate into the &quot;Trusted Root Certification Authorities&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-146.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 146&quot;&gt;&lt;/p&gt;
&lt;p&gt;The CA certificate has been successfully imported.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-147.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 147&quot;&gt;&lt;/p&gt;
&lt;p&gt;We return to the Exchange Management Console.&lt;/p&gt;
&lt;p&gt;In the &quot;Server Configuration&quot; section, select the Exchange server, then select the new Exchange certificate and click on the &quot;Complete Pending Request&quot; button on the right.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-148.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 148&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to specify the path to the Exchange certificate.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-149.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 149&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the Exchange certificate and click on the &quot;Open&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-150.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 150&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the path to the Exchange certificate is specified, click on the &quot;Complete&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-151.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 151&quot;&gt;&lt;/p&gt;
&lt;p&gt;Exchange certificate verified.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-152.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 152&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to assign a new Exchange certificate to IIS.&lt;/p&gt;
&lt;p&gt;In the &quot;Server Configuration&quot; section, select the Exchange server, then select the new Exchange certificate and click on the &quot;Assign Services to Certificate&quot; button on the right.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-153.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 153&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the server for which the settings will be made and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-154.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 154&quot;&gt;&lt;/p&gt;
&lt;p&gt;Put a checkmark on &quot;Internet Information Server (IIS)&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-155.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 155&quot;&gt;&lt;/p&gt;
&lt;p&gt;You are now ready to assign the Exchange certificate to IIS.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Assign&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-156.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 156&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to confirm overwriting the existing certificate.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Yes to All&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-157.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 157&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Exchange certificate is assigned to the IIS service.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-158.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 158&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the Exchange certificate is assigned to the IIS service, the list of services in the &quot;Server Configuration&quot; section of the certificate is updated.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-159.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 159&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, the Outlook Web App settings.&lt;/p&gt;
&lt;p&gt;In the &quot;Server Configuration&quot; section, go to the &quot;Client Access&quot; subsection, select the Exchange server. Then on the right, we click on the &quot;Properties&quot; button.&lt;/p&gt;
&lt;p&gt;Next, select &quot;owa (Default Web Site)&quot; and click on the &quot;Properties&quot; button on the right.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-160.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 160&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s configure user authorization by login without having to specify a domain.&lt;/p&gt;
&lt;p&gt;On the &quot;Authentication&quot; tab in the &quot;Use forms-based authentication&quot; section, select &quot;User name only&quot;.&lt;/p&gt;
&lt;p&gt;Next, you need to select the main domain, click on the &quot;Browse&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-161.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 161&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the main domain and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-162.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 162&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the domain is specified, go to the &quot;Public Computer File Access&quot; tab.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-163.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 163&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now we will restrict access to view documents if the user is logged in to Outlook Web App from a public computer.&lt;/p&gt;
&lt;p&gt;On the &quot;Public Computer File Access&quot; tab, uncheck &quot;Enable direct file access&quot; and &quot;Enable WebReady Document Viewing&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-164.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 164&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, a warning will appear about the need to restart IIS.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-165.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 165&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s add the address where your mail server is accessible from the Internet into the configuration of the Exchange server with the &quot;Client Access&quot; role.&lt;/p&gt;
&lt;p&gt;In the &quot;Server Configuration&quot; section, go to the &quot;Client Access&quot; subsection. Then, on the right, click on the &quot;Configure External Client Access Domain&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-166.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 166&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to specify the name by which your mail server is accessible from the Internet, then specify the Exchange server with the &quot;Client Access&quot; role.&lt;/p&gt;
&lt;p&gt;In the &quot;Enter the domain name you will use with your external Client Access servers&quot; field, specify the name by which your mail server is accessible from the Internet, and in the &quot;Select the Client Access servers to use with external URL&quot; section, click on the &quot;Add&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-167.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 167&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the Exchange server with the &quot;Client Access&quot; role and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-168.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 168&quot;&gt;&lt;/p&gt;
&lt;p&gt;Everything is ready to register the name by which your mail server is accessible from the Internet in the configuration of the Exchange server with the &quot;Client Access&quot; role.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Configure&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-169.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 169&quot;&gt;&lt;/p&gt;
&lt;p&gt;The name by which your mail server is accessible from the Internet has been successfully added to the configuration of the Exchange server with the &quot;Client Access&quot; role.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-170.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 170&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s configure the Outlook Anywhere service. This service is used to connect to the Exchange server via the Internet using &quot;Outlook&quot;.&lt;/p&gt;
&lt;p&gt;In the &quot;Server Configuration&quot; section, go to the &quot;Client Access&quot; subsection, select the Exchange server. Then on the right, we click on the &quot;Enable Outlook Anywhere&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-171.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 171&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, in the &quot;External host name&quot; field, specify the name by which your mail server is accessible from the Internet. Then select &quot;NTLM authentication&quot; and click on the &quot;Enable&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-172.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 172&quot;&gt;&lt;/p&gt;
&lt;p&gt;Outlook Anywhere is up and running in 15 minutes.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-173.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 173&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s restart IIS.&lt;/p&gt;
&lt;p&gt;On the Exchange server, on the &quot;Taskbar&quot; select &quot;Windows PowerShell&quot; and after clicking the right mouse button click &quot;Run as administrator&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-174.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 174&quot;&gt;&lt;/p&gt;
&lt;p&gt;We execute the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;iisreset /noforce
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-175.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 175&quot;&gt;&lt;/p&gt;
&lt;p&gt;IIS restarted successfully.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-176.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 176&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s configure the ability to receive mail.&lt;/p&gt;
&lt;p&gt;In the &quot;Server Configuration&quot; section, go to the &quot;Hub Transport&quot; subsection, select the Exchange server, then select the &quot;Receive Connectors&quot; tab.&lt;/p&gt;
&lt;p&gt;Next, select &quot;Default vmkh-s-0000002&quot;, where &lt;code&gt;vmkh-s-0000002&lt;/code&gt; is the name of my Exchange server. Then on the right, we click on the &quot;Properties&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-177.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 177&quot;&gt;&lt;/p&gt;
&lt;p&gt;On the &quot;General&quot; tab, in the &quot;Maximum message size&quot; field, you can configure the maximum size of mail attachments for receiving.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-178.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 178&quot;&gt;&lt;/p&gt;
&lt;p&gt;Go to the &quot;Permission Groups&quot; tab and check the &quot;Anonymous users&quot; box.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-179.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 179&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now let&apos;s create a new user with a mailbox.&lt;/p&gt;
&lt;p&gt;In the Exchange Management Console, in the &quot;Recipient Configuration&quot; section, click on the &quot;New Mail User&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-180.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 180&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;New user&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-181.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 181&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, in the &quot;Specify the organization unit rather using a default one&quot; section, you need to select the container in which you plan to create the new user.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Browse&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-182.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 182&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the container in which you want to place the new user.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-183.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 183&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now we indicate the first name, last name, login, and strong password for the new user.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-184.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 184&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to select the database in which the mailbox for the new user will be created.&lt;/p&gt;
&lt;p&gt;Check the box &quot;Specify the mailbox database rather than using a database automatically selected&quot; and click on the &quot;Browse&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-185.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 185&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the database in which you want to create a new mailbox and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-186.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 186&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the database is selected, click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-187.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 187&quot;&gt;&lt;/p&gt;
&lt;p&gt;Then leave the settings unchanged and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-188.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 188&quot;&gt;&lt;/p&gt;
&lt;p&gt;Everything is ready to create a new user with a mailbox.&lt;/p&gt;
&lt;p&gt;Click on the &quot;New&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-189.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 189&quot;&gt;&lt;/p&gt;
&lt;p&gt;A user with a mailbox has been successfully created.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;After the user with the mailbox is created, it will appear in the &quot;Mailbox&quot; section.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-190.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 190&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to import the Exchange certificate into Trusted Root Certification Authorities on all computers in the domain.&lt;/p&gt;
&lt;p&gt;Go to the domain controller, create a folder and copy the Exchange certificate into it.&lt;/p&gt;
&lt;p&gt;:::note
In this tutorial, the certificate was copied to the &quot;ExchangeCertificate&quot; folder on the &quot;C&quot; drive.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-191.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 191&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, click &quot;Start&quot; and select &quot;Administrative Tools&quot;, then &quot;Group Policy Management&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-192.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 192&quot;&gt;&lt;/p&gt;
&lt;p&gt;We create a new group policy to import the certificate into the &quot;Trusted Root Certification Authorities&quot; on all computers in the domain.&lt;/p&gt;
&lt;p&gt;Right-click on the domain name and select &quot;Create a GPO in this domain, and Link it here&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-193.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 193&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify a name for the new group policy and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-194.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 194&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, click on the new policy with the right mouse button and select &quot;Edit&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-195.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 195&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the Group Policy Editor, go to the &quot;Computer Configuration&quot; section, then to the &quot;Windows Settings&quot; subsection, then find the &quot;Security Settings&quot; section and select &quot;Public Key Policies&quot;, now right-click on &quot;Trusted Root Certification Authorities&quot; and select &quot; Import &quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-196.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 196&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-197.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 197&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to specify the path to the Exchange certificate.&lt;/p&gt;
&lt;p&gt;Click the &quot;Browse&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-198.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 198&quot;&gt;&lt;/p&gt;
&lt;p&gt;Go to the folder with the Exchange certificate and click on the &quot;Open&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-199.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 199&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the path to the certificate is specified, click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-200.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 200&quot;&gt;&lt;/p&gt;
&lt;p&gt;Then leave the settings unchanged and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-201.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 201&quot;&gt;&lt;/p&gt;
&lt;p&gt;Everything is ready to import the certificate into the &quot;Trusted Root Certification Authorities&quot; for all computers in the domain.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-202.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 202&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Exchange certificate has been successfully imported into Group Policy settings.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-203.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 203&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the certificate is imported into Group Policy settings, it will appear in the &quot;Trusted Root Certification Authorities&quot; section.&lt;/p&gt;
&lt;p&gt;Now the Exchange certificate will be imported to all computers that fall under this policy.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-204.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 204&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to restart your mail server.&lt;/p&gt;
&lt;p&gt;We return to the server with Exchange Server 2010 installed.&lt;/p&gt;
&lt;p&gt;Click &quot;Start&quot; and select &quot;Restart&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./configure-exchange-server-2010-205.webp&quot; alt=&quot;Configure Exchange Server 2010 - Step 205&quot;&gt;&lt;/p&gt;
&lt;p&gt;Exchange Server 2010 configuration is complete.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Exchange Server</category><category>Microsoft</category><category>Email</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Exchange Server 2010</title><link>https://heyvaldemar.com/install-exchange-server-2010/</link><guid isPermaLink="true">https://heyvaldemar.com/install-exchange-server-2010/</guid><description>Step-by-step guide to install Exchange Server 2010 on Windows Server 2008 R2. Includes prerequisites, AD setup, and full installation walkthrough.</description><pubDate>Sun, 27 Jul 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Exchange Server 2010.&lt;/p&gt;
&lt;p&gt;:::note
For details on installing Exchange Server 2013, read my guide: &lt;a href=&quot;/install-exchange-server-2013/&quot;&gt;Install Exchange Server 2013&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::warning
This guide walks you through install Exchange Server 2010 without implementing fault tolerance. This will install all the core Exchange Server roles on one server. The Unified Messaging and Edge Transport roles will not be used.
:::&lt;/p&gt;
&lt;p&gt;:::important
We will consider the case when you already have two servers with the Windows Server 2008 R2 operating system installed on them.&lt;/p&gt;
&lt;p&gt;For details on installing Windows Server 2008 R2, read my guide: &lt;a href=&quot;/install-windows-server-2008-r2/&quot;&gt;Install Windows Server 2008 R2&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::important
In addition, one of the servers must have the Active Directory Domain Services role installed, and the second server must be domain joined.&lt;/p&gt;
&lt;p&gt;To learn how to install Active Directory Domain Services on Windows Server 2008 R2, read: &lt;a href=&quot;/install-active-directory-domain-services-on-windows-server-2008-r2/&quot;&gt;Install Active Directory Domain Services on Windows Server 2008 R2&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;Copy the Exchange Server 2010 distribution to a domain controller.&lt;/p&gt;
&lt;p&gt;Launch &quot;Exchange2010-SP3-x64&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-1.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;We indicate in which folder you want to unpack the Exchange Server 2010 installation files.&lt;/p&gt;
&lt;p&gt;Click the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-2.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of unpacking Exchange Server 2010 to the specified folder has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-3.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;The unpacking of Exchange Server 2010 is now complete.&lt;/p&gt;
&lt;p&gt;Click the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-4.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to prepare your Active Directory schema.&lt;/p&gt;
&lt;p&gt;:::note
The commands below must be run on a domain controller with the &quot;Schema Master&quot; role and must have the appropriate rights in the domain.
:::&lt;/p&gt;
&lt;p&gt;Click &quot;Start&quot;, select &quot;All Programs&quot;, then &quot;Accessories&quot;, then right-click on &quot;Command Prompt&quot; and select &quot;Run as administrator&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-5.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Go to the &quot;C:\Exchange&quot; folder using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;cd C:\Exchange
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-6.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s prepare the Active Directory schema to work with Exchange Server using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Setup.com /PrepareSchema
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-7.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of preparing the Active Directory schema has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-8.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Active Directory schema preparation process is complete.&lt;/p&gt;
&lt;p&gt;Now you need to prepare containers, objects, and other Active Directory components and create the Exchange organization.&lt;/p&gt;
&lt;p&gt;:::note
After &quot;OrganizationName&quot; you must indicate the name of your organization in English.
:::&lt;/p&gt;
&lt;p&gt;Let&apos;s prepare containers, objects, and other Active Directory components, as well as create an Exchange organization, using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Setup.com /PrepareAd /OrganizationName: &quot;VMKH&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
This manual uses the organization&apos;s name &quot;VMKH&quot;.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-9.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of preparing Active Directory and creating the Exchange organization has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-10.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of preparing Active Directory and creating the Exchange organization is now complete.&lt;/p&gt;
&lt;p&gt;:::note
The domain controller will no longer be used in this tutorial. All other steps will be performed on the second server on which you plan to install Exchange Server 2010.
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-11.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;On the future Exchange server, go to the system under an account that consists of the following groups: Enterprise Admins, Schema Admins, and Domain Admins.&lt;/p&gt;
&lt;p&gt;Let&apos;s copy the distribution kit of Exchange Server 2010 to the future Exchange server.&lt;/p&gt;
&lt;p&gt;We launch &quot;Exchange2010-SP3-x64&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-12.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;We indicate in which folder you want to unpack the Exchange Server 2010 installation files.&lt;/p&gt;
&lt;p&gt;Click the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-13.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of unpacking Exchange Server 2010 to the specified folder has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-14.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;The unpacking of Exchange Server 2010 is now complete.&lt;/p&gt;
&lt;p&gt;Click the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-15.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to install additional components that are required for the Exchange server to work.&lt;/p&gt;
&lt;p&gt;On the &quot;Taskbar&quot; select &quot;Windows PowerShell&quot; and click &quot;Run as administrator&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-16.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;Import the &quot;ServerManager&quot; module using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Import-Module ServerManager
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-17.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 17&quot;&gt;&lt;/p&gt;
&lt;p&gt;Install the additional components required for the Exchange server to work using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Add-WindowsFeature NET-Framework,RSAT-ADDS,Web-Server,Web-Basic-Auth,Web-Windows-Auth,Web-Metabase,Web-Net-Ext,Web-Lgcy-Mgmt-Console,WAS-Process-Model,RSAT-Web-Server,Web-ISAPI-Ext,Web-Digest-Auth,Web-Dyn-Compression,NET-HTTP-Activation,Web-Asp-Net,Web-Client-Auth,Web-Dir-Browsing,Web-Http-Errors,Web-Http-Logging,Web-Http-Redirect,Web-Http-Tracing,Web-ISAPI-Filter,Web-Request-Monitor,Web-Static-Content,Web-WMI,RPC-Over-HTTP-Proxy -Restart
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-18.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 18&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of installing the necessary components has begun.&lt;/p&gt;
&lt;p&gt;After completing the installation of the components, the server will automatically reboot.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-19.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 19&quot;&gt;&lt;/p&gt;
&lt;p&gt;The installation of the prerequisites is complete.&lt;/p&gt;
&lt;p&gt;Now you need to install Microsoft Office 2010 Filter Pack.&lt;/p&gt;
&lt;p&gt;We go to the &lt;a href=&quot;https://www.microsoft.com/en-us/download/details.aspx?id=17062&quot;&gt;site&lt;/a&gt; and click the &quot;Download&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-20.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 20&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, select &quot;FilterPack64bit.exe&quot; and click the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-21.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 21&quot;&gt;&lt;/p&gt;
&lt;p&gt;We copy the Microsoft Office 2010 Filter Pack distribution kit to the future Exchange Server.&lt;/p&gt;
&lt;p&gt;Run &quot;FilterPack64bit.exe&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-22.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 22&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, the &quot;Microsoft Office 2010 Filter Pack Installation Wizard&quot; will open.&lt;/p&gt;
&lt;p&gt;Click the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-23.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 23&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to accept the license terms.&lt;/p&gt;
&lt;p&gt;Click the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-24.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 24&quot;&gt;&lt;/p&gt;
&lt;p&gt;Installation of Microsoft Office 2010 Filter Pack is complete.&lt;/p&gt;
&lt;p&gt;Click the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-25.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 25&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can now begin Install Exchange Server 2010.&lt;/p&gt;
&lt;p&gt;Go to the &quot;C:\Exchange&quot; folder and run &quot;setup.exe&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-26.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 26&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Install&quot; section, select &quot;Step 4: Install Microsoft Exchange&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-27.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 27&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, the &quot;Exchange Server Setup Wizard&quot; invites you to read information about Exchange Server 2010.&lt;/p&gt;
&lt;p&gt;Click the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-28.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 28&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to accept the license terms.&lt;/p&gt;
&lt;p&gt;Click the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-29.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 29&quot;&gt;&lt;/p&gt;
&lt;p&gt;At this step, you can configure sending errors related to the operation of the Exchange Server to Microsoft.&lt;/p&gt;
&lt;p&gt;Select &quot;No&quot; and click the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-30.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 30&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to choose which roles will be installed on your server.&lt;/p&gt;
&lt;p&gt;:::warning
This guide covers Install Exchange Server 2010 without implementing fault tolerance. This will install all the core Exchange Server roles on one server. The Unified Messaging and Edge Transport roles will not be used.
:::&lt;/p&gt;
&lt;p&gt;Select &quot;Typical Exchange Server Installation&quot; and click the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-31.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 31&quot;&gt;&lt;/p&gt;
&lt;p&gt;At this point, the &quot;Exchange Server Setup Wizard&quot; asks if you have computers with Outlook 2003 installed.&lt;/p&gt;
&lt;p&gt;:::note
If you select &quot;No&quot;, you will not be able to use the &quot;Public Folders&quot; functionality.
:::&lt;/p&gt;
&lt;p&gt;Click the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-32.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 32&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, you need to specify a name by which your users will be able to access your mail server from the Internet.&lt;/p&gt;
&lt;p&gt;Click the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-33.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 33&quot;&gt;&lt;/p&gt;
&lt;p&gt;At this point, you can join the Exchange Server Quality Improvement Program. This will send reports on your server&apos;s activity to Microsoft.&lt;/p&gt;
&lt;p&gt;Select &quot;I don&apos;t want to join the program at this time&quot; and click the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-34.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 34&quot;&gt;&lt;/p&gt;
&lt;p&gt;The installation readiness verification process has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-35.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 35&quot;&gt;&lt;/p&gt;
&lt;p&gt;The readiness to install check process completed successfully. You can start the Exchange Server 2010 installation process.&lt;/p&gt;
&lt;p&gt;Press the &quot;Install&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-36.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 36&quot;&gt;&lt;/p&gt;
&lt;p&gt;The installation process for Exchange Server 2010 has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-37.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 37&quot;&gt;&lt;/p&gt;
&lt;p&gt;Install Exchange Server 2010 is complete.&lt;/p&gt;
&lt;p&gt;Click the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-38.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 38&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, the &quot;Exchange Server Setup Wizard&quot; will warn you that changes have been made to the system and that you need to restart the server in order for them to take effect.&lt;/p&gt;
&lt;p&gt;Click the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-39.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 39&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Exchange Management Console is used to manage Exchange Server 2010.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-40.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 40&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can now check the status of the Exchange Server services.&lt;/p&gt;
&lt;p&gt;Launch the Exchange Management Shell and check the status of the Exchange Server services using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Test-ServiceHealth
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-41.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 41&quot;&gt;&lt;/p&gt;
&lt;p&gt;Service check completed successfully.&lt;/p&gt;
&lt;p&gt;A value of &quot;True&quot; in &quot;RequireServiceRunning&quot; indicates that the services are running.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-exchange-server-2010-42.webp&quot; alt=&quot;Install Exchange Server 2010 - Step 42&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Exchange Server</category><category>Microsoft</category><category>Email</category><category>Windows Server</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Active Directory Domain Services on Windows Server 2008 R2</title><link>https://heyvaldemar.com/install-active-directory-domain-services-on-windows-server-2008-r2/</link><guid isPermaLink="true">https://heyvaldemar.com/install-active-directory-domain-services-on-windows-server-2008-r2/</guid><description>Step-by-step guide to install Active Directory Domain Services (AD DS) on Windows Server 2008 R2. Configure DNS, static IP, and promote to domain controller.</description><pubDate>Wed, 23 Jul 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Active Directory Domain Services on Windows Server 2008 R2.&lt;/p&gt;
&lt;p&gt;:::important
In this guide, we will consider the case when you already have a server with Windows Server 2008 R2 installed on it.&lt;/p&gt;
&lt;p&gt;For details on installing Windows Server 2008 R2, read my guide: &lt;a href=&quot;/install-windows-server-2008-r2/&quot;&gt;Install Windows Server 2008 R2&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::note
To learn how to install Active Directory Domain Services on Windows Server 2019, read: &lt;a href=&quot;/install-active-directory-domain-services-on-windows-server-2019/&quot;&gt;Install Active Directory Domain Services on Windows Server 2019&lt;/a&gt;.
:::&lt;/p&gt;
&lt;p&gt;:::caution
Before installing the Active Directory Domain Services role, make sure to assign the server a proper name according to your organization&apos;s standards. Then, configure a static IP address, subnet mask, gateway, and DNS server address.
:::&lt;/p&gt;
&lt;p&gt;We go into the system under an account with administrator rights and go to the &quot;Start&quot; menu, right-click on &quot;Computer&quot; and select &quot;Properties&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-1.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, in the &quot;System&quot; window in the &quot;Computer name, domain, and workgroup settings&quot; section, click on the &quot;Change settings&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-2.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;System Properties&quot; window on the &quot;Computer Name&quot; tab, click on the &quot;Change&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-3.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;I highly recommend that you think ahead about the name of the servers in your organization.&lt;/p&gt;
&lt;p&gt;Next, specify the new server name in the &quot;Computer Name&quot; field and click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-4.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;The system will warn you that you need to restart the server to apply the new settings.&lt;/p&gt;
&lt;p&gt;Click the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-5.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;System Properties&quot; window, click on the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-6.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now the system will offer to restart the server for the new settings to take effect.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Restart Now&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-7.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, the server will start to reboot.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-8.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to register a static IP address in the network connection settings.&lt;/p&gt;
&lt;p&gt;We log into the system under an account with administrator rights and go to the &quot;Start&quot; menu, right-click on &quot;Network&quot; and select &quot;Properties&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-9.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, in the &quot;Network and Sharing Center&quot; window, click on the &quot;Change adapter settings&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-10.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now right-click on the &quot;Ethernet&quot; network connection and select &quot;Properties&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-11.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select &quot;Internet Protocol Version 4 (TCP / IPv4)&quot; and click on the &quot;Properties&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-12.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, select the item &quot;Use the following IP address&quot; and specify a free IP address, subnet mask, and gateway.&lt;/p&gt;
&lt;p&gt;:::note
You must understand in advance how your network works and know which IP addresses are available.
:::&lt;/p&gt;
&lt;p&gt;In the &quot;Preferred DNS server&quot; field, specify the IP address of this server, since your server will have the &quot;DNS Server&quot; role, which is installed together with the &quot;Active Directory Domain Services&quot; role.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-13.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;Local Area Connection Properties&quot; window, click the &quot;Close&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-14.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;You are now ready to install the Active Directory Domain Services role.&lt;/p&gt;
&lt;p&gt;Open &quot;Server Manager&quot; and select &quot;Add Roles&quot; in the &quot;Roles&quot; item.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-15.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-16.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;Select the &quot;Active Directory Domain Services&quot; role.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-17.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 17&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the next step, the Role Installation Wizard will warn you that several components need to be installed to install the Active Directory Domain Services role.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Add Required Features&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-18.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 18&quot;&gt;&lt;/p&gt;
&lt;p&gt;It is not necessary to select the DNS Server role at this point. It will be installed later.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-19.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 19&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, the &quot;Role Installation Wizard&quot; invites you to familiarize yourself with additional information regarding the &quot;Active Directory Domain Services&quot; role.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-20.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 20&quot;&gt;&lt;/p&gt;
&lt;p&gt;To start the installation of the selected role, click on the &quot;Install&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-21.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 21&quot;&gt;&lt;/p&gt;
&lt;p&gt;The installation of the selected role and the components required for it has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-22.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 22&quot;&gt;&lt;/p&gt;
&lt;p&gt;Installation of the Active Directory Domain Services role is now complete.&lt;/p&gt;
&lt;p&gt;Now click on the button &quot;Close this wizard and launch the Active Directory Domain Services Installation Wizard (dcpromo.exe)&quot; to promote the role of your server to the domain controller level.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-23.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 23&quot;&gt;&lt;/p&gt;
&lt;p&gt;I highly recommend that you think ahead about which domain name you will use when adding a new forest.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-24.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 24&quot;&gt;&lt;/p&gt;
&lt;p&gt;Further, it is proposed to read additional information regarding the functionality of Windows Server 2008 R2.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-25.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 25&quot;&gt;&lt;/p&gt;
&lt;p&gt;This tutorial is about adding a new forest, so in the &quot;Active Directory Domain Services Installation Wizard&quot; window, select &quot;Create a new domain in a new forest&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-26.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 26&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the &quot;FQDN of the new forest root domain&quot; field, specify the desired name for the root domain.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-27.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 27&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step is to select the functional level of the new forest and root domain.&lt;/p&gt;
&lt;p&gt;If you are adding a new forest and plan to continue using servers based on the Windows Server 2008 R2 operating system, then you must select &quot;Windows Server 2008 R2&quot;.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-28.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 28&quot;&gt;&lt;/p&gt;
&lt;p&gt;For the domain controller to work correctly, the &quot;DNS server&quot; role must be installed.&lt;/p&gt;
&lt;p&gt;Select &quot;DNS server&quot; and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-29.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 29&quot;&gt;&lt;/p&gt;
&lt;p&gt;At this point, the AD DS Configuration Wizard will warn you that a delegation for this DNS server cannot be created.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Yes&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-30.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 30&quot;&gt;&lt;/p&gt;
&lt;p&gt;You can now change the paths for the AD DS database directories, log files and the SYSVOL folder. I recommend leaving these default values.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-31.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 31&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify the password for DSRM (Directory Service Restore Mode) and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-32.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 32&quot;&gt;&lt;/p&gt;
&lt;p&gt;The next step displays a summary of the server configuration.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-33.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 33&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of promoting the server to the domain controller has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-34.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 34&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of promoting the server to the domain controller is complete.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Finish&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-35.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 35&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now the system will offer to restart the server for the new settings to take effect.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Restart Now&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-36.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 36&quot;&gt;&lt;/p&gt;
&lt;p&gt;Next, the server will start to reboot.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-37.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 37&quot;&gt;&lt;/p&gt;
&lt;p&gt;Server promotion to a domain controller is complete.&lt;/p&gt;
&lt;p&gt;You can use the Active Directory Users and Computers snap-in to manage users, groups, and other Active Directory objects.&lt;/p&gt;
&lt;p&gt;We go into the system under an account with domain administrator rights.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-38.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 38&quot;&gt;&lt;/p&gt;
&lt;p&gt;Go to the &quot;Start&quot; menu and select the &quot;Administrative Tools&quot; item, then select &quot;Active Directory Users and Computers&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-39.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 39&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Active Directory Users and Computers snap-in opens.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-active-directory-domain-services-on-windows-server-2008-r2-40.webp&quot; alt=&quot;Install Active Directory Domain Services on Windows Server 2008 R2 - Step 40&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Active Directory</category><category>Windows Server</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item><item><title>Install Windows Server 2008 R2</title><link>https://heyvaldemar.com/install-windows-server-2008-r2/</link><guid isPermaLink="true">https://heyvaldemar.com/install-windows-server-2008-r2/</guid><description>Comprehensive step-by-step guide to install Windows Server 2008 R2 using official ISO media. Ensure stability and performance with a clean setup.</description><pubDate>Mon, 21 Jul 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article is for those looking for a detailed and straightforward guide on installing Windows Server 2008 R2.&lt;/p&gt;
&lt;p&gt;:::note
I strongly recommend that you never use any third-party builds of Windows. Use only original installation images. This will help you avoid a lot of problems and get maximum performance and stability.
:::&lt;/p&gt;
&lt;p&gt;After successfully booting from a Windows Server 2008 R2 installation USB stick or DVD, the first step is to select your language options.&lt;/p&gt;
&lt;p&gt;Click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2008-r2-1.webp&quot; alt=&quot;Install Windows Server 2008 R2 - Step 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;Install now&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2008-r2-2.webp&quot; alt=&quot;Install Windows Server 2008 R2 - Step 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;:::note
If you need to install Windows Server 2008 R2 in Server Core mode, then you need to select &quot;Windows Server 2008 R2 Standard (Server Core Installation)&quot;.
:::&lt;/p&gt;
&lt;p&gt;This example covers Install Windows Server 2008 R2 Standard (Full Installation).&lt;/p&gt;
&lt;p&gt;Select &quot;Windows Server 2008 R2 Standard (Full Installation)&quot; and click &quot;Next&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2008-r2-3.webp&quot; alt=&quot;Install Windows Server 2008 R2 - Step 3&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to accept the license terms.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2008-r2-4.webp&quot; alt=&quot;Install Windows Server 2008 R2 - Step 4&quot;&gt;&lt;/p&gt;
&lt;p&gt;This step offers two installation options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&quot;Upgrade&quot;. This is not the best option. As practice shows, numerous programs may not be compatible with the new operating system, and after the update, you will not be able to work with them, in addition, there is a possibility of dragging problems from the old operating system to the new one, thus losing all stability.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&quot;Custom&quot;. This is the best option for installing any version of the Windows operating system. It allows you to start from scratch with the system, so after installation, you will get maximum performance and stability. All that remains is to install the drivers and software familiar to work.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2008-r2-5.webp&quot; alt=&quot;Install Windows Server 2008 R2 - Step 5&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to choose which disk the new operating system will be installed on and allocate space for installation.&lt;/p&gt;
&lt;p&gt;If you have more than one disk installed or the disk already has several partitions, all this will be displayed at this stage. You need to be careful and understand in advance which partition you want to install the operating system on.&lt;/p&gt;
&lt;p&gt;:::note
In this example, one 60 GB disk is installed.
:::&lt;/p&gt;
&lt;p&gt;To create a partition on the disk, select the &quot;Drive options&quot; item.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2008-r2-6.webp&quot; alt=&quot;Install Windows Server 2008 R2 - Step 6&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the &quot;New&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2008-r2-7.webp&quot; alt=&quot;Install Windows Server 2008 R2 - Step 7&quot;&gt;&lt;/p&gt;
&lt;p&gt;In this case, all free disk space will be allocated for the system, so we leave the value in the &quot;Size&quot; section by default. Click on the &quot;Apply&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2008-r2-8.webp&quot; alt=&quot;Install Windows Server 2008 R2 - Step 8&quot;&gt;&lt;/p&gt;
&lt;p&gt;The operating system notifies that it may need to create additional partitions on the disk to store system files.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2008-r2-9.webp&quot; alt=&quot;Install Windows Server 2008 R2 - Step 9&quot;&gt;&lt;/p&gt;
&lt;p&gt;Thus, all free disk space was allocated for the operating system, but at the same time, the system reserved a small partition for itself.&lt;/p&gt;
&lt;p&gt;Now you need to select the partition on which you intend to install the operating system and click on the &quot;Next&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2008-r2-10.webp&quot; alt=&quot;Install Windows Server 2008 R2 - Step 10&quot;&gt;&lt;/p&gt;
&lt;p&gt;The process of installing the operating system has begun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2008-r2-11.webp&quot; alt=&quot;Install Windows Server 2008 R2 - Step 11&quot;&gt;&lt;/p&gt;
&lt;p&gt;The computer will automatically restart.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2008-r2-12.webp&quot; alt=&quot;Install Windows Server 2008 R2 - Step 12&quot;&gt;&lt;/p&gt;
&lt;p&gt;After the installation is complete, the operating system will begin to prepare the server for work.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2008-r2-13.webp&quot; alt=&quot;Install Windows Server 2008 R2 - Step 13&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now you need to provide a strong password for the &quot;Administrator&quot; account.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2008-r2-14.webp&quot; alt=&quot;Install Windows Server 2008 R2 - Step 14&quot;&gt;&lt;/p&gt;
&lt;p&gt;Specify a strong password and press &quot;Enter&quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2008-r2-15.webp&quot; alt=&quot;Install Windows Server 2008 R2 - Step 15&quot;&gt;&lt;/p&gt;
&lt;p&gt;The password for the &quot;Administrator&quot; account has been successfully set.&lt;/p&gt;
&lt;p&gt;Click on the &quot;OK&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2008-r2-16.webp&quot; alt=&quot;Install Windows Server 2008 R2 - Step 16&quot;&gt;&lt;/p&gt;
&lt;p&gt;Install Windows Server 2008 R2 is complete.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-windows-server-2008-r2-17.webp&quot; alt=&quot;Install Windows Server 2008 R2 - Step 17&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&amp;lt;div style={{ textAlign: &quot;center&quot;, paddingBottom: &quot;3rem&quot;, marginTop: &quot;5rem&quot; }}&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.95rem&quot;, letterSpacing: &quot;0.25em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#ffffff&quot;, margin: &quot;0 0 8px 0&quot;, fontWeight: &quot;900&quot; }}&amp;gt;
Vladimir Mikhalev
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.75rem&quot;, letterSpacing: &quot;0.2em&quot;, textTransform: &quot;uppercase&quot;, color: &quot;#777&quot;, margin: &quot;0 0 1rem 0&quot; }}&amp;gt;
Docker Captain &amp;nbsp;·&amp;nbsp; IBM Champion &amp;nbsp;·&amp;nbsp; AWS Community Builder
&amp;lt;/p&amp;gt;
&amp;lt;p style={{ fontSize: &quot;0.8rem&quot;, color: &quot;#555&quot;, margin: &quot;0 0 2.5rem 0&quot;, fontStyle: &quot;italic&quot; }}&amp;gt;
The Verdict — production-tested analysis on YouTube.
&amp;lt;/p&amp;gt;
&amp;lt;div style={{ display: &quot;flex&quot;, justifyContent: &quot;center&quot;, gap: &quot;1rem&quot;, flexWrap: &quot;wrap&quot; }}&amp;gt;
&amp;lt;a href=&quot;https://www.youtube.com/channel/UCf85kQ0u1sYTTTyKVpxrlyQ?sub_confirmation=1&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #444&quot;, backgroundColor: &quot;#0a0a0a&quot;, color: &quot;#fff&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot;, boxShadow: &quot;0 0 10px rgba(255,255,255,0.05)&quot; }}&amp;gt;YouTube&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://github.com/heyvaldemar&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;GitHub&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.linkedin.com/in/heyvaldemar/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style={{ padding: &quot;0.6rem 1.5rem&quot;, border: &quot;1px solid #333&quot;, color: &quot;#aaa&quot;, textDecoration: &quot;none&quot;, fontWeight: &quot;bold&quot;, textTransform: &quot;uppercase&quot;, letterSpacing: &quot;0.15em&quot;, fontSize: &quot;0.8rem&quot;, borderRadius: &quot;2px&quot;, transition: &quot;all 0.3s ease&quot; }}&amp;gt;LinkedIn&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>SysAdmin &amp; IT Pro</category><category>Windows Server</category><author>Vladimir Mikhalev (heyvaldemar.com)</author></item></channel></rss>