Pixelfed
-
Hi all,
Pixelfed is now available in the app store. Most of the packaging work was done by @doodlemania2 (thanks!)Code: https://git.cloudron.io/cloudron/pixelfed-app
App store link: https://cloudron.io/store/org.pixelfed.cloudronapp.html
Docs: https://cloudron.io/documentation/apps/pixelfed/ -
Just a heads up : the package doesn't have any tests yet and I haven't tested the federation as well.
-
I have a test instance up with this app (https://pixel.mobiledads.live) and during install I got the following error(s):
Jun 17 12:53:37 ==> Updating pixelfed Jun 17 12:53:37 fatal: not a git repository (or any of the parent directories): .git
This didn't prove to be an issue now, but down the road it might be. Otherwise, I am testing the app. Anyone who wants to test but doesn't want an unstable app on their server can freely join my instance - just note it can be deleted and reinstalled any time
-
@girish woohoo! Thanks both. Now to see how hard it is to get all my images off Flickr and into pixelfed
-
-
I am still trying to figure out federation setup. If someone has insight into this, please leave a note here. It looks like we have to setup webfinger or equivalent?
-
@girish isn't webfinger a thing already enabled in pixelfed? The only caveat I can see is pixelfed being installed to a subdomain but users are using main domain as username:
Instance URL:
pixelfed.example.com
Username:@murgero@example.com
The above requires webfinger to translate from the main domain afaik.
As for federation - I believe just enabling ActivityPub (which it is already in the app afaik) it should just work so long as the URLs match:
Instance URL:
pixelfed.example.com
Username:@murgero@pixelfed.example.com
If someone else has an instance, can they PM me their profile URL? I'll try to follow you to see if federation is working properly.
-
@murgero I've whacked up a test instance at images.uniteddiversity.coop so you could try jdaviescoates@images.uniteddiversity.coop (the only user I've created so far)
-
@jdaviescoates said in Pixelfed:
jdaviescoates
I tried tagging you - but it fails it looks like. (Tag for you AFAIK should be
@jdaviescoates@images.uniteddiversity.coop
)Edit: Though I THINK I followed successfully?
-
-
@jdaviescoates Safe to say federation is technically working, idk if it's working well tho - your server didn't poll my profile it looks like.
-
I read on the pixelfed matrix channel that in order to receive new posts you need to follow a person (obviously) and some person of that instance needs to follow you so that instance knows that your instance exists.
-
@jdaviescoates@images.uniteddiversity.coop
Followed you also - took the search box a few tries to pull up your profile, but it finally kicked in!
-
@doodlemania2 huh - I don't see your follow.
I am going to reconfigure my instance with mastodon so we can test actual federation.
-
Alright, please also follow @hyper@social.mobiledads.live - this is a known working instance of Mastodon, and I can debug connections from pixelfed as well.
-
-
I am following back everyone that follows me. So if you need to debug federated follow, you can follow me as well!
I also just sent out a status update via mastodon so can any pixelfed users report if they see it?
-
You can add me too! @scooke@lenote.eu.
-
-
To be honest I'm not getting what the heck is going on. I can see you are following me @jdaviescoates but when I click on you from within my Pixelfed dashboard, which brings me to your site, and see your pic and try to like it, I see that I am now not at my Pixelfed and apparently need to login to your Pixelfed instance to do anything. ? And I see nothing about Mastodon in my Pixelfed dashboard either.
-
While they use the same protocol, MD and PF are different so statuses I wouldn't think would share cross tools. No?
-
@scooke No, you should see their status / images in your own feed. ActivityPub is federated, decentralized sort of like bittorrent in a way. Everyone (or everyone you are connected to) gets a copy of the actor (in this case it's a pixelfed image status update)
Ex:
(Not my image)
-
@doodlemania2 Both use activitypub and as such are compatible with each other. However the Unstable app here for Pixelfed in Cloudron's appstore has broken federation and it doesn't work more than like 80% of the time right now.
Mastodon
GNU/Social
Pixelfed
Pleroma
Nextcloud via the social app.
and moreAll use activitypub - Here is a large, but incomplete list of different service, scripts, and servers that can communicate via AP: https://github.com/BasixKOR/awesome-activitypub
-
It seems broken that I have to log in to someone else's Pixelfed instance to Like an image though. Or is this a 20% case of the federation not working? Seems counterintuitive to have to join someone's PF to interact with them.
-
It seems broken that I have to log in to someone else's Pixelfed instance to Like an image though
You're doing it wrong. ActivityPub doesn't work like that - The issue here is federation is broken.
There is no requirement to register and login to another server to send a like on an image in activitypub.
-
-
@murgero Ok, so normally I could click on a Follower, see their images, and simply press Heart, like Instagram? That makes more sense. But without that, PF as it is on Cloudron is for viewing only. I wish I could code and help out, add that missing federation bit.
-
@girish I think webfinger on the root domain may help out here. But I am not 100% versed in ActivityPub. That said, there is a reported federation issue when using activitypub upstream: https://github.com/pixelfed/pixelfed/issues/2221
-
I can see some traffic and some errors in my horizon based on what @murgero linked to. No idea how to fix, but at least we have errors to work off of!
My error is saying there is inbound issue from @hyper@social.mobiledads.live (the person I've followed). Here is the log (sorry it is big).
Symfony\Component\HttpKernel\Exception\HttpException: Invalid object in /app/code/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:1015 Stack trace: #0 /app/code/vendor/laravel/framework/src/Illuminate/Foundation/helpers.php(46): Illuminate\Foundation\Application->abort(400, 'Invalid object', Array) #1 /app/code/app/Util/ActivityPub/Helpers.php(240): abort(400, 'Invalid object') #2 /app/code/app/Util/ActivityPub/Inbox.php(135): App\Util\ActivityPub\Helpers::statusFirstOrFetch('https://social....', true) #3 /app/code/app/Util/ActivityPub/Inbox.php(117): App\Util\ActivityPub\Inbox->handleNoteReply() #4 /app/code/app/Util/ActivityPub/Inbox.php(50): App\Util\ActivityPub\Inbox->handleCreateActivity() #5 /app/code/app/Util/ActivityPub/Inbox.php(42): App\Util\ActivityPub\Inbox->handleVerb() #6 /app/code/app/Jobs/InboxPipeline/InboxWorker.php(43): App\Util\ActivityPub\Inbox->handle() #7 [internal function]: App\Jobs\InboxPipeline\InboxWorker->handle() #8 /app/code/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(32): call_user_func_array(Array, Array) #9 /app/code/vendor/laravel/framework/src/Illuminate/Container/Util.php(36): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}() #10 /app/code/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(90): Illuminate\Container\Util::unwrapIfClosure(Object(Closure)) #11 /app/code/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(34): Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application), Array, Object(Closure)) #12 /app/code/vendor/laravel/framework/src/Illuminate/Container/Container.php(590): Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application), Array, Array, NULL) #13 /app/code/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(94): Illuminate\Container\Container->call(Array) #14 /app/code/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(130): Illuminate\Bus\Dispatcher->Illuminate\Bus\{closure}(Object(App\Jobs\InboxPipeline\InboxWorker)) #15 /app/code/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(105): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(App\Jobs\InboxPipeline\InboxWorker)) #16 /app/code/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(98): Illuminate\Pipeline\Pipeline->then(Object(Closure)) #17 /app/code/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php(83): Illuminate\Bus\Dispatcher->dispatchNow(Object(App\Jobs\InboxPipeline\InboxWorker), false) #18 /app/code/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(130): Illuminate\Queue\CallQueuedHandler->Illuminate\Queue\{closure}(Object(App\Jobs\InboxPipeline\InboxWorker)) #19 /app/code/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(105): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(App\Jobs\InboxPipeline\InboxWorker)) #20 /app/code/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php(85): Illuminate\Pipeline\Pipeline->then(Object(Closure)) #21 /app/code/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php(59): Illuminate\Queue\CallQueuedHandler->dispatchThroughMiddleware(Object(Illuminate\Queue\Jobs\RedisJob), Object(App\Jobs\InboxPipeline\InboxWorker)) #22 /app/code/vendor/laravel/framework/src/Illuminate/Queue/Jobs/Job.php(88): Illuminate\Queue\CallQueuedHandler->call(Object(Illuminate\Queue\Jobs\RedisJob), Array) #23 /app/code/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(354): Illuminate\Queue\Jobs\Job->fire() #24 /app/code/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(300): Illuminate\Queue\Worker->process('redis', Object(Illuminate\Queue\Jobs\RedisJob), Object(Illuminate\Queue\WorkerOptions)) #25 /app/code/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(134): Illuminate\Queue\Worker->runJob(Object(Illuminate\Queue\Jobs\RedisJob), 'redis', Object(Illuminate\Queue\WorkerOptions)) #26 /app/code/vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php(112): Illuminate\Queue\Worker->daemon('redis', 'default', Object(Illuminate\Queue\WorkerOptions)) #27 /app/code/vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php(96): Illuminate\Queue\Console\WorkCommand->runWorker('redis', 'default') #28 /app/code/vendor/laravel/horizon/src/Console/WorkCommand.php(46): Illuminate\Queue\Console\WorkCommand->handle() #29 [internal function]: Laravel\Horizon\Console\WorkCommand->handle() #30 /app/code/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(32): call_user_func_array(Array, Array) #31 /app/code/vendor/laravel/framework/src/Illuminate/Container/Util.php(36): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}() #32 /app/code/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(90): Illuminate\Container\Util::unwrapIfClosure(Object(Closure)) #33 /app/code/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(34): Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application), Array, Object(Closure)) #34 /app/code/vendor/laravel/framework/src/Illuminate/Container/Container.php(590): Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application), Array, Array, NULL) #35 /app/code/vendor/laravel/framework/src/Illuminate/Console/Command.php(202): Illuminate\Container\Container->call(Array) #36 /app/code/vendor/symfony/console/Command/Command.php(255): Illuminate\Console\Command->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle)) #37 /app/code/vendor/laravel/framework/src/Illuminate/Console/Command.php(189): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle)) #38 /app/code/vendor/symfony/console/Application.php(1011): Illuminate\Console\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #39 /app/code/vendor/symfony/console/Application.php(272): Symfony\Component\Console\Application->doRunCommand(Object(Laravel\Horizon\Console\WorkCommand), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #40 /app/code/vendor/symfony/console/Application.php(148): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #41 /app/code/vendor/laravel/framework/src/Illuminate/Console/Application.php(93): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #42 /app/code/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(131): Illuminate\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #43 /app/code/artisan(37): Illuminate\Foundation\Console\Kernel->handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #44 {main} Data { headers: { host: [ "pixels.thedoodleproject.net" ], x-forwarded-for: [ "192.99.10.87" ], x-forwarded-host: [ "pixels.thedoodleproject.net" ], x-forwarded-port: [ "443" ], x-forwarded-proto: [ "https" ], x-forwarded-ssl: [ "on" ], connection: [ "close" ], content-length: [ "2290" ], user-agent: [ "http.rb/4.3.0 (Mastodon/3.1.3; +https://social.mobiledads.live/)" ], date: [ "Fri, 19 Jun 2020 19:58:41 GMT" ], accept-encoding: [ "gzip" ], digest: [ "SHA-256=40Q8xJRc0kzr0bIczPgBonDpqKiwJpD5K3npBCqhVmo=" ], content-type: [ "application/activity+json" ], signature: [ "keyId="https://social.mobiledads.live/users/hyper#main-key",algorithm="rsa-sha256",headers="(request-target) host date digest content-type",signature="nXTzozY1aOyBKrMqaIB9kkwdminzCFqXfW5mAY7MAKpCz95OiIkSReOpknLzgdynxIu/LKs5e+vP8Jd1yaTidaOC9w7QDpeIqhsL82kx3rlfVohXuEkYq1sMnZeJnrT6yk4XU6Y0qado2W7ttHs7RwnukdrAvPQ3DSOJnDgaUN8OkWoY1INasipubHl2narkvxdIWr9HWR1InqJXzOXANULpAEnQUr0nKTrhZ2TdHCwy7Hp99L1WdX5VDAzYHO1YiTTYyCpH8RNGiw9WHhKjWvltF8Wy/CmVg1Mg679UNPd8AhQZAfPiMdgaiKF8M/Fzn/ZC5/MT37uapsgCwZhQuQ=="" ] }, profile: { class: "App\Profile", id: 178923258836553730, relations: [ ], connection: "mysql" }, payload: { @context: [ "https://www.w3.org/ns/activitystreams", { ostatus: "http://ostatus.org#", atomUri: "ostatus:atomUri", inReplyToAtomUri: "ostatus:inReplyToAtomUri", conversation: "ostatus:conversation", sensitive: "as:sensitive", toot: "http://joinmastodon.org/ns#", votersCount: "toot:votersCount" } ], id: "https://social.mobiledads.live/users/hyper/statuses/104372418627220354/activity", type: "Create", actor: "https://social.mobiledads.live/users/hyper", published: "2020-06-19T19:58:39Z", to: [ "https://social.mobiledads.live/users/hyper/followers" ], cc: [ "https://pixels.thedoodleproject.net/users/doodlemania" ], object: { id: "https://social.mobiledads.live/users/hyper/statuses/104372418627220354", type: "Note", summary: null, inReplyTo: "https://pixels.thedoodleproject.net/p/doodlemania/179416655951171584", published: "2020-06-19T19:58:39Z", url: "https://social.mobiledads.live/@hyper/104372418627220354", attributedTo: "https://social.mobiledads.live/users/hyper", to: [ "https://social.mobiledads.live/users/hyper/followers" ], cc: [ "https://pixels.thedoodleproject.net/users/doodlemania" ], sensitive: false, atomUri: "https://social.mobiledads.live/users/hyper/statuses/104372418627220354", inReplyToAtomUri: "https://pixels.thedoodleproject.net/p/doodlemania/179416655951171584", conversation: "tag:social.mobiledads.live,2020-06-19:objectId=14924:objectType=Conversation", content: "<p><span class="h-card"><a href="https://pixels.thedoodleproject.net/doodlemania" class="u-url mention">@<span>doodlemania</span></a></span> Oh I can see this!</p>", contentMap: { en: "<p><span class="h-card"><a href="https://pixels.thedoodleproject.net/doodlemania" class="u-url mention">@<span>doodlemania</span></a></span> Oh I can see this!</p>" }, attachment: [ ], tag: [ { type: "Mention", href: "https://pixels.thedoodleproject.net/users/doodlemania", name: "@doodlemania@pixels.thedoodleproject.net" } ], replies: { id: "https://social.mobiledads.live/users/hyper/statuses/104372418627220354/replies", type: "Collection", first: { type: "CollectionPage", next: "https://social.mobiledads.live/users/hyper/statuses/104372418627220354/replies?only_other_accounts=true&page=true", partOf: "https://social.mobiledads.live/users/hyper/statuses/104372418627220354/replies", items: [ ] } } } }, timeout: 5, tries: 1, job: null, connection: null, queue: null, chainConnection: null, chainQueue: null, delay: null, middleware: [ ], chained: [ ] }
-
After reading this, it says that @murgero CAN see something, so outbound is good.
Also, I see in my instance, not that message, but he DID like the pic!
-
@doodlemania2 Yes I did reply to the pic saying I saw it, and gave a like too - hopefully good for catching something in the logs
-
have been digging, the only thing i see at the moment was from horizon (listed above). i think it might be needing a well known or something, still researching
-
i installed a mastodon instance and am going to try to "talk between them" to speed debugging up some ... just an FYI to any watchers out there.
-
Looks like federation works here. Some people are following me, those should see some pictures.
@doodlemania2 Let me know if I can help debugging. -
@stantropics Not able to see anyone else's posts but my own. Still tinkering with stuff but would appreciate any assistance!
-
-
I seem to be up and going - I'm "Tooting" and "Pixelfedding" between my two instances on different servers. All appears well. cc: @girish
-
social.mobiledads.live
This seems to have the clearest explanation, especially the parts near the bottom: https://discourse.joinmastodon.org/t/how-to-replace-logos/1553/15
But since this is becoming more of a Mastodon thread rather than purely Pixelfed, maybe you could repost as a new topic.
-
@doodlemania2 So the package is good to marked as stable as-is? Any notes for the documentation?
-
I'm going to capture a few more notes just to make sure and might even throw together an FAQ - will offer a PR to the POSTINSTALL.md stuff ASAP!
-
@girish - this is ready! Only last minute change you might consider is moving .env to /app/data like other apps recently.
-
@doodlemania2 Did you make a PR? I am not seeing it at https://git.cloudron.io/cloudron/pixelfed-app/-/merge_requests
Also pixelfed already has a file at
/add/data/env.production
. -
might have committed directly to master teehee
-
@doodlemania2 Ah, thanks a lot! I will make a new release shortly.
-
I have added tests and marked pixelfed as stable. Thanks all for testing!