Install Forgejo using podman.

Operating system.

$ lsb_release --all
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 22.04.1 LTS
Release:	22.04
Codename:	jammy

Install podman.

$ sudo apt install podman systemd-container

Determine podman version.

$ podman version
Version:      3.4.4
API Version:  3.4.4
Go Version:   go1.17.3
Built:        Thu Jan  1 01:00:00 1970
OS/Arch:      linux/amd64

Create dedicated forgejo user.

$ sudo useradd --home-dir /opt/forgejo --create-home --shell /bin/bash forgejo

Create user systemd directory.

$ sudo -u forgejo mkdir -p /opt/forgejo/.config/systemd/user

Enable user lingering.

$ sudo loginctl enable-linger forgejo

Create application network.

$ sudo -u forgejo -i podman network create forgejo-network
/opt/forgejo/.config/cni/net.d/forgejo-network.conflist

Create database container.

$ sudo -u forgejo mkdir /opt/forgejo/database
$ sudo -u forgejo -i \
    podman container run \
                      --detach \
                      --env MARIADB_ROOT_PASSWORD=toor \
                      --env MARIADB_DATABASE=forgejo \
                      --env MARIADB_USER=forgejo \
                      --env MARIADB_PASSWORD=forgejo \
                      --volume /opt/forgejo/database:/var/lib/mysql/ \
                      --network forgejo-network \
                      --name forgejo-database \
                      docker.io/library/mariadb:latest
Trying to pull docker.io/library/mariadb:latest...
Getting image source signatures
Copying blob 94c8eab958ce done  
Copying blob 73cc9c81ae7f done  
Copying blob 20bcac65cb84 done  
Copying blob c4a9b64b12f6 done  
Copying blob 6e3729cf69e0 done  
Copying blob 0b2128efbd85 done  
Copying blob 890f8c45a000 done  
Copying blob 97533be58132 done  
Copying config a748acbacc done  
Writing manifest to image destination
Storing signatures
2fd6882fa1d3be96d8f523909e6b01c56dddbeecb77f50062075c35d6fa25014  

Create application container.

$ sudo -u forgejo mkdir /opt/forgejo/git
$ sudo -u forgejo -i \
    podman container run \
                      --detach \
                      --env DB_TYPE=mysql \
                      --env DB_HOST=forgejo-database:3306 \
                      --env DB_NAME=forgejo \
                      --env DB_USER=forgejo \
                      --env DB_PASSWD=forgejo \
                      --volume /opt/forgejo/git:/data \
                      --network forgejo-network \
                      --publish 3000:3000 \
                      --label "io.containers.autoupdate=registry" \
                      --name forgejo-app \
                      codeberg.org/forgejo/forgejo:1.18.0-rc1-1
Trying to pull codeberg.org/forgejo/forgejo:1.18.0-rc1-1...
Getting image source signatures
Copying blob 03e8d6776079 done  
Copying blob 1bf71cc7b214 done  
Copying blob 79e1c7a8b118 done  
Copying blob 603f68ea1ac0 done  
Copying blob 1625488e60ae done  
Copying blob ca7dd9ec2225 done  
Copying blob 4f4fb700ef54 done  
Copying blob 41aae6095be7 done  
Copying config 7838f2d9e5 done  
Writing manifest to image destination
Storing signatures
a67af8553a03ee6cc376f578890001f591a312ec6d5be70bc36c0f3379e97cf4

Generate systemd services.

$ sudo -u forgejo -i podman generate systemd --files forgejo-database
/opt/forgejo/container-2fd6882fa1d3be96d8f523909e6b01c56dddbeecb77f50062075c35d6fa25014.service
$ sudo -u forgejo cat /opt/forgejo/container-2fd6882fa1d3be96d8f523909e6b01c56dddbeecb77f50062075c35d6fa25014.service
# container-2fd6882fa1d3be96d8f523909e6b01c56dddbeecb77f50062075c35d6fa25014.service
# autogenerated by Podman 3.4.4
# Tue Dec 27 22:54:00 CET 2022

[Unit]
Description=Podman container-2fd6882fa1d3be96d8f523909e6b01c56dddbeecb77f50062075c35d6fa25014.service
Documentation=man:podman-generate-systemd(1)
Wants=network-online.target
After=network-online.target
RequiresMountsFor=/run/user/1001/containers

[Service]
Environment=PODMAN_SYSTEMD_UNIT=%n
Restart=on-failure
TimeoutStopSec=70
ExecStart=/usr/bin/podman start 2fd6882fa1d3be96d8f523909e6b01c56dddbeecb77f50062075c35d6fa25014
ExecStop=/usr/bin/podman stop -t 10 2fd6882fa1d3be96d8f523909e6b01c56dddbeecb77f50062075c35d6fa25014
ExecStopPost=/usr/bin/podman stop -t 10 2fd6882fa1d3be96d8f523909e6b01c56dddbeecb77f50062075c35d6fa25014
PIDFile=/run/user/1001/containers/overlay-containers/2fd6882fa1d3be96d8f523909e6b01c56dddbeecb77f50062075c35d6fa25014/userdata/conmon.pid
Type=forking

[Install]
WantedBy=default.target
$ sudo -u forgejo -i podman generate systemd --files forgejo-app     
/opt/forgejo/container-a67af8553a03ee6cc376f578890001f591a312ec6d5be70bc36c0f3379e97cf4.service
$ sudo -u forgejo cat /opt/forgejo/container-a67af8553a03ee6cc376f578890001f591a312ec6d5be70bc36c0f3379e97cf4.service
# container-a67af8553a03ee6cc376f578890001f591a312ec6d5be70bc36c0f3379e97cf4.service
# autogenerated by Podman 3.4.4
# Tue Dec 27 22:54:27 CET 2022

[Unit]
Description=Podman container-a67af8553a03ee6cc376f578890001f591a312ec6d5be70bc36c0f3379e97cf4.service
Documentation=man:podman-generate-systemd(1)
Wants=network-online.target
After=network-online.target
RequiresMountsFor=/run/user/1001/containers

[Service]
Environment=PODMAN_SYSTEMD_UNIT=%n
Restart=on-failure
TimeoutStopSec=70
ExecStart=/usr/bin/podman start a67af8553a03ee6cc376f578890001f591a312ec6d5be70bc36c0f3379e97cf4
ExecStop=/usr/bin/podman stop -t 10 a67af8553a03ee6cc376f578890001f591a312ec6d5be70bc36c0f3379e97cf4
ExecStopPost=/usr/bin/podman stop -t 10 a67af8553a03ee6cc376f578890001f591a312ec6d5be70bc36c0f3379e97cf4
PIDFile=/run/user/1001/containers/overlay-containers/a67af8553a03ee6cc376f578890001f591a312ec6d5be70bc36c0f3379e97cf4/userdata/conmon.pid
Type=forking

[Install]
WantedBy=default.target

Copy service files.

$ sudo -u forgejo cp /opt/forgejo/container-2fd6882fa1d3be96d8f523909e6b01c56dddbeecb77f50062075c35d6fa25014.service  /opt/forgejo/.config/systemd/user/forgejo-database.service
$ sudo -u forgejo cp /opt/forgejo/container-a67af8553a03ee6cc376f578890001f591a312ec6d5be70bc36c0f3379e97cf4.service  /opt/forgejo/.config/systemd/user/forgejo-app.service

Use machinectl utility to control services using systemd.

$ sudo machinectl shell --uid forgejo 
Connected to the local host. Press ^] three times within 1s to exit session.
forgejo@host$ podman ps
CONTAINER ID  IMAGE                                      COMMAND               CREATED         STATUS             PORTS                   NAMES
2fd6882fa1d3  docker.io/library/mariadb:latest           mariadbd              27 minutes ago  Up 27 minutes ago                          forgejo-database
a67af8553a03  codeberg.org/forgejo/forgejo:1.18.0-rc1-1  /bin/s6-svscan /e...  17 minutes ago  Up 17 minutes ago  0.0.0.0:3000->3000/tcp  forgejo-app
forgejo@host$ podman stop forgejo-app
forgejo@host$ podman stop forgejo-database
forgejo@host$ systemctl --user daemon-reload
forgejo@host$ systemctl --user enable --now forgejo-database
Created symlink /opt/forgejo/.config/systemd/user/default.target.wants/forgejo-database.service → /opt/forgejo/.config/systemd/user/forgejo-database.service.
forgejo@host$ systemctl --user enable --now forgejo-app
Created symlink /opt/forgejo/.config/systemd/user/default.target.wants/forgejo-app.service → /opt/forgejo/.config/systemd/user/forgejo-app.service.
forgejo@host$ podman ps
CONTAINER ID  IMAGE                                      COMMAND               CREATED         STATUS            PORTS                   NAMES
2fd6882fa1d3  docker.io/library/mariadb:latest           mariadbd              36 minutes ago  Up 6 minutes ago                          forgejo-database
a67af8553a03  codeberg.org/forgejo/forgejo:1.18.0-rc1-1  /bin/s6-svscan /e...  26 minutes ago  Up 6 minutes ago  0.0.0.0:3000->3000/tcp  forgejo-app
forgejo@host$ exit
Connection to the local host terminated.

Open web-browser on port 3000 to access application.

ko-fi