1
0
hugo/content/blog/2022-06-08-gitea.md
2024-12-21 15:52:52 +09:00

220 lines
5.9 KiB
Markdown

+++
date = "2022-06-08"
tags = ["git","heroku","gitea"]
title = "giteaのcleanとupdate"
slug = "gitea"
+++
現在、giteaをherokuで動かしてるんだけど、この前、postgres(pgsql)のメンテンナンスがあるとかで一時停止されて、メンテナンス後に動作しなくなってたので再度動かしてみたときの知見。
https://git.syui.ai/syui
まず、メンテナンス後にherokuのpgsqlがwebとcliで情報が違ってたので、cliを参考にすること。
app.iniのdb情報を修正すれば動くと思う。
ただ、db(record)がいっぱいになりかけてたし、updateもしたかったので、resetしてからdeployすることに。
```sh
$ git clone https://github.com/go-gitea/gitea
$ cd gitea
$ vim docker-compose.yml
```
```yml:docker-compose.yml
version: "3"
networks:
gitea:
external: false
services:
server:
image: gitea/gitea:1.16.8
container_name: gitea
environment:
- USER_UID=1000
- USER_GID=1000
- GITEA__database__DB_TYPE=postgres
- GITEA__database__HOST=db:5432
- GITEA__database__NAME=gitea
- GITEA__database__USER=gitea
- GITEA__database__PASSWD=gitea
restart: always
networks:
- gitea
volumes:
- ./gitea:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "3000:3000"
- "222:22"
depends_on:
- db
db:
image: postgres:14
restart: always
environment:
- POSTGRES_USER=gitea
- POSTGRES_PASSWORD=gitea
- POSTGRES_DB=gitea
networks:
- gitea
volumes:
- ./postgres:/var/lib/postgresql/data
```
最小構成はこんな感じです。
```yml:docker-compose.yml
version: '3'
services:
web:
image: gitea/gitea:latest
volumes:
- ./gitea:/data
ports:
- "3000:3000"
- "10022:10022"
environment:
- TZ=Japan
- SSH_PORT=10022
restart: always
```
```sh
$ docker-compose up
```
起動しないときは、dockerのpsやimageを削除します。
```sh
$ sudo docker ps -aq
$ sudo docker images -aq
$ sudo docker stop `sudo docker ps -aq`
$ sudo docker rm -f `sudo docker ps -aq`
$ sudo docker rmi -f `sudo docker images -aq`
```
```sh
$ chromium localhost:3000/install
```
webでぽちぽちやると以下のファイルが生成されます。重要な設定部分を載せています。
```yml:gitea/gitea/conf/app.ini
[database]
DB_TYPE = postgres
SSL_MODE = require
[service]
DISABLE_REGISTRATION = true
REQUIRE_SIGNIN_VIEW = false
REGISTER_EMAIL_CONFIRM = false
ENABLE_NOTIFY_MAIL = false
ALLOW_ONLY_EXTERNAL_REGISTRATION = false
ENABLE_CAPTCHA = false
DEFAULT_KEEP_EMAIL_PRIVATE = false
DEFAULT_ALLOW_CREATE_ORGANIZATION = false
DEFAULT_ENABLE_TIMETRACKING = false
```
```sh
$ heroku git:remote -a $appname
$ heroku pg:credentials:url
$ heroku stack:set container
```
Dockerfileの`ENV USER git`を消してください。基本的にはこれだけで動きます。
```sh
$ vim Dockerfile
#ENV USER git
COPY ./gitea/ /data/
$ git add gitea Dockerfile heroku.yml
$ git commit -m "add conf"
$ git push -u heroku main
```
### heroku $USER, $PORT
herokuの場合、毎日web-serverのストレージがリセットされる際に$USER, $PORTが変わるので、それに対応しなければなりません。
リセットされる都度、以下のような処理をどこかに入れて、`gitea web`するしかありません。
```sh
$ echo RUN_USER=`whoami` >> /data/gitea/conf/app.ini
```
カスタマイズしたい方は、`./docker/root/`以下のファイルが参考になります。
`heroku.yml`のrunはDockerfileにCMDがある場合は実行されません。ですから、仮に`heroku.yml`を優先したい場合は、DockerfileのCMDを削除してrunを書きましょう。
> Dockerfile
```sh
#CMD ["/bin/s6-svscan", "/etc/s6"]
```
```yml:heroku.yml
build:
docker:
web: ./Dockerfile
run:
web: echo "RUN_USER=`whoami`" >> /data/gitea/conf/app.ini;gitea web -p $PORT -c /data/gitea/conf/app.ini
```
```yml:heroku.yml
build:
docker:
web: Dockerfile
release:
image: web
command:
- echo RUN_USER=`whoami` >> /data/gitea/conf/app.ini
run:
web: gitea web -p $PORT -c /data/gitea/conf/app.ini
```
herokuの$USERが難しいのは、Dockerfileがrootで実行されるので、heroku.ymlで制御する必要があるからです。ただし、heroku.ymlでは`/data/gitea/conf`に書き込む権限がありません。
ref : https://devcenter.heroku.com/articles/container-registry-and-runtime#dockerfile-commands-and-runtime
### git push
herokuがストレージを[リセット](https://devcenter.heroku.com/ja/articles/dynos#restarting)する関係上、webで作成したrepo、つまり、web serverに書き込まれる`/data/git`は後々削除されます。
```sh
$ heroku ps:restart
```
ですから、localでrepo、つまり、`/gitea/git`を生成して、それをheroku-repoにpushする必要があります。
ただし、herokuでつかうapp.iniとdocker-localで使うapp.iniは異なります。立ち上げる際は動くように調整する必要があります。
giteaを使う場合は、作成したrepoをcloneしてpushできます。
init, remoteで作成した`.git`だとそのままではpushできません。cloneした`.git`を使ってください。
```sh
$ git clone xxx/xxx.git
$ cd xxx
$ tree .git
```
また、localでrepoを作成、更新するのが面倒な場合は、`/data/gitea/git/repositories/$user`にrepoの`.git`を`$repo.git`として置く方法があります。これをheroku-deployしなければなりません。
```sh
$ git clone xxx/$user/$repo.git
$ mkdir -p gitea/git/repositories/$user
$ mv $repo/.git ./gitea/git/repositories/$user/$repo.git
$ rm -rf $repo
$ git add gitea/git
$ git commit -m "add git-repo"
$ git push heroku main
```