Formularze dla stron statycznych, na Twoim serwerze

formd to mały program obok Twojej strony. Przyjmuje zgłoszenia, odsiewa boty, zapisuje każde zgłoszenie w bazie SQLite na Twoim serwerze i wysyła powiadomienia przez Twój SMTP albo Amazon SES. Bez SaaS-u i bez captchy.

Przeszło do skrzynki 0 Zatrzymane boty 0

Teraz Ty: wyślij formularz albo poślij bota

Zobaczysz każdą kontrolę formd i to, co trafia do skrzynki.

twojastrona.pl/kontakt

Albo wyślij jako bot:

formd na Twoim serwerze
  1. Tokenformd.js pobrał jednorazowy token przy otwarciu strony
  2. Praca przeglądarkiproof-of-work, 16 bitów
  3. Źródłoczy formularz przyszedł z Twojej strony
  4. Limit dla IPnajwyżej 5 zgłoszeń w 10 minut
  5. Czas wypełnieniaczłowiek potrzebuje co najmniej 3 sekund
  6. Pole-pułapkaukryte pole musi zostać puste
  7. Duplikatta sama treść drugi raz nie przejdzie
  8. Zapis i mailezgłoszenie i maile w jednej transakcji SQLite

Twoja skrzynka0 w panelu
  • Tu pojawią się maile, gdy zgłoszenie przejdzie.

Postaw to u siebie

Potrzebujesz serwera z Linuksem, domeny i nginx albo Caddy. Wpisz swoją domenę, a wszystkie polecenia poniżej się do niej dopasują.

Gdzie leży strona

formd będzie pod https://twojastrona.pl/f/, obok strony.

  1. Pobierz formd

    Jedna statycznie linkowana binarka dla Linuksa x86-64 albo ARM64. Sprawdź sumę kontrolną przed instalacją.

    Wolisz zbudować sam? Wystarczy Go 1.27.2 lub nowsze: go build -o formd ./cmd/formd w sklonowanym repozytorium.

    curl -LO https://github.com/dc9-dev/formd/releases/download/v0.1.0/formd-linux-amd64
    curl -LO https://github.com/dc9-dev/formd/releases/download/v0.1.0/SHA256SUMS
    sha256sum --check --ignore-missing SHA256SUMS
  2. Zainstaluj usługę

    Skrypt zakłada systemowego użytkownika formd, kopiuje binarkę do /usr/local/bin, tworzy /etc/formd/formd.env z uprawnieniami 0640 i instaluje utwardzoną jednostkę systemd.

    git clone --depth 1 --branch v0.1.0 https://github.com/dc9-dev/formd
    cd formd
    sudo sh deploy/install.sh ../formd-linux-amd64
  3. Ustaw pocztę

    W /etc/formd/formd.env wybierz sposób wysyłki. Zacznij od log, jeśli chcesz najpierw sprawdzić formularz bez wysyłania maili.

    MAILER=smtp
    MAIL_FROM="Strona <no-reply@twojastrona.pl>"
    SMTP_HOST=smtp.twojastrona.pl
    SMTP_PORT=587
    SMTP_USER=
    SMTP_PASS=
    SMTP_TLS=starttls
  4. Uruchom i załóż konto

    Konto do panelu wymaga hasła z co najmniej 12 znaków. Hasło jest zapisywane w argon2id.

    sudo systemctl enable --now formd
    sudo -u formd formd -env /etc/formd/formd.env user add admin
    
    # formd odpowiada tylko lokalnie
    curl http://127.0.0.1:8025/healthz
  5. Wystaw /f/ przez HTTPS

    formd słucha tylko na 127.0.0.1, więc świat widzi go przez Twój serwer WWW. Przekazuj wyłącznie ścieżkę /f/, nigdy panelu.

    # sudo certbot --nginx -d twojastrona.pl
    server {
        listen 443 ssl;
        server_name twojastrona.pl;
        ssl_certificate     /etc/letsencrypt/live/twojastrona.pl/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/twojastrona.pl/privkey.pem;
        root /var/www/twojastrona.pl;
    
        location /f/ {
            client_max_body_size 64k;
            proxy_pass http://127.0.0.1:8025;
            proxy_set_header Host            $host;
            proxy_set_header X-Real-IP       $remote_addr;
            proxy_set_header X-Forwarded-For $remote_addr;
        }
    }
  6. Otwórz panel i dodaj formularz

    Panel działa na osobnym porcie i nie wychodzi do internetu. Otwierasz go tunelem SSH ze swojego komputera, potem wchodzisz na http://localhost:8026.

    W panelu utwórz formularz kontakt, dodaj origin https://twojastrona.pl, ustaw pola i adres, na który mają przychodzić powiadomienia. Potem go włącz.

    ssh -L 8026:127.0.0.1:8026 twojastrona.pl
  7. Wstaw formularz na stronę

    Zwykły HTML i jeden skrypt, który pobiera token i liczy proof-of-work. Gotowy kod dla każdego formularza jest też w panelu, w zakładce „Kod HTML”.

    <form action="/f/kontakt" method="post" data-formd="ajax">
      <input name="name" required>
      <input type="email" name="email" required>
      <textarea name="message" required></textarea>
      <div style="position:absolute;left:-10000px" aria-hidden="true">
        <input name="website" tabindex="-1" autocomplete="off">
      </div>
      <button>Wyślij</button>
      <p data-formd-status role="status"></p>
    </form>
    <script src="/f/formd.js" defer></script>
  8. Sprawdź z zewnątrz

    Skrypt i token powinny odpowiadać przez HTTPS. Potem wyślij formularz ze strony i zobacz zgłoszenie w panelu.

    curl -I https://twojastrona.pl/f/formd.js
    # HTTP/2 200
    
    curl https://twojastrona.pl/f/kontakt/challenge
    # {"bits":16,"min_seconds":3,"token":"…"}

Kopie zapasowe, aktualizacje, fail2ban i ocena treści przez Jev: README na GitHubie.

Panel widzisz tylko Ty

Otwierasz go tunelem SSH i nie wystawiasz do internetu. Dane zostają na Twoim serwerze, hasła są w argon2id, sesje po stronie serwera, z ochroną CSRF.

Lista formularzy z licznikami: zgłoszenia w bazie, aktywne formularze, czekające na zatwierdzenie, nieudane maile i dzienny koszt Jev