working ansible role

This commit is contained in:
Kyattsukuro 2026-10-11 01:00:37 +02:00
parent 365c5c22af
commit f39495e19c
7 changed files with 122 additions and 103 deletions

View File

@ -1,43 +1 @@
### Minio setup:
`mc admin user add <server_alias> splitpro <secret_key>`
`mc mb <server_alias>/splitpro`
Bucket user `policy.json`:
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::splitpro"]
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": ["arn:aws:s3:::splitpro/*"]
}
]
}
```
`mc admin policy create <server_alias> splitpro-rw policy.json`
`mc admin policy attach <server_alias> splitpro-rw --user splitpro`
Bucket `anonymous_policy.json`:
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::splitpro/*"
}
]
}
```
`mc anonymous set-json anonymous_policy.json <server_alias>/splitpro`
# splitpro

View File

@ -1,60 +0,0 @@
services:
splitpro:
image: ossapps/splitpro:v2.0.0-beta.5
environment:
AUTHENTIK_ID: "${AUTHENTIK_ID}"
AUTHENTIK_SECRET: "${AUTHENTIK_SECRET}"
AUTHENTIK_ISSUER: "${AUTHENTIK_ISSUER}"
NEXTAUTH_SECRET: "${NEXTAUTH_SECRET}"
DATABASE_URL: "postgresql://postgres:${POSTGRES_PASSWORD}@splitpro_db"
NEXTAUTH_URL: "https://splitpro.urmel.de"
HOSTNAME: "0.0.0.0" # Fixes implemenntatiion bug where only hostname would be used to accept connections
DEFAULT_HOMEPAGE: "/balances"
ENABLE_SENDING_INVITES: true
DISABLE_EMAIL_SIGNUP: true
FROM_EMAIL: "${FROM_EMAIL}"
EMAIL_SERVER_HOST: mail.postale.io
EMAIL_SERVER_PORT: 465
EMAIL_SERVER_USER: "${FROM_EMAIL}"
EMAIL_SERVER_PASSWORD: "${FROM_EMAIL_PASSWORD}"
R2_URL: "https://s3.urmel.de"
R2_PUBLIC_URL: "https://s3.urmel.de/splitpro"
R2_BUCKET: "splitpro"
R2_SECRET_KEY: "${S3_SECRET}"
R2_ACCESS_KEY: "splitpro"
depends_on:
- splitpro_db
networks:
- db
- proxy
labels:
traefik.enable: true
traefik.http.routers.splitpro.rule: "Host(`splitpro.urmel.de`)"
traefik.http.routers.splitpro.tls: true
traefik.http.routers.splitpro.tls.certResolver: hetzner
traefik.http.services.splitpro-https.loadbalancer.server.port: 3000
splitpro_db:
image: ossapps/postgres:17.7-trixie
environment:
POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}"
volumes:
- data:/var/lib/postgresql/data
networks:
- db
restart: always
command: >
postgres
-c shared_preload_libraries=pg_cron
-c cron.database_name=postgres
-c cron.timezone=UTC
volumes:
data:
networks:
db:
proxy:
name: traefik_exposed
external: true

17
defaults/main.yml Normal file
View File

@ -0,0 +1,17 @@
path: /srv/{{ role_name }}
splitpro_override: {}
splitpro_defaults:
version: "latest"
db_version: "17.7-trixie"
url: ""
db_password: ""
nextauth_secret: ""
oidc:
client_id: ""
client_secret: ""
issuer: ""
mail:
host: ""
address: ""
password: ""

8
handlers/main.yml Normal file
View File

@ -0,0 +1,8 @@
- name: restart container
community.docker.docker_compose_v2:
project_src: "{{ path }}"
project_name: "{{ role_name }}"
recreate: "always"
services: ["splitpro"]
state: "restarted"
when: not _splitpro_already_restarted

21
meta/main.yml Normal file
View File

@ -0,0 +1,21 @@
---
galaxy_info:
author: "Niklas Freese <niklas@urmel.de>"
description: splitpro
company: "Urmel Services"
license: AGPL-3.0-or-later
min_ansible_version: 2.1
# If this a Container Enabled role, provide the minimum Ansible Container version.
# min_ansible_container_version:
galaxy_tags: []
# List tags for your role here, one per line. A tag is a keyword that describes
# and categorizes the role. Users find roles by searching for tags. Be sure to
# remove the '[]' above, if you add tags to this list.
#
# NOTE: A tag is limited to a single word comprised of alphanumeric characters.
# Maximum 20 tags per role.
dependencies:
- role: traefik
- role: minio

21
tasks/main.yml Normal file
View File

@ -0,0 +1,21 @@
---
- name: "set local variables from overrides and defaults"
set_fact:
splitpro: "{{ (splitpro_defaults | combine(splitpro_override, recursive=True)) if splitpro_override else splitpro_defaults }}"
- name: ensure that path exists
file:
path: "{{ path }}/config/splitpro"
state: directory
- name: template docker compose
template:
src: compose.yml.j2
dest: "{{ path }}/compose.yml"
- name: ensure everything is up
community.docker.docker_compose_v2:
project_src: "{{ path }}"
project_name: "{{ role_name }}"
recreate: always
state: "present"

54
templates/compose.yml.j2 Normal file
View File

@ -0,0 +1,54 @@
services:
splitpro:
image: "ossapps/splitpro:{{ splitpro.version }}"
environment:
AUTHENTIK_ID: "{{ splitpro.oidc.client_id }}"
AUTHENTIK_SECRET: "{{ splitpro.oidc.client_secret }}"
AUTHENTIK_ISSUER: "{{ splitpro.oidc.issuer }}"
NEXTAUTH_SECRET: "{{ splitpro.nextauth_secret }}"
DATABASE_URL: "postgresql://postgres:{{ splitpro.db_password }}@splitpro_db"
NEXTAUTH_URL: "https://{{ splitpro.url }}"
HOSTNAME: "0.0.0.0" # Fixes implemenntatiion bug where only hostname would be used to accept connections
DEFAULT_HOMEPAGE: "/balances"
ENABLE_SENDING_INVITES: true
DISABLE_EMAIL_SIGNUP: true
FROM_EMAIL: "{{ splitpro.mail.address }}"
EMAIL_SERVER_HOST: "{{ splitpro.mail.host }}"
EMAIL_SERVER_PORT: 465
EMAIL_SERVER_USER: "{{ splitpro.mail.address }}"
EMAIL_SERVER_PASSWORD: "{{ splitpro.mail.password }}"
networks:
- db
- proxy
depends_on:
- splitpro_db
volumes:
- ./data/splitpro-uploads:/app/uploads
labels:
traefik.enable: true
traefik.http.routers.splitpro.rule: "Host(`{{ splitpro.url }}`)"
traefik.http.routers.splitpro.tls: true
traefik.http.routers.splitpro.tls.certResolver: hetzner
traefik.http.services.splitpro-https.loadbalancer.server.port: 3000
splitpro_db:
image: "ossapps/postgres:{{ splitpro.db_version }}"
environment:
POSTGRES_PASSWORD: "{{ splitpro.db_password }}"
volumes:
- ./data/db:/var/lib/postgresql/data
networks:
- db
restart: always
command: >
postgres
-c shared_preload_libraries=pg_cron
-c cron.database_name=postgres
-c cron.timezone=UTC
networks:
db: {}
proxy:
name: traefik_exposed
external: true