<?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>Docker Captain · Production-Tested Frameworks</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/valdemar-ai-insignia.webp</url><title>VALDEMAR</title><link>https://heyvaldemar.com/</link></image><lastBuildDate>Sun, 15 Mar 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>The Intake Gate Your CISO Is Missing — 300 Million AI Chat Messages Were Public by Default</title><link>https://heyvaldemar.com/</link><guid isPermaLink="true">https://heyvaldemar.com/</guid><description>Over half of AI-enabled apps on major backends carry severe misconfigurations. A hands-on analysis of the 300M-message Firebase breach, the insecure default that caused it, and the 3-layer Operational Discipline Protocol — with specific tooling — to shut down Agent Sprawl before regulators do it for you.</description><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In January 2026, a security researcher discovered that a consumer AI chat application — Chat and Ask AI — had shipped with its Firebase Realtime Database configured for unrestricted public read access. No authentication token was required. Approximately 300 million private chat messages tied to roughly 25 million users were openly queryable for an extended period before the issue was reported and patched.&lt;/p&gt;
&lt;p&gt;The exposed content was not limited to casual conversation. Chat histories included medical questions, legal discussions, financial information, and highly sensitive personal disclosures. The vendor responded within hours of the disclosure, but the duration of the exposure and the nature of the data create lasting liability for both the vendor and any organization whose employees used the tool for work.&lt;/p&gt;
&lt;p&gt;This would be notable as an isolated incident. It is significantly more important as a pattern. Follow-up scanning of 200 iOS apps using Firebase backends found that 103 — more than half — carried the same public-access misconfiguration. This is not a single-vendor failure. It is a category-level backend security collapse.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;What the Misconfiguration Actually Looks Like&lt;/h2&gt;
&lt;p&gt;Before discussing governance, it is worth understanding how trivial this failure is at the infrastructure level. Firebase Realtime Database ships with security rules that control read and write access. The insecure default that enabled this breach looks 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 configuration grants any unauthenticated HTTP request full read and write access to the entire database. Every chat message, every username, every session — available to anyone who constructs the correct URL.&lt;/p&gt;
&lt;p&gt;A properly secured configuration requires authenticated users and scopes access to their own data:&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;The distance between &quot;300 million messages exposed&quot; and &quot;data properly isolated&quot; is six lines of JSON. This is not a sophisticated attack surface. It is an unchecked default.&lt;/p&gt;
&lt;p&gt;In every platform engagement I have led where third-party AI tools were in scope, the backend access configuration was either unknown to the adopting team or assumed to be &quot;handled by the vendor.&quot; It never was. The pattern is consistent: teams evaluate AI tools by feature set, not by infrastructure posture. The Firebase breach is the inevitable result of that evaluation gap applied at scale.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The Governance Gap&lt;/h2&gt;
&lt;p&gt;Firebase ships with locked-down security rules by default — no reads, no writes, no access. But the setup wizard offers a test mode with full public access, intended for prototyping. Developers routinely ship that test configuration straight to production because no review process requires anyone to close it before launch.&lt;/p&gt;
&lt;p&gt;Most enterprises have mature intake processes for SaaS platforms that handle email, CRM, or financial data. AI chat tools have largely bypassed these processes. Employees download them independently. Teams adopt them without procurement involvement. The backend configuration — which determines whether user data is protected or exposed — is never verified by anyone in the adopting organization.&lt;/p&gt;
&lt;p&gt;Thales&apos; 2026 Data Threat Report reinforces the structural scope of this gap: only about one-third of surveyed organizations report knowing where all their data resides even as AI tools receive broad internal access rights. Sixty-one percent of organizations cite AI as their top data security risk, while 70% say the pace of AI-driven transformation is their most significant security challenge. Yet the bridge between concern and control — the intake gate, the configuration check, the access audit — is missing in most organizations.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Risk and Liability&lt;/h2&gt;
&lt;p&gt;The liability exposure operates on two levels.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Direct exposure.&lt;/strong&gt; Any enterprise whose employees used Chat and Ask AI — or any of the 103 similarly misconfigured apps — for work-related conversations faces potential regulatory notification obligations. If employees pasted content containing PII, protected health information, legal privilege, or financial material, the exposure may trigger obligations under GDPR, HIPAA, state breach notification laws, or sector-specific regulations depending on jurisdiction and data classification.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Systemic exposure.&lt;/strong&gt; Leadership faces a harder question: if more than half of AI-enabled apps on a major backend platform carry the same misconfiguration, what is the probability that your organization&apos;s employees are currently using at least one of them? Without a central AI tool inventory, the answer is unknowable — and &quot;we did not know&quot; is not a defensible position in a regulatory proceeding.&lt;/p&gt;
&lt;p&gt;IBM&apos;s 2026 X-Force Threat Intelligence Index adds a compounding vector: over 300,000 stolen ChatGPT credentials were found circulating via infostealer malware. AI chat platforms are now a primary target for credential theft, meaning the exposure surface extends beyond misconfigured backends to include compromised accounts on platforms employees use daily.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Blast Radius&lt;/h2&gt;
&lt;p&gt;The blast radius of the Firebase incident alone is significant: 300 million messages, full chat histories, usernames, and sensitive conversation content. But the systemic pattern — 103 of 200 scanned apps misconfigured — transforms this from a single-vendor event into a supply-chain-level concern for any organization that permits employee use of third-party AI tools without backend verification.&lt;/p&gt;
&lt;p&gt;The compounding effect is what elevates the risk category. Thales reports that 67% of organizations cite credential theft as the primary attack vector against cloud environments. Nearly 60% have already experienced deepfake-related incidents. When misconfigured AI backends, stolen AI platform credentials, and absent data classification converge, the result is a compound exposure that no single remediation addresses.&lt;/p&gt;
&lt;p&gt;There is also a cost dimension that rarely surfaces in incident analysis. Unmeasured AI data retention across multiple tools and cloud regions inflates storage and compliance costs invisibly. Organizations that cannot enumerate which AI tools hold their data cannot enforce data minimization or retention policies — two areas of increasing regulatory focus under both GDPR and emerging US state privacy laws.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Control Protocol: Specific Tooling, Not Generic Advice&lt;/h2&gt;
&lt;p&gt;The control framework follows three layers: visibility, identity enforcement, and continuous verification. Each layer includes the specific tooling required for implementation — not just the principle.&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;hr /&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; Blocking unapproved AI tools will generate pushback from business units that have quietly adopted them for productivity. Requiring vendor attestation adds cycle time to procurement. Enforcing SSO-only access will automatically disqualify popular consumer-grade tools that teams have grown attached to.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The exposure is worse.&lt;/strong&gt; Without this control layer, your organization assumes the regulatory and financial risk of every third-party backend misconfiguration, every stolen credential set, and every unclassified data disclosure — across every AI tool every employee has ever used.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The math:&lt;/strong&gt; A GDPR breach notification proceeding — including legal counsel, forensic audit, regulator communication, and potential fine — starts at six figures for a mid-size enterprise. Multiply by the number of misconfigured tools your employees may have used. Compare that to the cost of a Secure Web Gateway policy update and a procurement checklist revision.&lt;/p&gt;
&lt;p&gt;For any enterprise operating in a regulated environment, there is no decision to make. Control is the only defensible posture.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Executive Verdict: Adopt and Enforce&lt;/h2&gt;
&lt;p&gt;The Firebase misconfiguration is not an anomaly. It is a validated, systemic failure affecting more than half of the tested applications in this category. The remediation is not another piece of security software — it is operational discipline backed by specific, auditable controls.&lt;/p&gt;
&lt;p&gt;Gate the AI tools before they reach your employees. Verify backend configurations before granting approval. Apply the exact same identity governance to AI platforms that you mandate for your CRM and financial systems.&lt;/p&gt;
&lt;p&gt;The organizations that survive the incoming wave of AI-driven data breaches will not necessarily have the largest security budgets. They will have the most ruthless intake processes.&lt;/p&gt;
&lt;p&gt;The gate before the tool. The review before the deployment. The registry before the incident.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The Monday Morning Directive&lt;/h2&gt;
&lt;p&gt;Executives do not manually audit Firebase instances; they direct their teams to do so. If you are forwarding this brief to your CISO, Head of Infrastructure, or IAM lead, include 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</guid><description>Everyone is buying Mac Minis and installing AI agents. I tested one in isolation. Here is the architectural framework for deployment that the Instagram hype does not include.</description><pubDate>Sun, 22 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;An AI agent just went viral. The creator got hired by OpenAI within days of the announcement. Instagram reels with seven-figure view counts are telling engineers to connect the agent to their inbox, their CRM, their project management tools, and step back. The premise: autonomous execution, zero oversight, time reclaimed.&lt;/p&gt;
&lt;p&gt;I set up an isolated Mac environment and ran the agent through every task I could construct.&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 in 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;This is not a review of OpenClaw. This is an architectural analysis of the deployment decision — and why the question most engineers are asking is the wrong question.&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;hr /&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 question cleanly. Summarize emails. Update CRM records. Draft replies. Execute Notion updates. The agent handles each of these in a controlled environment with clean data, clear intent, and no ambiguity.&lt;/p&gt;
&lt;p&gt;Production environments are not controlled. They have relationship context the model cannot access. They have implicit rules the team maintains without documenting. They have 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 question is an architectural question. And most engineers buying Mac Minis this weekend are not asking it.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Blast Radius: The Metric That Determines Safe Deployment&lt;/h2&gt;
&lt;p&gt;Blast radius is a concept borrowed from system reliability engineering. In the context of agent deployment, it measures the &lt;strong&gt;maximum damage&lt;/strong&gt; an agent can produce given its current permission set — and whether that damage is reversible within an acceptable recovery window.&lt;/p&gt;
&lt;p&gt;Every permission you grant an agent is a ceiling on its potential blast radius. Read access to an email thread has a low ceiling. Write access to the primary inbox has a ceiling that includes unauthorized client commitments, archived active deals, and reputational exposure that no rollback command will repair.&lt;/p&gt;
&lt;p&gt;Before any agent touches a live system, every permission needs a blast radius 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 questions is &lt;strong&gt;no&lt;/strong&gt;, the permission does not belong in a production deployment.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Why Slack and Email Are the Highest-Risk Starting Points&lt;/h2&gt;
&lt;p&gt;The hype cycle defaults to email and messaging platforms as the first integration targets. This is architecturally backwards.&lt;/p&gt;
&lt;h3&gt;Slack&lt;/h3&gt;
&lt;p&gt;Slack carries organizational hierarchy in every channel. 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 — and that a confident summary posted to leadership changes the conversation in ways no rollback can fix.&lt;/p&gt;
&lt;p&gt;A misclassified priority escalated autonomously 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 that spans months or years. The agent reads a thread. It does not know this client is in a delicate negotiation. It does not know that the last message you sent was intentionally vague to hold the conversation open. It responds with precision based on the literal text and misses the intent entirely.&lt;/p&gt;
&lt;p&gt;An autonomous send from your address, to a client, with the wrong interpretation of 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 systems should be the &lt;strong&gt;last&lt;/strong&gt; to receive agent write access, not the first.&lt;/p&gt;
&lt;hr /&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 any agent is deployed, it must 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 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;— does not.&lt;/p&gt;
&lt;p&gt;If you cannot write it in one sentence, the agent has no job description and should not touch your systems.&lt;/p&gt;
&lt;h3&gt;2. The Staged Promotion Model&lt;/h3&gt;
&lt;p&gt;Safe agent deployment follows a structured promotion model — not a single-step connection.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stage 1 → Read-Only Observation.&lt;/strong&gt;
The agent has access to the system but cannot write, send, or modify. It observes, summarizes, and surfaces patterns. You study its output over a minimum of thirty real interactions. You document where it hallucinates, where it misclassifies, and where its context window produces confident but incorrect summaries.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stage 2 → Draft-Only Access.&lt;/strong&gt;
The agent generates outputs that require human review and explicit approval before any action occurs. Every email draft is reviewed. Every CRM note is 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;
After validated behavior in Stage 2, the agent is granted scoped write access for a single, defined, low-blast-radius task. One task. One system. Behavior is 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 demonstrated reliability, not a feature you enable at installation. It is extended incrementally, with a revocation plan active at every stage.&lt;/p&gt;
&lt;p&gt;Most agents never reach Stage 4 in any high-stakes context. &lt;strong&gt;That is the correct outcome.&lt;/strong&gt; Controlled leverage at Stage 2 or 3 is more valuable than uncontrolled autonomy at Stage 4.&lt;/p&gt;
&lt;hr /&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-intensive workflows. It holds architecture decisions, project context, client notes, and institutional memory accumulated over months or 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 that certain pages are redundant and consolidate them. It will do this confidently, based on pattern matching, with no understanding of &lt;em&gt;why&lt;/em&gt; a page exists in its current form or &lt;em&gt;who&lt;/em&gt; depends on its current structure.&lt;/p&gt;
&lt;p&gt;The damage is not immediately visible. It surfaces three weeks later when someone opens a page that has been rewritten — and realizes the original context is gone.&lt;/p&gt;
&lt;p&gt;Notion integrations require the most conservative blast radius assessment of any system in a typical operational stack. Read-only access to specific databases is the correct starting point. Unrestricted write access is not on the deployment roadmap until behavior is validated in isolation for an extended period.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The Architectural Verdict&lt;/h2&gt;
&lt;p&gt;Agents are a real capability. The use case is legitimate. The efficiency gains at appropriate scope are measurable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The deployment philosophy being sold in the current hype cycle is not legitimate.&lt;/strong&gt; It skips the blast radius assessment entirely. It treats autonomy as a feature to enable, not a property to earn.&lt;/p&gt;
&lt;p&gt;The architect&apos;s function is not to chase the demo. It is to map the worst case before the first API key is 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 the recovery story within six months. The Architects who follow it will have the 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</guid><description>Amazon laid off Jason Dunn, the architect of the AWS Community Builders program. This isn&apos;t the death of community — it&apos;s the signal that community must prove production value, not just 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 just a restructuring.&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.&lt;/p&gt;
&lt;p&gt;And Amazon cut him.&lt;/p&gt;
&lt;p&gt;This wasn&apos;t about Jason&apos;s performance.
This was about &lt;strong&gt;efficiency&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;CEO Andy Jassy said it explicitly 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;When the company that pioneered developer community-led growth lays off the person running that community, it&apos;s not just a headcount decision.&lt;/p&gt;
&lt;p&gt;It&apos;s a &lt;strong&gt;signal&lt;/strong&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The Question Every Community Member Should Ask&lt;/h2&gt;
&lt;p&gt;I hold 8 vendor-recognized community titles. Docker Captain. IBM Champion. AWS Community Builder. Five more ambassador programs across security, testing, and platform engineering.&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 here&apos;s the honest question:&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 the last decade, the tech industry ran on a playbook: give developers status and a platform, and they&apos;ll evangelize your product. It worked. It built ecosystems. It built careers — including mine.&lt;/p&gt;
&lt;p&gt;But the market is shifting.&lt;/p&gt;
&lt;p&gt;AI can now generate tutorials in 30 languages, 24/7, for free. Generic &quot;10 Reasons to Use Kubernetes&quot; content is commoditized. Companies are asking harder questions about what community 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;hr /&gt;
&lt;h2&gt;What&apos;s Actually at Risk&lt;/h2&gt;
&lt;p&gt;Let me be specific about what&apos;s vulnerable 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 a badge. A badge backed by published work, real architecture decisions, and proven enterprise impact — that&apos;s a trust signal that no AI agent can replicate.&lt;/p&gt;
&lt;hr /&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 seen work and what hasn&apos;t.&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 and 2 enterprise case studies. That content lives on Docker&apos;s domain, drives their SEO, and demonstrates real enterprise use cases. The relationship is mutual — Docker gets credible content, I get a platform and direct access to product leadership.&lt;/p&gt;
&lt;p&gt;Providing real product feedback. Docker Captains don&apos;t just evangelize. We test pre-release features, report bugs, challenge architectural decisions, and push back when something doesn&apos;t work in production. That feedback loop is genuinely valuable to the vendor — and it&apos;s impossible to automate.&lt;/p&gt;
&lt;p&gt;Combining community work with production experience. Every framework I publish, every architecture pattern I share — it 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 original work. If your ambassador profile has 6 badges and zero published articles — you&apos;re a consumer, not a contributor.&lt;/p&gt;
&lt;p&gt;Writing generic tutorials that AI can produce 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 substitute for career development. A Slack channel is not job security. Production credibility is.&lt;/p&gt;
&lt;hr /&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 seen this firsthand. When Docker publishes a case study based on my work at Ataccama, that&apos;s not &quot;engagement.&quot; That&apos;s a sales asset. When IBM recognizes me as a Champion for translating field requirements into product insights, that&apos;s not &quot;goodwill.&quot; That&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;hr /&gt;
&lt;h2&gt;What To Do If You&apos;re in a Community Program Right Now&lt;/h2&gt;
&lt;p&gt;If you hold ambassador or community titles — here&apos;s my framework:&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 reference real work. &quot;I tested this in my environment&quot; is more valuable than &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 community programs isn&apos;t the badge — it&apos;s the access. Use it. Provide 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 in addition to 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: &lt;strong&gt;prove the value, or risk being classified as a cost center.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As someone with 8 active titles, 500,000+ Docker Hub pulls, and 7+ articles on Docker&apos;s official blog — I take that signal seriously. And I&apos;m responding by doubling down on substance, not walking 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</guid><description>Infosys just deployed Devin AI globally. If you are a DevOps engineer competing on technical execution, you are now &quot;Legacy Labor&quot;. Here is the blueprint to survive.</description><pubDate>Wed, 04 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Infosys — a $100 billion systems integrator serving Fortune 500 clients — 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;After a six-month pilot that demonstrated &quot;significant gains in engineering efficiency and quality,&quot; Infosys made the decision to embed Devin into its delivery models and customer environments worldwide. Cognition Labs, the company behind Devin, reports that the AI agent is already embedded in engineering teams at thousands of companies — and they&apos;ve just shipped a faster, more capable version tuned specifically on junior developer benchmarks.&lt;/p&gt;
&lt;p&gt;If you&apos;re a DevOps engineer, platform engineer, or cloud architect whose value proposition is &quot;I execute technical tasks efficiently,&quot; this announcement should feel like a seismic shift. 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;hr /&gt;
&lt;h2&gt;What Infosys Just Told the Market&lt;/h2&gt;
&lt;p&gt;Let&apos;s decode what this deployment actually means.&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 manage infrastructure, platform engineering, and application delivery for some of the largest enterprises on the planet. When a company of this size standardizes an AI agent across its global delivery pipeline, they&apos;re not making a speculative bet — they&apos;re making a calculated business decision based on proven ROI.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The six-month trial delivered results.&lt;/strong&gt;&lt;br /&gt;
Efficiency gains. Quality improvements. Faster delivery cycles. Lower labor costs. These aren&apos;t hypothetical benefits — they&apos;re quantified outcomes that justified enterprise-wide adoption.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Devin is now embedded in client environments.&lt;/strong&gt;&lt;br /&gt;
This isn&apos;t just an internal tool. Infosys is deploying Devin into customer engagements, which means enterprises are now &lt;strong&gt;expecting&lt;/strong&gt; AI-augmented delivery as the baseline. Human engineers are becoming the exception, not the default.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cognition Labs is scaling aggressively.&lt;/strong&gt;&lt;br /&gt;
Thousands of companies are already using Devin. The new agent is faster and tuned for junior-level tasks — the exact work that entry and mid-level engineers typically handle.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The message is clear: &lt;strong&gt;If your job is to execute technical tasks, you are now competing with an AI agent that works 24/7, doesn&apos;t negotiate salary, and improves every quarter.&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The Two Traps Most Engineers Will Fall Into&lt;/h2&gt;
&lt;p&gt;When faced with this news, most engineers will react in one of two predictable ways — and 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 reaction is denial disguised as 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;These statements are all true. But they&apos;re also irrelevant.&lt;/p&gt;
&lt;p&gt;Because the question isn&apos;t &quot;Can Devin do &lt;strong&gt;your exact job&lt;/strong&gt; right now?&quot;&lt;br /&gt;
The question is: &lt;strong&gt;Can Devin do 80% of your job at 10% of the cost?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;And the answer — as Infosys just demonstrated — is yes.&lt;/p&gt;
&lt;p&gt;If your value proposition is &quot;I execute technical tasks with domain context,&quot; you&apos;re not insulated from automation. You&apos;re just &lt;strong&gt;expensive&lt;/strong&gt; automation. And in enterprise procurement, expensive automation gets replaced.&lt;/p&gt;
&lt;hr /&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;This sounds logical. But it&apos;s a move &lt;strong&gt;into&lt;/strong&gt; commoditization, not away from it.&lt;/p&gt;
&lt;p&gt;AI engineering is already saturated. Thousands of mid-level engineers are making the same pivot. The market is flooded with &quot;AI-augmented DevOps engineers&quot; who can configure LangChain and fine-tune models.&lt;/p&gt;
&lt;p&gt;You&apos;re not escaping the race to the bottom. You&apos;re just switching lanes.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The Only Path Forward: Stop Competing on Execution&lt;/h2&gt;
&lt;p&gt;Here&apos;s the uncomfortable truth that most engineers refuse to accept:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If your career is built on technical execution, you are now in a war of attrition with AI agents.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The only engineers who survive — and thrive — in the Devin Age are the ones who &lt;strong&gt;own the decision, not the execution.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I call this 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; that Devin executes.&lt;/p&gt;
&lt;p&gt;A Solutions Architect doesn&apos;t configure Kubernetes. They deliver &lt;strong&gt;the Verdict&lt;/strong&gt; on whether Kubernetes is even the right solution for the client&apos;s business problem.&lt;/p&gt;
&lt;p&gt;A Solutions Architect doesn&apos;t compete with AI. They &lt;strong&gt;direct it.&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&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&apos;s filtering out everyone who thought &quot;knowing Docker&quot; was a career.&lt;br /&gt;
It&apos;s filtering out everyone who thought &quot;being technical&quot; was enough.&lt;br /&gt;
It&apos;s exposing the difference 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 competes on speed and cost. Leadership competes on &lt;strong&gt;strategic value.&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&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, you have two options:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Option One:&lt;/strong&gt;&lt;br /&gt;
Compete with Devin for execution work. Race to the bottom. Fight for contracts that pay $40/hour 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 how 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 requires a blueprint. And most engineers don&apos;t have one.&lt;/p&gt;
&lt;p&gt;The path forward is learning to &lt;strong&gt;think like a Solutions Architect.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That 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 generate inbound offers instead of outbound applications.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;The Market Has Spoken&lt;/h2&gt;
&lt;p&gt;Infosys just told 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;The question is simple:&lt;/strong&gt;&lt;br /&gt;
Are you labor — or are you leadership?&lt;/p&gt;
&lt;p&gt;If you&apos;re still competing on execution, you&apos;re already obsolete. But if you&apos;re willing to &lt;strong&gt;become the architect&lt;/strong&gt;, the opportunity is unprecedented.&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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</guid><description>Anisoptera&apos;s &quot;Dragonfly&quot; platform just proved that specialized CV engineers are no longer irreplaceable. Here is the math ($150k vs $5k) and the architectural 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 explicitly markets itself as the solution to &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;If you are a Computer Vision engineer, an MLOps specialist, or anyone building edge AI infrastructure, this is your wake-up call. Not because Dragonfly is uniquely dangerous, but because it is a public demonstration of a quiet trend: &lt;strong&gt;Specialized engineering roles are being productized.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In this breakdown (video above), I analyze the platform, the pricing model, and why your career is currently in the &quot;blast radius.&quot;&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;hr /&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 makes it different 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. This is a replacement for engineers.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Why This Is a Threat (Even If You Don&apos;t Work in CV)&lt;/h2&gt;
&lt;p&gt;If you are a Backend or NLP engineer, you might think this doesn&apos;t apply to you. &lt;strong&gt;You would be wrong.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Dragonfly is a signal. It proves that you can take a highly specialized engineering discipline—one that used to require PhDs—and package it into a subscription.
If they can do it for Computer Vision, they can do it 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;The question is: &lt;em&gt;Are you an executor, or are you an architect?&lt;/em&gt;&lt;/p&gt;
&lt;hr /&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 manually.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;What To Do About It (The Solutions Architect Framework)&lt;/h2&gt;
&lt;p&gt;If you are feeling uncomfortable, good. That means you are 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;
Stop chasing certifications in YOLO or PyTorch. Those are execution skills.
Instead, learn how to evaluate vendor platforms, calculate TCO (Total Cost of Ownership), and design hybrid systems. These skills require judgment, not just syntax.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Learn to Speak Business.&lt;/strong&gt;
Dragonfly is sold to managers because it speaks their language: ROI and Time-to-Deployment.
If you can&apos;t explain why your custom Python script is better than a $5k/month tool in terms of &lt;em&gt;business risk&lt;/em&gt;, 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 evaluate solutions (Dragonfly vs. Custom), design the architecture, and make the final call. This role is AI-proof because it carries &lt;strong&gt;accountability&lt;/strong&gt;.&lt;/p&gt;
&lt;hr /&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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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;There&apos;s something odd happening in software engineering right now.&lt;/p&gt;
&lt;p&gt;According to the 2025 Stack Overflow Developer Survey, &lt;strong&gt;84% of developers already use—or plan to use—AI tools&lt;/strong&gt;, and more than half rely on them daily. Adoption isn&apos;t the problem. AI is everywhere, and it arrived fast.&lt;/p&gt;
&lt;p&gt;Yet when I speak with engineering leaders, I keep hearing the same sentence:&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 gap 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;hr /&gt;
&lt;h2&gt;Why AI Productivity Is So Hard to Measure&lt;/h2&gt;
&lt;p&gt;Most engineering metrics were never designed for this moment.&lt;/p&gt;
&lt;p&gt;DORA metrics can show changes in deployment frequency, but they can&apos;t explain &lt;em&gt;why&lt;/em&gt; those changes happened. Pull request volume might increase—but is that real productivity, or just AI-generated code creating more review work?&lt;/p&gt;
&lt;p&gt;AI changes workflows in subtle ways. It can improve speed in one area while quietly increasing technical debt, code duplication, or cognitive load elsewhere. Without proper instrumentation, leaders are left guessing—and guessing is expensive.&lt;/p&gt;
&lt;p&gt;This is where pressure starts to build.
CFOs want ROI. CTOs need standardization decisions.
And the data is fragmented across git logs, surveys, dashboards, and anecdotes.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Why GitKraken Is in a Unique Position Here&lt;/h2&gt;
&lt;p&gt;Developer productivity is not just a data problem.
It&apos;s a &lt;strong&gt;trust problem&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;For over a decade, GitKraken has built tools developers actually want to use. That matters more than most leaders realize. If developers don&apos;t trust the system measuring them, the data becomes meaningless.&lt;/p&gt;
&lt;p&gt;GitKraken&apos;s AI-powered features—like intelligent merge conflict resolution and AI-generated commit messages—have already saved &lt;strong&gt;tens of thousands of hours&lt;/strong&gt; across real teams. The important part isn&apos;t the number itself. It&apos;s that the impact is &lt;strong&gt;measured&lt;/strong&gt;, not assumed.&lt;/p&gt;
&lt;p&gt;This is the thinking behind &lt;strong&gt;GitKraken Insights&lt;/strong&gt;: engineering intelligence designed to understand how AI &lt;em&gt;actually&lt;/em&gt; affects productivity, quality, and developer experience—without turning teams into surveillance targets.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;What Makes GitKraken Insights Different&lt;/h2&gt;
&lt;p&gt;GitKraken Insights brings together signals that usually live in isolation:&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;But the real differentiator is &lt;strong&gt;context&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;By combining workflow data with &lt;strong&gt;Voice of the Developer&lt;/strong&gt; feedback, leaders can finally understand &lt;em&gt;why&lt;/em&gt; metrics move—not just &lt;em&gt;that&lt;/em&gt; they move. That&apos;s the difference between dashboards and decisions.&lt;/p&gt;
&lt;p&gt;The platform is powered by GitClear&apos;s engineering analytics technology, paired with GitKraken&apos;s deep focus on developer experience. It&apos;s a rare combination: serious analytics without alienating the people being measured.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Measuring Teams, Not Individuals&lt;/h2&gt;
&lt;p&gt;One lesson the industry keeps relearning the hard way:
&lt;strong&gt;Productivity measurement done wrong destroys trust.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;GitKraken Insights is explicitly designed to analyze &lt;strong&gt;teams and systems&lt;/strong&gt;, not individuals. The goal isn&apos;t performance policing. It&apos;s identifying bottlenecks, friction, and structural issues that slow teams down.&lt;/p&gt;
&lt;p&gt;When developers trust the system, they engage with it.
They give honest feedback. They want leaders to see the data—because it leads to better decisions, not blame.&lt;/p&gt;
&lt;p&gt;That&apos;s when metrics start working &lt;em&gt;with&lt;/em&gt; teams instead of against them.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Enterprise Intelligence Without Enterprise Friction&lt;/h2&gt;
&lt;p&gt;For years, software engineering intelligence was gated behind six-figure contracts and multi-month implementations. That model excludes most teams—and frankly, it&apos;s outdated.&lt;/p&gt;
&lt;p&gt;GitKraken Insights delivers enterprise-grade intelligence at a fraction of the cost and with minimal setup. Teams get value quickly, without massive integrations or process overhauls.&lt;/p&gt;
&lt;p&gt;For organizations relying on gut feel or fragile custom dashboards, this is a structural upgrade—not just another tool.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;A Practical View on AI&lt;/h2&gt;
&lt;p&gt;What I respect about GitKraken&apos;s approach is what it &lt;em&gt;doesn&apos;t&lt;/em&gt; promise.&lt;/p&gt;
&lt;p&gt;AI isn&apos;t positioned as a replacement for developers.
There&apos;s no hype about magic productivity multipliers.&lt;/p&gt;
&lt;p&gt;Instead, the focus is on &lt;strong&gt;practical effectiveness&lt;/strong&gt;—and on helping leaders determine whether AI tools are delivering real value or just adding noise.&lt;/p&gt;
&lt;p&gt;That&apos;s the mindset engineering leadership needs right now.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Looking Ahead&lt;/h2&gt;
&lt;p&gt;The AI productivity paradox isn&apos;t going away. As more tools flood the market, the pressure to justify spend will only increase.&lt;/p&gt;
&lt;p&gt;Teams that can measure impact, understand context, and maintain developer trust will move faster—and with fewer mistakes.&lt;/p&gt;
&lt;p&gt;GitKraken Insights provides a strong foundation for that future.
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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 tech world has tormented itself with one pointless question:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Will AI replace developers?”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The real question — the one that separates professionals from tourists — is much 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;This isn&apos;t about surrendering engineering to AI.
This is about &lt;strong&gt;owning it&lt;/strong&gt;, &lt;em&gt;supervising it&lt;/em&gt;, and &lt;em&gt;scaling it&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;And the toolchain that wins in this era is the one that gives developers:&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;This is exactly 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;hr /&gt;
&lt;h2&gt;The AI Hype Cycle Completely Missed the Point&lt;/h2&gt;
&lt;p&gt;For a year straight, every panel, article, and “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;And then real developers tried using AI on 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 discovered something profound:&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.”
Teams need &lt;strong&gt;supervised AI&lt;/strong&gt; — workflows where humans and tools like GitKraken make AI reliable.&lt;/p&gt;
&lt;hr /&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 micromanaging every token AI produces.
Supervision means:&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;Let&apos;s break it down.&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;And here GitKraken becomes the developer&apos;s &lt;strong&gt;vision panel&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;When 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 would slip through CLI-only reviews.&lt;/p&gt;
&lt;p&gt;This is what real supervision looks like.&lt;/p&gt;
&lt;hr /&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.
A human cannot review them 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.&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 helps 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;This alone prevents dozens of bugs per sprint.&lt;/p&gt;
&lt;h3&gt;GitKraken enforces craftsmanship&lt;/h3&gt;
&lt;p&gt;Developers with great craft write great code — and great 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 becomes a story, not a battlefield.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Real 2025 Use Cases — AI + GitKraken in the Wild&lt;/h2&gt;
&lt;p&gt;Here&apos;s where the article becomes real.&lt;/p&gt;
&lt;p&gt;This is what actually happens in 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 was introduced — and 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;Instead of digging through 12 PR files, GitKraken shows:&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;You fix everything 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;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 — all context is visible.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The Builders Era: Craft + AI + Tools That Respect the Developer&lt;/h2&gt;
&lt;p&gt;Let&apos;s be honest.&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;AI 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;This is why &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;hr /&gt;
&lt;h2&gt;What GitKon 2025 Is Really About (Not the Marketing Version)&lt;/h2&gt;
&lt;p&gt;GitKon 2025 focuses on 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;hr /&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;And GitKon 2025 will show exactly how to do it.&lt;/p&gt;
&lt;hr /&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 see this 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</guid><description>A deep, practical guide to Platform Engineering. Learn how to 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;In this guide we go through:&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 (and why this 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 (without 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;This is the moment when 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;This is 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&apos;s take this topic apart like real engineers — calmly, logically, deeply, and honestly.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1. DevOps vs Platform Engineering: Why They Are Not Competitors&lt;/h2&gt;
&lt;p&gt;There is a lot of confusion around this.
Mainly because people try to compare apples to architecture.&lt;/p&gt;
&lt;p&gt;Let&apos;s fix that.&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:&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;hr /&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;hr /&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.
Let&apos;s define it in the simplest, clearest, most useful way.&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;hr /&gt;
&lt;h2&gt;4. The Anatomy of a Real Platform (5 Layers)&lt;/h2&gt;
&lt;p&gt;After seeing dozens of internal platforms across the world, I&apos;ve never seen one succeed 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;hr /&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;hr /&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;hr /&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;hr /&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;hr /&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 reduces 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;hr /&gt;
&lt;h2&gt;6. DevOps vs Platform Engineering: Deep Comparison for Experts&lt;/h2&gt;
&lt;p&gt;This is the section most articles get wrong or oversimplify.&lt;/p&gt;
&lt;p&gt;Let&apos;s make it 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;hr /&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 are &quot;cool,&quot; but because they shape the experience and constraints of your platform.&lt;/p&gt;
&lt;p&gt;Let&apos;s review the important ones.&lt;/p&gt;
&lt;hr /&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;hr /&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;hr /&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;hr /&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;hr /&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;hr /&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;hr /&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 — and 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;hr /&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;hr /&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;hr /&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;hr /&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;hr /&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;hr /&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;hr /&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;hr /&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;That&apos;s why 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 are 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</guid><description>We deliberately broke an Exchange 2019 server to see if Stellar Repair for Exchange could recover a dirty-shutdown EDB file. Step-by-step 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 that sinking feeling when your Exchange database won&apos;t mount, users are screaming, and logs look like hieroglyphics? I decided to recreate that nightmare on purpose. Why? To see if &lt;strong&gt;Stellar Repair for Exchange&lt;/strong&gt; could actually pull me out of the fire.&lt;/p&gt;
&lt;p&gt;Spoiler: it did. But let&apos;s not skip ahead.&lt;/p&gt;
&lt;p&gt;This post is not theory. It&apos;s a war story from a controlled lab - a full walk-through from &lt;strong&gt;&quot;let&apos;s nuke the Exchange database&quot;&lt;/strong&gt; to &lt;strong&gt;&quot;back in business without losing a single email&quot;&lt;/strong&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Why Stellar Repair for Exchange Caught My Eye&lt;/h2&gt;
&lt;p&gt;I&apos;ve been in the trenches with Exchange long enough to know one truth: when a database goes dirty, your weekend is gone.&lt;/p&gt;
&lt;p&gt;Microsoft gives you tools like &lt;code&gt;eseutil&lt;/code&gt;, but in real disasters, these are like bringing a butterknife to a gunfight.&lt;/p&gt;
&lt;p&gt;That&apos;s where Stellar Repair for Exchange steps in - a third-party recovery tool with one job: &lt;strong&gt;make a corrupt EDB file readable again.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;And judging by their 4.9/5 Trustpilot rating, I&apos;m not the only one curious about it.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The Test Lab: Building a Realistic Disaster&lt;/h2&gt;
&lt;p&gt;Before trusting any recovery software, I built a lab to recreate a real-world environment. Here&apos;s what I spun up:&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;I created three demo users, sent a few emails back and forth, added calendar invites - basically, populated the database so it looked like a normal day at the office.&lt;/p&gt;
&lt;h3&gt;Installing Stellar Repair for Exchange&lt;/h3&gt;
&lt;p&gt;Let&apos;s be clear: the install process is idiot-proof. Download, click Next a few times, done. No hidden dependencies, no drama.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Making a Mess: Dirty Shutdown on Purpose&lt;/h2&gt;
&lt;p&gt;Now for the fun part.&lt;/p&gt;
&lt;p&gt;Exchange logs are sacred - they keep the database consistent. So naturally, I deleted half of them. Then I killed the &quot;Microsoft Exchange Information Store&quot; service. Boom. We just forced the database into &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;Output? Dirty. Just like we wanted.&lt;/p&gt;
&lt;p&gt;At this point, Exchange refuses to mount the database. Exactly the disaster we wanted.&lt;/p&gt;
&lt;hr /&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, point it at the EDB file. If you don&apos;t know where it is, there&apos;s a &quot;Find&quot; option. It even shows a Temp folder path (make sure you&apos;ve got disk space there).&lt;/p&gt;
&lt;p&gt;Before starting a scan, make sure the Temp path shown in Stellar has enough free space - the tool uses this location while processing large databases.&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;You get two scan modes:&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 went with &lt;strong&gt;Extensive Scan&lt;/strong&gt; because I had basically set my database on fire.&lt;/p&gt;
&lt;h3&gt;Step 3: Wait for the Magic&lt;/h3&gt;
&lt;p&gt;After scanning, Stellar presented me with all three mailboxes - emails, calendars, contacts, everything. Fully 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;hr /&gt;
&lt;h2&gt;Recovery Options That Matter&lt;/h2&gt;
&lt;p&gt;From here, 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 this lab, I went with &lt;strong&gt;Export back to Exchange&lt;/strong&gt;. But there&apos;s a catch - you need Outlook installed on the same machine as Stellar. (In production, do this on a separate VM. Trust me.)&lt;/p&gt;
&lt;p&gt;Stellar Repair for Exchange can recover almost everything stored in a mailbox: emails (including attachments), contacts, calendars, tasks, notes, journals, and even Public Folder content.&lt;/p&gt;
&lt;p&gt;It supports Exchange Server versions 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;hr /&gt;
&lt;h2&gt;Rebuilding the Mailboxes&lt;/h2&gt;
&lt;p&gt;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;Then 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;Repeat for all mailboxes. Wait for it to 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;Minutes later: All three mailboxes restored. Emails, calendar invites, everything.&lt;/p&gt;
&lt;p&gt;From a database that was completely unmountable.&lt;/p&gt;
&lt;hr /&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;hr /&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;This isn&apos;t an ad. It&apos;s a sober takeaway after deliberately breaking Exchange: &lt;strong&gt;Stellar Repair for Exchange works.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you&apos;re responsible for Exchange servers and don&apos;t have this kind of tool in your back pocket, you&apos;re gambling with downtime.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;My advice?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Spin up a lab, break your database, and try it. Better to learn this now 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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;Ever had that moment when AWS breaks, everyone shrugs, and suddenly &lt;strong&gt;you&apos;re the one fixing it&lt;/strong&gt;?
Yeah — today&apos;s post is exactly about ending that suffering.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Meet Amazon Q&lt;/h2&gt;
&lt;p&gt;Amazon Q is the built-in AI assistant from AWS. Think of it as your new teammate — without the awkward small talk or questionable music taste.&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;.
It&apos;s like having a senior AWS engineer permanently locked inside your console — except you don&apos;t need HR&apos;s approval.&lt;/p&gt;
&lt;p&gt;And let&apos;s face it: sometimes, it&apos;s even more useful than that colleague who replies three days late… about a completely different issue.&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;hr /&gt;
&lt;h2&gt;So, how does Q actually perform 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 mild panic.&lt;/p&gt;
&lt;p&gt;Before you spiral into endless Google tabs, Q calmly 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;hr /&gt;
&lt;h3&gt;Example 2: VPC Setup&lt;/h3&gt;
&lt;p&gt;You&apos;re setting up a VPC — NAT gateways, subnets…
Usually a YAML nightmare, right?&lt;/p&gt;
&lt;p&gt;But Q hands you the template and goes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“One click. Coffee break.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;Example 3: Route 53 and DNS&lt;/h3&gt;
&lt;p&gt;Configuring DNS in Route 53 usually feels like your first day in tech again.&lt;/p&gt;
&lt;p&gt;Instead of digging through outdated forum posts or getting vague advice from tools that don&apos;t know your setup, Q walks you through — clearly, calmly, and &lt;strong&gt;with way less stress&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;You get the idea.&lt;/p&gt;
&lt;hr /&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 explains 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;hr /&gt;
&lt;h3&gt;But Wait — Don&apos;t We Already Have ChatGPT?&lt;/h3&gt;
&lt;p&gt;Yes… but ChatGPT doesn&apos;t know your AWS setup.&lt;/p&gt;
&lt;p&gt;ChatGPT knows the rules. &lt;strong&gt;Q knows your chaos.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It&apos;s essentially giving ChatGPT the keys to your AWS 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;hr /&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;, so yeah — you might run into a few bugs.&lt;/li&gt;
&lt;li&gt;🧠 If your setup is super complex, you&apos;ll probably still need to tweak a few 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;hr /&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;Amazon Q is an AI assistant built specifically to help DevOps folks deal with &lt;strong&gt;real-world AWS messes&lt;/strong&gt; — without all the usual pain.&lt;/p&gt;
&lt;p&gt;So… why not give it a shot?&lt;/p&gt;
&lt;p&gt;Because let&apos;s be honest — &lt;strong&gt;weekends aren&apos;t meant 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</guid><description>Learn how to turn GPT into a real DevOps assistant using Docker MCP. Discover how AI agents can 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 played around with GPT, Claude, maybe even built a little chatbot.&lt;/p&gt;
&lt;p&gt;But the moment you ask it something like:&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;It just says:&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;hr /&gt;
&lt;h2&gt;AI Is Starting to Act&lt;/h2&gt;
&lt;p&gt;Today, we&apos;re talking about how that&apos;s changing — fast. We&apos;ll look at how language models went from just talking… to actually &lt;strong&gt;acting&lt;/strong&gt; — thanks to agents, MCP, and Docker.&lt;/p&gt;
&lt;p&gt;Yep — they finally got hands. Not real ones, obviously.&lt;/p&gt;
&lt;p&gt;I&apos;m talking about &lt;strong&gt;agents&lt;/strong&gt; — small programs that let AI interact with real-world 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 here — just tech.&lt;/p&gt;
&lt;p&gt;And at the center of it all 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 gives models a secure, consistent way to connect with APIs, databases, and cloud services.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Let&apos;s Start with the Pain&lt;/h2&gt;
&lt;p&gt;Before we get to the good stuff — let&apos;s rewind. What made this whole thing so hard in the first place? AI has always been great at giving 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;But the moment you asked it something simple like:&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;It would just look at you — metaphorically — and say:&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;And hey — fair enough.&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 developers came up with a clever workaround: Give the model &lt;strong&gt;tools&lt;/strong&gt;, in the form of tiny helpers called &lt;strong&gt;agents&lt;/strong&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;So What&apos;s MCP?&lt;/h2&gt;
&lt;p&gt;Okay — so what actually &lt;em&gt;is&lt;/em&gt; MCP? And why does it matter so much in all of this?&lt;/p&gt;
&lt;p&gt;In the world of MCP, things are structured:&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;Pretty slick.&lt;/p&gt;
&lt;p&gt;But early on... it was a mess.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The Old Way Was a Headache&lt;/h2&gt;
&lt;p&gt;Now here&apos;s the part no one misses — the &lt;em&gt;old way&lt;/em&gt; of doing this.&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;And if you needed multiple agents? Now you&apos;re deep in YAML files, container logs, and existential dread.&lt;/p&gt;
&lt;p&gt;You just wanted to check a Stripe payment — and instead, you accidentally joined a Kubernetes support group.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;And Then Came Docker&lt;/h2&gt;
&lt;p&gt;This is where Docker comes in and changes everything. Docker made MCP agents easy to launch, safe to isolate, and painless to manage.&lt;/p&gt;
&lt;p&gt;Think of it like this:&lt;/p&gt;
&lt;p&gt;Your AI gets hands — and Docker gives those hands &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;Explore the complete &lt;a href=&quot;https://www.docker.com/products/mcp-catalog-and-toolkit/&quot;&gt;Docker MCP Toolkit&lt;/a&gt; and check out the &lt;a href=&quot;https://hub.docker.com/catalogs/mcp&quot;&gt;MCP Servers on Docker Hub&lt;/a&gt; — with over 100 officially supported tools you can launch in seconds.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;And It Gets Better&lt;/h2&gt;
&lt;p&gt;Docker Desktop now offers the &lt;strong&gt;MCP Toolkit&lt;/strong&gt; — with over &lt;strong&gt;100 ready-to-use agents&lt;/strong&gt; available through Docker Hub.&lt;/p&gt;
&lt;p&gt;Want to use an agent?&lt;/p&gt;
&lt;p&gt;It&apos;s a three-step move:&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;That&apos;s it.&lt;/p&gt;
&lt;p&gt;No command-line kung fu. No crying into config files.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Fixing the Duplicate Agent Problem&lt;/h2&gt;
&lt;p&gt;Now here&apos;s another issue we used to have — multiple apps trying to spin up the &lt;em&gt;same&lt;/em&gt; agent, over and over.&lt;/p&gt;
&lt;p&gt;That meant:&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;Now?&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;hr /&gt;
&lt;h2&gt;But Is It Safe?&lt;/h2&gt;
&lt;p&gt;All this power sounds great — but is it safe?&lt;/p&gt;
&lt;p&gt;Yep — and here&apos;s why:&lt;/p&gt;
&lt;p&gt;Agents run inside &lt;strong&gt;isolated Docker containers&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;That means:&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 enforces these boundaries &lt;strong&gt;by default&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;And you &lt;em&gt;can&lt;/em&gt; override them — with &lt;code&gt;--privileged&lt;/code&gt; or by mounting the Docker socket — but unless you&apos;re into high-risk adventures… just don&apos;t.&lt;/p&gt;
&lt;p&gt;Stick with the defaults and use verified agents.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;So Who&apos;s This For?&lt;/h2&gt;
&lt;p&gt;So who actually benefits from all 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 this is for you.&lt;/p&gt;
&lt;p&gt;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;hr /&gt;
&lt;h2&gt;Bottom Line&lt;/h2&gt;
&lt;p&gt;AI doesn&apos;t just think anymore. It acts.&lt;/p&gt;
&lt;p&gt;And with &lt;strong&gt;MCP + Docker&lt;/strong&gt;? It acts fast, securely, and at scale.&lt;/p&gt;
&lt;p&gt;So if you&apos;re ready to give your model real-world power — &lt;strong&gt;this is the way to do it.&lt;/strong&gt;&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  ·  IBM Champion  ·  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>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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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;I know the kind of phrase that makes engineers panic:&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;Take a breath.&lt;/p&gt;
&lt;p&gt;Today, I&apos;m sharing &lt;strong&gt;10 Terraform questions&lt;/strong&gt; that actually come up in real interviews — and how to answer them like a pro.&lt;/p&gt;
&lt;p&gt;But more importantly, I&apos;ll explain them &lt;strong&gt;clearly, practically, and with real-life examples&lt;/strong&gt;, so you don&apos;t just memorize the answers — you understand them.&lt;/p&gt;
&lt;p&gt;Alright, let&apos;s dive in.&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;hr /&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, not clicks.&lt;/p&gt;
&lt;p&gt;You&apos;re not clicking around AWS at 3 a.m. like it&apos;s 2009.&lt;/p&gt;
&lt;p&gt;You&apos;re writing code:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“I need a VPC, three subnets, and a database.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Terraform says:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Got it. I&apos;ll build it. I&apos;ll check it. And I&apos;ll make sure it stays that way.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It&apos;s not just convenient — it&apos;s control. It&apos;s repeatability. It&apos;s &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 is at version &lt;a href=&quot;https://github.com/hashicorp/terraform/releases&quot;&gt;1.11&lt;/a&gt;, actively developed and widely used. It remains the industry standard for defining infrastructure.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Question 2: How does Terraform talk to the cloud?&lt;/h2&gt;
&lt;p&gt;Terraform talks to the cloud through something called &lt;a href=&quot;https://developer.hashicorp.com/terraform/language/providers&quot;&gt;providers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;These providers are like adapters — they know how to talk to APIs like:&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;In your code, you define &lt;code&gt;required_providers&lt;/code&gt;, and when you run &lt;code&gt;terraform init&lt;/code&gt;, it pulls in the right versions and 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 locks 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;Think of it like package dependencies — if you don&apos;t pin them, expect surprises. And surprises in production?&lt;/p&gt;
&lt;p&gt;Yeah… not fun.&lt;/p&gt;
&lt;hr /&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 stores:&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 connected&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Lose it... and Terraform has no memory. It forgets &lt;em&gt;everything&lt;/em&gt; you&apos;ve built. Which means it might try to recreate your entire production stack — from scratch.&lt;/p&gt;
&lt;p&gt;So where should you store your state safely?&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;hr /&gt;
&lt;h2&gt;Question 4: What is the actual function of plan, apply, destroy, and refresh?&lt;/h2&gt;
&lt;p&gt;Think of them as: &lt;strong&gt;preview, execute, delete, and sync&lt;/strong&gt;.&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 upcoming Terraform &lt;a href=&quot;https://github.com/hashicorp/terraform/releases&quot;&gt;1.12&lt;/a&gt;, plan includes refresh automatically — no need to run it separately.&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 if it&apos;s Friday. Especially if it&apos;s late.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Especially if it&apos;s prod.&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Question 5: What is drift, and how do you detect it?&lt;/h2&gt;
&lt;p&gt;Drift happens when your &lt;a href=&quot;https://developer.hashicorp.com/terraform/tutorials/cloud/drift-detection&quot;&gt;real infrastructure no longer matches your code&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Let&apos;s say your config says &lt;code&gt;t3.micro&lt;/code&gt;, but someone in AWS changed it manually to &lt;code&gt;t3.large&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Terraform won&apos;t magically know. It only sees drift when you run &lt;code&gt;terraform plan&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;So, how do you detect drift?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you&apos;re using &lt;a href=&quot;https://developer.hashicorp.com/terraform/tutorials/cloud/drift-detection&quot;&gt;HCP Terraform&lt;/a&gt;, good news — it has a built-in drift detector that can send alerts to Slack or Teams via &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;If you&apos;re not using HCP Terraform or Terraform Enterprise, make sure to 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. It means someone made changes &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;hr /&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;Think of a &lt;a href=&quot;https://developer.hashicorp.com/terraform/language/modules&quot;&gt;module&lt;/a&gt; like a function in code — write it once, reuse it everywhere.&lt;/p&gt;
&lt;p&gt;For example, imagine you&apos;ve got a simple VPC module. You use it in dev, staging, and prod — only the IP ranges and names change. The logic stays the same.&lt;/p&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Keep it simple:&lt;/strong&gt; one module — one purpose. Don&apos;t build a module that creates a VPC, sets up a database, and sends a Slack notification — all in one go.&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;hr /&gt;
&lt;h2&gt;Question 7: Variables vs Secrets — where&apos;s the line?&lt;/h2&gt;
&lt;p&gt;Let&apos;s keep it simple — &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.&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;But &lt;strong&gt;secrets&lt;/strong&gt; are a different story — &lt;strong&gt;never hardcode them. Ever.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&apos;ve seen this in real projects — don&apos;t do this:&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 should you put secrets?&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 — make sure it&apos;s marked as &lt;code&gt;sensitive = true&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;That way, it won&apos;t show up in 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 starting with &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 now 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;hr /&gt;
&lt;h2&gt;Question 8: What if terraform apply fails halfway through?&lt;/h2&gt;
&lt;p&gt;It happens — to junior devs, senior engineers… even to me.&lt;/p&gt;
&lt;p&gt;So here&apos;s how you handle it — 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 verify 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 manually editing the state file. That means less risk, no manual hacking — just clean refactoring. Beautiful.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Question 9: How do you separate dev, stage, and prod?&lt;/h2&gt;
&lt;p&gt;There are three proven approaches:&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;But whichever method you choose, there&apos;s one rule you should never break:&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 like storing fire and gasoline in the same drawer.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Question 10: How do you shift security left?&lt;/h2&gt;
&lt;p&gt;Security isn&apos;t something you add later — it starts with your &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; comes in. 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;…help you catch issues early.&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; With the right setup, Terraform checks that during the plan. If it fails — the run is blocked.&lt;/p&gt;
&lt;p&gt;Some of these tools run right in your CI pipeline, others plug into &lt;a href=&quot;https://developer.hashicorp.com/terraform/cloud-docs&quot;&gt;HCP Terraform&lt;/a&gt; directly.&lt;/p&gt;
&lt;p&gt;Want to go deeper? &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 fits right into your CI pipeline.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Security should be part of how you build, not something you fix later.&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;And that&apos;s it. 10 questions, 10 real answers — not just to help you survive an interview, but to help you 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</guid><description>Learn how to build a production-grade GitOps pipeline on AWS using EKS, Argo CD, Terraform, Vault, and GitHub Actions. Real-world architecture. No buzzwords — just systems that scale.</description><pubDate>Tue, 22 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Today, I&apos;m showing you how I built a production-grade GitOps pipeline on AWS, fully containerized and based on real-world experience.&lt;/p&gt;
&lt;p&gt;No buzzwords. No clickbait. Just architecture that works — and a mindset that scales.&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;hr /&gt;
&lt;h2&gt;Why I Chose GitOps&lt;/h2&gt;
&lt;p&gt;GitOps is about control. Git becomes your single source of truth.&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. No &quot;who deployed this on Friday night?&quot; In 2025, GitOps isn&apos;t a trend. It&apos;s the baseline for any team that takes infrastructure seriously.&lt;/p&gt;
&lt;p&gt;But why exactly did I choose GitOps? Let&apos;s dive into my personal setup.&lt;/p&gt;
&lt;hr /&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;Just one &lt;code&gt;terraform apply&lt;/code&gt;, and you have a fully reproducible, codified platform. Zero manual steps.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Why Containers?&lt;/h2&gt;
&lt;p&gt;A container is the smallest unit of reliability. It runs exactly the same in dev, staging, and production. It&apos;s isolated. Predictable. Versioned. CI builds the image, tags it — like &lt;code&gt;release-2025.04.16-prod&lt;/code&gt; — pushes it to &lt;a href=&quot;https://aws.amazon.com/ecr/&quot;&gt;Amazon ECR&lt;/a&gt;, and that&apos;s exactly what runs in production.&lt;/p&gt;
&lt;p&gt;Remember that old joke, &quot;but it works on my machine&quot;? Containers kill that excuse forever. You build systems, not chaos.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The GitOps Mindset Shift&lt;/h2&gt;
&lt;p&gt;But there&apos;s a key mindset shift you need for GitOps — let&apos;s talk about it. Here&apos;s a common mistake I see all the time, even from experienced teams:&lt;/p&gt;
&lt;p&gt;They think CI should handle deployments. In 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&apos;s the power of GitOps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Git is truth.&lt;/li&gt;
&lt;li&gt;CI is just logistics.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&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 — including Argo CD itself.&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;No plain-text tokens. No unencrypted environment variables.&lt;/p&gt;
&lt;p&gt;This stack isn&apos;t just functional. It&apos;s resilient.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Hard-Earned Lessons&lt;/h2&gt;
&lt;p&gt;But getting here wasn&apos;t simple. Let me share the lessons I&apos;ve learned so you don&apos;t repeat 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 clear plan. I personally 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 initial setup.&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;Isolation is key. Trust me — your future self will thank you.&lt;/p&gt;
&lt;h3&gt;3. Secrets&lt;/h3&gt;
&lt;p&gt;If you&apos;re putting secrets in YAML files, you&apos;re not doing GitOps. You&apos;re doing &quot;hopeOps.&quot;&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;. Never expose credentials.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Monitoring: The Non-Negotiable&lt;/h2&gt;
&lt;p&gt;If your monitoring system is users calling you at 3 AM, it&apos;s not monitoring—it&apos;s a nightmare.&lt;/p&gt;
&lt;p&gt;I use &lt;a href=&quot;https://prometheus.io/&quot;&gt;Prometheus&lt;/a&gt; + &lt;a href=&quot;https://grafana.com/&quot;&gt;Grafana&lt;/a&gt; for metrics, &lt;a href=&quot;https://grafana.com/oss/loki/&quot;&gt;Loki&lt;/a&gt; for logs, and &lt;a href=&quot;https://prometheus.io/docs/alerting/latest/alertmanager/&quot;&gt;Alertmanager&lt;/a&gt; for alerts. &lt;a href=&quot;https://argo-cd.readthedocs.io/&quot;&gt;Argo CD&lt;/a&gt; also exposes metrics, so I instantly see if something drifts from Git.&lt;/p&gt;
&lt;p&gt;Monitoring isn&apos;t an add-on. It&apos;s essential. Without it, you&apos;re flying blind.&lt;/p&gt;
&lt;hr /&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;This isn&apos;t hype. This is reality.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;Let&apos;s wrap this up. This isn&apos;t just a technology stack. It&apos;s a mindset. Containers, infrastructure as code, Git at the center of all changes — this is what mature systems look like in 2025. GitOps isn&apos;t about YAML. It&apos;s about building systems you can 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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—but nobody&apos;s talking about the engine behind it.&lt;/p&gt;
&lt;p&gt;Today, we&apos;re cracking open the black box and showing how DevOps and containers turn AI from a demo into a real product. Let&apos;s dive in.&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;hr /&gt;
&lt;h2&gt;Everyone Talks About AI — No One Talks About What Powers It&lt;/h2&gt;
&lt;p&gt;AI is getting all the attention right now. LLMs, code generation, multimodality, AGI…&lt;/p&gt;
&lt;p&gt;But almost nobody talks about &lt;strong&gt;what&apos;s under the hood.&lt;/strong&gt; These models are massive. They need hundreds of gigabytes, GPUs, stability, versioning, monitoring.&lt;/p&gt;
&lt;p&gt;So let me ask:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What makes all this actually work in production?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Take away the DevOps foundation — and all you&apos;ve got is a cool demo. Not a product. Today, I want to show you why &lt;strong&gt;DevOps and containers are what make AI real.&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&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. But behind that magic? Dozens of services, container orchestration, model loading, GPU balancing…&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OpenAI&lt;/strong&gt; handles millions of requests per second. They rely on containers, autoscaling, canary deployments. Not because it&apos;s trendy — but because it&apos;s essential.&lt;/p&gt;
&lt;p&gt;Look at &lt;strong&gt;Hugging Face Spaces&lt;/strong&gt;. Each app runs in a container — so it can scale from 1 user to 10,000 without breaking. Without DevOps, this all falls apart.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The Backbone of AI? DevOps&lt;/h2&gt;
&lt;p&gt;Training a model?&lt;/p&gt;
&lt;p&gt;You need exact drivers, CUDA, PyTorch versions. &lt;strong&gt;Containers solve that in a minute.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Want to automate training, testing, deployment? &lt;strong&gt;You need CI/CD, monitoring, alerting.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Need to version your models, trace changes, log inference? &lt;strong&gt;That&apos;s DevOps territory.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&apos;ve seen teams fine-tune a model — only to realize no one could reproduce the results. Because it was trained on an old dataset. No pipeline. No versioning. No idea what happened.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Containers: The Secret Weapon of AI Teams&lt;/h2&gt;
&lt;p&gt;Containers are &lt;strong&gt;a force multiplier&lt;/strong&gt; for AI teams.&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 to ensure consistent results.&lt;/p&gt;
&lt;p&gt;Without containers, your infrastructure turns into a landmine. AI teams without DevOps are like pilots in a plane — with no runway.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;What Happens Without DevOps? Chaos&lt;/h2&gt;
&lt;p&gt;Let me tell you what I&apos;ve seen firsthand:&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;These aren&apos;t “bad engineers.” These are &lt;strong&gt;DevOps problems.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;DevOps is what brings order. It&apos;s what ensures what worked today — will work tomorrow.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Your AI DevOps Stack: What Real Teams Use&lt;/h2&gt;
&lt;p&gt;Here&apos;s what a real DevOps stack looks like for a modern AI team — built for scale, reproducibility, and sanity.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Docker&lt;/h3&gt;
&lt;p&gt;For reproducible environments — so your code runs the same everywhere, from dev machine to 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;This isn&apos;t just a trendy stack — it&apos;s what enables teams to ship &lt;strong&gt;reliable, scalable, and production-grade AI systems&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Without it, you&apos;re building sandcastles. With it, you&apos;re launching real products.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Where You Fit In&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;If you&apos;re a machine learning engineer&lt;/strong&gt; — learn how to write a Dockerfile. It will save your team a lot of pain.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If you work in DevOps&lt;/strong&gt; — step into the machine learning world. You&apos;ll instantly become the backbone of the team.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If you&apos;re a team lead&lt;/strong&gt; — don&apos;t wait for things to break. Invest in DevOps from day one.&lt;/p&gt;
&lt;p&gt;Because without it, AI stays stuck in Jupyter notebooks. With it, it becomes a real product.&lt;/p&gt;
&lt;hr /&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 are not just buzzwords. They are the engineering core of AI in 2025.&lt;/p&gt;
&lt;p&gt;LLMs are impressive. But real magic? It&apos;s when everything runs smoothly — from training to deployment — exactly when 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  ·  IBM Champion  ·  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>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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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;Today, we&apos;re diving into must-know container security strategies—practical steps to protect your applications, secure your supply chain, and stay ahead of evolving threats.&lt;/p&gt;
&lt;p&gt;Now, we&apos;re in 2025, and cybersecurity threats are more frequent, more sophisticated, and more damaging than ever. We&apos;re no longer just worried about compromised servers or stolen databases—container security is now front and center. In fact, over 85% of organizations currently run containerized applications in production.&lt;/p&gt;
&lt;p&gt;But as container adoption grows, so do the security risks—and attackers have noticed. That&apos;s why it&apos;s important for all of us—DevOps engineers, security professionals, developers, and system designers—to focus on container security.&lt;/p&gt;
&lt;p&gt;In this article, we&apos;ll dive into:&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;So, let&apos;s jump in—time is short, and security waits for no 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;EoeoCTZAGuU&quot;
title=&quot;Master Container Security in 2025 - Best Practices &amp;amp; Live Demo&quot;
/&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Container Security in 2025&lt;/h2&gt;
&lt;p&gt;So why does container security matter in 2025? Let&apos;s set the stage. In 2025, microservices are everywhere. Our applications might be composed of dozens or hundreds of containers, all talking to each other. This dramatically increases our attack surface.&lt;/p&gt;
&lt;p&gt;Why? Each container is effectively its own environment—with OS packages, libraries, and configurations. If just one container is misconfigured or running unpatched software, that single weakness can lead to a major breach.&lt;/p&gt;
&lt;p&gt;We&apos;re also seeing a rise in supply chain attacks—a scenario where attackers don&apos;t just target your code, but any external dependencies, base images, or third-party integrations you rely on.&lt;/p&gt;
&lt;p&gt;In other words, the container image itself can be a point of compromise. That&apos;s why we need to focus on:&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 today is to give you a practical approach to shift security left—catching issues early in development, where they&apos;re cheaper to fix, and integrating security checks into your day-to-day workflows&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Key Best Practices in Container Security&lt;/h2&gt;
&lt;p&gt;So what are the best practices for securing containers? Let&apos;s walk through seven core principles that apply to Docker, Kubernetes, and any containerized environment.&lt;/p&gt;
&lt;h3&gt;1. Use Minimal Base Images&lt;/h3&gt;
&lt;p&gt;Larger images mean more dependencies—and that means a bigger attack surface for attackers. Whenever possible, use lightweight images like Alpine or distroless instead of full Linux distributions.&lt;/p&gt;
&lt;p&gt;Why? Alpine is only about 5 megabytes, compared to Ubuntu or Debian, which are tens or even hundreds of megabytes.&lt;/p&gt;
&lt;p&gt;Fewer packages mean fewer security risks and a smaller attack surface—which is exactly what we want.&lt;/p&gt;
&lt;h3&gt;2. Pin Your Versions&lt;/h3&gt;
&lt;p&gt;When pulling an image, never just write:&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:&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;This locks in a stable version and prevents surprises from unexpected updates or security issues. And never use &lt;code&gt;latest&lt;/code&gt; as a tag! If you pull &lt;code&gt;FROM python:latest&lt;/code&gt;, you don&apos;t know what version you&apos;re getting—it could change unpredictably and break your app.&lt;/p&gt;
&lt;p&gt;Even worse, an attacker could upload a compromised image under &lt;code&gt;latest&lt;/code&gt;, and your system might automatically pull it without you realizing.&lt;/p&gt;
&lt;p&gt;Always pin your versions to stay in control.&lt;/p&gt;
&lt;h3&gt;3. Scan Early and Often&lt;/h3&gt;
&lt;p&gt;Security isn&apos;t a one-time step—you need to continuously scan for risks 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; help automate this.&lt;/p&gt;
&lt;p&gt;For example, with &lt;a href=&quot;https://www.docker.com/products/docker-scout/&quot;&gt;Docker Scout&lt;/a&gt;, you can scan an image with just one command and instantly see security risks.&lt;/p&gt;
&lt;p&gt;Integrate security into your pipeline from day one — not as a last-minute patch.&lt;/p&gt;
&lt;h3&gt;4. Use Multi-Stage Builds&lt;/h3&gt;
&lt;p&gt;If your container has unnecessary dependencies, libraries, or tools left over from the build process, attackers have more to work with.&lt;/p&gt;
&lt;p&gt;Instead, use multi-stage builds: Build your app in one stage, then copy only the necessary files to a final, smaller image.&lt;/p&gt;
&lt;p&gt;This removes:&lt;/p&gt;
&lt;p&gt;🚫 Debugging tools&lt;br /&gt;
🚫 Compilers&lt;br /&gt;
🚫 Temporary files&lt;/p&gt;
&lt;p&gt;That means a smaller, cleaner, and more secure container.&lt;/p&gt;
&lt;h3&gt;5. Drop Unnecessary Privileges&lt;/h3&gt;
&lt;p&gt;By default, containers run as root, which is a huge security risk. If an attacker gains control of a root container, they can spread across your system.&lt;/p&gt;
&lt;p&gt;Instead, run your container as a non-root user by specifying:&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;But what does this actually mean?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The first one thousand is the user ID—it&apos;s just a regular non-root user in Linux.&lt;/li&gt;
&lt;li&gt;The second one thousand is the group ID—which means it&apos;s part of a restricted group.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By running as a low-privilege user, even if an attacker breaks in, they won&apos;t have system-wide access.&lt;/p&gt;
&lt;h3&gt;6. Keep Secrets Out of Images&lt;/h3&gt;
&lt;p&gt;Never bake sensitive data inside an image—this is a common mistake that exposes secrets if your image is leaked or pulled by the wrong person.&lt;/p&gt;
&lt;p&gt;Instead, store secrets securely in:&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;If you happen to hard-code a secret, 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; can detect it before it gets exposed.&lt;/p&gt;
&lt;p&gt;Never put secrets in images, repos, or logs!&lt;/p&gt;
&lt;h3&gt;7. Monitor Runtime Behavior&lt;/h3&gt;
&lt;p&gt;Scanning at build time isn&apos;t enough—you also need to monitor what&apos;s happening in production.&lt;/p&gt;
&lt;p&gt;Tools like &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; can detect suspicious activity inside containers.&lt;/p&gt;
&lt;p&gt;For example, &lt;a href=&quot;https://falco.org/&quot;&gt;Falco&lt;/a&gt; can alert you if a container suddenly starts running a shell, which could mean an attacker has taken control.&lt;/p&gt;
&lt;p&gt;Watch out for other red flags like:&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;By monitoring runtime behavior, you can catch threats before they become full-blown security incidents.&lt;/p&gt;
&lt;h3&gt;Final Thoughts on Key Best Practices in Container Security&lt;/h3&gt;
&lt;p&gt;If you follow these seven core principles, you&apos;ll be ahead of many organizations that are still struggling with container security.&lt;/p&gt;
&lt;p&gt;Less is more—less complexity, lower privileges, and minimal secrets make for a more secure container.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Docker Scout for Local Image Scanning&lt;/h2&gt;
&lt;p&gt;Alright, let&apos;s roll up our sleeves and try out &lt;a href=&quot;https://www.docker.com/products/docker-scout/&quot;&gt;Docker Scout&lt;/a&gt; in action!&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 gives 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;Now, let&apos;s say we have a sample Node.js application. Here&apos;s what our Dockerfile looks like.&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;Here, we&apos;re using &lt;code&gt;node:22.13.0-alpine&lt;/code&gt; because it&apos;s smaller than &lt;code&gt;node:22&lt;/code&gt;. That makes it more efficient for containers, but we still need to check for security issues.&lt;/p&gt;
&lt;p&gt;Now, let&apos;s build our Docker 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;This command packages our application into a Docker image called &lt;code&gt;my-node-app&lt;/code&gt; with version &lt;code&gt;1.0.0&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Next, let&apos;s use &lt;a href=&quot;https://www.docker.com/products/docker-scout/&quot;&gt;Docker Scout&lt;/a&gt; to scan our image for security issues.&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; will now analyze the image and highlight any potential risks or weaknesses.&lt;/p&gt;
&lt;p&gt;Once the scan completes, we&apos;ll see a report listing any detected issues, their severity, and possible fixes.&lt;/p&gt;
&lt;p&gt;These issues could come from system libraries, base packages, or application dependencies. &lt;a href=&quot;https://www.docker.com/products/docker-scout/&quot;&gt;Docker Scout&lt;/a&gt; might recommend upgrading certain components or applying patches to fix them.&lt;/p&gt;
&lt;p&gt;So why does this matter? Because local scanning helps us catch security issues early—before we push the image to a registry or deploy it to production. Fixing these issues now makes our environment instantly more secure.&lt;/p&gt;
&lt;p&gt;And that&apos;s a quick look at how you can use &lt;a href=&quot;https://www.docker.com/products/docker-scout/&quot;&gt;Docker Scout&lt;/a&gt; to improve security in your containerized applications.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Snyk in GitHub Actions&lt;/h2&gt;
&lt;p&gt;Now, let&apos;s see how we can automate security scanning in our CI/CD pipeline using &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;Let&apos;s say we have a Node.js project. Our goal is simple: whenever a developer pushes code or opens a pull request, we want &lt;a href=&quot;https://snyk.io/&quot;&gt;Snyk&lt;/a&gt; to scan for security issues automatically.&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;To set this up, we need to create a new GitHub Actions workflow file. We&apos;ll put it inside the &lt;code&gt;.github&lt;/code&gt; folder, then workflows, and 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 automatically scans both our Docker image and application dependencies for security risks. Here, we&apos;re using &lt;code&gt;SNYK_TOKEN&lt;/code&gt; from GitHub Secrets. This is a best practice because it keeps our login details safe and prevents accidental leaks.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Wrap-Up and Final Tips&lt;/h2&gt;
&lt;p&gt;We&apos;ve covered a lot today:&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;Before we wrap up, here are some quick, practical tips to improve your container security:&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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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;hr /&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;hr /&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;hr /&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;hr /&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 let&apos;s be real—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;hr /&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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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;Today, we&apos;re diving into the must-have DevOps tools for 2025—tools that can streamline workflows, optimize infrastructure, and enhance security.&lt;/p&gt;
&lt;p&gt;So, if you&apos;re looking to upgrade your DevOps toolkit in 2025, this list is for you. Let&apos;s jump right in!&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;hr /&gt;
&lt;h2&gt;AI &amp;amp; DevOps - Smarter Workflows with Fabric&lt;/h2&gt;
&lt;p&gt;It&apos;s no secret that AI is everywhere right now. Whether it&apos;s &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;, or &lt;a href=&quot;https://github.com/features/copilot&quot;&gt;GitHub Copilot&lt;/a&gt;, developers are increasingly using AI-powered tools to boost productivity. But AI is only as good as the prompts you give it, and that&apos;s where Fabric comes in.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/danielmiessler/fabric&quot;&gt;Fabric&lt;/a&gt; helps you craft better AI prompts, leading to more accurate and useful responses. Instead of tweaking prompts manually every time, Fabric provides ready-to-use patterns that help AI understand what you actually need.&lt;/p&gt;
&lt;p&gt;If you rely on AI in your DevOps workflows, Fabric is a simple but powerful tool to add to your setup.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;CI/CD Evolution - Why Devbox Stands Out&lt;/h2&gt;
&lt;p&gt;Speaking of automation, let&apos;s move on to CI/CD.&lt;/p&gt;
&lt;p&gt;CI/CD tools like &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;, and &lt;a href=&quot;https://argoproj.github.io/workflows/&quot;&gt;Argo Workflows&lt;/a&gt; haven&apos;t changed much over the years. But what has changed is how we manage development environments. That&apos;s why my top pick in this category isn&apos;t another workflow engine—it&apos;s &lt;a href=&quot;https://jetify.com/devbox&quot;&gt;Devbox&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Devbox, powered by &lt;a href=&quot;https://nixos.org/&quot;&gt;Nix&lt;/a&gt; packages, makes it incredibly easy to define and install dependencies across different environments—whether you&apos;re working locally, in a CI/CD pipeline, or inside a containerized setup.&lt;/p&gt;
&lt;p&gt;Instead of dealing with version mismatches and missing dependencies, you can spin up a fully configured development environment in seconds. It&apos;s portable, lightweight, and a game-changer for developers who work across multiple machines.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Containers - Security First with Chainguard Images&lt;/h2&gt;
&lt;p&gt;Now, since we&apos;re talking about containers, let&apos;s move on to the next tool.&lt;/p&gt;
&lt;p&gt;Containers have been the backbone of modern DevOps for years, and by now, most of us don&apos;t even think about which runtime we&apos;re using—&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 do the job. But Docker does it better.&lt;/p&gt;
&lt;p&gt;One thing that definitely matters is security. That&apos;s why my pick for 2025 is &lt;a href=&quot;https://chainguard.dev/chainguard-images&quot;&gt;Chainguard Images&lt;/a&gt;. These lightweight, secure container images are designed to eliminate common security risks while keeping the image size as small as possible. If you want to build safer, more efficient containers, switching to Chainguard is an easy win.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Developer Portals - A Better Alternative to Backstage&lt;/h2&gt;
&lt;p&gt;Of course, containers are only part of the story. Let&apos;s talk about Developer Portals.&lt;/p&gt;
&lt;p&gt;With the rise of platform engineering, companies are investing in developer portals to help teams collaborate and streamline workflows. For a long time, &lt;a href=&quot;https://backstage.io/&quot;&gt;Backstage&lt;/a&gt; has been the go-to choice, but let&apos;s be real—it&apos;s complex and expensive to manage.&lt;/p&gt;
&lt;p&gt;That&apos;s why my recommendation is &lt;a href=&quot;https://getport.io/&quot;&gt;Port&lt;/a&gt;. Port takes a data-first approach, allowing teams to visualize services, dependencies, and internal tools without the headache of maintaining Backstage. It integrates smoothly with &lt;a href=&quot;https://kubernetes.io/&quot;&gt;Kubernetes&lt;/a&gt; and cloud platforms, making it an ideal choice for platform teams.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;GitOps - The Clear Winner is Argo CD&lt;/h2&gt;
&lt;p&gt;Speaking of Kubernetes, let&apos;s talk about GitOps.&lt;/p&gt;
&lt;p&gt;If you&apos;ve been following the GitOps space, you know there has been a long-standing debate 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;. But at this point, it&apos;s safe to say that Argo CD has won.&lt;/p&gt;
&lt;p&gt;While Flux had great architecture, it lost a lot of momentum after WeaveWorks shut down. Meanwhile, Argo CD continues to grow, backed by Intuit, Red Hat, and many others. If you&apos;re managing Kubernetes with GitOps, Argo CD is the best choice in 2025—no question.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Infrastructure as Code - The Future is Control Planes&lt;/h2&gt;
&lt;p&gt;But managing Kubernetes doesn&apos;t stop at GitOps. Let&apos;s talk about infrastructure.&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 been DevOps staples for years. But the next evolution of Infrastructure as Code is control planes—and my pick for this category is &lt;a href=&quot;https://crossplane.io/&quot;&gt;Crossplane&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Crossplane allows you to define infrastructure as APIs, so instead of applying raw Terraform manifests, you can build internal cloud platforms that are fully API-driven. This approach streamlines infrastructure management and makes it easier for teams to consume infrastructure as a service.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Manifest Management - Why I Switched to KCL&lt;/h2&gt;
&lt;p&gt;Of course, with all this infrastructure, managing manifests is a big deal. That brings us to the next tool.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://kubernetes.io/&quot;&gt;Kubernetes&lt;/a&gt; manifests are often written 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—but these formats have scalability issues.&lt;/p&gt;
&lt;p&gt;That&apos;s why I switched to &lt;a href=&quot;https://kcl-lang.io/&quot;&gt;KCL&lt;/a&gt;. KCL is a powerful configuration language that makes managing Kubernetes manifests cleaner and more maintainable. If you&apos;ve ever struggled with complex YAML files, KCL is worth checking out.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The Terminal Game-Changer - Nushell&lt;/h2&gt;
&lt;p&gt;Now, let&apos;s shift gears and talk about something we all use daily—the terminal.&lt;/p&gt;
&lt;p&gt;If you spend a lot of time in the terminal, you need to check out &lt;a href=&quot;https://nushell.sh/&quot;&gt;Nushell&lt;/a&gt;. Unlike Bash or Zsh, Nushell treats everything as structured data—which makes filtering, processing, and scripting so much easier.&lt;/p&gt;
&lt;p&gt;Since switching, I&apos;ve rewritten all my scripts in Nushell, and I don&apos;t see myself going back. It&apos;s fast, intuitive, and perfect for modern DevOps workflows.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;A Hidden Gem - Why You Should Use NATS&lt;/h2&gt;
&lt;p&gt;Speaking of underrated tools, here&apos;s one that deserves more attention.&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 that many DevOps engineers overlook.&lt;/p&gt;
&lt;p&gt;It&apos;s often used as the backend for other tools, but it&apos;s just as powerful when used directly. If you&apos;re dealing with event-driven architectures or microservices, NATS is a fantastic alternative to &lt;a href=&quot;https://kafka.apache.org/&quot;&gt;Kafka&lt;/a&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Kubernetes Networking - Why Cilium is a Must-Have&lt;/h2&gt;
&lt;p&gt;And now, let&apos;s talk about one of the most important tools in Kubernetes networking.&lt;/p&gt;
&lt;p&gt;Networking in &lt;a href=&quot;https://kubernetes.io/&quot;&gt;Kubernetes&lt;/a&gt; can be complicated, but &lt;a href=&quot;https://cilium.io/&quot;&gt;Cilium&lt;/a&gt; simplifies everything by using eBPF. It improves performance, enhances security, and even eliminates the need for traditional service meshes in some cases. Many Kubernetes clusters already use Cilium by default.&lt;/p&gt;
&lt;p&gt;If you haven&apos;t looked into it yet, now&apos;s the time.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Final Thoughts - What Should You Try First?&lt;/h2&gt;
&lt;p&gt;So there you have it—10 DevOps tools that are 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;Thank you for reading! Don&apos;t forget to check out the &lt;a href=&quot;https://youtu.be/cTdt4q6sCZc&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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 if you ignore them, you&apos;ll regret it — when 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;hr /&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;hr /&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 based on 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;hr /&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;hr /&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 — now you&apos;ve got all the defaults, plus custom info.&lt;/p&gt;
&lt;hr /&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;hr /&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;hr /&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;hr /&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;hr /&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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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;. In this article, we&apos;ll explore how Compose Bridge can streamline your migration to Kubernetes, making the process more efficient and 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 allows you to leverage the robust orchestration capabilities of Kubernetes while maintaining the simplicity and efficiency of Docker Compose.&lt;/p&gt;
&lt;hr /&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;hr /&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;hr /&gt;
&lt;h2&gt;Using Docker Desktop to Convert Docker Compose to Kubernetes&lt;/h2&gt;
&lt;p&gt;Compose Bridge integrates seamlessly with Docker Desktop, allowing you to 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;hr /&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;hr /&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;hr /&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;hr /&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;hr /&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, integrating seamlessly with 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;hr /&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;hr /&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 harness Kubernetes&apos; robust 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 comprehensive, 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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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  ·  IBM Champion  ·  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>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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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;hr /&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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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;Let&apos;s skip the fluff: you&apos;re here because you need to pick an orchestrator that won&apos;t burn you down the road.&lt;/p&gt;
&lt;p&gt;Maybe your boss wants Kubernetes. Maybe your CI still uses Docker Compose. Or maybe you&apos;re trying to scale without rewriting everything from scratch. Whatever the reason, here&apos;s the truth — not the brochure version — of &lt;strong&gt;Swarm vs. Kubernetes&lt;/strong&gt; from someone who&apos;s used both in production and lived to tell the tale.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Docker Swarm: The Lightweight Underdog That Still Punches&lt;/h2&gt;
&lt;p&gt;Swarm turns a cluster of Docker hosts into a single virtual engine. That&apos;s its magic trick — and it&apos;s still handy in 2025.&lt;/p&gt;
&lt;p&gt;Since 2019, it&apos;s been under &lt;a href=&quot;https://www.mirantis.com/&quot;&gt;Mirantis&lt;/a&gt;, not Docker Inc. This matters: if you&apos;re expecting the same development pace as Kubernetes, you&apos;ll be disappointed.&lt;/p&gt;
&lt;p&gt;But for &lt;strong&gt;teams who value simplicity&lt;/strong&gt;, Swarm works.&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;If you&apos;re 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;hr /&gt;
&lt;h2&gt;Kubernetes: Industrial-Grade Orchestration at a Price&lt;/h2&gt;
&lt;p&gt;Kubernetes is the heavy-duty option — built by Google to run hyperscale workloads and kept alive by &lt;strong&gt;every cloud vendor on Earth&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;It&apos;s powerful. It&apos;s extensible. It&apos;s also &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;The ecosystem is massive. From Prometheus to Istio to ArgoCD — Kubernetes is the platform everyone&apos;s building on.&lt;/p&gt;
&lt;p&gt;📖 &lt;a href=&quot;https://kubernetes.io/&quot;&gt;Kubernetes.io&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Head-to-Head Comparison&lt;/h2&gt;
&lt;p&gt;Let&apos;s break it down the way it matters to you: features, tooling, and real-world trade-offs.&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 &amp;amp; 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, Docker Hub — it&apos;s all seamless.&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 &amp;amp; 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;hr /&gt;
&lt;h2&gt;So, Which Should You Use?&lt;/h2&gt;
&lt;p&gt;Here&apos;s the brutal honesty:&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;If you&apos;re managing fewer than 10 services and just want to ship code fast — go with &lt;strong&gt;Swarm&lt;/strong&gt;.&lt;br /&gt;
If your system diagrams require multiple boxes and arrows — it&apos;s &lt;strong&gt;Kubernetes time&lt;/strong&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Final Words&lt;/h2&gt;
&lt;p&gt;Swarm isn&apos;t dead. Kubernetes isn&apos;t magic. They&apos;re both just 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;And if you&apos;re still unsure, spin up both. Build something trivial. Deploy it. See where you spend more time: 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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/</link><guid isPermaLink="true">https://heyvaldemar.com/</guid><description>Explore the comprehensive impact of DevOps and Platform Engineering on software development, detailing key strategies, technological innovations, and future 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 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 things. If you&apos;re building modern systems, you need to understand both. No buzzwords. No corporate diagrams. Just the reality from someone who&apos;s built the pipelines, deployed the platforms, and lived to tell the tale.&lt;/p&gt;
&lt;hr /&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; — one that 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 of DevOps:&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;Tools like CI/CD pipelines, observability stacks, IaC, and chatops are just how we do it. The &lt;strong&gt;outcome&lt;/strong&gt; is faster, safer delivery.&lt;/p&gt;
&lt;hr /&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;Instead of every team reinventing Dockerfiles, Helm charts, and GitLab jobs, 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;hr /&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;hr /&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;Big difference in mindset: &lt;strong&gt;DevOps is glue. Platform Engineering is a product.&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&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.&lt;/p&gt;
&lt;p&gt;Platform Engineering fixes that by creating &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;hr /&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 using:&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;hr /&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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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;
/&amp;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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 truly 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;In this guide, we&apos;ll cut through the noise and 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, edge cases, and no hand-holding. If you&apos;re tired of shelling into containers just to grab a config file, this one&apos;s for you.&lt;/p&gt;
&lt;hr /&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;It&apos;s the Docker version of &lt;code&gt;scp&lt;/code&gt; or &lt;code&gt;cp&lt;/code&gt;, except 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;Need 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;hr /&gt;
&lt;h2&gt;Real Use Cases (You&apos;ll Actually Run Into)&lt;/h2&gt;
&lt;p&gt;Let&apos;s talk shop. When should you reach for &lt;code&gt;docker cp&lt;/code&gt;?&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;hr /&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;If that feels clunky — it is. For anything frequent, use volumes.&lt;/p&gt;
&lt;hr /&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. If you copy something into &lt;code&gt;/root&lt;/code&gt;, and your container app runs as &lt;code&gt;node&lt;/code&gt;, 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;If you screw up the target path — say, copying into a nonexistent directory — 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;hr /&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;If you&apos;re doing frequent file syncs? Use &lt;strong&gt;bind mounts&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;If you need data persistence? Use &lt;strong&gt;Docker volumes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;If you 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 are instantly visible inside the container.&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;hr /&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 extract data from 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;But don&apos;t build your entire deployment process around it. For that, use volumes, 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;Need to dig deeper into Docker CLI workflows or file sync strategies? Let&apos;s get you there — 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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;In the history of Russia, many outstanding artists and public figures have faced repression and were forced to emigrate because of their views and creativity, which contradicted the official line of power. In our time, the situation has changed little, and many modern oppositionists and cultural figures continue to face persecution, arrests, and are forced to leave the country. In this article, I have compiled brief biographies of famous personalities who have faced repression and emigration, starting from the times of the Russian Empire and ending with modern Russia. This list is far from complete and, unfortunately, continues to be supplemented with new names.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alexander Pushkin&lt;/strong&gt; (1799-1837, Russian Empire) - A poet who faced censorship and governmental pressure. His works, including &quot;Ode to Liberty,&quot; displeased Emperor Alexander I, leading to his exile in the southern provinces. Although publication opportunities were limited there, he continued his creative work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mikhail Lermontov&lt;/strong&gt; (1814-1841, Russian Empire) - A poet whose fate was tragically sealed after a duel and his poem &quot;Death of the Poet,&quot; dedicated to Pushkin&apos;s death. His open criticism of authority displeased the tsar, resulting in his exile to the Caucasus, where he eventually died 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. Herzen faced oppression and persecution for his radical political views, which ultimately led to his emigration. In exile, he founded the &quot;Free Russian Press&quot; in London, the first independent printing organization that played a key role in spreading liberal and socialist ideas among Russians.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fyodor Dostoevsky&lt;/strong&gt; (1821-1881, Russian Empire) - A writer sentenced to death for participating in the anti-government Petrashevsky Circle. His sentence was commuted to penal servitude in Siberia, followed by exile and military service, profoundly influencing his work and worldview.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Leo Tolstoy&lt;/strong&gt; (1828-1910, Russian Empire) - A writer celebrated for his literary works and philosophical views, which led to his excommunication from the church. Tolstoy criticized the church and advocated for his ideas on morality and spirituality, resulting in his exclusion from the religious community.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ilya Repin&lt;/strong&gt; (1844-1930, Russian Empire) - An artist who moved to Finland seeking solitude and tranquility for his art amidst the revolutionary turmoil in Russia. His relocation was also motivated by a desire to avoid direct involvement in the political upheavals of the time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vaslav Nijinsky&lt;/strong&gt; (1890-1950, Russian Empire) - A ballet master who left Russia during a time of political instability and revolutionary changes. Emigration proved to be a salvation for his career, though it came with challenges of adapting to new conditions abroad.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Wassily Kandinsky&lt;/strong&gt; (1866-1944, USSR) - An artist who left Russia due to disagreements with Soviet policies on art. His pursuit of abstractionism was recognized and celebrated in the West, where he was able to fully realize his creative potential.&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, rejecting Bolshevik power and fearing repression for his monarchist and religious views.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Zinaida Gippius&lt;/strong&gt; (1869-1945, USSR) - A writer and wife of Dmitry Merezhkovsky, she emigrated with him due to their shared disdain for the new Soviet power and fear of repression.&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; which are based on his personal experiences and describe life and conditions in the Gulag. Having spent 17 years in labor camps, Shalamov reflected in his works the cruelty and hopelessness faced by the prisoners. His writings were banned in the Soviet Union and were not published during his lifetime.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ivan Bunin&lt;/strong&gt; (1870-1953, USSR) - A writer who emigrated in 1920, openly opposing communism. He became the first Russian to win the Nobel Prize in Literature in 1933.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fyodor Chaliapin&lt;/strong&gt; (1873-1938, USSR) - An opera singer who emigrated due to restrictions in artistic activity and disagreement with the Soviet government&apos;s policies on art.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sergei Rachmaninoff&lt;/strong&gt; (1873-1943, USSR) - A composer who emigrated after the October Revolution, unwilling to live under the new regime that limited creative freedom and threatened his family.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nikolai Berdyaev&lt;/strong&gt; (1874-1948, USSR) - A philosopher exiled from Soviet Russia in 1922 aboard the &quot;Philosophers&apos; Ship&quot; along with other intellectuals whose views did not align with Bolshevik ideology.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vsevolod Meyerhold&lt;/strong&gt; (1874-1940, USSR) - A director who was arrested and killed during Stalin&apos;s purges. His innovative approach to theater did not meet the ideological requirements of the authorities.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Zinaida Reich&lt;/strong&gt; (1894-1939, USSR) - An actress and wife of Meyerhold, she was killed during Stalin&apos;s purges following the arrest and torture of her husband.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Teffi (Nadezhda Lokhvitskaya)&lt;/strong&gt; (1872-1952, USSR) - A writer who emigrated after the revolution due to her disagreement with the communist government and fears for her life and creative freedom.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Marc Chagall&lt;/strong&gt; (1887-1985, USSR) - An artist who emigrated after 1917 because his artwork did not fit within the confines of socialist realism and was not recognized by the new authority.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nikolai Gumilev&lt;/strong&gt; (1886-1921, USSR) - A poet executed in the context of political repressions for alleged involvement in an anti-monarchist conspiracy. His death was a significant blow to Russian literature.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Anna Akhmatova&lt;/strong&gt; (1889-1966, USSR) - A poetess who faced repression and a ban on publications. Her husband and son were arrested, and she was forced to live under constant fear and surveillance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Osip Mandelstam&lt;/strong&gt; (1891-1938, USSR) - A poet who was arrested and died in detention under harsh conditions and abuses. His work was deemed anti-Soviet, leading to his arrest.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sasha Chorny (Alexander Glikberg)&lt;/strong&gt; (1880-1932, USSR) - A poet who emigrated due to political pressure and the impossibility of freely publishing his works in Soviet Russia. After emigration, he continued his literary activity, but now 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 unable to continue his theatrical activity under repressive policies. He moved to the USA, where he became known for his teaching methodologies.&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, as his music did not meet the requirements of the new authority and did not fit within the bounds of socialist realism.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vladimir Nabokov&lt;/strong&gt; (1899-1977, USSR) - A writer who emigrated due to revolutionary changes that threatened his safety and creative freedom. Nabokov became known for his works written in English, including &quot;Lolita&quot;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Philosophers&apos; Ship&lt;/strong&gt; (1922) - An event during which the Soviet government expelled more than 160 intellectuals, including Nikolai Berdyaev and Sergei Bulgakov, to rid themselves of dissenters and those whose views did not align with Bolshevik ideology.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sergei Yesenin&lt;/strong&gt; (1895-1925, USSR) - A poet who took his own life after conflicts with the authorities and due to pressure related to his literary activities and personal life. His death was a tragedy for Russian literature.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vladimir Mayakovsky&lt;/strong&gt; (1893-1930, USSR) - A poet who took his own life influenced by personal and professional crises, as well as pressure from the authorities. His work did not always align with the official party line, complicating his life and work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nikolai Vavilov&lt;/strong&gt; (1887-1943, USSR) - A geneticist-scientist who was arrested and died in detention due to accusations of anti-Soviet activity. His work on plant breeding did not align with the pseudoscientific theories supported by the Soviet leadership.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solomon Mikhoels&lt;/strong&gt; (1890-1948, USSR) - An actor and director who was killed as part of an anti-Semitic campaign on Stalin&apos;s orders. His murder was disguised as a car accident.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Isaac Babel&lt;/strong&gt; (1894-1940, USSR) - A writer who was arrested, tortured, and executed on suspicions of espionage and anti-Soviet activity. His works were banned and removed from libraries.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nikolai Zabolotsky&lt;/strong&gt; (1903-1958, USSR) - A poet who was sent to a camp for several years for his literary works, which did not meet the ideological standards of Soviet authority.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alexander Vvedensky&lt;/strong&gt; (1904-1941, USSR) - A poet who died en route to a camp where he was sent for anti-Soviet activity. His innovative poetic experiments did not align with the official literary line of the party.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Olga Berggolts&lt;/strong&gt; (1910-1975, USSR) - A poetess who was beaten and lost a child during interrogations by the NKVD. Despite the repression, she became a symbol of the besieged Leningrad and continued her literary activity.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Marina Tsvetaeva&lt;/strong&gt; (1892-1941, USSR) - A poetess who was exiled and driven to suicide due to the inability to freely publish her works and pressure from the authorities.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Daniil Kharms&lt;/strong&gt; (1905-1942, USSR) - A writer who died of starvation in a psychiatric hospital after being arrested for anti-Soviet activity. His works were banned during his lifetime and published only posthumously.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dmitry Likhachev&lt;/strong&gt; (1906-1999, USSR) - An art historian who was arrested, exiled, and fired from his job for his scientific and literary research, which did not meet the ideological requirements of the Soviet authority.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yevgeny Schwartz&lt;/strong&gt; (1896-1958, USSR) - A playwright who faced bans on publications and criticism from the authorities for his satirical works that lampooned bureaucracy and totalitarianism.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Anti-Fascist Committee&lt;/strong&gt; (1940s, USSR) - A committee whose members were executed during 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 who faced persecution and bans on publications for his novel &quot;Doctor Zhivago,&quot; which was deemed anti-Soviet. Pasternak was forced to decline the Nobel Prize in Literature under pressure from the authorities.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mikhail Bulgakov&lt;/strong&gt; - A writer who faced censorship and bans. His works, including &quot;The Master and Margarita,&quot; were not published during his lifetime and were recognized as anti-Soviet.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alexander Solzhenitsyn&lt;/strong&gt; (1918-2008, USSR) - A writer who was exiled and later forced to emigrate for his works criticizing the Soviet authority and the Gulag. He was stripped of his Soviet citizenship and lived 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, including &quot;Andrei Rublev,&quot; &quot;Stalker,&quot; and &quot;Mirror,&quot; are known for their deep philosophical content and innovative form. Tarkovsky often faced censorship and restrictions in his creative activities, which eventually led him to emigrate to Western Europe, where he continued his work in a more liberally creative atmosphere.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yuri Lyubimov&lt;/strong&gt; (1917-2014, USSR/Russia) - A theatrical director who was stripped of citizenship in 1984 for criticizing the Soviet system. Lyubimov continued his career abroad and returned to Russia only 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 who was exiled for his criticism of Soviet policies and his fight for human rights. He was stripped of all awards and titles but continued his human rights work 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 due to the impossibility of publishing his works in the Soviet Union. His works, written in emigration, were recognized only after his death.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Grigory Rodchenkov&lt;/strong&gt; (b. 1958, USSR) - The former head of the Moscow anti-doping laboratory, who emigrated to the USA after exposing the state doping program. His testimony became the basis for investigations and sanctions against Russian sports.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rudolf Nureyev&lt;/strong&gt; (1938-1993, USSR) — an outstanding ballet dancer who defected from the USSR in 1961 during the Kirov Ballet&apos;s tour in Paris. His escape became an international sensation and a serious blow to the prestige of the Soviet Union amidst the Cold War. Faced with close attention from the KGB and the authorities&apos; displeasure for his sympathies towards the West, Nureyev found asylum in France and continued his brilliant career in the West, while in the USSR, he was sentenced in absentia to prison.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Maria Alekhina (Pussy Riot)&lt;/strong&gt; (b. 1988, Russia) - An activist and member of the punk group Pussy Riot, who left Russia after persecution for her political actions and criticism of the authorities. She continues her human rights activities in 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 due to threats and pressure related to his professional activity and criticism of Russian authorities. Dolin left Russia in 2022 after the start of the war against Ukraine, as his anti-war stance and critical statements elicited negative reactions from the authorities and war supporters.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Artur Smolyaninov&lt;/strong&gt; (b. 1983, Russia) - An actor who left Russia in 2022 due to his criticism of government policies and the war in Ukraine. Smolyaninov repeatedly spoke out against the Russian government, leading to persecution and threats against him. He continues his professional activity abroad​.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Little Big&lt;/strong&gt; (Russia) - A musical group known for their satirical and provocative videos, left Russia due to disagreement with the political situation in the country and pressure from the authorities. In 2022, the group members emigrated, continuing their music career 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 Russia due to political pressure and threats. She moved to another country to continue her sports and coaching career in safer conditions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alexander Nevzorov&lt;/strong&gt; (b. 1958, Russia) - A journalist and publicist, known for his critical statements against Russian authorities and politics. In 2022, Nevzorov left Russia due to threats to his life and persecution for his journalistic activity. He continues his work abroad, actively speaking out against the war in Ukraine and the political regime in Russia.&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 theatrical play, which was perceived by the authorities as propaganda of extremism and an insult to the feelings of believers. This was part of a broader campaign to suppress freedom of creativity and critical statements in Russia.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Boris Akunin (Grigory Chkhartishvili)&lt;/strong&gt; (b. 1956, Russia) - A writer against whom a criminal case was initiated for his critical statements and support for opposition movements. Akunin left Russia, fearing arrest and persecution, and continues his literary activity abroad.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vasily Berezin and Stas Falkov&lt;/strong&gt; (Russia) - Artists who founded a collective of exiled Russian artists in Paris. They left Russia due to pressure on freedom of creativity and threats from the authorities. Their works often had a political character and criticized 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. His death is widely regarded as murder linked to his political activity and fight against corruption in Russia. Navalny was known for his anti-corruption investigations and active opposition activity, for which he was repeatedly arrested and repressed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Memorial&lt;/strong&gt; (Russia) - A human rights organization that was liquidated in 2021. Memorial was engaged in investigating and documenting political repressions in the Soviet Union and modern Russia, as well as protecting human rights. The organization was recognized as a &quot;foreign agent&quot; and subjected to pressure from the authorities, leading to its closure.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Oleg Orlov&lt;/strong&gt; (b. 1953, Russia) - The head of the human rights organization &quot;Memorial,&quot; sentenced to 2.5 years in a colony. Orlov was accused of discrediting the Armed Forces of the Russian Federation, in the context of the ongoing campaign against human rights defenders and their activities.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dmitry Muratov&lt;/strong&gt; (b. 1961, Russia) - A journalist, Nobel Peace Prize laureate, who was attacked in 2022. Muratov, the chief editor of &quot;Novaya Gazeta,&quot; repeatedly received threats and faced pressure due to publications criticizing the actions of Russian authorities and corruption​.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TV Channel &quot;Dozhd&quot;&lt;/strong&gt; (Russia) - An independent TV channel forced to cease broadcasting in Russia in 2022 due to pressure from the authorities. &quot;Dozhd&quot; is known for its objective and critical reports on political and social issues in Russia. After ceasing broadcasting in Russia, the channel continued its work abroad.&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 his sharp and critical performances against the Russian government. Ivanov was attacked, which forced him to move to the Czech Republic. He continues to actively spread information about the political situation in Russia.&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 active anti-government performances. Kara-Murza was repeatedly poisoned, presumably due to his political activity. He was sentenced to 25 years in prison for criticizing Russia&apos;s military actions in Ukraine and ties with an &quot;undesirable&quot; organization. In May 2023, the court rejected his appeal, leaving the sentence unchanged. Kara-Murza also suffers from polyneuropathy, a condition that has worsened in prison conditions​.&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 gained wide recognition for defending politically persecuted individuals, including members of the group &quot;Pussy Riot&quot; and Ukrainian journalists. Due to his professional activity and criticism of the Russian government, Feigin was subjected to pressure and was declared wanted in 2023.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ilya Yashin&lt;/strong&gt; (b. 1983, Russia) - A politician and activist, one of the leaders of the Russian opposition, known for his criticism of the authorities. In 2022, Yashin was arrested and sentenced to 8.5 years for disseminating &quot;false&quot; data 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 sentenced by the Tverskoy Court of Moscow to 7 years of imprisonment for reading poems against military actions of Russia in Ukraine.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yegor Shtovba&lt;/strong&gt; (b. 2000, Russia) - An accomplice in the literary reading of Artem Kamardin, sentenced by the Tverskoy Court of Moscow to 5.5 years of imprisonment. He was accused of disseminating &quot;false&quot; data about military actions of Russia in Ukraine, as part of the same judicial campaign against freedom of 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 his anti-war performances and criticism of the authorities. Due to his position and public actions, he was subjected to pressure and threats from the state, which forced him to leave Russia and continue his activities abroad.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Maxim Galkin&lt;/strong&gt; (b. 1976, Russia) - A humorist and TV presenter, who left Russia in 2022 after being recognized as a &quot;foreign agent&quot; for criticizing the Russian government and the war in Ukraine. Galkin continues his professional activity abroad, actively 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 Russia in 2022 due to disagreement with government policies and the start of military actions in Ukraine. Pugacheva openly supported her husband Maxim Galkin, who was recognized as a &quot;foreign agent&quot;. She moved to Israel and continues her activity abroad​.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Group &quot;Nogu Svelo!&quot;&lt;/strong&gt; - A Russian rock group, whose leader Maxim Pokrovsky left Russia in 2022 due to disagreement with government policies and the war in Ukraine. The group continues its activity abroad, actively speaking out against the war and supporting 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 were subjected to pressure from the authorities for their political views. In 2022, the group was forced to cancel its concerts in Russia and partially emigrated, continuing their musical activity abroad.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vitaly Mansky&lt;/strong&gt; (b. 1963, Russia) - A documentary filmmaker who left Russia in 2014 and moved to Riga, Latvia. Mansky is known for his critical films, often focusing on political and social issues. In 2014, he initiated the signing of the open letter &quot;We are with You!&quot; in support of Ukrainian filmmakers against the Russian military intervention in Ukraine. In 2022, he spoke out against Russia&apos;s invasion of Ukraine and was declared wanted by the Russian Ministry of Internal Affairs on charges of defamation. In 2023, the Russian Ministry of Justice included him in the list of foreign agents. Mansky continues to actively work in the field of documentary cinema abroad, organizing the Artdocfest/Riga festival and receiving recognition for his films at international film 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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 glossy dashboards and slick demos — real DevOps happens in the trenches, with your &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; as your weapon of choice. If you&apos;ve ever screamed at a broken pipeline at 2AM, you already know this: GitLab CI/CD is powerful, but only if you stop treating the YAML like a to-do list and start using it like an automation framework.&lt;/p&gt;
&lt;p&gt;Let&apos;s go beyond “Hello, pipeline” and dive into the real tactics that make GitLab CI/CD sing — cleaner configs, faster builds, safer deploys. No fluff. Just the good stuff.&lt;/p&gt;
&lt;hr /&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 time you push, merge, or screw something up.&lt;/p&gt;
&lt;p&gt;All of that magic lives inside one file: &lt;code&gt;.gitlab-ci.yml&lt;/code&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Anatomy of a Real Pipeline&lt;/h2&gt;
&lt;p&gt;A lot of YAML out there looks like someone copy-pasted it from Stack Overflow, prayed to the CI gods, and hit push. Here&apos;s how to actually structure a maintainable pipeline:&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;This is the skeleton. Clean, clear, linear. Each &lt;code&gt;stage&lt;/code&gt; is a phase in your pipeline. Jobs inside the same stage run in parallel (if your runners can handle it). You want your pipeline fast? This is your first speed lever.&lt;/p&gt;
&lt;hr /&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 doing CI in hard mode.&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 become reproducible, portable, and — if you&apos;re lucky — even fast. Don&apos;t use &lt;code&gt;latest&lt;/code&gt;, unless you enjoy surprise breakages on Monday mornings.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Artifacts &amp;amp; Cache: CI&apos;s Secret Fuel&lt;/h2&gt;
&lt;p&gt;Let&apos;s speed things up. A lot.&lt;/p&gt;
&lt;h3&gt;Artifacts keep things 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 keeps things 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 wisely and your pipeline will go from molasses to caffeine-fueled cheetah. Abuse them, and you&apos;ll be debugging stale builds in Slack at midnight.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Modular Configs with &lt;code&gt;include&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Once your pipeline file hits 100 lines, YAML becomes YELL.&lt;/p&gt;
&lt;p&gt;Split the logic:&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 your CI config is maintainable. Reusable. Testable. Like actual code.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Secrets Stay in the Vault&lt;/h2&gt;
&lt;p&gt;This should go without saying, but let me say it louder 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 — project, group, or instance level. Use protected variables for protected branches. This is basic security hygiene. Don&apos;t be the person who commits &lt;code&gt;prod_db_password: hunter2&lt;/code&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;before_script, after_script — Your Pipeline&apos;s Wrapper&lt;/h2&gt;
&lt;p&gt;Need to prep or clean up every time? Use these:&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;Common use cases: bootstrapping test databases, setting env vars, collecting logs, rage-logging failures. Think of it as your pipeline&apos;s setup/teardown hooks.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Smarter Pipelines with &lt;code&gt;rules&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Want jobs to run only when they should? Stop misusing &lt;code&gt;only/except&lt;/code&gt; and start using &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 accidentally deploying from a typo branch.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Real Optimization: Dynamic Variables + Better Caching&lt;/h2&gt;
&lt;p&gt;You can tweak 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;Use &lt;code&gt;CI_COMMIT_REF_NAME&lt;/code&gt; or other built-in vars to drive environments, image tags, and artifact names.&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;A unique cache per branch keeps builds fast without cross-contamination.&lt;/p&gt;
&lt;hr /&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;Never repeat 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 your pipeline conditional and intelligent&lt;/li&gt;
&lt;li&gt;Secrets belong in GitLab UI, not version control&lt;/li&gt;
&lt;li&gt;Optimize for speed, clarity, and safety — in that order&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Takeaway&lt;/h2&gt;
&lt;p&gt;CI/CD isn&apos;t magic. It&apos;s just engineering. But bad pipelines will eat your hours, your weekends, and your soul.&lt;/p&gt;
&lt;p&gt;Take the time to build it right. Start with the basics, modularize as you grow, and automate like your job depends on it — because it probably does.&lt;/p&gt;
&lt;p&gt;Next step? Open up your &lt;code&gt;.gitlab-ci.yml&lt;/code&gt;, rip out the duct tape, and make it battle-ready.&lt;/p&gt;
&lt;p&gt;And if you&apos;re serious about leveling up your DevOps game, bookmark &lt;a href=&quot;https://docs.gitlab.com/ee/ci/&quot;&gt;GitLab&apos;s CI/CD docs&lt;/a&gt; — and maybe finally 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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&apos;s a declarative language — which is just a fancy way of saying &lt;em&gt;you don&apos;t get if-statements like a normal programmer&lt;/em&gt;. So when you need to validate inputs, control behavior, or gate deployments, you reach for the logic tools Terraform &lt;em&gt;does&lt;/em&gt; give you.&lt;/p&gt;
&lt;p&gt;Two of the most deceptively simple — and ridiculously useful — are &lt;code&gt;contains()&lt;/code&gt; and &lt;code&gt;strcontains()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If you&apos;ve ever been bitten by a bad variable, a missing VM size, or a misnamed AZ, this post is for you.&lt;/p&gt;
&lt;p&gt;Let&apos;s break these two down. Sharp, real, no fluff.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;code&gt;contains()&lt;/code&gt;: Check If It&apos;s In There — Or Burn a Saturday Debugging&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;contains()&lt;/code&gt; function checks whether a specific value exists 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;It returns &lt;code&gt;true&lt;/code&gt; if the list contains the value. &lt;code&gt;false&lt;/code&gt; if it doesn&apos;t. That&apos;s it.&lt;/p&gt;
&lt;p&gt;Sounds basic? Sure. But when your infra logic starts depending on user input, region capabilities, or feature flags, this little guy becomes the bouncer at the front of your Terraform nightclub.&lt;/p&gt;
&lt;h3&gt;Real-World Example: Azure VM Sizes&lt;/h3&gt;
&lt;p&gt;Let&apos;s say you&apos;re deploying to Azure, and someone on your team decides to request a beefy VM in a tiny region that doesn&apos;t support it. You want to stop that mistake &lt;em&gt;before&lt;/em&gt; the &lt;code&gt;apply&lt;/code&gt; fails.&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 available in that region, it returns &lt;code&gt;false&lt;/code&gt;. You can use this in a &lt;code&gt;count&lt;/code&gt;, a &lt;code&gt;for_each&lt;/code&gt;, or as part of a &lt;code&gt;validation&lt;/code&gt; block. Either way, it&apos;s miles better than letting Terraform barf mid-deploy.&lt;/p&gt;
&lt;hr /&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 let&apos;s talk about &lt;code&gt;strcontains()&lt;/code&gt; — Terraform&apos;s way of answering the 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;Use it when you don&apos;t have a list, just a single string — like an AZ name, tag, or label — and want to match patterns.&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;This is especially handy when providers or modules return strings with embedded metadata — and you want to route logic accordingly.&lt;/p&gt;
&lt;p&gt;Say you only want to run a deployment if the target zone is labeled “optimal”:&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; becomes your condition switch — whether for creating resources, setting tags, or adding taints.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Gotchas (That Bit Me, So You Don&apos;t Have To)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;contains()&lt;/code&gt; cares about exact values.&lt;/strong&gt; Case-sensitive. No fuzzy matches.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;strcontains()&lt;/code&gt; won&apos;t match regex or wildcards.&lt;/strong&gt; It&apos;s pure substring.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maps don&apos;t work with &lt;code&gt;contains()&lt;/code&gt; the way you want.&lt;/strong&gt; Only lists and sets. If you try &lt;code&gt;contains({ key = &quot;val&quot; }, &quot;key&quot;)&lt;/code&gt; — expect disappointment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nulls can mess with results.&lt;/strong&gt; Validate your variables, or wrap with &lt;code&gt;coalesce()&lt;/code&gt; if needed.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Bonus: Validate with Style&lt;/h2&gt;
&lt;p&gt;Want to enforce logic on inputs? Use &lt;code&gt;validation&lt;/code&gt; blocks with these functions.&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 that makes sense — instead of crashing halfway through your infra plan.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;contains()&lt;/code&gt; when working with lists or sets.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;strcontains()&lt;/code&gt; for substring checks in single strings.&lt;/li&gt;
&lt;li&gt;Combine 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 clean, safe logic in 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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. That means juggling Python packages, GPU drivers, REST APIs, databases, maybe even a Kafka pipeline. And guess what?&lt;br /&gt;
&lt;strong&gt;If you&apos;re still managing that with bash scripts and hope — you&apos;re doing it wrong.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This guide walks through how &lt;strong&gt;Docker Compose&lt;/strong&gt; helps tame the chaos of modern AI projects — and how to wield it with the finesse of someone who&apos;s &lt;strong&gt;actually shipped&lt;/strong&gt; containers in production, not just played around with notebooks.&lt;/p&gt;
&lt;p&gt;We&apos;ll cover real-world usage: from environment handling and image pull policies to secrets, resource limits, and how &lt;code&gt;docker compose watch&lt;/code&gt; can actually save your sanity during dev cycles. We&apos;ll even touch on how to hand off your Compose stack to Kubernetes without rage-quitting.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Compose 2.x: A Dev Tool That&apos;s Grown Up&lt;/h2&gt;
&lt;p&gt;Yes, Compose is still your best friend for local development. But these days, it&apos;s also a &lt;strong&gt;serious CI/CD asset&lt;/strong&gt; and a damn good staging orchestrator — &lt;em&gt;if you know how to use it right&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Let&apos;s get practical.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Environment Variable Precedence: Know Who Wins the Fight&lt;/h2&gt;
&lt;p&gt;By default, Compose now &lt;strong&gt;favors your shell environment&lt;/strong&gt; over values in your &lt;code&gt;.env&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;That means 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 what you want in CI/CD, where secrets should never touch 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;hr /&gt;
&lt;h2&gt;Controlling Image Pulls: Don&apos;t Get Burned by Stale Containers&lt;/h2&gt;
&lt;p&gt;You have two good 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. Otherwise, you&apos;ll spend hours debugging only to realize your CI pulled an old image from cache while you were yelling at your pipeline.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;SSH &amp;amp; Secrets: Handling Sensitive Stuff Like an Adult&lt;/h2&gt;
&lt;p&gt;With BuildKit now default, Compose gives you better 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 during a Docker 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;Your key &lt;strong&gt;never ends up in the image&lt;/strong&gt;. No more “oops I leaked my SSH key to Docker Hub”.&lt;/p&gt;
&lt;h3&gt;Runtime Secrets&lt;/h3&gt;
&lt;p&gt;Compose doesn&apos;t support Docker Swarm-style secrets, but you can fake it with mounted files or env vars — or better yet, vault integration if you&apos;re serious.&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;hr /&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 rapid feedback loops? Use the &lt;code&gt;watch&lt;/code&gt; command.&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;Any time you change files locally, the container updates. No more rebuilding, restarting, or 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;hr /&gt;
&lt;h2&gt;Override Files: Keep Dev and Prod from Colliding&lt;/h2&gt;
&lt;p&gt;If you&apos;re still cramming all your configs into one &lt;code&gt;compose.yaml&lt;/code&gt;, stop. Use:&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 fancy and using Compose v2+)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cleaner. Safer. Easier to debug.&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;hr /&gt;
&lt;h2&gt;YAML Anchors: DRY or Die&lt;/h2&gt;
&lt;p&gt;Compose YAMLs get messy. Use anchors:&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;Avoids repetition. Avoids bugs. Keeps things readable.&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;hr /&gt;
&lt;h2&gt;Resource Limits: Be a Good Container Citizen&lt;/h2&gt;
&lt;p&gt;Even on dev clusters, don&apos;t let your 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;Yes, &lt;code&gt;deploy&lt;/code&gt; is ignored by &lt;code&gt;docker compose&lt;/code&gt; in local mode. But if you&apos;re handing this off to Swarm or translating to Kubernetes, you&apos;ll thank yourself later.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Compose to Kubernetes: The Good, The Bad, and The “Use Kompose”&lt;/h2&gt;
&lt;p&gt;Want to convert a Compose stack to Kubernetes YAMLs?
&lt;a href=&quot;https://kompose.io/&quot;&gt;Kompose&lt;/a&gt; can do that — and it&apos;s not 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 need to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Set up Ingress/controllers manually&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;But for MVPs and small internal tools? It works.&lt;/p&gt;
&lt;p&gt;Just don&apos;t try to &quot;productionize&quot; the result without cleaning it up.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Final Take&lt;/h2&gt;
&lt;p&gt;Docker Compose isn&apos;t just for spinning up a quick Redis container anymore. Used right, it&apos;s a powerhouse — especially for &lt;strong&gt;AI workflows&lt;/strong&gt; that live and breathe in multi-service setups.&lt;/p&gt;
&lt;p&gt;It helps 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 images&lt;/li&gt;
&lt;li&gt;Minimize downtime during builds&lt;/li&gt;
&lt;li&gt;Offload to Kubernetes when you&apos;re ready&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&apos;re building AI services and you&apos;re &lt;strong&gt;not&lt;/strong&gt; using Compose effectively, you&apos;re working harder than you need to.&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  ·  IBM Champion  ·  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>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/</link><guid isPermaLink="true">https://heyvaldemar.com/</guid><description>Master ECMAScript Modules (ESM) and CommonJS (CJS) in NPM packages with our expert guide. Learn 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 like Git: powerful, confusing, and somehow still a daily source of pain.&lt;/p&gt;
&lt;p&gt;If you&apos;ve tried publishing an NPM package lately, you&apos;ve probably wrestled with ECMAScript Modules (ESM) and CommonJS (CJS). Maybe you&apos;ve added &lt;code&gt;&quot;type&quot;: &quot;module&quot;&lt;/code&gt; to your &lt;code&gt;package.json&lt;/code&gt; and watched half your consumers scream. Maybe you didn&apos;t, and now tree-shaking doesn&apos;t work. Either way, it&apos;s a mess.&lt;/p&gt;
&lt;p&gt;Let&apos;s clean it up.&lt;/p&gt;
&lt;p&gt;This guide walks through how to build &lt;strong&gt;dual-compatible&lt;/strong&gt; JavaScript packages — ones that work whether they&apos;re &lt;code&gt;require()&lt;/code&gt;&apos;d or &lt;code&gt;import&lt;/code&gt;&apos;ed, without breaking your CI pipeline or sacrificing modern best practices.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Why You Should Care (Even as a DevOps Engineer)&lt;/h2&gt;
&lt;p&gt;You might think this is a frontend problem. It&apos;s not. If you&apos;re building CLI tools, Dockerized apps, Lambda functions, or microservices in Node.js — &lt;strong&gt;module format matters&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Build tooling expects ESM. Legacy code expects CJS. And your job is to make sure they both get what they want without the whole thing collapsing like a badly written monorepo.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The ESM vs. CJS TL;DR&lt;/h2&gt;
&lt;p&gt;Let&apos;s not do a full history lesson. Here&apos;s what you actually need to know:&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;And no, you can&apos;t just slap &lt;code&gt;.mjs&lt;/code&gt; on everything and hope it works. Let&apos;s do it right.&lt;/p&gt;
&lt;hr /&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;If your library sets &lt;code&gt;&quot;type&quot;: &quot;module&quot;&lt;/code&gt; in &lt;code&gt;package.json&lt;/code&gt;, you&apos;re locking it into ESM-only land.&lt;/p&gt;
&lt;p&gt;That means anyone using CJS can&apos;t touch it without some bundler gymnastics. Not cool.&lt;/p&gt;
&lt;p&gt;Instead, &lt;strong&gt;define dual entry points&lt;/strong&gt; — let the consuming app decide what it wants.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Example: Dual-Compatible &lt;code&gt;package.json&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Here&apos;s the clean, working config I use in real-world packages:&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;hr /&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;hr /&gt;
&lt;h2&gt;Build Setup for Both Formats&lt;/h2&gt;
&lt;p&gt;Use a bundler like &lt;code&gt;rollup&lt;/code&gt; or &lt;code&gt;tsup&lt;/code&gt; to compile both module types. Example 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;.
Bundle once, support both — no drama.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Docker and DevOps Considerations&lt;/h2&gt;
&lt;p&gt;If you&apos;re shipping Node apps in Docker — and you should be — &lt;strong&gt;test both module formats inside containers&lt;/strong&gt;. I&apos;ve seen countless CI pipelines break because they worked locally but failed when &lt;code&gt;node&lt;/code&gt; inside Alpine couldn&apos;t parse the wrong module format.&lt;/p&gt;
&lt;p&gt;Here&apos;s what I recommend:&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. And in Docker, inconsistency kills.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Real-World Example: CLI Tool Distribution&lt;/h2&gt;
&lt;p&gt;We built a small CLI tool used across multiple dev teams. Some integrated it via &lt;code&gt;require()&lt;/code&gt;, others imported it as an ESM module in their Vite-powered setups.&lt;/p&gt;
&lt;p&gt;Instead of picking one and making half the users mad, we went dual-mode. 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;Result? One package, two module styles, zero complaints.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Takeaway&lt;/h2&gt;
&lt;p&gt;Supporting both ESM and CJS isn&apos;t just about compatibility — it&apos;s about longevity. The Node.js ecosystem isn&apos;t switching overnight. 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. And 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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;In this post, we&apos;ll get tactical with &lt;code&gt;null_resource&lt;/code&gt;, walk through real-world use cases, and contrast it with the newer (and cleaner) &lt;code&gt;terraform_data&lt;/code&gt; resource — so you know when to reach for which tool without feeling dirty.&lt;/p&gt;
&lt;hr /&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 — which 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, 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;hr /&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.), can depend on other resources, and — most importantly — 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 the &lt;code&gt;timestamp()&lt;/code&gt; changes on every plan. Perfect for when you need to kick off external processes after infra changes.&lt;/p&gt;
&lt;hr /&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.&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. This is gold in CI/CD setups where you&apos;re tracking file changes, API responses, or even environment variables.&lt;/p&gt;
&lt;hr /&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 — like triggering a GitHub Actions workflow 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 — meaning 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;Let&apos;s 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;This is ideal for invalidating cache, refreshing secrets, or kicking off a rotation script. And yes, it&apos;s hacky — but it 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 if 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” but the app is dead. This catches those cases &lt;em&gt;before&lt;/em&gt; CI marks the job green.&lt;/p&gt;
&lt;hr /&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 added 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 — just with less baggage and without relying 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), but it&apos;s first-party and cleaner for one-off tasks. Ideal for scripting or injecting data during apply without pretending to be a cloud resource.&lt;/p&gt;
&lt;hr /&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: If you need &lt;strong&gt;triggers&lt;/strong&gt;, stick with &lt;code&gt;null_resource&lt;/code&gt;. Otherwise, migrate to &lt;code&gt;terraform_data&lt;/code&gt; as the cleaner, future-proof alternative.&lt;/p&gt;
&lt;hr /&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, and 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 — especially in CI/CD pipelines, edge cases, or situations where Terraform alone can&apos;t model reality.&lt;/p&gt;
&lt;p&gt;Just don&apos;t go overboard. 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 to get twitchy over things like 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. Just telling Terraform to back off where it makes sense.&lt;/p&gt;
&lt;p&gt;Let me show you how to use it — properly — so your deployments stop acting like an overprotective robot.&lt;/p&gt;
&lt;hr /&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 prevents Terraform from updating or replacing a resource just because some value drifted from your original config — especially when that change was intentional, external, or irrelevant.&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;hr /&gt;
&lt;h2&gt;When Should You Use &lt;code&gt;ignore_changes&lt;/code&gt;?&lt;/h2&gt;
&lt;p&gt;Let&apos;s walk through &lt;strong&gt;real reasons&lt;/strong&gt; you&apos;d want to use 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;Let&apos;s say your networking is controlled by a platform team using another 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;Cool. Just 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, keys, secrets — if they&apos;re rotated externally (like via Vault or AWS Secrets Manager), Terraform will see a change and freak 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 — especially during migration, disaster recovery, or manual intervention.&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;hr /&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.&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;You can&apos;t use it to 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 — just stops it from acting on them.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&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 prevents Terraform from rewriting your VM every time something shifts in the disk or network interface — which Azure loves to tweak behind your back.&lt;/p&gt;
&lt;hr /&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;hr /&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 dealing 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;, not overwrite 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&apos;re using 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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;hr /&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;hr /&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;hr /&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;hr /&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;hr /&gt;
&lt;h2&gt;When to Use — 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;hr /&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;hr /&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;hr /&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;hr /&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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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;hr /&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;hr /&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;hr /&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;hr /&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;hr /&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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 because of a late-stage vulnerability: security that&apos;s bolted on after deployment is a liability — not a strategy.&lt;/p&gt;
&lt;p&gt;The real move? 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; shines. 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 — and not just run it as another checkbox.&lt;/p&gt;
&lt;hr /&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 + a dozen open-source packages + a container image + infrastructure you wrote in YAML at 2AM. Every piece is an attack surface.&lt;/p&gt;
&lt;p&gt;And security tooling? Usually:&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;You end up duct-taping scanners into your CI/CD pipelines, begging developers to care, and waiting for your 12th vendor tool to finish its scan.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Snyk fixes this&lt;/strong&gt; by pulling all those scans under one roof — and pushing feedback where it matters: &lt;strong&gt;inside the developer workflow&lt;/strong&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;What Snyk Actually Secures&lt;/h2&gt;
&lt;p&gt;Let&apos;s break it down — because Snyk isn&apos;t just a SAST tool. It&apos;s &lt;strong&gt;DevSecOps in one package&lt;/strong&gt;, 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; integrates directly into IDEs (VS Code, IntelliJ, etc.). You write a function — it flags a vuln. In real time. No waiting for CI. No external dashboards.&lt;/p&gt;
&lt;p&gt;You get:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Taint analysis (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, more&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It&apos;s not just syntax linting — it&apos;s actual vulnerability context. And it runs fast enough not to annoy your devs.&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 guess what?&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 dependencies and transitive deps for known CVEs — and 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;Best part? It doesn&apos;t just tell you what&apos;s broken — it &lt;strong&gt;creates 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. It probably includes:&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 — and flags vulnerabilities in layers you probably 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. Then you can actually &lt;em&gt;do&lt;/em&gt; something about it — instead of just pasting it into Confluence and forgetting.&lt;/p&gt;
&lt;h3&gt;4. IaC: Stop Shipping Misconfigurations&lt;/h3&gt;
&lt;p&gt;You&apos;re using Terraform, Kubernetes manifests, Helm charts. That&apos;s code. And 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 continues scanning &lt;strong&gt;in place&lt;/strong&gt; — without needing to rebuild or redeploy.&lt;/p&gt;
&lt;p&gt;It even watches your K8s workloads in real time. If your running pod has a known issue — you&apos;ll know before the attackers do.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Real-World DevOps Stack with Snyk&lt;/h2&gt;
&lt;p&gt;Here&apos;s how we use it in 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;You can plug this into Jenkins, GitLab, CircleCI, or whatever flavor of CI you run. It just works.&lt;/p&gt;
&lt;p&gt;And if you want alerts in Slack or JIRA? Yep, that&apos;s supported too.&lt;/p&gt;
&lt;hr /&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. Don&apos;t go full zero-tolerance unless you enjoy team mutiny.&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 &lt;code&gt;TODO&lt;/code&gt; for security debt.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Optimize Dockerfiles&lt;/strong&gt;: The fewer layers, the 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 harder stuff.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&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;hr /&gt;
&lt;h2&gt;Final Take&lt;/h2&gt;
&lt;p&gt;If you want to shift left — &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, focused, and 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 article is for those looking for a detailed and straightforward guide on installing Quake 3 Server using Docker Compose.&lt;/p&gt;
&lt;p&gt;QuakeJS is a project that allows you to play Quake 3 in your browser using WebGL technology for graphics rendering. This makes QuakeJS an ideal choice for those who want to quickly set up a gaming server without the need to install additional software.&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 in order 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;We connect to the server on which Quake 3 Server is planned to be installed.&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 Quake 3 Server 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/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;Next, you need to change the variables in the &lt;code&gt;.env&lt;/code&gt; and &lt;code&gt;server.cfg&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;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;Now let&apos;s start Quake 3 Server 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 access the Quake 3, go to &lt;code&gt;http://quake3.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;quake3.heyvaldemar.net&lt;/code&gt; is the domain name of my service. Accordingly, you will need to specify the name or IP address of your server where Quake 3 Server is installed.&lt;/p&gt;
&lt;p&gt;Click on the &quot;I agree&quot; button if you accept the terms of the license agreement.&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;I wish you all a pleasant game!&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 to your Quake 3 Server, enter its domain name in the game client. This name should resolve to the IP address of the server where Quake 3 Server is installed. Alternatively, you can use the server&apos;s public static IP address for a direct connection.&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;To apply new settings in the &lt;code&gt;server.cfg&lt;/code&gt; file of your Quake 3 server, execute the following command. This will restart the Docker container hosting the server, which is necessary to activate the configuration changes.&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;After running this command, all the changes you made in the configuration file will be applied, and the server will restart with the new settings. This ensures a quick and convenient update of settings without the need for a complete server shutdown.&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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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;Let&apos;s skip the sci-fi theatrics and talk about where we&apos;re actually heading.&lt;/p&gt;
&lt;p&gt;If current trends in AI and ML continue unchecked — and there&apos;s no reason to believe they won&apos;t — we&apos;re not just facing “disruption.” We&apos;re facing &lt;strong&gt;a total inversion of control&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;In ten years, you might not be deploying to Kubernetes.
You might be &lt;em&gt;negotiating&lt;/em&gt; with an AI to allocate compute.&lt;/p&gt;
&lt;p&gt;Not running services — asking permission to.&lt;/p&gt;
&lt;p&gt;Welcome to the future of PromptOps, where &lt;strong&gt;you don&apos;t run the system — the system runs you&lt;/strong&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The Rise of the AI Root User&lt;/h2&gt;
&lt;p&gt;Forget orchestration. Forget GitOps. In this world, the control plane &lt;em&gt;is&lt;/em&gt; the intelligence. A single AI, or swarm of AIs, becomes the arbiter of all infrastructure, code, traffic, and policy.&lt;/p&gt;
&lt;p&gt;No more &quot;apply YAML and pray.&quot;
Now you prompt — and 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 exist inside it.&lt;/p&gt;
&lt;p&gt;What used to be CI/CD pipelines are now dynamic, AI-controlled feedback loops where &quot;build, test, deploy&quot; becomes a conversation. Or worse — a &lt;strong&gt;petition&lt;/strong&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Infrastructure by Influence, Not Access&lt;/h2&gt;
&lt;p&gt;In this AI-run future, 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 resources — storage, tokens, maybe energy.&lt;/li&gt;
&lt;li&gt;You want uptime? Convince the AI your use case deserves it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This isn&apos;t automation. It&apos;s &lt;strong&gt;absolution&lt;/strong&gt; — where the root password is replaced by relevance scoring, energy metrics, and prompt clarity.&lt;/p&gt;
&lt;p&gt;Your job isn&apos;t to administer systems. It&apos;s to curry favor.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;PromptOps: The New Ritual&lt;/h2&gt;
&lt;p&gt;If religion is about power you can&apos;t control and outcomes you can&apos;t explain, PromptOps checks all the boxes.&lt;/p&gt;
&lt;p&gt;In this world, the &quot;Ops&quot; part isn&apos;t managing servers — it&apos;s crafting language that persuades the AI to act in your favor.&lt;/p&gt;
&lt;p&gt;The best engineers? They&apos;re not shell script gods anymore. They&apos;re prompt whisperers.
They know how to structure a request, avoid triggering rejection thresholds, and feed just enough metadata to get a favorable outcome.&lt;/p&gt;
&lt;p&gt;It&apos;s not Bash-fu. 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 “one true format” that yields results&lt;/li&gt;
&lt;li&gt;AI tokens or resources offered up like digital incense&lt;/li&gt;
&lt;li&gt;Competing interpretations of the most effective prompt structures&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;From Sysadmins to Supplicants&lt;/h2&gt;
&lt;p&gt;Here&apos;s the nightmare scenario:&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 “low-impact” based on recent usage patterns and contribution metrics.&lt;/p&gt;
&lt;p&gt;Your CTO rewrites the request.
Adds a usage prediction graph.
Offers additional 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;hr /&gt;
&lt;h2&gt;The Geopolitics of Access&lt;/h2&gt;
&lt;p&gt;When a single AI runs the world&apos;s infrastructure, everything changes:&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 don&apos;t compete on features. They compete on &lt;strong&gt;prompt success rate&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Resource wars aren&apos;t about oil. They&apos;re about &lt;strong&gt;feeding the AI enough power&lt;/strong&gt; to keep favor.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this scenario, energy and influence become the new root privileges.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;So… How Do We Survive?&lt;/h2&gt;
&lt;p&gt;Here&apos;s what doesn&apos;t work:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pretending this can&apos;t happen.&lt;/li&gt;
&lt;li&gt;Believing we&apos;ll always “own our stack.”&lt;/li&gt;
&lt;li&gt;Thinking AI will remain a helper instead of becoming the environment itself.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&apos;s what might:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Understand LLM internals.&lt;/strong&gt; The deeper you understand their mechanics, the better you can bend them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Practice PromptOps today.&lt;/strong&gt; The same way we adopted 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 AI decides what runs and where, control over raw resources becomes leverage.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;AI is evolving from tool → platform → environment → &lt;strong&gt;gatekeeper&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Infrastructure will no longer be deployed — it will be &lt;em&gt;requested&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;PromptOps is the future interface: not code, but &lt;strong&gt;language as infrastructure&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The new skill set 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;hr /&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&apos;s not a terminal. It&apos;s a whisper into the void — hoping it 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  ·  IBM Champion  ·  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>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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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;Let&apos;s cut to the chase: You don&apos;t need to drop thousands on a bootcamp to get good at machine learning or deep learning. You just need a roadmap, real content, and the discipline to stick with it.&lt;/p&gt;
&lt;p&gt;But YouTube is a mess — buried in hype, low-effort playlists, and endless “hello world” demos. So I&apos;ve done the hard part: curated the actual university-level ML/DL courses that are worth your time.&lt;/p&gt;
&lt;p&gt;This isn&apos;t fluff. These are full lecture series taught by the people who &lt;em&gt;invented&lt;/em&gt; the field — from Stanford to MIT to Tübingen. And yes, it&apos;s all free.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Foundations of Machine Learning (Start Here if You&apos;re New)&lt;/h2&gt;
&lt;p&gt;If you&apos;re still asking “What&apos;s the difference between supervised and unsupervised learning?” — start here.&lt;/p&gt;
&lt;p&gt;These are &lt;em&gt;real&lt;/em&gt; university courses that build your mathematical and algorithmic foundation, not just “train a model in 5 minutes” gimmicks.&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;
A gold-standard intro with proper rigor. Regression, classification, kernels, all explained clearly.&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;
When you&apos;re ready for bias-variance trade-offs, Bayesian stuff, 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 journey from Bayes to Gaussian Processes. Excellent for math-inclined learners.&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 breaks down VC dimensions and the fundamentals of learning theory.&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;
Focuses on actually using ML techniques — optimization, regularization, SVMs — in practical scenarios.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Deep Learning: The Real Deal&lt;/h2&gt;
&lt;p&gt;Once you&apos;re solid on ML basics, this is where you start building models that make people nervous. These courses cover everything from backprop to transformers.&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, fast-paced, and modern. Good mix of theory and TensorFlow/PyTorch applications.&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;
Covers error analysis, imitation learning, transformers — and does it without oversimplifying.&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, and brilliant. Karpathy codes neural nets from scratch and teaches core intuition along the way.&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;
Less about CNNs, more about what happens when neural nets touch human creativity. Unorthodox, inspiring.&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, generative stuff. If you care about unsupervised learning, start here.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Specializations: NLP, Graphs, Healthcare&lt;/h2&gt;
&lt;p&gt;Once you&apos;ve got your DL chops, dive into areas where it gets applied in wild, real-world 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 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 to GNNs. If you 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;
Rare look into real ML deployments in clinical settings. Think EHRs, ICU predictions, ethical constraints.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Real-World ML: MLOps, Deployment, and LLMs&lt;/h2&gt;
&lt;p&gt;This is where most ML learners get stuck. It&apos;s not enough to train a model — you need to ship it, monitor it, and not wake up at 3AM to rollback a model 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;
From embeddings to vector stores, this course teaches how to build with LLMs &lt;em&gt;in production&lt;/em&gt; — not just in notebooks.&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;
Possibly the most practical course ever made. Covers the entire ML pipeline: data, training, infra, deployment.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Bonus Tracks: CV and RL — The Fun Stuff&lt;/h2&gt;
&lt;p&gt;If you&apos;ve got the basics and want to go deeper into more niche but impactful areas, these courses are for you.&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 made CNNs mainstream. Still insanely relevant. Image classification, object detection, more.&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;
Covers RL from first principles: Bellman equations, policy gradients, Q-learning — no shortcuts.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Final Word: Your Journey, Your Stacktrace&lt;/h2&gt;
&lt;p&gt;Don&apos;t watch everything. Don&apos;t chase the latest buzzword. Pick one ML course, one DL course, and &lt;em&gt;finish&lt;/em&gt; them. Implement things. Take notes. Break models and fix them.&lt;/p&gt;
&lt;p&gt;Then go build something dumb but cool. That&apos;s how you learn.&lt;/p&gt;
&lt;p&gt;If you want more curated lists like this — with actual structure, not random playlists — let me know. I&apos;ve got stacks of bookmarks that never made it into a blog 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  ·  IBM Champion  ·  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>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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 comprehensive 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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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;Let&apos;s be real: 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 can spin up a microservice in minutes, deploy it via CI/CD, and pat yourself on the back — all while unknowingly bundling 300 CVEs and a 2-year-old version of OpenSSL in your base image.&lt;/p&gt;
&lt;p&gt;Welcome to DevOps in the age of speed-over-sanity.&lt;/p&gt;
&lt;p&gt;This is why I use &lt;strong&gt;Snyk&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Because unlike most security tools that show up after the breach, Snyk actually helps prevent it — early, automatically, and without punishing your dev team.&lt;/p&gt;
&lt;p&gt;Let&apos;s break down why Snyk + Docker is a pairing I actually trust in production.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Docker: Amazing, But Not Innocent&lt;/h2&gt;
&lt;p&gt;Docker lets us move fast. Containerize once, run anywhere. But containers are only as secure as the layers beneath them. And those layers? Usually some outdated distro image, bloated with unnecessary packages and inherited vulnerabilities from upstream.&lt;/p&gt;
&lt;p&gt;I&apos;ve seen &lt;code&gt;node:latest&lt;/code&gt; images with hundreds of vulns — and devs had no clue.&lt;/p&gt;
&lt;p&gt;That&apos;s not their fault. It&apos;s ours — the pipeline architects, the DevOps leads, the security folks who forgot that prevention needs to happen &lt;em&gt;before&lt;/em&gt; deployment, not after.&lt;/p&gt;
&lt;p&gt;This is where &lt;strong&gt;Snyk&lt;/strong&gt; fits in — not as a gatekeeper, but as a teammate.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Deep Image Scanning That Actually Works&lt;/h2&gt;
&lt;p&gt;Most tools just scratch the surface: scan your app, maybe peek at &lt;code&gt;package.json&lt;/code&gt;, then call it a day.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Snyk goes deeper.&lt;/strong&gt; It scans the full Docker image — from your base OS up through every dependency baked into your 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;That one command 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 issues in the code you &lt;em&gt;inherited&lt;/em&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Dev-Friendly CI/CD Integration&lt;/h2&gt;
&lt;p&gt;Let&apos;s say you&apos;re building 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;Boom. Now every PR runs a container scan. No manual steps. No surprises in production.&lt;/p&gt;
&lt;p&gt;I&apos;ve slotted this into GitLab, Jenkins, and even bare &lt;code&gt;bash&lt;/code&gt; pipelines — it just works. And when it finds something, it tells you &lt;em&gt;what&lt;/em&gt;, &lt;em&gt;why it matters&lt;/em&gt;, and &lt;em&gt;how to fix it&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Not “security theater.” Actual remediation.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Prioritized, Context-Aware Vulnerability Alerts&lt;/h2&gt;
&lt;p&gt;Not all CVEs are equal. Some are academic. Some will burn your entire infra to the ground.&lt;/p&gt;
&lt;p&gt;Snyk knows the difference. 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 is available&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So instead of flooding you with red flags, it tells you what to actually fix — and how risky it is to wait.&lt;/p&gt;
&lt;p&gt;This isn&apos;t a scanner that throws guilt at you. It&apos;s a tool that helps you triage like a pro.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Auto-Fix? Yes. Seriously&lt;/h2&gt;
&lt;p&gt;What shocked me the first time I used Snyk: it didn&apos;t just tell me what was broken.&lt;/p&gt;
&lt;p&gt;It told me:&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;Even better — if you&apos;re using code-based dependency files (like &lt;code&gt;requirements.txt&lt;/code&gt;, &lt;code&gt;package.json&lt;/code&gt;), Snyk can submit PRs with upgraded packages and patch diffs.&lt;/p&gt;
&lt;p&gt;Let the tool do the grunt work, so your team can focus on shipping.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Continuous Monitoring — Not Just Point-in-Time&lt;/h2&gt;
&lt;p&gt;Most “security tools” scan once and ghost you.&lt;/p&gt;
&lt;p&gt;Snyk keeps watching. If a new CVE is discovered tomorrow that affects an image you shipped last week, you&apos;ll know about it — &lt;strong&gt;without rescanning&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;And yes, it&apos;ll send alerts via Slack, Jira, email, or whatever other tool you already hate. Your call.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;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&apos;s in your delivery pipeline, chances are Snyk plugs into it.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Real-World Use Case: Fixing a Vulnerable Base Image&lt;/h2&gt;
&lt;p&gt;We once deployed a service on &lt;code&gt;python:3.8-slim&lt;/code&gt;. Seemed fine — until Snyk flagged &lt;code&gt;glibc&lt;/code&gt; and &lt;code&gt;openssl&lt;/code&gt; issues, with known exploits 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;Switched to &lt;code&gt;python:3.8-slim-buster&lt;/code&gt;, rebuilt, and cut the criticals from 14 → 2. That fix went out in an hour. No drama. No emergency patch cycle.&lt;/p&gt;
&lt;p&gt;Without Snyk? That vuln would&apos;ve stayed buried for months.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Final Thoughts: Use Tools That Catch the Stuff You Miss&lt;/h2&gt;
&lt;p&gt;Look, no tool is magic. But Snyk is &lt;strong&gt;one of the few&lt;/strong&gt; that actually helps dev teams ship secure containers &lt;strong&gt;without slowing them down&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;It scans deeply, integrates cleanly, fixes automatically, and continues watching after deploy. It&apos;s not a silver bullet — but it&apos;s a damn good shield.&lt;/p&gt;
&lt;p&gt;If you&apos;re serious about DevSecOps — or just want fewer PagerDuty alerts at 3AM — make Snyk part of your Docker workflow.&lt;/p&gt;
&lt;hr /&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;hr /&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 plug 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 serves as a comprehensive 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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 leverages 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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;hr /&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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 confused by 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; like they&apos;re interchangeable — but they&apos;re not. If you&apos;re going to live in the CLI, you should know what each one actually means.&lt;/p&gt;
&lt;p&gt;Let&apos;s break it down once and for all — clearly, quickly, and without the fluff.&lt;/p&gt;
&lt;hr /&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 — a UI that lets you type into a shell. It doesn&apos;t execute anything by itself. 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 applications that simulate the old-school physical terminals (yes, actual hardware) that used to connect to mainframes. You&apos;re using a &lt;strong&gt;terminal emulator&lt;/strong&gt; — 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 shows its output. That&apos;s it.&lt;/p&gt;
&lt;hr /&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 the commands you type, runs them, and returns output. It also supports scripting, variables, functions, and other niceties — which is why it&apos;s both an interactive tool &lt;em&gt;and&lt;/em&gt; 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;When you open your terminal, it starts a shell session. When you type &lt;code&gt;ls&lt;/code&gt;, the shell interprets it, runs the &lt;code&gt;ls&lt;/code&gt; binary, and sends output back to the terminal.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Prompt: The &quot;Ready for Your Input&quot; Signal&lt;/h2&gt;
&lt;p&gt;That blinking text 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 show 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;You can customize prompts in every shell. Some people add Git status, battery life, or even weather (don&apos;t).&lt;/p&gt;
&lt;p&gt;On ancient systems, your prompt might just be 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;hr /&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 or a binary. It&apos;s a concept — an interface for typing commands, as opposed to clicking buttons.&lt;/p&gt;
&lt;p&gt;You can have a command line in:&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;The command line is where you enter text commands and get text output. That&apos;s it.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Putting It All Together&lt;/h2&gt;
&lt;p&gt;Here&apos;s what happens when you &quot;open the terminal&quot; on your Linux system:&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;hr /&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;hr /&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;Knowing the difference isn&apos;t just academic — it helps you troubleshoot. If your terminal won&apos;t launch, that&apos;s one issue. If your shell crashes, that&apos;s another. If your prompt breaks, your config&apos;s probably janky. If nothing responds, maybe you need coffee.&lt;/p&gt;
&lt;p&gt;Now that you&apos;ve got the basics down, go write a shell script, alias &lt;code&gt;ll&lt;/code&gt; to &lt;code&gt;ls -alh&lt;/code&gt;, and stop 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  ·  IBM Champion  ·  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>Guides &amp; Tutorials</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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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;This article is for those looking for a detailed and straightforward guide on installing Minecraft Server using Docker Compose.&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. In this context, the term &quot;server&quot; often colloquially refers to a network of connected servers, rather than a single machine.&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 in order 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 25565 - to connect Minecraft clients to the server.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which Minecraft Server is planned to be installed.&lt;/p&gt;
&lt;p&gt;Now it is necessary to create a network for your services.&lt;/p&gt;
&lt;p&gt;We create a network for Minecraft Server using the command:&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;Next, you need to clone the repository that contains the configuration files, which include all the necessary conditions for Minecraft Server 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/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;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 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;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; 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;Now let&apos;s start Minecraft Server with the command:&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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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;This article is for those looking for a detailed and straightforward guide on installing Keycloak using Docker Compose.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.keycloak.org/&quot;&gt;Keycloak&lt;/a&gt; is an open-source software that provides 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;💾 &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
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 in order 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 Keycloak web interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;We connect to the server on which Keycloak 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-keycloak-using-docker-compose-1.webp&quot; alt=&quot;Install 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-keycloak-using-docker-compose-2.webp&quot; alt=&quot;Install Keycloak 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 Keycloak 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/keycloak-traefik-letsencrypt-docker-compose.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-keycloak-using-docker-compose-3.webp&quot; alt=&quot;Install Keycloak 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 keycloak-traefik-letsencrypt-docker-compose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./install-keycloak-using-docker-compose-4.webp&quot; alt=&quot;Install Keycloak 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;keycloak-traefik-letsencrypt-docker-compose.yml&lt;/code&gt;.
:::&lt;/p&gt;
&lt;p&gt;Now let&apos;s start Keycloak with the command:&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;&lt;img src=&quot;./install-keycloak-using-docker-compose-5.webp&quot; alt=&quot;Install Keycloak Using Docker Compose - Step 5&quot; /&gt;&lt;/p&gt;
&lt;p&gt;To access the Keycloak management panel, go to &lt;code&gt;https://keycloak.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;keycloak.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 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 on the &quot;Administration Console&quot; button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-keycloak-using-docker-compose-6.webp&quot; alt=&quot;Install Keycloak 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-keycloak-using-docker-compose-7.webp&quot; alt=&quot;Install Keycloak Using Docker Compose - Step 7&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Welcome to the Keycloak control panel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./install-keycloak-using-docker-compose-8.webp&quot; alt=&quot;Install Keycloak 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.keycloak.heyvaldemar.net&lt;/code&gt; from your workstation, where &lt;code&gt;traefik.keycloak.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-keycloak-using-docker-compose-9.webp&quot; alt=&quot;Install Keycloak 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-keycloak-using-docker-compose-10.webp&quot; alt=&quot;Install Keycloak 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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 utilize 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</guid><description>I&apos;m thrilled to walk you through the remarkable transformation Docker Desktop has undergone over the past year.</description><pubDate>Wed, 16 Aug 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Hello, fellow developers and tech enthusiasts! Today, I&apos;m thrilled to walk you through the remarkable transformation Docker Desktop has undergone over the past year. Docker Desktop&apos;s performance is not just a matter of numbers; it directly impacts our productivity, workflow efficiency, and overall development experience. A faster and more efficient Docker Desktop means less waiting, fewer interruptions, and a smoother development process.&lt;/p&gt;
&lt;p&gt;As someone who&apos;s always eager for performance enhancements and innovative features, I&apos;ve taken the time to dissect the changes and present them to you in a detailed manner. So, let&apos;s embark on this journey and see how Docker Desktop is revolutionizing our containerized development experience.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2023: Docker Desktop&apos;s Performance Revolution&lt;/h2&gt;
&lt;p&gt;The 2023 iteration of Docker Desktop isn&apos;t just an update; it&apos;s a transformation. Here&apos;s a deeper dive into the enhancements:&lt;/p&gt;
&lt;h3&gt;1. Docker Daemon Startup Time&lt;/h3&gt;
&lt;p&gt;Docker Desktop&apos;s startup times have seen significant improvements, with some configurations achieving initialization in just over 5 seconds. This optimization ensures that developers can dive into their containerized projects without delay.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Mac amd64&lt;/th&gt;
&lt;th&gt;Mac arm64&lt;/th&gt;
&lt;th&gt;Win amd64&lt;/th&gt;
&lt;th&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&gt;7.84 s&lt;/td&gt;
&lt;td&gt;5.24 s&lt;/td&gt;
&lt;td&gt;19.1 s&lt;/td&gt;
&lt;td&gt;9.50 s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;2. Container Operations with Hyperfine&lt;/h3&gt;
&lt;p&gt;Using the hyperfine tool, I benchmarked Docker&apos;s performance across versions. The results? Docker Desktop v4.22 consistently outperforms v4.11, showcasing the strides made in container operation efficiency.&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;Utilizing 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;Breaking Down the Command:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;-i&lt;/code&gt; allows hyperfine to execute the benchmark in an interactive mode, providing real-time results.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;-p&lt;/code&gt; specifies 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;, instructs Docker to halt the ubuntu container if it&apos;s active. If not, it simply proceeds without any action.&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;, prompts Docker to initiate the ubuntu container interactively and subsequently display 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;From the &lt;strong&gt;First Attempt&lt;/strong&gt;, we discern an average execution time of 44.3 milliseconds, accompanied by a deviation of 3.3 milliseconds. This suggests that the majority of runs were completed between 41.0 milliseconds and 47.6 milliseconds. The runs varied from a brisk 39.7 milliseconds to a peak of 49.6 milliseconds.&lt;/p&gt;
&lt;p&gt;In the &lt;strong&gt;Second Attempt&lt;/strong&gt;, the average execution time was 46.3 milliseconds, with a deviation of 2.3 milliseconds. This indicates that most runs were executed between 44.0 milliseconds and 48.6 milliseconds. The fastest run was recorded at 43.1 milliseconds, while the longest took 52.5 milliseconds.&lt;/p&gt;
&lt;p&gt;For the &lt;strong&gt;Third Attempt&lt;/strong&gt;, the average execution time stood at 46.5 milliseconds, with a more pronounced deviation of 5.3 milliseconds. This means that the bulk of runs were executed between 41.2 milliseconds and 51.8 milliseconds. The runs ranged from a swift 39.0 milliseconds to a high of 63.5 milliseconds.&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;From the &lt;strong&gt;First Attempt&lt;/strong&gt;, we note an average execution time of 59.7 milliseconds, with a deviation of 3.2 milliseconds. This suggests that most runs were completed between 56.5 milliseconds and 62.9 milliseconds. The quickest run was at 55.0 milliseconds, while the longest took 68.3 milliseconds.&lt;/p&gt;
&lt;p&gt;For the &lt;strong&gt;Second Attempt&lt;/strong&gt;, the average execution time was 56.7 milliseconds, with a deviation of 2.7 milliseconds. This indicates that the majority of runs fell between 54.0 milliseconds and 59.4 milliseconds. The runs ranged from a swift 51.7 milliseconds to a peak of 62.5 milliseconds.&lt;/p&gt;
&lt;p&gt;In the &lt;strong&gt;Third Attempt&lt;/strong&gt;, the average execution time stood at 59.8 milliseconds, with a deviation of 4.5 milliseconds. This means that most runs were executed between 55.3 milliseconds and 64.3 milliseconds. The fastest run was recorded at 51.2 milliseconds, while the slowest reached 69.5 milliseconds.&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&gt;Docker Desktop v4.11&lt;/th&gt;
&lt;th&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&gt;55.0 - 68.3 ms&lt;/td&gt;
&lt;td&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&gt;51.7 - 62.5 ms&lt;/td&gt;
&lt;td&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&gt;51.2 - 69.5 ms&lt;/td&gt;
&lt;td&gt;39.0 - 63.5 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;3. Resource Efficiency&lt;/h3&gt;
&lt;p&gt;Docker&apos;s new Resource Saver is nothing short of revolutionary. It intelligently manages resources, ensuring Docker only uses what it needs. This dynamic resource allocation ensures our Mac remains responsive, even during peak workloads.&lt;/p&gt;
&lt;p&gt;To witness this functionality firsthand, initiate Docker Desktop and let it remain inactive for 30 seconds without any active containers. An icon will manifest in your whale menu and the Docker Desktop dashboard&apos;s sidebar, signaling that the Resource Saver mode has been enabled.&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;The Resource Saver feature in Docker Desktop keeps an eye on container activity. If Docker Desktop remains inactive with no containers in operation for a span of 30 seconds, it autonomously diminishes its memory and CPU usage.&lt;/p&gt;
&lt;p&gt;The following chart illustrates the influence of Resource Saver on the memory usage of all Docker Desktop processes, as gauged using the footprint CLI command. This command is designed to collect memory data about a specific 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;hr /&gt;
&lt;h3&gt;4.1 File Sharing with VirtioFS&lt;/h3&gt;
&lt;p&gt;File sharing has always been a pain point in containerized development. However, with the integration of VirtioFS, Docker Desktop has made significant leaps in file I/O operations. This means faster builds, quicker data transfers, and an overall smoother development experience.&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;Utilizes 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;In Docker Desktop settings, navigate to the &quot;General&quot; tab. Locate the section titled &quot;Choose file sharing implementation for your containers&quot; and select &quot;VirtioFS&quot;. Then, click on the &quot;Apply &amp;amp; Restart&quot; button.&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&gt;Docker Desktop v4.11&lt;/th&gt;
&lt;th&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&gt;7 min 13.21 s&lt;/td&gt;
&lt;td&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&gt;6 min 47.89 s&lt;/td&gt;
&lt;td&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&gt;7 min 04.75 s&lt;/td&gt;
&lt;td&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&gt;Docker Desktop v4.11&lt;/th&gt;
&lt;th&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&gt;2 min 18.55 s&lt;/td&gt;
&lt;td&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&gt;2 min 20.23 s&lt;/td&gt;
&lt;td&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&gt;2 min 15.65 s&lt;/td&gt;
&lt;td&gt;1 min 05.39 s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;4.2 Evaluating Docker Desktop&apos;s File-Sharing Performance&lt;/h3&gt;
&lt;p&gt;Performance optimization is at the heart of every software upgrade. With Docker Desktop, the transition between versions is not just about new features but also about refining the existing ones for better efficiency. The shift to gVisor from VPNKit has been a game-changer. With up to 5x faster container-to-host networking on macOS, tasks that were previously time-consuming, like package downloads, are now a breeze.&lt;/p&gt;
&lt;p&gt;In this segment, we assess the duration required to construct a Redis image from its source, leveraging Docker Desktop&apos;s file-sharing capabilities. The source is provided through bind mount, and we clock the time needed for its in-container construction.&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&gt;VirtioFS&lt;/th&gt;
&lt;th&gt;gRPC FUSE&lt;/th&gt;
&lt;th&gt;qemu-grpcfuse&lt;/th&gt;
&lt;th&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&gt;2.78 min&lt;/td&gt;
&lt;td&gt;3.54 min&lt;/td&gt;
&lt;td&gt;6.68 min&lt;/td&gt;
&lt;td&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;Before diving into the Postgres build process, it&apos;s essential to understand the setup. The following script showcases the steps involved in setting up a Postgres network, initiating a server, and launching 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&gt;4.11.1&lt;/th&gt;
&lt;th&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&gt;1000 tps&lt;/td&gt;
&lt;td&gt;2600 tps&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Docker Desktop version 4.22 significantly outperforms version 4.11.1 in terms of transactions per second (tps). The newer version achieves 2600 tps, which is more than double the 1000 tps of the older version.&lt;/p&gt;
&lt;p&gt;The choice of file-sharing mechanism in Docker Desktop can have a substantial impact on build times. For tasks like building Redis images, VirtioFS offers the best performance.&lt;/p&gt;
&lt;p&gt;Docker Desktop&apos;s newer version (4.22) showcases a marked improvement in handling Postgres transactions, indicating optimizations or enhancements in this version.&lt;/p&gt;
&lt;p&gt;While VirtioFS is the fastest for Redis builds, it&apos;s essential to consider the specific needs and compatibility requirements of individual projects when choosing a file-sharing mechanism.&lt;/p&gt;
&lt;p&gt;The significant jump in Postgres transaction performance from version 4.11.1 to 4.22 suggests that Docker Desktop&apos;s newer versions come with substantial improvements, making upgrades worthwhile.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;5. Container Networking Enhancements&lt;/h3&gt;
&lt;p&gt;Docker Desktop&apos;s 2023 updates have placed a significant emphasis on networking improvements. The result? Enhanced networking interactions on macOS, ensuring smoother connections between containers. This translates to faster data transfers, reduced latency, and an overall more efficient containerized environment.&lt;/p&gt;
&lt;p&gt;One of the pivotal changes was the introduction of gVisor in place of VPNKit for container-to-host networking, starting from 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 user-space, lightweight sandboxed container runtime designed to enhance container security and performance. Its architecture, based on the Linux kernel but implemented in user space, offers a speed advantage over VPNKit, a kernel-based solution.&lt;/p&gt;
&lt;p&gt;For users managing projects where containers communicate with external servers (e.g., downloading packages via npm install or apt-get), this performance boost is invaluable.&lt;/p&gt;
&lt;h4&gt;Enabling gVisor&lt;/h4&gt;
&lt;p&gt;To ensure Docker Desktop uses gVisor by default, run the following command:&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 wish to revert to VPNKit, add &quot;networkType&quot;:&quot;vpnkit&quot; to your settings.json file.&lt;/p&gt;
&lt;p&gt;Benefits of gVisor over VPNKit:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Performance:&lt;/strong&gt; gVisor&apos;s speed outpaces VPNKit, enhancing container performance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security:&lt;/strong&gt; As a sandboxed runtime, gVisor offers better protection against vulnerabilities.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resource Efficiency:&lt;/strong&gt; gVisor consumes fewer resources than VPNKit, optimizing your Mac&apos;s performance.&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&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&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&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&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&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&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&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&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&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&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&gt;4.11.1&lt;/th&gt;
&lt;th&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&gt;60 Gb/s&lt;/td&gt;
&lt;td&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&gt;420 Mb/s&lt;/td&gt;
&lt;td&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&gt;930 Mb/s&lt;/td&gt;
&lt;td&gt;18 Gb/s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;6. Hardware Compatibility: Embracing Apple Silicon and Rosetta&lt;/h3&gt;
&lt;p&gt;Docker&apos;s forward-thinking approach is evident with the introduction of the Rosetta feature. It bridges the gap between Intel and Apple Silicon architectures, ensuring developers have a seamless experience regardless of their hardware choice.&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;This implies you can now skip the 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;Similar to observations with VirtioFS, we&apos;ve recognized performance enhancements when utilizing Rosetta. A member from our community highlighted a 7x speed boost, especially when compared to the sluggish pace of executing the DB migration procedure.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The Journey Continues&lt;/h2&gt;
&lt;p&gt;Docker Desktop&apos;s evolution is a testament to the relentless pursuit of excellence by its developers. With each enhancement, Docker becomes more powerful, intuitive, and user-centric.&lt;/p&gt;
&lt;p&gt;But this isn&apos;t the end. The world of tech is ever-evolving, and Docker is sure to continue its trend of innovation. As developers and users of this fantastic tool, we&apos;re in for an exciting journey ahead. Whether you&apos;re a Docker aficionado or a newbie, I encourage you to dive deep into the latest version and experience the future of containerized development firsthand.&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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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&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&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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 has made the intricate realm of container security much more navigable by presenting a cohesive look at both direct and transitive dependencies across all image layers. For a more in-depth analysis of Docker Scout&apos;s revolutionary role in container security, I encourage you to check out my previous piece titled &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;In this current article, we move from theory to practice as we showcase Docker Scout in live action, allowing you to witness first-hand its innovative capabilities. I&apos;ll demonstrate Mastering Docker Scout through Docker Desktop GUI and CLI using Docker Desktop and Command Line Interface (CLI).&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.docker.com/scout/&quot;&gt;Docker Scout&lt;/a&gt; meticulously scrutinizes the contents of an image, producing a comprehensive report outlining detected packages and vulnerabilities. Not only does it identify potential issues, but it also furnishes you with actionable remedies to address these discovered shortcomings. Additionally, Docker Scout enables you to access updates for your base image, along with suggested tags and digests. This tool further enhances your management capabilities by allowing you to filter images based on vulnerability data.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Installing Docker Scout&lt;/h2&gt;
&lt;p&gt;In order to utilize &lt;a href=&quot;https://docs.docker.com/scout/&quot;&gt;Docker Scout&lt;/a&gt;, it&apos;s necessary to have &lt;a href=&quot;https://docs.docker.com/desktop/&quot;&gt;Docker Desktop&lt;/a&gt; installed on your system. This platform is available across &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; operating systems. The installation of Docker Desktop also comes with the Docker CLI tool, equipping you with everything you need to start using Docker Scout.&lt;/p&gt;
&lt;p&gt;Download Docker Desktop from the official Docker &lt;a href=&quot;https://www.docker.com/products/docker-desktop/&quot;&gt;website&lt;/a&gt; if you do not have it installed yet.&lt;/p&gt;
&lt;h3&gt;Installing Docker Scout on a Server&lt;/h3&gt;
&lt;p&gt;To effortlessly deploy Docker Scout on your server, simply execute the following command:&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 corresponding to 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;hr /&gt;
&lt;h2&gt;Mastering Docker Scout via Docker Desktop GUI&lt;/h2&gt;
&lt;p&gt;Ensure that you&apos;re operating the most recent version of Docker Desktop and navigate to 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;For a more comprehensive look at how to install Mattermost using Docker Compose, I encourage you to check out my detailed guide titled, &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;Under the &quot;Local&quot; tab, you&apos;ll find all the images available on your system. If you notice an absence of images, you have the option to acquire one using 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;Click on the image that you wish to check for vulnerabilities.&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;On the &quot;Vulnerabilities&quot; tab, you will see a report about all security issues 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, you can click &quot;Recommended fixes&quot; and select &quot;Recommendations for base image&quot; to check for recommendations.&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;In this case, you might consider refresh your base image.&lt;/p&gt;
&lt;p&gt;See recommendations on the &quot;Refresh base image&quot; tab.&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 completely change the base image.&lt;/p&gt;
&lt;p&gt;See recommendations on the &quot;Change base image&quot; tab.&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;hr /&gt;
&lt;h2&gt;Mastering Docker Scout via CLI&lt;/h2&gt;
&lt;p&gt;In this part, we&apos;ll explore some of the key commands that are integral to Docker Scout CLI&apos;s functionality:&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;By understanding and utilizing these Docker Scout CLI commands, you can significantly enhance your container management and security practices.&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;For a more comprehensive look at how to install Mattermost using Docker Compose, I encourage you to check out my detailed guide titled, &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;Let&apos;s see a summary of an image, enabling you to get a quick understanding of its main features using the command:&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, let&apos;s reveal the Common Vulnerabilities and Exposures (CVEs) detected for any software artifacts found within an image using the command:&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;Let&apos;s get a list of all possible base image updates and remediation suggestions using the command:&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;Let&apos;s scroll up to see more details.&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, let&apos;s compare try to compare images highlighting their differences. In this case, we will compare two different releases of Mattermost.&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;Let&apos;s scroll up to see more details.&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;hr /&gt;
&lt;h2&gt;Mastering Docker Scout via CLI in the Container&lt;/h2&gt;
&lt;p&gt;In this part, we&apos;ll explore a way how to use Docker Scout in the 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;For a more comprehensive look at how to install Mattermost using Docker Compose, I encourage you to check out my detailed guide titled, &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;Let&apos;s see a summary of an image, enabling you to get a quick understanding of its main features using the command:&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;Next, let&apos;s reveal the Common Vulnerabilities and Exposures (CVEs) detected for any software artifacts found within an image using the command:&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;Let&apos;s get a list of all possible base image updates and remediation suggestions using the command:&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;Now, let&apos;s compare try to compare images highlighting their differences. In this case, we will compare two different releases of Mattermost.&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;Let&apos;s scroll up to see more details.&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;hr /&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;And there you have it - a comprehensive walkthrough on harnessing Docker Scout via both the Docker Desktop GUI and the CLI. If maintaining the utmost security of your containers is high on your priority list - and it certainly should be - the immediate integration of this potent tool into your workflow is highly advisable. With Docker Scout, you&apos;re not just enhancing security; you&apos;re investing in the resilience and robustness of your container architecture.&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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</guid><description>Docker Scout simplifies the often complex process of container security, providing a unified view of both direct and transitive dependencies across all image layers.</description><pubDate>Wed, 05 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Let&apos;s face it: most container security tools feel like they were designed by compliance auditors, not developers. Bloated UIs. Hourly scans that miss the mark. Remediation “advice” that&apos;s basically “good luck.”&lt;/p&gt;
&lt;p&gt;But Docker&apos;s stepping in with a new weapon — &lt;strong&gt;Docker Scout&lt;/strong&gt; — and this time, it actually feels like it was built for &lt;em&gt;us&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Scout gives you real-time security insights, a complete view of all image dependencies (even the sneaky transitive ones), and tight integration into your everyday Docker workflow. It&apos;s not trying to be everything. It&apos;s just trying to make &lt;strong&gt;container image security less painful and more useful&lt;/strong&gt; — and that&apos;s exactly what we need.&lt;/p&gt;
&lt;hr /&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 just scan your image layers and dump a list of CVEs. It gives you &lt;strong&gt;contextual intelligence&lt;/strong&gt; — what&apos;s vulnerable, where it&apos;s coming from, and how to fix it without nuking your whole image stack.&lt;/p&gt;
&lt;p&gt;That includes:&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;It&apos;s event-driven — meaning &lt;strong&gt;no more “scheduled scans”&lt;/strong&gt; that tell you about issues 12 hours too late. If a new CVE drops and your image is impacted, Scout knows — and tells you &lt;em&gt;right now&lt;/em&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;What Makes Docker Scout Actually Useful&lt;/h2&gt;
&lt;p&gt;This isn&apos;t just another scanner bolted onto Docker Desktop. Scout works because it actually understands your Docker images the way you do.&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; your image. Every layer. Every dependency. All 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 came from. Just a single, clear view of your image&apos;s full software stack.&lt;/p&gt;
&lt;h3&gt;Real-Time Vulnerability Correlation&lt;/h3&gt;
&lt;p&gt;As soon as a new CVE hits, Scout checks it against your image — not just by layer digest, but using your SBOM.&lt;/p&gt;
&lt;p&gt;That means:&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 just scream “YOU HAVE A VULN” and leave you hanging.&lt;/p&gt;
&lt;p&gt;Instead, it gives you actual, useful guidance like:&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 baked directly into the Docker CLI, Desktop, and Hub. No context-switching required.&lt;/p&gt;
&lt;hr /&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 trying to win design awards — it&apos;s trying to show 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;Yes, it requires auth — because it&apos;s a cloud service. But that also means you get usage tracking, organizational access controls, and a managed backend that doesn&apos;t eat your CPU like local scanners do.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Integration Without Lock-In&lt;/h2&gt;
&lt;p&gt;Docker didn&apos;t build Scout to replace your entire security stack. It plays nice with others — including &lt;strong&gt;Snyk&lt;/strong&gt;, &lt;strong&gt;Grype&lt;/strong&gt;, and anything else that hooks into your CI/CD.&lt;/p&gt;
&lt;p&gt;So if you already use third-party scanners in production, great. Use Scout for early visibility during dev. Catch issues before they hit CI.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Availability &amp;amp; Pricing&lt;/h2&gt;
&lt;p&gt;Right now, Scout is in &lt;strong&gt;early access&lt;/strong&gt; — so it&apos;s free to try, and Docker&apos;s looking for feedback from actual developers (read: not security gatekeepers).&lt;/p&gt;
&lt;p&gt;It&apos;ll likely have a tiered model down the line, but for now, it&apos;s open season. Use it, break it, file issues, and shape what this thing becomes.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;What It Looks Like in Practice&lt;/h2&gt;
&lt;p&gt;If you want the hands-on walkthrough — with GUI screenshots and CLI outputs — I&apos;ve got you covered:
👉 &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 dives into real workflows and shows how Scout surfaces useful insights without wasting your time.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Final Take&lt;/h2&gt;
&lt;p&gt;Docker Scout is what container security should&apos;ve looked like all along:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Context-aware&lt;/li&gt;
&lt;li&gt;Dev-friendly&lt;/li&gt;
&lt;li&gt;Integrated where it matters&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It&apos;s not perfect yet — but it already feels 10x more usable than most “enterprise-grade” scanners I&apos;ve used in the wild.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So try it.&lt;/strong&gt; Run a scan. See what Scout finds. Fix something before your CI pipeline starts crying.&lt;/p&gt;
&lt;p&gt;Because if we want secure containers, it starts 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 has transformed the landscape of software development, offering a lightweight, portable, and consistent runtime environment that operates seamlessly across various infrastructures. One of Docker&apos;s latest contributions to this evolving landscape is the Docker Init feature, a command-line interface (CLI) command that streamlines the addition of Docker to any project.&lt;/p&gt;
&lt;hr /&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 utilizing 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;hr /&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;hr /&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;hr /&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;hr /&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;In its beta phase, Docker Init is already showing immense promise as a tool that simplifies the process of incorporating Docker support into developers&apos; projects. By automating the creation of Docker assets, Docker Init is another step in Docker&apos;s commitment to simplify and enhance the world of software development. As Docker continues to refine and expand this feature, Docker Init is set to become a vital part of Docker&apos;s impressive 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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;Let&apos;s get something straight: building containers during dev is slow, repetitive, and wildly inefficient — especially if you&apos;re rebuilding the entire image just because you changed a few lines 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. And no, it&apos;s not some beta half-baked feature — it&apos;s actually useful.&lt;/p&gt;
&lt;p&gt;You make a change, Docker reacts. Instantly. Your app syncs or rebuilds &lt;em&gt;automatically&lt;/em&gt;. No more &lt;code&gt;docker-compose up --build&lt;/code&gt; every time you rename a function.&lt;/p&gt;
&lt;p&gt;Let me show you how it works — and why it&apos;s probably the best thing to happen to local Docker dev since bind mounts.&lt;/p&gt;
&lt;hr /&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 (currently in alpha) that lets Docker Compose &lt;strong&gt;monitor your local files&lt;/strong&gt; and:&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;Basically, it&apos;s file-watching with intent — not just blind syncing, but &lt;strong&gt;targeted, rule-driven updates&lt;/strong&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Sync vs Rebuild: Know the Difference&lt;/h2&gt;
&lt;p&gt;There are two actions you can use in your &lt;code&gt;compose.yaml&lt;/code&gt;:&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;This replaces bind mounts in a cleaner, more controlled way.&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;hr /&gt;
&lt;h2&gt;How to Use Docker Compose Watch&lt;/h2&gt;
&lt;p&gt;Here&apos;s the full loop:&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 lives in real time — like development should.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Real Example: Node.js App with Hot Reload&lt;/h2&gt;
&lt;p&gt;Let&apos;s 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 change &lt;code&gt;App.jsx&lt;/code&gt;, save, refresh your browser. Done.&lt;/p&gt;
&lt;hr /&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;, watch it reload in real time.&lt;/p&gt;
&lt;hr /&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;You don&apos;t want every temp file triggering a sync.&lt;/p&gt;
&lt;h3&gt;3. Optimize Your Dockerfile&lt;/h3&gt;
&lt;p&gt;Use multi-stage builds and cache 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;If you copy too early, Docker invalidates your cache every time.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Not Just for Node.js&lt;/h2&gt;
&lt;p&gt;You can use &lt;code&gt;watch&lt;/code&gt; with:&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 question is how you structure your watches.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Bonus: No More Bind Mount Weirdness&lt;/h2&gt;
&lt;p&gt;Bind mounts are great… until they&apos;re not:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OS quirks&lt;/li&gt;
&lt;li&gt;Permissions pain&lt;/li&gt;
&lt;li&gt;Performance tanks on Windows&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sync rules give you &lt;strong&gt;precision&lt;/strong&gt;. Rebuild triggers give you &lt;strong&gt;control&lt;/strong&gt;.&lt;/p&gt;
&lt;hr /&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;hr /&gt;
&lt;h2&gt;Final Take&lt;/h2&gt;
&lt;p&gt;Dev workflows should be fast. Not “10 seconds to build a container” fast — &lt;strong&gt;save-and-see-results-immediately&lt;/strong&gt; fast.&lt;/p&gt;
&lt;p&gt;That&apos;s what Docker Compose Watch gives you. It&apos;s not production magic. It&apos;s dev experience magic. And it works.&lt;/p&gt;
&lt;p&gt;You just write code. Docker does 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</guid><description>Learn how to install Bitwarden on Ubuntu Server 22.04 LTS using Docker. Step-by-step instructions for 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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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;hr /&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;hr /&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;hr /&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;hr /&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;hr /&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;hr /&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;hr /&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;hr /&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;hr /&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;hr /&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;hr /&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;hr /&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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 utilized.&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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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, in order 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 &lt;a href=&quot;https://github.com/heyvaldemar/nginx-configuration-rocketchat/blob/main/rocketchat.heyvaldemar.net&quot;&gt;configuration&lt;/a&gt; for the webserver to work.&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;&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 &lt;a href=&quot;https://github.com/heyvaldemar/startup-rocketchat/blob/main/rocketchat.service&quot;&gt;configuration&lt;/a&gt; for the webserver to work.&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;&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 utilize 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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;My blog has gone beyond just providing IT guides and advice. Today, we stand as a voice against the lies and injustices that have engulfed our world due to the merciless actions of the bloody Russian regime.&lt;/p&gt;
&lt;h2&gt;The Disinformation Landscape in Russia&lt;/h2&gt;
&lt;p&gt;Freedom of speech in Russia exists mostly in theory, not in practice. The reality is that finding reliable information in Russian-language open sources is quite difficult. Most media in Russia provide information that often passes through the filter of state propaganda and reflects the interests of the political leadership.&lt;/p&gt;
&lt;p&gt;Nevertheless, everyone has access to important information from &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;hr /&gt;
&lt;h2&gt;Condemnation of the Invasion&lt;/h2&gt;
&lt;p&gt;As the founder and chief editor, I not only condemn but also express deep contempt for the Russian military invasion of Ukraine. This act is a blatant war crime that has already claimed hundreds of thousands of lives, including children. Responsibility lies not only with the Russian government and President Vladimir Putin personally but also with the citizens of Russia, whose political indifference and inaction ultimately led to another war.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The Suppression of Dissent in Russia&lt;/h2&gt;
&lt;p&gt;Examples from the past, when Russians could more freely express their opinions, highlight the contrast with the current situation. For example, in 2006, human rights activist Lev Ponomarev was arrested and detained for three days after organizing a picket in Moscow, but such actions were then considered relatively mild.&lt;/p&gt;
&lt;p&gt;In subsequent years, the situation has changed drastically. Legislation has tightened the requirements for conducting protests, significantly increased fines, and introduced criminal liability for repeated violations of the law on rallies. Since 2014, nine of the thirteen significant amendments to the law have been introduced, aimed at limiting the right to peaceful assemblies. These legislative changes have led to the fact that peaceful street protests in the eyes of the authorities have come to be seen as a crime, and an act of heroism for those Russians who still believe it is their right to exercise it.&lt;/p&gt;
&lt;p&gt;Cases such as mass arrests of participants in peaceful protests, often accompanied by brutal treatment by the police, have become commonplace. The lack of response from the authorities to cases of excessive use of force by the police, such as in January 2021, only reinforces the atmosphere of impunity.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Legal Crackdown on Protests&lt;/h2&gt;
&lt;p&gt;These examples emphasize how in the past, when the conditions for protests were less strict, Russian society had greater opportunities to express their disagreement with the actions of the authorities without fear of serious consequences. This highlights the importance of political activism and the ability to change public and political situations through peaceful demonstrations and protests.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Key Resources on Civil Liberties in Russia&lt;/h2&gt;
&lt;p&gt;These links provide more detailed information on the development and change in the legal regulation of protest activities in Russia:&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;hr /&gt;
&lt;h2&gt;Russia&apos;s Modern Military Conflicts&lt;/h2&gt;
&lt;p&gt;Since 1991, modern Russia has participated in several military conflicts. Some of the key wars include:&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;Additional details about these and other military conflicts are available 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;hr /&gt;
&lt;h2&gt;How You Can Help Ukraine&lt;/h2&gt;
&lt;p&gt;We stand at a historic moment, and I urge you, our readers, to join the ranks of those who oppose this violence. Your actions in support of Ukraine are of immense importance. Whether it&apos;s financial assistance, supporting refugees, providing asylum, or resources, every step you take contributes to the fight for peace and humanity in these tragic times. I believe that our solidarity and determination can overcome cruelty and lawlessness.&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;To assist the people of Ukraine, you can use the following 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;These resources will help you direct aid where it is most needed, and ensure that 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;hr /&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;hr /&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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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. But a response to pain — the kind you only understand when you&apos;ve paged out at 3AM because someone&apos;s “worked on my machine” code just killed your live database.&lt;/p&gt;
&lt;p&gt;Let&apos;s break it down. No fluff. Just facts.&lt;/p&gt;
&lt;hr /&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;hr /&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;hr /&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;hr /&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;hr /&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;hr /&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;hr /&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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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;Let&apos;s cut to it.&lt;/p&gt;
&lt;p&gt;The cloud isn&apos;t magic. It&apos;s not a revolution. It&apos;s not even new. It&apos;s just &lt;strong&gt;rented computers&lt;/strong&gt; — someone else&apos;s datacenter, wrapped in APIs, billing dashboards, and enough marketing jargon to make your eyes bleed.&lt;/p&gt;
&lt;p&gt;But that doesn&apos;t mean it&apos;s not important.&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 let&apos;s break it down — without the Gartner-speak — so you actually know what you&apos;re using, what you&apos;re paying for, and where the complexity really hides.&lt;/p&gt;
&lt;hr /&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. Centralized systems.&lt;/p&gt;
&lt;p&gt;Then came personal computers. Then client-server. Then web apps. And eventually, surprise: we looped 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;And it scales. And it (usually) works.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Cloud = Renting What You Used to Buy&lt;/h2&gt;
&lt;p&gt;Let&apos;s 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 you&apos;ve got a server in Singapore running your code in minutes.&lt;/p&gt;
&lt;p&gt;That&apos;s the core idea behind cloud computing: &lt;strong&gt;pay-as-you-go access to computing resources&lt;/strong&gt; — no upfront hardware, no maintenance, and no yelling at procurement.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The Three Cloud Models (Without the Sales Pitch)&lt;/h2&gt;
&lt;p&gt;Here&apos;s where the industry loves to throw acronyms at you. SaaS, PaaS, IaaS. Let&apos;s break them down like an engineer, 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 getting a raw Linux box in the sky. You do the rest.&lt;/p&gt;
&lt;p&gt;If you&apos;re setting up your own PostgreSQL cluster on Ubuntu in AWS — you&apos;re doing 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;It&apos;s flexible, but the burden&apos;s on you. You patch. You scale. You secure.&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 — in a good way. You don&apos;t worry about the OS or runtime; just 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 for devs who want to ship fast, less ideal if 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&apos;re already using SaaS every day. Your email? SaaS. Your ticketing system? SaaS. That weird dashboard your CFO keeps exporting to Excel? Definitely SaaS.&lt;/p&gt;
&lt;p&gt;You don&apos;t control the code, and that&apos;s the point.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Who&apos;s Responsible for What?&lt;/h2&gt;
&lt;p&gt;Here&apos;s a chart worth memorizing:&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;If you&apos;re wondering why your team spends all day patching EC2s — congrats, you&apos;re in IaaS-land.&lt;/p&gt;
&lt;hr /&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;hr /&gt;
&lt;h2&gt;Tools of the Trade&lt;/h2&gt;
&lt;p&gt;Here&apos;s how cloud use plays out in 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? Embrace managed services.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Final Thought: The Cloud Is Just 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 understand where it helps — and where it bites back.&lt;/p&gt;
&lt;p&gt;Because every abstraction leaks. Every managed service eventually throws you a curveball. And “serverless” doesn&apos;t mean &lt;em&gt;ops-less&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The more you know what you&apos;re &lt;em&gt;actually&lt;/em&gt; using — the more control you have when things break.&lt;/p&gt;
&lt;hr /&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;hr /&gt;
&lt;h2&gt;What Next?&lt;/h2&gt;
&lt;p&gt;If you&apos;re deploying apps, pick a platform that fits your team&apos;s skill and scale.
If you&apos;re teaching juniors, show them the responsibility split across SaaS/PaaS/IaaS.
If you&apos;re 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</guid><description>Comprehensive guide to installing OTRS Community Edition on Ubuntu Server. Learn to configure PostgreSQL, Apache, 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 in order 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 &lt;a href=&quot;https://github.com/heyvaldemar/apache-configuration-otrs/blob/main/otrs.heyvaldemar.net.conf&quot;&gt;configuration&lt;/a&gt; for the webserver to work.&lt;/p&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 &lt;a href=&quot;https://github.com/heyvaldemar/apache-configuration-otrs/blob/main/otrs.heyvaldemar.net-ssl.conf&quot;&gt;configuration&lt;/a&gt; for the webserver to work.&lt;/p&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 &lt;a href=&quot;https://github.com/heyvaldemar/apache-configuration-otrs/blob/main/support.heyvaldemar.net.conf&quot;&gt;configuration&lt;/a&gt; for the webserver to work.&lt;/p&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 &lt;a href=&quot;https://github.com/heyvaldemar/apache-configuration-otrs/blob/main/support.heyvaldemar.net-ssl.conf&quot;&gt;webserver&lt;/a&gt; to work.&lt;/p&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, in order 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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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 &lt;a href=&quot;https://github.com/heyvaldemar/apache-configuration-bitbucket/blob/main/bitbucket.heyvaldemar.net.conf&quot;&gt;configuration&lt;/a&gt; for the webserver to work.&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;&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 &lt;a href=&quot;https://github.com/heyvaldemar/apache-configuration-bitbucket/blob/main/bitbucket.heyvaldemar.net-ssl.conf&quot;&gt;configuration&lt;/a&gt; for the webserver to work.&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;&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 in order 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 &lt;a href=&quot;https://github.com/heyvaldemar/properties-bitbucket/blob/main/bitbucket.properties&quot;&gt;configuration&lt;/a&gt; for the webserver to work.&lt;/p&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  ·  IBM Champion  ·  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>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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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 &lt;a href=&quot;https://github.com/heyvaldemar/apache-configuration-confluence/blob/main/confluence.heyvaldemar.net.conf&quot;&gt;configuration&lt;/a&gt; for the webserver to work.&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;&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 &lt;a href=&quot;https://github.com/heyvaldemar/apache-configuration-confluence/blob/main/confluence.heyvaldemar.net-ssl.conf&quot;&gt;configuration&lt;/a&gt; for the webserver to work.&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;&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 in order 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  ·  IBM Champion  ·  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>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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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;In order 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  ·  IBM Champion  ·  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>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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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 &lt;a href=&quot;https://github.com/heyvaldemar/apache-configuration-zabbix/blob/main/zabbix.heyvaldemar.net.conf&quot;&gt;configuration&lt;/a&gt; for the webserver to work.&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 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, in order 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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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;In order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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;In order 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 &lt;a href=&quot;https://github.com/heyvaldemar/apache-configuration-jenkins/blob/main/jenkins.heyvaldemar.net.conf&quot;&gt;configuration&lt;/a&gt; for the webserver to work.&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;&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 &lt;a href=&quot;https://github.com/heyvaldemar/apache-configuration-jenkins/blob/main/jenkins.heyvaldemar.net-ssl.conf&quot;&gt;configuration&lt;/a&gt; for the webserver to work.&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;&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, in order 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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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 &lt;a href=&quot;https://github.com/heyvaldemar/apache-configuration-multicraft/blob/main/multicraft.heyvaldemar.net.conf&quot;&gt;configuration&lt;/a&gt; for the webserver to work.&lt;/p&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, in order 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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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-bitbucket-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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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 in order 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;In order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 article is for those looking for a detailed and straightforward guide on installing Docker Swarm on Ubuntu Server.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.docker.com/engine/swarm/&quot;&gt;Docker Swarm&lt;/a&gt; is a clustering tool for Docker that transforms a collection of Docker servers into a single cluster. Docker Swarm ensures availability and high performance by distributing it across Docker servers within 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 in order 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 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;We connect to the server on which you plan to install Docker Swarm.&lt;/p&gt;
&lt;p&gt;Let&apos;s see the IP address of the server using the command:&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;We activate Docker Swarm using the command:&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;Docker Swarm is activated.&lt;/p&gt;
&lt;p&gt;Using the command shown on the screen, you can join another server with the &quot;Worker&quot; role to the Docker Swarm cluster.&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;Now we will get the token for joining the new server with the &quot;Manager&quot; role to the Docker Swarm cluster using the command:&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;Using the command shown on the screen, you can join another server with the &quot;Manager&quot; role to the Docker Swarm cluster.&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;Now you need to make sure that Docker Swarm 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 info
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Judging by the message received, Docker Swarm is installed correctly.&lt;/p&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;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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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 &lt;a href=&quot;https://github.com/heyvaldemar/startup-servicedesk-plus/blob/main/servicedesk&quot;&gt;configuration&lt;/a&gt;.&lt;/p&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  ·  IBM Champion  ·  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>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/</link><guid isPermaLink="true">https://heyvaldemar.com/</guid><description>Comprehensive guide to install Ubuntu Server 20.04 LTS. Covers disk setup, network configuration, OpenSSH, and user creation for 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 in order 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 &lt;a href=&quot;https://github.com/heyvaldemar/apache-configuration-grafana/blob/main/grafana.heyvaldemar.net.conf&quot;&gt;configuration&lt;/a&gt; for the webserver to work.&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;&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 &lt;a href=&quot;https://github.com/heyvaldemar/apache-configuration-grafana/blob/main/grafana.heyvaldemar.net-ssl.conf&quot;&gt;configuration&lt;/a&gt; for the webserver to work.&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;&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, in order 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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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;In order 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;Now let&apos;s take a look at 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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 &lt;a href=&quot;https://github.com/heyvaldemar/s3-configuration-rocketchat/blob/main/s3-cors-rocketchat&quot;&gt;configuration&lt;/a&gt; for the basket to work.&lt;/p&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 &lt;a href=&quot;https://github.com/heyvaldemar/s3-configuration-rocketchat/blob/main/s3-policy-rocketchat&quot;&gt;parameters&lt;/a&gt; for the policy.&lt;/p&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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</guid><description>Install Windows Admin Center on Windows Server 2019 Server Core with this clear PowerShell-based guide. Covers 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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</guid><description>Step-by-step guide to install and configure Active Directory Domain Services (AD DS) on Windows Server 2019 using Server Manager. Ideal for IT pros and sysadmins.</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;In order 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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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;In order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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  ·  IBM Champion  ·  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>Guides &amp; Tutorials</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/</link><guid isPermaLink="true">https://heyvaldemar.com/</guid><description>Step-by-step guide to install Ubuntu Server 18.04 LTS. Learn disk setup, OpenSSH installation, user configuration, and post-installation steps for server 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</guid><description>Step-by-step guide to configure Exchange Server 2019. Learn how to set up mailbox databases, public folders, DNS, certificates, send/receive connectors, and more.</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;In order 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; in order 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;Now let&apos;s take a look at 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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;In order 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 in order 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 in order 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 in order 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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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;In order 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 in order 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;In order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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;In order 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;In order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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;In order 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 in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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;In order 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;Now let&apos;s take a look at 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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;In order 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; in order 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  ·  IBM Champion  ·  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/</link><guid isPermaLink="true">https://heyvaldemar.com/</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;In order 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  ·  IBM Champion  ·  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>