- ãã¼ã¸å ¬éæ¥: 2025å¹´11æ29æ¥ (å)
- æ¸ãã人: shimbaco
Annict (ã¢ãã¯ã) ã¨ããè¦ãã¢ãã¡ãè¨é²ã§ããWebãµã¼ãã¹ãå人éçºãã¦ãã¾ãã
ãã®ãµã¼ãã¹ã¯Railsã§éçºããã¦ãããã½ã¼ã¹ã³ã¼ããå
¬éãã¦ãã¾ãã
https://github.com/annict/annict
æè¿ãã®Railsã¢ããªãGoè¨èªã§æ¸ãç´ãå§ãã¦ãã¾ãã
ãã®ãã¼ã¸ã§ã¯ãã®èæ¯ãã©ã®ããã«ãã£ã¦ããããªã©ã«ã¤ãã¦ãç´¹ä»ãã¾ãã
- ãªãRailsããGoã«ç§»è¡ãããã¨ã«ããã®ã
- ã©ã®ããã«ç§»è¡ãé²ãã¦ããã
- ã¤ã³ãã©æ§æã¨ããã¸ã§ã¯ãæ§æ
- 使ç¨ãã¦ããã©ã¤ãã©ãª
- ç§»è¡ãã¦è¯ãã£ãã¨ããã»ä¸å®ãªã¨ãã
ãªãGoã«ç§»è¡ãããã¨ã«ããã®ãï¼
Rubyã¯ã¨ã¦ã好ãã§ãããRailsã®çç£æ§ã®é«ãã¯ä»ã§ãæé«ã ã¨æã£ã¦ãã¾ãã
ãã ãçæ³ã¯ä»¥ä¸ã®ãããªè¨èªãè¯ããªã¨æã£ã¦ãã¾ããã
- æåããéçåä»ã
- ã¡ã¢ãªä½¿ç¨éãå°ãªã
- èªã¿ãããæ¸ãããã
- å®è¡é度ãéã
- ãã«ããéã
- Webã¢ããªãä½ãåå£ãæ´ã£ã¦ãã
Rubyã§ãåã使ãããã£ãã®ã§Sorbetãå°å
¥ãã¦ãã¾ããã
Sorbetãã¨ã¦ãè¯ãã§ãããè¨èªã¬ãã«ã§åãçµã¿è¾¼ã¾ãã¦ããã»ãããã£ããæ¸ãã¾ãããå¤é¨ã©ã¤ãã©ãªãå«ãã¦åãä¿è¨¼ããã¦ããå®å¿æãããã¾ãã
ãªã½ã¼ã¹å¹çã«ã¤ãã¦ãéè¦ãã¦ãã¾ãã
Annictãªã©ã®åãéå¶ãã¦ãããµã¼ãã¹ã¯ãã³ã¹ããéè¦ãã¦VPS1å°ã§éç¨ãã¦ãã¾ãã
ã¹ã±ã¼ã«ããããªã£ãã¨ãã¯å¼·ããµã¼ãã¼ã«ã¹ã±ã¼ã«ã¢ããããã¨ããVPS1å°ã§ãããã¨ããã¾ã§ãã使¦ã§ãã
é·ãéå¶ããããã«ãµã¼ãã¼è²»ç¨ã¯ãªãã¹ãå®ããããã®ã§ãå¦çã«æ±ãããããã·ã³ãªã½ã¼ã¹ã¯å°ãªããã°å°ãªãã»ã©å¬ããã§ãã
ã¾ããæè¿ã¯AIã«ã³ã¼ããæ¸ãã¦ããããã¨ãã»ã¨ãã©ã«ãªãã¾ããã
èªåã§æ¸ãã¦ããããã¯ã³ã¼ãã®è¨è¿°éã¯å°ãªãã»ããã¿ã¤ãæ°ãå°ãªãå¬ããã£ãã®ã§ãããæè¿ã§ã¯ãã®ãããã®ã³ã¹ãã¯ã»ã¨ãã©æ°ã«ãªããªããªã£ã¦ãã¾ããã
ã³ã¼ãã®è¨è¿°éãéè¦ããªããªã£ã代ããã«ãç¾å¨ã¯AI (ãä»äºº) ãæ¸ããã³ã¼ããã©ãã ãçè§£ãããããï¼ã®ã»ããéè¦è¦ãå§ãã¦ãã¾ãã
ä¸è¨ã®ããã«èããçµæãç¾ç¶Goãä¸çªãã©ã³ã¹ãè¯ãããªã¨æããGoãé¸ã³ã¾ããã
ã©ããã£ã¦Goã«ç§»è¡ãã¦ãããï¼
Claude Codeã使ã
ã³ã¼ãã®è¨è¿°ã«ã¯Claude Codeã使ã£ã¦ãã¾ãã
ä»ã®ãã¼ã«ã¯ãã¾ã触ã£ããã¨ããªããUIãæåã§åªããæãã好ã¿ã§ä½¿ã£ã¦ãããããã®æãã§ãã
Goã¯ã»ã¨ãã©è§¦ãããã¨ããªãã£ãã®ã§ãä»ã®Goããã¸ã§ã¯ããè¦ãããClaude Codeã«ãä¸è¬çãªGoããã¸ã§ã¯ãã§ã¯ã©ããã£ã¦ãã¾ããï¼ãã¿ãããªè³ªåããã¦ããªãã¹ãé·ã«å¾ãããã«ããã¸ã§ã¯ããæ§æãã¾ããã
æ¸ãã¦ããã£ãã³ã¼ãã§ããåãããªãã¨ãããé½åº¦è³ªåãã¦ãã¾ãããããããªããã¨ã§ãä½åº¦ãèããã®ã¯å©ããã¾ãã
ã¡ãã£ã¨ãã¤ç§»è¡ãã
å ¨ãã¼ã¸ãä¸åº¦ã«ã©ã¼ãã¨æ¸ãç´ãã®ã¯ã ãã¶ããã©ãã®ã§ãã¨ã³ããã¤ã³ããã¨ã«ã¡ãã£ã¨ãã¤ç§»è¡ãããã¨ã«ãã¾ããã
ã¡ãã£ã¨ãã¤ç§»è¡ããã«ããã£ã¦ä¸çªä¸å®ãªè¦ç´ ã¯èªè¨¼ã¾ããã§ããã
Railsçã§ãã°ã¤ã³ããã¨ãã«ä½¿ç¨ãããã¹ã¯ã¼ããã»ãã·ã§ã³ãGoçã§ãèªãã ãçæã§ããå¿
è¦ãããã¾ãã
ãªã®ã§æåã¯ãã°ã¤ã³ãã¦ã¼ã¶ã¼ç»é²ã¾ããããæãã¤ãããã¨ã«ãã¾ããã
åããã¡ã¤ã³ã§Railsã¨Goã®ãµã¼ãã¼ãåãã
æå㯠go.annict.com ã¨ããæãã§ãµããã¡ã¤ã³ã§Goçãåããã¤ããã§ããã
ãããããããã¨ãªãã¤ã¬ã¯ããå¿
è¦ã«ãªã£ããããã¡ã¤ã³ãéè¦ã«ãªãæ©è½ (Passkeysãªã©) ãæä¾ãã¥ãããªãæããããã¾ããã
ãã®ããRailsçãGoçã annict.com ã§åãããã¨ã«ãã¾ããã
Goã§ãªãã¼ã¹ãããã·ãå®è£ ããå ¨ã¦ã®ãªã¯ã¨ã¹ããGoã§åããããã«ãã
åããã¡ã¤ã³ã§RailsãGoãåãããã«ãããã£ãã®ã§ãåæ®µã«ãªãã¼ã¹ãããã·ãç½®ãã¦RailsãGoã«ãªã¯ã¨ã¹ããæ¯ãåããå¿ è¦ãããã¾ããã
NginxãCaddyãªã©ãå¥ãµã¼ãã¹ã§ç«ã¡ä¸ãã¦æ¯ãåãããã¨ãèãã¾ããã
ãããæçµçã«ã¯å
¨ã¦ã®ãªã¯ã¨ã¹ããGoã§å¦çãããã¨ã«ãªãããã¸ã§ã¯ããªã®ã§ãGoå´ã«ãªãã¼ã¹ãããã·ãå®è£
ããããã§åãããã¨ã«ãã¾ããã
ãªãã¼ã¹ãããã·ã¯Goã®ã¢ããªãµã¼ãã¼ã®ããã«ã¦ã§ã¢ã¨ãã¦å®è£ ããã®ã§ãæçµçã«å ¨ã¦ã®å¦çãGoã§è¡ããããã«ãªã£ããããã«ã¦ã§ã¢ãåé¤ããã ãã§æ¸ãã¯ãã§ãã
ã¢ãã¬ãã«ãã
æåã¯Railsçã®ãªãã¸ããªã¨ã¯å¥ã«Goçã®ãªãã¸ããªãä½ãããã§ä½æ¥ãã¦ãã¾ãããã以ä¸ã®çç±ã§ã¢ãã¬ãã«ãããã¨ã«ãã¾ããã
- Goã®ã³ã¼ããæ¸ãã¦ãããã¨ããRailsçã®ã³ã¼ããåç §ãããããªããã
- åããã¡ã¤ã³ã§Railsã¨Goã®ãµã¼ãã¼ãåããã¨ããéçºç°å¢ãä½ããããã£ããã
Dockerã¨Docker Composeã使ã£ã¦éçºãã¦ãã¾ãã
1ã¯Railsçã®ãªãã¸ããªã®ãã£ã¬ã¯ããªãGoã®ã³ã³ããã§ãã¦ã³ãããã°å¥ãªãã¸ããªã§ãåé¡ãªãã£ãã§ãã
ãã ãã¢ãã¬ãã«ããã¨ãã¦ã³ããªã©ã®è¨å®ãä¸è¦ã¨ããç¹ã¯ä¾¿å©ã§ããã
2ã¯ãã¼ã¿ãã¼ã¹ãªã©ã¯RailsãGoãåããã®ãåç §ãããã¨ã«ãªãã®ã§ãDocker Composeã§ãµã¼ãã¹åãæå®ããã ãã§æ¥ç¶ã§ããããã«ãªã楽ã§ããã
ã¤ã³ãã©æ§æ
以ä¸ã®ãããªæ§æã§éç¨ãã¦ãã¾ãã
åºæ¬çã«ã¯Dokkuã§Goçã®ã¢ããªã±ã¼ã·ã§ã³ãä½ããã¨ã«ãªã£ãã¨ãã以å¤ã¯Railsã ãã§éç¨ãã¦ããããã¨å¤ãããªãã§ãã
- Cloudflare (CDN)
- VPS (Ubuntu)
- Dokku
- Go
- Rails
- PostgreSQL
- Redis
- imgproxy (ç»å夿)
- Vector (ãã°ãR2ã«æµã)
- Mackerel (ãµã¼ãã¼ç£è¦)
- Dokku
- Cloudflare R2 (ãªãã¸ã§ã¯ãã¹ãã¬ã¼ã¸)
- Resend (ã¡ã¼ã«éä¿¡)
- Sentry (ã¨ã©ã¼ç®¡ç)
Goçã®ããã¸ã§ã¯ãæ§æ
ç°¡æçãªã¬ã¤ã¤ã¼ãã¢ã¼ããã¯ãã£ã¼ã¿ãããªæ§æã«è½ã¡çãã¦ãã¾ãã
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Presentation層 â
â - Handler, ViewModel, Template, Middleware â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â ä¾å
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Application層 â
â - UseCaseï¼ãã¸ãã¹ããã¼ããã©ã³ã¶ã¯ã·ã§ã³ç®¡çï¼ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â ä¾å
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Domain/Infrastructure層ï¼çµ±åï¼ â
â - Query (sqlc), Repository, Model â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
ããã¯ä»¥åé¢è¥¿Rubyä¼è°ã§ç´¹ä»ãããã®ã¨ã»ã¨ãã©åãã«ãªãã¾ãã
詳細: é¢è¥¿Rubyä¼è°08ã«åå ãã¦çºè¡¨ãã¾ãã
Railsçã§ã¯ActiveRecordãªã¯ã©ã¹ç¾¤ã§ããRecordãè³ãã¨ããããåç
§ãããã®ã許ãã¦ãã¾ããã
Railsã¯ActiveRecordãã¤ãã£ã¦ãªãã¼ã ã¨æãã®ã§ãããã¦ãã¾ããã
ãããGoçã§ã¯ãã¼ã¿ãã¼ã¹ã¨ããåãããQueryã¯Repositoryããã®ã¿åç
§ã§ããããã«ãã¦ãã¾ãã
ã¾ããViewModelãå®ç¾©ããããã«ãã¦ãã¾ãã
ããã«ãã£ã¦Goçã¯Query (Record) ã¨Repositoryã®è²¬åãããæç¢ºã«ãªã£ãããªã¨æãã¾ãã
Goçã§ä½¿ã£ã¦ããã©ã¤ãã©ãª
主è¦ãªãã®ããç´¹ä»ãã¾ãã
ã«ã¼ãã£ã³ã°: chi
net/httpäºæã§ã·ã³ãã«ããã ã£ãã®ã§é¸ã³ã¾ããã
ãã¼ã¿ãã¼ã¹ã¸ã®åç §: sqlc
SQLãèªåã§æ¸ãã®ã¯å¤§å¤ã ã¨æã£ã¦ãã¾ããããæè¿ã¯AIãæ¸ãã¦ãããããã«ãªãã¾ããããã®ããORMã使ããSQLãç´æ¸ãã§è¯ãã®ã§ã¯ï¼ã¨æãå§ãã¦ãã¾ããã
ORMã使ã£ã¦ãçµå±ã©ããªSQLãå®è¡ããã¦ãããã¯ç¢ºèªããå¿
è¦ãããã®ã§ããããªãæåããSQLãç´æ¸ãããã¦ããã»ããç´æçã§èªã¿ãããã ããã¨ããèãã§ãã
sqlcã¯SQLããã³ã¼ããçæãã¦ãããã®ã§ãåå®å ¨ãã¤ã©ããªSQLãå®è¡ãããã®ãæèããããã¦è¯ãã§ãã
ãã³ãã¬ã¼ãã¨ã³ã¸ã³: templ
Railsã§ãã¥ã¼ãå®è£
ããã¨ãã¯View Componentã使ãã®ã好ãã§ããã
æ®éã®Rubyã®ã³ã¼ãã®ããã«ã¡ã½ããã«ãã¼ã¿ã渡ããã¨ããã¨ãERBã§HTMLãæ¸ããã¨ããã好ãã§ããã
JavaScriptçéã§ä½¿ããã¦ããJSXã好ãã§ãã
æçµçãªåºåçµæã¨ãªãHTMLã«éããªãè¿ããã©ã¼ãããã§ãã³ãã¬ã¼ããæ¸ãããã¨ããæ°æã¡ããããã ã¨æãã¾ãã
templããã¯Go + JSXã¿ãããªå°è±¡ãåãã¾ããã
ãã¼ã¿ã¯Goã®é¢æ°ã®å¼æ°ã¨ãã¦åä»ãã§æ¸¡ããã¨ãã§ãããã³ãã¬ã¼ãé¨åã¯JSXã¿ãããªãã©ã¼ãããã§æ¸ããã¨ãã§ãã¾ãã
åãæèãã¦HTMLã«è¿ãå½¢ã§ãã³ãã¬ã¼ããæ¸ããã®ã好ã¿ã§ãã
ããã¯ã°ã©ã¦ã³ãã¸ã§ã: River
Railsçã§ã¯DelayedJobã使ã£ã¦ãã¾ãã
RiverãDelayedJobã¨åããPostgreSQLã§åãã¸ã§ããµã¼ãã¼ã«ãªã£ã¦ãã¾ãã
ãµã¼ãã¼ã®æ§æãã·ã³ãã«ã«ããããã«ãPostgreSQLã§ã§ãããã¨ã¯PostgreSQLã§ããã¨è¯ãããªã¨æãã®ã§ãRiverã®åå¨ã¯ãããããã§ãã
ãªã³ã¿ã¼: golangci-lint
ããã¤ãè¨å®ãã¦ãã¾ãããä¸ã§ãä¸çªæ°é®®ã»å°å ¥ã§ãã¦å¬ããã£ãã®ãDepguardã¨ãããªã³ã¿ã¼ã§ãã
https://github.com/OpenPeeDeeP/depguard
ããã¯åããã±ã¼ã¸ã§ã©ããªããã±ã¼ã¸ã®ã¤ã³ãã¼ãã許å¯ã»æå¦ãããã¨ãã£ãè¨å®ãã§ãããªã³ã¿ã¼ã§ãã
Goçã¯ä¸ã«æ¸ããããã«ç°¡æçãªã¬ã¤ã¤ã¼ãã¢ã¼ããã¯ãã£ã¼ããã¨ã«ããã±ã¼ã¸ãæ§æãã¦ãããããä¾ãã°ãTemplateã¯Repositoryã«ä¾åããªããã¨ãã¨ãã£ãã«ã¼ã«ãåå¨ãã¾ãã
ãã®ã«ã¼ã«ã¯ããã¥ã¡ã³ãã«æ¸ãã¦ããã ãã ã£ãã®ã§ã¹ã«ã¼ãããã¨ãã§ããç¶æ
ã ã£ãã®ã§ãããDepguardãå°å
¥ãã¦ä»¥ä¸ã®ãããªã«ã¼ã«ã追å ãããã¨ã§ãæ©æ¢°çã«ä¾åé¢ä¿ããã§ãã¯ã§ããããã«ãªãã¾ããã
.golangci.yml ã®è¨å®ä¾:
depguard:
rules:
# Templates層ã®ã«ã¼ã«: ViewModelãéãã¦ãã¼ã¿ã表示
# ç´æ¥ã®ãã¼ã¿ã¢ã¯ã»ã¹ã¨ãã¸ãã¹ãã¸ãã¯ã«ä¾åããªã
templates-layer:
files:
- "**/internal/templates/**/*.go"
deny:
- pkg: github.com/annict/annict/internal/query
desc: "Templatesã¯Queryã«ä¾åã§ãã¾ããã"
- pkg: github.com/annict/annict/internal/repository
desc: "Templatesã¯Repositoryã«ä¾åã§ãã¾ããã"
- pkg: github.com/annict/annict/internal/model
desc: "Templatesã¯Modelã«ç´æ¥ä¾åã§ãã¾ãããViewModelãçµç±ãã¦ãã ããã"
- pkg: github.com/annict/annict/internal/usecase
desc: "Templatesã¯UseCaseã«ä¾åã§ãã¾ããã"
- pkg: github.com/annict/annict/internal/handler
desc: "Templatesã¯Handlerã«ä¾åã§ãã¾ããã"
- pkg: github.com/annict/annict/internal/middleware
desc: "Templatesã¯Middlewareã«ä¾åã§ãã¾ããã"
æä½éã®ä¾åé¢ä¿ã®å¼·å¶ãã§ããã°è¯ãã®ã§ããã©ãã¯ãªã¹ãæ¹å¼ã«ãã¦å¿ ãå®ããããã¨ã ããè¨è¿°ãããã¨ã«ãã¦ãã¾ãã
Goã«ç§»è¡ãã¦è¯ãã£ãã¨ãã
åãæèããèªã¿ãããã³ã¼ãã§éçºãããã¨ãã§ããããã«ãªãã¾ããã
éçºãã¦ããã¨ãã®CIã®å®è¡æéãããã«ããéããããã§Railsã§éçºãã¦ããã¨ãã¨ãã¾ãå¤ããããæ©ãã®ãã£ã¼ãããã¯ã«ã¼ãã§éçºã§ãã¦ãã¾ãã
ã¡ã¢ãªä½¿ç¨éã«ã¤ãã¦ããDokkuä¸ã§èµ·åãã¦ããRailsã®webããã»ã¹ãç´800MB (ãã¹ã¿ã¼ã¨ã¯ã¼ã«ã¼2ã¤ã®åç´åè¨)ãGoã®webããã»ã¹ãç´30MBã¨ãªã£ã¦ãã¾ãã
ãã ãç¾æç¹ã§ã¯Goçã¯èªè¨¼å¨ããªã©ä¸é¨ã®æ©è½ããå®è£
ãã¦ããªããããåç´ãªæ¯è¼ã¯ã§ãã¾ããã
ä»å¾æ©è½ãå¢ããã°Goçã®ã¡ã¢ãªä½¿ç¨éãå¢ãã¦ããããããã¾ããããããã§ãVPS1å°ã§ã®éç¨ãç¶ããã¨ããæ¹éã«ããã¦ããªã½ã¼ã¹å¹çã®è¯ãã¯æå¾
ã§ãããã§ãã
ç§»è¡ãã¦ä¸å®ãªã¨ãã
Goã¨ãã®åé¡ã§ã¯ãªããèªåã®AIã®ä½¿ãæ¹ã«æ¼ ç¶ã¨ããä¸å®ãããã¾ãã
Railsããã¸ã§ã¯ãã§AIã«ã³ã¼ããæ¸ãã¦ãããã¨ãã¯ãåãRailsã«æ
£ãã¦ããã®ããããAIãæ¸ããã³ã¼ããã³ã³ããã¼ã«ã§ãã¦ããèªä¿¡ãããã¾ããã
ã¢ã¤ã¢ã³ãã³ã®ãã¯ã¼ãã¹ã¼ãã¨ãã¸ã£ã¼ã´ã£ã¹ã¿ãããªæãã§ãèªåã®åããå¼·åãã¦ãããæè¦ãããã¾ããã
䏿¹Goã¯ã¾ã èªåãæ
£ãã¦ããªããã¨ãããAIãã³ã¼ããã³ã³ããã¼ã«ãã¦ããæãããã¦ãã¾ãã
ãã«ã«ã®ç¢ã®åæã¿ãããªæãã§ãä½çºãè¨ã£ãå ´æã«ããããããç¢ç³ãç½®ãã¦ããæè¦ã§ãã
ãã ãAIãæ¸ããã³ã¼ããä¸ã¤ä¸ã¤èªã¿ãæ¸ç±ãåç
§ãããé½åº¦è³ªåããããã¦çè§£ããããã«ãã¦ããã®ã§ãå¾ã
ã«èªåã®ãã®ã«ãªã£ã¦ãã¦ããæè¦ã¯ããã¾ãã
AIã«æ¸ãã¦ããã£ãã³ã¼ããªã©ãèªãã§åå¼·ãããã¨ã§ãå¾åã®ãã«ã«ã®ããã«èªç«ã§ãããè¯ããªã¨æãã¾ãã
ä»å¾ã«ã¤ãã¦
ã¾ã ãã°ã¤ã³ãã¦ã¼ã¶ã¼ç»é²å¨ãããæãã¤ãã¦ããªãã®ã§ãä»ã®ã¨ã³ããã¤ã³ããç§»è¡ãã¦ãããã¨æãã¾ãã
ç°å¢æ§ç¯ãããããã¤ã¾ã§ã®ããã¼ã¯ããã¨æ´ã£ãã®ã§ããã®ç¥è¦ããã¨ã« Mewst ã Wikino ã¨ãã£ãAnnict以å¤ã®ããã¸ã§ã¯ããGoã«ç§»è¡ãã¦ãããã¨æã£ã¦ãã¾ãã
CLAUDE.md ãå¥ãªãã¸ããªã«ã³ãããã¦ãAnnictã¨ä¸¦è¡ãã¦ä½æ¥ãã¦ãããããªã¨æãã¾ãã
ã¾ããæåããGoãä½¿ãæ°è¦ãµã¼ãã¹ã®éçºãå§ãã¦ãã¾ãã
æ°ããæè¡ã¹ã¿ãã¯ã§éçºãã¦ããã®ã楽ãã¿ã§ãã