2022-06-08 / @syui

git , heroku , gitea

giteaのcleanとupdate

現在、giteaをherokuで動かしてるんだけど、この前、postgres(pgsql)のメンテンナンスがあるとかで一時停止されて、メンテナンス後に動作しなくなってたので再度動かしてみたときの知見。

https://git.syui.cf/syui

まず、メンテナンス後にherokuのpgsqlがwebとcliで情報が違ってたので、cliを参考にすること。

app.iniのdb情報を修正すれば動くと思う。

ただ、db(record)がいっぱいになりかけてたし、updateもしたかったので、resetしてからdeployすることに。

$ git clone https://github.com/go-gitea/gitea
$ cd gitea
$ vim 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

最小構成はこんな感じです。

version: '3'
services:
  web:
    image: gitea/gitea:latest
    volumes:
      - ./gitea:/data
    ports:
      - "3000:3000"
      - "10022:10022"
    environment:
      - TZ=Japan
      - SSH_PORT=10022
    restart: always
$ docker-compose up

起動しないときは、dockerのpsやimageを削除します。

$ 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`
$ chromium localhost:3000/install

webでぽちぽちやると以下のファイルが生成されます。重要な設定部分を載せています。

[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
$ heroku git:remote -a $appname
$ heroku pg:credentials:url
$ heroku stack:set container

DockerfileのENV USER gitを消してください。基本的にはこれだけで動きます。

$ 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するしかありません。

$ echo RUN_USER=`whoami` >> /data/gitea/conf/app.ini

カスタマイズしたい方は、./docker/root/以下のファイルが参考になります。

heroku.ymlのrunはDockerfileにCMDがある場合は実行されません。ですから、仮にheroku.ymlを優先したい場合は、DockerfileのCMDを削除してrunを書きましょう。

Dockerfile

#CMD ["/bin/s6-svscan", "/etc/s6"]
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
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がストレージをリセットする関係上、webで作成したrepo、つまり、web serverに書き込まれる/data/gitは後々削除されます。

$ 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を使ってください。

$ git clone xxx/xxx.git
$ cd xxx
$ tree .git

また、localでrepoを作成、更新するのが面倒な場合は、/data/gitea/git/repositories/$userにrepoの.git$repo.gitとして置く方法があります。これをheroku-deployしなければなりません。

$ 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