Add full shop application: Go backend, PostgreSQL, Docker, Caddy and admin panel.

This commit is contained in:
shop
2026-06-25 16:39:33 +03:00
parent a150e4f8c6
commit ee5688f722
24 changed files with 1797 additions and 0 deletions
+51
View File
@@ -0,0 +1,51 @@
package database
import (
"context"
"fmt"
"os"
"time"
"github.com/jackc/pgx/v5/pgxpool"
)
func Connect(ctx context.Context) (*pgxpool.Pool, error) {
dsn := fmt.Sprintf(
"postgres://%s:%s@%s:%s/%s?sslmode=disable",
getEnv("DB_USER", "shop"),
getEnv("DB_PASSWORD", "shop_secret"),
getEnv("DB_HOST", "localhost"),
getEnv("DB_PORT", "5432"),
getEnv("DB_NAME", "shop"),
)
cfg, err := pgxpool.ParseConfig(dsn)
if err != nil {
return nil, fmt.Errorf("parse config: %w", err)
}
cfg.MaxConns = 10
cfg.MinConns = 2
cfg.MaxConnLifetime = time.Hour
pool, err := pgxpool.NewWithConfig(ctx, cfg)
if err != nil {
return nil, fmt.Errorf("connect: %w", err)
}
for i := 0; i < 30; i++ {
if err := pool.Ping(ctx); err == nil {
return pool, nil
}
time.Sleep(time.Second)
}
return nil, fmt.Errorf("database not ready after 30s")
}
func getEnv(key, fallback string) string {
if v := os.Getenv(key); v != "" {
return v
}
return fallback
}
+19
View File
@@ -0,0 +1,19 @@
package database
import (
"context"
"github.com/jackc/pgx/v5/pgxpool"
)
func Migrate(ctx context.Context, pool *pgxpool.Pool) error {
_, err := pool.Exec(ctx, `
CREATE TABLE IF NOT EXISTS admins (
id SERIAL PRIMARY KEY,
email VARCHAR(255) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
`)
return err
}