diff --git a/ansible/.gitignore b/.gitignore similarity index 100% rename from ansible/.gitignore rename to .gitignore diff --git a/ansible/ansible.cfg b/ansible.cfg similarity index 100% rename from ansible/ansible.cfg rename to ansible.cfg diff --git a/ansible/roles/paperless/handlers/main.yml b/ansible/roles/paperless/handlers/main.yml deleted file mode 100644 index 6d5ba60..0000000 --- a/ansible/roles/paperless/handlers/main.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -# handlers file for paperless diff --git a/ansible/roles/paperless/vars/main.yml b/ansible/roles/paperless/vars/main.yml deleted file mode 100644 index 3082f84..0000000 --- a/ansible/roles/paperless/vars/main.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -# vars file for paperless diff --git a/arr/arr.yml b/arr/arr.yml deleted file mode 100644 index 8d25d1d..0000000 --- a/arr/arr.yml +++ /dev/null @@ -1,172 +0,0 @@ -version: "3" -services: - sonarr: - container_name: sonarr - image: lscr.io/linuxserver/sonarr:latest - ports: - - 8989:8989 - environment: - - PUID=${PUID} - - PGID=${PGID} - - UMASK_SET=022 - - TZ=${TZ} - volumes: - - "./config/sonarr:/config" - - "CHANGE_TO_COMPOSE_DATA_PATH:/data" - restart: unless-stopped - radarr: - container_name: radarr - image: lscr.io/linuxserver/radarr:latest - ports: - - 7878:7878 - environment: - - PUID=${PUID} - - PGID=${PGID} - - UMASK_SET=022 - - TZ=${TZ} - volumes: - - "./config/radarr:/config" - - "CHANGE_TO_COMPOSE_DATA_PATH:/data" - restart: unless-stopped - lidarr: - container_name: lidarr - image: lscr.io/linuxserver/lidarr:latest - ports: - - 8686:8686 - environment: - - PUID=${PUID} - - PGID=${PGID} - - UMASK_SET=022 - - TZ=${TZ} - - DOCKER_MODS=linuxserver/mods:universal-docker - volumes: - - "./config/lidarr:/config" - - "CHANGE_TO_COMPOSE_DATA_PATH:/data" - - "/var/run/docker.sock:/var/run/docker.sock:ro" - restart: unless-stopped - readarr: - container_name: readarr - image: lscr.io/linuxserver/readarr:develop - ports: - - 8787:8787 - environment: - - PUID=${PUID} - - PGID=${PGID} - - UMASK_SET=022 - - TZ=${TZ} - volumes: - - "./config/readarr:/config" - - "CHANGE_TO_COMPOSE_DATA_PATH:/data" - restart: unless-stopped - prowlarr: - container_name: prowlarr - image: lscr.io/linuxserver/prowlarr:develop - environment: - - PUID=${PUID} - - PGID=${PGID} - - UMASK_SET=022 - - TZ=${TZ} - volumes: - - "./config/prowlarr:/config" - ports: - - 9696:9696 - restart: unless-stopped - sabnzbd: - container_name: sabnzbd - image: lscr.io/linuxserver/sabnzbd:latest - environment: - - PUID=${PUID} - - PGID=${PGID} - - TZ=${TZ} - volumes: - - "./config/sabnzbd:/config" - - "CHANGE_TO_COMPOSE_DATA_PATH/usenet:/data/usenet:rw" - ports: - - 8080:8080 - restart: unless-stopped - pia-qbittorrent: - image: j4ym0/pia-qbittorrent - container_name: pia-qbittorrent - cap_add: - - NET_ADMIN - environment: - - UID=${PUID} - - GID=${PGID} - - TZ=${TZ} - - REGION=Netherlands - - USER=${PIA_USER} - - PASSWORD=${PIA_PASS} - volumes: - - "./config/piaqbit:/config" - - "CHANGE_TO_COMPOSE_DATA_PATH/torrent:/downloads:rw" - ports: - - "8888:8888" - restart: unless-stopped - jellyfin: - image: lscr.io/linuxserver/jellyfin:latest - container_name: jellyfin - environment: - - PUID={$PUID} - - PGID={$PGID} - - TZ=${TZ} - #- JELLYFIN_PublishedServerUrl=192.168.0.5 #optional - volumes: - - ".config/jellyfin:/config" - - "CHANGE_TO_COMPOSE_DATA_PATH/media:/data" - ports: - - 8096:8096 - - 7359:7359/udp #optional - network discovery - - 1900:1900/udp #optional - dlna discovery - restart: unless-stopped - audiobookshelf: - container_name: audiobookshelf - image: ghcr.io/advplyr/audiobookshelf:latest - environment: - - PUID=${PUID} - - PGID=${PGID} - - UMASK_SET=022 - - TZ=${TZ} - ports: - - 13378:80 - volumes: - - "CHANGE_TO_COMPOSE_DATA_PATH/media/audio/books:/audiobooks" - - "CHANGE_TO_COMPOSE_DATA_PATH/media/audio/podcasts:/podcasts" - - ".config/audiobookshelf:/config" - - ".metadata/audiobookshelf:/metadata" - restart: unless-stopped - jellyseerr: - image: fallenbagel/jellyseerr:latest - container_name: jellyseerr - environment: - - TZ=${TZ} - ports: - - 5055:5055 - volumes: - - "./config/jellyseerr:/app/config" - restart: unless-stopped - beets: - image: lscr.io/linuxserver/beets:latest - container_name: beets - environment: - - PUID=${PUID} - - PGID=${PGID} - - TZ=${TZ} - volumes: - - "./config/beets:/config" - - "CHANGE_TO_COMPOSE_DATA_PATH/media/audio/music:/music" - - "CHANGE_TO_COMPOSE_DATA_PATH/media/audio/music-unsorted:/downloads" - - "CHANGE_TO_COMPOSE_DATA_PATH:/data" - ports: - - 8337:8337 - restart: unless-stopped - homarr: - image: ghcr.io/ajnart/homarr:latest - container_name: homarr - volumes: - - /var/run/docker.sock:/var/run/docker.sock # Optional, only if you want docker integration - - ./config/homarr/configs:/app/data/configs - - ./config/homarr/icons:/app/public/icons - - ./config/homarr/data:/data - ports: - - '80:7575' - restart: unless-stopped diff --git a/ansible/group_vars/instance_system/vars.yaml b/group_vars/instance_system/vars.yaml similarity index 100% rename from ansible/group_vars/instance_system/vars.yaml rename to group_vars/instance_system/vars.yaml diff --git a/ansible/group_vars/instance_system/vault.yaml b/group_vars/instance_system/vault.yaml similarity index 100% rename from ansible/group_vars/instance_system/vault.yaml rename to group_vars/instance_system/vault.yaml diff --git a/ansible/inventory b/inventory similarity index 100% rename from ansible/inventory rename to inventory diff --git a/playbook.yaml b/playbook.yaml new file mode 100644 index 0000000..757f051 --- /dev/null +++ b/playbook.yaml @@ -0,0 +1,49 @@ +--- +- name: Prepare incus server host + hosts: host_system + tasks: + - name: Prepare system + ansible.builtin.import_role: + name: system + tags: system + + # FIXME: Role needs much fixup before it can run + # - name: Prepare incus + # ansible.builtin.import_role: + # name: incus-install + # tags: incus + + # ansible-galaxy install geerlingguy.docker +- name: Install docker + hosts: instance_system + tasks: + - name: Install docker and docker compose + ansible.builtin.import_role: + name: geerlingguy.docker + tags: docker + + - name: Install docker python requirements + ansible.builtin.package: + name: "{{ item }}" + state: present + loop: + - python3-yaml # for docker compose_v2 + - python3-requests # for docker network + +- name: Prepare all docker hosted containers + hosts: instance_system + tasks: + - name: Set up Caddy stack + ansible.builtin.import_role: + name: caddy + tags: caddy + + - name: Set up Arr stack + ansible.builtin.import_role: + name: arr + tags: arr + + - name: Set up Paperless stack + ansible.builtin.import_role: + name: paperless + tags: paperless diff --git a/ansible/roles/arr/README.md b/roles/arr/README.md similarity index 100% rename from ansible/roles/arr/README.md rename to roles/arr/README.md diff --git a/ansible/roles/arr/defaults/main.yml b/roles/arr/defaults/main.yml similarity index 100% rename from ansible/roles/arr/defaults/main.yml rename to roles/arr/defaults/main.yml diff --git a/ansible/roles/arr/handlers/main.yml b/roles/arr/handlers/main.yml similarity index 100% rename from ansible/roles/arr/handlers/main.yml rename to roles/arr/handlers/main.yml diff --git a/ansible/roles/arr/meta/main.yml b/roles/arr/meta/main.yml similarity index 100% rename from ansible/roles/arr/meta/main.yml rename to roles/arr/meta/main.yml diff --git a/ansible/roles/arr/tasks/main.yml b/roles/arr/tasks/main.yml similarity index 100% rename from ansible/roles/arr/tasks/main.yml rename to roles/arr/tasks/main.yml diff --git a/ansible/roles/arr/templates/arr.yml b/roles/arr/templates/arr.yml similarity index 100% rename from ansible/roles/arr/templates/arr.yml rename to roles/arr/templates/arr.yml diff --git a/ansible/roles/arr/templates/docker-compose.yaml.j2 b/roles/arr/templates/docker-compose.yaml.j2 similarity index 100% rename from ansible/roles/arr/templates/docker-compose.yaml.j2 rename to roles/arr/templates/docker-compose.yaml.j2 diff --git a/ansible/roles/arr/tests/inventory b/roles/arr/tests/inventory similarity index 100% rename from ansible/roles/arr/tests/inventory rename to roles/arr/tests/inventory diff --git a/ansible/roles/arr/tests/test.yml b/roles/arr/tests/test.yml similarity index 100% rename from ansible/roles/arr/tests/test.yml rename to roles/arr/tests/test.yml diff --git a/ansible/roles/arr/vars/main.yml b/roles/arr/vars/main.yml similarity index 100% rename from ansible/roles/arr/vars/main.yml rename to roles/arr/vars/main.yml diff --git a/ansible/roles/caddy/tasks/main.yaml b/roles/caddy/tasks/main.yaml similarity index 100% rename from ansible/roles/caddy/tasks/main.yaml rename to roles/caddy/tasks/main.yaml diff --git a/ansible/roles/caddy/templates/docker-compose.yaml.j2 b/roles/caddy/templates/docker-compose.yaml.j2 similarity index 100% rename from ansible/roles/caddy/templates/docker-compose.yaml.j2 rename to roles/caddy/templates/docker-compose.yaml.j2 diff --git a/ansible/roles/paperless/README.md b/roles/grocy/README.md similarity index 100% rename from ansible/roles/paperless/README.md rename to roles/grocy/README.md diff --git a/roles/grocy/defaults/main.yml b/roles/grocy/defaults/main.yml new file mode 100644 index 0000000..c765f90 --- /dev/null +++ b/roles/grocy/defaults/main.yml @@ -0,0 +1,8 @@ +--- + +stack_grocy_env_dir: /opt/stack_grocy + +stack_grocy_puid: 1000 +stack_grocy_pgid: 100 +stack_grocy_tz: America/Chicago +stack_grocy_umask_set: 022 diff --git a/ansible/roles/paperless/meta/main.yml b/roles/grocy/meta/main.yml similarity index 100% rename from ansible/roles/paperless/meta/main.yml rename to roles/grocy/meta/main.yml diff --git a/roles/grocy/tasks/main.yml b/roles/grocy/tasks/main.yml new file mode 100644 index 0000000..4bc182e --- /dev/null +++ b/roles/grocy/tasks/main.yml @@ -0,0 +1,16 @@ +--- +- name: Create grocy stack environment directory + ansible.builtin.file: + state: directory + path: "{{ stack_grocy_env_dir }}" + owner: root + group: root + mode: 0700 + +- name: Start the compose stack + community.docker.docker_compose_v2: + project_name: stack_grocy + definition: "{{ lookup('template', 'docker-compose.yaml.j2') | from_yaml }}" + remove_orphans: true + wait: true + wait_timeout: 60 diff --git a/roles/grocy/templates/docker-compose.yaml.j2 b/roles/grocy/templates/docker-compose.yaml.j2 new file mode 100644 index 0000000..32d6b3a --- /dev/null +++ b/roles/grocy/templates/docker-compose.yaml.j2 @@ -0,0 +1,24 @@ +services: + sonarr: + container_name: grocy + image: lscr.io/linuxserver/grocy:latest + networks: + - caddy + environment: + - PUID={{ stack_grocy_puid }} + - PGID={{ stack_grocy_pgid }} + - TZ={{ stack_grocy_tz }} + - UMASK_SET={{ stack_grocy_umask_set }} + volumes: + - "{{ arrstack_env_dir }}/config/grocy:/config" + restart: unless-stopped + labels: + caddy: "http://house.pichi.berlin" + caddy.reverse_proxy: "{{ '{{' }}upstreams 80{{ '}}'}}" + +networks: + caddy: + external: true + +volumes: + caddy_data: {} diff --git a/ansible/roles/paperless/tests/inventory b/roles/grocy/tests/inventory similarity index 100% rename from ansible/roles/paperless/tests/inventory rename to roles/grocy/tests/inventory diff --git a/roles/grocy/tests/test.yml b/roles/grocy/tests/test.yml new file mode 100644 index 0000000..536a352 --- /dev/null +++ b/roles/grocy/tests/test.yml @@ -0,0 +1,5 @@ +--- +- hosts: localhost + remote_user: root + roles: + - grocy diff --git a/ansible/roles/incus-install/tasks/add-repo.yaml b/roles/incus-install/tasks/add-repo.yaml similarity index 100% rename from ansible/roles/incus-install/tasks/add-repo.yaml rename to roles/incus-install/tasks/add-repo.yaml diff --git a/ansible/roles/incus-install/tasks/bootstrap.yaml b/roles/incus-install/tasks/bootstrap.yaml similarity index 100% rename from ansible/roles/incus-install/tasks/bootstrap.yaml rename to roles/incus-install/tasks/bootstrap.yaml diff --git a/ansible/roles/incus-install/tasks/main.yaml b/roles/incus-install/tasks/main.yaml similarity index 100% rename from ansible/roles/incus-install/tasks/main.yaml rename to roles/incus-install/tasks/main.yaml diff --git a/roles/paperless/README.md b/roles/paperless/README.md new file mode 100644 index 0000000..dfa8474 --- /dev/null +++ b/roles/paperless/README.md @@ -0,0 +1,46 @@ +Role Name +========= + +Set up a docker-hosted paperless-ngx instance. + +Requirements +------------ + +The target server needs to be running a reasonably recent version of docker, +which contains the `docker compose` (_not_ `docker-compose`) sub-command. + +Role Variables +-------------- + +All relevant variables reside in `defaults/main.yml`. + + +Dependencies +------------ + +Relies on the `caddy` role to be executed for caddy to pick up the container and proxy to it. + +Example Playbook +---------------- + +The role can easily be set up in the following way to deploy to any server: + + - hosts: servers + roles: + - role: paperless + +An example scanning script is included which I wrote for my old printer and allows (relatively) rapid scanning by pushing a button, +and automatically merging and sending the files to the consume folder. + +This will need to be adjusted for wherever you watch for the documents, +but is a simple example of how it could be integrated into a scanning workflow. + +License +------- + +MIT + +Author Information +------------------ + +Copyright (c) 2025 Marty Oehme. All Rights Reserved. diff --git a/ansible/roles/paperless/defaults/main.yml b/roles/paperless/defaults/main.yml similarity index 100% rename from ansible/roles/paperless/defaults/main.yml rename to roles/paperless/defaults/main.yml diff --git a/roles/paperless/meta/main.yml b/roles/paperless/meta/main.yml new file mode 100644 index 0000000..ea68190 --- /dev/null +++ b/roles/paperless/meta/main.yml @@ -0,0 +1,34 @@ +galaxy_info: + author: your name + description: your role description + company: your company (optional) + + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + + # Choose a valid license ID from https://spdx.org - some suggested licenses: + # - BSD-3-Clause (default) + # - MIT + # - GPL-2.0-or-later + # - GPL-3.0-only + # - Apache-2.0 + # - CC-BY-4.0 + license: license (GPL-2.0-or-later, MIT, etc) + + min_ansible_version: 2.1 + + # If this a Container Enabled role, provide the minimum Ansible Container version. + # min_ansible_container_version: + + galaxy_tags: [] + # List tags for your role here, one per line. A tag is a keyword that describes + # and categorizes the role. Users find roles by searching for tags. Be sure to + # remove the '[]' above, if you add tags to this list. + # + # NOTE: A tag is limited to a single word comprised of alphanumeric characters. + # Maximum 20 tags per role. + +dependencies: [] + # List your role dependencies here, one per line. Be sure to remove the '[]' above, + # if you add dependencies to this list. diff --git a/paperless/scantopaperless.sh b/roles/paperless/scripts/scantopaperless.sh similarity index 90% rename from paperless/scantopaperless.sh rename to roles/paperless/scripts/scantopaperless.sh index 5c10c0c..ad43f3e 100755 --- a/paperless/scantopaperless.sh +++ b/roles/paperless/scripts/scantopaperless.sh @@ -24,5 +24,5 @@ if ! stat -t out*.png >/dev/null 2>&1; then fi magick out*.png out.pdf -mv out.pdf "$HOME/documents/archive/consume/$(date +'%Y-%m-%dT%H-%M')_scan.pdf" +mv out.pdf "$HOME/documents/consume/$(date +'%Y-%m-%dT%H-%M')_scan.pdf" rm out*.png diff --git a/ansible/roles/paperless/tasks/main.yml b/roles/paperless/tasks/main.yml similarity index 100% rename from ansible/roles/paperless/tasks/main.yml rename to roles/paperless/tasks/main.yml diff --git a/ansible/roles/paperless/templates/docker-compose.yaml.j2 b/roles/paperless/templates/docker-compose.yaml.j2 similarity index 100% rename from ansible/roles/paperless/templates/docker-compose.yaml.j2 rename to roles/paperless/templates/docker-compose.yaml.j2 diff --git a/roles/paperless/tests/inventory b/roles/paperless/tests/inventory new file mode 100644 index 0000000..878877b --- /dev/null +++ b/roles/paperless/tests/inventory @@ -0,0 +1,2 @@ +localhost + diff --git a/ansible/roles/paperless/tests/test.yml b/roles/paperless/tests/test.yml similarity index 100% rename from ansible/roles/paperless/tests/test.yml rename to roles/paperless/tests/test.yml diff --git a/ansible/roles/system/files/incus.servers.tpl b/roles/system/files/incus.servers.tpl similarity index 100% rename from ansible/roles/system/files/incus.servers.tpl rename to roles/system/files/incus.servers.tpl diff --git a/ansible/roles/system/files/incus.sources.tpl b/roles/system/files/incus.sources.tpl similarity index 100% rename from ansible/roles/system/files/incus.sources.tpl rename to roles/system/files/incus.sources.tpl diff --git a/ansible/roles/system/files/zabbly-key.asc b/roles/system/files/zabbly-key.asc similarity index 100% rename from ansible/roles/system/files/zabbly-key.asc rename to roles/system/files/zabbly-key.asc diff --git a/ansible/roles/system/handlers/main.yaml b/roles/system/handlers/main.yaml similarity index 100% rename from ansible/roles/system/handlers/main.yaml rename to roles/system/handlers/main.yaml diff --git a/ansible/roles/system/tasks/main.yaml b/roles/system/tasks/main.yaml similarity index 100% rename from ansible/roles/system/tasks/main.yaml rename to roles/system/tasks/main.yaml diff --git a/monitoring.yaml b/stacks/monitoring.yaml similarity index 100% rename from monitoring.yaml rename to stacks/monitoring.yaml diff --git a/paperless/docker-compose.env b/stacks/paperless/docker-compose.env similarity index 100% rename from paperless/docker-compose.env rename to stacks/paperless/docker-compose.env diff --git a/paperless/docker-compose.simple_example.yml b/stacks/paperless/docker-compose.simple_example.yml similarity index 100% rename from paperless/docker-compose.simple_example.yml rename to stacks/paperless/docker-compose.simple_example.yml diff --git a/paperless/docker-compose.yml b/stacks/paperless/docker-compose.yml similarity index 100% rename from paperless/docker-compose.yml rename to stacks/paperless/docker-compose.yml