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