Skip to content

Commit 3cc8a07

Browse files
authored
Go プロジェクトの初期化 (#1291)
1 parent 0aaeea5 commit 3cc8a07

File tree

4 files changed

+183
-0
lines changed

4 files changed

+183
-0
lines changed

go/.env.example

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# Mewst Go版 環境変数サンプル
2+
# このファイルをコピーして .env を作成し、実際の値を設定してください
3+
# cp .env.example .env
4+
5+
DATABASE_URL=
6+
MEWST_ADMIN_IP=
7+
MEWST_COOKIE_DOMAIN=
8+
MEWST_DISABLE_RATE_LIMIT=
9+
MEWST_DOMAIN=
10+
MEWST_MAINTENANCE_MODE=
11+
MEWST_PORT=
12+
MEWST_RAILS_APP_URL=
13+
MEWST_SESSION_HTTPONLY=
14+
MEWST_SESSION_SECURE=
15+
MEWST_TURNSTILE_SECRET_KEY=
16+
MEWST_TURNSTILE_SITE_KEY=

go/cmd/server/main.go

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"log/slog"
7+
"net/http"
8+
"os"
9+
"os/signal"
10+
"syscall"
11+
"time"
12+
13+
"github.com/go-chi/chi/v5"
14+
"github.com/go-chi/chi/v5/middleware"
15+
)
16+
17+
func main() {
18+
// ポート設定(環境変数から取得、デフォルトは3000)
19+
port := os.Getenv("MEWST_PORT")
20+
if port == "" {
21+
port = "3000"
22+
}
23+
24+
slog.Info("サーバーを起動します", "port", port)
25+
26+
// Chiルーターの設定
27+
r := chi.NewRouter()
28+
29+
// ミドルウェア
30+
r.Use(middleware.Logger)
31+
r.Use(middleware.RequestID)
32+
r.Use(middleware.RealIP)
33+
r.Use(middleware.Recoverer)
34+
35+
// ヘルスチェックエンドポイント
36+
r.Get("/health", func(w http.ResponseWriter, r *http.Request) {
37+
w.WriteHeader(http.StatusOK)
38+
_, _ = w.Write([]byte("OK"))
39+
})
40+
41+
// サーバー起動
42+
// Dockerコンテナ内で動かす場合、0.0.0.0でリッスンする必要がある
43+
addr := fmt.Sprintf("0.0.0.0:%s", port)
44+
slog.Info("HTTPサーバーを起動します", "addr", addr)
45+
46+
// HTTPサーバーの作成
47+
srv := &http.Server{
48+
Addr: addr,
49+
Handler: r,
50+
ReadTimeout: 15 * time.Second,
51+
WriteTimeout: 15 * time.Second,
52+
IdleTimeout: 60 * time.Second,
53+
MaxHeaderBytes: 1 << 20,
54+
}
55+
56+
// Graceful shutdown のためのシグナルハンドリング
57+
go func() {
58+
sigint := make(chan os.Signal, 1)
59+
signal.Notify(sigint, os.Interrupt, syscall.SIGTERM)
60+
<-sigint
61+
62+
slog.Info("シャットダウンシグナルを受信しました。サーバーを停止します...")
63+
64+
shutdownCtx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
65+
defer cancel()
66+
67+
if err := srv.Shutdown(shutdownCtx); err != nil {
68+
slog.Error("サーバーのシャットダウンに失敗しました", "error", err)
69+
}
70+
}()
71+
72+
// サーバー起動
73+
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
74+
slog.Error("サーバーの起動に失敗しました", "error", err)
75+
os.Exit(1)
76+
}
77+
78+
slog.Info("サーバーが正常に停止しました")
79+
}

go/go.mod

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
module github.com/mewstcom/mewst
2+
3+
go 1.25.4
4+
5+
require (
6+
github.com/BurntSushi/toml v1.5.0
7+
github.com/a-h/templ v0.3.960
8+
github.com/go-chi/chi/v5 v5.2.3
9+
github.com/lib/pq v1.10.9
10+
github.com/nicksnyder/go-i18n/v2 v2.6.0
11+
golang.org/x/crypto v0.45.0
12+
golang.org/x/text v0.31.0
13+
golang.org/x/tools v0.39.0
14+
)
15+
16+
require (
17+
github.com/a-h/parse v0.0.0-20250122154542-74294addb73e // indirect
18+
github.com/andybalholm/brotli v1.1.0 // indirect
19+
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
20+
github.com/cli/browser v1.3.0 // indirect
21+
github.com/fatih/color v1.16.0 // indirect
22+
github.com/fsnotify/fsnotify v1.7.0 // indirect
23+
github.com/mattn/go-colorable v0.1.13 // indirect
24+
github.com/mattn/go-isatty v0.0.20 // indirect
25+
github.com/natefinch/atomic v1.0.1 // indirect
26+
golang.org/x/mod v0.30.0 // indirect
27+
golang.org/x/net v0.47.0 // indirect
28+
golang.org/x/sync v0.18.0 // indirect
29+
golang.org/x/sys v0.38.0 // indirect
30+
golang.org/x/telemetry v0.0.0-20251111182119-bc8e575c7b54 // indirect
31+
)

go/go.sum

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg=
2+
github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
3+
github.com/a-h/parse v0.0.0-20250122154542-74294addb73e h1:HjVbSQHy+dnlS6C3XajZ69NYAb5jbGNfHanvm1+iYlo=
4+
github.com/a-h/parse v0.0.0-20250122154542-74294addb73e/go.mod h1:3mnrkvGpurZ4ZrTDbYU84xhwXW2TjTKShSwjRi2ihfQ=
5+
github.com/a-h/templ v0.3.960 h1:trshEpGa8clF5cdI39iY4ZrZG8Z/QixyzEyUnA7feTM=
6+
github.com/a-h/templ v0.3.960/go.mod h1:oCZcnKRf5jjsGpf2yELzQfodLphd2mwecwG4Crk5HBo=
7+
github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M=
8+
github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY=
9+
github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
10+
github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
11+
github.com/cli/browser v1.3.0 h1:LejqCrpWr+1pRqmEPDGnTZOjsMe7sehifLynZJuqJpo=
12+
github.com/cli/browser v1.3.0/go.mod h1:HH8s+fOAxjhQoBUAsKuPCbqUuxZDhQ2/aD+SzsEfBTk=
13+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
14+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
15+
github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
16+
github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
17+
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
18+
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
19+
github.com/go-chi/chi/v5 v5.2.3 h1:WQIt9uxdsAbgIYgid+BpYc+liqQZGMHRaUwp0JUcvdE=
20+
github.com/go-chi/chi/v5 v5.2.3/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops=
21+
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
22+
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
23+
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
24+
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
25+
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
26+
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
27+
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
28+
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
29+
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
30+
github.com/natefinch/atomic v1.0.1 h1:ZPYKxkqQOx3KZ+RsbnP/YsgvxWQPGxjC0oBt2AhwV0A=
31+
github.com/natefinch/atomic v1.0.1/go.mod h1:N/D/ELrljoqDyT3rZrsUmtsuzvHkeB/wWjHV22AZRbM=
32+
github.com/nicksnyder/go-i18n/v2 v2.6.0 h1:C/m2NNWNiTB6SK4Ao8df5EWm3JETSTIGNXBpMJTxzxQ=
33+
github.com/nicksnyder/go-i18n/v2 v2.6.0/go.mod h1:88sRqr0C6OPyJn0/KRNaEz1uWorjxIKP7rUUcvycecE=
34+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
35+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
36+
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
37+
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
38+
golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q=
39+
golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4=
40+
golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk=
41+
golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc=
42+
golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
43+
golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
44+
golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I=
45+
golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
46+
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
47+
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
48+
golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
49+
golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
50+
golang.org/x/telemetry v0.0.0-20251111182119-bc8e575c7b54 h1:E2/AqCUMZGgd73TQkxUMcMla25GB9i/5HOdLr+uH7Vo=
51+
golang.org/x/telemetry v0.0.0-20251111182119-bc8e575c7b54/go.mod h1:hKdjCMrbv9skySur+Nek8Hd0uJ0GuxJIoIX2payrIdQ=
52+
golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM=
53+
golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM=
54+
golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ=
55+
golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ=
56+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
57+
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

0 commit comments

Comments
 (0)