Compare commits

...

5 Commits

Author SHA1 Message Date
7b484d640d fix: configure dedicated network for GeoGuesser AI services
Previously all three services (postgres, backend, frontend) were using
network_mode: bridge, which put them on separate Docker bridge networks
and prevented inter-service communication.

Changes:
- Created dedicated 'geoguesser-ai-network' bridge network
- Connected all three services to this shared network
- Removed deprecated 'external_links' directives
- Services can now communicate via container names (DNS resolution)

This enables:
- Backend to connect to PostgreSQL at 'alxndrhi-geoguesser-ai-postgres'
- Frontend to connect to Backend at 'alxndrhi-geoguesser-ai-backend'
- Proper service isolation from other apps on the system

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-26 23:18:09 +01:00
4afcc37386 fix: remove invalid store_app_id from GeoGuesser AI config
The store_app_id field was incorrectly placed in the global x-casaos
section, causing "app not found" errors during installation. This field
is not needed based on working app examples (tududi) and was preventing
the app from being installed.

Fixes installation error: "app not found"

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-26 23:02:45 +01:00
d9c6d2f8ce Add GeoGuesser AI app to store
New CasaOS app for AI-powered geographic image location analysis.
Features:
- Three-tier architecture (PostgreSQL, Backend API, Frontend)
- Claude AI integration for image analysis
- All environment variables configurable
- Only frontend port exposed externally
- Container registry authentication required

Note: Icon file (icon.png) still needs to be added.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-26 22:52:18 +01:00
de21abedc7 Update docker compose files of all projects 2025-11-26 18:44:21 +01:00
e79ce045aa Update gitignore 2025-11-26 18:43:51 +01:00
6 changed files with 248 additions and 4 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
.claude

View File

@@ -34,9 +34,17 @@ x-casaos:
architectures: architectures:
- amd64 - amd64
- arm64 - arm64
main: comfyui
author: Alexander Hinrichs author: Alexander Hinrichs
category: Generative AI category: Generative AI
main: comfyui developer: comfyanonymous
description:
en_us: A powerful and modular Stable Diffusion GUI with a graph/nodes
interface. Design and execute advanced AI image generation workflows
with support for SD1.x, SD2.x, SDXL, and various other models.
Requires NVIDIA GPU for optimal performance.
tagline:
en_us: Node-based interface for Stable Diffusion workflows
icon: https://git.ct.hinrichs.dev/alexander/CasaOS-alexanders-AppStore/raw/branch/main/Apps/comfyui/icon.png icon: https://git.ct.hinrichs.dev/alexander/CasaOS-alexanders-AppStore/raw/branch/main/Apps/comfyui/icon.png
index: / index: /
port_map: "8188" port_map: "8188"

View File

@@ -0,0 +1,60 @@
# GeoGuesser AI - CasaOS App
## Icon Required
This app needs an icon file (icon.png) to be added to this directory.
The icon should be:
- PNG format
- Square dimensions (recommended: 256x256 or 512x512)
- Represents geographic/location analysis theme
## Authentication Setup
This app requires authentication to pull container images from git.hinrichs.dev.
On the CasaOS host system, configure Docker/Podman authentication:
```bash
docker login git.hinrichs.dev
```
Or create/update ~/.docker/config.json with credentials.
## Environment Variables
All environment variables from the original .env file are configurable during installation:
### Required
- `CLAUDE_API_KEY`: Anthropic Claude API key (get from https://console.anthropic.com/)
### Database (defaults provided)
- `DB_USER`: PostgreSQL username (default: geolocator)
- `DB_PASSWORD`: PostgreSQL password (default: geolocator_password)
- `DB_NAME`: PostgreSQL database name (default: geolocator_db)
- `DB_SSLMODE`: SSL mode for database (default: disable)
### Application Settings
- `ENV`: Application environment (default: production)
- `PORT`: Backend API port (default: 3000)
- `CLAUDE_MODEL`: Claude model to use (default: claude-sonnet-4-5)
- `CLAUDE_API_URL`: Claude API endpoint (default: https://api.anthropic.com/v1/messages)
- `USE_MOCK_AI`: Use mock AI for testing (default: false)
### File Upload
- `MAX_IMAGE_SIZE_MB`: Maximum image upload size (default: 10)
- `ALLOWED_IMAGE_TYPES`: Allowed MIME types (default: image/jpeg,image/png,image/webp)
### External APIs
- `OVERPASS_API_URL`: OpenStreetMap Overpass API (default: https://overpass-api.de/api/interpreter)
- `ELEVATION_API_URL`: Elevation API (default: https://api.open-elevation.com/api/v1/lookup)
### CORS & Logging
- `ALLOWED_ORIGINS`: CORS allowed origins (default: http://localhost:8080)
- `LOG_LEVEL`: Log level (default: info)
- `LOG_FORMAT`: Log format (default: json)
## Ports
- 8080: Web UI (exposed externally)
- 3000: Backend API (internal only)
- 5432: PostgreSQL (internal only)
## Volumes
- `/DATA/AppData/$AppID/postgres_data`: PostgreSQL database storage
- `/DATA/AppData/$AppID/uploads`: Uploaded images storage

View File

@@ -0,0 +1,159 @@
name: alxndrhi-geoguesser-ai
services:
postgres:
container_name: alxndrhi-geoguesser-ai-postgres
image: postgres:16-alpine
environment:
POSTGRES_USER: ${DB_USER:-geolocator}
POSTGRES_PASSWORD: ${DB_PASSWORD:-geolocator_password}
POSTGRES_DB: ${DB_NAME:-geolocator_db}
volumes:
- type: bind
source: /DATA/AppData/$AppID/postgres_data
target: /var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-geolocator} -d ${DB_NAME:-geolocator_db}"]
interval: 10s
timeout: 5s
retries: 5
networks:
- geoguesser-ai-network
restart: unless-stopped
backend:
container_name: alxndrhi-geoguesser-ai-backend
image: git.hinrichs.dev/alexander/geoguesser-ai/backend:latest
environment:
ENV: ${ENV:-production}
PORT: ${PORT:-3000}
DATABASE_URL: postgresql://${DB_USER:-geolocator}:${DB_PASSWORD:-geolocator_password}@alxndrhi-geoguesser-ai-postgres:5432/${DB_NAME:-geolocator_db}?sslmode=${DB_SSLMODE:-disable}
CLAUDE_API_KEY: ${CLAUDE_API_KEY}
CLAUDE_API_URL: ${CLAUDE_API_URL:-https://api.anthropic.com/v1/messages}
CLAUDE_MODEL: ${CLAUDE_MODEL:-claude-sonnet-4-5}
USE_MOCK_AI: ${USE_MOCK_AI:-false}
MAX_IMAGE_SIZE_MB: ${MAX_IMAGE_SIZE_MB:-10}
ALLOWED_IMAGE_TYPES: ${ALLOWED_IMAGE_TYPES:-image/jpeg,image/png,image/webp}
OVERPASS_API_URL: ${OVERPASS_API_URL:-https://overpass-api.de/api/interpreter}
ELEVATION_API_URL: ${ELEVATION_API_URL:-https://api.open-elevation.com/api/v1/lookup}
ALLOWED_ORIGINS: ${ALLOWED_ORIGINS:-http://localhost:8080}
LOG_LEVEL: ${LOG_LEVEL:-info}
LOG_FORMAT: ${LOG_FORMAT:-json}
volumes:
- type: bind
source: /DATA/AppData/$AppID/uploads
target: /app/uploads
depends_on:
postgres:
condition: service_healthy
healthcheck:
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:3000/api/v1/health"]
interval: 30s
timeout: 10s
retries: 3
networks:
- geoguesser-ai-network
restart: unless-stopped
frontend:
container_name: alxndrhi-geoguesser-ai-frontend
image: git.hinrichs.dev/alexander/geoguesser-ai/frontend:latest
ports:
- target: 8080
published: "8080"
protocol: tcp
depends_on:
- backend
networks:
- geoguesser-ai-network
restart: unless-stopped
x-casaos:
envs:
- container: ENV
description:
en_us: Application environment (development/production)
- container: PORT
description:
en_us: Backend API port
- container: DB_USER
description:
en_us: PostgreSQL database username
- container: DB_PASSWORD
description:
en_us: PostgreSQL database password
- container: DB_NAME
description:
en_us: PostgreSQL database name
- container: DB_SSLMODE
description:
en_us: PostgreSQL SSL mode (disable/require)
- container: CLAUDE_API_KEY
description:
en_us: Anthropic Claude API key for AI analysis
- container: CLAUDE_API_URL
description:
en_us: Claude API endpoint URL
- container: CLAUDE_MODEL
description:
en_us: Claude model identifier to use
- container: USE_MOCK_AI
description:
en_us: Use mock AI responses (true/false)
- container: MAX_IMAGE_SIZE_MB
description:
en_us: Maximum upload image size in MB
- container: ALLOWED_IMAGE_TYPES
description:
en_us: Comma-separated list of allowed image MIME types
- container: OVERPASS_API_URL
description:
en_us: OpenStreetMap Overpass API endpoint
- container: ELEVATION_API_URL
description:
en_us: Elevation data API endpoint
- container: ALLOWED_ORIGINS
description:
en_us: CORS allowed origins (comma-separated)
- container: LOG_LEVEL
description:
en_us: Application log level (debug/info/warn/error)
- container: LOG_FORMAT
description:
en_us: Log output format (json/text)
ports:
- container: "8080"
description:
en_us: Web UI HTTP Port
volumes:
- container: /var/lib/postgresql/data
description:
en_us: PostgreSQL database storage
- container: /app/uploads
description:
en_us: Uploaded images storage
networks:
geoguesser-ai-network:
driver: bridge
name: geoguesser-ai-network
x-casaos:
architectures:
- amd64
- arm64
main: frontend
author: Alexander Hinrichs
category: Utilities
developer: Alexander Hinrichs
description:
en_us: An AI-powered geographic image analyzer that uses Claude AI to
identify locations from photos. Upload images and get detailed
geolocation analysis including coordinates, landmarks, and contextual
information. Requires Anthropic API key for Claude AI access.
tagline:
en_us: AI-powered geographic image location analyzer
icon: https://git.ct.hinrichs.dev/alexander/CasaOS-alexanders-AppStore/raw/branch/main/Apps/geoguesser-ai/icon.png
index: /
port_map: "8080"
scheme: http
title:
en_us: GeoGuesser AI

View File

@@ -7,7 +7,7 @@ services:
- GITEA_INSTANCE_URL=https://GITEA_INSTANCE_URL_GOES_HERE - GITEA_INSTANCE_URL=https://GITEA_INSTANCE_URL_GOES_HERE
- GITEA_RUNNER_NAME=runner-01 - GITEA_RUNNER_NAME=runner-01
- GITEA_RUNNER_REGISTRATION_TOKEN=GITEA_TOKEN - GITEA_RUNNER_REGISTRATION_TOKEN=GITEA_TOKEN
image: docker.io/gitea/act_runner:latest image: docker.io/gitea/act_runner:0.2.13
labels: labels:
icon: https://git.ct.hinrichs.dev/alexander/CasaOS-alexanders-AppStore/raw/branch/main/Apps/gitea-runner/icon.png icon: https://git.ct.hinrichs.dev/alexander/CasaOS-alexanders-AppStore/raw/branch/main/Apps/gitea-runner/icon.png
restart: unless-stopped restart: unless-stopped
@@ -26,8 +26,16 @@ x-casaos:
architectures: architectures:
- amd64 - amd64
- arm64 - arm64
main: runner
author: Alexander Hinrichs author: Alexander Hinrichs
category: Development category: Development
developer: Gitea
description:
en_us: A lightweight CI/CD runner for Gitea Actions, compatible with
GitHub Actions workflows. Enables automated build, test, and
deployment pipelines for your self-hosted Git repositories.
tagline:
en_us: Self-hosted CI/CD runner for Gitea Actions
icon: https://git.ct.hinrichs.dev/alexander/CasaOS-alexanders-AppStore/raw/branch/main/Apps/gitea-runner/icon.png icon: https://git.ct.hinrichs.dev/alexander/CasaOS-alexanders-AppStore/raw/branch/main/Apps/gitea-runner/icon.png
index: / index: /
store_app_id: gitea-runner store_app_id: gitea-runner

View File

@@ -2,7 +2,7 @@ name: alxndrhi-tududi
services: services:
tududi: tududi:
container_name: alxndrhi-tududi container_name: alxndrhi-tududi
image: chrisvel/tududi:latest image: chrisvel/tududi:0.86.1
ports: ports:
- target: 3002 - target: 3002
published: "3002" published: "3002"
@@ -25,9 +25,17 @@ x-casaos:
architectures: architectures:
- amd64 - amd64
- arm64 - arm64
main: tududi
author: Alexander Hinrichs author: Alexander Hinrichs
category: Project Management category: Project Management
main: tududi developer: chrisvel
description:
en_us: A minimalist, open-source project management and task tracking
tool. Organize projects, manage tasks with priorities and deadlines,
and collaborate with teams through a clean, distraction-free
interface. Supports file attachments and activity tracking.
tagline:
en_us: Simple and elegant project management tool
icon: https://git.ct.hinrichs.dev/alexander/CasaOS-alexanders-AppStore/raw/branch/main/Apps/tududi/icon.jpeg icon: https://git.ct.hinrichs.dev/alexander/CasaOS-alexanders-AppStore/raw/branch/main/Apps/tududi/icon.jpeg
index: / index: /
port_map: "3002" port_map: "3002"