Skip to content

Commit ce0b39a

Browse files
committed
feat: initial DAppNode SplitPro package
0 parents  commit ce0b39a

5 files changed

Lines changed: 219 additions & 0 deletions

File tree

‎.gitignore‎

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# DAppNodeSDK release directories
2+
build_*
3+
build/
4+
5+
# SDK artifacts
6+
releases.json
7+
docker-compose-tmp.yml
8+
9+
# macOS
10+
.DS_Store
11+
12+
# Local upstream checkout (not packaged)
13+
split-pro/
14+
*.env
15+
16+
# Internal AI tooling
17+
.agents/
18+
dappnode-package-plan/
19+
20+
# GitHub agent definitions (internal)
21+
.github/agents/

‎avatar.png‎

14.5 KB
Loading

‎dappnode_package.json‎

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
{
2+
"name": "split-pro.public.dappnode.eth",
3+
"version": "0.1.0",
4+
"upstreamRepo": "oss-apps/split-pro",
5+
"shortDescription": "SplitPro — free shared expenses for groups",
6+
"description": "SplitPro is a free, open-source app for sharing expenses with friends and family. Create groups, add expenses, and settle up. This DAppNode package runs SplitPro with PostgreSQL, pg_cron for recurring transactions, and email magic-link authentication via NextAuth.\n\nPackage entrypoint:\n- Web app: http://split-pro.public.dappnode:3000\n\nSetup wizard:\n- Configure SMTP settings for email signup and invites. Email is the primary auth provider. OAuth/OIDC providers can be added later via environment variables.\n\nImportant notes:\n- On first launch, the package generates POSTGRES_PASSWORD and NEXTAUTH_SECRET and persists them in the config volume.\n- The splitpro server uses NextAuth email OTP (magic link) authentication. SMTP must be configured for sign-in to work.\n- Recurring transactions require pg_cron which is enabled by default.",
7+
"type": "service",
8+
"architectures": ["linux/amd64"],
9+
"mainService": "splitpro",
10+
"author": "lanski <Pol-Lanski> (https://github.com/pol-lanski)",
11+
"categories": ["Developer tools"],
12+
"keywords": [
13+
"SplitPro",
14+
"expenses",
15+
"sharing",
16+
"groups",
17+
"splitwise"
18+
],
19+
"links": {
20+
"homepage": "https://splitpro.app",
21+
"ui": "http://split-pro.public.dappnode:3000",
22+
"docs": "https://github.com/oss-apps/split-pro",
23+
"github": "https://github.com/oss-apps/split-pro"
24+
},
25+
"backup": [
26+
{
27+
"name": "database",
28+
"path": "/var/lib/postgresql/data",
29+
"service": "postgres"
30+
},
31+
{
32+
"name": "uploads",
33+
"path": "/app/uploads",
34+
"service": "splitpro"
35+
},
36+
{
37+
"name": "config",
38+
"path": "/config",
39+
"service": "secrets"
40+
}
41+
],
42+
"warnings": {
43+
"onInstall": "Configure SMTP settings in the setup wizard to enable email magic-link signup. Without SMTP, no one can sign in. POSTGRES_PASSWORD and NEXTAUTH_SECRET are auto-generated on first launch.",
44+
"onReset": "Resetting this package removes your database, uploaded receipts, and auto-generated secrets.",
45+
"onRemove": "Removing this package also removes all SplitPro data. Back up your volumes first if you want to keep your data."
46+
},
47+
"changelog": "Initial DAppNode package for SplitPro v2.1.3. Includes PostgreSQL with pg_cron, auto-generated secrets, and setup wizard for SMTP configuration.",
48+
"repository": {
49+
"type": "git",
50+
"url": "https://github.com/oss-apps/split-pro.git"
51+
},
52+
"license": "AGPL-3.0"
53+
}

‎docker-compose.yml‎

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
version: "3.5"
2+
3+
services:
4+
secrets:
5+
build:
6+
context: .
7+
dockerfile: build/secrets/Dockerfile
8+
image: secrets.split-pro.public.dappnode.eth:0.1.0
9+
restart: unless-stopped
10+
volumes:
11+
- config:/config
12+
13+
postgres:
14+
build:
15+
context: .
16+
dockerfile: build/postgres/Dockerfile
17+
image: postgres.split-pro.public.dappnode.eth:0.1.0
18+
restart: always
19+
environment:
20+
- POSTGRES_USER=postgres
21+
- POSTGRES_PASSWORD_FILE=/config/POSTGRES_PASSWORD
22+
- POSTGRES_DB=splitpro
23+
- POSTGRES_PORT=5432
24+
healthcheck:
25+
test: ["CMD-SHELL", "pg_isready -U postgres -d splitpro"]
26+
interval: 10s
27+
timeout: 5s
28+
retries: 5
29+
command: >
30+
postgres
31+
-c shared_preload_libraries=pg_cron
32+
-c cron.database_name=splitpro
33+
-c cron.timezone=UTC
34+
volumes:
35+
- config:/config:ro
36+
- database:/var/lib/postgresql/data
37+
depends_on:
38+
- secrets
39+
40+
splitpro:
41+
build:
42+
context: .
43+
dockerfile: build/splitpro/Dockerfile
44+
image: splitpro.split-pro.public.dappnode.eth:0.1.0
45+
restart: always
46+
environment:
47+
- HOSTNAME=0.0.0.0
48+
- PORT=3000
49+
- POSTGRES_USER=postgres
50+
- POSTGRES_PASSWORD_FILE=/config/POSTGRES_PASSWORD
51+
- POSTGRES_CONTAINER_NAME=postgres
52+
- POSTGRES_PORT=5432
53+
- POSTGRES_DB=splitpro
54+
- NEXTAUTH_SECRET_FILE=/config/NEXTAUTH_SECRET
55+
- NEXTAUTH_URL=http://split-pro.public.dappnode:3000
56+
- NEXTAUTH_URL_INTERNAL=http://splitpro:3000
57+
- DEFAULT_HOMEPAGE=/balances
58+
- CURRENCY_RATE_PROVIDER=frankfurter
59+
- ENABLE_SENDING_INVITES=true
60+
- DISABLE_EMAIL_SIGNUP=false
61+
- INVITE_ONLY=false
62+
- UPLOAD_MAX_FILE_SIZE_MB=10
63+
- EMAIL_TLS_REJECT_UNAUTHORIZED="1"
64+
- FROM_EMAIL
65+
- EMAIL_SERVER_HOST
66+
- EMAIL_SERVER_PORT
67+
- EMAIL_SERVER_USER
68+
- EMAIL_SERVER_PASSWORD
69+
ports:
70+
- "3000:3000/tcp"
71+
volumes:
72+
- config:/config:ro
73+
- uploads:/app/uploads
74+
depends_on:
75+
postgres:
76+
condition: service_healthy
77+
78+
volumes:
79+
config: {}
80+
database: {}
81+
uploads: {}

‎setup-wizard.yml‎

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
version: "2"
2+
fields:
3+
- id: from_email
4+
target:
5+
type: environment
6+
name: FROM_EMAIL
7+
service: splitpro
8+
title: From email address
9+
description: >-
10+
Sender email address for magic-link login emails and invites.
11+
Example: splitpro@example.com
12+
required: true
13+
pattern: ^.+@.+\..+$
14+
patternErrorMessage: "Enter a valid email address"
15+
16+
- id: email_server_host
17+
target:
18+
type: environment
19+
name: EMAIL_SERVER_HOST
20+
service: splitpro
21+
title: SMTP host
22+
description: >-
23+
SMTP server hostname for sending emails.
24+
Example: smtp.gmail.com
25+
required: true
26+
pattern: ^.{1,253}$
27+
patternErrorMessage: "Enter a valid hostname"
28+
29+
- id: email_server_port
30+
target:
31+
type: environment
32+
name: EMAIL_SERVER_PORT
33+
service: splitpro
34+
title: SMTP port
35+
description: >-
36+
SMTP server port. Common ports: 587 (STARTTLS), 465 (SSL/TLS), 25 (insecure).
37+
required: true
38+
pattern: '^([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$'
39+
patternErrorMessage: "Enter a valid port number (1-65535)"
40+
41+
- id: email_server_user
42+
target:
43+
type: environment
44+
name: EMAIL_SERVER_USER
45+
service: splitpro
46+
title: SMTP username
47+
description: >-
48+
SMTP authentication username. For Gmail, use your full email address.
49+
required: true
50+
pattern: ^.{1,128}$
51+
patternErrorMessage: "Enter the SMTP username (1-128 characters)"
52+
53+
- id: email_server_password
54+
target:
55+
type: environment
56+
name: EMAIL_SERVER_PASSWORD
57+
service: splitpro
58+
secret: true
59+
title: SMTP password / API key
60+
description: >-
61+
SMTP authentication password or API key. For Gmail, use an App Password (not your account password).
62+
required: true
63+
pattern: ^.{1,256}$
64+
patternErrorMessage: "Enter the SMTP password (1-256 characters)"

0 commit comments

Comments
 (0)