Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Troubles installing #277

Open
comradeferret opened this issue Jan 3, 2025 · 19 comments
Open

Troubles installing #277

comradeferret opened this issue Jan 3, 2025 · 19 comments

Comments

@comradeferret
Copy link

comradeferret commented Jan 3, 2025

With the update as of yesterday I'm trying again to install Friendica via Docker. I pruned the docker system and volumes prior, so it should be a clean install.

I'm using the default image with Apache, and the example docker-compose script, with the only changes made that I have a password entered and the admin email.

services:
  db:
    image: mariadb
    restart: always
    volumes:
      - db:/var/lib/mysql
    environment:
      - MYSQL_USER=friendica
      - MYSQL_PASSWORD=mypASS1
      - MYSQL_DATABASE=friendica
      - MYSQL_RANDOM_ROOT_PASSWORD=yes

  app:
    image: friendica
    restart: always
    volumes:
      - friendica:/var/www/html
    ports:
      - "8080:80"
    environment:
      - MYSQL_HOST=db
      - MYSQL_USER=friendica
      - MYSQL_PASSWORD=mypASS1
      - MYSQL_DATABASE=friendica
      - [email protected]
    depends_on:
      - db

volumes:
  db:
  friendica:

I get to the point in the setup where it asks for my admin email, which I enter and submit, and then get only a blank page.

<!DOCTYPE html>
<html itemscope itemtype="http://schema.org/Blog" lang="en-us">
<head>
  <title>Friendica Social Network | Install</title>
  <script>var baseurl="http://192.168.50.230:8080";</script>
  <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<base href="http://192.168.50.230:8080/" />
<meta name="generator" content="Friendica 2024.12" />
<link rel="stylesheet" href="view/global.css?v=2024.12" type="text/css" media="all" />
<link rel="stylesheet" href="view/asset/jquery-colorbox/example5/colorbox.css?v=2024.12" type="text/css" media="screen" />
<link rel="stylesheet" href="view/asset/jgrowl/jquery.jgrowl.min.css?v=2024.12" type="text/css" media="screen" />
<link rel="stylesheet" href="view/asset/jquery-datetimepicker/build/jquery.datetimepicker.min.css?v=2024.12" type="text/css" media="screen" />
<link rel="stylesheet" href="view/asset/perfect-scrollbar/dist/css/perfect-scrollbar.min.css?v=2024.12" type="text/css" media="screen" />
<link rel="stylesheet" href="view/js/fancybox/jquery.fancybox.min.css?v=2024.12" type="text/css" media="screen" />

	<link rel="stylesheet" href="http://192.168.50.230:8080/view/install/style.css?v=2024.12" type="text/css" media="screen" />

<link rel="icon" href="images/friendica.svg" />
<link rel="apple-touch-icon" href="images/friendica-192.png"/>

<meta name="apple-mobile-web-app-capable" content="yes" />
<link rel="manifest" href="http://192.168.50.230:8080/manifest" />
<script>
// @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt Expat
// Prevents links to switch to Safari in a home screen app - see https://gist.github.com/irae/1042167
(function(a,b,c){if(c in b&&b[c]){var d,e=a.location,f=/^(a|html)$/i;a.addEventListener("click",function(a){d=a.target;while(!f.test(d.nodeName))d=d.parentNode;"href"in d&&(chref=d.href).replace("http://192.168.50.230:8080/", "").replace(e.href,"").indexOf("#")&&(!/^[a-z\+\.\-]+:/i.test(chref)||chref.indexOf(e.protocol+"//"+e.host)===0)&&(a.preventDefault(),e.href=d.href)},!1)}})(document,window.navigator,"standalone");
// |license-end
</script>

<link rel="search"
         href="http://192.168.50.230:8080/opensearch"
         type="application/opensearchdescription+xml"
         title="Search in Friendica" />

<!--[if IE]>
<script type="text/javascript" src="https://html5shiv.googlecode.com/svn/trunk/html5.js?v=2024.12"></script>
<![endif]-->
<script type="text/javascript" src="view/js/modernizr.js?v=2024.12"></script>
<script type="text/javascript" src="view/asset/jquery/dist/jquery.min.js?v=2024.12"></script>
<script type="text/javascript" src="view/js/jquery.textinputs.js?v=2024.12"></script>
<script type="text/javascript" src="view/asset/textcomplete/dist/textcomplete.min.js?v=2024.12"></script>
<script type="text/javascript" src="view/js/autocomplete.js?v=2024.12"></script>
<script type="text/javascript" src="view/asset/jquery-colorbox/jquery.colorbox-min.js?v=2024.12"></script>
<script type="text/javascript" src="view/asset/jgrowl/jquery.jgrowl.min.js?v=2024.12"></script>
<script type="text/javascript" src="view/asset/jquery-datetimepicker/build/jquery.datetimepicker.full.min.js?v=2024.12"></script>
<script type="text/javascript" src="view/asset/perfect-scrollbar/dist/js/perfect-scrollbar.jquery.min.js?v=2024.12"></script>
<script type="text/javascript" src="view/asset/imagesloaded/imagesloaded.pkgd.min.js?v=2024.12"></script>
<script type="text/javascript" src="view/asset/base64/base64.min.js?v=2024.12"></script>
<script type="text/javascript" src="view/asset/dompurify/dist/purify.min.js?v=2024.12"></script>
<script type="text/javascript" src="view/js/fancybox/jquery.fancybox.min.js?v=2024.12"></script>
<script type="text/javascript" src="view/js/fancybox/fancybox.config.js?v=2024.12"></script>
<script type="text/javascript" src="view/js/vanillaEmojiPicker/vanillaEmojiPicker.min.js?v=2024.12"></script>
<script>
window.onload = function(){
	new EmojiPicker({
		trigger: [
			{
				selector: '.emojis-post',
				insertInto: ['#comment-edit-text-0', '#profile-jot-text']
			},
			{
				selector: '.emojis',
				insertInto: ['.comment-edit-text-full']
			}
		],
		closeButton: true
	});
};
</script>
<script type="text/javascript">
	const updateInterval = 40000;
	const localUser = false;
</script>
<script type="text/javascript" src="view/js/main.js?v=2024.12"></script>
<script>
	// Lifted from https://css-tricks.com/snippets/jquery/move-cursor-to-end-of-textarea-or-input/
    jQuery.fn.putCursorAtEnd = function() {
        return this.each(function() {
            // Cache references
            var $el = $(this),
                el = this;

            // Only focus if input isn't already
            if (!$el.is(":focus")) {
                $el.focus();
            }

            // If this function exists... (IE 9+)
            if (el.setSelectionRange) {
                // Double the length because Opera is inconsistent about whether a carriage return is one character or two.
                var len = $el.val().length * 2;

                // Timeout seems to be required for Blink
                setTimeout(function() {
                    el.setSelectionRange(len, len);
                }, 1);
            } else {
                // As a fallback, replace the contents with itself
                // Doesn't work in Chrome, but Chrome supports setSelectionRange
                $el.val($el.val());
            }

            // Scroll to the bottom, in case we're in a tall textarea
            // (Necessary for Firefox and Chrome)
            this.scrollTop = 999999;
        });
    };

	function confirmDelete() { return confirm(""); }
	function commentExpand(id) {
		$("#comment-edit-text-" + id).putCursorAtEnd();
		$("#comment-edit-text-" + id).addClass("comment-edit-text-full");
		$("#comment-edit-text-" + id).removeClass("comment-edit-text-empty");
		$("#mod-cmnt-wrap-" + id).show();
		openMenu("comment-edit-submit-wrapper-" + id);
		return true;
	}
	function commentOpen(obj,id) {
		if (obj.value == "") {
			$("#comment-edit-text-" + id).addClass("comment-edit-text-full");
			$("#comment-edit-text-" + id).removeClass("comment-edit-text-empty");
			$("#mod-cmnt-wrap-" + id).show();
			openMenu("comment-edit-submit-wrapper-" + id);
			return true;
		}
		return false;
	}
	function commentClose(obj,id) {
		if (obj.value == "") {
			$("#comment-edit-text-" + id).removeClass("comment-edit-text-full");
			$("#comment-edit-text-" + id).addClass("comment-edit-text-empty");
			$("#mod-cmnt-wrap-" + id).hide();
			closeMenu("comment-edit-submit-wrapper-" + id);
			return true;
		}
		return false;
	}

	function commentInsert(obj,id) {
		var tmpStr = $("#comment-edit-text-" + id).val();
		if (tmpStr == "") {
			$("#comment-edit-text-" + id).addClass("comment-edit-text-full");
			$("#comment-edit-text-" + id).removeClass("comment-edit-text-empty");
			openMenu("comment-edit-submit-wrapper-" + id);
		}
		var ins = $(obj).html();
		ins = ins.replace("&lt;","<");
		ins = ins.replace("&gt;",">");
		ins = ins.replace("&amp;","&");
		ins = ins.replace("&quot;","\"");
		$("#comment-edit-text-" + id).val(tmpStr + ins);
	}

	function showHideCommentBox(id) {
		if ($("#comment-edit-form-" + id).is(":visible")) {
			$("#comment-edit-form-" + id).hide();
		} else {
			$("#comment-edit-form-" + id).show();
		}
	}
</script>
</head>
<body>
		<aside></aside>
	<section>
				<div id="pause"></div> <!-- The pause/resume Ajax indicator -->
		<div id="page-footer"></div>
	</section>
	<right_aside></right_aside>
	<footer></footer>
</body>
</html>

Container logs are nothing interesting, just GET requests. Running off of Debian, firewall is down for the sake of just getting this to work.

@Art4
Copy link

Art4 commented Jan 18, 2025

I can reproduce this error with 2024.12. On the develop branch this error does not occur, so it looks like this was already fixed.

@comradeferret
Copy link
Author

comradeferret commented Jan 18, 2025

Is there something I need to do to use the development branch other than change the app image to friendica:dev and add the FRIENDICA_UPGRADE=true environment variable? Doing this alone gives me a blank page when navigating to the wizard; it takes me to the /install sub but the page isn't working. Container logs are below.

 Addon sources (2025.02-dev) verified
 Addon sources (2025.02-dev) extracted
 Initializing Friendica 2025.02-dev ...
 Initializing finished
 New Friendica instance
 Running web-based installer on first connect!
 AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.20.0.3. Set the 'ServerName' directive globally to suppress this message
 AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.20.0.3. Set the 'ServerName' directive globally to suppress this message
 [Sat Jan 18 19:07:49.275834 2025] [mpm_prefork:notice] [pid 1:tid 1] AH00163: Apache/2.4.62 (Debian) PHP/8.2.27 configured -- resuming normal operations
 [Sat Jan 18 19:07:49.275909 2025] [core:notice] [pid 1:tid 1] AH00094: Command line: 'apache2 -D FOREGROUND'
 192.168.50.191 - - [18/Jan/2025:19:07:52 +0000] "GET / HTTP/1.1" 302 356 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0"
 192.168.50.191 - - [18/Jan/2025:19:07:53 +0000] "GET /install HTTP/1.1" 500 246 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0"

@MrPetovan MrPetovan transferred this issue from friendica/friendica Jan 24, 2025
@ne20002
Copy link
Collaborator

ne20002 commented Jan 31, 2025

It seems as if the web install wizard is broken with the current versions. I'm not sure if it is docker image related or a problem of the wizard itself. We're on it.

The easiest way to wark around this would be to go for the autoinstall feature. If you add the FRIENDICA_URL env variable as described here in paragraph 'Automatic Installation' it should give you a running setup.
You will need to add at least the admin user as a user afterwards using the console (or you won't be able to log in to your new system). We're working on making this easier.

Does this help?

@comradeferret
Copy link
Author

It does; this is the furthest I've gotten with an install, thank you. Maybe it's also in plain sight somewhere, but I'm having difficulties finding out how to create an admin user with the console. As it is, registering with the site's GUI just ends up with the registration page no longer being accessible without being given the opportunity to enter a password.

@m33m33
Copy link

m33m33 commented Feb 1, 2025

I'm having difficulties finding out how to create an admin

Using console add console user password, Inhave a PR queued about that you may get the inspiration from the green lines here 9262a71

@ne20002
Copy link
Collaborator

ne20002 commented Feb 1, 2025

Exactly. Connect to the friendica container and run the console steps for adding the user.

I believe this is the only working variant for installing a new friendica with docker images currently.

The documentation shall be updated to reflect this situation and the steps for getting a friendica running. Anyone to volunteer for this?

@m33m33
Copy link

m33m33 commented Feb 1, 2025

Point me to the page editor ;)

@comradeferret
Copy link
Author

docker exec -it friendica-app-1 php /var/www/html/bin/console.php user add resulted in msmtp: account default not found: no configuration file available but docker exec -it friendica-app-1 php /var/www/html/bin/console.php user password worked. I think any other issues I have from now on will have to be a new issue. Glad to finally have a working install, thanks!

@m33m33
Copy link

m33m33 commented Feb 1, 2025

The msmtp error is unrelated.
Great to see your instance is up :)

@ne20002
Copy link
Collaborator

ne20002 commented Feb 1, 2025

Looking a bit deeper into the documentation ...

I believe the install with either the web installer (if it is working) or the autoinstall shall give you a running system. Except, there is no admin user created allthough the admin account's email has been stored already.
@m33m33 opened a PR to create the admin user upon start.

The install documentation states that there is no need to manually add the admin user with the console commands.

Just open the start/login page and register a user with the email used for the admin account. If I recall my install a few years ago I believe I also trapped into this: the register checks the email and tries to resolve the corresponding email server with its MX dns record.
In my case it failed as I run my own internal email server which does not have a MX record in the internal network. It will also fail if one uses the [email protected] as friendica.local will not resolve.

If I remember correctly the solution was to add the FRIENDICA_NO_VALIDATION env variable to the docker compose. This will skip the email domain validation and the user shall be created.

Actually today it didn't work for me with the FRIENDICA_NO_VALIDATION set to true. The reason for this shall be fixed with PR #280. It should work for the release versions already.

But I believe adding correct values to the SMTP env variables and with a working email server able to send the emails to the email accounts used on the registration form the first registration will work. I will give it some more testing tomorrow.

If it works like this I will open some issues accordingly:

  • registration of the admin account after install shall always bypass email validation
  • adding the smtp setup to the web wizard
  • adding the smtp setup to the mandatory env variables for autoinstall

And it will definitely need some clarifications in the docker install documentation.

I believe this is simply missing in the documentation as for plain install you mostly have a working mail (at least sendmail) on a server system. But for the docker image it needs the SMTP configuration.

@ne20002
Copy link
Collaborator

ne20002 commented Feb 2, 2025

I have created a running instance with docker-compose and have been able to create the admin user with the login UI. But there are a few things not working as expected:

This is what I used for docker-compose.yml:

version: '2'

services:
  db:
    image: mariadb
    restart: always
    volumes:
      - db:/var/lib/mysql
    environment:
      - MYSQL_USER=friendica
      - MYSQL_PASSWORD=friendica
      - MYSQL_DATABASE=friendica
      - MYSQL_RANDOM_ROOT_PASSWORD=yes

  app:
    image: friendica:latest
    restart: always
    volumes:
      - friendica:/var/www/html
    ports:
      - "9080:80"
    environment:
      - MYSQL_HOST=db
      - MYSQL_USER=friendica
      - MYSQL_PASSWORD=friendica
      - MYSQL_DATABASE=friendica
      - [email protected]
      - FRIENDICA_UPGRADE=true
      - FRIENDICA_URL=http://localhost:9080
      - FRIENDICA_NO_VALIDATION=true
      - SMTP=smtp.mydomain.ch
      - SMTP_DOMAIN=mydomain.ch
      - SMTP_FROM=system
      - [email protected]
      - SMTP_AUTH_PASS=password
    depends_on:
      - db

volumes:
  db:
  friendica:

I have than been able to open the start/login page in the web browser (under http://localhost:9080 in my case).

Click on the 'Register' button and enter the details, especially the email as chosen for FRIENDICA_ADMIN_MAIL.

I then get a notification stating that the sending of the email failed and it listed my chosen Nickname and a password to use for login.

The first attempt to login with the provided credentials failed, the second attempt succeeded.

So, it worked. But not really as expected. Still, adding the admin user with the console or changing its password still works either.

@comradeferret
Copy link
Author

comradeferret commented Feb 2, 2025

@ne20002 Same issue here. It isn't world-ending but I'd obviously like to resolve it.

I believe you need an SMTP server set up. I was trying to use the PHP Mailer addon to connect it to my Disroot email but still got a log error saying it doesn't support authorization. So either I entered the information wrong or else the server needs to be local? Maybe try that addon and let me know if you can figure it out.

Here's my config for it.

return [
        'phpmailer' => [
                // smtp (Boolean)
                // Enables SMTP relaying for outbound emails
                'smtp' => true,

                // smtp_server (String)
                // SMTP server host name
                'smtp_server' => 'disroot.org',

                // smtp_port (Integer)
                // SMTP server port number
                'smtp_port' => 587,

                // smtp_secure (String)
                // What kind of encryption to use on the SMTP connection.
                // Options: '', 'ssl' or 'tls'.
                'smtp_secure' => 'tls',

                // smtp_port_s (Integer)
                // Secure SMTP server port number
                'smtp_port_s' => 465,

                // smtp_username (String)
                // SMTP server authentication user name
                // Empty string disables authentication
                'smtp_username' => 'myemail',

                // smtp_password (String)
                // SMTP server authentication password
                // Empty string disables authentication
                'smtp_password' => 'password123',

                // smtp_from (String)
                // From address used when using the SMTP server
                // Example: [email protected]
                'smtp_from' => '[email protected]',
        ],
];

@m33m33
Copy link

m33m33 commented Feb 2, 2025

msmtp could be a bit tricky to setup. I took me several attempts to get it right, error messages are not really helpfull.

Here is my .env files smtp part with a working setup tested on gmx.com:

# Address of the SMTP Mail-Gateway. (required)
SMTP=mail.gmx.com
# Port of the SMTP Mail-Gateway. (Default: 587)
SMTP_PORT=587
# The sender domain. (required - e.g. friendica.local)
SMTP_DOMAIN=gmx.com
#Sender user-part of the address. (Default: no-reply - e.g. [email protected])
SMTP_FROM=MYNAME WITHOUT @ gmx.com
# Use TLS for connecting the SMTP Mail-Gateway. (Default: empty)
SMTP_TLS=on
# Use STARTTLS for connecting the SMTP Mail-Gateway. (Default: On)
SMTP_STARTTLS=on
# Auth mode for the SMTP Mail-Gateway. (Default: On)
SMTP_AUTH=on
#Username for the SMTP Mail-Gateway. (Default: empty)
[email protected]
# Password for the SMTP Mail-Gateway. (Default: empty)
SMTP_AUTH_PASS=MYPASSWORD

ALL these variables MUST be passed to friendica's app: section in the docker-compose.yaml file. The documentation should be developed about that particular point:

    environment:        
      # The next 7 environment variables are needed for an automated install on first run, then all needed for msmtp setup
      - MYSQL_HOST=${MYSQL_HOST:?error}
      - MYSQL_PORT=${MYSQL_PORT:?error}                                                 
      - MYSQL_USER=${MYSQL_USER:?error}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD:?error}
      - MYSQL_DATABASE=${MYSQL_DATABASE:?error}
      - FRIENDICA_ADMIN_MAIL=${FRIENDICA_ADMIN_MAIL:?error}
      - FRIENDICA_URL=${FRIENDICA_URL:?error}
      - SMTP=${SMTP:?error}
      - SMTP_PORT=${SMTP_PORT:?error}
      - SMTP_DOMAIN=${SMTP_DOMAIN:?error}
      - SMTP_FROM=${SMTP_FROM:?error}
      - SMTP_TLS=${SMTP_TLS:?error}
      - SMTP_STARTTLS=${SMTP_STARTTLS:?error}
      - SMTP_AUTH=${SMTP_AUTH:?error}
      - SMTP_AUTH_USER=${SMTP_AUTH_USER:?error}
      - SMTP_AUTH_PASS=${SMTP_AUTH_PASS:?error}

If you want to go trial and errors to debug your configuration, I suggest:

  • you mount an external config file to /etc/msmtprc like this in your friendica's app volumes mapping:
    volumes:                                                                                                                                                                    
      - friendica:/var/www/html                                                                                                                                                                                                                                 
      - ./mymsmtprc:/etc/msmtprc  

With your local mymsmtprc file containing your trial and error config, something like that based on your .env setup:

account default
host mail.gmx.com
port 587
from "[email protected]"
tls_certcheck off
tls on
tls_starttls on
auth on
user "[email protected]"
password "MYPASSWORD"
logfile -
aliases /etc/aliases

So you can edit mysmtprc file quickly without restarting friendica's container, and quickly try different settings. Once you have it working, you will reflect the settings in .env file, remove the mysmtp volume mapping in docker-compose.yaml etc... to get back to normal.

Log inside the friendica's container, create a test mail file, run msmtp in debuging mode:

docker container exec -it `docker container ls | grep friendica-app | awk '{print $1}'` bash
cat << EOF > /tmp/message.txt
From: [email protected]
To: [email protected]
Subject: Test email 

Testing 1 2 1 2 3
EOF
msmtp -d -t</tmp/message.txt

@comradeferret
Copy link
Author

comradeferret commented Feb 2, 2025

Got it working. I entered in what was suggested by @m33m33 and turned off PHP Mailer. I think it was the missing SMTP_STARTTLS variable that did it. Thanks!

@ne20002
Copy link
Collaborator

ne20002 commented Feb 3, 2025

I tried it myself, the test worked. But when I try the setup with the login page and register with the defined admin email, no email is send and a friendica blank page (only layout without content) is shown.
I believe there is still something to do.

@ne20002
Copy link
Collaborator

ne20002 commented Feb 3, 2025

Did anyone got the logging working?

@m33m33
Copy link

m33m33 commented Feb 3, 2025

Using the admin panel in the WebUI, yes. Set it to debug if you want to have something to read quickly.

Image
Image

@ne20002
Copy link
Collaborator

ne20002 commented Feb 3, 2025

I don't get the login working so that's why I wanted to look into the log file on the console. I try to just increase log level, maybe its just nothing logged when I tried.

@ne20002
Copy link
Collaborator

ne20002 commented Feb 4, 2025

I managed to complete the install with both the ui wizard and the autoinstall with the latest friendica:dev docker image.

In both variants the creation of the admin user using the 'Register' button on the first login screen fails. Thus at the moment the admin user needs to be created by exec-ing into the friendica container

docker exec -it yourcontainerid /bin/bash

and using the console

bin/console.php user add Admin Admin [email protected] EN http://localhost:9080/images/person-300.jpg

In my tests I created a valid msmtp setup based on the input as above. This has the advantage that an email with the password created is send to the provided admin's email account.

Without email the password needs to be set with the console:

bin/console.php user password [email protected] yourpasswordhere

This is my current docker-compose file for using the ui wizard:

version: '2'

services:
  db:
    image: mariadb
    restart: always
    volumes:
      - db:/var/lib/mysql
    environment:
      - MYSQL_USER=friendica
      - MYSQL_PASSWORD=friendica
      - MYSQL_DATABASE=friendica
      - MYSQL_RANDOM_ROOT_PASSWORD=yes

  app:
    image: friendica:dev
    restart: always
    volumes:
      - friendica:/var/www/html
    ports:
      - "9080:80"
    environment:
      - MYSQL_HOST=db
      - MYSQL_USER=friendica
      - MYSQL_PASSWORD=friendica
      - MYSQL_DATABASE=friendica
      - [email protected]
      - FRIENDICA_UPGRADE=true
      - SMTP=smtp.mydomain.here
      - SMTP_DOMAIN=mydomain.here
      - SMTP_TLS=on
      - [email protected]
      - SMTP_AUTH_PASS=thepasswordhere
      depends_on:
      - db

volumes:
  db:
  friendica:

For using the autoinstall

- FRIENDICA_URL=http://localhost:9080

needs to be added to the environment section of app service.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants