AnsibleMULTI

Docker + Nginx Setup (Ansible)

Ansible playbook to install Docker, pull a container image, and configure Nginx as a reverse proxy.

ansibledockernginxreverse-proxy

Prerequisites

  • Ansible >= 2.14
  • Target server running Ubuntu 22.04
  • SSH access to the target server

Template Code

# ─────────────────────────────────────────────────────────────────────────────
# Ansible: Install Docker + run container + configure Nginx reverse proxy
# ─────────────────────────────────────────────────────────────────────────────
# File structure:
#   site.yml          (this file)
#   inventory.ini     (your server inventory)
#   templates/
#     nginx.conf.j2   (Nginx config template — provided below as a comment)
# ─────────────────────────────────────────────────────────────────────────────

---
- name: Setup Docker + Nginx on Ubuntu 22.04
  hosts: webservers
  become: yes
  vars:
    app_name: my-app
    app_image: "nginx:alpine"          # Replace with your image
    app_port: 3000
    nginx_server_name: "example.com"   # Replace with your domain

  tasks:
    # ── System prerequisites ─────────────────────────────────────────────────
    - name: Update apt cache
      apt:
        update_cache: yes
        cache_valid_time: 3600

    - name: Install required packages
      apt:
        name:
          - ca-certificates
          - curl
          - gnupg
          - nginx
        state: present

    # ── Docker installation ──────────────────────────────────────────────────
    - name: Add Docker GPG key
      apt_key:
        url: https://download.docker.com/linux/ubuntu/gpg
        state: present

    - name: Add Docker repository
      apt_repository:
        repo: "deb [arch=amd64] https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable"
        state: present

    - name: Install Docker Engine
      apt:
        name:
          - docker-ce
          - docker-ce-cli
          - containerd.io
          - docker-compose-plugin
        state: present
        update_cache: yes

    - name: Enable and start Docker
      systemd:
        name: docker
        enabled: yes
        state: started

    # ── Container deployment ─────────────────────────────────────────────────
    - name: Pull application image
      community.docker.docker_image:
        name: "{{ app_image }}"
        source: pull

    - name: Run application container
      community.docker.docker_container:
        name: "{{ app_name }}"
        image: "{{ app_image }}"
        state: started
        restart_policy: unless-stopped
        ports:
          - "127.0.0.1:{{ app_port }}:80"
        env:
          NODE_ENV: production

    # ── Nginx configuration ──────────────────────────────────────────────────
    - name: Remove default Nginx site
      file:
        path: /etc/nginx/sites-enabled/default
        state: absent

    - name: Configure Nginx reverse proxy
      template:
        src: templates/nginx.conf.j2
        dest: "/etc/nginx/sites-available/{{ app_name }}"
      notify: Reload Nginx

    - name: Enable Nginx site
      file:
        src: "/etc/nginx/sites-available/{{ app_name }}"
        dest: "/etc/nginx/sites-enabled/{{ app_name }}"
        state: link

    - name: Ensure Nginx is started
      systemd:
        name: nginx
        enabled: yes
        state: started

  handlers:
    - name: Reload Nginx
      systemd:
        name: nginx
        state: reloaded

# ── Nginx template (templates/nginx.conf.j2) ──────────────────────────────────
# server {
#     listen 80;
#     server_name {{ nginx_server_name }};
#
#     location / {
#         proxy_pass         http://127.0.0.1:{{ app_port }};
#         proxy_http_version 1.1;
#         proxy_set_header   Upgrade $http_upgrade;
#         proxy_set_header   Connection 'upgrade';
#         proxy_set_header   Host $host;
#         proxy_cache_bypass $http_upgrade;
#         proxy_set_header   X-Real-IP $remote_addr;
#         proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
#         proxy_set_header   X-Forwarded-Proto $scheme;
#     }
# }

Usage

ansible-playbook -i inventory.ini site.yml --ask-become-pass