Commit Graph

50 Commits

Author SHA1 Message Date
ab35b2bca1 feat: add miniPaint stack (paint.pivoine.art)
Added new paint service stack to the docker-compose infrastructure:

- **Paint stack** (paint.pivoine.art):
  - miniPaint: Web-based image editor built from GitHub
  - Multi-stage Docker build clones from https://github.com/viliusle/miniPaint
  - Features: layers, filters, drawing tools, text, shapes support
  - Client-side processing with no server uploads
  - Stateless architecture (no backups needed)

Infrastructure updates:
- Created paint/compose.yaml with Traefik routing and SSL
- Created paint/Dockerfile with Node.js build stage and nginx serve
- Added PAINT environment variables to arty.yml
- Updated compose.yaml include list
- Updated CLAUDE.md documentation

All services integrated with Traefik for SSL termination and include
Watchtower auto-update labels.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-06 19:44:14 +01:00
9cf0d160b4 feat: add HTTP auth and Sablier scale-to-zero to VERT stack
Added authentication and scale-to-zero capabilities to VERT file converter service:

**Authentication**:
- Added HTTP Basic Auth middleware using VERT_AUTH_USERS
- Auth middleware applied to web-secure router
- Credentials configured via .env file (htpasswd format)

**Sablier Scale-to-Zero**:
- Added sablier.enable and sablier.group labels
- Created proxy/dynamic/vert-sablier.yaml with Sablier middleware config
- 1-hour session duration before automatic scale-down
- Ghost theme with custom display name
- Middleware chain: sablier-vert@file → auth → compress

**Configuration Updates**:
- Added VERT_SABLIER_ENABLED to arty.yml (default: true)
- Updated CLAUDE.md with auth and Sablier documentation
- Middleware order ensures Sablier wakes container before auth check

Infrastructure:
- Follows same pattern as Scrapy service for auth
- Dynamic Traefik configuration for Sablier plugin
- Container name: vert_app (referenced in Sablier config)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-06 17:22:48 +01:00
d986b365e2 feat: add VERT file converter stack
Added VERT universal file format converter deployed at vert.pivoine.art:

**Vert stack** (vert.pivoine.art):
- vert: WebAssembly-based file converter
  - Supports 250+ file formats (images, audio, documents, video)
  - Client-side processing for privacy
  - No file size limits
  - No persistent data storage (stateless)

Infrastructure updates:
- Created vert/compose.yaml with Vert configuration
- Added VERT_* environment variables to arty.yml
- Updated compose.yaml to include vert stack
- Updated README.md and CLAUDE.md documentation
- No backup needed (stateless service)

All services integrated with Traefik for SSL termination and include
Watchtower auto-update labels.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-06 17:09:52 +01:00
889a518667 feat: add Joplin Server stack for note-taking and synchronization
Added Joplin Server deployment at joplin.pivoine.art:

**Joplin stack** (joplin.pivoine.art):
- joplin: Note-taking server with multi-device sync
  - PostgreSQL backend for data persistence
  - End-to-end encryption support
  - Compatible with official Joplin clients (desktop, mobile, CLI)
  - Markdown-based notes with attachments

Infrastructure updates:
- Added joplin database to PostgreSQL init script
- Updated compose.yaml to include joplin stack
- Added JOPLIN_* environment variables to arty.yml
- Added joplin-backup plan to restic (13th backup plan)
- Updated restic/compose.yaml with joplin_data volume mount
- Updated README.md and CLAUDE.md documentation

All services integrated with Traefik for SSL termination and include
Watchtower auto-update labels. Daily backups scheduled for 2 AM with
7 daily, 4 weekly, 6 monthly, and 2 yearly retention.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-06 12:24:07 +01:00
9b433e66ad feat: add Vaultwarden password manager stack
Added self-hosted password manager to The Falcon infrastructure:

**Vault Stack** (vault.pivoine.art):
- Vaultwarden (Bitwarden-compatible server)
- SQLite database for password storage
- WebSocket support for real-time sync
- TOTP and WebAuthn/U2F 2FA support
- Browser extensions and mobile apps compatible

**Configuration:**
- Domain: https://vault.pivoine.art
- Signups: Disabled (invite-only for security)
- Invitations: Enabled
- Password hints: Disabled (security best practice)
- First user becomes admin

**Backup Integration:**
- Added vaultwarden-backup plan to Restic
- Schedule: 8 AM daily (same as letsencrypt)
- Retention: 7 daily, 4 weekly, 12 monthly, 3 yearly
- Backup volume: vault_data mounted read-only

**Infrastructure Updates:**
- Created vault/compose.yaml following stack pattern
- Added VAULT_* environment variables to arty.yml
- Updated compose.yaml to include vault stack
- Added backup_vaultwarden_data volume to restic
- Updated restic/config.json with 12th backup plan

**Documentation:**
- Added Vault to CORE SYSTEMS in README
- Added to ship architecture diagram
- Documented in CLAUDE.md with configuration details
- Updated volume management sections
- Backup count increased from 11 to 12 plans

Critical data backed up with long retention (3 years yearly).
Compatible with official Bitwarden clients on all platforms.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-06 11:15:12 +01:00
c89769a23f feat: add Restic backup stack with Backrest UI
Added comprehensive backup solution to The Falcon infrastructure:

- **Restic Stack** (restic.pivoine.art):
  - Backrest web UI for managing restic backups
  - Automated scheduled backups with retention policies
  - Real-time backup status and monitoring
  - Restore capabilities via web interface

- **Backup Configuration**:
  - Target: /mnt/hidrive/users/valknar/Backup
  - Backs up all critical Docker volumes read-only:
    - PostgreSQL, Redis, Directus (uploads/bundle)
    - Awesome, Gotify, Scrapy (data/code)
    - n8n workflows, Filestash state
    - Linkwarden bookmarks/search index
    - Let's Encrypt SSL certificates

- **Infrastructure Updates**:
  - Added RESTIC_* environment variables to arty.yml
  - Updated compose.yaml to include restic stack
  - Updated README.md and CLAUDE.md documentation
  - Configured Traefik routing with SSL

All volumes mounted read-only to backup container for safety.
Backrest data persisted across: data, config, cache, tmp volumes.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-06 10:13:07 +01:00
48335e13c0 fix: use latest tag for Sablier image instead of 1.10.1 2025-11-06 09:25:09 +01:00
632d63c85a feat: add Sablier v1.10.1 plugin for dynamic scaling
Added Sablier plugin and service for scale-to-zero capabilities:

**Traefik Plugin:**
- Added experimental.plugins.sablier configuration
- Plugin version: v1.10.1
- Module: github.com/acouvreur/sablier/plugins/traefik

**Sablier Service:**
- Created sablier/compose.yaml with Sablier server
- Uses Docker provider for container management
- Mounts Docker socket for container control
- Connected to falcon_network

**Configuration:**
- Added SABLIER_COMPOSE_PROJECT_NAME to arty.yml
- Added SABLIER_VERSION to arty.yml
- Included sablier stack in compose.yaml

**Usage:**
Services can now use Sablier middleware to automatically
scale to zero when idle and start on demand when accessed.

Example middleware configuration:
```yaml
http:
  middlewares:
    my-sablier:
      plugin:
        sablier:
          sablierUrl: http://sablier_app:10000
          names: service-name
          sessionDuration: 1m
```

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-06 09:23:20 +01:00
ec76db69ed feat: add Traefik dashboard at proxy.pivoine.art with basic auth
Added secure access to Traefik dashboard:

**Dashboard Configuration:**
- Enabled Traefik API and dashboard
- Configured router for proxy.pivoine.art
- Secured with HTTP Basic Auth middleware

**Security:**
- Created .htpasswd file with bcrypt credentials
- Added dashboard-auth middleware to dynamic/security.yaml
- Mounted .htpasswd file read-only in container
- Dashboard only accessible via HTTPS with valid credentials

**Environment Updates:**
- Added PROXY_AUTH_USERS to .env (htpasswd hash)
- Added PROXY_TRAEFIK_HOST to arty.yml

Dashboard accessible at: https://proxy.pivoine.art

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-06 08:17:42 +01:00
f5728b5f9c feat: add Linkwarden bookmark manager stack
Added new Links stack to Falcon infrastructure:

**Links Stack (links.pivoine.art):**
- Linkwarden bookmark manager with PostgreSQL backend
- Meilisearch v1.12.8 for full-text search
- Browser extension support
- Screenshot and PDF archiving
- Collaborative bookmark sharing

**Infrastructure Updates:**
- Created links/compose.yaml with linkwarden and meilisearch services
- Added linkwarden database to PostgreSQL init script
- Added LINKS_* environment variables to arty.yml
- Updated compose.yaml to include links stack
- Cleaned up .env to contain only secrets
- Added all EMAIL_* variables to .env

**Documentation:**
- Updated CLAUDE.md with Links service details
- Updated README.md with Links in CORE SYSTEMS table
- Added linkwarden_data and meili_data volumes to docs

**Required Secrets (in .env):**
- LINKS_NEXTAUTH_SECRET: NextAuth.js session encryption
- LINKS_MEILI_MASTER_KEY: Meilisearch API authentication

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-06 07:49:49 +01:00
0b839edd72 fix: update SCRAPYD_URL to point to /scrapyd path
Updated default SCRAPYD_URL from https://scrapy.pivoine.art to
https://scrapy.pivoine.art/scrapyd to match new routing
2025-11-05 06:43:42 +01:00
b8bb380ea5 fix: remove SCRAPY_AUTH_USERS default from arty.yml
Removed default SCRAPY_AUTH_USERS value from arty.yml to ensure
credentials are only read from .env file (secrets).

This fixes login issues where the default placeholder value was
being used instead of actual credentials from .env.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-04 23:28:09 +01:00
b026878c38 feat: add HTTP Basic Auth to Scrapyd for security
Added Traefik Basic Auth middleware to secure Scrapyd web interface:
- Added basicauth middleware to scrapyd service labels
- Middleware chains auth with compression for HTTPS routes
- Added SCRAPY_AUTH_USERS environment variable to arty.yml
- Credentials stored in .env (htpasswd format with escaped $)

Access to scrapy.pivoine.art now requires username/password.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-04 23:17:13 +01:00
785942da61 feat: add Scrapy, n8n, and Filestash stacks to Falcon
Added three new service stacks to the docker-compose infrastructure:

- **Scrapy stack** (scrapy.pivoine.art):
  - scrapyd: Web scraping daemon with web interface (port 6800)
  - scrapy: Development container for spider commands
  - scrapyrt: Real-time API for running spiders (port 9080)

- **n8n stack** (n8n.pivoine.art):
  - Workflow automation platform with PostgreSQL backend
  - 200+ integrations for automated tasks
  - Runners enabled for task execution
  - Webhook support for external triggers

- **Filestash stack** (stash.pivoine.art):
  - Web-based file manager with multi-backend support
  - Supports SFTP, S3, Dropbox, Google Drive, FTP, WebDAV
  - In-browser file viewing and media playback

Infrastructure updates:
- Updated PostgreSQL init script to create n8n database
- Added environment variables to arty.yml for all three stacks
- Updated compose.yaml include list
- Updated CLAUDE.md and README.md documentation
- Normalized service names in existing stacks (gotify, proxy, umami, vpn)

All services integrated with Traefik for SSL termination and include
Watchtower auto-update labels.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-04 22:36:13 +01:00
9e7583c562 feat: add Watchtower for automatic Docker image updates
- Created watch/compose.yaml with Watchtower service configuration
- Added Watchtower environment variables to arty.yml
- Enabled Watchtower monitoring for sexy_frontend container
- Configurable via environment variables (poll interval, cleanup, logging)
- Label-based updates: only containers with watchtower.enable=true

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-29 06:40:32 +01:00
4e434378e6 chore: simplify database export/import scripts in arty.yml
- Remove dependency on .env file for database credentials
- Use direct database user and database name in scripts
- Update sexy/db/import to use correct credentials (valknar/directus)
- Remove artifact download step from awsm/import (not needed)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-29 04:16:17 +01:00
df78f3bfc3 refactor: apply env variable pattern to all sexy scripts
Extended environment variable usage to export scripts and simplified
the env loading pattern across all scripts.

Changes:
- sexy/db/export: now uses $DB_USER and $SEXY_DB_NAME
- sexy/export/all: now uses $DB_USER and $SEXY_DB_NAME
- All scripts: changed from 'set -a && source .env && set +a' to
  'export $(cat .env | xargs)' for cleaner, more concise syntax

This ensures consistent variable usage across all import/export scripts
and makes them work correctly in all environments.
2025-10-28 23:32:14 +01:00
4411698e9b fix: source .env file before executing import scripts
Added 'set -a && source .env && set +a' at the beginning of import scripts
to load environment variables from .env file.

This ensures DB_USER and SEXY_DB_NAME are properly set before executing
docker commands, regardless of whether arty exports them or not.

- set -a: enables automatic export of variables
- source .env: loads variables from .env file
- set +a: disables automatic export
2025-10-28 23:27:33 +01:00
6e47a85055 fix: use $VAR instead of ${VAR} for arty variable expansion
Changed from ${DB_USER}/${SEXY_DB_NAME} to $DB_USER/$SEXY_DB_NAME
for proper variable expansion in arty scripts.

Arty exports environment variables before executing scripts, so simple
$VAR syntax works correctly, while ${VAR} was being treated as literal
text in the shell context.
2025-10-28 23:26:57 +01:00
d3d9c7d0e2 fix: use hardcoded DB credentials for VPS production
Changed from ${DB_USER} and ${SEXY_DB_NAME} variables to hardcoded
values 'valknar' and 'directus' for production VPS environment.

Arty environment variables are not exported to the shell where scripts
execute, so the variables were empty when docker exec commands ran.

Production VPS always uses:
- PostgreSQL container: core_postgres
- DB user: valknar
- Database name: directus

These values are stable for production and won't change.
2025-10-28 23:26:12 +01:00
129a759795 fix: remove if/else from sexy/import/all to avoid arty syntax error
Removed interactive confirmation prompt (read -p and if/else/fi) from
sexy/import/all script. The if/else control structure caused syntax errors
when executed via arty due to how arty appends "$@" to scripts.

The script now runs directly without confirmation. Users should be careful
when running this destructive operation as it will immediately:
1. Drop and recreate all database tables
2. Apply Directus schema snapshot
3. Restart the Directus API

Warning message is still displayed before execution.
2025-10-28 23:24:36 +01:00
dee16f7321 fix: use environment variables in sexy import scripts
Changed hardcoded database credentials to use environment variables:
- `-U sexy` → `-U ${DB_USER}`
- `-d sexy` → `-d ${SEXY_DB_NAME}`

Also added missing interactive confirmation prompt to sexy/import/all script.

This fixes the script error on VPS where:
- VPS uses: DB_USER=valknar, SEXY_DB_NAME=directus
- Local dev uses: DB_USER=sexy, SEXY_DB_NAME=sexy (or directus)

The scripts now work correctly in both environments by reading
the appropriate values from .env files via arty's environment system.
2025-10-28 23:19:00 +01:00
c7608ae0b5 fix: scripts newline format 2025-10-28 23:13:19 +01:00
960056cdf9 feat: add database and schema import scripts to arty.yml
Added three import scripts for sexy.pivoine.art database restoration:

1. sexy/db/import
   - Imports PostgreSQL database from directus.sql
   - Includes warning about destructive operation
   - Restarts Directus API after import

2. sexy/schema/import
   - Applies Directus schema snapshot from schema.yaml
   - Uses 'directus schema apply --yes'
   - Restarts Directus API after import

3. sexy/import/all
   - Combined import with interactive confirmation
   - Prompts user to type 'yes' to proceed
   - Imports database then applies schema
   - Complete restoration workflow

All scripts include comprehensive comments and safety warnings.
Complements existing export scripts (sexy/db/export, sexy/schema/export, sexy/export/all).

Usage:
  pnpm arty sexy/db/import       # Import database only
  pnpm arty sexy/schema/import   # Import schema only
  pnpm arty sexy/import/all      # Full import (with confirmation)
2025-10-28 22:12:25 +01:00
800c59ff94 feat: directus scheme 2025-10-28 21:24:34 +01:00
c3e6327cb6 feat: artifact from github script 2025-10-26 21:08:56 +01:00
0ebc4d0e4e feat: artifact from github script 2025-10-26 20:56:25 +01:00
0c45ab185f feat: sdf 2025-10-26 20:32:16 +01:00
da29eaa80b feat: sdf 2025-10-26 20:27:06 +01:00
8c37761ee9 feat: sdf 2025-10-26 20:18:47 +01:00
1d7dfa667d feat: sdf 2025-10-26 20:07:08 +01:00
dd90fb2b78 feat: sdf 2025-10-26 20:04:56 +01:00
2704987916 feat: sdf 2025-10-26 19:59:11 +01:00
904491d983 feat: sdf 2025-10-26 19:43:34 +01:00
46b67d00c7 feat: sdf 2025-10-26 19:41:56 +01:00
e2cc37c3c8 fix: awsm labels 2025-10-26 17:52:57 +01:00
a1d3c33dca feat: awsm 2025-10-26 17:05:56 +01:00
d6b38fab8c fix: github workflow 2025-10-26 14:15:21 +01:00
db98d388a8 feat: arty cmd args passing 2025-10-26 12:33:05 +01:00
434b974758 feat: extend arty for new arty 2025-10-26 12:07:06 +01:00
903e585659 fix: umami 2025-10-26 11:52:01 +01:00
142fd5442f feat: uploads import/export 2025-10-26 11:40:07 +01:00
b4568e4756 feat: uploads import/export 2025-10-26 11:39:25 +01:00
dc74fdfa98 feat: uploads import/export 2025-10-26 11:38:32 +01:00
978107ba47 fix: arty cmds 2025-10-26 11:33:39 +01:00
0ce0eec479 fix: arty cmds 2025-10-26 11:20:49 +01:00
ecdb152a36 fix: db vars 2025-10-26 11:11:31 +01:00
b2b71c87c8 fix: network name 2025-10-26 11:05:19 +01:00
d6943087f0 feat: sexy 2025-10-26 10:54:01 +01:00
a371a33682 a new start 2025-10-25 13:58:11 +02:00