Dodawanie nowej domeny – katalog, konfiguracja Apache2, certbot
Let’s Encrypt – nowy certyfikat
# certbot --apache - dodaje certyfikat wskazany z listy # certbot renew # certbot delete -d domena.pl # certbot certificates - lista certyfikatów # certbot certonly --webroot -w /var/www/html/MYAPP/webroot -d MYDOMAIN.pl
Over – ilość pozycji
SELECT invoice_number, invoice_hash, seller_address, payment_method, sale_date, COUNT(*) OVER() as total FROM purchase_invoices;
-- ABC/123/2026 | bUkGCk34... | ul. Testowa 4 | Przelew | 2026-01-24 | 1
Przydatne skróty
WIN+R – okno wyszukiwania
– wpisz komendę:
netplwiz - konta użytkowników - zalogowani - usunięcie
Nowy user
# adduser nowy_user // User nowy_user dodany do grupy sudo - uprawnienia roota # usermod -aG sudo nowy_user
Debian certyfikaty
Różne operacje na certyfikatach:
1. Wgrywamy wszystkie wymagane certyfikaty do /tmp/gus-cert 2. Przygotowujemy tylko certyfikaty w formacie PEM 3. Mogą mieć rozszerzenia .pem lub .crt 4. Zamieniamy rozszerzenia na .crt
Usuwanie linii końca Windows
# dos2unix gus-verify-certs.sh // LUB jeśli nie masz dos2unix: # sed -i 's/\r$//' gus-verify-certs.sh
Ksef wysyłanie faktur
https://claude.ai/chat/4cc1d3ee-fca7-47c3-ae8e-069e207e025c
Certyfikaty PHP
W: Failed to fetch https://packages.sury.org/php/dists/bullseye/InRelease 503 certificate has expired [IP: 146.75.63.52 443]
W: Some index files failed to download. They have been ignored, or old ones used instead.
Claude Console – konto
Cloude Code
Linux install:
Postgres – fragment daty
SELECT * FROM trs WHERE brand_id = 1 AND EXTRACT(YEAR FROM data) = EXTRACT(YEAR FROM CURRENT_DATE) AND EXTRACT(MONTH FROM data) = EXTRACT(MONTH FROM CURRENT_DATE) ORDER BY data DESC;
KSEF
https://web2tr-ksef.mf.gov.pl/web/ – strona logowania
– uwierzytelnienie za pomocą podpisu zaufanego, podpisanie dokumentu
// ============================================ // KROK 2: IMPLEMENTACJA KSEFCLIENT I AUTORYZACJA // ============================================ // // W KSeF API 2.0 proces uwierzytelniania składa się z 3 kroków: // 1. Pobranie challenge (POST /auth/challenge) // 2. Przygotowanie żądania autoryzacyjnego z tokenem i challenge // 3. Uzyskanie JWT accessToken // ============================================ // Plik: src/KSeF/KSeFClient.php // ============================================
# composer require guzzlehttp/guzzle: ^7.10 # composer require phpseclib/phpseclib:~3.0
Upewnij się że PHP ma włączone rozszerzenie OpenSSL: # php -m | grep openssl (powinno pokazać "openssl")
odsumowanie Kroku 2:
Co zbudowaliśmy:
- ✅ KSeFClient.php – pełna implementacja uwierzytelnienia
- ✅ Szyfrowanie RSA-OAEP SHA-256 (phpseclib + OpenSSL fallback)
- ✅ Proces 3-krokowy KSeF 2.0:
- POST /auth/challenge
- POST /auth/ksef-token
- GET /auth/{referenceNumber} (polling)
- POST /auth/token/redeem
- ✅ Zarządzanie JWT tokenami
- ✅ Kontroler testowy do łatwego testowania: src/Controller/KsefTestController.php
Kluczowe nauki:
- KSeF 2.0 wymaga RSA-OAEP z SHA-256 (nie SHA-1!)
- Format szyfrowania:
token|timestampMs(bez challenge) - Struktura JSON: płaska (bez
credentials) - Proces jest asynchroniczny – wymaga pollingu
CO DALEJ? – KROK 3
Teraz mamy accessToken i możemy przejść do wysyłania faktur!
Krok 3 będzie obejmował:
- Budowanie faktury w formacie FA(3) XML
- Szyfrowanie faktury (AES-256-CBC)
- Otwarcie sesji online
- Wysłanie faktury do KSeF
- Pobranie UPO (Urzędowego Poświadczenia Odbioru)
- Pobieranie faktur z KSeF
Moduł wysyłania faktur!
To będzie obejmowało:
- Klasę
FakturaBuilderdo tworzenia XML FA(3) - Szyfrowanie AES-256-CBC
- Sesje online
- Wysyłkę faktur
Dostęp do innej tabeli z Modelu
W modelu Table nie można użyć metody $this->fetchTable(„Projects”) – ta metoda dostępna jest tylko dla Controllers.
src/Model/Table/InvoicesTable.php
use Cake\ORM\TableRegistry; class InvoicesTable extends Table { public function getProjects() { $projects = TableRegistry::getTableLocator()->get('Projects') ->find() ->where(['is_active' => 1]) ->all(); .... } // getProjects() ... } // class
Linux – find
Szuka pliku od katalogu roboczego (aktualnego) i we wszystkich podkatalogach
find . -name "5060bc35b695a2fd90320afca920f32a"
Rsync
Wszystkie pliki i podkatalogi /home/john/my_app/ zostaną wgrane do roboczego katalogu .
# rsync -av johnny@194.127.230.100:/home/johnny/my_app/ .
Backup zostanie wgrany ze zdalnego systemu do katalogu roboczego
# rsync -av johnny@194.137.231.100:/home/johnny/backup/myapp-20251120.sql .
CakePHP 5 – Formularz – Powiązania modeli
$this->Form->create($article); // Article controls. echo $this->Form->control('title'); // Author controls (belongsTo) echo $this->Form->control('author.id'); echo $this->Form->control('author.first_name'); echo $this->Form->control('author.last_name'); // Author profile (belongsTo + hasOne) echo $this->Form->control('author.profile.id'); echo $this->Form->control('author.profile.username'); // Tags controls (belongsToMany) // as separate inputs echo $this->Form->control('tags.0.id'); echo $this->Form->control('tags.0.name'); echo $this->Form->control('tags.1.id'); echo $this->Form->control('tags.1.name'); // Inputs for the joint table (articles_tags) echo $this->Form->control('tags.0._joinData.starred'); echo $this->Form->control('tags.1._joinData.starred'); // Comments controls (hasMany) echo $this->Form->control('comments.0.id'); echo $this->Form->control('comments.0.comment'); echo $this->Form->control('comments.1.id'); echo $this->Form->control('comments.1.comment'); $this->Form->end();
CakePHP 5 plugin JSON
JSON – brak RequestHandlera zamiast tego JsonView
CakePHP 5 plugin PDF
Plugin PDF – WkHtmlToPdf rekomendowany silnik
# composer require friendsofcake/cakepdf
CakePHP 5 plugin CSV
Plugin CSV – instalacja w katalogu aplikacji
# composer require friendsofcake/cakephp-csvview
CakePHP 5 migracja – różnice z v.4
Zmieniło się: typowanie, json, fetchTable
Przenoszenie CRM na nowy serwer
Kopiowanie plików przez sieć, przenoszenie bazy, certyfikaty,
https://claude.ai/chat/b62ab800-58cd-4c56-96ea-c9d9937b03f4
Certbot – korekty parametru curves
https://claude.ai/chat/f46e500d-d53c-4f3f-8d6f-70df53d31673
updateAll – przypisanie wartości innego pola
use Cake\Database\Expression\QueryExpression; $this->Table->updateAll(['amount_remain' => new QueryExpression('amount') ], $conditions);
css spiner
.spinner {
/* ... */
opacity: 0;
animation:
fadeIn 500ms 100ms forwards,
rotate 1s linear infinite;
}
@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@keyframes rotate {
to {
transform: rotate(360deg);
}
}
PHP – Zwraca datę początku i końca tygodnia – na podstawie Roku i nr tygodnia
private function getWeekDateRange($year, $week) { // Utworzenie obiektu DateTime dla pierwszego dnia określonego tygodnia $dto = new DateTime(); $dto->setISODate($year, $week); // Pierwszy dzień tygodnia (poniedziałek) $start_date = $dto->format('Y-m-d'); // Dodanie 6 dni aby otrzymać ostatni dzień tygodnia (niedziela) $dto->modify('+6 days'); $end_date = $dto->format('Y-m-d'); return [ 'start_date' => $start_date, 'end_date' => $end_date ]; }
JS – konstrukcje warunkowe
?? sprawdz. tylko null i undefined, || sprawdz. 0, '', NaN, null, undefined, false && warunkowego wykonania kodu
Aktualizacja certyfikatu domeny
Dla konkretnej domeny
# certbot certonly -d firma.domena.pl
Dla wszystkich certyfikatów
# certbot renew
JS – $.ajax – console.error
$.ajax({ url: '/api/products/get-all.json', type: 'GET', dataType: 'json', success(resp) { if(resp.resp.error) { $("#feedback").text(resp.resp.error).addClass('text-danger'); return; } $("#feedback").text(resp.resp.success).addClass('text-success'); }, error(e){ var message = ""; if(e.responseJSON !== 'undefined') message = e.responseJSON.message; if(e.responseText !== 'undefined') message = e.responseText.message; console.log(message ); } });
PHP Sury keys update
Błąd po komendzie apt update – klucz publiczny PHP wygasł
Err:6 https://packages.sury.org/php bullseye InRelease The following signatures couldn't be verified because the public key is not available: NO_PUBKEY B188E2B695BD4743