Restructure repo: group Docker stacks under docker-compose/, add ansible/ playbooks and roles

This commit is contained in:
rezayaghobi-dev
2026-07-25 18:04:47 +03:30
parent 1287f0b63e
commit 4f2911df62
40 changed files with 239 additions and 0 deletions

View File

@@ -0,0 +1,18 @@
services:
semaphore:
image: semaphoreui/semaphore:latest
container_name: semaphore
ports:
- "3001:3000"
environment:
SEMAPHORE_DB_DIALECT: sqlite
SEMAPHORE_DB_PATH: /var/lib/semaphore/database.db
SEMAPHORE_ADMIN: admin
SEMAPHORE_ADMIN_PASSWORD: rezayaghobi1386
SEMAPHORE_ADMIN_EMAIL: rezay5639@gmail.com
SEMAPHORE_ADMIN_NAME: Admin
SEMAPHORE_SECRET_KEY: cc4b3a5a90d31b963bee48a9dee089472bef5e0461f934db7891fc68161d36f7
volumes:
- ./data:/var/lib/semaphore
- ./playbooks:/playbooks
restart: unless-stopped

View File

@@ -0,0 +1,19 @@
services:
filebrowser:
image: filebrowser/filebrowser:latest
container_name: filebrowser
ports:
- "8085:80"
user: "1000:1000"
volumes:
- /srv/samba/games:/games
- /mnt/storage:/storage
- /home/rezayaghobi/docker/filebrowser/config:/config
- filebrowser_db:/database
- filebrowser_srv:/srv
restart: unless-stopped
volumes:
filebrowser_db:
filebrowser_srv:

View File

@@ -0,0 +1,23 @@
services:
qbittorrent:
image: lscr.io/linuxserver/qbittorrent:latest
container_name: qbittorrent
restart: unless-stopped
ports:
- "8081:8080"
- "6881:6881"
- "6881:6881/udp"
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Baku
- WEBUI_PORT=8080
volumes:
- ./qbittorrent:/config
- /mnt/storage/films/downloads:/downloads
networks:
- mediastack
networks:
mediastack:
external: true

View File

@@ -0,0 +1,12 @@
services:
plex:
image: lscr.io/linuxserver/plex:latest
container_name: plex
network_mode: host
environment:
- TZ=Asia/Tehran
- PLEX_CLAIM=claim-uRK14oDz86FsyFgNyaBh
volumes:
- /home/rezayaghobi/docker/plex:/config
- /mnt/storage:/media
restart: unless-stopped

View File

@@ -0,0 +1,19 @@
services:
prowlarr:
image: lscr.io/linuxserver/prowlarr:latest
container_name: prowlarr
restart: unless-stopped
ports:
- "9696:9696"
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/baku
volumes:
- ./config:/config
networks:
- mediastack
networks:
mediastack:
external: true

View File

@@ -0,0 +1,22 @@
services:
radarr:
image: lscr.io/linuxserver/radarr:latest
container_name: radarr
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Baku
volumes:
- ./config:/config
- /mnt/storage/films:/media
- /mnt/storage/films/downloads:/downloads
ports:
- 7878:7878
restart: unless-stopped
networks:
- mediastack
networks:
mediastack:
external: true

View File

@@ -0,0 +1,22 @@
services:
sonarr:
image: lscr.io/linuxserver/sonarr:latest
container_name: sonarr
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Baku
volumes:
- ./config:/config
- /mnt/storage/films:/media
- /mnt/storage/films/downloads:/downloads
ports:
- 8989:8989
restart: unless-stopped
networks:
- mediastack
networks:
mediastack:
external: true

View File

@@ -0,0 +1,24 @@
services:
whisparr:
image: ghcr.io/hotio/whisparr:v3
container_name: whisparr
restart: unless-stopped
ports:
- "6969:6969"
environment:
- PUID=1000
- PGID=1000
- UMASK=002
- TZ=Asia/Baku
volumes:
- ./config:/config
- /mnt/storage/films/downloads:/downloads
- /mnt/storage/adult:/data/whisparr
- /mnt/storage/films/downloads/whisparr:/downloads/whisparr # ADD THIS
networks:
- mediastack
networks:
mediastack:
external: true

View File

@@ -0,0 +1,16 @@
services:
minecraft:
image: itzg/minecraft-server:latest
container_name: minecraft
restart: unless-stopped
ports:
- "25565:25565"
environment:
EULA: "TRUE"
TYPE: "CUSTOM"
CUSTOM_SERVER: "paper-1.21.11-117.jar"
MEMORY: "2G"
DISABLE_DOWNLOADS: "true"
volumes:
- /home/rezayaghobi/docker/minecraft/server:/data

View File

@@ -0,0 +1,63 @@
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
restart: unless-stopped
ports:
- "9090:9090"
volumes:
- ./prometheus:/etc/prometheus:ro
- ./data/prometheus:/prometheus
command:
- "--config.file=/etc/prometheus/prometheus.yml"
- "--storage.tsdb.path=/prometheus"
networks:
- monitoring
grafana:
image: grafana/grafana:latest
container_name: grafana
restart: unless-stopped
ports:
- "3000:3000"
volumes:
- ./grafana/data:/var/lib/grafana
networks:
- monitoring
node_exporter:
image: prom/node-exporter:latest
container_name: node-exporter
restart: unless-stopped
ports:
- "9100:9100"
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
networks:
- monitoring
cadvisor:
image: ghcr.io/google/cadvisor:latest
container_name: cadvisor
restart: unless-stopped
ports:
- "8080:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
networks:
- monitoring
networks:
monitoring:
driver: bridge

View File

@@ -0,0 +1,8 @@
POSTGRES_USER=n8n
POSTGRES_PASSWORD=change-me
POSTGRES_DB=n8n
N8N_BASIC_AUTH_USER=admin
N8N_BASIC_AUTH_PASSWORD=change-me
N8N_ENCRYPTION_KEY=change-me-to-a-random-32-char-string
N8N_HOST=192.168.100.6
TZ=Asia/Tehran

View File

@@ -0,0 +1,58 @@
services:
postgres:
image: postgres:17
container_name: n8n-postgres
restart: unless-stopped
env_file:
- .env
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
volumes:
- ./postgres:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 5
n8n:
image: n8nio/n8n:latest
container_name: n8n
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
env_file:
- .env
environment:
DB_TYPE: postgresdb
DB_POSTGRESDB_HOST: postgres
DB_POSTGRESDB_PORT: 5432
DB_POSTGRESDB_DATABASE: ${POSTGRES_DB}
DB_POSTGRESDB_USER: ${POSTGRES_USER}
DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}
N8N_BASIC_AUTH_ACTIVE: true
N8N_BASIC_AUTH_USER: ${N8N_BASIC_AUTH_USER}
N8N_BASIC_AUTH_PASSWORD: ${N8N_BASIC_AUTH_PASSWORD}
N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
N8N_SECURE_COOKIE: false
N8N_HOST: ${N8N_HOST}
N8N_PORT: 5678
N8N_PROTOCOL: http
TZ: ${TZ}
ports:
- "5678:5678"
volumes:
- ./n8n-data:/home/node/.n8n
- /mnt/storage:/mnt/storage
- /mnt/windows-video:/mnt/windows-video

View File

@@ -0,0 +1,15 @@
services:
nginx-proxy-manager:
image: 'jc21/nginx-proxy-manager:latest'
container_name: npm
restart: unless-stopped
ports:
- '80:80'
- '443:443'
- '81:81'
volumes:
- npm-data:/data
- npm-letsencrypt:/etc/letsencrypt
volumes:
npm-data:
npm-letsencrypt:

View File

@@ -0,0 +1,23 @@
services:
agent-canvas:
image: ghcr.io/openhands/agent-canvas:latest
container_name: agent-canvas
restart: unless-stopped
ports:
- "8000:8000"
volumes:
- openhands-data:/home/openhands/.openhands
- ./projects:/home/openhands/workspace/project
stdin_open: true
tty: true
ollama:
image: ollama/ollama:latest
container_name: ollama
restart: unless-stopped
ports:
- "11434:11434"
volumes:
- ollama-data:/root/.ollama
volumes:
openhands-data:
ollama-data:

View File

@@ -0,0 +1 @@
PIHOLE_WEBPASSWORD=change-me

View File

@@ -0,0 +1,14 @@
services:
pihole:
container_name: pihole
image: ghcr.io/pi-hole/pihole:latest
network_mode: host
env_file:
- .env
environment:
TZ: "Asia/Tehran"
WEBPASSWORD: ${PIHOLE_WEBPASSWORD}
volumes:
- ./etc-pihole:/etc/pihole
- ./etc-dnsmasq.d:/etc/dnsmasq.d
restart: unless-stopped

View File

@@ -0,0 +1,10 @@
services:
portainer:
image: portainer/portainer-ce:latest
container_name: portainer
restart: unless-stopped
ports:
- "9000:9000"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /home/rezayaghobi/docker/portainer/data:/data

View File

@@ -0,0 +1,2 @@
# Format: username;password
SAMBA_USER=username;change-me

View File

@@ -0,0 +1,20 @@
services:
samba:
image: dperson/samba:latest
container_name: samba
network_mode: host
env_file:
- .env
environment:
- TZ=Asia/Tehran
- USER=${SAMBA_USER}
- NMBD=false
- SMBD=true
- WSDD2=false
- AVAHI=false
- CONFIGFILE=/etc/samba/smb.conf
volumes:
- /home/rezayaghobi/docker/samba/config/smb.conf:/etc/samba/smb.conf
- /mnt/storage:/mount/main
- /mnt/hdd3:/mount/game_backups
restart: unless-stopped

View File

@@ -0,0 +1,281 @@
# AWX Installation Journey (Abandoned in Favor of Semaphore)
## Overview
One of my goals for my homelab was learning **Ansible AWX**, the open-source upstream project of Red Hat Ansible Automation Platform.
Initially I wanted to deploy AWX entirely with Docker since the rest of my homelab is containerized.
During this project I discovered that AWX has completely moved away from Docker Compose deployments and now officially targets Kubernetes via the AWX Operator.
Rather than continue patching an obsolete deployment method, I decided to document the investigation and switch to **Semaphore**, which better matches my current Docker-based homelab.
---
# Environment
- Ubuntu 24.04 LTS
- Docker Engine
- Docker Compose v2
- Ansible Core 2.16
- Git
- GNU Make
---
# Attempt 1 – Community Repository
I first cloned:
```bash
git clone https://github.com/fitbeard/ansible-platform.git
```
After exploring the project, I realized it was **not a Docker deployment of AWX**.
Instead it deploys:
- AWX Operator
- Automation Platform components
- Kubernetes resources
This was abandoned because my goal was running AWX directly in Docker.
---
# Attempt 2 – Official AWX Repository
I cloned the official project:
```bash
git clone https://github.com/ansible/awx.git
```
Checked out the latest stable release:
```bash
git checkout 24.6.1
```
The repository still contains:
```
tools/docker-compose/
```
which initially appeared to support Docker deployments.
---
# Docker Compose Preparation
Verified:
- Docker
- Docker Compose
- Make
- Python
- Ansible
All prerequisites were already installed.
---
# Issue 1 – Broken docker-compose Binary
My machine still had an old legacy binary:
```
/usr/local/bin/docker-compose
```
Running:
```bash
docker-compose version
```
returned:
```
Not: not found
```
After inspecting the AWX Makefile, I confirmed it actually uses:
```
docker compose
```
instead of the old standalone binary.
Removing the obsolete binary fixed this issue.
---
# Issue 2 – Ansible Galaxy Blocked
Running:
```bash
make docker-compose
```
failed with:
```
403 Forbidden
```
against:
```
https://galaxy.ansible.com
```
This appears to be due to regional sanctions.
Fortunately the repository already contained the required collection archives.
Installed manually:
```bash
ansible-galaxy collection install awx-awx-24.6.1.tar.gz
ansible-galaxy collection install community-docker-5.2.1.tar.gz
ansible-galaxy collection install flowerysong-hvault-0.3.0.tar.gz
```
After installation I skipped the Galaxy download step.
---
# Issue 3 – Quay.io Blocked
The next failure occurred while Docker attempted to pull:
```
quay.io/sclorg/postgresql-15-c9s
```
The registry returned:
```
403 Forbidden
```
Testing Quay directly confirmed the registry was inaccessible from my location.
To continue testing, I modified the generated compose file to use:
```yaml
image: postgres:15
```
and updated the PostgreSQL environment variables accordingly.
---
# Issue 4 – Missing AWX Development Image
The final blocker was:
```
ghcr.io/ansible/awx_devel:HEAD
```
Docker returned:
```
manifest unknown
```
Investigation showed that:
- `awx_devel` is a development image
- versioned tags are no longer published
- the Docker Compose workflow expects developers to build the image locally
using:
```bash
make docker-compose-build
```
rather than pulling a stable image.
---
# Conclusion
At this point it became clear that the Docker Compose deployment is no longer intended as a supported installation method.
Instead it exists only as a development environment for AWX contributors.
The officially supported installation method today is:
```
Kubernetes
↓
AWX Operator
↓
AWX
```
---
# Decision
Rather than continue patching an obsolete deployment, I decided to stop the project.
For my Docker-based homelab I installed **Semaphore** instead.
Semaphore provides:
- Web UI
- Playbook execution
- Inventories
- SSH key management
- Scheduling
- Templates
while remaining simple to deploy with Docker Compose.
---
# Lessons Learned
This project was still valuable because it reinforced several important DevOps skills:
- Reading project documentation
- Inspecting Makefiles
- Understanding Ansible collections
- Troubleshooting Docker image registries
- Working around regional network restrictions
- Understanding the evolution of deployment methods
- Recognizing when to stop patching legacy software and adopt the supported architecture instead
---
# Future Plans
In the future I plan to learn Kubernetes properly.
Once comfortable with Kubernetes, I intend to deploy AWX using the officially supported AWX Operator.
```
Ubuntu
↓
Docker
↓
k3s
↓
Helm
↓
AWX Operator
↓
AWX
```
Until then, Semaphore satisfies my automation needs while allowing me to continue learning Ansible.

View File

@@ -0,0 +1,17 @@
services:
semaphore:
image: semaphoreui/semaphore:latest
container_name: semaphore
ports:
- "3001:3000"
environment:
SEMAPHORE_DB_DIALECT: sqlite
SEMAPHORE_DB_PATH: /var/lib/semaphore/database.db
SEMAPHORE_ADMIN: admin
SEMAPHORE_ADMIN_PASSWORD: choose a passwor or use .env (better )
SEMAPHORE_ADMIN_EMAIL: rezay5639@gmail.com
SEMAPHORE_ADMIN_NAME: Admin
SEMAPHORE_SECRET_KEY: <your-long-secret-key>
volumes:
- ./data:/var/lib/semaphore
restart: unless-stopped

View File

@@ -0,0 +1,12 @@
services:
sentinel:
image: scyto/sentinel:latest
container_name: sentinel
privileged: true
volumes:
- /dev:/dev
- /run/udev:/run/udev:ro
ports:
- "8090:8090"
restart: unless-stopped

View File

@@ -0,0 +1,11 @@
services:
smartctl_exporter:
image: ghcr.io/prometheus-community/smartctl_exporter:latest
container_name: smartctl_exporter
privileged: true
volumes:
- /dev:/dev
- /run/udev:/run/udev:ro
ports:
- "9633:9633"
restart: unless-stopped