This guide provides a full Ansible playbook to deploy Part Db with Docker Compose on Debian 10+, Ubuntu LTS, and RHEL 9+ compatible hosts.
- name: Deploy Part Db
hosts: part-db
become: true
vars:
app_root: /opt/part-db
app_port: 8080
partdb_version: "2.6.0" # Use latest stable version
database_password: "{{ vault_database_password }}" # Store in Ansible Vault
partdb_secret: "{{ vault_partdb_secret }}" # Store in Ansible Vault
tasks:
- name: Install Docker on Debian/Ubuntu
apt:
name:
- docker.io
- docker-compose-plugin
state: present
update_cache: true
when: ansible_os_family == "Debian"
- name: Install Docker on RHEL family
dnf:
name:
- docker
- docker-compose-plugin
state: present
when: ansible_os_family == "RedHat"
- name: Enable and start Docker
service:
name: docker
state: started
enabled: true
- name: Add ansible user to docker group
user:
name: "{{ ansible_user }}"
groups: docker
append: true
notify: restart ssh
- name: Create application directory
file:
path: "{{ app_root }}"
state: directory
mode: "0755"
owner: "{{ ansible_user }}"
- name: Create data directories
file:
path: "{{ item }}"
state: directory
mode: "0755"
owner: "{{ ansible_user }}"
loop:
- "{{ app_root }}/data"
- "{{ app_root }}/attachments"
- "{{ app_root }}/config"
- "{{ app_root }}/mysql-data"
- name: Write Docker Compose file
template:
src: docker-compose.yml.j2
dest: "{{ app_root }}/docker-compose.yml"
mode: "0644"
owner: "{{ ansible_user }}"
- name: Start application stack
docker_compose:
project_src: "{{ app_root }}"
state: present
pull: yes
register: compose_result
- name: Wait for Part-DB to be available
uri:
url: "http://localhost:{{ app_port }}"
method: GET
status_code: 200
timeout: 30
retries: 30
delay: 10
when: compose_result.changed
- name: Configure Part-DB after initial deployment
hosts: part-db
become: true
vars:
app_root: /opt/part-db
tasks:
- name: Check if initial setup is needed
uri:
url: "http://localhost:8080"
method: GET
return_content: yes
register: partdb_status
delegate_to: localhost
- name: Display initial setup instructions
debug:
msg: "Part-DB is deployed. Visit http://your-server-ip:8080 to complete initial setup."
when: "'Setup' in partdb_status.content or 'install' in partdb_status.content"
Create a template file at templates/docker-compose.yml.j2:
version: '3.8'
services:
part-db:
image: ghcr.io/part-db/part-db:{{ partdb_version }}
restart: unless-stopped
ports:
- "{{ app_port }}:8080"
volumes:
- {{ app_root }}/data:/data
- {{ app_root }}/attachments:/attachments
- {{ app_root }}/config:/config
environment:
- PARTDB_DATABASE_URL=mysql://partdb_user:{{ database_password }}@db:3306/partdb
- PARTDB_ATTACHMENTS_PATH=/attachments
- PARTDB_BASE_URL={{ partdb_base_url | default('http://localhost:' + app_port|string) }}
- PARTDB_DEFAULT_LOCALE=en
- PARTDB_SECRET={{ partdb_secret }}
- PARTDB_MAILER_DSN={{ mailer_dsn | default('null://null') }}
- PARTDB_MAILER_FROM={{ mailer_from | default('noreply@localhost') }}
depends_on:
- db
networks:
- part-db-network
db:
image: mysql:8.0
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: "{{ vault_mysql_root_password }}"
MYSQL_DATABASE: partdb
MYSQL_USER: partdb_user
MYSQL_PASSWORD: "{{ database_password }}"
volumes:
- {{ app_root }}/mysql-data:/var/lib/mysql
networks:
- part-db-network
networks:
part-db-network:
driver: bridge
Create an encrypted vault file (group_vars/part-db/vault.yml) with:
vault_database_password: "your_secure_database_password_here"
vault_partdb_secret: "your_secure_random_secret_here"
vault_mysql_root_password: "your_secure_mysql_root_password_here"
2.6.0) instead of latest.Any questions?
Feel free to contact us. Find all contact information on our contact page.