📋 Sardonic Workflow

Kompletný sprievodca vývojovými procesmi a nasadením

🆕 Nový Projekt

1

Počiatočné Ročenie

Žiadna diskušia → pád

Vždy začíname s jasným požiadavkou. Ak nie je zadaná explicitne, považujeme za nedostatočnú.

# Nesprávne:
"urob to what ever"

# Správne:
"Implementovať auth s JWT pre API endpoint /api/login s rate limitingom"
2

Navrhnut DB schému (ak potrebné) → Vytvor migráciu

Ak projekt vyžaduje databázu, navrhnut schému a vytvor migračný skript. Zabezpečte, že migrácie sú idempotentné a možnostej spätné vrátenie (down migration).

-- migrations/001_init_schema.sql
CREATE TABLE IF NOT EXISTS projects (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT NOW()
);

Potom aplikuj migráciu cez Dokku:

dokku run <app> psql -f migrations/001_init_schema.sql
3

Vytvor GitHub Repo (private)

Vytvor nové private GitHub repozitár s názvom sardonicrepulsion/<project-name>.

# Použi GitHub CLI
gh repo create <project-name> --private --source=. --remote

# Alebo manuálne cez UI a potom:
git remote add origin git@github.com:sardonicrepulsion/<project-name>.git
git push -u origin main
4

Vytvor Dokku App

dokku apps:create <project-name>
5

Konfigurácia siete (ak potrebné MySQL)

Ak projekt vyžaduje MySQL alebo iné služby, pripojiť sieť:

dokku network:set <project-name> attach-post-deploy dokku-services
# Pre MySQL:
dokku mysql:link <project-name> <mysql-service-name>
6

Nasadiť prvú verziu

git push dokku main
7

Nastaviť SSL

# Získaj certifikát pomocou Certbot (webroot)
certbot certonly --webroot -w /var/www/html -d <project>.sardonicrepulsion.com

# Alebo použij Dokku Let's Encrypt plugin:
dokku letsencrypt <project-name>
8

Pridať do Projects DB

Ak ide o "project" a nie len nástroj, pridaj záznam do Projekty DB pomocou API alebo priamo.

curl -X POST https://internal.db/api/projects \
  -H "Authorization: Bearer $INTERNAL_TOKEN" \
  -d '{"name":"<project-name>","domain":"<project>.sardonicrepulsion.com","repo":"sardonicrepulsion/<project-name>"}'
9

Pridať do Backup Scriptu

Ak projekt vyžaduje špeciálne zálohovanie, uprav skript/zálohu (napr. /opt/scripts/backup.sh).

# Backup <project> database
pg_dump -Fc -U postgres <project-db> > /backup/<project>/$(date +%F).dump
10

Pridať do Monitoring/Healthcheck

Pridaj doménu do monitorovacieho skriptu, ktorý pravidelně kontroluje health endpointy.

# V monitoring/check_all.sh alebo podobnom
services+=("https://<project>.sardonicrepulsion.com/health")
11

Pridať DNS A záznam

Ak subdoména ešte neexistuje, pridaj A záznam smerujúci na server IP (pomocou provider API alebo manuálne).

# Príklad: Cloudflare API
curl -X POST "https://api.cloudflare.com/client/v4/zones/<zone-id>/dns_records" \
  -H "Authorization: Bearer $CF_TOKEN" \
  -d '{"type":"A","name":"<project>","content":"<server-ip>","ttl":120}'
12

Vytvoriť Webhook pre Auto-Deploy

V Deployer UI (https://deploy.sardonicrepulsion.com) vytvor nový webhook pre toto projekt, ktorý spustí automatické nasadenie pri push na GitHub main.

# URL: https://deploy.sardonicrepulsion.com/webhook?app=<project-name>
# Secret: nakonfigurované v Deployer
13

Testovať Health Endpoint a Logs

curl -f https://<project>.sardonicrepulsion.com/health || echo "FAIL"
dokku logs <project-name> --tail
14

Zatvoriť Task a Dokumentovať v MEMORY

Označ úlohu ako hotovú a zaznamenej v MEMORY systéme:

memory-cli task close <task-id> --note "Project setup complete"
# A pridaj sumár do MEMORY.md

🔄 Aktualizácia Existujúceho Projektu

1

Receive Task/Feature

Prijať úlohu z konverzácie, memory system alebo project board.

2

Create Feature Branch

Vytvor feature branch podľa Conventional Commits:

git checkout main
git pull origin main
git checkout -b feature/functional-a-auth

Naming: fix/, feat/, chore/, docs/, refactor/

3

Make Changes

Vykonaj potrebné zmeny v kóde, konfigurácii alebo assets.

4

Commit (Semantic)

git add .
git status  # Verify
git commit -m "feat(auth): add JWT login endpoint with rate limiting"

# If multiple logical changes, split commits:
git add <file1> <file2>
git commit -m "feat(api): add login validation"
git add <file3>
git commit -m "feat(security): implement rate limiting"
5

Push Branch

git push origin feature/functional-a-auth
6

Open PR on GitHub

Vytvor Pull Request s template:

  • Title: feat(scope): short description
  • Description:
    • What changed
    • Why it changed
    • Testing steps (curl examples)
    • Related issues
# Testing example:
curl -X POST https://api.example.com/login \
  -H "Content-Type: application/json" \
  -d '{"email":"test@example.com","password":"secret"}' \
  -v
7

Review

  • Self-review changes via GitHub UI
  • Zavolať Petera pre高风险 zmeny (DB schema, infra, security)
  • Wait for approvals (min 1 if required)
8

Merge to Main

Po schválení:

# Squash merge (one commit per PR)
# Use GitHub UI: "Squash and merge"

# Or CLI:
git checkout main
git pull origin main
git merge --squash feature/functional-a-auth
git commit -m "feat(auth): add JWT login endpoint"

# Cleanup
git branch -d feature/functional-a-auth
git push origin main
9

Deploy

GitHub webhook spustí Deployer, ktorý zavolá Dokku:

# Dokku deploy (automatic via webhook)
# Manual fallback:
git remote add dokku dokku@localhost:workflow
git push dokku main

Monitor deployment logs:

dokku logs workflow --tail
10

Verify

Overi health endpoint a logs:

curl -f https://workflow.sardonicrepulsion.com/health || echo "FAIL"
curl -s https://workflow.sardonicrepulsion.com/metrics  # Prometheus

# Stream logs:
dokku logs workflow --tail
# Or via remote:
ssh dokku@localhost "logs workflow --tail"
11

Update DB/Records

Ak treba, aktualizuj tasks/projects DB prostredníctvom API:

curl -X PATCH https://internal.db/api/tasks/123 \
  -H "Authorization: Bearer $INTERNAL_TOKEN" \
  -d '{"status":"deployed","deployed_at":"$(date -Iseconds)"}'
12

Close Task in Memory

Označ úlohu ako hotovú vmemory systéme:

# Memory system CLI (example)
memory-cli task close 123 --note "Deployed to production"
13

Post-Update Checks

  • Ensure DB migrations are reversible (test rollback on staging or by applying down migration)
  • Ensure backup coverage includes new/changed databases/tables
  • Check SSL renewal works: certbot renew --dry-run and verify cron job

🔧 Dodatočné Postupy

🔐 SSO Migration

  1. Kopíruj DB tabuľku users do pomocnej users_migration
  2. Pridaj stĺpce: sso_provider, sso_id
  3. Vytvor konfiguračný env:SSO_PROVIDER=keycloak
  4. Pre každého usera s sso_provider IS NULL:
    # Generate SSO link (example Keycloak)
    python scripts/migrate_user_to_sso.py --user-id=42 --dry-run=false
  5. Overi, že login s SSO funguje pre migrovaných užívateľov
  6. Pre staré credentials (local password) nastav sso_provider='local'
  7. Po 48h odstráň local password hashe (set password_hash=NULL)

🗄️ DB Migration

  1. Priprav migračný skript s idempotentnými operáciami:
  2. -- migrations/2025-02-add-user-index.sql
    BEGIN;
    
    -- Check if index exists (idempotent)
    DO $$ BEGIN
        IF NOT EXISTS (SELECT 1 FROM pg_indexes WHERE indexname = 'idx_users_email') THEN
            CREATE INDEX CONCURRENTLY idx_users_email ON users(email);
        END IF;
    END $$;
    
    COMMIT;
  3. Aplikuj cez dokku alebo priamo:
  4. dokku run <app> psql -f migrations/xxx.sql
    # alebo
    docker exec -i <container> psql -U postgres -d app < migrations/xxx.sql
  5. Zaznamenej v schema_migrations tabuľke
  6. Overi aplikáciu - bez chýb, query plánuje index

💾 Backup Procedure

  1. PGSQL:
  2. # Full backup
    pg_dumpall -U postgres > backup_$(date +%F).sql
    
    # Specific DB
    pg_dump -Fc -U postgres appdb > backup_appdb_$(date +%F).dump
    
    # Restore
    pg_restore -U postgres -d appdb backup_appdump.dump
  3. Redis:
  4. redis-cli --rdb /tmp/redis.rdb
    # Copy /tmp/redis.rdb to backup storage
  5. S3/assets:
  6. aws s3 sync s3://app-uploads/ /backup/uploads_$(date +%F)/
  7. Nastav crontab na denné/zálohovanie:
  8. 0 2 * * * /opt/scripts/backup.sh >> /var/log/backup.log 2>&1