Compare commits

...

31 Commits

Author SHA1 Message Date
084e8dbd5f chore: remove deploy.sh from workflow
All checks were successful
Deploy / Prepare Build (push) Successful in 6m40s
2025-10-12 16:33:46 +10:00
3f21d2211d chore: remove act runner from vps gitea: 2025-10-12 15:56:05 +10:00
9da7430e4b chore: remove proxmox template build 2025-10-12 01:45:57 +10:00
a35b24dbaa chore: rebuild successful 2025-10-12 01:36:00 +10:00
6000e76f42 chore: enable all main.yml 2025-10-12 00:52:41 +10:00
a56e084ddc chore: remove vaultwarden 2025-10-12 00:51:59 +10:00
2c17ec766c chore: remove traefik 2025-10-12 00:50:02 +10:00
3b505b7499 chore: remove speedtest 2025-10-12 00:48:58 +10:00
1ee50d0416 chore: remove recreate 2025-10-12 00:46:48 +10:00
6292834417 chore: update for sonarr 2025-10-12 00:41:39 +10:00
d4b9f3d1d1 chore: update for sabnzbd 2025-10-12 00:40:49 +10:00
df4980d443 chore: update for radarr 2025-10-12 00:38:25 +10:00
3a42d5454a chore: update for pykms 2025-10-12 00:35:43 +10:00
4eb4083e69 chore: update for prowlarr 2025-10-12 00:32:16 +10:00
52bad1a6ca chore: update for postgres 2025-10-12 00:30:08 +10:00
15853e9cbc chore: update for MSSQL 2025-10-12 00:11:03 +10:00
414cf58574 chore: update for mediawiki 2025-10-12 00:08:54 +10:00
aad9de469e chore: recuse update {{ data_folder }} to /data 2025-10-12 00:08:08 +10:00
bed6e403c2 chore: update for mealie 2025-10-12 00:05:16 +10:00
23998b2800 chore: update for mariadb 2025-10-12 00:04:07 +10:00
48aefdefa8 chore: update for lidarr 2025-10-12 00:03:05 +10:00
16b35cbfd3 chore: update for jellyseerr 2025-10-12 00:01:49 +10:00
a892037efd chore: update for iscsi 2025-10-12 00:00:24 +10:00
e85df2798a chore: update inv ninja for rebuild 2025-10-11 23:57:26 +10:00
a44dd6b5a9 chore: update homepage for rebuild 2025-10-11 23:31:01 +10:00
4fa6676e91 chore: update dozzle and gitea for rebuild 2025-10-11 22:44:44 +10:00
bc61753794 chore: remove nfs and traefik roles. Move them to tasks 2025-10-11 22:02:00 +10:00
09c67abe58 chore: remote old docker roles 2025-10-11 21:18:11 +10:00
9777fb2813 chore: update omada for rebuild 2025-10-11 19:00:37 +10:00
21997f3c33 chore: update workflow and add separate yml files for hosts 2025-10-11 18:52:15 +10:00
d08ee33972 chore: update base.yml 2025-10-11 18:05:09 +10:00
65 changed files with 1013 additions and 1527 deletions

View File

@@ -26,4 +26,5 @@ jobs:
echo "StrictHostKeyChecking no" >> ~/.ssh/config echo "StrictHostKeyChecking no" >> ~/.ssh/config
echo "${{ secrets.ANSIBLE_VAULT_PASSWORD }}" > ~/.vault_password.txt echo "${{ secrets.ANSIBLE_VAULT_PASSWORD }}" > ~/.vault_password.txt
echo "nameserver 10.10.10.1" > /etc/resolv.conf echo "nameserver 10.10.10.1" > /etc/resolv.conf
./.gitea/workflows/deploy.sh "${{ github.event.before }}" "${{ github.sha }}" ansible-galaxy install -r requirements.yml
ansible-playbook main.yml --vault-password-file ~/.vault_password.txt

24
all.yml Normal file
View File

@@ -0,0 +1,24 @@
---
- hosts: all
become: yes
name: Configure all servers
pre_tasks:
- name: Create directories
file:
path: "/data"
state: directory
roles:
- role: geerlingguy.docker
docker_users:
- administrator
tasks:
- name: Gather facts (always, even with tags)
ansible.builtin.setup:
tags: always
- name: Setup base system
import_tasks: tasks/base.yml

View File

@@ -1,70 +0,0 @@
---
- hosts: proxmox
become: yes
tasks:
- name: Delete existing template
community.general.proxmox_kvm:
api_host: "{{ api_host }}"
api_user: "{{ api_user }}"
api_password: "{{ api_password }}"
node: "{{ node_target }}"
name: "debian-12-generic-amd64"
state: absent
- name: Download cloud-init image
register: image
ansible.builtin.get_url:
url: "https://cloud.debian.org/images/cloud/trixie/latest/debian-13-generic-amd64.qcow2"
dest: /tmp
mode: "0644"
force: true
- name: Install Tools
ansible.builtin.apt:
name:
- libguestfs-tools
- python3
- python3-pip
- python3-proxmoxer
update_cache: true
install_recommends: false
state: present
- name: Install Tools to cloud-init image
ansible.builtin.shell: |
virt-customize -a {{ image.dest }} --run-command 'sed -i "s|primary.*|primary: https://deb.debian.org/debian|g" /etc/cloud/cloud.cfg'
virt-customize -a {{ image.dest }} --run-command 'apt update'
virt-customize -a {{ image.dest }} --install qemu-guest-agent
- name: Create new VM template from cloud-init image
community.general.proxmox_kvm:
api_host: "{{ api_host }}"
api_user: "{{ api_user }}"
# api_password: "{{ api_password }}"
api_token_id: "{{ api_token_id }}"
api_token_secret: "{{ api_token_secret }}"
api_port: "8006"
node: "{{ node_target }}"
name: "debian-12-generic-amd64"
agent: "enabled=1"
bios: ovmf
boot: "order=scsi0"
cores: 4
sockets: 1
machine: q35
memory: 4096
ostype: "l26"
vga: std
scsihw: "virtio-scsi-single"
net:
net0: "virtio,bridge=vmbr0,firewall=1,tag=10"
ipconfig:
ipconfig0: "ip=dhcp"
template: true
timeout: 600
vmid: 10000
- name: Import HDD to Template
command:
cmd: "qm set 10000 --scsi0 {{ storage_target }}:0,iothread=1,discard=on,import-from=/tmp/debian-13-generic-amd64.qcow2,format=raw"

24
cloud.yml Normal file
View File

@@ -0,0 +1,24 @@
---
- hosts: cloud
become: yes
vars:
traefik_host: "vps02.comprofix.com"
tasks:
- name: Deploy traefik
import_tasks: tasks/traefik.yml
- name: Deploy postgres
import_tasks: tasks/postgres.yml
- name: Deploy Vaultwarden
import_tasks: tasks/vaultwarden.yml
tags: vaultwarden_install
- name: Deploy gitea
import_tasks: tasks/gitea.yml
tags: gitea_install
- name: Gotify
import_tasks: tasks/gotify.yml
tags: gotify_install

97
docker.yml Normal file
View File

@@ -0,0 +1,97 @@
---
- hosts: docker
become: yes
vars_files:
- vars/gitea-images.yml
vars:
traefik_host: "traefik.comprofix.xyz"
pre_tasks:
- name: Connect iscsi
import_tasks: tasks/iscsi.yml
vars:
iscsi_targets:
- iqn: iqn.2005-10.org.freenas.ctl:iscsi-docker
portal: 10.10.10.2
mount_point: /data
tags: iscsi_connect
- name: Connect NFS
import_tasks: tasks/nfs.yml
vars:
mounts:
- name: Data share
path: /mnt/nfs/data
src: truenas.comprofix.xyz:/mnt/datapool/docker
tasks:
- name: Deploy traefik website
import_tasks: tasks/traefik.yml
- name: Deploy comprofix.com website
import_tasks: tasks/comprofix.com.yml
tags: comprofix_install
- name: Deploy iDrac Fan Controller
import_tasks: tasks/idrac.yml
tags: idrac_install
- name: Deploy MariaDB
import_tasks: tasks/mariadb.yml
tags: mariadb_install
- name: Deploy InvoiceNinja
import_tasks: tasks/invoiceninja.yml
tags: invoiceninja_install
- name: Deploy Homepage
import_tasks: tasks/homepage.yml
tags: homepage_install
- name: Deploy speedtest-tracker
import_tasks: tasks/speedtest.yml
tags: speedtest_install
- name: Deploy dozzle
import_tasks: tasks/dozzle.yml
tags: dozzle_install
- name: Deploy jellyseerr
import_tasks: tasks/jellyseerr.yml
tags: jellyseerr_install
- name: Deploy lidarr
import_tasks: tasks/lidarr.yml
tags: lidarr_install
- name: Deploy prowlarr
import_tasks: tasks/prowlarr.yml
tags: prowlarr_install
- name: Deploy radarr
import_tasks: tasks/radarr.yml
tags: radarr_install
- name: Deploy sonarr
import_tasks: tasks/sonarr.yml
tags: sonarr_install
- name: Deploy sabnzbd
import_tasks: tasks/sabnzbd.yml
tags: sabnzbd_install
- name: Deploy mealie
import_tasks: tasks/mealie.yml
tags: mealie_install
- name: Deploy pyKMS
import_tasks: tasks/pykms.yml
tags: pykms_install
- name: Deploy mediawiki
import_tasks: tasks/mediawiki.yml
tags: mediawiki_install
tags: dockerserver_install

View File

@@ -1,10 +0,0 @@
---
- hosts: frigate
become: yes
pre_tasks:
- name: Base Install
include_tasks: tasks/base.yml
roles:
- role: docker
tags: docker_install
tags: frigate_install

View File

@@ -1,105 +1,116 @@
$ANSIBLE_VAULT;1.1;AES256 $ANSIBLE_VAULT;1.1;AES256
37623630336330623066643530623265303739643661316133316664303338363230353531666263 61356337303265326632383732373461363866656232653431313936346132363664393130323830
6162306264303866393030616532663465343931383264360a336166613163386566623339343963 6362653638386439636436613766346265303962653162310a663564306662643562373234333638
65623639326134373462396532323738383664316433333261336563636333353365643763663363 37303361613632626639653031333932626332663232633861613761376431373537333036663532
6339616662383730370a383736626238643963356666616434323463343639653634323463396339 6131336336366638370a636262643331666261313934663736396265623063336530346562316436
64653432353036326630333362353561616238653531386163363533306139616533616134316565 31613130646433613934656462376262316365333761303135303138616265333463373939366135
61653164346334346564336431346435303330333835303065363631366363313538616366656363 36396266303438396166333631373862663966393339636162633738623131373136613263633738
31653062633135613262366436323234393962623766653466383234353065353130393762636263 62326264633236336333623663626361343830666361333763633638303832613461316363303762
33303739343934383363386161326331336430633434656564306633333337653531356532386163 30313337343336366435373666353562303237336235346261343833616365653464663464333530
31346265383239303834633961376234343365666262656239323137336561356132323630376361 39353464336561623238356336396332383130363333666638343038323830616134613064313765
31626132386562353862396233323835313838333363613531656137336538643335396335663731 39326439376265353132383161396665656534303862396237303866633165363331353832656435
36393534653565393839393033623966626162353865353235613964326536346437306632386365 65323232333539633661653763356133373962326534356638363038643338393534646637646535
39353139343130346663363632376466393938313438326531353466626637323233313665626438 36316534303332363435626331626636306166326166623764336338303262653263316634303662
38366134313966303766306265303864643232306439356264663164356432643731373532363265 66346137383635613861316331393139386139336630336434386662616239633233626637376631
62643039653933333331613031376366636430316436643336623665623663396639626133646138 38383530656264616130666138633162656164653666386639333431643936666364613338376139
39306561633233343931386231616331323839643530626562316462666230336263323533313837 66633734396435386233643266656562376662363763373933383165376230346162643066316430
61623035363536353933346431656134333464336535333239653038306331643463643732663439 30613530626563643231306565333932353533623937393838353866306164653432356533356331
34303030323662666230306334363934613738386138386538343833323964326234616139393838 35633636366164326665343730393935346466636165313236643061396534363466663962623561
65313633306361383365306232373230386433653233323630383332363134636366366661653030 31316230313764343131633862383630373666353032353735663736636261626339623938396531
39353232303731393930656432633261373136353336613966633838373937363865313663323237 39333263613538336261653439333333386138366233363139346164623431373032353832313739
62363639643835303865636632316533336265666138303636623162616464383066336631666361 32383834396531393362613335666634323533306461646137306665323366653034346639333635
36363264393566383466646332336339306264313738616137633938626366383030656631386236 39626237393336346330636162373336383131366266333036353364663831653438653136313534
61393664633563363831333332386332636138323466343034363338626236666130383061303662 39616666613737373264646330383934393264386230666231636636323264626434303532313661
64383561643536653337653738346438396166346634633565646339623361363536656264373035 32396432623366346339393730363531653466376136633332616636326461326466303039313736
63326536633834646663616263343039346138376166336538643035323034306234376139373033 64336165333034333939633836396332363330333232316530393333386161633264646564623831
62356337313063306463323463623764306337626230613236373431663738333862373632666332 63366665626363336137633362323535656466646536366432613161653330303936616638653862
39343262373533303762613136346532663930393562323462383431333163653937386132653562 37306436636435363562656539356666303661313364393365313165613339336636636161616231
61363134303635626331383961633232323931306263396334396239316361383862353566613134 38633261396166643736653262376663313530636130643933343363636135636466366462356332
37373766616264353930663763393763353933656666363963313362333234383530636366383737 32353139336133663234306339646635326462353462376437663761323864656430663532356330
62376566346135326338636436383931633137353530323135343538366566623666633933663433 31653038396630336662383566376435333065373562396634313230323339393439393561356239
38356531346461313834663364343033323262333864626430653939653563366566636661366263 37306531356338343563623539303939323562313035393066316432616434363365303636616438
34363333383435383965353434323764393863666135363462323361656137323931363531376434 65346439356163343263303331656166313661393337393434643839346133313265383164356138
33393938353764343062313234396436653232383033353237646463393536383431626265663265 63313334376438623235353430396532616262353134666438663065623564616164363535363663
31363662383830633165386661653161646264613032323234313631613635313030383339363334 62383039636332653661653961376633646636613565346162323066613337643836666235363166
65343736383133333561363334613362343136623737386663316161666363323731393636343039 32343738393134303434663164366361333162393030366465323031313664643631323862313566
62626662336431303432373866326461656561323961636663376234336638663830316337333432 65666333366339636531653061643262393162653364386539626531383166343262393764613138
61336330633866346533386661643463623539386361623666623965613062306164393766353237 66663337373162636439313333303931323363366438346463663139343437616262346138343036
30393966383332323235313239396437623339363736666632316532666437656465623436343439 63386233383333356661663166313835326238386331323834373731633337323834323466353730
61393635653032633966323465613065343932633231333238386338366161656135656361653962 37636235376164366637343964386164346362616666373631666263653861633935366137313933
66663334363862376663323066323534323262333531366234663161623863386464343436343431 30356335323239323436353265623663383836353766653766323033346139336530353761633061
37313361356534373965643630356430626237653834303861653631316330316361343935323838 65633662376334656662343135396232323437343031643665333063393062616137633930616263
31373436396130326630326533636565396565623664383263383934343062383739323063353966 37386531363233663462313162663534653737626335386539386663653334343731623032333135
31313733616533626538393938386336353930646662313331343134316161353366623932353739 34336436393565646333646536346161626232663066383365303636343062613333643466313133
62653139306439663233393963343666346366626331373962386133336339323838396431333063 63306563393539313530313937393134653635353264386433393763323434346137666564653632
33303563623337383731306234333833323338626361366564653531656133633163323062396465 66356561383031643137363037366630346232323139643164393637383832306439366134666431
64366339343261303566303335353861613862353264373766336365313864333863316634626538 65633366393538376532336461343131613464653134323734613638303864343364386538656566
65356566373563643531613664313633616639343234656537636131643034663539316165346137 66313731616264313733636134396335653037393132343964633631393735366636303535383965
39353331653463646363303038306636383831333931616266613265663930623532373037636261 38366337396537623437616437616532623462323133376637646264646637633630633536376234
33376531393732613561356662613832396133333566633166313630663664373066646361313138 36346465356264333633313335386634356232663436623932306635363939363033346465383934
34663235386639313330643764343339326539316237333766366633666436636432373638616266 30383635636163376130353830643433636630323264303061616535363963353262386432346531
63636165306234653635393936663261383331333361353133383538313461363862313562313935 61393337363833336633363564396563666366393832383937633837626137313063626335373731
36303462356631316437636636643562333265343765633635623664393965333832613561666566 39373339303131333466376631396537646161306537306338313330343331303637383432396332
30636231333666323065336335333964366434323631616330383139663065636130613035616530 63323361326465326230623032613536396166303632646265383938336462663538386566633261
63383937393466326634363138623030333534616464666261656134326439323564356261333638 38636330333939643338646635306564313939373266636532363238336531643662616663616633
39313935376135356363623066323862663665373136316466396338623363326164346363353631 36336262663832383033346563666262336132363261633332333864343265343166363562666464
63303462303832333335663364353866353439376432323232613432366530626334623635393937 39316439343331303233306334356535333439366661353634373064383638303934343236346261
66333262666131633363633432636530303562373935313737343866333364336466306331646664 35653131346665643639633130346464343735373764306465653235306465366533333331376464
63396166643835313431663530663638616436643337373033626538616265356666646433393036 39346430643033653164666266636238656337626437616462346237613936666165373734376637
38373532393731393539653036313363363033343837393635316636306662353964333434306630 35343266393562626561313832646634343564316161346263306365303635383339393637303934
63363435386639316264373632316530636166336563333132616433663164333065613664343966 32313261633738393937386166383666333038616232306534643135316465306163666566333664
61353161623131363630636264353661346430666634623031333562303630383463333238393638 35653738653935656138303233303034383730653765353837656231633865353739383836306461
37363562363034316538303631386136373236623731653336393830633536393930333764393665 34393432373632656639396531396634653932343165326539326134303438613835303566346530
30623731666330623334373136313837323731353738386665653733323466613362356137303365 35303161643439366533663537313465333431356637373164313264653034373330393532623964
66633161663566653331656239643431356465366635346435323636353064613664643864616631 61333738653334313664656330363632303865303139643437373032623766643564383964316537
33383765396333366338313030383532343663323463326466646632386461306663666464313063 61346362666363626135656266316265363162623463613434616663383234306431616134383532
61333936666435323765323361353165326134373165613332613161376264616564313862343262 66386230346437383533316336333162346662646431323731306162643531366461356230653463
35646664643039373335373134613966353635653361383932343439343230653663616436363639 31663434303261663331336639663437303161373533366330306262326366623738306435623538
65326665656130323530326463303766613761396263646364363564303935353739336134303732 35666630656632306163393232343335626331616633326138663830646631376132613435616136
39613639613661393136623035303266653934343163643938313862333538326137646330353832 32346562376236333631353232346430323536313430396263623261316536343562376462623233
61366537313234386334396362616366616435343165313232383534356461326536333563623362 36326164393764343864306563353836363736393564363264386363323531653561343335343766
64373166623736663335653062663234663931646432376337356164613935363333353031623938 34356137623430643562633835613334616539343634316365643438356537306636386133366436
31346332653831383635666463343065376638326535646663393535303638646266363265373835 36613235353837646639643862343661646165353732663166346531666638336662373061313634
66333161663833396135633436623461353237353533363366656436336563326536666532373862 32363530333264393364356531383332356562313236373833613932343435656361653862316162
61383030663263666165373764353232613963666231373636313363366366313231346534613632 66346464393630393831356237666637393331336339323234363137656561336236363530646162
37626630363335386165353766333339363864636437356166363437326233623763326262653663 31663664663265363435306465333037353836356137616264663661373537623361373664633931
65303766623062633964653662326236643461633364383866313165343462303134393738643433 65343863323761366561656137376138303836326231643239363861343439373234323165303562
38636465663730663634353633386639633765313833333336346135393861306166336135303535 38343233623738626631666462343336363466626164633265633730663336316234396635643865
65346434653236396436393736393836366139386338393336376562653536356639653738623965 38326563356664663462616239313438656533383330386339323136633935663936323961386565
33336438343634666563646131653263616135633035326538616530313864336431316131613438 30643164633338353033653635313561306365336433323463626564343765613735373763623463
37646666393636303932663536303163396235646536623632326264313864636465363530626235 63363530393864336365363432316337343638363931643664333062326365396633386133363331
32316330613433366666643665343738616139346434653133646438383663313532383836373730 31643030313965333635373639626232393733353633396438626562313936343439383761323364
31323533666637323062303561353263653134393736373965333030343566316165623266346132 37303366363930333435643365376438613564373834623438663338623633643361383666393634
63666236663565666238666330666561636432636162663535633963633264363836303039666135 63623837356237373934663232616461386639326364343665626131316263353865613936623961
35306561623065633462343335343465636539613631616365396138636437343237373163343861 65363039353933353034393239363637623139623932373938306235633863663931383233333833
65303465396434646133386162373365303761306238303664316638386538393633616131626538 65386262383166353063623862383531613166323537373236626138623438653365303662336638
30303736646236366131663662396131396263636335643936363433373761326365616435666662 65623565343138646231616562376137316434623235643165646236613735613138333663383234
31383265393738383436356334363764613134633138363332313630353031343234633332636263 35383062346435623736646132643832313231633131623036636163353134373135653963343839
33636535636434386238653433306231326566373663323066353931313530353964386265336539 31383839343738346330303332303834336339366435373762376336666533336264386164623137
34336466613466386134363230333366616235623264303533326464636163323766356361373134 35616635313334356465373534333961353663633432383935306366316564353364646561366237
61326137303465356436353738366330363261663533663235626534356463636438626631636161 33623535663064643330343834353866336134613061333035326638323762383665396539346439
33643332303666313939643936636236383430626337393737323566653235383464616335393135 65646338636131373662383334353039643737386531336662396438316264646463356561323165
62333931383033343033626663316464313565646330623033656437633533386633666438363737 63316261666433353039386665626561633264336331623664393632653866666361323537383061
31363565323566613337623131666639306530396165623639366532633063626634623762303338 30386238333532333934366238366236356262626539643831653632343536336462383834623266
61646337663137626531326330303766663665323430363534316135633334376361313363616632 30346465643832343861303538613163313338646431393765323237346262396439373362336139
33366163306564356138656236653764353239366437326562306539653563346461316430353063 39333638356336356165666130613163656161313530346439343630643834656631343635326166
36656537396636363362363631623236393133306164383433353664326536616338663462376266 61343237653264396363366562343963663438663966643031366236623535653335366431636564
35383766613164353838323332383031333633613830663239666438383833626134393636353339 32666432316262636337616336303834663438333361636564613163643437386336326361646435
34323233313430393334303139616433336364373762643363313833653161323739333736393262 31383931346635386131613732653866346466623538353531373139313363323832646565383039
33313635323633643765626366616633386530396232333235383739356535346362303631343235 32616161613366376138313333616534656466663139343834323464633138306138386635306634
63616134393264343834336130343862353964303762313938666334663663363738643234396430 35643839643266373538636136373231666536343562346266303165373834323234636334653037
61613832373165616439636133376138626439363266613439313063646331376531323437313065 34343336376563396138633863366563383235613932666164373539366562396533646435633562
66363839623232626534323236303132663939386238396532363438623861613331643336613731 34333564356161373035636131353863633835386161623664613636356533383861356534653265
63393434336266343636666335336663313236313234353462623564383861333734366530326438 61643432356530303564386434656463376136663138396362373631323030356166356261633362
31323665396531333366393864336431656163633636636131343730356163386537363137393833 66636362376332373461613261366633636664663566393938383161363831626162666234373438
64376336616361653833 34363131616166386465396637313436373037373033353435383534353637333862623063313735
31653031623334396361623339656431363036303465613233653561653761663137613263333431
66393165373934626139353539393032613539666662386561383465646162663134336432313834
32396230376133613965626236343164333962363936333266653737303262626666383633303161
37616162323762646332346330383162666138303763643135313331666538663064393532323633
30633237303736393661666164303233363166653063303436306166303761656534383838646133
37303333643531346564626562333239613737323661633930653030313164663661626261353135
36633333393865643363643763613562363461636638396364383433346434373962303938363739
63633162383162656466383431333163616235303164363535383561383934336535393663313439
32323061653463343236373638343665316363353238396664643737383138313731666537303664
61333239626231613230646531346337663535363565613838353538373532333962666239666662
303632303162656261383365376461326466

View File

@@ -14,3 +14,6 @@ vps01.comprofix.com
jellyfin.comprofix.xyz jellyfin.comprofix.xyz
[internetfacing]
vps01.comprofix.com
vps02.comprofix.com

35
internetfacing.yml Normal file
View File

@@ -0,0 +1,35 @@
---
- name: Install fail2ban on internet facing servers
hosts: internetfacing
become: true
roles:
- role: grzegorzfranus.fail2ban
vars:
fail2ban_ignoreip:
- 127.0.0.1/8 # loopback
- 10.0.0.0/8 # Private
- 172.16.0.0/12 # Private
- 192.168.0.0/16 # Private
- 169.254.0.0/16 # link-local / APIPA
- 100.64.0.0/10 # CGNAT
- 203.0.113.0/24 # TEST-NETs
- 192.0.2.0/24 # TEST-NETs
- 198.51.100.0/24 # TEST-NETs
- ::1 # ULA - fc00::/7 # Private
- fe80::/10 # Private
fail2ban_bantime: "1h"
fail2ban_findtime: "30m"
fail2ban_maxretry: 3
fail2ban_custom_jail_files:
- name: sshd-strict # This will create /etc/fail2ban/jail.d/sshd-strict.conf
content: |
[sshd-strict]
enabled = true
filter = sshd
port = ssh
logpath = journal
backend = systemd
maxretry = 3
bantime = 3600
findtime = 300

203
main.yml
View File

@@ -1,200 +1,7 @@
--- ---
- hosts: all - import_playbook: all.yml
name: Configure all servers - import_playbook: internetfacing.yml
tasks: - import_playbook: cloud.yml
- name: Gather facts (always, even with tags) - import_playbook: docker.yml
ansible.builtin.setup: - import_playbook: omada.yml
tags: always
- name: Prepare all servers
hosts: all
become: true
pre_tasks:
- name: Create directories
file:
path: "/data"
state: directory
- name: Setup base system
import_tasks: tasks/base.yml
roles:
- role: geerlingguy.docker
docker_users:
- administrator
- role: grzegorzfranus.fail2ban
vars:
fail2ban_ignoreip:
- 127.0.0.1/8 # loopback
- 10.0.0.0/8 # Private
- 172.16.0.0/12 # Private
- 192.168.0.0/16 # Private
- 169.254.0.0/16 # link-local / APIPA
- 100.64.0.0/10 # CGNAT
- 203.0.113.0/24 # TEST-NETs
- 192.0.2.0/24 # TEST-NETs
- 198.51.100.0/24 # TEST-NETs
- ::1 # ULA - fc00::/7 # Private
- fe80::/10 # Private
fail2ban_bantime: "1h"
fail2ban_findtime: "30m"
fail2ban_maxretry: 3
fail2ban_custom_jail_files:
- name: sshd-strict # This will create /etc/fail2ban/jail.d/sshd-strict.conf
content: |
[sshd-strict]
enabled = true
filter = sshd
port = ssh
logpath = journal
backend = systemd
maxretry = 3
bantime = 3600
findtime = 300
tags: base_install
- hosts: cloud
become: yes
roles:
- name: traefik
vars:
traefik_host: traefik01.comprofix.com
tags: traefik_install
tasks:
- name: Deploy Vaultwarden
import_tasks: tasks/vaultwarden.yml
tags: vaultwarden_install
- name: Deploy gitea
import_tasks: tasks/gitea.yml
tags: gitea_install
- name: Gotify
import_tasks: tasks/gotify.yml
tags: gotify_install
tags: cloud_install
- hosts: docker
become: yes
vars_files:
- vars/gitea-images.yml
pre_tasks:
- name: Connect iscsi
import_tasks: tasks/iscsi.yml
tags: iscsi_connect
roles:
- role: nfs
mounts:
- name: Data share
path: /mnt/nfs/data
src: truenas.comprofix.xyz:/mnt/datapool/data
tags: nfs_install
- role: traefik
vars:
traefik_host: traefik02.comprofix.xyz
tags: traefik_install
tasks:
- name: Deploy comprofix.com website
import_tasks: tasks/comprofix.com.yml
tags: comprofix_install
- name: Deploy iDrac Fan Controller
import_tasks: tasks/idrac.yml
tags: idrac_install
- name: Deploy MariaDB
import_tasks: tasks/mariadb.yml
tags: mariadb_install
- name: Deploy InvoiceNinja
import_tasks: tasks/invoiceninja.yml
tags: invoiceninja_install
- name: Deploy Homepage
import_tasks: tasks/homepage.yml
tags: homepage_install
- name: Deploy speedtest-tracker
import_tasks: tasks/speedtest.yml
tags: speedtest_install
- name: Deploy dozzle
import_tasks: tasks/dozzle.yml
tags: dozzle_install
- name: Deploy jellyseerr
import_tasks: tasks/jellyseerr.yml
tags: jellyseerr_install
- name: Deploy lidarr
import_tasks: tasks/lidarr.yml
tags: lidarr_install
- name: Deploy prowlarr
import_tasks: tasks/prowlarr.yml
tags: prowlarr_install
- name: Deploy radarr
import_tasks: tasks/radarr.yml
tags: radarr_install
- name: Deploy sonarr
import_tasks: tasks/sonarr.yml
tags: sonarr_install
- name: Deploy sabnzbd
import_tasks: tasks/sabnzbd.yml
tags: sabnzbd_install
- name: Deploy mealie
import_tasks: tasks/mealie.yml
tags: mealie_install
- name: Deploy pyKMS
import_tasks: tasks/pykms.yml
tags: pykms_install
- name: Deploy mediawiki
import_tasks: tasks/mediawiki.yml
tags: mediawiki_install
- name: Deploy traggo
import_tasks: tasks/traggo.yml
tags: traggo_install
- name: Deploy gitea-runner-homelab
import_tasks: tasks/gitea-runner-homelab.yml
tags: gitea-runner-homelab_install
# - name: Deploy mssql
# import_tasks: tasks/mssql.yml
# tags: mssql_install
tags: dockerserver_install
- hosts: omada
become: yes
roles:
- role: nfs
mounts:
- name: Data share
path: /data
src: truenas.comprofix.xyz:/mnt/datapool/docker
tags: nfs_install
tasks:
- name: Deploy Dozzle Agent
import_tasks: tasks/dozzle-agent.yml
tags: dozzle-agent_install
- name: Deploy Omada
import_tasks: tasks/omada.yml
tags: omada_install
tags: omada_lxc_install

8
omada.yml Normal file
View File

@@ -0,0 +1,8 @@
---
- name: Setup the omada
hosts: omada
become: true
tasks:
- name: Deploy omada controller
import_tasks: tasks/omada.yml

View File

@@ -1,26 +0,0 @@
---
install_packages: # Add addition packages here
- rsyslog
- htop
- vim-nox
- git
- zsh
- curl
- wget
- apt-transport-https
- ca-certificates
- gnupg2
- python3
- python3-pip
- nfs-common
- cron
- jq
- sudo
- logwatch
- sendemail
- libio-socket-ssl-perl
- libnet-ssleay-perl
- iptables-persistent
- rclone
- parted
- open-iscsi

View File

@@ -1,26 +0,0 @@
---
- name: Replace sources.list entries for Trixie
lineinfile:
path: /etc/apt/sources.list
regexp: "^deb "
line: "deb https://deb.debian.org/debian trixie main"
become: yes
- name: Update cache for Trixie
apt:
update_cache: yes
force_apt_get: yes
- name: Dist-upgrade to Trixie
apt:
upgrade: dist
force_apt_get: yes
register: trixie_upgrade
- name: Reboot after Trixie upgrade
reboot:
reboot_timeout: 600
test_command: whoami
when:
- ansible_virtualization_type != "lxc"
- trixie_upgrade.changed

View File

@@ -1,17 +0,0 @@
---
# Gather initial facts
- name: Gather facts
ansible.builtin.setup:
# Update system and install packages
- import_tasks: system_update.yml
# Upgrade Bookworm -> Trixie if applicable
- import_tasks: bookworm_to_trixie.yml
when: ansible_distribution_release == "bookworm"
# Move to Trixie sources.list.d layout
- import_tasks: sources_list.yml
# Remove EXTERNALLY-MANAGED files
- import_tasks: python_cleanup.yml

View File

@@ -1,17 +0,0 @@
---
- name: Find all EXTERNALLY-MANAGED files under /usr/lib/python*
find:
paths: /usr/lib
patterns: "EXTERNALLY-MANAGED"
file_type: file
recurse: yes
register: externally_managed_files
become: yes
- name: Delete EXTERNALLY-MANAGED files
file:
path: "{{ item.path }}"
state: absent
loop: "{{ externally_managed_files.files }}"
when: externally_managed_files.matched > 0
become: yes

View File

@@ -1,42 +0,0 @@
---
- name: Remove old sources.list and sources.list.d
file:
path: "{{ item }}"
state: absent
loop:
- /etc/apt/sources.list
- /etc/apt/sources.list.d
become: yes
- name: Ensure sources.list.d directory exists
file:
path: /etc/apt/sources.list.d
state: directory
mode: 0755
become: yes
- name: Create Trixie sources.list.d
copy:
dest: /etc/apt/sources.list.d/debian.sources
content: |
Types: deb deb-src
URIs: https://deb.debian.org/debian
Suites: trixie trixie-updates trixie-backports
Components: main
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
Types: deb deb-src
URIs: https://deb.debian.org/debian-security
Suites: trixie-security
Components: main
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
owner: root
group: root
mode: 0644
become: yes
- name: Update APT cache after sources.list.d
apt:
update_cache: yes
force_apt_get: yes
become: yes

View File

@@ -1,48 +0,0 @@
---
- name: Ensure debian-archive-keyring is installed
apt:
name: debian-archive-keyring
state: present
update_cache: yes
become: yes
- name: Update APT cache
apt:
update_cache: yes
force_apt_get: yes
when: ansible_distribution in ['Debian', 'Ubuntu']
- name: Upgrade all packages to latest
apt:
name: "*"
state: latest
force_apt_get: yes
when: ansible_distribution in ['Debian', 'Ubuntu']
register: upgrade_result
- name: Dist-upgrade packages
apt:
upgrade: dist
force_apt_get: yes
when: ansible_distribution in ['Debian', 'Ubuntu']
register: dist_upgrade_result
- name: Install required packages
apt:
name: "{{ install_packages }}"
state: present
become: yes
when: ansible_distribution in ['Debian', 'Ubuntu']
register: install_result
- name: Reboot if required after updates
reboot:
reboot_timeout: 600
test_command: whoami
when:
- upgrade_result.changed or dist_upgrade_result.changed or install_result.changed
- ansible_virtualization_type != "lxc"
become: yes
- name: Gather facts after reboot
setup:

View File

@@ -1,2 +0,0 @@
---
# defaults file for docker

View File

@@ -1,52 +0,0 @@
galaxy_info:
author: Matthew McKinnon
description: Mounting NFS filesystem
company: support@comprofix.com
# 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:
#
# Provide a list of supported platforms, and for each platform a list of versions.
# If you don't wish to enumerate all versions for a particular platform, use 'all'.
# To view available platforms and versions (or releases), visit:
# https://galaxy.ansible.com/api/v1/platforms/
#
# platforms:
# - name: Fedora
# versions:
# - all
# - 25
# - name: SomePlatform
# versions:
# - all
# - 1.0
# - 7
# - 99.99
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.

View File

@@ -1,49 +0,0 @@
---
- name: Add Docker apt key.
ansible.builtin.get_url:
url: "{{ docker_apt_gpg_key }}"
dest: /etc/apt/trusted.gpg.d/docker.asc
mode: "0644"
force: false
checksum: "{{ docker_apt_gpg_key_checksum | default(omit) }}"
ignore_errors: true
- name: Add Docker repository.
apt_repository:
repo: "{{ docker_apt_repository }}"
state: present
filename: "{{ docker_apt_filename }}"
update_cache: true
- name: Install Docker packages.
package:
name: "{{ docker_packages }}"
state: "present"
- name: Install Docker Module for Python
pip:
name:
- PyYAML==5.3.1
- docker
- docker-compose
- pymysql
- passlib
state: "present"
- name: Ensure docker users are added to the docker group.
user:
name: "{{ item }}"
groups: docker
append: true
with_items: "{{ docker_users }}"
- name: Reset ssh connection to apply user changes.
meta: reset_connection
- name: Setup cron job for backup
cron:
name: Docker Prune
weekday: 0
minute: 0
hour: 5
job: "docker system prune -af && docker image prune -af && docker system prune -af --volumes"

View File

@@ -1,51 +0,0 @@
$ANSIBLE_VAULT;1.1;AES256
66633332373830623139666134663234303066626136383861353962336436383634323261393138
6333336361366430366262383061323836653539643732350a313837653930383637393962363130
39663033393836656538333163303266663061353364316137663035383765363232653735396237
6333653739316163330a626533613330336539626664313733656261336135396466356663313832
39326131336261313162666162316562626434623366663530656130623737643765383362393261
64616465323438656665323864383431373133346537663930353163643330613763623230316162
34636236316263313362616230363161366633636330653937356333633933356539663130333139
39383864313434646233343762633130396536386231643539323661623731626637383262353763
65323865656330633830646563613666333932323131643434623532623366353530633538393362
35383161643363623031386364376435363166306565386530333338363031376134363938666238
65313266366535666563666265386565323532386538366332623334356165636364373462633539
62326664663834643361343933323630366465636537343265626130633735356263393838396639
30666632663034363934363966386130643161313035623862623636343864633665653166396363
66326134323638316539333235346261656263633737333038363233613531666139373236666636
37636638313635336531623835313630316336386464336231626338333033343437316361386432
64363438616634323566336165303066353139396234343932623332653037303533613537306234
38346165623861396434333130306239663462663365313365643636616434366463343565643339
32383538663865353765313532666464613735363764336334323262633133653131383766353934
64326261623833653731356366323138336330396131623836353536306332643531393837613432
63366232653561613862316535306666623631633665613838343965326431353761386161616266
38323064636632646132393666313339623237383437386635316663383734626466376466623438
30303661633932303864326462396364653634306566353234346131663062386337336536366564
30303231643461366334306661626336363737376534663330633634353435396431353563303633
34346361383635353131353063663836343337643961623934663934613161636466613539303836
31363739653739623038303334343364643762643162613866306439653933393866336265363231
37623865316139363139396339363835393461356432626134363433353161626137366136363966
36663832346338393766363234646336663832656438636536333930356532626638366631336330
64313933366166653836313033343637636138653566383264636363626364353766616464386133
66636565663331613036323461616531663834303161306531306539656131343164643261636566
32613738653564383331323266366339663137656138653862633636333465656232613737353961
35306135323132303933383463373262633263613663656162333233393634386364366138393766
65313061326132376335656661616238663464303265383362313237323430316337373732313737
65343531333163333735396132303162353630356535636138633562626234623362636136393862
33643966616465393535383865393762303066353461323133633239383963353162616434333039
30386630343834663632303638306664303832373937663465353233386266633963316331633037
33353435333939356339386235336231343337623230313130333138666231336136623434333437
64333162323237323535643336373939623939303331306433626433396533623339303365393164
66353235653062363164343534303134336330653131333635663834386665613433363464353230
61386564373861323461643439376165636231646632616333333763313262646232626437383736
66316139636532616631396334613966636161653363363333633261616334383034656139393664
33633635356562353238313136376639373962643764653338636336666138323337383933656132
66363663306336663535333737613838653735626535386431356262623462356433336535613437
35356530616365343639656630643063393263626335383461396262396430383839303433376365
34653364663939336361373834386431393163656664633536616530643830633239346261396164
30326138386565646636636539653761366466663461386366386430396331313434616130633364
35386638336536666333633263323030643766323665303763356466393430333336316534306136
61396263323636323835623935336135323363633837363364623664646335623163666131666532
64346164316133393866316561346137383665363532393064663436333637393737656538313031
65653531383830393733663465313437646335316537386530313631636634663564303165366532
6432376363336661313535353436316231666462346364373337

View File

@@ -1,21 +0,0 @@
---
# vars file for docker
docker_edition: 'ce'
docker_packages:
- "docker-{{ docker_edition }}"
- "docker-{{ docker_edition }}-cli"
- "docker-{{ docker_edition }}-rootless-extras"
- "containerd.io"
- "docker"
- "docker-compose-plugin"
# Docker repo URL.
docker_url: https://download.docker.com/linux
docker_apt_repository: "deb [arch=amd64 signed-by=/etc/apt/trusted.gpg.d/docker.asc] {{docker_url}}/{{ ansible_distribution | lower}} {{ansible_distribution_release}} stable"
docker_apt_ignore_key_error: true
docker_apt_gpg_key: "{{ docker_url }}/{{ ansible_distribution | lower }}/gpg"
docker_apt_gpg_key_checksum: "sha256:1500c1f56fa9e26b9b8f42452a553675796ade0807cdce11975eb98170b3a570"
docker_apt_filename: "docker"
# A list of users who will be added to the docker group.
docker_users: [administrator] # CHANGE_ME!!! - Add addition users.
# Docker daemon options as a dict
docker_daemon_options: {}

View File

@@ -1,8 +0,0 @@
---
# defaults file for roles/nfs-mount
# List of NFS shares
nfs_share_mounts: []
# Default NFS4 mount options
nfs_mount_opts: "rw,sync,hard"

View File

@@ -1,52 +0,0 @@
galaxy_info:
author: Matthew McKinnon
description: Mounting NFS filesystem
company: support@comprofix.com
# 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:
#
# Provide a list of supported platforms, and for each platform a list of versions.
# If you don't wish to enumerate all versions for a particular platform, use 'all'.
# To view available platforms and versions (or releases), visit:
# https://galaxy.ansible.com/api/v1/platforms/
#
# platforms:
# - name: Fedora
# versions:
# - all
# - 25
# - name: SomePlatform
# versions:
# - all
# - 1.0
# - 7
# - 99.99
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.

View File

@@ -1,2 +0,0 @@
---
# defaults file for common

View File

@@ -1,52 +0,0 @@
galaxy_info:
author: Matthew McKinnon
description: Traefik Proxy
company: support@comprofix.com
# 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:
#
# Provide a list of supported platforms, and for each platform a list of versions.
# If you don't wish to enumerate all versions for a particular platform, use 'all'.
# To view available platforms and versions (or releases), visit:
# https://galaxy.ansible.com/api/v1/platforms/
#
# platforms:
# - name: Fedora
# versions:
# - all
# - 25
# - name: SomePlatform
# versions:
# - all
# - 1.0
# - 7
# - 99.99
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.

View File

@@ -1,18 +0,0 @@
$ANSIBLE_VAULT;1.1;AES256
33613965373066613539323138336234303066356362393063343234653436393361663464353266
3438373135383330313563306362353061343531336231320a333263656535336265373431663637
39386136303432393335636662626466343639393966623234376366623466623237356464643131
3036363264383535360a303030386464353630306161613239636534313163353563323763663763
33363362313130633430373966653530373562613737343366373136646565623831633839656432
33386563373864326433663130613664376536353337313465326266633265316438613631633061
30363833613032376536346133313566666163303562626366353861626336633530343130373362
38643730303530386139376661383662653834383734396633613134353561633538366365623835
64356530373064396563643763653735313862643335373363386437666138623861653362343930
64346562313533643230373831663036303835343035353036623965636565653331646331303361
30613732313134326339633862333532366163346261313836366362313266303734316431336561
37663463646162363031363662346431386566656331313235343235663732636236666237663265
33336233623636613232333263656266393465333333333330373935346237613337313664346139
66653236633030383835326433633737363931356139313331323731343332663937616235346533
65636331386631303432373831393037333339316639623561313136643139306263303364383535
61633330306630643139616231663134383932306437613138326366386565613030323539306462
6439

View File

@@ -1,5 +0,0 @@
---
CF_API_EMAIL: CF_EMAIL
CF_DNS_API_TOKEN: "CF_API_TOKEN"
traefik_api_user: "admin"
traefik_api_password: "password"

View File

@@ -1,2 +0,0 @@
#!/bin/bash
curl -H "Content-Type: application/json" -d '{"text": "Cloud-init provisioning has been completed on '"$(hostname)"'!"}' "{{ TEAMS }}"

View File

@@ -1,214 +1,214 @@
$ANSIBLE_VAULT;1.1;AES256 $ANSIBLE_VAULT;1.1;AES256
33656232353663376136656237323861386264656230366637393763383262353734303562616237 62333263323564336664383061303137643138343137633638653964323339663833396335633061
3564656335663830313838623264353661303930623131630a636337313932666563653130303130 3631626266393238656561656436373835363931363132340a306238383061373237636261326332
33356365316337393935353234643432356633653734393031323834633863363539383363366461 38633134623234623334353063663730326566373161613466316537393865643334656561656661
6666633038343233320a613437323032376134313837376239363063663032336332396666663830 3662393034326534330a643564323334613665613063313439326666393131663161376366373334
38343339396233313031386131383466303933366163396566346334313831303062363866393131 39366466666230346533363534303265383135373662383839323230623232643634393136326665
65353233346266386434643665663930373730303566613536376461396338323066623138363632 63663832643032393861313835336432643965363530303731393266633932613963366561633932
35396666653961616439656563383562643738373938303964643936613864613831656436356364 34353133656562363866623534326638653535663931313261363238323137386231616365653635
61343639363630376661383861373835383133323236353333636233306637363462386564353033 66303435383832373265316262313162353736383334316338663934623231386330626564613962
64393834353139633262396434376666653934646433393233376166336164333534666537333166 32396363643465346362613537363737333730333666636632616539376339373139353735336236
65313139346464656564356135346262643032303561386332363930326332376532616165396165 61313939346235343339616435633363393131623038386430356537353831626534356130636332
61353466613562633632616435343137333963393938613366616232323535333539353763313361 34313333353930636138663563343338336336366161323266333533316664333039373861663230
35646537376533393036326237623665663437313264653033353432663131376536623338663032 36323733363938653438616433626437663431633933623632383333626336326662373331613865
31323761666563656463663137353762663335393261353336643135356134326363643866363436 61373630633734633030336537646165366233353730613035353062626634666635316566303332
65663739316137363333383665623266323633633133623335633335633362633235613838313462 39343834323662383831646664623363353837373433633763383764636261363666666535303530
32623561376466393866373966333663663830353139336135363761383433376638666465623165 64343236346132633032613865383736346164326238306638343263653865366233313663663839
62343965336664393465353633646135613562316664316631373231626562396236616336633530 34383532343138633066313566346631343032363363396163663235333637623966373337336235
33396364393466353134386164633436316366366430313236656666663561616566343761366531 66303832323333373161346563343562316164376564613237636133626230616564333538363737
38323737373030666231313061626162396666346436326134316565636462393565353833366531 35626234303565343861363939636537316638643866333033303863333538333930346337383766
38316534653036643133636463613563653438373631333666636265316536376134313134313037 35303162626135326434373833663738653833633362663538313062303433383633633531303962
39623733353737303832656164663236633361346137653638326562323837656131373237653038 30326438656332353863326631623861336231643733376665646133353765306136353136346231
37626164303862623364316662363030353536613639396638326565666332393933656566643336 61383335376236336538643637336233343537646538366531623030343134633935333435323164
33383663323466643263623131663530626163343861616138656663626135313562393536326565 33303933316237343565393531383263366137313962363833623133643566306631366166663534
66333763313030303166336461316338353233626632353965303631373962353332396534306461 39653935306265333433356534656561326262363431396139393430623266383339303561303536
34326363303162333135663834613638333531346334343635306438376139643039663537633235 61363165393766313964376336353566316635363834616139666533326663653832313138336235
35393861343336366362666364363037373063666436623236346538373664626433303166616362 37313432383266303636643433656538613331656433633031323364346665396635393133343534
36396538343236656431316536643739396639393663333762376239633535643138386666333335 31363636636435363733303731336234346133353733343237323862393234383162643631623730
61353332313663313864653739636638613031336439396430306633366636643635326633373139 66613061336463643962633763393539356239346432333363616635643435356439613565633061
39653962626638666535373962333565623361303062356531646335336431663062343831386362 33383736336436376535646665366431343034353663656138663937303634303564323538363231
37393030333635316134393634323464623935313836306536653664343866313333666134316237 37376134393731663137623131646236393838363064336536333766613831663761626238653064
62333562313165656634363065643864356137643439313163616437616436336363646263643164 64613836303165353438343861663734313435343431353833613834393530383265366434623162
39316262323862616132366635333438646633666361323361326664333363626461363438323135 63633436653336633366376534616131636530376165346663303865326666323738393634333837
37323136383735656334323762636132323732616637383232343638386232343062666438313136 36636264376162383638323333363837366666393932616136326339393739386565396333393537
34363535303061363264343061633132363335336162656139616263653064306536636366393864 65633139376534633337383963313938373534303863303261633136376265303363663237353263
63336135323162306138616361663232373533306634333831396531363133643838363533383766 36643230636334636162616664656430343431616131336237326534333861376262333237396236
35376237333934373939353662663234353334633266653235373864623337333661666239636439 38356434306136383261633837393864633931613262363065383035303661653662323030363536
64363062366139616534303738613666636332633361376537333134343536623839366364626531 63316261326230386135363362653239333966323438353762666130393265313936383638343066
62393733646639316533363537636161376163633232633436366465623861333663353563363838 37353661346134666662356336323362396662383332386633306431636663333261306164623930
65333037306235326534643536393437623432393862303133316333623836366337613365363032 33303230313961636162356437633135333633376435386462353030613532633066653730383262
63376539353836306130373938616230646638306531643433326265356131346665336333663633 62656135613435363862393833393239333762353731373039303436363735643862653337313364
37656434633933336433323962323561323539653330346231373965653030623066306630323036 39353364323138343163616336613337343466376565303936346163653065326564333761353435
62316431666461343836623839633934323235613436653934356261623566643766346665633066 36623138643863623464336432393930373064313964663934663238366563366630326265313239
65316332393961363439303264306162336236663565386630383039643437646133303239646135 31346333306438333935366330336337616637373239663139343838343263343366626664643933
35356366373030626537313530336531363561643066303232613330656564363335363735363866 65653332316164306466393935363331313761396132373539396430626263653464323236363061
32386165306334623237326464326165356537313364383566373361333535396663626362346465 63613866616462336632313035396438326337303966363831633839346365613061363364326632
35343438323766323437393732666630623262306566326566613938663966306137376237333932 64653335633638353933653764313138363831346235393837343632336533383031623330333863
35346432396165616437346664353235653965326562653561626334306465393565613137633334 33623634636332306233323561323132623631376564346430303861343463353439383433623635
64363264363563313932333936613337346161643135646638346664343336653337313764396434 39353735613336343436316333666237633066313235383163323637353164326161643937396134
35383536353032646239303338393833653563316432393661313436666161373236326231616632 36396437393862623431636538363364333763616138653330333363363130646130316634316439
66313934376361653962653036323837393864653539383332393735663035316538623135336464 62303031663437633335623232613838343636343230353466663165303636386266353530323063
66313864323462633338346166643533633832353862353431376133323130633034376534616235 37333533633734303036643435386236646535343431316535336366333030313336303433346134
65343434373539613233393335386262303731323662323934653864613530396333393730343836 66326439326334666534353137653231366631333437623638633232333761336333323130326264
62316138363530303664306633666438316331313935313433373238303364613964396166623265 35346564316530373338313334386264643236363066633533663334373861663631346266613333
32646639623663323762346130613863356330353661336463333634373962653132356261383834 33363162313832626336633966656136636131363265623232633935396433356337616634666161
64336231333163343538383232343130646233333332303765653564326639616130346666626334 64386439316534616234326231613431363164643362636262623732613562346237656134663464
63363635613965393930613736356263633661326163313839306165663431336332623531383939 35366533633933613133616166396139623263316164323161323666316134303339346535346365
62356230613831353535363064326562623065653663643864323336336437393237633835623235 37336535383265313737306438386630643838303331346238616364626634376463353634373937
36366230316234346430323162346433336133353730653564366131323962393463333830303761 64613734363661306235323438373065626331363539646338376434363632373061383762313861
38333961616537323563306262366463336162633032636435343637383930663739656466333135 34316337393161313666363936376137366632366639373462643330363238336539313832323035
36653765613134646663376663353437303839323738363639636263633532333938613461363466 32306534363866643464386230633865613662613538326233366637393737333961663563653234
33323631333137633364646638656435343633346465623862333635323332336630643738633464 65376364393939333163386134393833643938383866343365316161316362363531646433623138
34313038366665653262386132333038663134306561363762333864613832386631643037343838 32383137313232663831373439366337396430663938313334396336663139646336383262393963
39313863613636343432656561626331343763386561656366353164373164623963356332363234 64373965343465393363363962666662313161323336653139643964313831303764313032336138
36353063313931643033386131343734343239646162393165666162646561333636376337663233 63346534393736663639383666653066353031366566363035393834376538326365616435326137
62376435646562346332363533363165326261613835623061323833643134363435616530613062 36313534333330366230623436343133356431336462643665356162356161633063396435613664
62663630386661373961663031373866316230363639333265346264333565613064643966373135 62353061653862343535656331396366313333373862613535333862646536386166323831623334
33626466616263623239343765386265376464343964626434336133653837333835643932386534 37366466333138393037613135313062633466386237656232393139633936346635663437346237
66333831666238643137643639373865383231383933656364636133616232323866316538343261 34623839343939363561363663356336313231386463656130393163333237633236363931613137
35656236373236646138383238353339353936643531353237383361323665636564366163366637 39643235383561386338356532366236333861656331616338303265393561646136333439373066
33323963316530346162373030336366626230323137613662396462343562303834343563363833 35393137353766613763383963623833383132356266633231643663323733386236346135613635
35643362306432646335616236633431646331636261323636643739303836396166343832623231 37313662363839316336343762613534336432396534303530343930643039653165613437366366
64633938386563396363613737383937616539616139376233336631643236656638353263373732 35366565323063373062396531343430623831333135373264313935333661653535353339333563
65656663633961383763363737316262643133633063326634313633626166653836363930646662 30383933666534646435316262613966633565636232616136313938363633633233323865323639
39303134373532363965396439613864393162373337636338396465643030323332636333333732 30346438393832643431636664383931386163356234343835333130303262653361646432653038
37386435633134653564643566356163316134613861373637306232306532343863643933316430 30303865616366663566303235383565653731336363336632666536313136353130346431373337
32636463346234326432386333636137346331623131613261393038356563333135653365376333 31356339393461366661346530323366396130373932316639346239363263663032633065313338
35353231376237343232666638323938393936663833393736316433326434646131353964353938 33376335363238316265306637623030366565363763393166613464386136663063643165326362
39346536323933303237346263646263303233373038613234393636313261373939636566636433 62343232386235626565366664316565333236383065303036623335643334353366353236656337
65613465623261396639343235646266336237623531306238326265393335393363396565623165 62623263666433353934393334386639326438313866613334353339663737393830663737653833
31303637613466643366366132636130643663393965306162346139626438393033633662383533 33666432333635613634363464376362366566376338616233396364646434303163373532376535
64343136303936363238343161346632343131643738326434363834643037383565383537373534 64633565303038316631343765363632383431336637306563313230623661663231623535333963
37626631333763376130383164326332303836313332626264313033313930656634626632376437 35313335393337313530313262396464353432623731643639633731356630313938313261646236
35656264656138323331643961626264323462306562323638346164363239616330333166356137 37303535626332623333346265633933653835396130376133326465643037626364356138393238
65636533633731653435353864343162636530346539306161353834336136313861646564646434 64353366656462383064636563346332646632383161306238373737323837343535613236343065
66646265636537376261643935626266346334643063663839346234396661323834623665393561 32666638313664376261326531323737363739616337646433643831356561633564653330663138
66313533653532663266326532623636316265613130316463336231343831336333376631653233 38333938333639663438626136633361306330346361666236623430316433643032376430303233
35623562303835383664633662633633613564306661346234303234663136653934366565336235 33346537353532373435656261356263316338373736323166306263306266653337333939653235
30303131623931333739306431376665613664613736326532313238633662643936323362366632 33643763323030396532626266396638613739363862373266633333616566346239356434633763
39313033653566653137303262663230343432653038376265633339613739363232316564356235 39623835346663323933313564613065636338366664363035313061643264346438326564353939
64373633663461613134646433646633393634353337653431646663323734353033346662346431 64653233663333396161643631666437613735356536363737353636626663626435646138306432
34633635343539353733383237333639333138353236613763346234393633323837656237383361 66303361336139626232623132666239333065613038333532323234646466376134306238393065
37643637376264656437376636313034386333306230643036333632636663356363653765313331 36313630353639616431613466623133356339336436353862663631323061343331656435666233
62356461623861623137653530393361636262633561626566316161353665333634316262626165 34613731656539326364323837313537356137373165643964663963616430303162613862356563
32346636646534363737643337363535323530366430373366336563356362366661303330636463 34316436646664306436626462633963316630643162356363636232353038646138653434333034
37643964616538343638303833646265623263653336373237343533373236326136633461346631 34623430343365363365306262333766303433633163336264323235333234336531666361383938
62326334643461356436653535366237653531373239616338393935353166656664393432313735 38663962363538313530616561636563303666323130633437363833373436633834646333336239
34653031353730636466323966363139633833393066303531313934366263313831346534386530 32386439333564333061393934613064666362373134326530646131626539633736646137663434
65616161623134626230393231313866616133613338616335333763653436333366363438353139 33626130323939303863323339383330643535366531313230326666643737666333366663333438
63363430626230343638333866653165646638616435383038653936373436623566303666626461 63306361663037616630356365613137666564393265626662663837363739343030326465373039
63333730663937346166363136353466373832303939373139393035393230383937393363646365 63393333363066303464343435356130303434623031313661623365613130636261303636356631
35303432393739383034316237653033626265643338376639336364626431636333316136666531 64643130393962626366643366316464643136633037626361303732303736613932646632313431
34346566326139316365393561636165396361626637323335636165656161363461366632326330 64356563626262396365613037383465353863326364656637663536306262396330383666383334
31616535626335663339373034303064623035613131333562643934393665336537646535613732 62643632353235336366343163353732303464393236613664393838356432306664636264343564
33643733366463666464633564326461653237316436643831396163306633333334313263333333 64636237373061333339653430383034613363306566643466313133363864376137383738326265
66653434386265326563633765653534346138396433336232363133656632343164373638653065 63353137383266613337363835303636343663316632613733376435396339623765613935643735
61653737376134653630306139366530313566666133643634626631353463653834616239636662 37373465376339356338353561393430663366353766653136623861626538376435383630386635
36373365343530393635623366633162653362326237643236323862326132363236303837613837 33356563396332316363353031613664656366303431626637333437666262303265333436356161
39643135613263613532366537396337323533313538326664363039663638323564303764306337 62346537383535633838366439623666366564303738373066313663326239336266393331373535
66336166386638336338376534346338303832643134366662626466363535313530333430313162 37643465376462636539323366336338303364303735303234383339653066386633356564636336
33333961353437373732653431333430336632363033343661646361393962303636643764343330 33656338613464356561666562343266383963303031306430396438636261646564613234353336
39643061306533653564646232336639633935303366613435623030383437623165316433633335 35313732373866363665666462313163343164666263333431613963366361383037633165343535
35663337623938396561616266383634376663633565343763626131303430313339313236396362 35376561616331303364613166366161383936336464366635613334306238333763653563323131
39363831646435343338383530663064386262333030383364376330616362633333363532346262 65373862393834383936626461396634653838633862626239343239346237373035373639336533
31663135373464363238373231326163353834306233376436663663306666346437666162323835 62346262306232386334323162323930396562333034343062346165313063383065393033663365
38333564343663626365646231346338363261623664656232323732313034626436336161383830 38326232656463633761653563386334316464303565623562653032613532383565663130646132
38616132616165346366396566653664303631386133313032323431343530386135313933653432 64646464633665613532613736653139306336636635643566643430373732346664303231656465
65346436376232633639316338623434353639373163643939386166343437366637383262626139 65353831396138363163383237313939353436623231376337313236353565616239326165356163
37333031646264333139336664383636643663643630613761326661313935333361333131353630 32313135333339343062376565376464363431643263316664373436656234326235393166643931
31396337626565663538396439303332636231363266383037646562636163393761613332303036 33626335383934393834333762653061326165373535353764643137633465646530653764303432
35656236373839616663376231323930316636363133626639623538343136656561643063306539 64386439663130396639383030363238373462386265356631363862646230366132626132663131
30353961363234643134306633343930653431613034373464346139303232653337323864303166 31653539306236376666633136363164356232636637333632653430343931313532636335303662
61346364393765633431393037623138623038393236666334356430373830643965346661663537 35323636303963343330626132303665636334353264373035626635366235393739623836626134
30666133633864373034346639343036663630346261373361313039643263626164663635376661 64323532313633353139336662643336613166333334383261656133626436646163336663393436
66653633646339363263636334346131623662356335383466366164326435303135303336323732 66613436393531386133343063663332636166633534313439383865366132353334633237393931
33333831346633633563663065386661643035363336323262306131333262633063376530643738 31306131356432633738666330626339383730663535626532396563356133353465353132633933
33313939616334656464643238663962633635323636316361653363346231366131356661666162 33663136626362306235313636386534623063656432303332313163353635343839306632366163
33363836366666353735663336643836656663336639306262383765313435626633616263353132 36363133666333613430316333376166363832303566643631316237383866396531643132333439
35363166326165343539646336623933666636333236633863353266386162313134396135396538 32623438633862663430396531383634643631366337643130653961613231323030623132623039
31346337396633613930376166393064373161373432656136303633306566306433343630663631 32303938636264343134656464323938303565626134343632633862356632646639633065323638
33356533643163313039336565333633303937363634616535623434663066353566383735343637 63393862303465633035366439323439396163326563383736383833306335313834376166353835
64666166616462653337303731326366353261313661663762343563666565326566663065616339 38626533343431663137343363316238356431323964643738326236383233633136343765386235
30316235333738373630653635353462636137346538303462643632653664306635626566376464 65313464333264616465393334613634323761613634323739326636323634396361633761383031
65666266333937616461616233646130326231386662393166623463636139653839613030613964 33663330333365313262643039633238633664356132653865336136323234616262343364383361
35396535636637366232383764353835616233316538326237303862393463643934383439366562 61653365636462633031626164373061376439626665383530666632366365623630623235343730
64613033613265393930643464373939346533353331366337323131643932366161366636666630 38666139386566323235356361626231313261306337663039343564393733633061633034303531
34393863363337636561333931306362663936353565376635663262656133626530653233363635 33376565626634396333393265346464323330613364323732616366666261326234336239316364
65396462666431386333613761653738346438656330326464666430303162303263643632326561 39353862663935363361313731383861313637663533343463306262613962646466383562653463
33363135633961356137663631366665346533633562663664303837373730346236376132323735 62313263396236656262323861626263363865666438633338313732653463396665396535343235
39326137313437376434636436626335333134666163376231623130306634636330366236386139 31383563663831663339383532353032353136666366393462643864653638616539356432353933
32333563616339616536363430663362633537353661653136326131343437343738393330333966 33663639346433626265313334633137633339393061623539656361663739646630386466623632
63383265623961633864376465633232663536373962386631623161663063346463623339613534 61316333343030366262316666393138346533383763336165663163363530393464363531646132
30626165303866346437383364633066326330323165646561623538616235383234343234346334 38393061623064353839353165613035333335333835666666323236623931306137666263656464
31623961623762373966396235373161643738623631386462643764393366613937323738646235 38363337633534303262353033366332353065613333313362646137356532383637336636393039
34316638306663656137353366393261323132613839633733313336346633303939653231666664 32333462616134393137333661383564623336366336633839663264626238366530353965373433
62353232633131303631393035346239363936323633316366346631323362306238363365386134 34633661343962316466313962393533363062666339656235353531656263396265336630623634
63333837383734386130653061393966616463643234656566393238383035663765373837613561 64303561636239343039353062353763323337373564373761623866363833373331376233363538
61303035653762623536343630616465663166383266363865353137633034626131643863663261 30666532313532643931353464633536626534303331393237346635653332386233306161666138
61376464386434626139316532313133386132396338376232626466356532303566646138376662 37366338643839663961666132383537643736333833626364666264376431386137346137663339
34646462373634626333346166316232316663346330613237343439323564306266313632633264 66363930306666303330653266343364356463353537383033303836613133656464323165626232
39646436613033313865643038353933383431363461313537646463633963396237356336333931 33366239623736336361373635383466613031376138306530316632663165333836343337663562
33336364363836343863356565636436346236393435306638323531336263303562633932373230 37353761626665333132653734363034616236353065613863343365663532626632323131323536
36653337343930396163643663363333373563356261633833633137386134326138353536656134 64623639633236383437323532333832653462366662303931626331386534346338643936343834
64306530613632653535613535653266333639363334343339303436393163666431366164343834 63346531306333306466333733396164343238386261396261316236366433626533373066383130
65363031333533613930306433646333353232613336633230373563656361356538653366333130 32663132666565656537383134393165376636313663646465346662653537323432343261363962
61636665663234373430313965336334326366353163626265353063323735613766366662326634 36396130373636303566373334366364306266663963336663343038366236373732303039336136
37343763316431323733333834643466653638663464636232333664666337323739396539386366 63653035373233346139363935643061346464396465653461393232343966623038363639633761
65376566356233363064313138313035613765613035353838353265386264653136363235323031 65633665363638613636326434316239653533383338393664326532346637373431316237646365
34643830633361613265613732333766376363633165333866383637306438316430346333313430 63363365323066303366646634313138643061656361666131613662343662383030346363366465
37313230393139623633346666326566616465663638326164343764393666616166393363393365 35313264373536303832623038323032373936656365376261636537353965316664346234313531
36306636356333643333623334613961626132363135636630663537386230626532313262666565 36366361646461636261643163633762666664313032613530393063343262666663613464313964
64623135393063323239653930386463383065656262303365663536376136653139336331633332 39343664356232623935663439303733653434633466353335636336393833353436323136336563
64303663656136313430643231306638616361326461616666623234636366363436373464366366 30363936623032666364313537313330663366633031633531323235333663313136323633393731
36323733613730313233623466353765353962363934363230353231373265363435363135613338 36626534643765353961356361336464646534393031346137383530343063393035383630306462
64306236396561643064616631373366316162386538393734336263623033396564323665376465 33333837623133393762363735306431666537616535393630383430393339333432316136313337
63373462333865646265666161393263633632343537626438383833376164383635393566336539 39646562393464316334313965313964616435346465653563376139336238386265613931396362
61363666306466616334363561633561363435386537613233383965353330306337396663663631 32343232316634343331383733623738323962646566326230363466363461623266623135613865
33333335396432343365353430613662386330666464636266333731653661363833386234383763 61366630643962613031636361393837613636356533666139623261396337376435353661303934
36343330653533636361386536643339336630373338653333643736613062366439613031623238 64323163663135313830376662656136333032646332303737343861383431646363386661393664
32383463306165343538373765643939623361326263323838333333376462303762633134653635 38393436363931666634333166616431623437303331393263633139353836353031613936323763
37356236346462316466366461333730626333633539393035313264353162333931323365333962 30633266663764653862663231383536636463653464333263373665646165376365363834633063
39303261343566633735386665396134646537333866613532653065383463303062353930386430 64333662616237353062376133323164393338303461336435376635613063313034353862396231
65336666333561373466313066313135333732646262613063333866356336396130633330336434 64346335346430666464653933363564313964666465376564383530366130383039346361313662
32656365643464376431363161633732633064396336643134323338623731346163633039626665 34303063613961353866336632613364623737646635373062346266323630656666346166666639
35333062626233653733336563323864333666396361613564306534666633353466613434356632 34343466376232353534353465656334303364323061343138626638316334336637653936306438
39376233646134363263643164393766363730656161623666313862373566646462396365626234 33303937383431376562373339656364633233386432373039326639353861336338343561643166
35366132363264326463303932316561643939623732333939633466383234633763393435396135 65626334363739366634396363383061646638346138653132623364383764383262616635336161
34363734343466393930653436323861396334663966333533626165316562653730363262313065 36356337343366343366653037656466653063646361383438373063653739626435393835656336
38626666643639323462376639303862336164333065336534373337313133346563626635313534 34643665323632383562643638376538643439613430333436336561643738613563653634376135
33646662303831633130613938393231613062643165323464346462643764386461373637323636 30616537303333653535306234633166363864343165643038376264643431613532646566366433
62663437313135383339653065626465616564303539663363373964366334393339396361626635 36386164326463333437313337613236653831323032616262336464383332323863323563626135
64343430383661356237646630363362623033326133393236336136373165366666653762626637 31663264303362303165326466346266653232623166313937323134663936363933636230626166
65356630303135396263626139363331313038363064326436346436353765356431383165313337 35306533323537313637393438383031623935663861306535393132323762613063326232366534
34626633353166626663333431653436386337656365336133623662623433393364626536643438 39313837343537616436643732383762303261616630653732343230316336633663303736333664
33353666643934633066323565363963626138393066656632333466636632356438346165303462 38353939653139303633626437306361613863613534363864303838346164656561373262323764
30383032366539313039633335323438616234613233303435373833353864336138663165326331 37313035386137363864663537616530363135366461393732316564656165326339663165613466
61376330313132326530613634316333633339353066626238343361333666616231643031343566 33356631373365313138353634323461666532663736363238626564306663333166396366616332
63323232643238393463373264643934353630666165636339303933393264383832663764623437 30363765303435633462656532663539636132353062633961376339303464623236633930376439
36373262313934346562633333363861646539343666353532343938363366396464623436636434 63633034303230343061373865336262666234353265616565363638613661343331356163313765
38393439393937346263303430366263633566333336373265393837363639666464653538343930 36623730353936316436333334353564653366386533356566396134343364393539313235306335
61306163633339613838356661373131376165323664363366633663666633373134383162313732 35343464313730633662326261393330326333356565653138336230323066663465613236346530
62383433383362346135633435313563653466383864323236653164303262366363356238333363 66323033336363303363643338346663383036386130643730363963303663646233373636386636
65333936633365663134383364643962313739313735383665323762313131616161393266343336 62363234353838613865313334313632626133323934633734316633643938316532626161396531
64623930633932623464306438383039343133356235336132633936633562643165343532333564 61386661623735396565663936613030623036306565373862353536323231363433303865366365
66633339643837366339316631346561616331353961613333363037396264663866633831383932 32626630643033633364653330313134353938353261366237326138326631373738343537643461
66633863313535663138303538653131666665343038396430386435656666393966633436633866 65623135633332393939383530633738666233323830663366373965396535366330333630386235
63366366653364356161616134613130303438613065643731313538393862363436393831323335 32343730363431343161376566646237363238646463376562323939316334306463393834613562
33613063663162393338313136306262396634653535613030663136326232316364376333313962 63323136396431393537633632396466336433306231306336663734633464376435366430363563
66343737646161643062353336373835613662636133363437656239623561346433363965663136 63313632363438646664343935393037636565646437316366653535653139373435623331376338
34653837373535663564303932336439643162643135653936316361363566373265616462643763 37613863316561373663343937386535303962666537373462363039333130653437373434363432
32643131663263353365316438626663623736353863373236646530353263623432393664363139 64323936313666353937613931366537616134613864666334633261616130656636303561666232
31663331336233396639636133626333306134343232633866383030383462366533633461306131 36666163303137346438323862353761633032356539613035613434393330316335396231376432
39393430346539323861393863306539613566666361376231613566346231326164376432303536 39623330383338373938663130363830346232316430376137636231323539626666343730663732
38393930383335653133326236656630643233396465643233336632666130623034316332633930 61353165373636363338346161356662393665323666396333356238373762393766626161316636
30396336643231653264333166653636663630643933343534663833646532323463363165326265 31633235333132323766353937653733633731636635616138383761666130373465633232653831
66333837643664333230646236333339663732313532353838643638373237653636303433336139 30303031656434346630623232386530343837353163666631363133373239316561306262383164
37353334393363363936383533623962303539343834316561643230393737343837646264623538 61656437626261663936666336346234303161363361393736353736393339313534343161363864
64323364386635646531633938373161373832363439376530323861373437396365656437353264 65333861666662343263313330366137303636663262663633633636343830373863636638383131
65643635656337336337623762373935613036356231356463613833393435326364373063353236 62336265303262613063633963646562373738376337656133616435333136333137396561313538
38663137626331643462313733353563623237373664333234353832653030626435303535346263 62316137373935653230643731663161303137353264326562653731656361353333323236343261
61373765376239333232616431643031333638626532326565613339346362626361353263306535 31646237396237393261313437643335616534316630623831633162383830636631623763353165
37613764623537393730666364336264623434323739336235626237396137653637373839323930 31646363323464663636656433613563386434656563396264616133363761656163383162353162
61386530656339363064323762376536333230313666356639363462633562646231656533646661 32323837646632646530346434633234636539303934376537643730643134663337356237303738
62303265373962643838303236616538653731613962393136303861366637643535396666663336 36316265643462393137663661346338353238323538666238643862346437313465326630643363
3864 3062

View File

@@ -5,7 +5,6 @@
image: amir20/dozzle:v8.14.4 image: amir20/dozzle:v8.14.4
restart_policy: unless-stopped restart_policy: unless-stopped
command: agent command: agent
recreate: true
ports: ports:
- 7007:7007 - 7007:7007
volumes: volumes:

38
tasks/OLDmssql.yml Normal file
View File

@@ -0,0 +1,38 @@
---
- name: Create directories
file:
path: "{{ item }}"
state: directory
with_items:
- "/data/mssql"
- "/data/mssql/data"
- "/data/mssql/log"
- "/data/mssql/secrets"
- name: Pull docker image
community.docker.docker_image:
name: mcr.microsoft.com/mssql/server
tag: 2025-latest@sha256:2c80e548ef65fb65a8ca23c3a74ed60e0964ea709f46d07c97ccaf7c437e2cc6
source: pull
register: docker_image
- name: Create the mssql container
docker_container:
name: mssql
image: "{{ docker_image.image.RepoTags[0] }}"
user: root
restart_policy: unless-stopped
ports:
- 1433:1433
env:
PUID: "0"
PGID: "0"
ACCEPT_EULA: "Y"
MSSQL_PID: "Express"
SA_PASSWORD: "{{ SA_PASSWORD }}"
volumes:
- "/data/mssql/data:/var/opt/mssql/data"
- "/data/mssql/log:/var/opt/mssql/log"
- "/data/mssql/secrets:/var/opt/mssql/secrets"
when: docker_image.changed
register: container_mssql

View File

@@ -4,15 +4,14 @@
path: "{{ item }}" path: "{{ item }}"
state: directory state: directory
with_items: with_items:
- "{{ data_folder }}/osticket" - "/data/osticket"
- "{{ data_folder }}/osticket/config" - "/data/osticket/config"
- name: Create the osticket container - name: Create the osticket container
docker_container: docker_container:
name: osticket name: osticket
image: devinsolutions/osticket:1.17.5 image: devinsolutions/osticket:1.17.5
restart_policy: unless-stopped restart_policy: unless-stopped
recreate: true
networks: networks:
- name: proxy - name: proxy
env: env:

View File

@@ -3,7 +3,6 @@
name: comprofix.com name: comprofix.com
image: git.comprofix.com/mmckinnon/comprofix.com:latest image: git.comprofix.com/mmckinnon/comprofix.com:latest
restart_policy: unless-stopped restart_policy: unless-stopped
recreate: true
networks: networks:
- name: proxy - name: proxy
labels: labels:

View File

@@ -1,29 +1,29 @@
--- ---
- name: Create directories - name: Pull docker image
file: community.docker.docker_image:
path: "{{ item }}" name: amir20/dozzle
state: directory tag: v8.14.4
with_items: source: pull
- "{{ data_folder }}/dozzle" register: docker_image
- "{{ data_folder }}/dozzle/config"
- name: Create the dozzle container - name: Create/Update the dozzle container
docker_container: docker_container:
name: dozzle name: dozzle
image: amir20/dozzle:v8.14.4 image: "{{ docker_image.image.RepoTags[0] }}"
restart_policy: unless-stopped restart_policy: unless-stopped
recreate: true
networks: networks:
- name: proxy - name: proxy
volumes: volumes:
- /var/run/docker.sock:/var/run/docker.sock - /var/run/docker.sock:/var/run/docker.sock
env: # env:
DOZZLE_LEVEL: "trace" # DOZZLE_LEVEL: "trace"
DOZZLE_REMOTE_AGENT: "omada-lxc.comprofix.xyz:7007" # DOZZLE_REMOTE_AGENT: "omada-lxc.comprofix.xyz:7007"
labels: labels:
traefik.enable: "true" traefik.enable: "true"
traefik.http.routers.dozzle.rule: "Host(`dozzle.comprofix.xyz`)" traefik.http.routers.dozzle.rule: "Host(`devdozzle.comprofix.xyz`)"
traefik.http.routers.dozzle.entrypoints: "https" traefik.http.routers.dozzle.entrypoints: "https"
traefik.http.routers.dozzle.tls: "true" traefik.http.routers.dozzle.tls: "true"
traefik.http.services.dozzle.loadbalancer.server.port: "8080" traefik.http.services.dozzle.loadbalancer.server.port: "8080"
traefik.http.services.dozzle.loadbalancer.server.scheme: "http" traefik.http.services.dozzle.loadbalancer.server.scheme: "http"
when: docker_image.changed
register: container_dozzle

View File

@@ -1,42 +0,0 @@
- name: Create directories
file:
path: "{{ item }}"
state: directory
with_items:
- "{{ data_folder }}/gitea-runner"
- "{{ data_folder }}/gitea-runner/config"
- name: Check that config.yaml exists
stat:
path: "{{ data_folder }}/gitea-runner/config/config.yaml"
register: configyaml
- name: Create config.yaml file
file:
path: "{{ data_folder }}/gitea-runner/config/config.yaml"
state: touch
mode: "0600"
access_time: preserve
modification_time: preserve
when: configyaml.stat.exists == False
- name: Create the gitea-runner container
docker_container:
name: gitea-runner
image: gitea/act_runner:0.2.13
restart_policy: unless-stopped
recreate: true
# dns_servers:a
# - 10.10.10.1
# - 127.0.0.11
volumes:
- "/etc/resolv.conf:/etc/resolv.conf:ro"
- /var/run/docker.sock:/var/run/docker.sock
- "{{ data_folder }}/gitea-runner/config/config.yaml:/config.yaml"
- "/etc/hosts:/etc/hosts:ro"
env:
CONFIG_FILE: "/config.yaml"
GITEA_INSTANCE_URL: "https://git.comprofix.com"
GITEA_RUNNER_REGISTRATION_TOKEN: "{{ GITEA_RUNNER_TOKEN }}"
GITEA_RUNNER_NAME: "homelab-runner"
GITEA_RUNNER_LABELS: "alpine-latest:docker://{{ alpine_latest_image }},ubuntu-latest:docker://{{ ubuntu_latest_image }},homelab-latest:docker://{{ debian_latest_image }}"

View File

@@ -4,14 +4,21 @@
path: "{{ item }}" path: "{{ item }}"
state: directory state: directory
with_items: with_items:
- "{{ data_folder }}/gitea" - "/data/gitea"
- "{{ data_folder }}/gitea/data" - "/data/gitea/data"
- "{{ data_folder }}/gitea/db" - "/data/gitea/db"
- name: Pull docker image
community.docker.docker_image:
name: mysql
tag: 9
source: pull
register: docker_image
- name: Create MySQL DB for Gitea - name: Create MySQL DB for Gitea
docker_container: docker_container:
name: gitea_db name: gitea_db
image: mysql:9 image: "{{ docker_image.image.RepoTags[0] }}"
restart_policy: unless-stopped restart_policy: unless-stopped
networks: networks:
- name: proxy - name: proxy
@@ -21,17 +28,22 @@
MYSQL_PASSWORD: "{{ gitea_db_password }}" MYSQL_PASSWORD: "{{ gitea_db_password }}"
MYSQL_DATABASE: gitea MYSQL_DATABASE: gitea
volumes: volumes:
- "{{ data_folder }}/gitea/db:/var/lib/mysql" - "/data/gitea/db:/var/lib/mysql"
when: docker_image.changed
register: container_mysql
- name: Pull docker image
community.docker.docker_image:
name: gitea/gitea
tag: 1.24
source: pull
register: docker_image
- name: Create the Gitea container - name: Create the Gitea container
docker_container: docker_container:
name: gitea name: gitea
image: gitea/gitea:1.24 image: "{{ docker_image.image.RepoTags[0] }}"
restart_policy: unless-stopped restart_policy: unless-stopped
recreate: true
# dns_servers:
# - 10.10.10.1
# - 127.0.0.11
networks: networks:
- name: proxy - name: proxy
ports: ports:
@@ -41,7 +53,7 @@
PGID: "1001" PGID: "1001"
TZ: "Australia/Brisbane" TZ: "Australia/Brisbane"
volumes: volumes:
- "{{ data_folder }}/gitea/data:/data" - "/data/gitea/data:/data"
- "/etc/timezone:/etc/timezone:ro" - "/etc/timezone:/etc/timezone:ro"
- "/etc/localtime:/etc/localtime:ro" - "/etc/localtime:/etc/localtime:ro"
labels: labels:
@@ -51,6 +63,7 @@
traefik.http.routers.gitea.tls: "true" traefik.http.routers.gitea.tls: "true"
traefik.http.routers.gitea.service: "gitea" traefik.http.routers.gitea.service: "gitea"
traefik.http.services.gitea.loadbalancer.server.port: "3000" traefik.http.services.gitea.loadbalancer.server.port: "3000"
when: docker_image.changed
register: container_gitea register: container_gitea
- name: Create directories - name: Create directories
@@ -58,64 +71,24 @@
path: "{{ item }}" path: "{{ item }}"
state: directory state: directory
with_items: with_items:
- "{{ data_folder }}/gitea-runner" - "/data/opengist"
- "{{ data_folder }}/gitea-runner/config"
- name: Check that config.yaml exists - name: Pull docker image
stat: community.docker.docker_image:
path: "{{ data_folder }}/gitea-runner/config/config.yaml" name: ghcr.io/thomiceli/opengist
register: configyaml tag: 1.11
source: pull
- name: Create config.yaml file register: docker_image
file:
path: "{{ data_folder }}/gitea-runner/config/config.yaml"
state: touch
mode: "0600"
access_time: preserve
modification_time: preserve
when: configyaml.stat.exists == False
- name: Create the gitea-runner container
docker_container:
name: gitea-runner
image: gitea/act_runner:0.2.13
restart_policy: unless-stopped
recreate: true
# dns_servers:
# - 10.10.10.1
# - 127.0.0.11
volumes:
- "/etc/resolv.conf:/etc/resolv.conf:ro"
- /var/run/docker.sock:/var/run/docker.sock
- "{{ data_folder }}/gitea-runner/config/config.yaml:/config.yaml"
- "/etc/hosts:/etc/hosts:ro"
env:
CONFIG_FILE: "/config.yaml"
GITEA_INSTANCE_URL: "https://git.comprofix.com"
GITEA_RUNNER_REGISTRATION_TOKEN: "{{ GITEA_RUNNER_TOKEN }}"
GITEA_RUNNER_NAME: "gitea-runner"
GITEA_RUNNER_LABELS: "alpine-latest:docker://{{ alpine_latest_image }},ubuntu-latest:docker://{{ ubuntu_latest_image }},vps-latest:docker://{{ debian_latest_image }}"
- name: Create directories
file:
path: "{{ item }}"
state: directory
with_items:
- "{{ data_folder }}/opengist"
- name: Create the opengist container - name: Create the opengist container
docker_container: docker_container:
name: opengist name: opengist
image: ghcr.io/thomiceli/opengist:1.11 image: "{{ docker_image.image.RepoTags[0] }}"
restart_policy: unless-stopped restart_policy: unless-stopped
recreate: true
networks: networks:
- name: proxy - name: proxy
# dns_servers:
# - 10.10.10.1
# - 127.0.0.11
volumes: volumes:
- "{{ data_folder }}/opengist:/opengist" - "/data/opengist:/opengist"
env: env:
OG_GITEA_CLIENT_KEY: "{{ OG_GITEA_KEY }}" OG_GITEA_CLIENT_KEY: "{{ OG_GITEA_KEY }}"
OG_GITEA_SECRET: "{{ OG_GITEA_SECRET }}" OG_GITEA_SECRET: "{{ OG_GITEA_SECRET }}"
@@ -131,4 +104,5 @@
traefik.http.routers.opengist.tls: "true" traefik.http.routers.opengist.tls: "true"
traefik.http.routers.opengist.service: "opengist" traefik.http.routers.opengist.service: "opengist"
traefik.http.services.opengist.loadbalancer.server.port: "6157" traefik.http.services.opengist.loadbalancer.server.port: "6157"
register: container when: docker_image.changed
register: container_opengist

View File

@@ -4,15 +4,21 @@
path: "{{ item }}" path: "{{ item }}"
state: directory state: directory
with_items: with_items:
- "{{ data_folder }}/gotify" - "/data/gotify"
- "{{ data_folder }}/gotify/data" - "/data/gotify/data"
- name: Pull docker image
community.docker.docker_image:
name: gotify/server
tag: 2.7.3
source: pull
register: docker_image
- name: Create the gotify container - name: Create the gotify container
docker_container: docker_container:
name: gotify name: gotify
image: gotify/server:2.7.3 image: "{{ docker_image.image.RepoTags[0] }}"
restart_policy: unless-stopped restart_policy: unless-stopped
recreate: true
networks: networks:
- name: proxy - name: proxy
volumes: volumes:
@@ -24,3 +30,6 @@
traefik.http.routers.gotify.tls: "true" traefik.http.routers.gotify.tls: "true"
traefik.http.routers.gotify.service: "gotify" traefik.http.routers.gotify.service: "gotify"
traefik.http.services.gotify.loadbalancer.server.port: "80" traefik.http.services.gotify.loadbalancer.server.port: "80"
when: docker_image.changed
register: container_gotify

View File

@@ -4,8 +4,8 @@
path: "{{ item }}" path: "{{ item }}"
state: directory state: directory
with_items: with_items:
- "{{ data_folder }}/homepage" - "/data/homepage"
- "{{ data_folder }}/homepage/config" - "/data/homepage/config"
- name: Get dashboard-icons - name: Get dashboard-icons
git: git:
@@ -13,22 +13,27 @@
dest: /data/dashboard-icons dest: /data/dashboard-icons
update: yes update: yes
- name: Pull docker image
community.docker.docker_image:
name: ghcr.io/gethomepage/homepage
tag: v1.5.0
source: pull
register: docker_image
- name: Create the homepage container - name: Create the homepage container
docker_container: docker_container:
name: homepage name: homepage
image: ghcr.io/gethomepage/homepage:v1.5.0 image: "{{ docker_image.image.RepoTags[0] }}"
restart_policy: unless-stopped restart_policy: unless-stopped
recreate: true
networks: networks:
- name: proxy - name: proxy
dns_servers:
- 10.10.10.1
env: env:
LOG_LEVEL: debug LOG_LEVEL: debug
HOMEPAGE_ALLOWED_HOSTS: homepage.comprofix.xyz HOMEPAGE_ALLOWED_HOSTS: homepage.comprofix.xyz
volumes: volumes:
- "{{ data_folder }}/homepage/config:/app/config" - "/data/homepage/config:/app/config"
- "{{ data_folder }}/dashboard-icons:/app/public/icons" - "/data/dashboard-icons:/app/public/icons"
- /var/run/docker.sock:/var/run/docker.sock - /var/run/docker.sock:/var/run/docker.sock
labels: labels:
traefik.enable: "true" traefik.enable: "true"
@@ -37,4 +42,5 @@
traefik.http.routers.homepage.tls: "true" traefik.http.routers.homepage.tls: "true"
traefik.http.routers.homepage.service: "homepage" traefik.http.routers.homepage.service: "homepage"
traefik.http.services.homepage.loadbalancer.server.port: "3000" traefik.http.services.homepage.loadbalancer.server.port: "3000"
when: docker_image.changed
register: container_homepage register: container_homepage

View File

@@ -1,10 +1,18 @@
--- ---
- name: Pull docker image
community.docker.docker_image:
name: ghcr.io/tigerblue77/dell_idrac_fan_controller
tag: latest
source: pull
force_source: true
force_tag: true
register: docker_image
- name: Create the Dell_R730xd Fan Contoller container - name: Create the Dell_R730xd Fan Contoller container
docker_container: docker_container:
name: Dell_R730xd name: Dell_R730xd
image: ghcr.io/tigerblue77/dell_idrac_fan_controller:latest@sha256:eda09016a4acbee8883996f3b8cd4832a723200999bd037934675e75e2f00908 image: "{{ docker_image.image.RepoTags[0] }}"
restart_policy: unless-stopped restart_policy: unless-stopped
recreate: true
env: env:
IDRAC_HOST: "10.10.10.105" IDRAC_HOST: "10.10.10.105"
IDRAC_USERNAME: "root" IDRAC_USERNAME: "root"
@@ -13,3 +21,5 @@
CPU_TEMPERATURE_THRESHOLD: "80" CPU_TEMPERATURE_THRESHOLD: "80"
CHECK_INTERVAL: "60" CHECK_INTERVAL: "60"
DISABLE_THIRD_PARTY_PCIE_CARD_DELL_DEFAULT_COOLING_RESPONSE: "true" DISABLE_THIRD_PARTY_PCIE_CARD_DELL_DEFAULT_COOLING_RESPONSE: "true"
when: docker_image.changed
register: container_idrac

View File

@@ -4,13 +4,13 @@
path: "{{ item }}" path: "{{ item }}"
state: directory state: directory
with_items: with_items:
- "{{ data_folder }}/invoiceninja/" - "/data/invoiceninja/"
- "{{ data_folder }}/invoiceninja/config" - "/data/invoiceninja/config"
- "{{ data_folder }}/invoiceninja/db" - "/data/invoiceninja/db"
- name: "create stack.env" - name: "create stack.env"
copy: copy:
dest: "{{ data_folder }}/invoiceninja/stack.env" dest: "/data/invoiceninja/stack.env"
content: | content: |
APP_NAME="Invoice Ninja" APP_NAME="Invoice Ninja"
APP_ENV=production APP_ENV=production
@@ -56,33 +56,47 @@
UPDATE_SECRET=secret UPDATE_SECRET=secret
SENTRY_LARAVEL_DSN=https://32f01ea994744fa08a0f688769cef78a@sentry.invoicing.co/ SENTRY_LARAVEL_DSN=https://32f01ea994744fa08a0f688769cef78a@sentry.invoicing.co/
- name: Pull docker image
community.docker.docker_image:
name: invoiceninja/invoiceninja
tag: 5
source: pull
register: docker_image
- name: Create the invoiceninja-app container - name: Create the invoiceninja-app container
docker_container: docker_container:
name: invoiceninja-app name: invoiceninja-app
image: invoiceninja/invoiceninja:5 image: "{{ docker_image.image.RepoTags[0] }}"
env_file: "{{ data_folder }}/invoiceninja/stack.env" env_file: "/data/invoiceninja/stack.env"
restart_policy: unless-stopped restart_policy: unless-stopped
recreate: true
networks: networks:
- name: proxy - name: proxy
volumes: volumes:
- "{{ data_folder }}/invoiceninja/config/hosts:/etc/hosts" - "/data/invoiceninja/config/hosts:/etc/hosts"
- "{{ data_folder }}/invoiceninja/docker/app/public:/var/www/app/public" - "/data/invoiceninja/docker/app/public:/var/www/app/public"
- "{{ data_folder }}/invoiceninja/docker/app/storage:/var/www/app/storage" - "/data/invoiceninja/docker/app/storage:/var/www/app/storage"
when: docker_image.changed
register: container_inv_app
- name: Pull docker image
community.docker.docker_image:
name: nginx
tag: 1.29.2
source: pull
register: docker_image
- name: Create the invoiceninja-nginx container - name: Create the invoiceninja-nginx container
docker_container: docker_container:
name: invoiceninja-nginx name: invoiceninja-nginx
image: nginx:1.29.2 image: "{{ docker_image.image.RepoTags[0] }}"
env_file: "{{ data_folder }}/invoiceninja/stack.env" env_file: "/data/invoiceninja/stack.env"
restart_policy: unless-stopped restart_policy: unless-stopped
recreate: true
networks: networks:
- name: proxy - name: proxy
volumes: volumes:
- "{{ data_folder }}/invoiceninja/config/nginx/in-vhost.conf:/etc/nginx/conf.d/in-vhost.conf" - "/data/invoiceninja/config/nginx/in-vhost.conf:/etc/nginx/conf.d/in-vhost.conf"
- "{{ data_folder }}/invoiceninja/docker/app/public:/var/www/app/public" - "/data/invoiceninja/docker/app/public:/var/www/app/public"
- "{{ data_folder }}/invoiceninja/docker/app/storage:/var/www/app/storage" - "/data/invoiceninja/docker/app/storage:/var/www/app/storage"
labels: labels:
traefik.enable: "true" traefik.enable: "true"
traefik.http.routers.invoiceninja.rule: "Host(`invoice.comprofix.com`)" traefik.http.routers.invoiceninja.rule: "Host(`invoice.comprofix.com`)"
@@ -90,6 +104,9 @@
traefik.http.routers.invoiceninja.tls: "true" traefik.http.routers.invoiceninja.tls: "true"
traefik.http.services.invoiceninja.loadbalancer.server.port: "80" traefik.http.services.invoiceninja.loadbalancer.server.port: "80"
traefik.http.services.invoiceninja.loadbalancer.server.scheme: "http" traefik.http.services.invoiceninja.loadbalancer.server.scheme: "http"
when: docker_image.changed
register: container_inv_nginx

View File

@@ -9,80 +9,112 @@
name: parted name: parted
state: present state: present
- name: Discover iSCSI targets - name: Check existing iSCSI sessions
command: sudo iscsiadm -m discovery -t sendtargets -p "10.10.10.2"
register: iscsi_discovery
- name: Set target_iqn variable based on discovery
set_fact:
target_iqn: "{{ item.split(' ')[1] }}"
loop: "{{ iscsi_discovery.stdout_lines }}"
when: item.startswith("10.10.10.2")
- name: Check if iSCSI target is already connected
command: iscsiadm -m session command: iscsiadm -m session
register: iscsi_sessions register: iscsi_sessions
changed_when: false changed_when: false
failed_when: iscsi_sessions.rc not in [0, 21] # Allow success if the return code is 0 or 21 failed_when: iscsi_sessions.rc not in [0, 21]
- name: Connect to iSCSI target - name: Discover iSCSI targets for each portal
command: sudo iscsiadm -m node -T "{{ target_iqn }}" -p "10.10.10.2" --login command: iscsiadm -m discovery -t sendtargets -p "{{ item.portal }}"
when: target_iqn is defined and target_iqn not in iscsi_sessions.stdout register: iscsi_discovery
loop: "{{ iscsi_targets }}"
loop_control:
label: "{{ item.iqn }}"
changed_when: false
- name: Set iSCSI target for automatic login - name: Connect to iSCSI targets for this host
command: sudo iscsiadm -m node -T "{{ target_iqn }}" -p "10.10.10.2" --op update --name node.startup --value automatic command: iscsiadm -m node -T "{{ item.iqn }}" -p "{{ item.portal }}" --login
when: target_iqn is defined loop: "{{ iscsi_targets }}"
when: item.iqn not in iscsi_sessions.stdout
loop_control:
label: "{{ item.iqn }}"
- name: Fail if no target_iqn found - name: Set iSCSI targets for automatic login
fail: command: iscsiadm -m node -T "{{ item.iqn }}" -p "{{ item.portal }}" --op update --name node.startup --value automatic
msg: "No target IQN found for iSCSI server IP 10.10.10.2" loop: "{{ iscsi_targets }}"
when: target_iqn is not defined loop_control:
label: "{{ item.iqn }}"
- name: List all block devices # --------------------------
command: lsblk -o NAME,SIZE,TYPE,MODEL # Wait for the iSCSI device to appear
register: lsblk_output # --------------------------
- name: Wait for iSCSI device to appear
wait_for:
path: "/dev/disk/by-path/ip-{{ item.portal }}:3260-iscsi-{{ item.iqn }}-lun-0"
state: present
timeout: 30
loop: "{{ iscsi_targets }}"
loop_control:
label: "{{ item.iqn }}"
- name: Set iSCSI device variable # --------------------------
set_fact: # Check if device is raw
iscsi_device: "/dev/{{ item.split()[0] }}" # --------------------------
loop: "{{ lsblk_output.stdout_lines }}" - name: Get block device info for each target
when: item.split()[2] == 'disk' and 'iSCSI' in item # Adjust based on the MODEL you observe command: "blkid /dev/disk/by-path/ip-{{ item.portal }}:3260-iscsi-{{ item.iqn }}-lun-0"
register: blkid_output
failed_when: false
changed_when: false
loop: "{{ iscsi_targets }}"
loop_control:
label: "{{ item.iqn }}"
- name: Fail if no iSCSI device found # --------------------------
fail: # Create partition if device is raw
msg: "No iSCSI device found!" # --------------------------
when: iscsi_device is not defined - name: Create partition if device is raw
- name: Create a partition on iSCSI device using parted
parted: parted:
device: "{{ iscsi_device }}" device: "/dev/disk/by-path/ip-{{ item[1].portal }}:3260-iscsi-{{ item[1].iqn }}-lun-0"
number: 1 number: 1
state: present state: present
part_type: primary part_type: primary
fs_type: ext4 fs_type: ext4
part_start: 0% # Start at the beginning of the device part_start: 0%
part_end: 100% # Use the entire available space part_end: 100%
loop: "{{ blkid_output.results | zip(iscsi_targets) | map('flatten') | list }}"
loop_control:
label: "{{ item[1].iqn }}"
when: item[0].stdout == ""
- name: Create filesystem on new partition - name: Create filesystem if partition is raw
filesystem: filesystem:
fstype: ext4 fstype: ext4
dev: "{{ iscsi_device }}1" # Format the partition dev: "/dev/disk/by-path/ip-{{ item[1].portal }}:3260-iscsi-{{ item[1].iqn }}-lun-0-part1"
loop: "{{ blkid_output.results | zip(iscsi_targets) | map('flatten') | list }}"
loop_control:
label: "{{ item[1].iqn }}"
when: item[0].stdout == ""
- name: Create mount point - name: Create mount points
file: file:
path: /data path: "{{ item.mount_point }}"
state: directory state: directory
mode: "0777"
owner: root
group: root
loop: "{{ iscsi_targets }}"
loop_control:
label: "{{ item.iqn }}"
- name: Mount iSCSI target - name: Mount iSCSI targets
mount: mount:
path: /data path: "{{ item.mount_point }}"
src: "{{ iscsi_device }}1" # Mount the new partition src: "/dev/disk/by-path/ip-{{ item.portal }}:3260-iscsi-{{ item.iqn }}-lun-0-part1"
fstype: ext4 fstype: ext4
opts: defaults,_netdev opts: defaults,_netdev
state: mounted state: mounted
loop: "{{ iscsi_targets }}"
loop_control:
label: "{{ item.iqn }}"
# - name: Ensure iSCSI target is mounted at boot - name: Ensure mounted directories are world-writable
# lineinfile: file:
# path: /etc/fstab path: "{{ item.mount_point }}"
# line: "{{ iscsi_device }}1 /data ext4 _netdev 0 0" state: directory
# state: present mode: "0777"
owner: root
group: root
loop: "{{ iscsi_targets }}"
loop_control:
label: "{{ item.iqn }}"

View File

@@ -4,15 +4,21 @@
path: "{{ item }}" path: "{{ item }}"
state: directory state: directory
with_items: with_items:
- "{{ data_folder }}/jellyseerr" - "/data/jellyseerr"
- "{{ data_folder }}/jellyseerr/config" - "/data/jellyseerr/config"
- name: Pull docker image
community.docker.docker_image:
name: fallenbagel/jellyseerr:2.7.3
tag: 2.7.3
source: pull
register: docker_image
- name: Create the jellyseerr container - name: Create the jellyseerr container
docker_container: docker_container:
name: jellyseerr name: jellyseerr
image: fallenbagel/jellyseerr:2.7.3 image: "{{ docker_image.image.RepoTags[0] }}"
restart_policy: unless-stopped restart_policy: unless-stopped
recreate: true
networks: networks:
- name: proxy - name: proxy
env: env:
@@ -20,10 +26,12 @@
PGID: "1000" PGID: "1000"
TZ: "Australia/Brisbane" TZ: "Australia/Brisbane"
volumes: volumes:
- "{{ data_folder }}/jellyseerr/config:/app/config" - "/data/jellyseerr/config:/app/config"
labels: labels:
traefik.enable: "true" traefik.enable: "true"
traefik.http.routers.jellyseerr.rule: "Host(`jellyseerr.comprofix.xyz`)" traefik.http.routers.jellyseerr.rule: "Host(`jellyseerr.comprofix.xyz`)"
traefik.http.routers.jellyseerr.entrypoints: "https" traefik.http.routers.jellyseerr.entrypoints: "https"
traefik.http.routers.jellyseerr.tls: "true" traefik.http.routers.jellyseerr.tls: "true"
traefik.http.services.jellyseerr.loadbalancer.server.port: "5055" traefik.http.services.jellyseerr.loadbalancer.server.port: "5055"
when: docker_image.changed
register: container_jellyseerr

View File

@@ -1,22 +1,26 @@
--- ---
- name: Set Facts
set_fact:
container_name: 'lidarr'
- name: Create directories - name: Create directories
file: file:
path: "{{ item }}" path: "{{ item }}"
state: directory state: directory
with_items: with_items:
- "{{ data_folder }}/lidarr" - "/data/lidarr"
- "{{ data_folder }}/lidarr/config" - "/data/lidarr/config"
- name: Pull docker image
community.docker.docker_image:
name: ghcr.io/linuxserver/lidarr
tag: latest
source: pull
force_source: true
force_tag: true
register: docker_image
- name: Create the lidarr container - name: Create the lidarr container
docker_container: docker_container:
name: lidarr name: lidarr
image: ghcr.io/linuxserver/lidarr:latest@sha256:5661b79d7245ec0c196a5a35ac13be44c6d76563d9e5bf855b3ffa3b91160999 image: "{{ docker_image.image.RepoTags[0] }}"
restart_policy: unless-stopped restart_policy: unless-stopped
recreate: true
networks: networks:
- name: proxy - name: proxy
env: env:
@@ -26,7 +30,7 @@
AUTO_UPDATE: "true" #optional AUTO_UPDATE: "true" #optional
DOCKER_MODS: "ghcr.io/themepark-dev/theme.park:lidarr" DOCKER_MODS: "ghcr.io/themepark-dev/theme.park:lidarr"
volumes: volumes:
- "{{ data_folder }}/lidarr/config:/config" - "/data/lidarr/config:/config"
- /mnt/nfs/data:/data - /mnt/nfs/data:/data
labels: labels:
traefik.enable: "true" traefik.enable: "true"
@@ -34,3 +38,5 @@
traefik.http.routers.lidarr.entrypoints: "https" traefik.http.routers.lidarr.entrypoints: "https"
traefik.http.routers.lidarr.tls: "true" traefik.http.routers.lidarr.tls: "true"
traefik.http.services.lidarr.loadbalancer.server.port: "8686" traefik.http.services.lidarr.loadbalancer.server.port: "8686"
when: docker_image.changed
register: container_gotify

View File

@@ -1,22 +1,24 @@
--- ---
- name: Set Facts
set_fact:
container_name: 'mariadb'
- name: Create directories - name: Create directories
file: file:
path: "{{ item }}" path: "{{ item }}"
state: directory state: directory
with_items: with_items:
- "{{ data_folder }}/mariadb" - "/data/mariadb"
- "{{ data_folder }}/mariadb/config" - "/data/mariadb/config"
- name: Pull docker image
community.docker.docker_image:
name: ghcr.io/linuxserver/mariadb
tag: 11.4.8
source: pull
register: docker_image
- name: Create the mariadb container - name: Create the mariadb container
docker_container: docker_container:
name: "mariadb" name: "mariadb"
image: ghcr.io/linuxserver/mariadb:11.4.8 image: "{{ docker_image.image.RepoTags[0] }}"
restart_policy: unless-stopped restart_policy: unless-stopped
recreate: true
ports: ports:
- 3306:3306 - 3306:3306
env: env:
@@ -25,5 +27,7 @@
MYSQL_ROOT_PASSWORD: "{{MYSQL_ROOT_PASSWORD}}" MYSQL_ROOT_PASSWORD: "{{MYSQL_ROOT_PASSWORD}}"
TZ: "Australia/Brisbane" TZ: "Australia/Brisbane"
volumes: volumes:
- "{{ data_folder }}/mariadb/config:/config" - "/data/mariadb/config:/config"
when: docker_image.changed
register: container_mariadb

View File

@@ -4,13 +4,20 @@
path: "{{ item }}" path: "{{ item }}"
state: directory state: directory
with_items: with_items:
- "{{ data_folder }}/mealie" - "/data/mealie"
- "{{ data_folder }}/mealie/config" - "/data/mealie/config"
- name: Pull docker image
community.docker.docker_image:
name: ghcr.io/mealie-recipes/mealie
tag: v3.3.2
source: pull
register: docker_image
- name: Create the mealie container - name: Create the mealie container
docker_container: docker_container:
name: mealie name: mealie
image: ghcr.io/mealie-recipes/mealie:v3.3.2 image: "{{ docker_image.image.RepoTags[0] }}"
restart_policy: unless-stopped restart_policy: unless-stopped
networks: networks:
- name: proxy - name: proxy
@@ -27,10 +34,12 @@
BASE_URL: "mealie.comprofix.xyz" BASE_URL: "mealie.comprofix.xyz"
SMTP_HOST: "{{MAIL_HOST}}" SMTP_HOST: "{{MAIL_HOST}}"
volumes: volumes:
- "{{ data_folder }}/mealie/data/:/app/data" - "/data/mealie/data/:/app/data"
labels: labels:
traefik.enable: "true" traefik.enable: "true"
traefik.http.routers.mealie.rule: "Host(`mealie.comprofix.xyz`)" traefik.http.routers.mealie.rule: "Host(`mealie.comprofix.xyz`)"
traefik.http.routers.mealie.entrypoints: "https" traefik.http.routers.mealie.entrypoints: "https"
traefik.http.routers.mealie.tls: "true" traefik.http.routers.mealie.tls: "true"
traefik.http.services.mealie.loadbalancer.server.port: "9000" traefik.http.services.mealie.loadbalancer.server.port: "9000"
when: docker_image.changed
register: container_mealie

View File

@@ -4,14 +4,20 @@
path: "{{ item }}" path: "{{ item }}"
state: directory state: directory
with_items: with_items:
- "{{ data_folder }}/mediawiki" - "/data/mediawiki"
- name: Pull docker image
community.docker.docker_image:
name: mediawiki
tag: 1.44.2
source: pull
register: docker_image
- name: Create the wiki container - name: Create the wiki container
docker_container: docker_container:
name: mediawiki name: mediawiki
image: mediawiki:1.44.2 image: "{{ docker_image.image.RepoTags[0] }}"
restart_policy: unless-stopped restart_policy: unless-stopped
recreate: true
networks: networks:
- name: proxy - name: proxy
env: env:
@@ -19,11 +25,13 @@
PGID: "1000" PGID: "1000"
TZ: "Australia/Brisbane" TZ: "Australia/Brisbane"
volumes: volumes:
- "{{ data_folder }}/mediawiki/images:/var/www/html/images" - "/data/mediawiki/images:/var/www/html/images"
- "{{ data_folder }}/mediawiki/LocalSettings.php:/var/www/html/LocalSettings.php" - "/data/mediawiki/LocalSettings.php:/var/www/html/LocalSettings.php"
labels: labels:
traefik.enable: "true" traefik.enable: "true"
traefik.http.routers.wiki.rule: "Host(`wiki.comprofix.xyz`)" traefik.http.routers.wiki.rule: "Host(`wiki.comprofix.xyz`)"
traefik.http.routers.wiki.entrypoints: "https" traefik.http.routers.wiki.entrypoints: "https"
traefik.http.routers.wiki.tls: "true" traefik.http.routers.wiki.tls: "true"
traefik.http.services.wiki.loadbalancer.server.port: "80" traefik.http.services.wiki.loadbalancer.server.port: "80"
when: docker_image.changed
register: container_mediawiki

View File

@@ -1,30 +0,0 @@
---
- name: Create directories
file:
path: "{{ item }}"
state: directory
with_items:
- "{{ data_folder }}/mssql"
- "{{ data_folder }}/mssql/data"
- "{{ data_folder }}/mssql/log"
- "{{ data_folder }}/mssql/secrets"
- name: Create the mssql container
docker_container:
name: mssql
image: mcr.microsoft.com/mssql/server:2025-latest@sha256:2c80e548ef65fb65a8ca23c3a74ed60e0964ea709f46d07c97ccaf7c437e2cc6
user: root
restart_policy: unless-stopped
recreate: true
ports:
- 1433:1433
env:
PUID: "0"
PGID: "0"
ACCEPT_EULA: "Y"
MSSQL_PID: "Express"
SA_PASSWORD: "{{ SA_PASSWORD }}"
volumes:
- "{{ data_folder }}/mssql/data:/var/opt/mssql/data"
- "{{ data_folder }}/mssql/log:/var/opt/mssql/log"
- "{{ data_folder }}/mssql/secrets:/var/opt/mssql/secrets"

6
roles/nfs/tasks/main.yml → tasks/nfs.yml Normal file → Executable file
View File

@@ -1,5 +1,4 @@
--- ---
- name: Install NFS mount utility - name: Install NFS mount utility
ansible.builtin.apt: ansible.builtin.apt:
update_cache: true update_cache: true
@@ -11,10 +10,7 @@
ansible.posix.mount: ansible.posix.mount:
src: "{{ item.src }}" src: "{{ item.src }}"
path: "{{ item.path }}" path: "{{ item.path }}"
opts: "{{ item.opts | default(nfs_mount_opts) }}" opts: "{{ item.opts | default('rw,sync,hard') }}"
state: "{{ item.state | default( 'mounted' ) }}" state: "{{ item.state | default( 'mounted' ) }}"
fstype: nfs fstype: nfs
with_items: "{{ mounts }}" with_items: "{{ mounts }}"

View File

@@ -4,21 +4,29 @@
path: "{{ item }}" path: "{{ item }}"
state: directory state: directory
with_items: with_items:
- "{{ data_folder }}/omada" - "/data/omada"
- "{{ data_folder }}/omada/data" - "/data/omada/data"
- "{{ data_folder }}/omada/logs" - "/data/omada/logs"
- name: Create the omada container - name: Pull omada image
community.docker.docker_image:
name: mbentley/omada-controller
tag: "5.15"
source: pull
register: docker_image
- name: Create/Update the omada-controller container
docker_container: docker_container:
name: omada name: omada
image: mbentley/omada-controller:5.15 image: "{{ docker_image.image.RepoTags[0] }}"
restart_policy: unless-stopped restart_policy: unless-stopped
recreate: true
network_mode: host network_mode: host
volumes: volumes:
- "{{ data_folder }}/omada/data:/opt/tplink/EAPController/data" - "/data/omada/data:/opt/tplink/EAPController/data"
- "{{ data_folder }}/omada/logs:/opt/tplink/EAPController/logs" - "/data/omada/logs:/opt/tplink/EAPController/logs"
env: env:
PUID: "1000" PUID: "1000"
PGID: "1000" PGID: "1000"
TZ: "Australia/Brisbane" TZ: "Australia/Brisbane"
when: docker_image.changed
register: container_omada

View File

@@ -4,19 +4,27 @@
path: "{{ item }}" path: "{{ item }}"
state: directory state: directory
with_items: with_items:
- "/mnt/nfs/docker/postgres" - "/data/postgres"
- "/mnt/nfs/docker/postgres/config" - "/data/postgres/data"
- name: Pull docker image
community.docker.docker_image:
name: postgres
tag: 17.0-alpine
source: pull
register: docker_image
- name: Create the postgres container - name: Create the postgres container
docker_container: docker_container:
name: postgres name: postgres
image: postgres:16-alpine image: "{{ docker_image.image.RepoTags[0] }}"
restart_policy: unless-stopped restart_policy: unless-stopped
recreate: true
ports: ports:
- 5432:5432 - 5432:5432
env: env:
POSTGRES_PASSWORD: "{{POSTGRES_PASSWORD}}" POSTGRES_PASSWORD: "{{POSTGRES_PASSWORD}}"
volumes: volumes:
- /mnt/nfs/docker/postgres/db-data:/var/lib/postgresql/data - /data/postgres/data:/var/lib/postgresql/data
when: docker_image.changed
register: container_postgres

View File

@@ -4,15 +4,22 @@
path: "{{ item }}" path: "{{ item }}"
state: directory state: directory
with_items: with_items:
- "{{ data_folder }}/prowlarr" - "/data/prowlarr"
- "{{ data_folder }}/prowlarr/config" - "/data/prowlarr/config"
- name: Pull docker image
community.docker.docker_image:
name: linuxserver/prowlarr
tag: 2.0.5
source: pull
register: docker_image
- name: Create the prowlarr container - name: Create the prowlarr container
docker_container: docker_container:
name: prowlarr name: prowlarr
image: linuxserver/prowlarr:2.0.5 image: "{{ docker_image.image.RepoTags[0] }}"
restart_policy: unless-stopped restart_policy: unless-stopped
recreate: true
networks: networks:
- name: proxy - name: proxy
env: env:
@@ -22,10 +29,12 @@
AUTO_UPDATE: "true" #optional AUTO_UPDATE: "true" #optional
DOCKER_MODS: "ghcr.io/themepark-dev/theme.park:prowlarr" DOCKER_MODS: "ghcr.io/themepark-dev/theme.park:prowlarr"
volumes: volumes:
- "{{ data_folder }}/prowlarr/config:/config" - "/data/prowlarr/config:/config"
labels: labels:
traefik.enable: "true" traefik.enable: "true"
traefik.http.routers.prowlarr.rule: "Host(`prowlarr.comprofix.xyz`)" traefik.http.routers.prowlarr.rule: "Host(`prowlarr.comprofix.xyz`)"
traefik.http.routers.prowlarr.entrypoints: "https" traefik.http.routers.prowlarr.entrypoints: "https"
traefik.http.routers.prowlarr.tls: "true" traefik.http.routers.prowlarr.tls: "true"
traefik.http.services.prowlarr.loadbalancer.server.port: "9696" traefik.http.services.prowlarr.loadbalancer.server.port: "9696"
when: docker_image.changed
register: container_prowlarr

View File

@@ -4,15 +4,23 @@
path: "{{ item }}" path: "{{ item }}"
state: directory state: directory
with_items: with_items:
- "{{ data_folder }}/pykms" - "/data/pykms"
- "{{ data_folder }}/pykms/db" - "/data/pykms/db"
- name: Pull docker image
community.docker.docker_image:
name: ghcr.io/py-kms-organization/py-kms
tag: latest
source: pull
force_source: true
force_tag: true
register: docker_image
- name: Create the pykms container - name: Create the pykms container
docker_container: docker_container:
name: pykms name: pykms
image: ghcr.io/py-kms-organization/py-kms:latest image: "{{ docker_image.image.RepoTags[0] }}"
restart_policy: unless-stopped restart_policy: unless-stopped
recreate: true
ports: ports:
- "1688:1688" - "1688:1688"
env: env:
@@ -21,6 +29,8 @@
HWID: "RANDOM" HWID: "RANDOM"
LOGLEVEL: "INFO" LOGLEVEL: "INFO"
volumes: volumes:
- "{{ data_folder }}/pykms/db:/home/py-kms/db" - "/data/pykms/db:/home/py-kms/db"
- /etc/localtime:/etc/localtime:ro - /etc/localtime:/etc/localtime:ro
when: docker_image.changed
register: container_pykms

View File

@@ -4,15 +4,21 @@
path: "{{ item }}" path: "{{ item }}"
state: directory state: directory
with_items: with_items:
- "{{ data_folder }}/radarr" - "/data/radarr"
- "{{ data_folder }}/radarr/config" - "/data/radarr/config"
- name: Pull docker image
community.docker.docker_image:
name: linuxserver/radarr
tag: 5.27.5
source: pull
register: docker_image
- name: Create the radarr container - name: Create the radarr container
docker_container: docker_container:
name: radarr name: radarr
image: linuxserver/radarr:5.27.5 image: "{{ docker_image.image.RepoTags[0] }}"
restart_policy: unless-stopped restart_policy: unless-stopped
recreate: true
networks: networks:
- name: proxy - name: proxy
env: env:
@@ -21,7 +27,7 @@
TZ: "Australia/Brisbane" TZ: "Australia/Brisbane"
DOCKER_MODS: "ghcr.io/themepark-dev/theme.park:radarr" DOCKER_MODS: "ghcr.io/themepark-dev/theme.park:radarr"
volumes: volumes:
- "{{ data_folder }}/radarr/config:/config" - "/data/radarr/config:/config"
- /mnt/nfs/data:/data - /mnt/nfs/data:/data
labels: labels:
traefik.enable: "true" traefik.enable: "true"
@@ -29,3 +35,5 @@
traefik.http.routers.radarr.entrypoints: "https" traefik.http.routers.radarr.entrypoints: "https"
traefik.http.routers.radarr.tls: "true" traefik.http.routers.radarr.tls: "true"
traefik.http.services.radarr.loadbalancer.server.port: "7878" traefik.http.services.radarr.loadbalancer.server.port: "7878"
when: docker_image.changed
register: container_radarr

View File

@@ -1,33 +0,0 @@
# Readarr has been archived/retired.
# Keeping this for history
# ---
# - name: Create directories
# file:
# path: "{{ item }}"
# state: directory
# with_items:
# - "{{ data_folder }}/readarr"
# - "{{ data_folder }}/readarr/config"
# - name: Create the readarr container
# docker_container:
# name: readarr
# image: linuxserver/readarr:develop@sha256:eb37f58646a901dc7727cf448cae36daaefaba79de33b5058dab79aa4c04aefb
# restart_policy: unless-stopped
# recreate: true
# networks:
# - name: proxy
# env:
# PUID: "1000"
# PGID: "1000"
# TZ: "Australia/Brisbane"
# DOCKER_MODS: "ghcr.io/themepark-dev/theme.park:readarr"
# volumes:
# - "{{ data_folder }}/readarr/config/:/config"
# - /mnt/nfs/data/:/data
# labels:
# traefik.enable: "true"
# traefik.http.routers.readarr.rule: "Host(`readarr.comprofix.xyz`)"
# traefik.http.routers.readarr.entrypoints: "https"
# traefik.http.routers.readarr.tls: "true"
# traefik.http.services.readarr.loadbalancer.server.port: "8787"

View File

@@ -4,15 +4,21 @@
path: "{{ item }}" path: "{{ item }}"
state: directory state: directory
with_items: with_items:
- "{{ data_folder }}/sabnzbd" - "/data/sabnzbd"
- "{{ data_folder }}/sabnzbd/config" - "/data/sabnzbd/config"
- name: Pull docker image
community.docker.docker_image:
name: linuxserver/sabnzbd
tag: 4.5.3
source: pull
register: docker_image
- name: Create the sabnzbd container - name: Create the sabnzbd container
docker_container: docker_container:
name: sabnzbd name: sabnzbd
image: linuxserver/sabnzbd:4.5.3 image: "{{ docker_image.image.RepoTags[0] }}"
restart_policy: unless-stopped restart_policy: unless-stopped
recreate: true
networks: networks:
- name: proxy - name: proxy
env: env:
@@ -22,7 +28,7 @@
HOSTNAME: "sabnzbd.comprofix.xyz" HOSTNAME: "sabnzbd.comprofix.xyz"
DOCKER_MODS: "ghcr.io/themepark-dev/theme.park:sabnzbd" DOCKER_MODS: "ghcr.io/themepark-dev/theme.park:sabnzbd"
volumes: volumes:
- "{{ data_folder }}/sabnzbd/config:/config" - "/data/sabnzbd/config:/config"
- /mnt/nfs/data:/data - /mnt/nfs/data:/data
labels: labels:
traefik.enable: "true" traefik.enable: "true"
@@ -30,3 +36,5 @@
traefik.http.routers.sabnzbd.entrypoints: "https" traefik.http.routers.sabnzbd.entrypoints: "https"
traefik.http.routers.sabnzbd.tls: "true" traefik.http.routers.sabnzbd.tls: "true"
traefik.http.services.sabnzbd.loadbalancer.server.port: "8080" traefik.http.services.sabnzbd.loadbalancer.server.port: "8080"
when: docker_image.changed
register: container_sabnzbd

View File

@@ -4,15 +4,21 @@
path: "{{ item }}" path: "{{ item }}"
state: directory state: directory
with_items: with_items:
- "{{ data_folder }}/sonarr" - "/data/sonarr"
- "{{ data_folder }}/sonarr/config" - "/data/sonarr/config"
- name: Pull docker image
community.docker.docker_image:
name: linuxserver/sonarr
tag: 4.0.15
source: pull
register: docker_image
- name: Create the sonarr container - name: Create the sonarr container
docker_container: docker_container:
name: sonarr name: sonarr
image: linuxserver/sonarr:4.0.15 image: "{{ docker_image.image.RepoTags[0] }}"
restart_policy: unless-stopped restart_policy: unless-stopped
recreate: true
networks: networks:
- name: proxy - name: proxy
env: env:
@@ -21,7 +27,7 @@
TZ: "Australia/Brisbane" TZ: "Australia/Brisbane"
DOCKER_MODS: "ghcr.io/themepark-dev/theme.park:sonarr" DOCKER_MODS: "ghcr.io/themepark-dev/theme.park:sonarr"
volumes: volumes:
- "{{ data_folder }}/sonarr/config/:/config" - "/data/sonarr/config/:/config"
- /mnt/nfs/data:/data - /mnt/nfs/data:/data
labels: labels:
traefik.enable: "true" traefik.enable: "true"
@@ -29,3 +35,5 @@
traefik.http.routers.sonarr.entrypoints: "https" traefik.http.routers.sonarr.entrypoints: "https"
traefik.http.routers.sonarr.tls: "true" traefik.http.routers.sonarr.tls: "true"
traefik.http.services.sonarr.loadbalancer.server.port: "8989" traefik.http.services.sonarr.loadbalancer.server.port: "8989"
when: docker_image.changed
register: container_sonarr

View File

@@ -4,16 +4,22 @@
path: "{{ item }}" path: "{{ item }}"
state: directory state: directory
with_items: with_items:
- "{{ data_folder }}/speedtest" - "/data/speedtest"
- "{{ data_folder }}/speedtest/config" - "/data/speedtest/config"
- "{{ data_folder }}/speedtest/web" - "/data/speedtest/web"
- name: Pull docker image
community.docker.docker_image:
name: lscr.io/linuxserver/speedtest-tracker
tag: 1.6.8
source: pull
register: docker_image
- name: Create the speedtest container - name: Create the speedtest container
docker_container: docker_container:
name: speedtest name: speedtest
image: lscr.io/linuxserver/speedtest-tracker:1.6.8 image: "{{ docker_image.image.RepoTags[0] }}"
restart_policy: unless-stopped restart_policy: unless-stopped
recreate: true
networks: networks:
- name: proxy - name: proxy
env: env:
@@ -30,8 +36,8 @@
SPEEDTEST_SCHEDULE: "0 * * * *" SPEEDTEST_SCHEDULE: "0 * * * *"
DISPLAY_TIMEZONE: "Australia/Brisbane" DISPLAY_TIMEZONE: "Australia/Brisbane"
volumes: volumes:
- "{{ data_folder }}/speedtest/config:/config" - "/data/speedtest/config:/config"
- "{{ data_folder }}/speedtest/web:/etc/ssl/web" - "/data/speedtest/web:/etc/ssl/web"
labels: labels:
traefik.enable: "true" traefik.enable: "true"
traefik.http.routers.speedtest.rule: "Host(`speedtest.comprofix.xyz`)" traefik.http.routers.speedtest.rule: "Host(`speedtest.comprofix.xyz`)"
@@ -39,3 +45,5 @@
traefik.http.routers.speedtest.tls: "true" traefik.http.routers.speedtest.tls: "true"
traefik.http.services.speedtest.loadbalancer.server.port: "80" traefik.http.services.speedtest.loadbalancer.server.port: "80"
traefik.http.services.speedtest.loadbalancer.server.scheme: "http" traefik.http.services.speedtest.loadbalancer.server.scheme: "http"
when: docker_image.changed
register: container_speedtest

View File

@@ -4,61 +4,45 @@
path: "{{ item }}" path: "{{ item }}"
state: directory state: directory
with_items: with_items:
- "{{ data_folder }}/traefik" - "/data/traefik"
- "{{ data_folder }}/traefik/data" - "/data/traefik/config"
- "{{ data_folder }}/traefik/data/log" - "/data/traefik/log"
- name: Ensure 'proxy' network exists
- name: Create a network
docker_network: docker_network:
name: proxy name: proxy
register: network
- name: Copy Traefik config - name: Copy Traefik main configuration
template: template:
src: templates/traefik.yml.j2 src: ../templates/traefik.yml.j2
dest: "{{ data_folder }}/traefik/data/traefik.yml" dest: "/data/traefik/config/traefik.yml"
mode: "0600" mode: "0600"
- name: Copy Traefik config - name: Copy Traefik extra config
template: template:
src: templates/config.yml.j2 src: ../templates/config.yml.j2
dest: "{{ data_folder }}/traefik/data/config.yml" dest: "/data/traefik/config/config.yml"
mode: "0600" mode: "0600"
when: traefik_host == "traefik02.comprofix.xyz"
- name: Check if {{ data_folder }}/traefik/data/acme.json exists - name: Ensure acme.json exists
ansible.builtin.stat: file:
path: "{{ data_folder }}/traefik/data/acme.json" path: "/data/traefik/config/acme.json"
register: file_status
- name: Creates {{ data_folder }}/traefik/data/acme.json if it doesn't exists
ansible.builtin.file:
path: "{{ data_folder }}/traefik/data/acme.json"
state: touch state: touch
owner: root owner: root # UID Traefik runs as
group: root group: root # GID Traefik runs as
mode: "0600" mode: "0600"
when: not file_status.stat.exists
- name: Check if traefik.json.log exists - name: Pull docker image
ansible.builtin.stat: community.docker.docker_image:
path: "{{ data_folder }}/traefik/data/log/traefik.json.log" name: traefik
register: file_status tag: v3.5
source: pull
- name: Creates traefik.json.log if it doesn't exists register: docker_image
ansible.builtin.file:
path: "{{ data_folder }}/traefik/data/log/traefik.json.log"
state: touch
owner: root
group: root
mode: "0600"
when: not file_status.stat.exists
- name: Create traefik Container - name: Create traefik Container
docker_container: docker_container:
name: traefik name: traefik
image: traefik:v3.5 image: "{{ docker_image.image.RepoTags[0] }}"
restart_policy: unless-stopped restart_policy: unless-stopped
networks: networks:
- name: "proxy" - name: "proxy"
@@ -71,17 +55,17 @@
volumes: volumes:
- /etc/localtime:/etc/localtime:ro - /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro - /var/run/docker.sock:/var/run/docker.sock:ro
- "{{ data_folder }}/traefik/data/traefik.yml:/traefik.yml:ro" - "/data/traefik/config/traefik.yml:/traefik.yml:ro"
- "{{ data_folder }}/traefik/data/acme.json:/acme.json" - "/data/traefik/config/acme.json:/acme.json"
- "{{ data_folder }}/traefik/data/log:/var/log/traefik" - "/data/traefik/log:/var/log/traefik"
- "{{ data_folder }}/traefik/data/config.yml:/config.yml:ro" - "/data/traefik/config/config.yml:/config.yml:ro"
labels: labels:
traefik.enable: "true" traefik.enable: "true"
traefik.http.routers.traefik.entrypoints: "http" traefik.http.routers.traefik.entrypoints: "http"
traefik.http.routers.traefik.rule: "Host(`{{traefik_host}}`)" traefik.http.routers.traefik.rule: "Host(`{{traefik_host}}`)"
traefik.http.middlewares.traefik-auth.basicauth.users: "{{ traefik_api_password }}"
traefik.http.middlewares.traefik-https-redirect.redirectscheme.scheme: "https" traefik.http.middlewares.traefik-https-redirect.redirectscheme.scheme: "https"
traefik.http.middlewares.sslheader.headers.customrequestheaders.X-Forwarded-Proto: "https" traefik.http.middlewares.sslheader.headers.customrequestheaders.X-Forwarded-Proto: "https"
traefik.http.middlewares.traefik-auth.basicauth.users: "{{ traefik_api_userpass }}"
traefik.http.routers.traefik.middlewares: "traefik-https-redirect" traefik.http.routers.traefik.middlewares: "traefik-https-redirect"
traefik.http.routers.traefik-secure.entrypoints: "https" traefik.http.routers.traefik-secure.entrypoints: "https"
traefik.http.routers.traefik-secure.rule: "Host(`{{traefik_host}}`)" traefik.http.routers.traefik-secure.rule: "Host(`{{traefik_host}}`)"
@@ -93,3 +77,5 @@
traefik.http.routers.traefik-secure.tls.domains[1].main: "comprofix.xyz" traefik.http.routers.traefik-secure.tls.domains[1].main: "comprofix.xyz"
traefik.http.routers.traefik-secure.tls.domains[1].sans: "*.comprofix.xyz" traefik.http.routers.traefik-secure.tls.domains[1].sans: "*.comprofix.xyz"
traefik.http.routers.traefik-secure.service: "api@internal" traefik.http.routers.traefik-secure.service: "api@internal"
when: docker_image.changed
register: container_traefik

View File

@@ -1,26 +0,0 @@
---
- name: Create directories
file:
path: "{{ item }}"
state: directory
with_items:
- "{{ data_folder }}/traggo"
- "{{ data_folder }}/traggo/data"
- name: Create the traggo container
docker_container:
name: traggo
image: traggo/server:0.7.1
restart_policy: unless-stopped
recreate: true
networks:
- name: proxy
volumes:
- /data/traggo/data:/opt/traggo/data
labels:
traefik.enable: "true"
traefik.http.routers.traggo.rule: "Host(`traggo.comprofix.xyz`)"
traefik.http.routers.traggo.entrypoints: "https"
traefik.http.routers.traggo.tls: "true"
traefik.http.services.traggo.loadbalancer.server.port: "3030"
traefik.http.services.traggo.loadbalancer.server.scheme: "http"

View File

@@ -4,18 +4,24 @@
path: "{{ item }}" path: "{{ item }}"
state: directory state: directory
with_items: with_items:
- "{{ data_folder }}/vaultwarden" - "/data/vaultwarden"
- "{{ data_folder }}/vaultwarden/config" - "/data/vaultwarden/config"
- "{{ data_folder }}/vaultwardenbackup" - "/data/vaultwardenbackup"
- "{{ data_folder }}/vaultwardenbackup/config" - "/data/vaultwardenbackup/config"
- "{{ data_folder }}/vaultwardenbackup/config/rclone" - "/data/vaultwardenbackup/config/rclone"
- name: Pull docker image
community.docker.docker_image:
name: vaultwarden/server
tag: 1.34.3
source: pull
register: docker_image
- name: Create the vaultwarden container - name: Create the vaultwarden container
docker_container: docker_container:
name: vaultwarden name: vaultwarden
image: vaultwarden/server:1.34.3 image: "{{ docker_image.image.RepoTags[0] }}"
restart_policy: unless-stopped restart_policy: unless-stopped
recreate: true
networks: networks:
- name: proxy - name: proxy
env: env:
@@ -23,7 +29,7 @@
PGID: "1000" PGID: "1000"
TZ: "Australia/Brisbane" TZ: "Australia/Brisbane"
volumes: volumes:
- "{{ data_folder }}/vaultwarden/data:/data" - "/data/vaultwarden/data:/data"
labels: labels:
traefik.enable: "true" traefik.enable: "true"
traefik.http.routers.vaultwarden.rule: "Host(`vault.comprofix.com`)" traefik.http.routers.vaultwarden.rule: "Host(`vault.comprofix.com`)"
@@ -31,21 +37,28 @@
traefik.http.routers.vaultwarden.tls: "true" traefik.http.routers.vaultwarden.tls: "true"
traefik.http.routers.vaultwarden.service: "vaultwarden" traefik.http.routers.vaultwarden.service: "vaultwarden"
traefik.http.services.vaultwarden.loadbalancer.server.port: "80" traefik.http.services.vaultwarden.loadbalancer.server.port: "80"
register: container when: docker_image.changed
register: container_vaultwarden
- name: Copy rclone config - name: Copy rclone config
copy: copy:
src: scripts/rclone.conf src: scripts/rclone.conf
dest: "{{ data_folder }}/vaultwardenbackup/config/rclone/rclone.conf" dest: "/data/vaultwardenbackup/config/rclone/rclone.conf"
decrypt: yes decrypt: yes
mode: "0600" mode: "0600"
- name: Pull docker image
community.docker.docker_image:
name: ttionya/vaultwarden-backup
tag: 1.25.2
source: pull
register: docker_image
- name: Create the vaultwarden container - name: Create the vaultwarden container
docker_container: docker_container:
name: vaultwardenbackup name: vaultwardenbackup
image: ttionya/vaultwarden-backup:1.25.2 image: "{{ docker_image.image.RepoTags[0] }}"
restart_policy: unless-stopped restart_policy: unless-stopped
recreate: true
env: env:
PUID: "1000" PUID: "1000"
PGID: "1000" PGID: "1000"
@@ -54,9 +67,10 @@
BACKUP_KEEP_DAYS: "14" BACKUP_KEEP_DAYS: "14"
ZIP_PASSWORD: "{{ VAULTWARDEN_BACKUP_ZIP_PASSWORD }}" ZIP_PASSWORD: "{{ VAULTWARDEN_BACKUP_ZIP_PASSWORD }}"
volumes: volumes:
- "{{ data_folder }}/vaultwarden/data:/bitwarden/data" - "/data/vaultwarden/data:/bitwarden/data"
- "{{ data_folder }}/vaultwardenbackup/config:/config" - "/data/vaultwardenbackup/config:/config"
register: container when: docker_image.changed
register: container_vaultwardenbackup

View File

@@ -1,3 +0,0 @@
alpine_latest_image: "alpine:latest"
ubuntu_latest_image: "node:22-trixie"
debian_latest_image: "git.comprofix.com/mmckinnon/debian-latest:2025.08.31-093853"

View File

@@ -13,7 +13,6 @@ fi
#files=`find . \( -type d -name 'group_vars' -o -name 'vars' \) -exec find {} -type f \;` #files=`find . \( -type d -name 'group_vars' -o -name 'vars' \) -exec find {} -type f \;`
files=( files=(
"./group_vars/all.yml" "./group_vars/all.yml"
"./roles/docker/vars/main.yml"
"./roles/traefik/vars/main.yml" "./roles/traefik/vars/main.yml"
"./scripts/rclone.conf" "./scripts/rclone.conf"
) )