Add Firefly III compose stack with k8s migration scaffold
PostgreSQL 16, Redis 7, Firefly III core + data importer, cron container. Health checks on all services. .env.example documents all variables. k8s/ directory scaffolded for future migration. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
48
.env.example
Normal file
48
.env.example
Normal file
@@ -0,0 +1,48 @@
|
||||
# -------------------------------------------------------
|
||||
# Firefly III — environment configuration
|
||||
# Copy to .env and fill in values before starting.
|
||||
# -------------------------------------------------------
|
||||
|
||||
# --- App ---
|
||||
APP_ENV=production
|
||||
APP_DEBUG=false
|
||||
APP_KEY=base64:REPLACE_WITH_GENERATED_KEY
|
||||
APP_URL=https://firefly.jbnel.dev
|
||||
TRUSTED_PROXIES=**
|
||||
|
||||
# --- Database (PostgreSQL) ---
|
||||
DB_CONNECTION=pgsql
|
||||
DB_HOST=db
|
||||
DB_PORT=5432
|
||||
DB_DATABASE=firefly
|
||||
DB_USERNAME=firefly
|
||||
DB_PASSWORD=REPLACE_WITH_STRONG_PASSWORD
|
||||
|
||||
# Required by the postgres container
|
||||
POSTGRES_DB=firefly
|
||||
POSTGRES_USER=firefly
|
||||
POSTGRES_PASSWORD=REPLACE_WITH_STRONG_PASSWORD
|
||||
|
||||
# --- Redis ---
|
||||
REDIS_HOST=redis
|
||||
REDIS_PORT=6379
|
||||
REDIS_PASSWORD=REPLACE_WITH_STRONG_PASSWORD
|
||||
|
||||
# --- Cache / Sessions ---
|
||||
CACHE_DRIVER=redis
|
||||
SESSION_DRIVER=redis
|
||||
|
||||
# --- Mail (optional) ---
|
||||
MAIL_MAILER=log
|
||||
MAIL_HOST=
|
||||
MAIL_PORT=
|
||||
MAIL_USERNAME=
|
||||
MAIL_PASSWORD=
|
||||
MAIL_ENCRYPTION=
|
||||
MAIL_FROM=firefly@jbnel.dev
|
||||
|
||||
# --- Data Importer ---
|
||||
# Set after Firefly III is running and you've created a Personal Access Token
|
||||
FIREFLY_III_URL=http://app:8080
|
||||
VANITY_URL=https://import.jbnel.dev
|
||||
FIREFLY_III_ACCESS_TOKEN=REPLACE_AFTER_FIRST_RUN
|
||||
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
.env
|
||||
*.log
|
||||
85
docker-compose.yml
Normal file
85
docker-compose.yml
Normal file
@@ -0,0 +1,85 @@
|
||||
services:
|
||||
|
||||
app:
|
||||
image: fireflyiii/core:latest
|
||||
restart: unless-stopped
|
||||
env_file: .env
|
||||
volumes:
|
||||
- firefly_upload:/var/www/html/storage/upload
|
||||
networks:
|
||||
- firefly
|
||||
depends_on:
|
||||
db:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_healthy
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 60s
|
||||
|
||||
cron:
|
||||
image: fireflyiii/core:latest
|
||||
restart: unless-stopped
|
||||
env_file: .env
|
||||
command: sh -c "sleep 60 && php /var/www/html/artisan firefly-iii:cron"
|
||||
entrypoint: /bin/sh
|
||||
networks:
|
||||
- firefly
|
||||
depends_on:
|
||||
- app
|
||||
|
||||
importer:
|
||||
image: fireflyiii/data-importer:latest
|
||||
restart: unless-stopped
|
||||
env_file: .env
|
||||
networks:
|
||||
- firefly
|
||||
depends_on:
|
||||
app:
|
||||
condition: service_healthy
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 30s
|
||||
|
||||
db:
|
||||
image: postgres:16-alpine
|
||||
restart: unless-stopped
|
||||
env_file: .env
|
||||
volumes:
|
||||
- firefly_db:/var/lib/postgresql/data
|
||||
networks:
|
||||
- firefly
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
redis:
|
||||
image: redis:7-alpine
|
||||
restart: unless-stopped
|
||||
command: redis-server --requirepass ${REDIS_PASSWORD}
|
||||
volumes:
|
||||
- firefly_redis:/data
|
||||
networks:
|
||||
- firefly
|
||||
healthcheck:
|
||||
test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
volumes:
|
||||
firefly_upload:
|
||||
firefly_db:
|
||||
firefly_redis:
|
||||
|
||||
networks:
|
||||
firefly:
|
||||
driver: bridge
|
||||
36
k8s/README.md
Normal file
36
k8s/README.md
Normal file
@@ -0,0 +1,36 @@
|
||||
# Kubernetes Manifests
|
||||
|
||||
Placeholder for k8s migration. Planned structure:
|
||||
|
||||
```
|
||||
k8s/
|
||||
├── namespace.yaml
|
||||
├── secrets/
|
||||
│ └── firefly-secrets.yaml # APP_KEY, DB_PASSWORD, REDIS_PASSWORD
|
||||
├── configmaps/
|
||||
│ └── firefly-config.yaml # APP_URL, DB_HOST, CACHE_DRIVER, etc.
|
||||
├── postgres/
|
||||
│ ├── pvc.yaml
|
||||
│ ├── deployment.yaml
|
||||
│ └── service.yaml
|
||||
├── redis/
|
||||
│ ├── pvc.yaml
|
||||
│ ├── deployment.yaml
|
||||
│ └── service.yaml
|
||||
├── firefly/
|
||||
│ ├── pvc.yaml # upload storage
|
||||
│ ├── deployment.yaml
|
||||
│ ├── service.yaml
|
||||
│ └── ingress.yaml
|
||||
└── importer/
|
||||
├── deployment.yaml
|
||||
├── service.yaml
|
||||
└── ingress.yaml
|
||||
```
|
||||
|
||||
## Migration notes
|
||||
|
||||
- `docker-compose.yml` env vars split into Secrets (passwords, APP_KEY) and ConfigMaps (URLs, driver settings)
|
||||
- Named volumes → PersistentVolumeClaims
|
||||
- Health checks → liveness/readiness probes (already defined in compose)
|
||||
- The `firefly` bridge network → k8s Services with DNS names matching compose service names
|
||||
Reference in New Issue
Block a user